From 67dd7ac078cf6a228242ca598e2490e60bad98b2 Mon Sep 17 00:00:00 2001 From: Florian <1technophile@users.noreply.github.com> Date: Wed, 28 Nov 2018 20:41:37 +0100 Subject: [PATCH] update esppilight lib content of the library is not filtered on 433mhz only --- lib/ESPiLight/.gitignore | 9 + lib/ESPiLight/.travis.yml | 2 + lib/ESPiLight/Makefile | 2 +- lib/ESPiLight/library.json | 2 +- lib/ESPiLight/library.properties | 2 +- lib/ESPiLight/pilight/.gitattributes | 1 + lib/ESPiLight/pilight/.gitignore | 51 + lib/ESPiLight/pilight/CMakeConfig.txt | 90 + lib/ESPiLight/pilight/CMakeLists.txt | 732 ++ lib/ESPiLight/pilight/CONTRIBUTING.md | 77 + lib/ESPiLight/pilight/COPYING | 674 ++ lib/ESPiLight/pilight/LICENSE.txt | 674 ++ lib/ESPiLight/pilight/README.md | 20 + lib/ESPiLight/pilight/clients/process.java | 147 + lib/ESPiLight/pilight/clients/process.php | 69 + lib/ESPiLight/pilight/clients/process.pl | 65 + lib/ESPiLight/pilight/clients/process.py | 109 + lib/ESPiLight/pilight/clients/process.py3 | 108 + lib/ESPiLight/pilight/control.c | 359 + lib/ESPiLight/pilight/daemon.c | 3505 +++++++++ lib/ESPiLight/pilight/debug.c | 608 ++ lib/ESPiLight/pilight/docs/make.bat | 36 + .../docs/source/.static/Roboto-Condensed.woff | Bin 0 -> 18432 bytes .../source/.static/Roboto-Condensed.woff2 | Bin 0 -> 14512 bytes .../pilight/docs/source/.static/custom.css | 212 + .../pilight/docs/source/.static/custom.js | 6 + .../pilight/docs/source/.static/font.min.css | 1 + .../pilight/docs/source/about_manual.rst | 11 + .../pilight/docs/source/adhoc_network.rst | 322 + .../pilight/docs/source/changelog.rst | 216 + lib/ESPiLight/pilight/docs/source/conf.py | 173 + .../docs/source/configuration/devices.rst | 198 + .../docs/source/configuration/example.rst | 58 + .../pilight/docs/source/configuration/gui.rst | 90 + .../docs/source/configuration/hardware.rst | 85 + .../docs/source/configuration/index.rst | 17 + .../docs/source/configuration/registry.rst | 8 + .../docs/source/configuration/rules.rst | 30 + .../docs/source/configuration/settings.rst | 691 ++ .../pilight/docs/source/development/api.rst | 425 ++ .../docs/source/development/debugging.rst | 173 + .../pilight/docs/source/development/index.rst | 8 + .../pilight/docs/source/electronics/index.rst | 8 + .../docs/source/electronics/pcb_soldering.rst | 200 + .../docs/source/electronics/wiring.rst | 92 + .../docs/source/eventing/actions/dim.rst | 76 + .../docs/source/eventing/actions/index.rst | 21 + .../docs/source/eventing/actions/label.rst | 59 + .../source/eventing/actions/pushbullet.rst | 38 + .../docs/source/eventing/actions/pushover.rst | 38 + .../docs/source/eventing/actions/sendmail.rst | 52 + .../docs/source/eventing/actions/switch.rst | 64 + .../docs/source/eventing/actions/toggle.rst | 30 + .../docs/source/eventing/examples/index.rst | 12 + .../docs/source/eventing/examples/ir.rst | 62 + .../docs/source/eventing/examples/kodi.rst | 69 + .../docs/source/eventing/examples/mail.rst | 67 + .../docs/source/eventing/examples/mail1.rst | 67 + .../source/eventing/examples/sunriseset.rst | 147 + .../docs/source/eventing/examples/time.rst | 67 + .../source/eventing/functions/date_add.rst | 56 + .../source/eventing/functions/date_format.rst | 152 + .../docs/source/eventing/functions/index.rst | 11 + .../docs/source/eventing/functions/random.rst | 34 + .../pilight/docs/source/eventing/index.rst | 11 + .../docs/source/eventing/operators.rst | 106 + .../pilight/docs/source/eventing/syntax.rst | 366 + lib/ESPiLight/pilight/docs/source/faq.rst | 186 + .../source/images/adhoc-network-nodeA+B.pdf | Bin 0 -> 335799 bytes .../source/images/adhoc-network-nodeA+B.svg | 1580 +++++ .../source/images/adhoc-network-nodeC.pdf | Bin 0 -> 324817 bytes .../source/images/adhoc-network-nodeC.svg | 1623 +++++ .../source/images/adhoc-network-nodeD.pdf | Bin 0 -> 292598 bytes .../source/images/adhoc-network-nodeD.svg | 1444 ++++ .../docs/source/images/attiny-wiring.pdf | Bin 0 -> 589143 bytes .../docs/source/images/attiny-wiring.svg | 1701 +++++ .../pilight/docs/source/images/favicon.ico | Bin 0 -> 1150 bytes .../docs/source/images/installation.png | Bin 0 -> 144755 bytes .../pilight/docs/source/images/no.png | Bin 0 -> 3841 bytes .../pilight/docs/source/images/pilight.png | Bin 0 -> 9839 bytes .../docs/source/images/soldering/1.jpg | Bin 0 -> 414844 bytes .../docs/source/images/soldering/10.jpg | Bin 0 -> 387280 bytes .../docs/source/images/soldering/11.jpg | Bin 0 -> 400213 bytes .../docs/source/images/soldering/12.jpg | Bin 0 -> 369514 bytes .../docs/source/images/soldering/13.jpg | Bin 0 -> 412842 bytes .../docs/source/images/soldering/14.jpg | Bin 0 -> 399551 bytes .../docs/source/images/soldering/2.jpg | Bin 0 -> 391143 bytes .../docs/source/images/soldering/3.jpg | Bin 0 -> 381731 bytes .../docs/source/images/soldering/4.jpg | Bin 0 -> 379501 bytes .../docs/source/images/soldering/5.jpg | Bin 0 -> 367967 bytes .../docs/source/images/soldering/6.jpg | Bin 0 -> 400425 bytes .../docs/source/images/soldering/7.jpg | Bin 0 -> 412289 bytes .../docs/source/images/soldering/8.jpg | Bin 0 -> 426070 bytes .../docs/source/images/soldering/9.jpg | Bin 0 -> 428498 bytes .../docs/source/images/usb-nano-wiring.pdf | Bin 0 -> 311057 bytes .../docs/source/images/usb-nano-wiring.svg | 1925 +++++ .../pilight/docs/source/images/yes.png | Bin 0 -> 3955 bytes lib/ESPiLight/pilight/docs/source/index.rst | 88 + .../pilight/docs/source/installation.rst | 190 + .../pilight/docs/source/programs/control.rst | 83 + .../pilight/docs/source/programs/daemon.rst | 98 + .../pilight/docs/source/programs/debug.rst | 71 + .../pilight/docs/source/programs/flash.rst | 79 + .../pilight/docs/source/programs/index.rst | 15 + .../pilight/docs/source/programs/raw.rst | 74 + .../pilight/docs/source/programs/receive.rst | 84 + .../pilight/docs/source/programs/send.rst | 160 + .../pilight/docs/source/programs/sha256.rst | 70 + .../pilight/docs/source/programs/uuid.rst | 65 + .../source/protocols/433.92/alarm/index.rst | 7 + .../source/protocols/433.92/alarm/secudo.rst | 117 + .../source/protocols/433.92/contact/elro.rst | 142 + .../protocols/433.92/contact/ev1527.rst | 129 + .../source/protocols/433.92/contact/index.rst | 10 + .../source/protocols/433.92/contact/kaku.rst | 147 + .../protocols/433.92/contact/sc2262.rst | 158 + .../source/protocols/433.92/dimmer/_kaku.rst | 223 + .../source/protocols/433.92/dimmer/index.rst | 9 + .../protocols/433.92/dimmer/intertechno.rst | 4 + .../source/protocols/433.92/dimmer/kaku.rst | 4 + .../source/protocols/433.92/dimmer/nexa.rst | 4 + .../docs/source/protocols/433.92/index.rst | 13 + .../source/protocols/433.92/motion/ev1527.rst | 127 + .../source/protocols/433.92/motion/index.rst | 8 + .../source/protocols/433.92/motion/kaku.rst | 150 + .../source/protocols/433.92/screen/_kaku.rst | 187 + .../source/protocols/433.92/screen/d_io.rst | 4 + .../source/protocols/433.92/screen/index.rst | 9 + .../source/protocols/433.92/screen/kaku.rst | 4 + .../protocols/433.92/screen/kaku_old.rst | 173 + .../protocols/433.92/switch/_elro_800.rst | 178 + .../source/protocols/433.92/switch/_kaku.rst | 208 + .../protocols/433.92/switch/_kaku_old.rst | 201 + .../protocols/433.92/switch/_rsl366.rst | 166 + .../protocols/433.92/switch/beamish.rst | 221 + .../protocols/433.92/switch/brennenstuhl.rst | 4 + .../protocols/433.92/switch/byebyestandby.rst | 4 + .../source/protocols/433.92/switch/clarus.rst | 160 + .../protocols/433.92/switch/cleverwatts.rst | 178 + .../source/protocols/433.92/switch/coco.rst | 4 + .../source/protocols/433.92/switch/cogex.rst | 4 + .../source/protocols/433.92/switch/dio.rst | 4 + .../source/protocols/433.92/switch/duwi.rst | 4 + .../protocols/433.92/switch/elro_300.rst | 274 + .../protocols/433.92/switch/elro_400.rst | 154 + .../protocols/433.92/switch/elro_800.rst | 4 + .../protocols/433.92/switch/eurodomest.rst | 4 + .../source/protocols/433.92/switch/impuls.rst | 178 + .../source/protocols/433.92/switch/index.rst | 32 + .../protocols/433.92/switch/intertechno.rst | 4 + .../433.92/switch/intertechno_old.rst | 4 + .../source/protocols/433.92/switch/kaku.rst | 4 + .../protocols/433.92/switch/kaku_old.rst | 4 + .../source/protocols/433.92/switch/nexa.rst | 4 + .../protocols/433.92/switch/quigg_1000.rst | 119 + .../protocols/433.92/switch/quigg_7000.rst | 232 + .../source/protocols/433.92/switch/rsl366.rst | 4 + .../protocols/433.92/switch/selectremote.rst | 138 + .../protocols/433.92/switch/silvercrest.rst | 146 + .../protocols/433.92/switch/techlico.rst | 190 + .../source/protocols/433.92/switch/x10.rst | 79 + .../433.92/weather/_alecto_ws1700.rst | 172 + .../433.92/weather/_alecto_wx500.rst | 114 + .../protocols/433.92/weather/_conrad.rst | 205 + .../protocols/433.92/weather/_tfa30.rst | 227 + .../433.92/weather/alecto_ws1700.rst | 4 + .../protocols/433.92/weather/alecto_wsd17.rst | 88 + .../protocols/433.92/weather/alecto_wx500.rst | 4 + .../protocols/433.92/weather/auriol_89210.rst | 128 + .../433.92/weather/auriol_h13726.rst | 4 + .../protocols/433.92/weather/conrad.rst | 4 + .../protocols/433.92/weather/dostmann.rst | 7 + .../protocols/433.92/weather/hama_ews1500.rst | 4 + .../protocols/433.92/weather/iboutique.rst | 4 + .../source/protocols/433.92/weather/index.rst | 23 + .../source/protocols/433.92/weather/kaku.rst | 152 + .../433.92/weather/meteoscan_w1xxx.rst | 4 + .../protocols/433.92/weather/ninja_blocks.rst | 146 + .../source/protocols/433.92/weather/soens.rst | 4 + .../source/protocols/433.92/weather/tcm.rst | 187 + .../protocols/433.92/weather/teknihall.rst | 185 + .../source/protocols/433.92/weather/tfa.rst | 4 + .../protocols/433.92/weather/ventus_wsxxx.rst | 4 + .../docs/source/protocols/api/index.rst | 8 + .../source/protocols/api/program/index.rst | 9 + .../source/protocols/api/program/lirc.rst | 98 + .../source/protocols/api/program/program.rst | 124 + .../source/protocols/api/program/xbmc.rst | 115 + .../source/protocols/api/weather/index.rst | 9 + .../protocols/api/weather/openweathermap.rst | 122 + .../protocols/api/weather/sunriseset.rst | 138 + .../protocols/api/weather/wunderground.rst | 119 + .../docs/source/protocols/generic/dimmer.rst | 111 + .../docs/source/protocols/generic/index.rst | 13 + .../docs/source/protocols/generic/label.rst | 69 + .../docs/source/protocols/generic/raw.rst | 33 + .../docs/source/protocols/generic/screen.rst | 74 + .../docs/source/protocols/generic/switch.rst | 74 + .../docs/source/protocols/generic/weather.rst | 97 + .../docs/source/protocols/generic/webcam.rst | 80 + .../docs/source/protocols/gpio/_am2302.rst | 99 + .../docs/source/protocols/gpio/_bmp180.rst | 115 + .../docs/source/protocols/gpio/_ds18b20.rst | 145 + .../docs/source/protocols/gpio/_lm75.rst | 131 + .../docs/source/protocols/gpio/am2302.rst | 4 + .../docs/source/protocols/gpio/bmp085.rst | 4 + .../docs/source/protocols/gpio/bmp180.rst | 4 + .../docs/source/protocols/gpio/cputemp.rst | 105 + .../docs/source/protocols/gpio/dht11.rst | 4 + .../docs/source/protocols/gpio/dht22.rst | 4 + .../docs/source/protocols/gpio/ds18b20.rst | 4 + .../docs/source/protocols/gpio/ds18s20.rst | 4 + .../source/protocols/gpio/gpio_switch.rst | 86 + .../docs/source/protocols/gpio/index.rst | 17 + .../docs/source/protocols/gpio/lm75.rst | 4 + .../docs/source/protocols/gpio/lm76.rst | 4 + .../pilight/docs/source/protocols/index.rst | 11 + .../docs/source/protocols/network/arping.rst | 75 + .../docs/source/protocols/network/index.rst | 8 + .../docs/source/protocols/network/ping.rst | 82 + lib/ESPiLight/pilight/flash.c | 176 + lib/ESPiLight/pilight/inc/CMakeLists.txt | 5 + lib/ESPiLight/pilight/inc/defines.h.in | 98 + lib/ESPiLight/pilight/inc/i2c-dev.h | 335 + lib/ESPiLight/pilight/libs/CMakeLists.txt | 23 + .../pilight/libs/avrdude/CMakeLists.txt | 10 + lib/ESPiLight/pilight/libs/avrdude/arduino.c | 126 + lib/ESPiLight/pilight/libs/avrdude/arduino.h | 29 + lib/ESPiLight/pilight/libs/avrdude/avr.c | 915 +++ lib/ESPiLight/pilight/libs/avrdude/avr.h | 76 + .../pilight/libs/avrdude/avrbitbang.c | 341 + .../pilight/libs/avrdude/avrbitbang.h | 56 + .../pilight/libs/avrdude/avrconfig.c | 110 + .../pilight/libs/avrdude/avrconfig.h | 237 + lib/ESPiLight/pilight/libs/avrdude/avrdude.h | 27 + lib/ESPiLight/pilight/libs/avrdude/avrgpio.c | 177 + lib/ESPiLight/pilight/libs/avrdude/avrgpio.h | 35 + lib/ESPiLight/pilight/libs/avrdude/avrpart.c | 251 + lib/ESPiLight/pilight/libs/avrdude/avrpart.h | 224 + lib/ESPiLight/pilight/libs/avrdude/avrupd.c | 357 + lib/ESPiLight/pilight/libs/avrdude/avrupd.h | 52 + lib/ESPiLight/pilight/libs/avrdude/fileio.c | 544 ++ lib/ESPiLight/pilight/libs/avrdude/fileio.h | 67 + lib/ESPiLight/pilight/libs/avrdude/pgm.c | 174 + lib/ESPiLight/pilight/libs/avrdude/pgm.h | 129 + lib/ESPiLight/pilight/libs/avrdude/pindefs.h | 44 + lib/ESPiLight/pilight/libs/avrdude/safemode.c | 297 + lib/ESPiLight/pilight/libs/avrdude/safemode.h | 47 + .../pilight/libs/avrdude/ser_posix.c | 285 + .../pilight/libs/avrdude/ser_win32.c | 292 + lib/ESPiLight/pilight/libs/avrdude/serial.h | 94 + lib/ESPiLight/pilight/libs/avrdude/stk500.c | 624 ++ lib/ESPiLight/pilight/libs/avrdude/stk500.h | 41 + .../pilight/libs/avrdude/stk500_private.h | 103 + .../pilight/libs/libuv/CMakeLists.txt | 68 + .../pilight/libs/libuv/android-ifaddrs.h | 54 + lib/ESPiLight/pilight/libs/libuv/fs-poll.c | 256 + lib/ESPiLight/pilight/libs/libuv/heap-inl.h | 245 + lib/ESPiLight/pilight/libs/libuv/inet.c | 309 + .../pilight/libs/libuv/pthread-barrier.h | 68 + lib/ESPiLight/pilight/libs/libuv/queue.h | 108 + .../pilight/libs/libuv/stdint-msvc2008.h | 247 + lib/ESPiLight/pilight/libs/libuv/threadpool.c | 366 + .../pilight/libs/libuv/threadpool.c.ori | 312 + .../pilight/libs/libuv/threadpool.patch | 136 + lib/ESPiLight/pilight/libs/libuv/tree.h | 768 ++ lib/ESPiLight/pilight/libs/libuv/unix/aix.c | 1243 ++++ .../pilight/libs/libuv/unix/android-ifaddrs.c | 703 ++ lib/ESPiLight/pilight/libs/libuv/unix/async.c | 269 + .../pilight/libs/libuv/unix/atomic-ops.h | 97 + .../pilight/libs/libuv/unix/bsd-ifaddrs.c | 146 + lib/ESPiLight/pilight/libs/libuv/unix/core.c | 1334 ++++ .../pilight/libs/libuv/unix/cygwin.c | 54 + .../libs/libuv/unix/darwin-proctitle.c | 206 + .../pilight/libs/libuv/unix/darwin.c | 231 + lib/ESPiLight/pilight/libs/libuv/unix/dl.c | 80 + .../pilight/libs/libuv/unix/freebsd.c | 346 + lib/ESPiLight/pilight/libs/libuv/unix/fs.c | 1369 ++++ .../pilight/libs/libuv/unix/fsevents.c | 901 +++ .../pilight/libs/libuv/unix/getaddrinfo.c | 202 + .../pilight/libs/libuv/unix/getnameinfo.c | 120 + .../pilight/libs/libuv/unix/internal.h | 338 + .../pilight/libs/libuv/unix/kqueue.c | 532 ++ .../pilight/libs/libuv/unix/linux-core.c | 951 +++ .../pilight/libs/libuv/unix/linux-inotify.c | 352 + .../pilight/libs/libuv/unix/linux-syscalls.c | 471 ++ .../pilight/libs/libuv/unix/linux-syscalls.h | 151 + .../pilight/libs/libuv/unix/loop-watcher.c | 68 + lib/ESPiLight/pilight/libs/libuv/unix/loop.c | 193 + .../pilight/libs/libuv/unix/netbsd.c | 272 + .../pilight/libs/libuv/unix/no-fsevents.c | 42 + .../pilight/libs/libuv/unix/no-proctitle.c | 42 + .../pilight/libs/libuv/unix/openbsd.c | 284 + .../pilight/libs/libuv/unix/os390-syscalls.c | 334 + .../pilight/libs/libuv/unix/os390-syscalls.h | 69 + lib/ESPiLight/pilight/libs/libuv/unix/os390.c | 849 +++ lib/ESPiLight/pilight/libs/libuv/unix/pipe.c | 304 + lib/ESPiLight/pilight/libs/libuv/unix/poll.c | 146 + .../pilight/libs/libuv/unix/posix-hrtime.c | 35 + .../pilight/libs/libuv/unix/posix-poll.c | 357 + .../pilight/libs/libuv/unix/process.c | 563 ++ .../pilight/libs/libuv/unix/procfs-exepath.c | 45 + .../pilight/libs/libuv/unix/proctitle.c | 113 + .../pilight/libs/libuv/unix/pthread-barrier.c | 121 + .../pilight/libs/libuv/unix/pthread-fixes.c | 56 + .../pilight/libs/libuv/unix/signal.c | 559 ++ .../pilight/libs/libuv/unix/spinlock.h | 53 + .../pilight/libs/libuv/unix/stream.c | 1689 +++++ lib/ESPiLight/pilight/libs/libuv/unix/sunos.c | 821 +++ .../pilight/libs/libuv/unix/sysinfo-loadavg.c | 36 + .../pilight/libs/libuv/unix/sysinfo-memory.c | 42 + lib/ESPiLight/pilight/libs/libuv/unix/tcp.c | 395 ++ .../pilight/libs/libuv/unix/thread.c | 575 ++ lib/ESPiLight/pilight/libs/libuv/unix/timer.c | 172 + lib/ESPiLight/pilight/libs/libuv/unix/tty.c | 336 + lib/ESPiLight/pilight/libs/libuv/unix/udp.c | 900 +++ lib/ESPiLight/pilight/libs/libuv/uv-aix.h | 32 + lib/ESPiLight/pilight/libs/libuv/uv-bsd.h | 46 + lib/ESPiLight/pilight/libs/libuv/uv-common.c | 664 ++ lib/ESPiLight/pilight/libs/libuv/uv-common.h | 254 + lib/ESPiLight/pilight/libs/libuv/uv-darwin.h | 61 + lib/ESPiLight/pilight/libs/libuv/uv-errno.h | 419 ++ lib/ESPiLight/pilight/libs/libuv/uv-linux.h | 34 + lib/ESPiLight/pilight/libs/libuv/uv-os390.h | 30 + lib/ESPiLight/pilight/libs/libuv/uv-posix.h | 31 + lib/ESPiLight/pilight/libs/libuv/uv-sunos.h | 44 + .../pilight/libs/libuv/uv-threadpool.h | 38 + .../pilight/libs/libuv/uv-threadpool.h.ori | 37 + lib/ESPiLight/pilight/libs/libuv/uv-unix.h | 368 + lib/ESPiLight/pilight/libs/libuv/uv-version.h | 43 + lib/ESPiLight/pilight/libs/libuv/uv-win.h | 650 ++ lib/ESPiLight/pilight/libs/libuv/uv.h | 1510 ++++ lib/ESPiLight/pilight/libs/libuv/uv.h.ori | 1509 ++++ lib/ESPiLight/pilight/libs/libuv/version.c | 45 + lib/ESPiLight/pilight/libs/libuv/win/async.c | 98 + .../pilight/libs/libuv/win/atomicops-inl.h | 57 + lib/ESPiLight/pilight/libs/libuv/win/core.c | 605 ++ .../pilight/libs/libuv/win/detect-wakeup.c | 35 + lib/ESPiLight/pilight/libs/libuv/win/dl.c | 118 + lib/ESPiLight/pilight/libs/libuv/win/error.c | 171 + .../pilight/libs/libuv/win/fs-event.c | 561 ++ lib/ESPiLight/pilight/libs/libuv/win/fs.c | 2516 +++++++ .../pilight/libs/libuv/win/getaddrinfo.c | 382 + .../pilight/libs/libuv/win/getnameinfo.c | 149 + .../pilight/libs/libuv/win/handle-inl.h | 179 + lib/ESPiLight/pilight/libs/libuv/win/handle.c | 159 + .../pilight/libs/libuv/win/internal.h | 395 ++ .../pilight/libs/libuv/win/loop-watcher.c | 122 + lib/ESPiLight/pilight/libs/libuv/win/pipe.c | 2132 ++++++ lib/ESPiLight/pilight/libs/libuv/win/poll.c | 644 ++ .../pilight/libs/libuv/win/process-stdio.c | 511 ++ .../pilight/libs/libuv/win/process.c | 1246 ++++ .../pilight/libs/libuv/win/req-inl.h | 221 + lib/ESPiLight/pilight/libs/libuv/win/req.c | 25 + lib/ESPiLight/pilight/libs/libuv/win/signal.c | 277 + .../pilight/libs/libuv/win/snprintf.c | 42 + .../pilight/libs/libuv/win/stream-inl.h | 55 + lib/ESPiLight/pilight/libs/libuv/win/stream.c | 248 + lib/ESPiLight/pilight/libs/libuv/win/tcp.c | 1505 ++++ lib/ESPiLight/pilight/libs/libuv/win/thread.c | 697 ++ lib/ESPiLight/pilight/libs/libuv/win/timer.c | 195 + lib/ESPiLight/pilight/libs/libuv/win/tty.c | 2281 ++++++ lib/ESPiLight/pilight/libs/libuv/win/udp.c | 926 +++ lib/ESPiLight/pilight/libs/libuv/win/util.c | 1576 ++++ lib/ESPiLight/pilight/libs/libuv/win/winapi.c | 159 + lib/ESPiLight/pilight/libs/libuv/win/winapi.h | 4752 +++++++++++++ .../pilight/libs/libuv/win/winsock.c | 561 ++ .../pilight/libs/libuv/win/winsock.h | 190 + .../pilight/libs/openzwave/Bitfield.h | 162 + .../pilight/libs/openzwave/CMakeLists.txt | 18 + lib/ESPiLight/pilight/libs/openzwave/Defs.h | 363 + .../pilight/libs/openzwave/DoxygenMain.h | 154 + .../pilight/libs/openzwave/Driver.cpp | 6317 +++++++++++++++++ lib/ESPiLight/pilight/libs/openzwave/Driver.h | 856 +++ .../pilight/libs/openzwave/Group.cpp | 422 ++ lib/ESPiLight/pilight/libs/openzwave/Group.h | 114 + .../pilight/libs/openzwave/Manager.cpp | 4049 +++++++++++ .../pilight/libs/openzwave/Manager.h | 1924 +++++ lib/ESPiLight/pilight/libs/openzwave/Msg.cpp | 283 + lib/ESPiLight/pilight/libs/openzwave/Msg.h | 173 + lib/ESPiLight/pilight/libs/openzwave/Node.cpp | 2896 ++++++++ lib/ESPiLight/pilight/libs/openzwave/Node.h | 577 ++ .../pilight/libs/openzwave/Notification.h | 195 + .../pilight/libs/openzwave/Options.cpp | 603 ++ .../pilight/libs/openzwave/Options.h | 254 + .../pilight/libs/openzwave/Scene.cpp | 481 ++ lib/ESPiLight/pilight/libs/openzwave/Scene.h | 105 + .../pilight/libs/openzwave/Utils.cpp | 116 + lib/ESPiLight/pilight/libs/openzwave/Utils.h | 76 + .../libs/openzwave/ZWaveCommandClasses.h | 83 + .../pilight/libs/openzwave/aes/CMakeLists.txt | 6 + .../pilight/libs/openzwave/aes/aes.h | 203 + .../pilight/libs/openzwave/aes/aes_modes.c | 947 +++ .../pilight/libs/openzwave/aes/aescpp.h | 141 + .../pilight/libs/openzwave/aes/aescrypt.c | 301 + .../pilight/libs/openzwave/aes/aeskey.c | 554 ++ .../pilight/libs/openzwave/aes/aesopt.h | 769 ++ .../pilight/libs/openzwave/aes/aestab.c | 391 + .../pilight/libs/openzwave/aes/aestab.h | 173 + .../pilight/libs/openzwave/aes/brg_endian.h | 126 + .../pilight/libs/openzwave/aes/brg_types.h | 191 + .../libs/openzwave/command_classes/Alarm.cpp | 148 + .../libs/openzwave/command_classes/Alarm.h | 71 + .../command_classes/ApplicationStatus.cpp | 93 + .../command_classes/ApplicationStatus.h | 58 + .../openzwave/command_classes/Association.cpp | 390 + .../openzwave/command_classes/Association.h | 75 + .../AssociationCommandConfiguration.cpp | 281 + .../AssociationCommandConfiguration.h | 70 + .../libs/openzwave/command_classes/Basic.cpp | 345 + .../libs/openzwave/command_classes/Basic.h | 77 + .../command_classes/BasicWindowCovering.cpp | 118 + .../command_classes/BasicWindowCovering.h | 64 + .../openzwave/command_classes/Battery.cpp | 146 + .../libs/openzwave/command_classes/Battery.h | 65 + .../openzwave/command_classes/CMakeLists.txt | 6 + .../openzwave/command_classes/CRC16Encap.cpp | 50 + .../openzwave/command_classes/CRC16Encap.h | 57 + .../ClimateControlSchedule.cpp | 428 ++ .../command_classes/ClimateControlSchedule.h | 71 + .../libs/openzwave/command_classes/Clock.cpp | 237 + .../libs/openzwave/command_classes/Clock.h | 67 + .../command_classes/CommandClass.cpp | 805 +++ .../openzwave/command_classes/CommandClass.h | 198 + .../command_classes/CommandClasses.cpp | 316 + .../command_classes/CommandClasses.h | 79 + .../command_classes/Configuration.cpp | 277 + .../openzwave/command_classes/Configuration.h | 67 + .../command_classes/ControllerReplication.cpp | 326 + .../command_classes/ControllerReplication.h | 74 + .../openzwave/command_classes/DoorLock.cpp | 586 ++ .../libs/openzwave/command_classes/DoorLock.h | 76 + .../command_classes/DoorLockLogging.cpp | 375 + .../command_classes/DoorLockLogging.h | 69 + .../command_classes/EnergyProduction.cpp | 180 + .../command_classes/EnergyProduction.h | 65 + .../libs/openzwave/command_classes/Hail.cpp | 68 + .../libs/openzwave/command_classes/Hail.h | 58 + .../openzwave/command_classes/Indicator.cpp | 166 + .../openzwave/command_classes/Indicator.h | 66 + .../openzwave/command_classes/Language.cpp | 164 + .../libs/openzwave/command_classes/Language.h | 65 + .../libs/openzwave/command_classes/Lock.cpp | 166 + .../libs/openzwave/command_classes/Lock.h | 66 + .../command_classes/ManufacturerSpecific.cpp | 444 ++ .../command_classes/ManufacturerSpecific.h | 116 + .../libs/openzwave/command_classes/Meter.cpp | 562 ++ .../libs/openzwave/command_classes/Meter.h | 72 + .../openzwave/command_classes/MeterPulse.cpp | 143 + .../openzwave/command_classes/MeterPulse.h | 65 + .../openzwave/command_classes/MultiCmd.cpp | 77 + .../libs/openzwave/command_classes/MultiCmd.h | 63 + .../command_classes/MultiInstance.cpp | 676 ++ .../openzwave/command_classes/MultiInstance.h | 111 + .../MultiInstanceAssociation.cpp | 61 + .../MultiInstanceAssociation.h | 59 + .../openzwave/command_classes/NoOperation.cpp | 76 + .../openzwave/command_classes/NoOperation.h | 60 + .../openzwave/command_classes/NodeNaming.cpp | 531 ++ .../openzwave/command_classes/NodeNaming.h | 66 + .../openzwave/command_classes/Powerlevel.cpp | 501 ++ .../openzwave/command_classes/Powerlevel.h | 91 + .../openzwave/command_classes/Proprietary.cpp | 62 + .../openzwave/command_classes/Proprietary.h | 58 + .../openzwave/command_classes/Protection.cpp | 190 + .../openzwave/command_classes/Protection.h | 73 + .../command_classes/SceneActivation.cpp | 78 + .../command_classes/SceneActivation.h | 64 + .../openzwave/command_classes/Security.cpp | 1061 +++ .../libs/openzwave/command_classes/Security.h | 124 + .../openzwave/command_classes/SensorAlarm.cpp | 215 + .../openzwave/command_classes/SensorAlarm.h | 77 + .../command_classes/SensorBinary.cpp | 243 + .../openzwave/command_classes/SensorBinary.h | 69 + .../command_classes/SensorMultilevel.cpp | 460 ++ .../command_classes/SensorMultilevel.h | 68 + .../openzwave/command_classes/SwitchAll.cpp | 225 + .../openzwave/command_classes/SwitchAll.h | 69 + .../command_classes/SwitchBinary.cpp | 196 + .../openzwave/command_classes/SwitchBinary.h | 67 + .../command_classes/SwitchMultilevel.cpp | 631 ++ .../command_classes/SwitchMultilevel.h | 84 + .../command_classes/SwitchToggleBinary.cpp | 157 + .../command_classes/SwitchToggleBinary.h | 66 + .../SwitchToggleMultilevel.cpp | 201 + .../command_classes/SwitchToggleMultilevel.h | 75 + .../command_classes/ThermostatFanMode.cpp | 344 + .../command_classes/ThermostatFanMode.h | 77 + .../command_classes/ThermostatFanState.cpp | 158 + .../command_classes/ThermostatFanState.h | 71 + .../command_classes/ThermostatMode.cpp | 395 ++ .../command_classes/ThermostatMode.h | 76 + .../ThermostatOperatingState.cpp | 154 + .../ThermostatOperatingState.h | 71 + .../command_classes/ThermostatSetpoint.cpp | 323 + .../command_classes/ThermostatSetpoint.h | 73 + .../command_classes/TimeParameters.cpp | 236 + .../command_classes/TimeParameters.h | 67 + .../openzwave/command_classes/UserCode.cpp | 355 + .../libs/openzwave/command_classes/UserCode.h | 113 + .../openzwave/command_classes/Version.cpp | 263 + .../libs/openzwave/command_classes/Version.h | 71 + .../libs/openzwave/command_classes/WakeUp.cpp | 502 ++ .../libs/openzwave/command_classes/WakeUp.h | 87 + .../pilight/libs/openzwave/libudev.h | 207 + .../libs/openzwave/platform/CMakeLists.txt | 15 + .../libs/openzwave/platform/Controller.cpp | 68 + .../libs/openzwave/platform/Controller.h | 107 + .../pilight/libs/openzwave/platform/Event.cpp | 107 + .../pilight/libs/openzwave/platform/Event.h | 91 + .../libs/openzwave/platform/FileOps.cpp | 105 + .../pilight/libs/openzwave/platform/FileOps.h | 75 + .../pilight/libs/openzwave/platform/Log.cpp | 334 + .../pilight/libs/openzwave/platform/Log.h | 187 + .../pilight/libs/openzwave/platform/Mutex.cpp | 101 + .../pilight/libs/openzwave/platform/Mutex.h | 88 + .../pilight/libs/openzwave/platform/Ref.h | 91 + .../openzwave/platform/SerialController.cpp | 185 + .../openzwave/platform/SerialController.h | 138 + .../libs/openzwave/platform/Stream.cpp | 227 + .../pilight/libs/openzwave/platform/Stream.h | 135 + .../libs/openzwave/platform/Thread.cpp | 123 + .../pilight/libs/openzwave/platform/Thread.h | 101 + .../libs/openzwave/platform/TimeStamp.cpp | 106 + .../libs/openzwave/platform/TimeStamp.h | 91 + .../pilight/libs/openzwave/platform/Wait.cpp | 182 + .../pilight/libs/openzwave/platform/Wait.h | 113 + .../openzwave/platform/unix/CMakeLists.txt | 6 + .../openzwave/platform/unix/EventImpl.cpp | 262 + .../libs/openzwave/platform/unix/EventImpl.h | 66 + .../openzwave/platform/unix/FileOpsImpl.cpp | 71 + .../openzwave/platform/unix/FileOpsImpl.h | 52 + .../libs/openzwave/platform/unix/LogImpl.cpp | 326 + .../libs/openzwave/platform/unix/LogImpl.h | 73 + .../openzwave/platform/unix/MutexImpl.cpp | 136 + .../libs/openzwave/platform/unix/MutexImpl.h | 60 + .../platform/unix/SerialControllerImpl.cpp | 373 + .../platform/unix/SerialControllerImpl.h | 74 + .../openzwave/platform/unix/ThreadImpl.cpp | 183 + .../libs/openzwave/platform/unix/ThreadImpl.h | 71 + .../openzwave/platform/unix/TimeStampImpl.cpp | 141 + .../openzwave/platform/unix/TimeStampImpl.h | 91 + .../libs/openzwave/platform/unix/WaitImpl.cpp | 160 + .../libs/openzwave/platform/unix/WaitImpl.h | 78 + .../openzwave/platform/windows/CMakeLists.txt | 6 + .../openzwave/platform/windows/EventImpl.cpp | 102 + .../openzwave/platform/windows/EventImpl.h | 60 + .../platform/windows/FileOpsImpl.cpp | 69 + .../openzwave/platform/windows/FileOpsImpl.h | 52 + .../openzwave/platform/windows/LogImpl.cpp | 362 + .../libs/openzwave/platform/windows/LogImpl.h | 72 + .../openzwave/platform/windows/MutexImpl.cpp | 114 + .../openzwave/platform/windows/MutexImpl.h | 58 + .../platform/windows/SerialControllerImpl.cpp | 410 ++ .../platform/windows/SerialControllerImpl.h | 66 + .../openzwave/platform/windows/ThreadImpl.cpp | 158 + .../openzwave/platform/windows/ThreadImpl.h | 71 + .../platform/windows/TimeStampImpl.cpp | 114 + .../platform/windows/TimeStampImpl.h | 88 + .../openzwave/platform/windows/WaitImpl.cpp | 134 + .../openzwave/platform/windows/WaitImpl.h | 73 + .../pilight/libs/openzwave/tinystr.cpp | 116 + .../pilight/libs/openzwave/tinystr.h | 319 + .../pilight/libs/openzwave/tinyxml.cpp | 1891 +++++ .../pilight/libs/openzwave/tinyxml.h | 1802 +++++ .../pilight/libs/openzwave/tinyxmlerror.cpp | 53 + .../pilight/libs/openzwave/tinyxmlparser.cpp | 1639 +++++ .../openzwave/value_classes/CMakeLists.txt | 6 + .../libs/openzwave/value_classes/Value.cpp | 723 ++ .../libs/openzwave/value_classes/Value.h | 127 + .../openzwave/value_classes/ValueBool.cpp | 161 + .../libs/openzwave/value_classes/ValueBool.h | 74 + .../openzwave/value_classes/ValueButton.cpp | 120 + .../openzwave/value_classes/ValueButton.h | 70 + .../openzwave/value_classes/ValueByte.cpp | 186 + .../libs/openzwave/value_classes/ValueByte.h | 73 + .../openzwave/value_classes/ValueDecimal.cpp | 147 + .../openzwave/value_classes/ValueDecimal.h | 82 + .../libs/openzwave/value_classes/ValueID.h | 310 + .../libs/openzwave/value_classes/ValueInt.cpp | 188 + .../libs/openzwave/value_classes/ValueInt.h | 70 + .../openzwave/value_classes/ValueList.cpp | 358 + .../libs/openzwave/value_classes/ValueList.h | 94 + .../libs/openzwave/value_classes/ValueRaw.cpp | 285 + .../libs/openzwave/value_classes/ValueRaw.h | 75 + .../openzwave/value_classes/ValueSchedule.cpp | 351 + .../openzwave/value_classes/ValueSchedule.h | 79 + .../openzwave/value_classes/ValueShort.cpp | 191 + .../libs/openzwave/value_classes/ValueShort.h | 70 + .../openzwave/value_classes/ValueStore.cpp | 204 + .../libs/openzwave/value_classes/ValueStore.h | 70 + .../openzwave/value_classes/ValueString.cpp | 145 + .../openzwave/value_classes/ValueString.h | 70 + lib/ESPiLight/pilight/libs/openzwave/vers.cpp | 4 + .../pilight/libs/pilight/CMakeLists.txt | 36 + .../libs/pilight/config/CMakeLists.txt | 6 + .../pilight/libs/pilight/config/devices.c | 1771 +++++ .../pilight/libs/pilight/config/devices.h | 106 + .../pilight/libs/pilight/config/gui.c | 641 ++ .../pilight/libs/pilight/config/gui.h | 55 + .../pilight/libs/pilight/config/hardware.c | 463 ++ .../pilight/libs/pilight/config/hardware.h | 99 + .../pilight/libs/pilight/config/registry.c | 273 + .../pilight/libs/pilight/config/registry.h | 35 + .../pilight/libs/pilight/config/rules.c | 273 + .../pilight/libs/pilight/config/rules.h | 69 + .../pilight/libs/pilight/config/settings.c | 646 ++ .../pilight/libs/pilight/config/settings.h | 31 + .../libs/pilight/core/CMakeExclude.txt | 18 + .../pilight/libs/pilight/core/CMakeLists.txt | 8 + lib/ESPiLight/pilight/libs/pilight/core/arp.c | 581 ++ lib/ESPiLight/pilight/libs/pilight/core/arp.h | 29 + .../pilight/libs/pilight/core/binary.c | 0 .../pilight/libs/pilight/core/binary.h | 0 .../pilight/libs/pilight/core/cast.c | 112 + .../pilight/libs/pilight/core/cast.h | 19 + .../pilight/libs/pilight/core/common.c | 1146 +++ .../pilight/libs/pilight/core/common.h | 93 + .../pilight/libs/pilight/core/config.c | 282 + .../pilight/libs/pilight/core/config.h | 49 + .../pilight/libs/pilight/core/datetime.c | 1844 +++++ .../pilight/libs/pilight/core/datetime.h | 21 + lib/ESPiLight/pilight/libs/pilight/core/dso.c | 121 + .../{src => }/pilight/libs/pilight/core/dso.h | 0 .../pilight/libs/pilight/core/eventpool.c | 891 +++ .../pilight/libs/pilight/core/eventpool.h | 194 + .../libs/pilight/core/eventpool_structs.h | 133 + .../pilight/libs/pilight/core/fcache.c | 166 + .../pilight/libs/pilight/core/fcache.h | 38 + .../pilight/libs/pilight/core/firmware.c | 1260 ++++ .../pilight/libs/pilight/core/firmware.h | 54 + lib/ESPiLight/pilight/libs/pilight/core/gc.c | 178 + lib/ESPiLight/pilight/libs/pilight/core/gc.h | 33 + .../pilight/libs/pilight/core/http.c | 815 +++ .../pilight/libs/pilight/core/http.h | 16 + .../pilight/libs/pilight/core/i2c-dev.h | 335 + lib/ESPiLight/pilight/libs/pilight/core/irq.c | 62 + lib/ESPiLight/pilight/libs/pilight/core/irq.h | 25 + .../pilight/libs/pilight/core/json.c | 3 +- .../pilight/libs/pilight/core/json.h | 0 lib/ESPiLight/pilight/libs/pilight/core/log.c | 519 ++ lib/ESPiLight/pilight/libs/pilight/core/log.h | 51 + .../pilight/libs/pilight/core/mail.c | 695 ++ .../pilight/libs/pilight/core/mail.h | 21 + lib/ESPiLight/pilight/libs/pilight/core/mem.c | 296 + .../{src => }/pilight/libs/pilight/core/mem.h | 0 .../pilight/libs/pilight/core/network.c | 681 ++ .../pilight/libs/pilight/core/network.h | 59 + lib/ESPiLight/pilight/libs/pilight/core/ntp.c | 377 + lib/ESPiLight/pilight/libs/pilight/core/ntp.h | 30 + .../pilight/libs/pilight/core/options.c | 584 ++ .../pilight/libs/pilight/core/options.h | 64 + .../pilight/libs/pilight/core/pilight.c | 23 + .../pilight/libs/pilight/core/pilight.h | 121 + .../pilight/libs/pilight/core/ping.c | 331 + .../pilight/libs/pilight/core/ping.h | 68 + .../pilight/libs/pilight/core/proc.c | 241 + .../pilight/libs/pilight/core/proc.h | 40 + .../pilight/libs/pilight/core/sha256cache.c | 125 + .../pilight/libs/pilight/core/sha256cache.h | 38 + .../pilight/libs/pilight/core/socket.c | 646 ++ .../pilight/libs/pilight/core/socket.h | 43 + .../pilight/libs/pilight/core/ssdp.c | 373 + .../pilight/libs/pilight/core/ssdp.h | 39 + lib/ESPiLight/pilight/libs/pilight/core/ssl.c | 139 + lib/ESPiLight/pilight/libs/pilight/core/ssl.h | 42 + .../pilight/libs/pilight/core/strptime.c | 558 ++ .../pilight/libs/pilight/core/strptime.h | 6 + .../pilight/libs/pilight/core/threads.c | 315 + .../pilight/libs/pilight/core/threads.h | 51 + .../pilight/libs/pilight/core/tzdata.h | 6195 ++++++++++++++++ .../pilight/libs/pilight/core/update.h | 28 + .../pilight/libs/pilight/core/webserver.c | 2034 ++++++ .../pilight/libs/pilight/core/webserver.h | 63 + .../libs/pilight/datatypes/CMakeLists.txt | 6 + .../pilight/libs/pilight/datatypes/stack.c | 87 + .../pilight/libs/pilight/datatypes/stack.h | 26 + .../libs/pilight/events/CMakeLists.txt | 14 + .../pilight/libs/pilight/events/action.c | 364 + .../pilight/libs/pilight/events/action.h | 67 + .../pilight/events/actions/CMakeInclude.txt | 30 + .../pilight/events/actions/CMakeLists.txt | 24 + .../pilight/events/actions/action_header.h.in | 1 + .../pilight/events/actions/action_init.h.in | 1 + .../pilight/libs/pilight/events/actions/dim.c | 878 +++ .../pilight/libs/pilight/events/actions/dim.h | 28 + .../libs/pilight/events/actions/label.c | 584 ++ .../libs/pilight/events/actions/label.h | 28 + .../libs/pilight/events/actions/pushbullet.c | 218 + .../libs/pilight/events/actions/pushbullet.h | 28 + .../libs/pilight/events/actions/pushover.c | 223 + .../libs/pilight/events/actions/pushover.h | 28 + .../libs/pilight/events/actions/sendmail.c | 253 + .../libs/pilight/events/actions/sendmail.h | 28 + .../libs/pilight/events/actions/switch.c | 488 ++ .../libs/pilight/events/actions/switch.h | 28 + .../libs/pilight/events/actions/toggle.c | 215 + .../libs/pilight/events/actions/toggle.h | 28 + .../pilight/libs/pilight/events/events.c | 2204 ++++++ .../pilight/libs/pilight/events/events.h | 25 + .../pilight/libs/pilight/events/function.c | 273 + .../pilight/libs/pilight/events/function.h | 28 + .../pilight/events/functions/CMakeLists.txt | 6 + .../pilight/events/functions/date_add.lua | 80 + .../pilight/events/functions/date_format.lua | 43 + .../libs/pilight/events/functions/random.lua | 33 + .../pilight/libs/pilight/events/operator.c | 372 + .../pilight/libs/pilight/events/operator.h | 23 + .../pilight/events/operators/CMakeLists.txt | 6 + .../libs/pilight/events/operators/and.lua | 34 + .../libs/pilight/events/operators/concat.lua | 30 + .../libs/pilight/events/operators/divide.lua | 34 + .../libs/pilight/events/operators/eq.lua | 34 + .../libs/pilight/events/operators/ge.lua | 42 + .../libs/pilight/events/operators/gt.lua | 42 + .../pilight/events/operators/intdivide.lua | 40 + .../libs/pilight/events/operators/le.lua | 42 + .../libs/pilight/events/operators/lt.lua | 42 + .../libs/pilight/events/operators/minus.lua | 30 + .../libs/pilight/events/operators/modulus.lua | 37 + .../pilight/events/operators/multiply.lua | 30 + .../libs/pilight/events/operators/ne.lua | 34 + .../libs/pilight/events/operators/or.lua | 34 + .../libs/pilight/events/operators/plus.lua | 30 + .../pilight/libs/pilight/hardware/433gpio.c | 270 + .../pilight/libs/pilight/hardware/433gpio.h | 27 + .../pilight/libs/pilight/hardware/433lirc.c | 228 + .../pilight/libs/pilight/hardware/433lirc.h | 27 + .../pilight/libs/pilight/hardware/433nano.c | 475 ++ .../pilight/libs/pilight/hardware/433nano.h | 27 + .../libs/pilight/hardware/CMakeExclude.txt | 16 + .../libs/pilight/hardware/CMakeInclude.txt | 30 + .../libs/pilight/hardware/CMakeLists.txt | 40 + .../pilight/hardware/hardware_header.h.in | 1 + .../libs/pilight/hardware/hardware_init.h.in | 1 + .../pilight/libs/pilight/hardware/none.c | 62 + .../pilight/libs/pilight/hardware/none.h | 27 + .../pilight/libs/pilight/hardware/zwave.cpp | 705 ++ .../pilight/libs/pilight/hardware/zwave.h | 58 + .../pilight/libs/pilight/lua/CMakeLists.txt | 6 + lib/ESPiLight/pilight/libs/pilight/lua/lua.c | 722 ++ lib/ESPiLight/pilight/libs/pilight/lua/lua.h | 65 + .../pilight/libs/pilight/lua/lualibrary.c | 623 ++ .../pilight/libs/pilight/lua/lualibrary.h | 16 + .../pilight/protocols/433.92/CMakeExclude.txt | 257 + .../pilight/protocols/433.92/CMakeInclude.txt | 30 + .../pilight/protocols/433.92/CMakeLists.txt | 9 + .../pilight/protocols/433.92/alecto_ws1700.c | 0 .../pilight/protocols/433.92/alecto_ws1700.h | 0 .../pilight/protocols/433.92/alecto_wsd17.c | 0 .../pilight/protocols/433.92/alecto_wsd17.h | 0 .../pilight/protocols/433.92/alecto_wx500.c | 0 .../pilight/protocols/433.92/alecto_wx500.h | 0 .../protocols/433.92/arctech_contact.c | 0 .../protocols/433.92/arctech_contact.h | 0 .../pilight/protocols/433.92/arctech_dimmer.c | 0 .../pilight/protocols/433.92/arctech_dimmer.h | 0 .../pilight/protocols/433.92/arctech_dusk.c | 0 .../pilight/protocols/433.92/arctech_dusk.h | 0 .../pilight/protocols/433.92/arctech_motion.c | 0 .../pilight/protocols/433.92/arctech_motion.h | 0 .../pilight/protocols/433.92/arctech_screen.c | 0 .../pilight/protocols/433.92/arctech_screen.h | 0 .../protocols/433.92/arctech_screen_old.c | 0 .../protocols/433.92/arctech_screen_old.h | 0 .../pilight/protocols/433.92/arctech_switch.c | 0 .../pilight/protocols/433.92/arctech_switch.h | 0 .../protocols/433.92/arctech_switch_old.c | 0 .../protocols/433.92/arctech_switch_old.h | 0 .../libs/pilight/protocols/433.92/auriol.c | 0 .../libs/pilight/protocols/433.92/auriol.h | 0 .../pilight/protocols/433.92/beamish_switch.c | 0 .../pilight/protocols/433.92/beamish_switch.h | 0 .../libs/pilight/protocols/433.92/clarus.c | 0 .../libs/pilight/protocols/433.92/clarus.h | 0 .../pilight/protocols/433.92/cleverwatts.c | 0 .../pilight/protocols/433.92/cleverwatts.h | 0 .../protocols/433.92/conrad_rsl_contact.c | 0 .../protocols/433.92/conrad_rsl_contact.h | 0 .../protocols/433.92/conrad_rsl_switch.c | 0 .../protocols/433.92/conrad_rsl_switch.h | 0 .../libs/pilight/protocols/433.92/daycom.c | 0 .../libs/pilight/protocols/433.92/daycom.h | 0 .../libs/pilight/protocols/433.92/ehome.c | 0 .../libs/pilight/protocols/433.92/ehome.h | 0 .../protocols/433.92/elro_300_switch.c | 0 .../protocols/433.92/elro_300_switch.h | 0 .../protocols/433.92/elro_400_switch.c | 0 .../protocols/433.92/elro_400_switch.h | 0 .../protocols/433.92/elro_800_contact.c | 0 .../protocols/433.92/elro_800_contact.h | 0 .../protocols/433.92/elro_800_switch.c | 0 .../protocols/433.92/elro_800_switch.h | 0 .../protocols/433.92/eurodomest_switch.c | 0 .../protocols/433.92/eurodomest_switch.h | 0 .../libs/pilight/protocols/433.92/ev1527.c | 0 .../libs/pilight/protocols/433.92/ev1527.h | 0 .../libs/pilight/protocols/433.92/heitech.c | 0 .../libs/pilight/protocols/433.92/heitech.h | 0 .../libs/pilight/protocols/433.92/impuls.c | 0 .../libs/pilight/protocols/433.92/impuls.h | 0 .../pilight/protocols/433.92/livolo_switch.c | 0 .../pilight/protocols/433.92/livolo_switch.h | 0 .../protocols/433.92/logilink_switch.c | 0 .../protocols/433.92/logilink_switch.h | 0 .../libs/pilight/protocols/433.92/mumbi.c | 0 .../libs/pilight/protocols/433.92/mumbi.h | 0 .../protocols/433.92/ninjablocks_weather.c | 0 .../protocols/433.92/ninjablocks_weather.h | 0 .../libs/pilight/protocols/433.92/pollin.c | 0 .../libs/pilight/protocols/433.92/pollin.h | 0 .../protocols/433.92/protocol_header.h.in | 1 + .../protocols/433.92/protocol_init.h.in | 1 + .../pilight/protocols/433.92/quigg_gt1000.c | 0 .../pilight/protocols/433.92/quigg_gt1000.h | 0 .../pilight/protocols/433.92/quigg_gt7000.c | 0 .../pilight/protocols/433.92/quigg_gt7000.h | 0 .../pilight/protocols/433.92/quigg_gt9000.c | 0 .../pilight/protocols/433.92/quigg_gt9000.h | 0 .../pilight/protocols/433.92/quigg_screen.c | 0 .../pilight/protocols/433.92/quigg_screen.h | 0 .../libs/pilight/protocols/433.92/rc101.c | 0 .../libs/pilight/protocols/433.92/rc101.h | 0 .../libs/pilight/protocols/433.92/rev_v1.c | 0 .../libs/pilight/protocols/433.92/rev_v1.h | 0 .../libs/pilight/protocols/433.92/rev_v2.c | 0 .../libs/pilight/protocols/433.92/rev_v2.h | 0 .../libs/pilight/protocols/433.92/rev_v3.c | 0 .../libs/pilight/protocols/433.92/rev_v3.h | 0 .../libs/pilight/protocols/433.92/rsl366.c | 0 .../libs/pilight/protocols/433.92/rsl366.h | 0 .../libs/pilight/protocols/433.92/sc2262.c | 0 .../libs/pilight/protocols/433.92/sc2262.h | 0 .../pilight/protocols/433.92/secudo_smoke.c | 0 .../pilight/protocols/433.92/secudo_smoke.h | 0 .../pilight/protocols/433.92/selectremote.c | 0 .../pilight/protocols/433.92/selectremote.h | 0 .../pilight/protocols/433.92/silvercrest.c | 0 .../pilight/protocols/433.92/silvercrest.h | 0 .../libs/pilight/protocols/433.92/tcm.c | 0 .../libs/pilight/protocols/433.92/tcm.h | 0 .../protocols/433.92/techlico_switch.c | 0 .../protocols/433.92/techlico_switch.h | 0 .../libs/pilight/protocols/433.92/teknihall.c | 0 .../libs/pilight/protocols/433.92/teknihall.h | 0 .../libs/pilight/protocols/433.92/tfa.c | 0 .../libs/pilight/protocols/433.92/tfa.h | 0 .../libs/pilight/protocols/433.92/tfa30.c | 0 .../libs/pilight/protocols/433.92/tfa30.h | 0 .../libs/pilight/protocols/433.92/x10.c | 0 .../libs/pilight/protocols/433.92/x10.h | 0 .../pilight/protocols/API/CMakeExclude.txt | 41 + .../pilight/protocols/API/CMakeInclude.txt | 30 + .../libs/pilight/protocols/API/CMakeLists.txt | 9 + .../libs/pilight/protocols/API/cpu_temp.c | 398 ++ .../libs/pilight/protocols/API/cpu_temp.h | 27 + .../libs/pilight/protocols/API/datetime.c | 474 ++ .../libs/pilight/protocols/API/datetime.h | 27 + .../pilight/libs/pilight/protocols/API/lirc.c | 279 + .../pilight/libs/pilight/protocols/API/lirc.h | 27 + .../pilight/protocols/API/openweathermap.c | 946 +++ .../pilight/protocols/API/openweathermap.h | 27 + .../libs/pilight/protocols/API/program.c | 413 ++ .../libs/pilight/protocols/API/program.h | 27 + .../protocols/API/protocol_header.h.in | 1 + .../pilight/protocols/API/protocol_init.h.in | 1 + .../libs/pilight/protocols/API/sunriseset.c | 615 ++ .../libs/pilight/protocols/API/sunriseset.h | 27 + .../libs/pilight/protocols/API/wunderground.c | 1073 +++ .../libs/pilight/protocols/API/wunderground.h | 27 + .../pilight/libs/pilight/protocols/API/xbmc.c | 425 ++ .../pilight/libs/pilight/protocols/API/xbmc.h | 27 + .../libs/pilight/protocols/CMakeExclude.txt | 12 + .../libs/pilight/protocols/CMakeInclude.txt | 21 + .../libs/pilight/protocols/CMakeLists.txt | 71 + .../pilight/protocols/GPIO/CMakeExclude.txt | 44 + .../pilight/protocols/GPIO/CMakeInclude.txt | 30 + .../pilight/protocols/GPIO/CMakeLists.txt | 9 + .../libs/pilight/protocols/GPIO/bmp180.c | 448 ++ .../libs/pilight/protocols/GPIO/bmp180.h | 27 + .../libs/pilight/protocols/GPIO/dht11.c | 298 + .../libs/pilight/protocols/GPIO/dht11.h | 27 + .../libs/pilight/protocols/GPIO/dht22.c | 301 + .../libs/pilight/protocols/GPIO/dht22.h | 27 + .../libs/pilight/protocols/GPIO/ds18b20.c | 262 + .../libs/pilight/protocols/GPIO/ds18b20.h | 27 + .../libs/pilight/protocols/GPIO/ds18s20.c | 263 + .../libs/pilight/protocols/GPIO/ds18s20.h | 27 + .../libs/pilight/protocols/GPIO/gpio_switch.c | 207 + .../libs/pilight/protocols/GPIO/gpio_switch.h | 27 + .../libs/pilight/protocols/GPIO/lm75.c | 243 + .../libs/pilight/protocols/GPIO/lm75.h | 27 + .../libs/pilight/protocols/GPIO/lm76.c | 244 + .../libs/pilight/protocols/GPIO/lm76.h | 27 + .../protocols/GPIO/protocol_header.h.in | 1 + .../pilight/protocols/GPIO/protocol_init.h.in | 1 + .../libs/pilight/protocols/GPIO/relay.c | 261 + .../libs/pilight/protocols/GPIO/relay.h | 27 + .../pilight/protocols/core/CMakeInclude.txt | 30 + .../pilight/protocols/core/CMakeLists.txt | 8 + .../protocols/core/pilight_firmware_v2.c | 111 + .../protocols/core/pilight_firmware_v2.h | 25 + .../protocols/core/pilight_firmware_v3.c | 128 + .../protocols/core/pilight_firmware_v3.h | 27 + .../protocols/core/protocol_header.h.in | 1 + .../pilight/protocols/core/protocol_init.h.in | 1 + .../pilight/libs/pilight/protocols/core/raw.c | 91 + .../pilight/libs/pilight/protocols/core/raw.h | 27 + .../protocols/generic/CMakeExclude.txt | 26 + .../protocols/generic/CMakeInclude.txt | 30 + .../pilight/protocols/generic/CMakeLists.txt | 9 + .../protocols/generic/generic_dimmer.c | 158 + .../protocols/generic/generic_dimmer.h | 27 + .../pilight/protocols/generic/generic_label.c | 109 + .../pilight/protocols/generic/generic_label.h | 27 + .../protocols/generic/generic_screen.c | 103 + .../protocols/generic/generic_screen.h | 27 + .../protocols/generic/generic_switch.c | 104 + .../protocols/generic/generic_switch.h | 27 + .../protocols/generic/generic_weather.c | 116 + .../protocols/generic/generic_weather.h | 27 + .../protocols/generic/generic_webcam.c | 80 + .../protocols/generic/generic_webcam.h | 27 + .../protocols/generic/protocol_header.h.in | 1 + .../protocols/generic/protocol_init.h.in | 1 + .../protocols/network/CMakeExclude.txt | 11 + .../protocols/network/CMakeInclude.txt | 30 + .../pilight/protocols/network/CMakeLists.txt | 9 + .../libs/pilight/protocols/network/arping.c | 273 + .../libs/pilight/protocols/network/arping.h | 27 + .../libs/pilight/protocols/network/ping.c | 190 + .../libs/pilight/protocols/network/ping.h | 27 + .../protocols/network/protocol_header.h.in | 1 + .../protocols/network/protocol_init.h.in | 1 + .../pilight/libs/pilight/protocols/protocol.c | 411 ++ .../pilight/libs/pilight/protocols/protocol.h | 134 + .../pilight/protocols/protocol_header.h.in | 6 + .../libs/pilight/protocols/protocol_init.h.in | 6 + .../pilight/protocols/zwave/CMakeExclude.txt | 0 .../pilight/protocols/zwave/CMakeInclude.txt | 30 + .../pilight/protocols/zwave/CMakeLists.txt | 9 + .../protocols/zwave/protocol_header.h.in | 1 + .../protocols/zwave/protocol_init.h.in | 1 + .../libs/pilight/protocols/zwave/zwave_ctrl.c | 168 + .../libs/pilight/protocols/zwave/zwave_ctrl.h | 27 + .../pilight/protocols/zwave/zwave_dimmer.c | 175 + .../pilight/protocols/zwave/zwave_dimmer.h | 27 + .../pilight/protocols/zwave/zwave_switch.c | 155 + .../pilight/protocols/zwave/zwave_switch.h | 27 + .../pilight/libs/webgui/ajax-loader.gif | Bin 0 -> 4782 bytes .../libs/webgui/apple-touch-icon-ipad.png | Bin 0 -> 5755 bytes ...le-touch-icon-iphone-retina-display-hr.png | Bin 0 -> 16918 bytes ...apple-touch-icon-iphone-retina-display.png | Bin 0 -> 9635 bytes .../libs/webgui/apple-touch-icon-iphone.png | Bin 0 -> 4184 bytes .../pilight/libs/webgui/battery_green.png | Bin 0 -> 3173 bytes .../pilight/libs/webgui/battery_red.png | Bin 0 -> 3165 bytes lib/ESPiLight/pilight/libs/webgui/episode.png | Bin 0 -> 3152 bytes lib/ESPiLight/pilight/libs/webgui/favicon.ico | Bin 0 -> 1150 bytes lib/ESPiLight/pilight/libs/webgui/home.png | Bin 0 -> 3197 bytes lib/ESPiLight/pilight/libs/webgui/humi.png | Bin 0 -> 3195 bytes .../pilight/libs/webgui/illuminance.png | Bin 0 -> 610 bytes .../libs/webgui/images/ajax-loader.gif | Bin 0 -> 6242 bytes .../libs/webgui/images/icons-18-white.png | Bin 0 -> 1988 bytes .../libs/webgui/images/icons-36-white.png | Bin 0 -> 3861 bytes lib/ESPiLight/pilight/libs/webgui/index.html | 31 + .../pilight/libs/webgui/jquery-2.1.4.min.js | 4 + .../libs/webgui/jquery.mobile-1.4.5.min.css | 3 + .../libs/webgui/jquery.mobile-1.4.5.min.js | 10 + lib/ESPiLight/pilight/libs/webgui/logo.png | Bin 0 -> 4534 bytes .../pilight/libs/webgui/moment.min.js | 7 + lib/ESPiLight/pilight/libs/webgui/movie.png | Bin 0 -> 3196 bytes lib/ESPiLight/pilight/libs/webgui/off.png | Bin 0 -> 3673 bytes lib/ESPiLight/pilight/libs/webgui/on.png | Bin 0 -> 2955 bytes lib/ESPiLight/pilight/libs/webgui/pause.png | Bin 0 -> 3018 bytes lib/ESPiLight/pilight/libs/webgui/pilight.css | 360 + .../libs/webgui/pilight.jquery.theme.css | 743 ++ lib/ESPiLight/pilight/libs/webgui/pilight.js | 1332 ++++ lib/ESPiLight/pilight/libs/webgui/play.png | Bin 0 -> 3007 bytes .../pilight/libs/webgui/pressure.png | Bin 0 -> 3137 bytes lib/ESPiLight/pilight/libs/webgui/rain.png | Bin 0 -> 3572 bytes .../pilight/libs/webgui/screen_active.png | Bin 0 -> 3165 bytes .../pilight/libs/webgui/screen_inactive.png | Bin 0 -> 3169 bytes .../pilight/libs/webgui/shutdown.png | Bin 0 -> 3241 bytes .../pilight/libs/webgui/smallloader.gif | Bin 0 -> 1108 bytes lib/ESPiLight/pilight/libs/webgui/song.png | Bin 0 -> 3322 bytes lib/ESPiLight/pilight/libs/webgui/stop.png | Bin 0 -> 2963 bytes .../pilight/libs/webgui/sunrise_gray.png | Bin 0 -> 3334 bytes .../pilight/libs/webgui/sunrise_yellow.png | Bin 0 -> 3311 bytes .../pilight/libs/webgui/sunset_blue.png | Bin 0 -> 3369 bytes .../pilight/libs/webgui/sunset_gray.png | Bin 0 -> 3306 bytes lib/ESPiLight/pilight/libs/webgui/temp.png | Bin 0 -> 3053 bytes .../pilight/libs/webgui/update_active.png | Bin 0 -> 3277 bytes .../pilight/libs/webgui/update_inactive.png | Bin 0 -> 594 bytes lib/ESPiLight/pilight/libs/webgui/version.txt | 1 + lib/ESPiLight/pilight/libs/webgui/windavg.png | Bin 0 -> 3363 bytes lib/ESPiLight/pilight/libs/webgui/winddir.png | Bin 0 -> 2975 bytes .../pilight/libs/webgui/windgust.png | Bin 0 -> 3392 bytes lib/ESPiLight/pilight/raw.c | 391 + lib/ESPiLight/pilight/receive.c | 274 + .../pilight/res/config/config.json-default | 18 + .../res/config/config.json-default-openwrt | 20 + .../res/config/config.json-default-w32 | 19 + .../pilight/res/firmware/pilight_usb_nano.hex | 265 + lib/ESPiLight/pilight/res/init/pilight.initd | 131 + .../pilight/res/init/pilight.upstart | 10 + lib/ESPiLight/pilight/res/pilight.pem | 50 + lib/ESPiLight/pilight/res/win32/Packet.dll | Bin 0 -> 98040 bytes lib/ESPiLight/pilight/res/win32/admin.obj | Bin 0 -> 552 bytes lib/ESPiLight/pilight/res/win32/admin.rc | 3 + lib/ESPiLight/pilight/res/win32/icon.obj | Bin 0 -> 1410 bytes lib/ESPiLight/pilight/res/win32/icon.rc | 1 + lib/ESPiLight/pilight/res/win32/liblua5.2.dll | Bin 0 -> 239851 bytes .../pilight/res/win32/libmbedcrypto.dll | Bin 0 -> 624784 bytes .../pilight/res/win32/libmbedtls.dll | Bin 0 -> 478745 bytes .../pilight/res/win32/libmbedx509.dll | Bin 0 -> 369015 bytes .../pilight/res/win32/libwinpthread-1.dll | Bin 0 -> 251903 bytes lib/ESPiLight/pilight/res/win32/manifest.obj | Bin 0 -> 1872 bytes .../pilight/res/win32/pilight.manifest | 10 + lib/ESPiLight/pilight/res/win32/systray.ico | Bin 0 -> 1150 bytes lib/ESPiLight/pilight/res/win32/wpcap.dll | Bin 0 -> 282360 bytes lib/ESPiLight/pilight/send.c | 418 ++ lib/ESPiLight/pilight/setup.sh | 115 + lib/ESPiLight/pilight/sha256.c | 183 + lib/ESPiLight/pilight/uuid.c | 132 + lib/ESPiLight/src/ESPiLight.cpp | 9 +- lib/ESPiLight/src/ESPiLight.h | 4 + .../pilight/libs/pilight/protocols/protocol.c | 6 +- .../pilight/libs/pilight/protocols/protocol.h | 2 +- .../libs/pilight/protocols/protocol_header.h | 51 - .../libs/pilight/protocols/protocol_init.h | 51 - 1030 files changed, 203335 insertions(+), 116 deletions(-) create mode 100644 lib/ESPiLight/pilight/.gitattributes create mode 100644 lib/ESPiLight/pilight/.gitignore create mode 100644 lib/ESPiLight/pilight/CMakeConfig.txt create mode 100644 lib/ESPiLight/pilight/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/CONTRIBUTING.md create mode 100644 lib/ESPiLight/pilight/COPYING create mode 100644 lib/ESPiLight/pilight/LICENSE.txt create mode 100644 lib/ESPiLight/pilight/README.md create mode 100644 lib/ESPiLight/pilight/clients/process.java create mode 100644 lib/ESPiLight/pilight/clients/process.php create mode 100644 lib/ESPiLight/pilight/clients/process.pl create mode 100644 lib/ESPiLight/pilight/clients/process.py create mode 100644 lib/ESPiLight/pilight/clients/process.py3 create mode 100644 lib/ESPiLight/pilight/control.c create mode 100644 lib/ESPiLight/pilight/daemon.c create mode 100644 lib/ESPiLight/pilight/debug.c create mode 100644 lib/ESPiLight/pilight/docs/make.bat create mode 100644 lib/ESPiLight/pilight/docs/source/.static/Roboto-Condensed.woff create mode 100644 lib/ESPiLight/pilight/docs/source/.static/Roboto-Condensed.woff2 create mode 100644 lib/ESPiLight/pilight/docs/source/.static/custom.css create mode 100644 lib/ESPiLight/pilight/docs/source/.static/custom.js create mode 100644 lib/ESPiLight/pilight/docs/source/.static/font.min.css create mode 100644 lib/ESPiLight/pilight/docs/source/about_manual.rst create mode 100644 lib/ESPiLight/pilight/docs/source/adhoc_network.rst create mode 100644 lib/ESPiLight/pilight/docs/source/changelog.rst create mode 100644 lib/ESPiLight/pilight/docs/source/conf.py create mode 100644 lib/ESPiLight/pilight/docs/source/configuration/devices.rst create mode 100644 lib/ESPiLight/pilight/docs/source/configuration/example.rst create mode 100644 lib/ESPiLight/pilight/docs/source/configuration/gui.rst create mode 100644 lib/ESPiLight/pilight/docs/source/configuration/hardware.rst create mode 100644 lib/ESPiLight/pilight/docs/source/configuration/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/configuration/registry.rst create mode 100644 lib/ESPiLight/pilight/docs/source/configuration/rules.rst create mode 100644 lib/ESPiLight/pilight/docs/source/configuration/settings.rst create mode 100644 lib/ESPiLight/pilight/docs/source/development/api.rst create mode 100644 lib/ESPiLight/pilight/docs/source/development/debugging.rst create mode 100644 lib/ESPiLight/pilight/docs/source/development/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/electronics/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/electronics/pcb_soldering.rst create mode 100644 lib/ESPiLight/pilight/docs/source/electronics/wiring.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/actions/dim.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/actions/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/actions/label.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/actions/pushbullet.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/actions/pushover.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/actions/sendmail.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/actions/switch.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/actions/toggle.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/examples/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/examples/ir.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/examples/kodi.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/examples/mail.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/examples/mail1.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/examples/sunriseset.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/examples/time.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/functions/date_add.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/functions/date_format.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/functions/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/functions/random.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/operators.rst create mode 100644 lib/ESPiLight/pilight/docs/source/eventing/syntax.rst create mode 100644 lib/ESPiLight/pilight/docs/source/faq.rst create mode 100644 lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeA+B.pdf create mode 100644 lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeA+B.svg create mode 100644 lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeC.pdf create mode 100644 lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeC.svg create mode 100644 lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeD.pdf create mode 100644 lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeD.svg create mode 100644 lib/ESPiLight/pilight/docs/source/images/attiny-wiring.pdf create mode 100644 lib/ESPiLight/pilight/docs/source/images/attiny-wiring.svg create mode 100644 lib/ESPiLight/pilight/docs/source/images/favicon.ico create mode 100644 lib/ESPiLight/pilight/docs/source/images/installation.png create mode 100644 lib/ESPiLight/pilight/docs/source/images/no.png create mode 100644 lib/ESPiLight/pilight/docs/source/images/pilight.png create mode 100644 lib/ESPiLight/pilight/docs/source/images/soldering/1.jpg create mode 100644 lib/ESPiLight/pilight/docs/source/images/soldering/10.jpg create mode 100644 lib/ESPiLight/pilight/docs/source/images/soldering/11.jpg create mode 100644 lib/ESPiLight/pilight/docs/source/images/soldering/12.jpg create mode 100644 lib/ESPiLight/pilight/docs/source/images/soldering/13.jpg create mode 100644 lib/ESPiLight/pilight/docs/source/images/soldering/14.jpg create mode 100644 lib/ESPiLight/pilight/docs/source/images/soldering/2.jpg create mode 100644 lib/ESPiLight/pilight/docs/source/images/soldering/3.jpg create mode 100644 lib/ESPiLight/pilight/docs/source/images/soldering/4.jpg create mode 100644 lib/ESPiLight/pilight/docs/source/images/soldering/5.jpg create mode 100644 lib/ESPiLight/pilight/docs/source/images/soldering/6.jpg create mode 100644 lib/ESPiLight/pilight/docs/source/images/soldering/7.jpg create mode 100644 lib/ESPiLight/pilight/docs/source/images/soldering/8.jpg create mode 100644 lib/ESPiLight/pilight/docs/source/images/soldering/9.jpg create mode 100644 lib/ESPiLight/pilight/docs/source/images/usb-nano-wiring.pdf create mode 100644 lib/ESPiLight/pilight/docs/source/images/usb-nano-wiring.svg create mode 100644 lib/ESPiLight/pilight/docs/source/images/yes.png create mode 100644 lib/ESPiLight/pilight/docs/source/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/installation.rst create mode 100644 lib/ESPiLight/pilight/docs/source/programs/control.rst create mode 100644 lib/ESPiLight/pilight/docs/source/programs/daemon.rst create mode 100644 lib/ESPiLight/pilight/docs/source/programs/debug.rst create mode 100644 lib/ESPiLight/pilight/docs/source/programs/flash.rst create mode 100644 lib/ESPiLight/pilight/docs/source/programs/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/programs/raw.rst create mode 100644 lib/ESPiLight/pilight/docs/source/programs/receive.rst create mode 100644 lib/ESPiLight/pilight/docs/source/programs/send.rst create mode 100644 lib/ESPiLight/pilight/docs/source/programs/sha256.rst create mode 100644 lib/ESPiLight/pilight/docs/source/programs/uuid.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/alarm/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/alarm/secudo.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/elro.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/ev1527.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/kaku.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/sc2262.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/_kaku.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/intertechno.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/kaku.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/nexa.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/motion/ev1527.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/motion/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/motion/kaku.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/_kaku.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/d_io.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/kaku.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/kaku_old.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_elro_800.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_kaku.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_kaku_old.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_rsl366.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/beamish.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/brennenstuhl.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/byebyestandby.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/clarus.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/cleverwatts.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/coco.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/cogex.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/dio.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/duwi.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/elro_300.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/elro_400.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/elro_800.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/eurodomest.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/impuls.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/intertechno.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/intertechno_old.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/kaku.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/kaku_old.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/nexa.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/quigg_1000.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/quigg_7000.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/rsl366.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/selectremote.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/silvercrest.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/techlico.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/x10.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_alecto_ws1700.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_alecto_wx500.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_conrad.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_tfa30.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/alecto_ws1700.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/alecto_wsd17.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/alecto_wx500.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/auriol_89210.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/auriol_h13726.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/conrad.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/dostmann.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/hama_ews1500.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/iboutique.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/kaku.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/meteoscan_w1xxx.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/ninja_blocks.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/soens.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/tcm.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/teknihall.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/tfa.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/ventus_wsxxx.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/api/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/api/program/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/api/program/lirc.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/api/program/program.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/api/program/xbmc.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/api/weather/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/api/weather/openweathermap.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/api/weather/sunriseset.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/api/weather/wunderground.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/generic/dimmer.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/generic/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/generic/label.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/generic/raw.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/generic/screen.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/generic/switch.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/generic/weather.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/generic/webcam.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/_am2302.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/_bmp180.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/_ds18b20.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/_lm75.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/am2302.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/bmp085.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/bmp180.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/cputemp.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/dht11.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/dht22.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/ds18b20.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/ds18s20.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/gpio_switch.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/lm75.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/gpio/lm76.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/network/arping.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/network/index.rst create mode 100644 lib/ESPiLight/pilight/docs/source/protocols/network/ping.rst create mode 100644 lib/ESPiLight/pilight/flash.c create mode 100644 lib/ESPiLight/pilight/inc/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/inc/defines.h.in create mode 100644 lib/ESPiLight/pilight/inc/i2c-dev.h create mode 100644 lib/ESPiLight/pilight/libs/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/avrdude/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/avrdude/arduino.c create mode 100644 lib/ESPiLight/pilight/libs/avrdude/arduino.h create mode 100644 lib/ESPiLight/pilight/libs/avrdude/avr.c create mode 100644 lib/ESPiLight/pilight/libs/avrdude/avr.h create mode 100644 lib/ESPiLight/pilight/libs/avrdude/avrbitbang.c create mode 100644 lib/ESPiLight/pilight/libs/avrdude/avrbitbang.h create mode 100644 lib/ESPiLight/pilight/libs/avrdude/avrconfig.c create mode 100644 lib/ESPiLight/pilight/libs/avrdude/avrconfig.h create mode 100644 lib/ESPiLight/pilight/libs/avrdude/avrdude.h create mode 100644 lib/ESPiLight/pilight/libs/avrdude/avrgpio.c create mode 100644 lib/ESPiLight/pilight/libs/avrdude/avrgpio.h create mode 100644 lib/ESPiLight/pilight/libs/avrdude/avrpart.c create mode 100644 lib/ESPiLight/pilight/libs/avrdude/avrpart.h create mode 100644 lib/ESPiLight/pilight/libs/avrdude/avrupd.c create mode 100644 lib/ESPiLight/pilight/libs/avrdude/avrupd.h create mode 100644 lib/ESPiLight/pilight/libs/avrdude/fileio.c create mode 100644 lib/ESPiLight/pilight/libs/avrdude/fileio.h create mode 100644 lib/ESPiLight/pilight/libs/avrdude/pgm.c create mode 100644 lib/ESPiLight/pilight/libs/avrdude/pgm.h create mode 100644 lib/ESPiLight/pilight/libs/avrdude/pindefs.h create mode 100644 lib/ESPiLight/pilight/libs/avrdude/safemode.c create mode 100644 lib/ESPiLight/pilight/libs/avrdude/safemode.h create mode 100644 lib/ESPiLight/pilight/libs/avrdude/ser_posix.c create mode 100644 lib/ESPiLight/pilight/libs/avrdude/ser_win32.c create mode 100644 lib/ESPiLight/pilight/libs/avrdude/serial.h create mode 100644 lib/ESPiLight/pilight/libs/avrdude/stk500.c create mode 100644 lib/ESPiLight/pilight/libs/avrdude/stk500.h create mode 100644 lib/ESPiLight/pilight/libs/avrdude/stk500_private.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/libuv/android-ifaddrs.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/fs-poll.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/heap-inl.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/inet.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/pthread-barrier.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/queue.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/stdint-msvc2008.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/threadpool.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/threadpool.c.ori create mode 100644 lib/ESPiLight/pilight/libs/libuv/threadpool.patch create mode 100644 lib/ESPiLight/pilight/libs/libuv/tree.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/aix.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/android-ifaddrs.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/async.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/atomic-ops.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/bsd-ifaddrs.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/core.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/cygwin.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/darwin-proctitle.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/darwin.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/dl.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/freebsd.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/fs.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/fsevents.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/getaddrinfo.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/getnameinfo.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/internal.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/kqueue.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/linux-core.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/linux-inotify.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/linux-syscalls.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/linux-syscalls.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/loop-watcher.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/loop.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/netbsd.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/no-fsevents.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/no-proctitle.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/openbsd.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/os390-syscalls.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/os390-syscalls.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/os390.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/pipe.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/poll.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/posix-hrtime.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/posix-poll.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/process.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/procfs-exepath.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/proctitle.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/pthread-barrier.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/pthread-fixes.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/signal.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/spinlock.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/stream.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/sunos.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/sysinfo-loadavg.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/sysinfo-memory.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/tcp.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/thread.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/timer.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/tty.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/unix/udp.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-aix.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-bsd.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-common.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-common.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-darwin.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-errno.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-linux.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-os390.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-posix.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-sunos.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-threadpool.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-threadpool.h.ori create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-unix.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-version.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv-win.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/uv.h.ori create mode 100644 lib/ESPiLight/pilight/libs/libuv/version.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/async.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/atomicops-inl.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/core.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/detect-wakeup.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/dl.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/error.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/fs-event.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/fs.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/getaddrinfo.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/getnameinfo.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/handle-inl.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/handle.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/internal.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/loop-watcher.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/pipe.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/poll.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/process-stdio.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/process.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/req-inl.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/req.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/signal.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/snprintf.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/stream-inl.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/stream.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/tcp.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/thread.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/timer.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/tty.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/udp.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/util.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/winapi.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/winapi.h create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/winsock.c create mode 100644 lib/ESPiLight/pilight/libs/libuv/win/winsock.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Bitfield.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Defs.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/DoxygenMain.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Driver.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Driver.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Group.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Group.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Manager.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Manager.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Msg.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Msg.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Node.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Node.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Notification.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Options.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Options.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Scene.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Scene.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Utils.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/Utils.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/ZWaveCommandClasses.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/aes/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/openzwave/aes/aes.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/aes/aes_modes.c create mode 100644 lib/ESPiLight/pilight/libs/openzwave/aes/aescpp.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/aes/aescrypt.c create mode 100644 lib/ESPiLight/pilight/libs/openzwave/aes/aeskey.c create mode 100644 lib/ESPiLight/pilight/libs/openzwave/aes/aesopt.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/aes/aestab.c create mode 100644 lib/ESPiLight/pilight/libs/openzwave/aes/aestab.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/aes/brg_endian.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/aes/brg_types.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Alarm.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Alarm.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ApplicationStatus.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ApplicationStatus.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Association.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Association.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/AssociationCommandConfiguration.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/AssociationCommandConfiguration.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Basic.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Basic.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/BasicWindowCovering.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/BasicWindowCovering.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Battery.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Battery.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/CRC16Encap.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/CRC16Encap.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ClimateControlSchedule.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ClimateControlSchedule.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Clock.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Clock.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClass.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClass.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClasses.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClasses.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Configuration.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Configuration.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ControllerReplication.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ControllerReplication.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLock.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLock.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLockLogging.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLockLogging.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/EnergyProduction.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/EnergyProduction.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Hail.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Hail.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Indicator.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Indicator.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Language.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Language.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Lock.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Lock.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ManufacturerSpecific.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ManufacturerSpecific.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Meter.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Meter.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/MeterPulse.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/MeterPulse.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiCmd.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiCmd.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstance.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstance.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstanceAssociation.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstanceAssociation.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/NoOperation.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/NoOperation.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/NodeNaming.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/NodeNaming.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Powerlevel.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Powerlevel.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Proprietary.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Proprietary.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Protection.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Protection.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SceneActivation.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SceneActivation.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Security.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Security.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorAlarm.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorAlarm.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorBinary.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorBinary.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorMultilevel.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorMultilevel.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchAll.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchAll.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchBinary.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchBinary.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchMultilevel.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchMultilevel.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleBinary.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleBinary.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleMultilevel.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleMultilevel.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanMode.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanMode.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanState.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanState.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatMode.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatMode.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatOperatingState.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatOperatingState.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatSetpoint.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatSetpoint.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/TimeParameters.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/TimeParameters.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/UserCode.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/UserCode.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Version.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/Version.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/WakeUp.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/command_classes/WakeUp.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/libudev.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Controller.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Controller.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Event.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Event.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/FileOps.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/FileOps.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Log.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Log.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Mutex.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Mutex.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Ref.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/SerialController.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/SerialController.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Stream.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Stream.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Thread.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Thread.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/TimeStamp.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/TimeStamp.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Wait.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/Wait.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/EventImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/EventImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/FileOpsImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/FileOpsImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/LogImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/LogImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/MutexImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/MutexImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/SerialControllerImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/SerialControllerImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/ThreadImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/ThreadImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/TimeStampImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/TimeStampImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/WaitImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/unix/WaitImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/EventImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/EventImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/FileOpsImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/FileOpsImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/LogImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/LogImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/MutexImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/MutexImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/SerialControllerImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/SerialControllerImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/ThreadImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/ThreadImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/TimeStampImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/TimeStampImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/WaitImpl.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/platform/windows/WaitImpl.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/tinystr.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/tinystr.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/tinyxml.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/tinyxml.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/tinyxmlerror.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/tinyxmlparser.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/Value.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/Value.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueBool.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueBool.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueButton.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueButton.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueByte.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueByte.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueDecimal.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueDecimal.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueID.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueInt.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueInt.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueList.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueList.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueRaw.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueRaw.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueSchedule.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueSchedule.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueShort.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueShort.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueStore.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueStore.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueString.cpp create mode 100644 lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueString.h create mode 100644 lib/ESPiLight/pilight/libs/openzwave/vers.cpp create mode 100644 lib/ESPiLight/pilight/libs/pilight/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/config/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/config/devices.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/config/devices.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/config/gui.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/config/gui.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/config/hardware.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/config/hardware.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/config/registry.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/config/registry.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/config/rules.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/config/rules.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/config/settings.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/config/settings.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/CMakeExclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/arp.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/arp.h rename lib/ESPiLight/{src => }/pilight/libs/pilight/core/binary.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/core/binary.h (100%) mode change 100755 => 100644 create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/cast.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/cast.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/common.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/common.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/config.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/config.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/datetime.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/datetime.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/dso.c rename lib/ESPiLight/{src => }/pilight/libs/pilight/core/dso.h (100%) mode change 100755 => 100644 create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/eventpool.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/eventpool.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/eventpool_structs.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/fcache.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/fcache.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/firmware.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/firmware.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/gc.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/gc.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/http.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/http.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/i2c-dev.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/irq.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/irq.h rename lib/ESPiLight/{src => }/pilight/libs/pilight/core/json.c (99%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/core/json.h (100%) mode change 100755 => 100644 create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/log.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/log.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/mail.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/mail.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/mem.c rename lib/ESPiLight/{src => }/pilight/libs/pilight/core/mem.h (100%) mode change 100755 => 100644 create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/network.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/network.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/ntp.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/ntp.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/options.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/options.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/pilight.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/pilight.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/ping.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/ping.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/proc.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/proc.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/sha256cache.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/sha256cache.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/socket.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/socket.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/ssdp.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/ssdp.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/ssl.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/ssl.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/strptime.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/strptime.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/threads.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/threads.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/tzdata.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/update.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/webserver.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/core/webserver.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/datatypes/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/datatypes/stack.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/datatypes/stack.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/action.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/action.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/CMakeInclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/action_header.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/action_init.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/dim.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/dim.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/label.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/label.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/pushbullet.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/pushbullet.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/pushover.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/pushover.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/sendmail.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/sendmail.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/switch.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/switch.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/toggle.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/actions/toggle.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/events.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/events.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/function.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/function.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/functions/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/functions/date_add.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/functions/date_format.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/functions/random.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operator.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operator.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/and.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/concat.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/divide.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/eq.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/ge.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/gt.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/intdivide.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/le.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/lt.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/minus.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/modulus.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/multiply.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/ne.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/or.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/events/operators/plus.lua create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/433gpio.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/433gpio.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/433lirc.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/433lirc.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/433nano.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/433nano.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/CMakeExclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/CMakeInclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/hardware_header.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/hardware_init.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/none.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/none.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/zwave.cpp create mode 100644 lib/ESPiLight/pilight/libs/pilight/hardware/zwave.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/lua/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/lua/lua.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/lua/lua.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/lua/lualibrary.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/lua/lualibrary.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/433.92/CMakeExclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/433.92/CMakeInclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/433.92/CMakeLists.txt rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/alecto_ws1700.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/alecto_ws1700.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/alecto_wsd17.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/alecto_wsd17.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/alecto_wx500.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/alecto_wx500.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_contact.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_contact.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_dimmer.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_dimmer.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_dusk.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_dusk.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_motion.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_motion.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_screen.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_screen.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_screen_old.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_screen_old.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_switch.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_switch.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_switch_old.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/arctech_switch_old.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/auriol.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/auriol.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/beamish_switch.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/beamish_switch.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/clarus.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/clarus.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/cleverwatts.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/cleverwatts.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/conrad_rsl_contact.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/conrad_rsl_contact.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/conrad_rsl_switch.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/conrad_rsl_switch.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/daycom.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/daycom.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/ehome.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/ehome.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/elro_300_switch.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/elro_300_switch.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/elro_400_switch.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/elro_400_switch.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/elro_800_contact.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/elro_800_contact.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/elro_800_switch.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/elro_800_switch.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/eurodomest_switch.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/eurodomest_switch.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/ev1527.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/ev1527.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/heitech.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/heitech.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/impuls.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/impuls.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/livolo_switch.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/livolo_switch.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/logilink_switch.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/logilink_switch.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/mumbi.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/mumbi.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/ninjablocks_weather.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/ninjablocks_weather.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/pollin.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/pollin.h (100%) mode change 100755 => 100644 create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/433.92/protocol_header.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/433.92/protocol_init.h.in rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/quigg_gt1000.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/quigg_gt1000.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/quigg_gt7000.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/quigg_gt7000.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/quigg_gt9000.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/quigg_gt9000.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/quigg_screen.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/quigg_screen.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/rc101.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/rc101.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/rev_v1.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/rev_v1.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/rev_v2.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/rev_v2.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/rev_v3.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/rev_v3.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/rsl366.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/rsl366.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/sc2262.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/sc2262.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/secudo_smoke.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/secudo_smoke.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/selectremote.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/selectremote.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/silvercrest.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/silvercrest.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/tcm.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/tcm.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/techlico_switch.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/techlico_switch.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/teknihall.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/teknihall.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/tfa.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/tfa.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/tfa30.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/tfa30.h (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/x10.c (100%) mode change 100755 => 100644 rename lib/ESPiLight/{src => }/pilight/libs/pilight/protocols/433.92/x10.h (100%) mode change 100755 => 100644 create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/CMakeExclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/CMakeInclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/cpu_temp.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/cpu_temp.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/datetime.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/datetime.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/lirc.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/lirc.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/openweathermap.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/openweathermap.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/program.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/program.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/protocol_header.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/protocol_init.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/sunriseset.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/sunriseset.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/wunderground.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/wunderground.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/xbmc.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/API/xbmc.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/CMakeExclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/CMakeInclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/CMakeExclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/CMakeInclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/bmp180.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/bmp180.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht11.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht11.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht22.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht22.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18b20.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18b20.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18s20.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18s20.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/gpio_switch.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/gpio_switch.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm75.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm75.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm76.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm76.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/protocol_header.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/protocol_init.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/relay.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/relay.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/core/CMakeInclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/core/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v2.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v2.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v3.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v3.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/core/protocol_header.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/core/protocol_init.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/core/raw.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/core/raw.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/CMakeExclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/CMakeInclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_dimmer.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_dimmer.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_label.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_label.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_screen.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_screen.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_switch.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_switch.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_weather.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_weather.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_webcam.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_webcam.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/protocol_header.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/generic/protocol_init.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/network/CMakeExclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/network/CMakeInclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/network/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/network/arping.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/network/arping.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/network/ping.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/network/ping.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/network/protocol_header.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/network/protocol_init.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/protocol.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/protocol.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/protocol_header.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/protocol_init.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/zwave/CMakeExclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/zwave/CMakeInclude.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/zwave/CMakeLists.txt create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/zwave/protocol_header.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/zwave/protocol_init.h.in create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_ctrl.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_ctrl.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_dimmer.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_dimmer.h create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_switch.c create mode 100644 lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_switch.h create mode 100644 lib/ESPiLight/pilight/libs/webgui/ajax-loader.gif create mode 100644 lib/ESPiLight/pilight/libs/webgui/apple-touch-icon-ipad.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/apple-touch-icon-iphone-retina-display-hr.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/apple-touch-icon-iphone-retina-display.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/apple-touch-icon-iphone.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/battery_green.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/battery_red.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/episode.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/favicon.ico create mode 100644 lib/ESPiLight/pilight/libs/webgui/home.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/humi.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/illuminance.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/images/ajax-loader.gif create mode 100644 lib/ESPiLight/pilight/libs/webgui/images/icons-18-white.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/images/icons-36-white.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/index.html create mode 100644 lib/ESPiLight/pilight/libs/webgui/jquery-2.1.4.min.js create mode 100644 lib/ESPiLight/pilight/libs/webgui/jquery.mobile-1.4.5.min.css create mode 100644 lib/ESPiLight/pilight/libs/webgui/jquery.mobile-1.4.5.min.js create mode 100644 lib/ESPiLight/pilight/libs/webgui/logo.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/moment.min.js create mode 100644 lib/ESPiLight/pilight/libs/webgui/movie.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/off.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/on.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/pause.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/pilight.css create mode 100644 lib/ESPiLight/pilight/libs/webgui/pilight.jquery.theme.css create mode 100644 lib/ESPiLight/pilight/libs/webgui/pilight.js create mode 100644 lib/ESPiLight/pilight/libs/webgui/play.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/pressure.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/rain.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/screen_active.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/screen_inactive.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/shutdown.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/smallloader.gif create mode 100644 lib/ESPiLight/pilight/libs/webgui/song.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/stop.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/sunrise_gray.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/sunrise_yellow.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/sunset_blue.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/sunset_gray.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/temp.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/update_active.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/update_inactive.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/version.txt create mode 100644 lib/ESPiLight/pilight/libs/webgui/windavg.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/winddir.png create mode 100644 lib/ESPiLight/pilight/libs/webgui/windgust.png create mode 100644 lib/ESPiLight/pilight/raw.c create mode 100644 lib/ESPiLight/pilight/receive.c create mode 100644 lib/ESPiLight/pilight/res/config/config.json-default create mode 100644 lib/ESPiLight/pilight/res/config/config.json-default-openwrt create mode 100644 lib/ESPiLight/pilight/res/config/config.json-default-w32 create mode 100644 lib/ESPiLight/pilight/res/firmware/pilight_usb_nano.hex create mode 100644 lib/ESPiLight/pilight/res/init/pilight.initd create mode 100644 lib/ESPiLight/pilight/res/init/pilight.upstart create mode 100644 lib/ESPiLight/pilight/res/pilight.pem create mode 100644 lib/ESPiLight/pilight/res/win32/Packet.dll create mode 100644 lib/ESPiLight/pilight/res/win32/admin.obj create mode 100644 lib/ESPiLight/pilight/res/win32/admin.rc create mode 100644 lib/ESPiLight/pilight/res/win32/icon.obj create mode 100644 lib/ESPiLight/pilight/res/win32/icon.rc create mode 100644 lib/ESPiLight/pilight/res/win32/liblua5.2.dll create mode 100644 lib/ESPiLight/pilight/res/win32/libmbedcrypto.dll create mode 100644 lib/ESPiLight/pilight/res/win32/libmbedtls.dll create mode 100644 lib/ESPiLight/pilight/res/win32/libmbedx509.dll create mode 100644 lib/ESPiLight/pilight/res/win32/libwinpthread-1.dll create mode 100644 lib/ESPiLight/pilight/res/win32/manifest.obj create mode 100644 lib/ESPiLight/pilight/res/win32/pilight.manifest create mode 100644 lib/ESPiLight/pilight/res/win32/systray.ico create mode 100644 lib/ESPiLight/pilight/res/win32/wpcap.dll create mode 100644 lib/ESPiLight/pilight/send.c create mode 100644 lib/ESPiLight/pilight/setup.sh create mode 100644 lib/ESPiLight/pilight/sha256.c create mode 100644 lib/ESPiLight/pilight/uuid.c delete mode 100755 lib/ESPiLight/src/pilight/libs/pilight/protocols/protocol_header.h delete mode 100755 lib/ESPiLight/src/pilight/libs/pilight/protocols/protocol_init.h diff --git a/lib/ESPiLight/.gitignore b/lib/ESPiLight/.gitignore index b25c15b..d77faed 100755 --- a/lib/ESPiLight/.gitignore +++ b/lib/ESPiLight/.gitignore @@ -1 +1,10 @@ *~ +src/pilight/libs/pilight/core/binary.c +src/pilight/libs/pilight/core/binary.h +src/pilight/libs/pilight/core/dso.h +src/pilight/libs/pilight/core/json.c +src/pilight/libs/pilight/core/json.h +src/pilight/libs/pilight/core/mem.h +src/pilight/libs/pilight/protocols/433.92/* +src/pilight/libs/pilight/protocols/protocol_header.h +src/pilight/libs/pilight/protocols/protocol_init.h diff --git a/lib/ESPiLight/.travis.yml b/lib/ESPiLight/.travis.yml index 66d26e2..5946f08 100755 --- a/lib/ESPiLight/.travis.yml +++ b/lib/ESPiLight/.travis.yml @@ -20,6 +20,8 @@ env: install: # PlatformIO - pip install -U platformio + # integrate pilight + - make script: - platformio ci --lib="." --board=huzzah --board=d1_mini --board=esp32dev diff --git a/lib/ESPiLight/Makefile b/lib/ESPiLight/Makefile index d855a82..99f0cca 100755 --- a/lib/ESPiLight/Makefile +++ b/lib/ESPiLight/Makefile @@ -47,7 +47,7 @@ $(DST_DIR)/libs/pilight/core/json.c: $(SRC_DIR)/libs/pilight/core/json.c @mkdir -p $(@D) cp $< $@ # ESP8266 Android, sprintf not working with float. Patch: - sed 's/sprintf(buf, "%.*f", decimals, num);/dtostrf(num, 0, decimals, buf);/' -i $@ + sed 's/\(^[ \t]*\)\(sprintf(buf, "%.*f", decimals, num);\)/#ifdef ESP8266\n\1dtostrf(num, 0, decimals, buf);\n#else\n\1\2\n#endif/' -i $@ # Arduino did not provide printf, fprintf sed 's!#include !#include \n#include "../../../../tools/aprintf.h"!' -i $@ diff --git a/lib/ESPiLight/library.json b/lib/ESPiLight/library.json index 2f7f69b..8a571f5 100755 --- a/lib/ESPiLight/library.json +++ b/lib/ESPiLight/library.json @@ -7,7 +7,7 @@ "type": "git", "url": "https://github.com/puuu/ESPiLight.git" }, - "version": "0.14.2", + "version": "0.15.0", "license": "GPL-3.0", "frameworks": "arduino", "platforms": diff --git a/lib/ESPiLight/library.properties b/lib/ESPiLight/library.properties index e036008..94ca5f2 100755 --- a/lib/ESPiLight/library.properties +++ b/lib/ESPiLight/library.properties @@ -1,5 +1,5 @@ name=ESPiLight -version=0.14.2 +version=0.15.0 author=Puuu maintainer=Puuu sentence=pilight 433.92 MHz protocols library for Arduino diff --git a/lib/ESPiLight/pilight/.gitattributes b/lib/ESPiLight/pilight/.gitattributes new file mode 100644 index 0000000..4eb2283 --- /dev/null +++ b/lib/ESPiLight/pilight/.gitattributes @@ -0,0 +1 @@ +text eol=lf \ No newline at end of file diff --git a/lib/ESPiLight/pilight/.gitignore b/lib/ESPiLight/pilight/.gitignore new file mode 100644 index 0000000..aecdf1f --- /dev/null +++ b/lib/ESPiLight/pilight/.gitignore @@ -0,0 +1,51 @@ +# CMake and build files +*.o +build/ +CMakeFiles/ +Makefile +*.cmake +CMakeCache.txt +cmake_uninstall.cmake.in + +# Headers created when running cmake +inc/defines.h +*_header.h +*_init.h + +# Libraries and pilight executables +*.a +*.so +pilight-control +pilight-daemon +pilight-debug +pilight-flash +pilight-raw +pilight-receive +pilight-send +pilight-sha256 +pilight-uuid +*.exe + +# JSON files in base directory - often used for local testing of different configs +/*.json + +# IDE project files +.project +.settings/ +.cproject +.idea/ +*.iml +*.ipr +*.iws + +# General os files +*~ +*.bak +*.swp +.directory +._* +ehthumbs.db +Thumbs.db + +# docs +docs/build \ No newline at end of file diff --git a/lib/ESPiLight/pilight/CMakeConfig.txt b/lib/ESPiLight/pilight/CMakeConfig.txt new file mode 100644 index 0000000..36c5ddc --- /dev/null +++ b/lib/ESPiLight/pilight/CMakeConfig.txt @@ -0,0 +1,90 @@ +set(WEBSERVER ON CACHE BOOL "enable the built-in webserver") +set(WEBSERVER_HTTPS ON CACHE BOOL "enable webserver ssl protocol") +set(EVENTS ON CACHE BOOL "enable the eventing functionality") +set(IR OFF CACHE BOOL "enable IR remotes support") +set(ZWAVE OFF CACHE BOOL "enable Z-Wave support") +set(PROTOCOL_ALECTO_WS1700 ON CACHE BOOL "support for the Alecto WS1700 protocol") +set(PROTOCOL_ALECTO_WSD17 ON CACHE BOOL "support for the Alecto WSD 17 protocol") +set(PROTOCOL_ALECTO_WX500 ON CACHE BOOL "support for the Alecto WX500 protocol") +set(PROTOCOL_AURIOL ON CACHE BOOL "support for the Auriol weather station protocol") +set(PROTOCOL_ARPING ON CACHE BOOL "support for the MAC based ping protocol") +set(PROTOCOL_BEAMISH_SWITCH ON CACHE BOOL "support for the Beamish switch protocol") +set(PROTOCOL_BMP180 ON CACHE BOOL "support for the BMP180/085 i2c barometric pressure-temperature sensor") +set(PROTOCOL_BRENNENSTUHL_SWITCH ON CACHE BOOL "support for the Brennenstuhl switch protocol") +set(PROTOCOL_BYEBYESTANDBY_SWITCH ON CACHE BOOL "support for the ByeByeStandBy switch protocol") +set(PROTOCOL_CLARUS ON CACHE BOOL "support for the Clarus switch protocol") +set(PROTOCOL_CLEVERWATTS ON CACHE BOOL "support for the Cleverwatts switch protocol") +set(PROTOCOL_COCO_SWITCH ON CACHE BOOL "support for the new ClickOnClickOff switch protocol") +set(PROTOCOL_COGEX_SWITCH ON CACHE BOOL "support for the Cogex switch protocol") +set(PROTOCOL_CONRAD_RSL_SWITCH ON CACHE BOOL "support for the Conrad RSL switch protocol") +set(PROTOCOL_CONRAD_RSL_CONTACT ON CACHE BOOL "support for the Conrad RSL contact sensor protocol") +set(PROTOCOL_CONRAD_WEATHER ON CACHE BOOL "support for the Conrad weather stations protocol") +set(PROTOCOL_CPU_TEMP ON CACHE BOOL "support for CPU temperature sensor") +set(PROTOCOL_DATETIME ON CACHE BOOL "support for the (NTP) date and time protocol") +set(PROTOCOL_DAYCOM ON CACHE BOOL "support Daycom switch (Pollin)") +set(PROTOCOL_DS18B20 ON CACHE BOOL "support for the 1-Wire ds18b20 temperature sensor") +set(PROTOCOL_DS18S20 ON CACHE BOOL "support for the 1-Wire ds18s20 temperature sensor") +set(PROTOCOL_DHT11 ON CACHE BOOL "support for the DHT11 temperature-humidity sensor") +set(PROTOCOL_DHT22 ON CACHE BOOL "support for the DHT22/AM2302 temperature-humidity sensor") +set(PROTOCOL_DIO_SWITCH ON CACHE BOOL "support for the D-IO switch protocol") +set(PROTOCOL_DUWI_SWITCH ON CACHE BOOL "support for the Düwi Terminal switch protocol") +set(PROTOCOL_EHOME ON CACHE BOOL "support for the eHome switch protocol") +set(PROTOCOL_ELRO_SWITCH ON CACHE BOOL "support for the Elro switch protocol") +set(PROTOCOL_ELRO_CONTACT ON CACHE BOOL "support for the Elro contact protocol") +set(PROTOCOL_EURODOMEST_SWITCH ON CACHE BOOL "support for the Eurodomest switch protocol") +set(PROTOCOL_EV1527 ON CACHE BOOL "support for the EV1527 contact protocol") +set(PROTOCOL_GENERIC_DIMMER ON CACHE BOOL "support for the generic dimmer protocol") +set(PROTOCOL_GENERIC_SCREEN ON CACHE BOOL "support for the generic screen protocol") +set(PROTOCOL_GENERIC_SWITCH ON CACHE BOOL "support for the generic switch protocol") +set(PROTOCOL_GENERIC_WEATHER ON CACHE BOOL "support for the generic weather protocol") +set(PROTOCOL_GENERIC_WEBCAM ON CACHE BOOL "support for the generic webcam protocol") +set(PROTOCOL_GPIO_SWITCH ON CACHE BOOL "support for the GPIO switch protocol") +set(PROTOCOL_HEITECH ON CACHE BOOL "support for the Heitech switch protocol") +set(PROTOCOL_IMPULS ON CACHE BOOL "support for the Impuls switch protocol") +set(PROTOCOL_INTERTECHNO_SWITCH ON CACHE BOOL "support for the new Intertechno switch protocol") +set(PROTOCOL_INTERTECHNO_OLD ON CACHE BOOL "support for the old Intertecho switch protocol") +set(PROTOCOL_KAKU_CONTACT ON CACHE BOOL "support for the new KlikAanKlikUit contact protocol") +set(PROTOCOL_KAKU_DIMMER ON CACHE BOOL "support for the old KlikAanKlikUit dimmer protocol") +set(PROTOCOL_KAKU_DUSK ON CACHE BOOL "support for the old KlikAanKlikUit dusk/dawn protocol") +set(PROTOCOL_KAKU_MOTION ON CACHE BOOL "support for the old KlikAanKlikUit PIR protocol") +set(PROTOCOL_KAKU_SWITCH_OLD ON CACHE BOOL "support for the old KlikAanKlikUit switch protocol") +set(PROTOCOL_KAKU_SCREEN_OLD ON CACHE BOOL "support for the old KlikAanKlikUit screen protocol") +set(PROTOCOL_KAKU_SWITCH ON CACHE BOOL "support for the new KlikAanKlikUit switch protocol") +set(PROTOCOL_KAKU_SCREEN ON CACHE BOOL "support for the new KlikAanKlikUit screen protocol") +set(PROTOCOL_LM75 ON CACHE BOOL "support for the lm75 i2c temperature sensor") +set(PROTOCOL_LM76 ON CACHE BOOL "support for the lm76 i2c temperature sensor") +set(PROTOCOL_LIRC ON CACHE BOOL "support for the Lirc API") +set(PROTOCOL_LIVOLO_SWITCH ON CACHE BOOL "support for the Livolo switch protocol") +set(PROTOCOL_LOGILINK_SWITCH ON CACHE BOOL "support for the Logilink switch protocol") +set(PROTOCOL_MUMBI_SWITCH ON CACHE BOOL "support for the Mumbi switch protocol") +set(PROTOCOL_NEXA_SWITCH ON CACHE BOOL "support for the Nexa switch protocol") +set(PROTOCOL_NINJABLOCKS_WEATHER ON CACHE BOOL "support for Ninjablocks temperature-humidity sensor protocol") +set(PROTOCOL_OPENWEATHERMAP ON CACHE BOOL "support for the Open Weather Map API") +set(PROTOCOL_PING ON CACHE BOOL "support for the ping protocol") +set(PROTOCOL_POLLIN_SWITCH ON CACHE BOOL "support for the polling switch protocol") +set(PROTOCOL_PROGRAM ON CACHE BOOL "support for the program switching protocol") +set(PROTOCOL_PROMAX_SWITCH ON CACHE BOOL "support for the PRO max switch protocol") +set(PROTOCOL_QUIGG_SCREEN ON CACHE BOOL "support for Quigg switch w screen protocol") +set(PROTOCOL_QUIGG_GT1000 ON CACHE BOOL "support for Quigg GT-1000 protocol") +set(PROTOCOL_QUIGG_GT7000 ON CACHE BOOL "support for Quigg GT-7000 protocol") +set(PROTOCOL_QUIGG_GT9000 ON CACHE BOOL "support for Quigg GT-9000 protocol") +set(PROTOCOL_RAW ON CACHE BOOL "support for the raw / simulator") +set(PROTOCOL_RELAY ON CACHE BOOL "support for GPIO relay devices") +set(PROTOCOL_REV ON CACHE BOOL "support for the Rev protocol") +set(PROTOCOL_RSL366 ON CACHE BOOL "support for RSL366 switch protocol") +set(PROTOCOL_RC101 ON CACHE BOOL "support for RC101 switch protocol") +set(PROTOCOL_RC102 ON CACHE BOOL "support for RC102 switch protocol") +set(PROTOCOL_SC2262 ON CACHE BOOL "support for the SC2262 Contact protocol") +set(PROTOCOL_SECUDO_SMOKE ON CACHE BOOL "support for Secudo/FlammEx smoke sensor protocol") +set(PROTOCOL_SELECTREMOTE ON CACHE BOOL "support for the Selectremote switch protocol") +set(PROTOCOL_SILVERCREST ON CACHE BOOL "support for the Silvercrest switch protocol") +set(PROTOCOL_SUNRISESET ON CACHE BOOL "support for the Sunrise / Sunset calculator") +set(PROTOCOL_TCM ON CACHE BOOL "support for the TCM 218943 weather station protocol") +set(PROTOCOL_TECHLICO ON CACHE BOOL "support for TechLiCo Lamps protocol") +set(PROTOCOL_TEKNIHALL ON CACHE BOOL "support for the Teknihall weather station protocol") +set(PROTOCOL_TFA ON CACHE BOOL "support for the TFA weather station protocol") +set(PROTOCOL_WUNDERGROUND ON CACHE BOOL "support for the Weather Underground API") +set(PROTOCOL_X10 ON CACHE BOOL "support for the X10 protocol") +set(PROTOCOL_XBMC ON CACHE BOOL "support for the XBMC API") +set(HARDWARE_433_GPIO ON CACHE BOOL "support for the direct GPIO communication") +set(HARDWARE_433_LIRC ON CACHE BOOL "support for the lirc_rpi kernel module") diff --git a/lib/ESPiLight/pilight/CMakeLists.txt b/lib/ESPiLight/pilight/CMakeLists.txt new file mode 100644 index 0000000..06ec44d --- /dev/null +++ b/lib/ESPiLight/pilight/CMakeLists.txt @@ -0,0 +1,732 @@ +cmake_minimum_required(VERSION 2.8.8) + +include(CMakeConfig.txt) + +project(pilight) +set(VERSION 7.0) + +set(MODULESPACK OFF) +set(CMAKE_BUILD_TYPE Debug) + +set(CMAKE_SKIP_RULE_DEPENDENCY TRUE) +set(CPACK_DEB_COMPONENT_INSTALL TRUE) + +if(${ZWAVE} MATCHES "ON") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-psabi") +endif() + +if(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)") + # Use the highest warning level for visual studio. + if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") + string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + else(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") + endif(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") + if(CMAKE_C_FLAGS MATCHES "/W[0-4]") + string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") + else(CMAKE_C_FLAGS MATCHES "/W[0-4]") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4") + endif(CMAKE_C_FLAGS MATCHES "/W[0-4]") + # Disable deprecation warnings for standard C functions in VS2005 and later + if(CMAKE_COMPILER_2005) + add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) + endif(CMAKE_COMPILER_2005) +endif(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)") +if(CMAKE_BUILD_TOOL MATCHES "make") + if(NOT CMAKE_CXX_FLAGS MATCHES "-Wall") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") + endif(NOT CMAKE_CXX_FLAGS MATCHES "-Wall") + if(NOT CMAKE_C_FLAGS MATCHES "-Wall") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") + endif(NOT CMAKE_C_FLAGS MATCHES "-Wall") +endif(CMAKE_BUILD_TOOL MATCHES "make") + +if(NOT WIN32) + string(ASCII 27 Esc) + set(ColorReset "${Esc}[m") + set(ColorBold "${Esc}[1m") + set(Red "${Esc}[31m") + set(Green "${Esc}[32m") + set(Yellow "${Esc}[33m") + set(Blue "${Esc}[34m") + set(Magenta "${Esc}[35m") + set(Cyan "${Esc}[36m") + set(White "${Esc}[37m") + set(BoldRed "${Esc}[1;31m") + set(BoldGreen "${Esc}[1;32m") + set(BoldYellow "${Esc}[1;33m") + set(BoldBlue "${Esc}[1;34m") + set(BoldMagenta "${Esc}[1;35m") + set(BoldCyan "${Esc}[1;36m") + set(BoldWhite "${Esc}[1;37m") +endif() + +set(CMAKE_SKIP_RPATH TRUE) +if(NOT WIN32) + set(CMAKE_EXE_LINKER_FLAGS " -Wl,-rpath=.,-rpath=/usr/local/lib/,-rpath=/usr/lib/,-rpath=/lib/") + set(CMAKE_SHARED_LINKER_FLAGS " -Wl,-rpath=.,-rpath=/usr/local/lib/,-rpath=/usr/lib/,-rpath=/lib/") + set(CMAKE_MODULE_LINKER_FLAGS " -Wl,-rpath=.,-rpath=/usr/local/lib/,-rpath=/usr/lib/,-rpath=/lib/") +else() + set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc") +endif() + +if(NOT WIN32) +# Start uninstaller generator +function(WRITE_UNINSTALL_TARGET_SCRIPT) + # Create uninstall target template file, if it doesn't exist... + if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in) + set(__uninstall_filename ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake.in) + # BEGIN actual write to file... + file(WRITE ${__uninstall_filename} "\# - uninstall target template\n\#") + file(APPEND ${__uninstall_filename} " +if (NOT EXISTS \"\@CMAKE_CURRENT_BINARY_DIR\@/install_manifest.txt\") + message(FATAL_ERROR \"Cannot find install manifest: \\\"\@CMAKE_CURRENT_BINARY_DIR\@/install_manifest.txt\\\"\") +endif(NOT EXISTS \"\@CMAKE_CURRENT_BINARY_DIR\@/install_manifest.txt\") + +file(READ \"\@CMAKE_CURRENT_BINARY_DIR\@/install_manifest.txt\" files) +string(REGEX REPLACE \"\\n\" \";\" files \"\${files}\") + +foreach (file \${files}) + message(STATUS \"Uninstalling \\\"\$ENV{DESTDIR}\${file}\\\"\") + if (EXISTS \"\$ENV{DESTDIR}\${file}\") + execute_process( + COMMAND \@CMAKE_COMMAND\@ -E remove \"\$ENV{DESTDIR}\${file}\" + OUTPUT_VARIABLE rm_out + RESULT_VARIABLE rm_retval + ) + if(NOT \${rm_retval} EQUAL 0) + message(FATAL_ERROR \"Problem when removing \\\"\$ENV{DESTDIR}\${file}\\\"\") + endif (NOT \${rm_retval} EQUAL 0) + else (EXISTS \"\$ENV{DESTDIR}\${file}\") + message(STATUS \"File \\\"\$ENV{DESTDIR}\${file}\\\" does not exist.\") + endif (EXISTS \"\$ENV{DESTDIR}\${file}\") +endforeach(file) + +execute_process(COMMAND update-rc.d ${PROJECT_NAME} remove) +execute_process(COMMAND ldconfig) + +") # END of appending to file... + endif() +endfunction() +# End of the uninstaller generator + + if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/cmake_postinstall.cmake) + set(__uninstall_filename ${CMAKE_CURRENT_BINARY_DIR}/cmake_postinstall.cmake) + # BEGIN actual write to file... + file(WRITE ${__uninstall_filename} "execute_process(COMMAND update-rc.d ${PROJECT_NAME} defaults)") + endif() +endif() + +execute_process(COMMAND git log -n 1 --pretty=format:"%h" + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE git_result + OUTPUT_VARIABLE git_hash) + +execute_process(COMMAND git describe --always --abbrev=0 + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE git_result + OUTPUT_VARIABLE git_ver) + +string(REGEX REPLACE "\n" "" git_ver "${git_ver}") +string(REGEX REPLACE "\"" "" git_hash "${git_hash}") +add_definitions(-DHASH="${git_ver}-nightly-${git_hash}") + +file(MD5 ${PROJECT_SOURCE_DIR}/res/pilight.pem md5sum) +add_definitions(-DPILIGHT_PEM_MD5="${md5sum}") + +if(${MODULESPACK} MATCHES "ON" AND NOT WIN32) + add_definitions(-DMODULE="1") +endif() + +if(NOT WIN32) + if(${PROTOCOL_ARPING} MATCHES "ON") + set(CMAKE_PCAP_LIBS_INIT) + + find_library(CMAKE_PCAP_LIBS_INIT + NAME pcap + PATHS + ${CROSS_COMPILE_LIBS} + /usr/lib + /usr/lib32 + /usr/lib64 + /usr/lib/i386-linux-gnu + /usr/lib/x86_64-linux-gnu + /usr/local/lib + /usr/local/lib32 + /usr/local/lib64 + /usr/lib/arm-linux-gnueabi + /usr/lib/arm-linux-gnueabihf + /usr/lib/aarch64-linux-gnu + NO_DEFAULT_PATH) + + if(${CMAKE_PCAP_LIBS_INIT} MATCHES "CMAKE_PCAP_LIBS_INIT-NOTFOUND") + message(FATAL_ERROR "Looking for libpcap - not found") + else() + message(STATUS "Looking for libpcap - found (${CMAKE_PCAP_LIBS_INIT})") + endif() + endif() + + set(CMAKE_UNWIND_LIBS_INIT) + + if(NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "^mips") + find_library(CMAKE_UNWIND_LIBS_INIT + NAME unwind + PATHS + ${CROSS_COMPILE_LIBS} + /usr/lib + /usr/lib32 + /usr/lib64 + /usr/lib/i386-linux-gnu + /usr/lib/x86_64-linux-gnu + /usr/local/lib + /usr/local/lib32 + /usr/local/lib64 + /usr/lib/arm-linux-gnueabi + /usr/lib/arm-linux-gnueabihf + /usr/lib/aarch64-linux-gnu + NO_DEFAULT_PATH) + + if(${CMAKE_UNWIND_LIBS_INIT} MATCHES "CMAKE_UNWIND_LIBS_INIT-NOTFOUND") + message(FATAL_ERROR "Looking for libunwind - not found") + else() + message(STATUS "Looking for libunwind - found (${CMAKE_UNWIND_LIBS_INIT})") + endif() + endif() + + find_library(CMAKE_WIRINGX_LIBS_INIT + NAME wiringx + PATHS + ${CROSS_COMPILE_LIBS} + /usr/lib + /usr/lib32 + /usr/lib64 + /usr/lib/i386-linux-gnu + /usr/lib/x86_64-linux-gnu + /usr/local/lib + /usr/local/lib32 + /usr/local/lib64 + /usr/lib/arm-linux-gnueabi + /usr/lib/arm-linux-gnueabihf + /usr/lib/aarch64-linux-gnu + NO_DEFAULT_PATH) + + if(${CMAKE_WIRINGX_LIBS_INIT} MATCHES "CMAKE_WIRINGX_LIBS_INIT-NOTFOUND") + message(FATAL_ERROR "Looking for libwiringx - not found") + else() + message(STATUS "Looking for libwiringx - found (${CMAKE_WIRINGX_LIBS_INIT})") + endif() +endif() + +find_library(CMAKE_MBEDTLS_LIBS_INIT + NAME mbedtls + PATHS + ${CROSS_COMPILE_LIBS} + /usr/lib + /usr/lib32 + /usr/lib64 + /usr/lib/i386-linux-gnu + /usr/lib/x86_64-linux-gnu + /usr/local/lib + /usr/local/lib32 + /usr/local/lib64 + /usr/lib/arm-linux-gnueabi + /usr/lib/arm-linux-gnueabihf + /usr/lib/aarch64-linux-gnu + NO_DEFAULT_PATH) + +if(${CMAKE_MBEDTLS_LIBS_INIT} MATCHES "CMAKE_MBEDTLS_LIBS_INIT-NOTFOUND") + message(FATAL_ERROR "Looking for libmbedtls - not found") +else() + message(STATUS "Looking for libmbedtls - found (${CMAKE_MBEDTLS_LIBS_INIT})") +endif() + +find_library(CMAKE_MBEDCRYPTO_LIBS_INIT + NAME mbedcrypto + PATHS + ${CROSS_COMPILE_LIBS} + /usr/lib + /usr/lib32 + /usr/lib64 + /usr/lib/i386-linux-gnu + /usr/lib/x86_64-linux-gnu + /usr/local/lib + /usr/local/lib32 + /usr/local/lib64 + /usr/lib/arm-linux-gnueabi + /usr/lib/arm-linux-gnueabihf + /usr/lib/aarch64-linux-gnu + NO_DEFAULT_PATH) + +if(${CMAKE_MBEDCRYPTO_LIBS_INIT} MATCHES "CMAKE_MBEDCRYPTO_LIBS_INIT-NOTFOUND") + message(FATAL_ERROR "Looking for libmbedcrypto - not found") +else() + message(STATUS "Looking for libmbedcrypto - found (${CMAKE_MBEDCRYPTO_LIBS_INIT})") +endif() + +find_library(CMAKE_MBEDX509_LIBS_INIT + NAME mbedx509 + PATHS + ${CROSS_COMPILE_LIBS} + /usr/lib + /usr/lib32 + /usr/lib64 + /usr/lib/i386-linux-gnu + /usr/lib/x86_64-linux-gnu + /usr/local/lib + /usr/local/lib32 + /usr/local/lib64 + /usr/lib/arm-linux-gnueabi + /usr/lib/arm-linux-gnueabihf + /usr/lib/aarch64-linux-gnu + NO_DEFAULT_PATH) + +if(${CMAKE_MBEDX509_LIBS_INIT} MATCHES "CMAKE_MBEDX509_LIBS_INIT-NOTFOUND") + message(FATAL_ERROR "Looking for libmbedx509 - not found") +else() + message(STATUS "Looking for libmbedx509 - found (${CMAKE_MBEDX509_LIBS_INIT})") +endif() + +find_library(CMAKE_LUA_LIBS_INIT + NAME luajit-5.1 + PATHS + ${CROSS_COMPILE_LIBS} + /usr/lib + /usr/lib32 + /usr/lib64 + /usr/lib/i386-linux-gnu + /usr/lib/x86_64-linux-gnu + /usr/local/lib + /usr/local/lib32 + /usr/local/lib64 + /usr/lib/arm-linux-gnueabi + /usr/lib/arm-linux-gnueabihf + /usr/lib/aarch64-linux-gnu +NO_DEFAULT_PATH) + +if(${CMAKE_LUA_LIBS_INIT} MATCHES "CMAKE_LUA_LIBS_INIT-NOTFOUND") + message(FATAL_ERROR "Looking for libluajit - not found") +else() + message(STATUS "Looking for libluajit - found (${CMAKE_LUA_LIBS_INIT})") +endif() + +include_directories(${PROJECT_SOURCE_DIR}/inc) +include_directories(${PROJECT_SOURCE_DIR}/libs/libuv) +include_directories(/usr/local/include/) + +add_subdirectory(inc) +add_subdirectory(libs) + +if(WIN32) + set(THREADS_USE_PTHREADS_WIN32 true) +endif() +find_package(Threads REQUIRED) +if(NOT WIN32) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + find_package(Backtrace REQUIRED) + endif() +endif() + +if(${MODULESPACK} MATCHES "OFF" OR WIN32) + if(WIN32) + add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/res/win32/admin.obj COMMAND ${CMAKE_RC_COMPILER} -o ${PROJECT_SOURCE_DIR}/res/win32/admin.obj ${PROJECT_SOURCE_DIR}/res/win32/admin.rc) + add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/res/win32/icon.obj COMMAND ${CMAKE_RC_COMPILER} -o ${PROJECT_SOURCE_DIR}/res/win32/icon.obj ${PROJECT_SOURCE_DIR}/res/win32/icon.rc) + add_library(admin STATIC ${PROJECT_SOURCE_DIR}/res/win32/admin.obj) + add_library(icon STATIC ${PROJECT_SOURCE_DIR}/res/win32/icon.obj) + set_source_files_properties(${PROJECT_SOURCE_DIR}/res/win32/admin.obj PROPERTIES EXTERNAL_OBJECT true GENERATED true) + set_source_files_properties(${PROJECT_SOURCE_DIR}/res/win32/icon.obj PROPERTIES EXTERNAL_OBJECT true GENERATED true) + set_target_properties(admin PROPERTIES LINKER_LANGUAGE C) + set_target_properties(icon PROPERTIES LINKER_LANGUAGE C) + endif() + + add_library(${PROJECT_NAME} OBJECT ${libs_files}) + set_property(TARGET ${PROJECT_NAME} PROPERTY POSITION_INDEPENDENT_CODE TRUE) + + if(WIN32) + add_library(${PROJECT_NAME}_shared STATIC $) + else() + add_library(${PROJECT_NAME}_shared SHARED $) + endif() + add_library(${PROJECT_NAME}_static STATIC $) + + target_link_libraries(${PROJECT_NAME}_shared ${CMAKE_THREAD_LIBS_INIT}) + if(WIN32) + target_link_libraries(${PROJECT_NAME}_shared ws2_32) + target_link_libraries(${PROJECT_NAME}_shared user32) + target_link_libraries(${PROJECT_NAME}_shared userenv) + target_link_libraries(${PROJECT_NAME}_shared wsock32) + target_link_libraries(${PROJECT_NAME}_shared iphlpapi) + target_link_libraries(${PROJECT_NAME}_shared psapi) + target_link_libraries(${PROJECT_NAME}_static ws2_32) + target_link_libraries(${PROJECT_NAME}_static user32) + target_link_libraries(${PROJECT_NAME}_static userenv) + target_link_libraries(${PROJECT_NAME}_static wsock32) + target_link_libraries(${PROJECT_NAME}_static iphlpapi) + target_link_libraries(${PROJECT_NAME}_static psapi) + if(${PROTOCOL_ARPING} MATCHES "ON") + target_link_libraries(${PROJECT_NAME}_shared ${PROJECT_SOURCE_DIR}/res/win32/libwpcap.dll.a) + target_link_libraries(${PROJECT_NAME}_static ${PROJECT_SOURCE_DIR}/res/win32/libwpcap.dll.a) + endif() + endif() + + target_link_libraries(${PROJECT_NAME}_shared m) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_link_libraries(${PROJECT_NAME}_shared ${Backtrace_LIBRARIES}) + endif() + if(NOT WIN32) + target_link_libraries(${PROJECT_NAME}_shared rt) + endif() + target_link_libraries(${PROJECT_NAME}_shared ${CMAKE_DL_LIBS}) + target_link_libraries(${PROJECT_NAME}_shared ${CMAKE_WIRINGX_LIBS_INIT}) + target_link_libraries(${PROJECT_NAME}_shared ${CMAKE_MBEDTLS_LIBS_INIT}) + target_link_libraries(${PROJECT_NAME}_shared ${CMAKE_MBEDCRYPTO_LIBS_INIT}) + target_link_libraries(${PROJECT_NAME}_shared ${CMAKE_MBEDX509_LIBS_INIT}) + target_link_libraries(${PROJECT_NAME}_shared ${CMAKE_LUA_LIBS_INIT}) + + target_link_libraries(${PROJECT_NAME}_static ${CMAKE_THREAD_LIBS_INIT}) + target_link_libraries(${PROJECT_NAME}_static m) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_link_libraries(${PROJECT_NAME}_static ${Backtrace_LIBRARIES}) + endif() + if(NOT WIN32) + target_link_libraries(${PROJECT_NAME}_static rt) + endif() + target_link_libraries(${PROJECT_NAME}_static ${CMAKE_DL_LIBS}) + target_link_libraries(${PROJECT_NAME}_static ${CMAKE_WIRINGX_LIBS_INIT}) + target_link_libraries(${PROJECT_NAME}_static ${CMAKE_MBEDTLS_LIBS_INIT}) + target_link_libraries(${PROJECT_NAME}_static ${CMAKE_MBEDCRYPTO_LIBS_INIT}) + target_link_libraries(${PROJECT_NAME}_static ${CMAKE_MBEDX509_LIBS_INIT}) + target_link_libraries(${PROJECT_NAME}_static ${CMAKE_LUA_LIBS_INIT}) + + if(${PROTOCOL_ARPING} MATCHES "ON") + target_link_libraries(${PROJECT_NAME}_shared ${CMAKE_PCAP_LIBS_INIT}) + target_link_libraries(${PROJECT_NAME}_static ${CMAKE_PCAP_LIBS_INIT}) + endif() + + if(NOT WIN32) + target_link_libraries(${PROJECT_NAME}_shared ${CMAKE_UNWIND_LIBS_INIT}) + target_link_libraries(${PROJECT_NAME}_static ${CMAKE_UNWIND_LIBS_INIT}) + endif() + + set_target_properties(${PROJECT_NAME}_shared ${PROJECT_NAME}_static PROPERTIES OUTPUT_NAME ${PROJECT_NAME}) + + if(NOT WIN32) + install(CODE "execute_process(COMMAND rm /usr/local/lib/lib${PROJECT_NAME}.so)") + install(FILES ${CMAKE_BINARY_DIR}/lib${PROJECT_NAME}.so DESTINATION lib RENAME lib${PROJECT_NAME}.so.${VERSION} COMPONENT ${PROJECT_NAME}) + install(FILES ${CMAKE_BINARY_DIR}/lib${PROJECT_NAME}.a DESTINATION lib RENAME lib${PROJECT_NAME}.a COMPONENT ${PROJECT_NAME}) + install(CODE "execute_process(COMMAND ln -s \"/usr/local/lib/lib${PROJECT_NAME}.so.${VERSION}\" \"/usr/local/lib/lib${PROJECT_NAME}.so\")") + + if(EXISTS "/usr/local/lib/${PROJECT_NAME}/protocols") + install(CODE "execute_process(COMMAND find /usr/local/lib/${PROJECT_NAME}/protocols/ -type f -exec rm {} \\;)") + endif() + if(EXISTS "/usr/local/lib/${PROJECT_NAME}/hardware") + install(CODE "execute_process(COMMAND find /usr/local/lib/${PROJECT_NAME}/hardware/ -type f -exec rm {} \\;)") + endif() + if(EXISTS "/usr/local/lib/${PROJECT_NAME}/actions") + install(CODE "execute_process(COMMAND find /usr/local/lib/${PROJECT_NAME}/actions/ -type f -exec rm {} \\;)") + endif() + if(EXISTS "/usr/local/lib/${PROJECT_NAME}/operators") + install(CODE "execute_process(COMMAND find /usr/local/lib/${PROJECT_NAME}/operators/ -type f -exec rm {} \\;)") + endif() + if(EXISTS "/usr/local/${PROJECT_NAME}/operators") + install(CODE "execute_process(COMMAND find /usr/local/${PROJECT_NAME}/operators/ -type f -exec rm {} \\;)") + endif() + + if(EXISTS "/etc/${PROJECT_NAME}/config.json") + install(CODE "execute_process(COMMAND mv /etc/${PROJECT_NAME}/config.json /etc/${PROJECT_NAME}/config.json.bak)") + endif() + + if(EXISTS "/etc/${PROJECT_NAME}/pilight.pem") + install(CODE "execute_process(COMMAND mv /etc/${PROJECT_NAME}/pilight.pem /etc/${PROJECT_NAME}/pilight.pem.bak)") + endif() + + install(PROGRAMS ${PROJECT_SOURCE_DIR}/res/init/${PROJECT_NAME}.initd DESTINATION /etc/init.d/ RENAME ${PROJECT_NAME}) + install(FILES ${PROJECT_SOURCE_DIR}/res/config/config.json-default DESTINATION /etc/${PROJECT_NAME}/ RENAME config.json COMPONENT ${PROJECT_NAME}) + install(FILES ${PROJECT_SOURCE_DIR}/res/pilight.pem DESTINATION /etc/${PROJECT_NAME}/ COMPONENT ${PROJECT_NAME}) + else() + # install(FILES ${CMAKE_BINARY_DIR}/lib${PROJECT_NAME}.dll DESTINATION . RENAME lib${PROJECT_NAME}.dll COMPONENT ${PROJECT_NAME}) + install(FILES ${PROJECT_SOURCE_DIR}/res/config/config.json-default-w32 DESTINATION . RENAME config.json-default COMPONENT ${PROJECT_NAME}) + endif() + + if(${WEBSERVER} MATCHES "ON") + if(WIN32) + install(DIRECTORY ${PROJECT_SOURCE_DIR}/libs/webgui/ DESTINATION web/ COMPONENT webgui) + else() + install(DIRECTORY ${PROJECT_SOURCE_DIR}/libs/webgui/ DESTINATION /usr/local/lib/${PROJECT_NAME}/webgui COMPONENT webgui) + endif() + endif() + + if(WIN32) + add_executable(${PROJECT_NAME}-daemon daemon.c ${PROJECT_SOURCE_DIR}/res/win32/icon.obj) + target_link_libraries(${PROJECT_NAME}-daemon "-Wl,--subsystem,windows") + else() + add_executable(${PROJECT_NAME}-daemon daemon.c) + endif() + target_link_libraries(${PROJECT_NAME}-daemon ${PROJECT_NAME}_shared) + if(${ZWAVE} MATCHES "ON") + target_link_libraries(${PROJECT_NAME}-daemon stdc++) + endif() + target_link_libraries(${PROJECT_NAME}-daemon ${CMAKE_DL_LIBS}) + target_link_libraries(${PROJECT_NAME}-daemon m) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_link_libraries(${PROJECT_NAME}-daemon ${Backtrace_LIBRARIES}) + endif() + target_link_libraries(${PROJECT_NAME}-daemon ${CMAKE_THREAD_LIBS_INIT}) + + # if(WIN32) + # add_executable(${PROJECT_NAME}-unittest unittest.c ${PROJECT_SOURCE_DIR}/res/win32/icon.obj) + # target_link_libraries(${PROJECT_NAME}-unittest "-Wl,--subsystem,windows") + # else() + # add_executable(${PROJECT_NAME}-unittest unittest.c) + # endif() + # target_link_libraries(${PROJECT_NAME}-unittest ${PROJECT_NAME}_shared) + # if(${ZWAVE} MATCHES "ON") + # target_link_libraries(${PROJECT_NAME}-unittest stdc++) + # endif() + # target_link_libraries(${PROJECT_NAME}-unittest ${CMAKE_DL_LIBS}) + # target_link_libraries(${PROJECT_NAME}-unittest m) + # if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + # target_link_libraries(${PROJECT_NAME}-unittest ${Backtrace_LIBRARIES}) + # endif() + # target_link_libraries(${PROJECT_NAME}-unittest ${CMAKE_THREAD_LIBS_INIT}) + + if(WIN32) + add_executable(${PROJECT_NAME}-raw raw.c ${PROJECT_SOURCE_DIR}/res/win32/icon.obj) + else() + add_executable(${PROJECT_NAME}-raw raw.c) + endif() + target_link_libraries(${PROJECT_NAME}-raw ${PROJECT_NAME}_shared) + if(${ZWAVE} MATCHES "ON") + target_link_libraries(${PROJECT_NAME}-raw stdc++) + endif() + target_link_libraries(${PROJECT_NAME}-raw ${CMAKE_DL_LIBS}) + target_link_libraries(${PROJECT_NAME}-raw m) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_link_libraries(${PROJECT_NAME}-raw ${Backtrace_LIBRARIES}) + endif() + target_link_libraries(${PROJECT_NAME}-raw ${CMAKE_THREAD_LIBS_INIT}) + + if(WIN32) + add_executable(${PROJECT_NAME}-send send.c ${PROJECT_SOURCE_DIR}/res/win32/icon.obj) + else() + add_executable(${PROJECT_NAME}-send send.c) + endif() + target_link_libraries(${PROJECT_NAME}-send ${PROJECT_NAME}_shared) + target_link_libraries(${PROJECT_NAME}-send ${CMAKE_DL_LIBS}) + if(${ZWAVE} MATCHES "ON") + target_link_libraries(${PROJECT_NAME}-send stdc++) + endif() + target_link_libraries(${PROJECT_NAME}-send m) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_link_libraries(${PROJECT_NAME}-send ${Backtrace_LIBRARIES}) + endif() + target_link_libraries(${PROJECT_NAME}-send ${CMAKE_THREAD_LIBS_INIT}) + + if(WIN32) + add_executable(${PROJECT_NAME}-control control.c ${PROJECT_SOURCE_DIR}/res/win32/icon.obj) + else() + add_executable(${PROJECT_NAME}-control control.c) + endif() + target_link_libraries(${PROJECT_NAME}-control ${PROJECT_NAME}_shared) + target_link_libraries(${PROJECT_NAME}-control ${CMAKE_DL_LIBS}) + if(${ZWAVE} MATCHES "ON") + target_link_libraries(${PROJECT_NAME}-control stdc++) + endif() + target_link_libraries(${PROJECT_NAME}-control m) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_link_libraries(${PROJECT_NAME}-control ${Backtrace_LIBRARIES}) + endif() + target_link_libraries(${PROJECT_NAME}-control ${CMAKE_THREAD_LIBS_INIT}) + + if(WIN32) + add_executable(${PROJECT_NAME}-receive receive.c ${PROJECT_SOURCE_DIR}/res/win32/icon.obj) + else() + add_executable(${PROJECT_NAME}-receive receive.c) + endif() + target_link_libraries(${PROJECT_NAME}-receive ${PROJECT_NAME}_shared) + if(${ZWAVE} MATCHES "ON") + target_link_libraries(${PROJECT_NAME}-receive stdc++) + endif() + target_link_libraries(${PROJECT_NAME}-receive ${CMAKE_DL_LIBS}) + target_link_libraries(${PROJECT_NAME}-receive m) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_link_libraries(${PROJECT_NAME}-receive ${Backtrace_LIBRARIES}) + endif() + target_link_libraries(${PROJECT_NAME}-receive ${CMAKE_THREAD_LIBS_INIT}) + + if(WIN32) + add_executable(${PROJECT_NAME}-debug debug.c ${PROJECT_SOURCE_DIR}/res/win32/icon.obj) + else() + add_executable(${PROJECT_NAME}-debug debug.c) + endif() + target_link_libraries(${PROJECT_NAME}-debug ${PROJECT_NAME}_shared) + if(${ZWAVE} MATCHES "ON") + target_link_libraries(${PROJECT_NAME}-debug stdc++) + endif() + target_link_libraries(${PROJECT_NAME}-debug ${CMAKE_DL_LIBS}) + target_link_libraries(${PROJECT_NAME}-debug m) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_link_libraries(${PROJECT_NAME}-debug ${Backtrace_LIBRARIES}) + endif() + target_link_libraries(${PROJECT_NAME}-debug ${CMAKE_THREAD_LIBS_INIT}) + + if(WIN32) + add_executable(${PROJECT_NAME}-uuid uuid.c ${PROJECT_SOURCE_DIR}/res/win32/icon.obj) + else() + add_executable(${PROJECT_NAME}-uuid uuid.c) + endif() + target_link_libraries(${PROJECT_NAME}-uuid ${PROJECT_NAME}_shared) + if(${ZWAVE} MATCHES "ON") + target_link_libraries(${PROJECT_NAME}-uuid stdc++) + endif() + target_link_libraries(${PROJECT_NAME}-uuid ${CMAKE_DL_LIBS}) + target_link_libraries(${PROJECT_NAME}-uuid m) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_link_libraries(${PROJECT_NAME}-uuid ${Backtrace_LIBRARIES}) + endif() + target_link_libraries(${PROJECT_NAME}-uuid ${CMAKE_THREAD_LIBS_INIT}) + + if(WIN32) + add_executable(${PROJECT_NAME}-sha256 sha256.c ${PROJECT_SOURCE_DIR}/res/win32/icon.obj) + else() + add_executable(${PROJECT_NAME}-sha256 sha256.c) + endif() + target_link_libraries(${PROJECT_NAME}-sha256 ${PROJECT_NAME}_shared) + if(${ZWAVE} MATCHES "ON") + target_link_libraries(${PROJECT_NAME}-sha256 stdc++) + endif() + target_link_libraries(${PROJECT_NAME}-sha256 ${CMAKE_DL_LIBS}) + target_link_libraries(${PROJECT_NAME}-sha256 m) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_link_libraries(${PROJECT_NAME}-sha256 ${Backtrace_LIBRARIES}) + endif() + target_link_libraries(${PROJECT_NAME}-sha256 ${CMAKE_THREAD_LIBS_INIT}) + + if(WIN32) + add_executable(${PROJECT_NAME}-flash flash.c ${PROJECT_SOURCE_DIR}/res/win32/icon.obj) + else() + add_executable(${PROJECT_NAME}-flash flash.c) + endif() + target_link_libraries(${PROJECT_NAME}-flash ${PROJECT_NAME}_shared) + if(${ZWAVE} MATCHES "ON") + target_link_libraries(${PROJECT_NAME}-flash stdc++) + endif() + target_link_libraries(${PROJECT_NAME}-flash ${CMAKE_DL_LIBS}) + target_link_libraries(${PROJECT_NAME}-flash m) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_link_libraries(${PROJECT_NAME}-flash ${Backtrace_LIBRARIES}) + endif() + target_link_libraries(${PROJECT_NAME}-flash ${CMAKE_THREAD_LIBS_INIT}) + + if(WIN32) + install(FILES "${PROJECT_SOURCE_DIR}/res/firmware/${PROJECT_NAME}_usb_nano.hex" DESTINATION . COMPONENT ${PROJECT_NAME}) + endif() + + if(NOT WIN32) + if(EXISTS "/usr/local/sbin/${PROJECT_NAME}-send") + install(CODE "execute_process(COMMAND rm /usr/local/sbin/${PROJECT_NAME}-send)") + endif() + + if(EXISTS "/usr/local/sbin/${PROJECT_NAME}-receive") + install(CODE "execute_process(COMMAND rm /usr/local/sbin/${PROJECT_NAME}-receive)") + endif() + + if(EXISTS "/usr/local/sbin/${PROJECT_NAME}-control") + install(CODE "execute_process(COMMAND rm /usr/local/sbin/${PROJECT_NAME}-control)") + endif() + + if(EXISTS "/usr/local/sbin/${PROJECT_NAME}-uuid") + install(CODE "execute_process(COMMAND rm /usr/local/sbin/${PROJECT_NAME}-uuid)") + endif() + endif() + + if(WIN32) + install(FILES "${PROJECT_SOURCE_DIR}/LICENSE.txt" DESTINATION . COMPONENT ${PROJECT_NAME}) + install(FILES "${PROJECT_SOURCE_DIR}/res/win32/libmbedx509.dll" DESTINATION . COMPONENT ${PROJECT_NAME}) + install(FILES "${PROJECT_SOURCE_DIR}/res/win32/libmbedcrypto.dll" DESTINATION . COMPONENT ${PROJECT_NAME}) + install(FILES "${PROJECT_SOURCE_DIR}/res/win32/libmbedtls.dll" DESTINATION . COMPONENT ${PROJECT_NAME}) + install(FILES "${PROJECT_SOURCE_DIR}/res/win32/libwinpthread-1.dll" DESTINATION . COMPONENT ${PROJECT_NAME}) + install(FILES "${PROJECT_SOURCE_DIR}/res/win32/Packet.dll" DESTINATION . COMPONENT ${PROJECT_NAME}) + install(FILES "${PROJECT_SOURCE_DIR}/res/win32/wpcap.dll" DESTINATION . COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-daemon.exe DESTINATION . COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-raw.exe DESTINATION . COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-send.exe DESTINATION . COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-control.exe DESTINATION . COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-receive.exe DESTINATION . COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-debug.exe DESTINATION . COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-flash.exe DESTINATION . COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-uuid.exe DESTINATION . COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-sha256.exe DESTINATION . COMPONENT ${PROJECT_NAME}) + else() + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-daemon DESTINATION sbin COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-raw DESTINATION sbin COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-send DESTINATION bin COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-control DESTINATION bin COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-receive DESTINATION bin COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-debug DESTINATION sbin COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-flash DESTINATION sbin COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-uuid DESTINATION bin COMPONENT ${PROJECT_NAME}) + install(PROGRAMS ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-sha256 DESTINATION bin COMPONENT ${PROJECT_NAME}) + install(CODE "execute_process(COMMAND update-rc.d ${PROJECT_NAME} defaults)") + install(CODE "execute_process(COMMAND ldconfig)") + endif() +endif() + +if(WIN32) + set(CPACK_MONOLITHIC_INSTALL True) + set(CPACK_NSIS_INSTALL_ROOT "c:") + set(CPACK_PACKAGE_INSTALL_DIRECTORY "${PROJECT_NAME}") + set(CPACK_NSIS_DISPLAY_NAME "${PROJECT_NAME}") + set(CPACK_NSIS_PACKAGE_NAME "${PROJECT_NAME} ${git_ver}") + set(CPACK_NSIS_URL_INFO_ABOUT "http://www.${PROJECT_NAME}.org") + set(CPACK_NSIS_CONTACT "info@${PROJECT_NAME}.org") + set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".") + set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL True) + set(CPACK_NSIS_MENU_LINKS + "${PROJECT_NAME}-daemon" "${PROJECT_NAME}-daemon" + ) + + set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.txt") + # set(CPACK_COMPONENTS_ALL ${PROJECT_NAME} webgui) + set(CPACK_GENERATOR "NSIS") + set(CPACK_PACKAGING_INSTALL_DIRECTORY "${PROJECT_NAME}") + set(CPACK_SOURCE_STRIP_FILES TRUE) + set(CPACK_STRIP_FILES TRUE) + set(CPACK_PACKAGE_CONTACT "CurlyMo ") + set(CPACK_PACKAGE_VERSION ${git_ver}) + set(CPACK_PACKAGE_NAME "${PROJECT_NAME}") + set(CPACK_PACKAGE_VENDOR "${PROJECT_NAME}") + set(CPACK_PACKAGE_DESCRIPTION "Control RF devices with the Raspberry Pi") + set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Control RF devices with the Raspberry Pi") + + include(CPack) +else() + WRITE_UNINSTALL_TARGET_SCRIPT() + configure_file("${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" + IMMEDIATE @ONLY) + add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) + + set(CPACK_GENERATOR "DEB") + set(CPACK_PACKAGING_INSTALL_PREFIX "/usr/local/") + set(CPACK_SOURCE_STRIP_FILES TRUE) + set(CPACK_STRIP_FILES TRUE) + set(CPACK_PACKAGE_CONTACT "CurlyMo ") + set(CPACK_PACKAGE_VERSION ${VERSION}) + set(CPACK_PACKAGE_NAME "${PROJECT_NAME}") + set(CPACK_DEBIAN_PACKAGE_DEPENDS "zlib1g-dev") + set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") + set(CPACK_PACKAGE_DESCRIPTION "Control RF devices with the Raspberry Pi") + set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Control RF devices with the Raspberry Pi") + + include(CPack) + + message("") + message("${Red}-- WARNING --${ColorReset}") + message("${Yellow}Manually compiling and installing ${PROJECT_NAME} will also clear all module folders: +/usr/local/lib/${PROJECT_NAME}/protocols/ +/usr/local/lib/${PROJECT_NAME}/hardware/ +/usr/local/lib/${PROJECT_NAME}/actions/ +/usr/local/lib/${PROJECT_NAME}/operators/${ColorReset}") + message("${Red}-- WARNING --${ColorReset}") + message("") +endif() diff --git a/lib/ESPiLight/pilight/CONTRIBUTING.md b/lib/ESPiLight/pilight/CONTRIBUTING.md new file mode 100644 index 0000000..213bce4 --- /dev/null +++ b/lib/ESPiLight/pilight/CONTRIBUTING.md @@ -0,0 +1,77 @@ +Rules for contributing to pilight +================================= +First of all, thanks for making this project better. Without your help, pilight wouldn't have come to what it is now! + +**BUT**, be aware that contributing to a big project shouldn't be considered a playground. It also isn't meant for you to learn `git`. +So if you don't know what you are doing then don't do it. Instead open a [forum topic](http://forum.pilight.org), point to your code and ask for help. + +Checklist +--------- +When you contribute to pilight make sure to follow this checklist: + +1. Is your pull request directed at the development branch? +*pilight doesn't accept contributions to the master branch because this branch reflects the latest stable code.* +2. Did you read the [development](http://manual.pilight.org/development/) pages of pilight? +*Even if you think you know all, please check and double check. There are always small syntax changes. Also check similar already existing modules for syntax.* +3. Keep the coding style in sync with that of pilight (see below). +4. First merge with the latest development code. +5. Make a different branch for each new feature you want to commit. +6. Test how pull-requests work on your own test repositories. +7. Make sure your pull-request contains [one single commit](http://eli.thegreenplace.net/2014/02/19/squashing-github-pull-requests-into-a-single-commit). +8. Open a pull-request when you indeed want to contribute and follow-up on our comments. If you don't want to implement our requested changes after reviewing your pull-request, don't bother opening one. +9. Re-read this file before every pull-request, because it will be updated regularly. +10. Don't forget to enjoy the appreciation of the end user! + +Coding style +----- +- No unnecessary spaces +``` +if ( 1 == 1 ) +{ +... +} +``` +should become: +``` +if(1 == 1) { +... +} +``` +- Don't inline variables: +``` +int x = 0; +int long_variable_name = 0; +int a = 0; +``` +but use +``` +int x = 0; +int long_variable_name = 0; +int a = 0; +``` +but preferable use for around max 50 characters: +``` +int x = 0, long_variable_name = 0, a = 0; +``` +- Variable defining order. +First start with `struct`, then specials types (`*_t`), then `char`, then `double` / `float` and end with `int`. +``` + struct protocol_threads_t *node = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)node->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + time_t time; + char *tmp = NULL; + double itmp = 0.0; + int id = 0, state = 0, nstate = 0; +``` +- Initialize your variables. +``` +char *a = NULL; +char a[10]; +memset(&a, 0, 10); +double a = 0.0; +int a = 0; +``` +- User the `static` keyword for all variables and function only use in the single C file your module consists of. +- Always use tabs instead of spaces for inline markup. diff --git a/lib/ESPiLight/pilight/COPYING b/lib/ESPiLight/pilight/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/lib/ESPiLight/pilight/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/lib/ESPiLight/pilight/LICENSE.txt b/lib/ESPiLight/pilight/LICENSE.txt new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/lib/ESPiLight/pilight/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/lib/ESPiLight/pilight/README.md b/lib/ESPiLight/pilight/README.md new file mode 100644 index 0000000..4287cbb --- /dev/null +++ b/lib/ESPiLight/pilight/README.md @@ -0,0 +1,20 @@ +pilight version 7.0 +======= + +Flattr this + +Visit http://www.pilight.org or http://wiki.pilight.org for more information. + +# Dependencies +The pilight development code depends on the following packages: + +1. [libmbedtls](https://github.com/ARMmbed/mbedtls) +2. [libmbedx509](https://github.com/ARMmbed/mbedtls) +3. [libmbedcrypto](https://github.com/ARMmbed/mbedtls) +4. [liblua5.2](https://github.com/lua/lua) +5. [libwiringx](https://github.com/wiringx/wiringx) (rewrite branch) +6. [libpcap](http://www.tcpdump.org/release/) +7. [libunwind](http://download.savannah.nongnu.org/releases/libunwind/) + +Either manually compile each of these packages or install them by using the package repository of your distribution of choice diff --git a/lib/ESPiLight/pilight/clients/process.java b/lib/ESPiLight/pilight/clients/process.java new file mode 100644 index 0000000..9d9cd2f --- /dev/null +++ b/lib/ESPiLight/pilight/clients/process.java @@ -0,0 +1,147 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.ByteArrayInputStream; +import java.io.StringReader; +import java.nio.charset.Charset; +import java.io.PrintStream; +import java.util.regex.Pattern; +import java.util.regex.Matcher; +import java.util.Collections; +import java.util.Enumeration; +import sun.net.*; +import java.net.*; +import java.util.Date; + +public class process { + public static void main(String[] args) { + String line = null; + DatagramSocket ssdp = null; + PrintStream printStream = null; + BufferedReader bufferedReader = null; + int port = 0; + String server = null; + Socket socket = null; + + String msg = "M-SEARCH * HTTP/1.1\r\n" + + "Host:239.255.255.250:1900\r\n" + + "ST:urn:schemas-upnp-org:service:pilight:1\r\n" + + "Man:\"ssdp:discover\"\r\n" + + "MX:3\r\n\r\n"; + + try { + Enumeration nets = NetworkInterface.getNetworkInterfaces(); + for(NetworkInterface netint : Collections.list(nets)) { + Enumeration inetAddresses = netint.getInetAddresses(); + for(InetAddress inetAddress : Collections.list(inetAddresses)) { + if(!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) { + try { + ssdp = new DatagramSocket(new InetSocketAddress(inetAddress.getHostAddress().toString(), 0)); + byte[] buff = msg.getBytes(); + DatagramPacket sendPack = new DatagramPacket(buff, buff.length); + sendPack.setAddress(InetAddress.getByName("239.255.255.250")); + sendPack.setPort(1900); + + try { + ssdp.send(sendPack); + ssdp.setSoTimeout(10); + boolean loop = true; + while(loop) { + DatagramPacket recvPack = new DatagramPacket(new byte[1024], 1024); + ssdp.receive(recvPack); + byte[] recvData = recvPack.getData(); + InputStreamReader recvInput = new InputStreamReader(new ByteArrayInputStream(recvData), Charset.forName("UTF-8")); + StringBuilder recvOutput = new StringBuilder(); + for(int value; (value = recvInput.read()) != -1;) { + recvOutput.append((char)value); + } + BufferedReader bufReader = new BufferedReader(new StringReader(recvOutput.toString())); + Pattern pattern = Pattern.compile("Location:([0-9.]+):(.*)"); + while((line=bufReader.readLine()) != null) { + Matcher matcher = pattern.matcher(line); + if(matcher.matches()) { + server = matcher.group(1); + port = Integer.parseInt(matcher.group(2)); + loop = false; + break; + } + } + } + } catch(SocketTimeoutException e) { + } catch(IOException e) { + System.out.println("no pilight ssdp connections found"); + ssdp.close(); + System.exit(0); + } + } catch(UnknownHostException e) { + } + } + } + } + } catch(SocketException e) { + } + + if(server == null || port == 0) { + System.out.println("no pilight ssdp connections found"); + System.exit(0); + } + + try { + socket = new Socket(); + socket.connect(new InetSocketAddress(server, port), 1000); + + try { + if(printStream == null) { + printStream = new PrintStream(socket.getOutputStream(), false); + } + printStream.print("{\"action\":\"identify\",\"options\":{\"receiver\":1}}\n"); + printStream.flush(); + } catch(IOException e) { + System.out.println("failed to write messages to server"); + } + + int size = 0; + if(size == 0) { + size = 1025; + } + try { + if(bufferedReader == null) { + bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"), size); + } + int c = 0; + StringBuilder response = new StringBuilder(); + if(bufferedReader.ready()) { + while((c = bufferedReader.read()) > 0) { + response.append((char)c); + } + System.out.println(response.toString()); + } + } catch(IOException e) { + System.out.println("failed to receive messages from server"); + } + + } catch (UnknownHostException e) { + System.out.println("don't know about host"); + } catch(IOException e) { + System.out.println("could not get I/O for connection"); + } + } +} diff --git a/lib/ESPiLight/pilight/clients/process.php b/lib/ESPiLight/pilight/clients/process.php new file mode 100644 index 0000000..be8b937 --- /dev/null +++ b/lib/ESPiLight/pilight/clients/process.php @@ -0,0 +1,69 @@ +#!/usr/bin/env php + +*/ + +$sMsg = "M-SEARCH * HTTP/1.1\r\n"; +$sMsg .= "Host:239.255.255.250:1900\r\n"; +$sMsg .= "ST:urn:schemas-upnp-org:service:pilight:1\r\n"; +$sMsg .= "Man:\"ssdp:discover\"\r\n"; +$sMsg .= "MX:3\r\n\r\n"; + +$sBuffer = NULL; +$sTmp = NULL; +$rSocket = socket_create(AF_INET, SOCK_DGRAM, 0); +socket_set_option($rSocket, SOL_SOCKET, SO_RCVTIMEO, array('sec'=>0, 'usec'=>10000)); +$send_ret = socket_sendto($rSocket, $sMsg, 1024, 0, '239.255.255.250', 1900); +$aHosts = Array(); +$x = 0; +while(@socket_recvfrom($rSocket, $sBuffer, 1024, MSG_WAITALL, $sTmp, $sTmp)) { + if(strpos($sBuffer, 'pilight') !== false) { + $aLines = explode("\r\n", $sBuffer); + foreach($aLines as $sLine) { + if(sscanf($sLine, "Location:%d.%d.%d.%d:%d\r\n", $ip1, $ip2, $ip3, $ip4, $port) > 0) { + $ip = $ip1.'.'.$ip2.'.'.$ip3.'.'.$ip4; + $aHosts[$x]['ip'] = $ip; + $aHosts[$x]['port'] = $port; + $x++; + } + } + } +} +socket_close($rSocket); +$sLine = ''; +if(count($aHosts) > 0) { + $fp = fsockopen($aHosts[0]['ip'], $aHosts[0]['port'], $errno, $errdesc) or die ("Couldn't connect to server"); + fputs($fp, '{"action":"identify","options":{"receiver":1}}'); + $sLine = fgets($fp, 1024); + if($sLine == "{\"status\":\"success\"}\n") { + $iLen = 0; + $sLine = ''; + while(true) { + $sLine .= fgets($fp, 1024); + $iLen = strlen($sLine); + if($iLen > 2 && ord($sLine[$iLen-1]) === 10 && ord($sLine[$iLen-2]) === 10) { + $sLine = substr($sLine, 0, -2); + echo $sLine."\n"; + $sLine = ''; + } + } + } +} else { + die("no pilight ssdp connections found\n"); +} +?> \ No newline at end of file diff --git a/lib/ESPiLight/pilight/clients/process.pl b/lib/ESPiLight/pilight/clients/process.pl new file mode 100644 index 0000000..4b9a6d3 --- /dev/null +++ b/lib/ESPiLight/pilight/clients/process.pl @@ -0,0 +1,65 @@ +#!/usr/bin/env perl +# +# Copyright (C) 2013 CurlyMo +# +# This file is part of pilight. +# +# pilight is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# pilight is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pilight. If not, see +# + +use IO::Socket; + +socket(sock, PF_INET, SOCK_DGRAM, getprotobyname("udp")) or die "socket:$@"; +setsockopt(sock, SOL_SOCKET, SO_BROADCAST, 1) or die "setsockopt:$@"; +setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, pack('l!l!', 0, 10000)) or die "setsockopt:$@"; +my $dest = sockaddr_in(1900, inet_aton('239.255.255.250')); + +$msg = "M-SEARCH * HTTP/1.1\r\n"; +$msg .= "Host:239.255.255.250:1900\r\n"; +$msg .= "ST:urn:schemas-upnp-org:service:pilight:1\r\n"; +$msg .= "Man:\"ssdp:discover\"\r\n"; +$msg .= "MX:3\r\n\r\n"; + +my $ip = ''; +my $port = ''; +send(sock, $msg, 1024, $dest); +while(recv(sock, $data, 1024, $dest)) { + if(index($data, "pilight") != -1) { + foreach(split(/\r\n/, $data)) { + $_ =~ /Location:([0-9\.]+):([0-9]+)/ || next; + ($ip,$port) = ($1,$2); + } + } +} + +$socket = new IO::Socket::INET ( + PeerHost => $ip, + PeerPort => $port, + Proto => 'tcp', +) or die "no pilight ssdp connections found\n"; + +$socket->send('{"action":"identify","options":{"receiver":1}}'); +$socket->recv($recv_data, 1024); +my $text = ''; +while(1) { + $text = ''; + while(1) { + $socket->recv($recv_data, 1024); + $text .= $recv_data; + if($recv_data[(length $recv_data)-1] == '\n' || $recv_data[(length $recv_data)] == '\n') { + $text = substr $text, 0, -1; + last; + } + } + print $text; +} \ No newline at end of file diff --git a/lib/ESPiLight/pilight/clients/process.py b/lib/ESPiLight/pilight/clients/process.py new file mode 100644 index 0000000..ad10375 --- /dev/null +++ b/lib/ESPiLight/pilight/clients/process.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python +# +# Copyright (C) 2017 pilino1234 +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +"""Example Python 2 client for pilight daemon socket API + +Runs a SSDP discovery for pilight daemons on the network, and connects to it. +Identifies as a "receiver" type client, and prints received messages until +terminated. + +""" + +import socket +import struct +import re + + +def discover(service, retries=1): + """SSDP discovery function + + :param service: The name of the SSDP service to run discovery for + :type service: str + :param retries: The number of discovery retries. Defaults to 1. + :type retries: int + + """ + + group = ("239.255.255.250", 1900) + message = "\r\n".join([ + 'M-SEARCH * HTTP/1.1', + 'HOST: {0}:{1}'.format(*group), + 'MAN: "ssdp:discover"', + 'ST: {st}', 'MX: 3', '', '']) + + ssdp_responses = {} + + for i in range(retries): + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, + socket.IPPROTO_UDP) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, + struct.pack('LL', 0, 10000)) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) + sock.sendto(message.format(st=service), group) + + while True: + try: + ssdp_responses[i] = sock.recv(1024) + break + except socket.timeout: + break + except IOError: + print "no pilight ssdp connections found" + break + + sock.close() + return ssdp_responses + + +if __name__ == "__main__": + + RESPONSES = discover("urn:schemas-upnp-org:service:pilight:1") + + if len(RESPONSES) > 0: + for resp in RESPONSES: + locationsrc = re.search('Location:([0-9.]+):(.*)', + str(RESPONSES[0]), re.IGNORECASE) + + if locationsrc: + location = locationsrc.group(1) + port = locationsrc.group(2) + + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + socket.setdefaulttimeout(0) + try: + s.connect((location, int(port))) + except ConnectionRefusedError: + # Connection was refused, try next SSDP response + print "connection refused" + continue + + s.send('{"action": "identify", "options": {"core": 1}}') + text = "" + while True: + line = s.recv(1024) + text += line + if "\n\n" in line[-2:]: + text = text[:-2] + break + + if text == '{"status":"success"}': + text = "" + while True: + line = s.recv(1024) + text += line + if "\n\n" in line[-2:]: + text = text[:-2] + for f in iter(text.splitlines()): + print f + text = "" + elif text == '{"status":"failure"}': + # connection failed, try next SSDP response + print "connection failed" + continue + s.close() diff --git a/lib/ESPiLight/pilight/clients/process.py3 b/lib/ESPiLight/pilight/clients/process.py3 new file mode 100644 index 0000000..f11e5a7 --- /dev/null +++ b/lib/ESPiLight/pilight/clients/process.py3 @@ -0,0 +1,108 @@ +#!/usr/bin/env python +# +# Copyright (C) 2017 pilino1234 +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +"""Example Python 3 client for pilight daemon socket API + +Runs a SSDP discovery for pilight daemons on the network, and connects to it. +Identifies as a "receiver" type client, and prints received messages until +terminated. + +""" + +import socket +import struct +import re + + +def discover(service, retries=1): + """SSDP discovery function + + :param service: The name of the SSDP service to run discovery for + :type service: str + :param retries: The number of discovery retries. Defaults to 1. + :type retries: int + + """ + + group = ("239.255.255.250", 1900) + discover_message = "\r\n".join([ + 'M-SEARCH * HTTP/1.1', + 'HOST: {0}:{1}'.format(*group), + 'MAN: "ssdp:discover"', + 'ST: {st}', 'MX: 3', '', '']).format(st=service) + + ssdp_responses = {} + + for i in range(retries): + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, + socket.IPPROTO_UDP) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, + struct.pack('LL', 0, 10000)) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) + sock.sendto(bytes(discover_message, "utf-8"), group) + + while True: + try: + ssdp_responses[i] = sock.recv(1024).decode("utf-8") + break + except socket.timeout: + break + except IOError: + print("no pilight ssdp connections found") + break + + sock.close() + return ssdp_responses + + +if __name__ == "__main__": + + RESPONSES = discover("urn:schemas-upnp-org:service:pilight:1") + + if len(RESPONSES) > 0: + for resp in RESPONSES: # try all responses until one works + locationsrc = re.search("Location:([0-9.]+):(.*)", + str(RESPONSES[resp]), re.IGNORECASE) + + if locationsrc: + location = locationsrc.group(1) + port = locationsrc.group(2) + + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + try: + s.connect((location, int(port))) + except ConnectionRefusedError: + # Connection was refused, try next SSDP response + print("connection refused") + continue + + s.send(bytes('{"action": "identify", \ + "options": {"receiver": 1}}', "utf-8")) + response = "" + while True: + line = s.recv(1024).decode("utf-8") + response += line + if "\n\n" in line[-2:]: + response = response[:-2] + break + + if response == '{"status":"success"}': + message = "" + while True: + line = s.recv(1024).decode("utf-8") + message += line + if "\n\n" in line[-2:]: + message = message[:-2] + for f in iter(message.splitlines()): + print(f) + message = "" + elif response == '{"status":"failure"}': + # connection failed, try next SSDP response + print("connection failed") + continue diff --git a/lib/ESPiLight/pilight/control.c b/lib/ESPiLight/pilight/control.c new file mode 100644 index 0000000..f78eee8 --- /dev/null +++ b/lib/ESPiLight/pilight/control.c @@ -0,0 +1,359 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 +#include +#endif + +#include "libs/pilight/core/threads.h" +#include "libs/pilight/core/pilight.h" +#include "libs/pilight/core/common.h" +#include "libs/pilight/core/config.h" +#include "libs/pilight/core/log.h" +#include "libs/pilight/core/options.h" +#include "libs/pilight/core/socket.h" +#include "libs/pilight/core/json.h" +#include "libs/pilight/core/ssdp.h" +#include "libs/pilight/core/dso.h" +#include "libs/pilight/core/gc.h" + +#include "libs/pilight/config/devices.h" + +#include "libs/pilight/protocols/protocol.h" + +#include "libs/pilight/events/events.h" + +int main(int argc, char **argv) { + // memtrack(); + + atomicinit(); + struct options_t *options = NULL; + struct ssdp_list_t *ssdp_list = NULL; + struct devices_t *dev = NULL; + struct JsonNode *json = NULL; + struct JsonNode *tmp = NULL; + char *recvBuff = NULL, *message = NULL, *output = NULL; + char *device = NULL, *state = NULL, *values = NULL; + char *server = NULL; + int has_values = 0, sockfd = 0, hasconfarg = 0; + unsigned short port = 0, showhelp = 0, showversion = 0; + + log_file_disable(); + log_shell_enable(); + log_level_set(LOG_NOTICE); + + if((progname = MALLOC(16)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(progname, "pilight-control"); + + /* Define all CLI arguments of this program */ + options_add(&options, 'H', "help", OPTION_NO_VALUE, 0, JSON_NULL, NULL, NULL); + options_add(&options, 'V', "version", OPTION_NO_VALUE, 0, JSON_NULL, NULL, NULL); + options_add(&options, 'd', "device", OPTION_HAS_VALUE, 0, JSON_NULL, NULL, NULL); + options_add(&options, 's', "state", OPTION_HAS_VALUE, 0, JSON_NULL, NULL, NULL); + options_add(&options, 'v', "values", OPTION_HAS_VALUE, 0, JSON_NULL, NULL, NULL); + options_add(&options, 'S', "server", OPTION_HAS_VALUE, 0, JSON_NULL, NULL, "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"); + options_add(&options, 'P', "port", OPTION_HAS_VALUE, 0, JSON_NULL, NULL, "[0-9]{1,4}"); + options_add(&options, 'C', "config", OPTION_HAS_VALUE, 0, JSON_NULL, NULL, NULL); + + /* Store all CLI arguments for later usage + and also check if the CLI arguments where + used correctly by the user. This will also + fill all necessary values in the options struct */ + while(1) { + int c; + c = options_parse(&options, argc, argv, 1, &optarg); + if(c == -1) + break; + if(c == -2) { + showhelp = 1; + break; + } + switch(c) { + case 'H': + showhelp = 1; + break; + case 'V': + showversion = 1; + break; + case 'd': + if((device = REALLOC(device, strlen(optarg)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(device, optarg); + break; + case 's': + if((state = REALLOC(state, strlen(optarg)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(state, optarg); + break; + case 'v': + if((values = REALLOC(values, strlen(optarg)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(values, optarg); + break; + case 'C': + if(config_set_file(optarg) == EXIT_FAILURE) { + return EXIT_FAILURE; + } + hasconfarg = 1; + break; + case 'S': + if(!(server = REALLOC(server, strlen(optarg)+1))) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(server, optarg); + break; + case 'P': + port = (unsigned short)atoi(optarg); + break; + default: + printf("Usage: %s -l location -d device -s state\n", progname); + goto close; + break; + } + } + options_delete(options); + + if(showversion == 1) { + printf("%s v%s\n", progname, PILIGHT_VERSION); + goto close; + } + if(showhelp == 1) { + printf("\t -H --help\t\t\tdisplay this message\n"); + printf("\t -V --version\t\t\tdisplay version\n"); + printf("\t -S --server=x.x.x.x\t\tconnect to server address\n"); + printf("\t -C --config\t\t\tconfig file\n"); + printf("\t -P --port=xxxx\t\t\tconnect to server port\n"); + printf("\t -d --device=device\t\tthe device that you want to control\n"); + printf("\t -s --state=state\t\tthe new state of the device\n"); + printf("\t -v --values=values\t\tspecific comma separated values, e.g.:\n"); + printf("\t\t\t\t\t-v dimlevel=10\n"); + goto close; + } + if(device == NULL || state == NULL || + strlen(device) == 0 || strlen(state) == 0) { + printf("Usage: %s -d device -s state\n", progname); + goto close; + } + + if(server && port > 0) { + if((sockfd = socket_connect(server, port)) == -1) { + logprintf(LOG_ERR, "could not connect to pilight-daemon"); + goto close; + } + } else if(ssdp_seek(&ssdp_list) == -1) { + logprintf(LOG_NOTICE, "no pilight ssdp connections found"); + goto close; + } else { + if((sockfd = socket_connect(ssdp_list->ip, ssdp_list->port)) == -1) { + logprintf(LOG_ERR, "could not connect to pilight-daemon"); + goto close; + } + } + if(ssdp_list) { + ssdp_free(ssdp_list); + } + + protocol_init(); + config_init(); + if(hasconfarg == 1) { + if(config_read() != EXIT_SUCCESS) { + goto close; + } + } + + socket_write(sockfd, "{\"action\":\"identify\"}"); + if(socket_read(sockfd, &recvBuff, 0) != 0 + || strcmp(recvBuff, "{\"status\":\"success\"}") != 0) { + goto close; + } + + json = json_mkobject(); + json_append_member(json, "action", json_mkstring("request config")); + output = json_stringify(json, NULL); + socket_write(sockfd, output); + json_free(output); + json_delete(json); + + if(socket_read(sockfd, &recvBuff, 0) == 0) { + if(json_validate(recvBuff) == true) { + json = json_decode(recvBuff); + if(json_find_string(json, "message", &message) == 0) { + if(strcmp(message, "config") == 0) { + struct JsonNode *jconfig = NULL; + if((jconfig = json_find_member(json, "config")) != NULL) { + int match = 1; + while(match) { + struct JsonNode *jchilds = json_first_child(jconfig); + match = 0; + while(jchilds) { + if(strcmp(jchilds->key, "devices") != 0) { + json_remove_from_parent(jchilds); + tmp = jchilds; + match = 1; + } + jchilds = jchilds->next; + if(tmp != NULL) { + json_delete(tmp); + } + tmp = NULL; + } + } + config_parse(jconfig); + if(devices_get(device, &dev) == 0) { + JsonNode *joutput = json_mkobject(); + JsonNode *jcode = json_mkobject(); + JsonNode *jvalues = json_mkobject(); + json_append_member(jcode, "device", json_mkstring(device)); + + if(values != NULL) { + char *sptr = NULL; + char *ptr1 = strtok_r(values, ",", &sptr); + while(ptr1) { + char **array = NULL; + int n = explode(ptr1, "=", &array), q = 0; + if(n == 2) { + char *name = MALLOC(strlen(array[0])+1); + if(name == NULL) { + logprintf(LOG_ERR, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(name, array[q]); + char *val = MALLOC(strlen(array[q+1])+1); + if(val == NULL) { + logprintf(LOG_ERR, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(val, array[1]); + if(devices_valid_value(device, name, val) == 0) { + if(isNumeric(val) == EXIT_SUCCESS) { + json_append_member(jvalues, name, json_mknumber(atof(val), nrDecimals(val))); + } else { + json_append_member(jvalues, name, json_mkstring(val)); + } + has_values = 1; + FREE(name); + FREE(values); + array_free(&array, n); + } else { + logprintf(LOG_ERR, "\"%s\" is an invalid value for device \"%s\"", name, device); + array_free(&array, n); + FREE(name); + FREE(values); + json_delete(json); + goto close; + } + } else { + array_free(&array, n); + logprintf(LOG_ERR, "\"%s\" requires a name=value format", ptr1); + break; + } + ptr1 = strtok_r(NULL, ",", &sptr); + } + } + + if(devices_valid_state(device, state) == 0) { + json_append_member(jcode, "state", json_mkstring(state)); + } else { + logprintf(LOG_ERR, "\"%s\" is an invalid state for device \"%s\"", state, device); + json_delete(json); + goto close; + } + + if(has_values == 1) { + json_append_member(jcode, "values", jvalues); + } else { + json_delete(jvalues); + } + json_append_member(joutput, "action", json_mkstring("control")); + json_append_member(joutput, "code", jcode); + output = json_stringify(joutput, NULL); + socket_write(sockfd, output); + json_free(output); + json_delete(joutput); + if(socket_read(sockfd, &recvBuff, 0) != 0 + || strcmp(recvBuff, "{\"status\":\"success\"}") != 0) { + logprintf(LOG_ERR, "failed to control %s", device); + } + } else { + logprintf(LOG_ERR, "the device \"%s\" does not exist", device); + json_delete(json); + goto close; + } + } + } + } + json_delete(json); + } + } +close: + if(recvBuff) { + FREE(recvBuff); + } + if(sockfd > 0) { + socket_close(sockfd); + } + if(server != NULL) { + FREE(server); + } + if(device != NULL) { + FREE(device); + } + if(state != NULL) { + FREE(state); + } + if(values != NULL) { + FREE(values); + } + log_shell_disable(); + socket_gc(); + config_gc(); + protocol_gc(); + options_gc(); +#ifdef EVENTS + events_gc(); +#endif + dso_gc(); + log_gc(); + threads_gc(); + gc_clear(); + FREE(progname); + xfree(); + +#ifdef _WIN32 + WSACleanup(); +#endif + + return EXIT_SUCCESS; +} diff --git a/lib/ESPiLight/pilight/daemon.c b/lib/ESPiLight/pilight/daemon.c new file mode 100644 index 0000000..c32a2d0 --- /dev/null +++ b/lib/ESPiLight/pilight/daemon.c @@ -0,0 +1,3505 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #include + #include + #include + #include + #include + #define MSG_NOSIGNAL 0 +#else + #include + #include + #include + #include + #include + #include + #ifdef __mips__ + #define __USE_UNIX98 + #endif +#endif +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 +#include +#endif + +#include "libs/pilight/core/pilight.h" +#include "libs/pilight/core/threads.h" +#include "libs/pilight/core/datetime.h" +#include "libs/pilight/core/common.h" +#include "libs/pilight/core/network.h" +#include "libs/pilight/core/gc.h" +#include "libs/pilight/core/log.h" +#include "libs/pilight/core/ssl.h" +#include "libs/pilight/core/options.h" +#include "libs/pilight/core/socket.h" +#include "libs/pilight/core/json.h" +#include "libs/pilight/core/ssdp.h" +#include "libs/pilight/core/dso.h" +#include "libs/pilight/core/firmware.h" +#include "libs/pilight/core/proc.h" +#include "libs/pilight/core/ntp.h" +#include "libs/pilight/core/config.h" +#include "libs/pilight/lua/lua.h" + +#ifdef EVENTS + #include "libs/pilight/events/events.h" +#endif + +#ifdef WEBSERVER + #ifdef WEBSERVER_HTTPS + #include + #endif + #include "libs/pilight/core/webserver.h" +#endif + +#include "libs/pilight/config/hardware.h" +#include "libs/pilight/config/registry.h" +#include "libs/pilight/config/devices.h" +#include "libs/pilight/config/settings.h" +#include "libs/pilight/config/gui.h" + +static uv_signal_t **signal_req = NULL; +static int signals[5] = { SIGINT, SIGQUIT, SIGTERM, SIGABRT, SIGTSTP }; +static uv_timer_t *timer_abort_req = NULL; +static uv_timer_t *timer_stats_req = NULL; + +#ifdef _WIN32 +static char server_name[40]; +#endif + +typedef struct clients_t { + char uuid[UUID_LENGTH]; + int id; + int receiver; + int config; + int core; + int stats; + int forward; + char media[8]; + double cpu; + double ram; + struct clients_t *next; +} clients_t; + +static struct clients_t *clients = NULL; + +typedef struct sendqueue_t { + unsigned int id; + char *protoname; + char *settings; + char *message; + enum origin_t origin; + struct protocol_t *protopt; + int code[MAXPULSESTREAMLENGTH]; + int length; + char uuid[UUID_LENGTH]; + struct sendqueue_t *next; +} sendqueue_t; + +static struct sendqueue_t *sendqueue; +static struct sendqueue_t *sendqueue_head; + +typedef struct recvqueue_t { + int raw[MAXPULSESTREAMLENGTH]; + int rawlen; + int hwtype; + int plslen; + struct recvqueue_t *next; +} recvqueue_t; + +static struct recvqueue_t *recvqueue; +static struct recvqueue_t *recvqueue_head; + +static pthread_mutex_t config_lock; +static pthread_mutexattr_t config_attr; + +static pthread_mutex_t sendqueue_lock; +static pthread_cond_t sendqueue_signal; +static pthread_mutexattr_t sendqueue_attr; +static unsigned short sendqueue_init = 0; + +static int sendqueue_number = 0; +static int recvqueue_number = 0; + +static pthread_mutex_t recvqueue_lock; +static pthread_cond_t recvqueue_signal; +static pthread_mutexattr_t recvqueue_attr; +static unsigned short recvqueue_init = 0; + +typedef struct bcqueue_t { + struct JsonNode *jmessage; + char *protoname; + enum origin_t origin; + struct bcqueue_t *next; +} bcqueue_t; + +static struct bcqueue_t *bcqueue; +static struct bcqueue_t *bcqueue_head; + +static pthread_mutex_t bcqueue_lock; +static pthread_cond_t bcqueue_signal; +static pthread_mutexattr_t bcqueue_attr; +static unsigned short bcqueue_init = 0; + +static int bcqueue_number = 0; + +static struct protocol_t *procProtocol; + +/* The pid_file and pid of this daemon */ +#ifndef _WIN32 +static char *pid_file; +static unsigned short pid_file_free = 0; +#endif +static pid_t pid; +/* Daemonize or not */ +static int nodaemon = 0; +/* Run tracktracer */ +static int stacktracer = 0; +/* Run thread profiler */ +static int threadprofiler = 0; +/* Are we already running */ +static int running = 1; +/* Are we currently sending code */ +static int sending = 0; +/* Socket identifier to the server if we are running as client */ +static int sockfd = 0; +/* Thread pointers */ +static pthread_t logpth; +/* While loop conditions */ +static unsigned short main_loop = 1; +/* Reset repeats after a certain amount of time */ +static struct timeval tv; +/* Are we running standalone */ +static int standalone = 0; +/* Do we need to connect to a master server:port? */ +static char *master_server = NULL; +static unsigned short master_port = 0; + +static int adhoc_pending = 0; +static char *configtmp = NULL; +static int verbosity = LOG_INFO; +struct socket_callback_t socket_callback; + +#ifdef _WIN32 + static int console = 0; + static int oldverbosity = LOG_NOTICE; +#endif + + +#ifdef WEBSERVER +/* Do we enable the webserver */ +static int webserver_enable = WEBSERVER_ENABLE; +static int webgui_websockets = WEBGUI_WEBSOCKETS; +/* On what port does the webserver run */ +static int webserver_http_port = WEBSERVER_HTTP_PORT; +/* The webroot of pilight */ +static char *webserver_root = NULL; +static int webserver_root_free = 0; +#endif + +static void *reason_forward_free(void *param) { + FREE(param); + return NULL; +} + +static void *reason_send_code_free(void *param) { + struct reason_send_code_t *data = param; + FREE(data); + return NULL; +} + +static void *reason_broadcast_core_free(void *param) { + char *code = param; + FREE(code); + return NULL; +} + +static void *reason_socket_send_free(void *param) { + struct reason_socket_send_t *data = param; + FREE(data->buffer); + FREE(data); + return NULL; +} + +static void client_remove(int id) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct clients_t *currP, *prevP; + + prevP = NULL; + + for(currP = clients; currP != NULL; prevP = currP, currP = currP->next) { + + if(currP->id == id) { + if(prevP == NULL) { + clients = currP->next; + } else { + prevP->next = currP->next; + } + + FREE(currP); + break; + } + } +} + +static void broadcast_queue(char *protoname, struct JsonNode *json, enum origin_t origin) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(main_loop == 1) { + pthread_mutex_lock(&bcqueue_lock); + if(bcqueue_number <= 1024) { + struct bcqueue_t *bnode = MALLOC(sizeof(struct bcqueue_t)); + if(bnode == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + char *jstr = json_stringify(json, NULL); + bnode->jmessage = json_decode(jstr); + if(json_find_member(bnode->jmessage, "uuid") == NULL && strlen(pilight_uuid) > 0) { + json_append_member(bnode->jmessage, "uuid", json_mkstring(pilight_uuid)); + } + json_free(jstr); + + if((bnode->protoname = MALLOC(strlen(protoname)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(bnode->protoname, protoname); + + bnode->origin = origin; + + if(bcqueue_number == 0) { + bcqueue = bnode; + bcqueue_head = bnode; + } else { + bcqueue_head->next = bnode; + bcqueue_head = bnode; + } + + bcqueue_number++; + } else { + logprintf(LOG_ERR, "broadcast queue full"); + } + pthread_mutex_unlock(&bcqueue_lock); + pthread_cond_signal(&bcqueue_signal); + } +} + +void *broadcast(void *param) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + int broadcasted = 0/*, free_conf = 1*/; + + pthread_mutex_lock(&bcqueue_lock); + while(main_loop) { + if(bcqueue_number > 0) { + pthread_mutex_lock(&bcqueue_lock); + + logprintf(LOG_STACK, "%s::unlocked", __FUNCTION__); + + broadcasted = 0; + struct JsonNode *jret = NULL; + char *origin = NULL; + + if(json_find_string(bcqueue->jmessage, "origin", &origin) == 0) { + if(strcmp(origin, "core") == 0) { + double tmp = 0; + json_find_number(bcqueue->jmessage, "type", &tmp); + char *conf = json_stringify(bcqueue->jmessage, NULL); + struct clients_t *tmp_clients = clients; + while(tmp_clients) { + if(((int)tmp < 0 && tmp_clients->core == 1) || + ((int)tmp >= 0 && tmp_clients->config == 1) || + ((int)tmp == PROCESS && tmp_clients->stats == 1)) { + socket_write(tmp_clients->id, conf); + broadcasted = 1; + } + tmp_clients = tmp_clients->next; + } + + if(pilight.runmode == ADHOC && sockfd > 0) { + struct JsonNode *jupdate = json_decode(conf); + json_append_member(jupdate, "action", json_mkstring("update")); + char *ret = json_stringify(jupdate, NULL); + socket_write(sockfd, ret); + broadcasted = 1; + json_delete(jupdate); + json_free(ret); + } + if(broadcasted == 1) { + logprintf(LOG_DEBUG, "broadcasted: %s", conf); + } + eventpool_trigger(REASON_BROADCAST_CORE, reason_broadcast_core_free, conf); + } else { + /* Update the config */ + if(devices_update(bcqueue->protoname, bcqueue->jmessage, bcqueue->origin, &jret) == 0) { + char *tmp = json_stringify(jret, NULL); + struct clients_t *tmp_clients = clients; + unsigned short match1 = 0, match2 = 0; + + while(tmp_clients) { + if(tmp_clients->config == 1) { + struct JsonNode *jtmp = json_decode(tmp); + struct JsonNode *jdevices = json_find_member(jtmp, "devices"); + if(jdevices != NULL) { + match1 = 0; + struct JsonNode *jchilds = json_first_child(jdevices); + struct gui_values_t *gui_values = NULL; + while(jchilds) { + match2 = 0; + if(jchilds->tag == JSON_STRING) { + if((gui_values = gui_media(jchilds->string_)) != NULL) { + while(gui_values) { + if(gui_values->type == JSON_STRING) { + if(strcmp(gui_values->string_, tmp_clients->media) == 0 || + strcmp(gui_values->string_, "all") == 0 || + strcmp(tmp_clients->media, "all") == 0) { + match1 = 1; + match2 = 1; + } + } + gui_values = gui_values->next; + } + } else { + match1 = 1; + match2 = 1; + } + } + if(match2 == 0) { + json_remove_from_parent(jchilds); + } + struct JsonNode *jtmp1 = jchilds; + jchilds = jchilds->next; + if(match2 == 0) { + json_delete(jtmp1); + } + } + } + if(match1 == 1) { + char *conf = json_stringify(jtmp, NULL); + socket_write(tmp_clients->id, conf); + logprintf(LOG_DEBUG, "broadcasted: %s", conf); + json_free(conf); + } + json_delete(jtmp); + } + tmp_clients = tmp_clients->next; + } + eventpool_trigger(REASON_BROADCAST_CORE, reason_broadcast_core_free, tmp); + + // json_free(tmp); + json_delete(jret); + } + + /* The settings objects inside the broadcast queue is only of interest for the + internal pilight functions. For the outside world we only communicate the + message part of the queue so we remove the settings */ + char *internal = json_stringify(bcqueue->jmessage, NULL); + + struct JsonNode *jsettings = NULL; + if((jsettings = json_find_member(bcqueue->jmessage, "settings"))) { + json_remove_from_parent(jsettings); + json_delete(jsettings); + } + struct JsonNode *tmp = json_find_member(bcqueue->jmessage, "action"); + if(tmp != NULL && tmp->tag == JSON_STRING && strcmp(tmp->string_, "update") == 0) { + json_remove_from_parent(tmp); + json_delete(tmp); + } + + char *out = json_stringify(bcqueue->jmessage, NULL); + if(strcmp(bcqueue->protoname, "pilight_firmware") == 0) { + struct JsonNode *code = NULL; + if((code = json_find_member(bcqueue->jmessage, "message")) != NULL) { + json_find_number(code, "version", &firmware.version); + json_find_number(code, "lpf", &firmware.lpf); + json_find_number(code, "hpf", &firmware.hpf); + if(firmware.version > 0 && firmware.lpf > 0 && firmware.hpf > 0) { + registry_set_number("pilight.firmware.version", firmware.version, 0); + registry_set_number("pilight.firmware.lpf", firmware.lpf, 0); + registry_set_number("pilight.firmware.hpf", firmware.hpf, 0); + + struct JsonNode *jmessage = json_mkobject(); + struct JsonNode *jcode = json_mkobject(); + json_append_member(jcode, "version", json_mknumber(firmware.version, 0)); + json_append_member(jcode, "lpf", json_mknumber(firmware.lpf, 0)); + json_append_member(jcode, "hpf", json_mknumber(firmware.hpf, 0)); + json_append_member(jmessage, "values", jcode); + json_append_member(jmessage, "origin", json_mkstring("core")); + json_append_member(jmessage, "type", json_mknumber(FIRMWARE, 0)); + char pname[17]; + strcpy(pname, "pilight-firmware"); + pilight.broadcast(pname, jmessage, FW); + json_delete(jmessage); + jmessage = NULL; + } + } + } + broadcasted = 0; + + struct JsonNode *childs = json_first_child(bcqueue->jmessage); + int nrchilds = 0; + while(childs) { + nrchilds++; + childs = childs->next; + } + + /* Write the message to all receivers */ + struct clients_t *tmp_clients = clients; + while(tmp_clients) { + if(tmp_clients->receiver == 1 && tmp_clients->forward == 0) { + if(strcmp(out, "{}") != 0 && nrchilds > 1) { + socket_write(tmp_clients->id, out); + broadcasted = 1; + } + } + tmp_clients = tmp_clients->next; + } + + if(pilight.runmode == ADHOC && sockfd > 0) { + struct JsonNode *jupdate = json_decode(internal); + json_append_member(jupdate, "action", json_mkstring("update")); + char *ret = json_stringify(jupdate, NULL); + socket_write(sockfd, ret); + broadcasted = 1; + json_delete(jupdate); + json_free(ret); + } + if((broadcasted == 1 || nodaemon == 1) && (strcmp(out, "{}") != 0 && nrchilds > 1)) { + logprintf(LOG_DEBUG, "broadcasted: %s", out); + } + json_free(internal); + // json_free(out); + eventpool_trigger(REASON_BROADCAST_CORE, reason_broadcast_core_free, out); + } + } + struct bcqueue_t *tmp = bcqueue; + FREE(tmp->protoname); + json_delete(tmp->jmessage); + bcqueue = bcqueue->next; + FREE(tmp); + bcqueue_number--; + pthread_mutex_unlock(&bcqueue_lock); + } else { + pthread_cond_wait(&bcqueue_signal, &bcqueue_lock); + } + } + return (void *)NULL; +} + +static void receive_queue(int *raw, int rawlen, int plslen, int hwtype) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + int i = 0; + + if(main_loop == 1) { + pthread_mutex_lock(&recvqueue_lock); + if(recvqueue_number <= 1024) { + struct recvqueue_t *rnode = MALLOC(sizeof(struct recvqueue_t)); + if(rnode == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + for(i=0;iraw[i] = raw[i]; + } + rnode->rawlen = rawlen; + rnode->plslen = plslen; + rnode->hwtype = hwtype; + + if(recvqueue_number == 0) { + recvqueue = rnode; + recvqueue_head = rnode; + } else { + recvqueue_head->next = rnode; + recvqueue_head = rnode; + } + + recvqueue_number++; + } else { + logprintf(LOG_ERR, "receiver queue full"); + } + pthread_mutex_unlock(&recvqueue_lock); + pthread_cond_signal(&recvqueue_signal); + } +} + +static void receiver_create_message(protocol_t *protocol) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(protocol->message != NULL) { + char *valid = json_stringify(protocol->message, NULL); + json_delete(protocol->message); + if(valid != NULL && json_validate(valid) == true) { + struct JsonNode *jmessage = json_mkobject(); + + json_append_member(jmessage, "message", json_decode(valid)); + json_append_member(jmessage, "origin", json_mkstring("receiver")); + json_append_member(jmessage, "protocol", json_mkstring(protocol->id)); + if(strlen(pilight_uuid) > 0) { + json_append_member(jmessage, "uuid", json_mkstring(pilight_uuid)); + } + if(protocol->repeats > -1) { + json_append_member(jmessage, "repeats", json_mknumber(protocol->repeats, 0)); + } + char *output = json_stringify(jmessage, NULL); + struct JsonNode *json = json_decode(output); + broadcast_queue(protocol->id, json, RECEIVER); + json_free(output); + json_delete(json); + json = NULL; + json_delete(jmessage); + } + json_free(valid); + } + protocol->message = NULL; +} + +static void receive_parse_api(struct JsonNode *code, int hwtype) { + struct protocol_t *protocol = NULL; + struct protocols_t *pnode = protocols; + + while(pnode != NULL) { + protocol = pnode->listener; + + if(protocol->hwtype == hwtype && protocol->parseCommand != NULL) { + protocol->parseCommand(code); + receiver_create_message(protocol); + } + pnode = pnode->next; + } +} + +void *receive_parse_code(void *param) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + pthread_mutex_lock(&recvqueue_lock); + while(main_loop) { + if(recvqueue_number > 0) { + pthread_mutex_lock(&recvqueue_lock); + + logprintf(LOG_STACK, "%s::unlocked", __FUNCTION__); + + struct protocol_t *protocol = NULL; + struct protocols_t *pnode = protocols; + + while(pnode != NULL && main_loop) { + protocol = pnode->listener; + + if((protocol->hwtype == recvqueue->hwtype || protocol->hwtype == -1 || recvqueue->hwtype == -1) && + (protocol->parseCode != NULL && protocol->validate != NULL)) { + + if(recvqueue->rawlen < MAXPULSESTREAMLENGTH) { + protocol->raw = recvqueue->raw; + } + protocol->rawlen = recvqueue->rawlen; + + if(protocol->validate() == 0) { + logprintf(LOG_DEBUG, "possible %s protocol", protocol->id); + gettimeofday(&tv, NULL); + if(protocol->first > 0) { + protocol->first = protocol->second; + } + protocol->second = 1000000 * (unsigned int)tv.tv_sec + (unsigned int)tv.tv_usec; + if(protocol->first == 0) { + protocol->first = protocol->second; + } + + /* Reset # of repeats after a certain delay */ + if(((int)protocol->second-(int)protocol->first) > 500000) { + protocol->repeats = 0; + } + + protocol->repeats++; + if(protocol->parseCode != NULL) { + logprintf(LOG_DEBUG, "recevied pulse length of %d", recvqueue->plslen); + logprintf(LOG_DEBUG, "caught minimum # of repeats %d of %s", protocol->repeats, protocol->id); + logprintf(LOG_DEBUG, "called %s parseRaw()", protocol->id); + protocol->parseCode(); + receiver_create_message(protocol); + } + } + } + pnode = pnode->next; + } + + struct recvqueue_t *tmp = recvqueue; + recvqueue = recvqueue->next; + FREE(tmp); + recvqueue_number--; + pthread_mutex_unlock(&recvqueue_lock); + } else { + pthread_cond_wait(&recvqueue_signal, &recvqueue_lock); + } + } + return (void *)NULL; +} + +void *send_code(void *param) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + int i = 0; + + /* Make sure the pilight sender gets + the highest priority available */ +#ifdef _WIN32 + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); +#else + struct sched_param sched; + memset(&sched, 0, sizeof(sched)); + sched.sched_priority = 80; + pthread_setschedparam(pthread_self(), SCHED_FIFO, &sched); +#endif + + pthread_mutex_lock(&sendqueue_lock); + + while(main_loop) { + if(sendqueue_number > 0) { + pthread_mutex_lock(&sendqueue_lock); + + logprintf(LOG_STACK, "%s::unlocked", __FUNCTION__); + + sending = 1; + + struct protocol_t *protocol = sendqueue->protopt; + struct hardware_t *hw = NULL; + + struct JsonNode *message = NULL; + + if(sendqueue->message != NULL && strcmp(sendqueue->message, "{}") != 0) { + if(json_validate(sendqueue->message) == true) { + if(message == NULL) { + message = json_mkobject(); + } + json_append_member(message, "origin", json_mkstring("sender")); + json_append_member(message, "protocol", json_mkstring(protocol->id)); + json_append_member(message, "message", json_decode(sendqueue->message)); + if(strlen(sendqueue->uuid) > 0) { + json_append_member(message, "uuid", json_mkstring(sendqueue->uuid)); + } + json_append_member(message, "repeat", json_mknumber(1, 0)); + } + } + if(sendqueue->settings != NULL && strcmp(sendqueue->settings, "{}") != 0) { + if(json_validate(sendqueue->settings) == true) { + if(message == NULL) { + message = json_mkobject(); + } + json_append_member(message, "settings", json_decode(sendqueue->settings)); + } + } + + struct conf_hardware_t *tmp_confhw = conf_hardware; + while(tmp_confhw) { + if(protocol->hwtype == tmp_confhw->hardware->hwtype) { + hw = tmp_confhw->hardware; + break; + } + tmp_confhw = tmp_confhw->next; + } + if(hw != NULL) { +#ifdef PILIGHT_DEVELOPMENT + if((hw->comtype == COMOOK || hw->comtype == COMPLSTRAIN) && hw->sendOOK != NULL) { + if(hw->receiveOOK != NULL || hw->receivePulseTrain != NULL) { + hw->wait = 1; + pthread_mutex_unlock(&hw->lock); + pthread_cond_signal(&hw->signal); + } +#else + if((hw->comtype == COMOOK) || (hw->comtype == COMPLSTRAIN && hw->sendOOK != NULL)) { +#endif + logprintf(LOG_DEBUG, "**** RAW CODE ****"); + if(log_level_get() >= LOG_DEBUG) { + for(i=0;ilength;i++) { + printf("%d ", sendqueue->code[i]); + } + printf("\n"); + } + logprintf(LOG_DEBUG, "**** RAW CODE ****"); + + /* + * Rewrite start + */ + struct reason_send_code_t *data = MALLOC(sizeof(struct reason_send_code_t)); + if(data == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + data->origin = ORIGIN_SENDER; + memset(&data->message, 0, 255); + // snprintf(data->message, 1024, "{\"message\":%s}", message); + data->rawlen = sendqueue->length; + memcpy(data->pulses, sendqueue->code, data->rawlen*sizeof(int)); + data->txrpt = protocol->txrpt; + strncpy(data->protocol, protocol->id, 255); + data->hwtype = hw->hwtype; + + memset(data->uuid, 0, UUID_LENGTH+1); + eventpool_trigger(REASON_SEND_CODE, reason_send_code_free, data); + /* + * Rewrite end + */ + +#ifdef PILIGHT_DEVELOPMENT + if(hw->sendOOK(sendqueue->code, sendqueue->length, protocol->txrpt) == 0) { + logprintf(LOG_DEBUG, "successfully send %s code", protocol->id); + } else { + logprintf(LOG_ERR, "failed to send code"); + } +#endif + if(strcmp(protocol->id, "raw") == 0) { + int plslen = sendqueue->code[sendqueue->length-1]/PULSE_DIV; + receive_queue(sendqueue->code, sendqueue->length, plslen, -1); + } +#ifdef PILIGHT_DEVELOPMENT + if(hw->receiveOOK != NULL || hw->receivePulseTrain != NULL) { + hw->wait = 0; + pthread_mutex_unlock(&hw->lock); + pthread_cond_signal(&hw->signal); + } +#endif + } else if(hw->comtype == COMAPI && hw->sendAPI != NULL) { + if(message != NULL) { + if(hw->sendAPI(message) == 0) { + logprintf(LOG_DEBUG, "successfully send %s command", protocol->id); + } else { + logprintf(LOG_ERR, "failed to send command"); + } + } + } + } else { + if(strcmp(protocol->id, "raw") == 0) { + int plslen = sendqueue->code[sendqueue->length-1]/PULSE_DIV; + receive_queue(sendqueue->code, sendqueue->length, plslen, -1); + } + } + if(message != NULL) { + broadcast_queue(sendqueue->protoname, message, sendqueue->origin); + json_delete(message); + message = NULL; + } + + struct sendqueue_t *tmp = sendqueue; + if(tmp->message != NULL) { + FREE(tmp->message); + } + if(tmp->settings != NULL) { + FREE(tmp->settings); + } + FREE(tmp->protoname); + sendqueue = sendqueue->next; + FREE(tmp); + sendqueue_number--; + sending = 0; + pthread_mutex_unlock(&sendqueue_lock); + } else { + pthread_cond_wait(&sendqueue_signal, &sendqueue_lock); + } + } + return (void *)NULL; +} + +/* Send a specific code */ +static int send_queue(struct JsonNode *json, enum origin_t origin) { + pthread_mutex_lock(&sendqueue_lock); + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + int match = 0, raw[MAXPULSESTREAMLENGTH-1]; + struct timeval tcurrent; + struct clients_t *tmp_clients = NULL; + char *uuid = NULL, *buffer = NULL; + /* Hold the final protocol struct */ + struct protocol_t *protocol = NULL; + +#ifdef _WIN32 + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); +#else + /* Make sure the pilight sender gets + the highest priority available */ + struct sched_param sched; + memset(&sched, 0, sizeof(sched)); + sched.sched_priority = 80; + pthread_setschedparam(pthread_self(), SCHED_FIFO, &sched); +#endif + + struct JsonNode *jcode = NULL; + struct JsonNode *jprotocols = NULL; + struct JsonNode *jprotocol = NULL; + + buffer = json_stringify(json, NULL); + tmp_clients = clients; + while(tmp_clients) { + if(tmp_clients->forward == 1) { + socket_write(tmp_clients->id, buffer); + } + tmp_clients = tmp_clients->next; + } + json_free(buffer); + + if((jcode = json_find_member(json, "code")) == NULL) { + logprintf(LOG_ERR, "sender did not send any codes"); + json_delete(jcode); + pthread_mutex_unlock(&sendqueue_lock); + return -1; + } else if((jprotocols = json_find_member(jcode, "protocol")) == NULL) { + logprintf(LOG_ERR, "sender did not provide a protocol name"); + json_delete(jcode); + pthread_mutex_unlock(&sendqueue_lock); + return -1; + } else { + json_find_string(jcode, "uuid", &uuid); + /* If we matched a protocol and are not already sending, continue */ + if(uuid == NULL || (uuid != NULL && strcmp(uuid, pilight_uuid) == 0)) { + jprotocol = json_first_child(jprotocols); + while(jprotocol && match == 0) { + match = 0; + if(jprotocol->tag == JSON_STRING) { + struct protocols_t *pnode = protocols; + /* Retrieve the used protocol */ + while(pnode) { + protocol = pnode->listener; + /* Check if the protocol exists */ + if(protocol_device_exists(protocol, jprotocol->string_) == 0 && match == 0) { + match = 1; + break; + } + pnode = pnode->next; + } + } + jprotocol = jprotocol->next; + } + memset(raw, 0, sizeof(raw)); + protocol->raw = raw; + if(match == 1 && protocol->createCode != NULL) { + /* Let the protocol create his code */ + if(protocol->createCode(jcode) == 0 && main_loop == 1) { + if(sendqueue_number <= 1024) { + struct sendqueue_t *mnode = MALLOC(sizeof(struct sendqueue_t)); + if(mnode == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + gettimeofday(&tcurrent, NULL); + mnode->origin = origin; + mnode->id = 1000000 * (unsigned int)tcurrent.tv_sec + (unsigned int)tcurrent.tv_usec; + mnode->message = NULL; + if(protocol->message != NULL) { + char *jsonstr = json_stringify(protocol->message, NULL); + json_delete(protocol->message); + if(json_validate(jsonstr) == true) { + if((mnode->message = MALLOC(strlen(jsonstr)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(mnode->message, jsonstr); + } + json_free(jsonstr); + protocol->message = NULL; + } + + mnode->length = protocol->rawlen; + memcpy(mnode->code, protocol->raw, sizeof(int)*protocol->rawlen); + + if((mnode->protoname = MALLOC(strlen(protocol->id)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(mnode->protoname, protocol->id); + mnode->protopt = protocol; + + struct options_t *tmp_options = protocol->options; + char *stmp = NULL; + struct JsonNode *jsettings = json_mkobject(); + struct JsonNode *jtmp = NULL; + while(tmp_options) { + if(tmp_options->conftype == DEVICES_SETTING) { + if(tmp_options->vartype == JSON_NUMBER && + (jtmp = json_find_member(jcode, tmp_options->name)) != NULL && + jtmp->tag == JSON_NUMBER) { + json_append_member(jsettings, tmp_options->name, json_mknumber(jtmp->number_, jtmp->decimals_)); + } else if(tmp_options->vartype == JSON_STRING && json_find_string(jcode, tmp_options->name, &stmp) == 0) { + json_append_member(jsettings, tmp_options->name, json_mkstring(stmp)); + } + } + tmp_options = tmp_options->next; + } + char *strsett = json_stringify(jsettings, NULL); + if((mnode->settings = MALLOC(strlen(strsett)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(mnode->settings, strsett); + json_free(strsett); + json_delete(jsettings); + + if(uuid != NULL) { + strcpy(mnode->uuid, uuid); + } else { + memset(mnode->uuid, '\0', UUID_LENGTH); + } + if(sendqueue_number == 0) { + sendqueue = mnode; + sendqueue_head = mnode; + } else { + sendqueue_head->next = mnode; + sendqueue_head = mnode; + } + sendqueue_number++; + } else { + logprintf(LOG_ERR, "send queue full"); + pthread_mutex_unlock(&sendqueue_lock); + return -1; + } + pthread_mutex_unlock(&sendqueue_lock); + pthread_cond_signal(&sendqueue_signal); + return 0; + } else { + pthread_mutex_unlock(&sendqueue_lock); + return -1; + } + } + } else { + pthread_mutex_unlock(&sendqueue_lock); + return 0; + } + } + pthread_mutex_unlock(&sendqueue_lock); + return -1; +} + +#ifdef WEBSERVER +static void client_webserver_parse_code(int i, char buffer[BUFFER_SIZE]) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + int sd = socket_get_clients(i); + int x = 0; + FILE *f; + char *p = NULL; + char buff[BUFFER_SIZE]; + char *cache = NULL; + char *path = NULL, buf[INET_ADDRSTRLEN+1]; + struct stat sb; + struct sockaddr_in sockin; + socklen_t len = sizeof(sockin); + + if(getsockname(sd, (struct sockaddr *)&sockin, &len) == -1) { + logprintf(LOG_ERR, "could not determine server ip address"); + } else { + if(strstr(buffer, " HTTP/") == NULL) { + return; + } + p = buff; + if(strstr(buffer, "/logo.png") != NULL) { + if((path = MALLOC(strlen(webserver_root)+strlen("logo.png")+2)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + sprintf(path, "%s/logo.png", webserver_root); + if((f = fopen(path, "rb"))) { + fstat(fileno(f), &sb); + webserver_create_header(&p, "200 OK", "image/png", (unsigned int)sb.st_size); + send(sd, (const char *)buff, (size_t)(p-buff), MSG_NOSIGNAL); + x = 0; + if((cache = MALLOC(BUFFER_SIZE)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(cache, '\0', BUFFER_SIZE); + while(!feof(f)) { + x = (int)fread(cache, 1, BUFFER_SIZE, f); + send(sd, (const char *)cache, (size_t)x, MSG_NOSIGNAL); + } + fclose(f); + FREE(cache); + } else { + logprintf(LOG_WARNING, "pilight logo not found"); + } + FREE(path); + } else { + /* Catch all webserver page to inform users on which port the webserver runs */ + webserver_create_header(&p, "200 OK", "text/html", (unsigned int)BUFFER_SIZE); + send(sd, (const char *)buff, (size_t)(p-buff), MSG_NOSIGNAL); + if(webserver_enable == 1) { + if((cache = MALLOC(BUFFER_SIZE)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(cache, '\0', BUFFER_SIZE); + memset(&buf, '\0', INET_ADDRSTRLEN+1); + inet_ntop(AF_INET, (void *)&(sockin.sin_addr), buf, INET_ADDRSTRLEN+1); + sprintf(cache, "pilight" + "

" + "

" + "The pilight webgui is located at " + "http://%s:%d

" + "
", + buf, webserver_http_port, buf, webserver_http_port); + send(sd, (const char *)cache, strlen(cache), MSG_NOSIGNAL); + FREE(cache); + } else { + send(sd, "
", 57, MSG_NOSIGNAL); + } + } + } +} +#endif + +static int control_device(struct devices_t *dev, char *state, struct JsonNode *values, enum origin_t origin) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct devices_settings_t *sett = NULL; + struct devices_values_t *val = NULL; + struct options_t *opt = NULL; + struct protocols_t *tmp_protocols = NULL; + + struct JsonNode *code = json_mkobject(); + struct JsonNode *json = json_mkobject(); + struct JsonNode *jprotocols = json_mkarray(); + + /* Check all protocol options */ + tmp_protocols = dev->protocols; + while(tmp_protocols) { + json_append_element(jprotocols, json_mkstring(tmp_protocols->name)); + if((opt = tmp_protocols->listener->options)) { + while(opt) { + sett = dev->settings; + while(sett) { + /* Retrieve the device id's */ + if(strcmp(sett->name, "id") == 0) { + val = sett->values; + while(val) { + if((opt->conftype == DEVICES_ID) + && strcmp(val->name, opt->name) == 0 + && json_find_member(code, opt->name) == NULL) { + if(val->type == JSON_STRING) { + json_append_member(code, val->name, json_mkstring(val->string_)); + } else if(val->type == JSON_NUMBER) { + json_append_member(code, val->name, json_mknumber(val->number_, val->decimals)); + } + } + val = val->next; + } + } + if(strcmp(sett->name, opt->name) == 0 + && opt->conftype == DEVICES_SETTING) { + val = sett->values; + if(json_find_member(code, opt->name) == NULL) { + if(val->type == JSON_STRING) { + json_append_member(code, opt->name, json_mkstring(val->string_)); + } else if(val->type == JSON_NUMBER) { + json_append_member(code, opt->name, json_mknumber(val->number_, val->decimals)); + } + } + } + sett = sett->next; + } + opt = opt->next; + } + while(values) { + opt = tmp_protocols->listener->options; + while(opt) { + if((opt->conftype == DEVICES_VALUE || opt->conftype == DEVICES_OPTIONAL) + && strcmp(values->key, opt->name) == 0 + && json_find_member(code, opt->name) == NULL) { + if(values->tag == JSON_STRING) { + json_append_member(code, values->key, json_mkstring(values->string_)); + } else if(values->tag == JSON_NUMBER) { + json_append_member(code, values->key, json_mknumber(values->number_, values->decimals_)); + } + } + opt = opt->next; + } + values = values->next; + } + } + /* Send the new device state */ + if((opt = tmp_protocols->listener->options) && state != NULL) { + while(opt) { + if(json_find_member(code, opt->name) == NULL) { + if(opt->conftype == DEVICES_STATE && opt->argtype == OPTION_NO_VALUE && strcmp(opt->name, state) == 0) { + json_append_member(code, opt->name, json_mknumber(1, 0)); + break; + } else if(opt->conftype == DEVICES_STATE && opt->argtype == OPTION_HAS_VALUE) { + json_append_member(code, opt->name, json_mkstring(state)); + break; + } + } + opt = opt->next; + } + } + tmp_protocols = tmp_protocols->next; + } + + /* Construct the right json object */ + json_append_member(code, "protocol", jprotocols); + if(dev->dev_uuid != NULL && dev->cst_uuid == 1) { + /*if(dev->dev_uuid != NULL && (dev->protocols->listener->hwtype == SENSOR + || dev->protocols->listener->hwtype == HWRELAY)) {*/ + json_append_member(code, "uuid", json_mkstring(dev->dev_uuid)); + } + json_append_member(json, "code", code); + json_append_member(json, "action", json_mkstring("send")); + + if(send_queue(json, origin) == 0) { + json_delete(json); + return 0; + } + + json_delete(json); + return -1; +} + +/* Parse the incoming buffer from the client */ +static void socket_parse_data(int i, char *buffer) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct sockaddr_in address; + struct JsonNode *json = NULL; + struct JsonNode *options = NULL; + struct clients_t *tmp_clients = NULL; + struct clients_t *client = NULL; + int sd = -1; + int addrlen = sizeof(address); + char *action = NULL, *media = NULL, *status = NULL; + int error = 0, exists = 0; + + if(pilight.runmode == ADHOC) { + sd = sockfd; + } else { + sd = socket_get_clients(i); + getpeername(sd, (struct sockaddr*)&address, (socklen_t*)&addrlen); + } + + if(strcmp(buffer, "HEART") == 0) { + socket_write(sd, "BEAT"); + } else { + if(pilight.runmode != ADHOC) { + logprintf(LOG_DEBUG, "socket recv: %s", buffer); + } + /* Serve static webserver page. This is the only request that is + expected not to be a json object */ +#ifdef WEBSERVER + if(strstr(buffer, " HTTP/")) { + client_webserver_parse_code(i, buffer); + socket_close(sd); + } else if(json_validate(buffer) == true) { +#else + if(json_validate(buffer) == true) { +#endif + json = json_decode(buffer); + if((json_find_string(json, "action", &action)) == 0) { + tmp_clients = clients; + while(tmp_clients) { + if(tmp_clients->id == sd) { + exists = 1; + client = tmp_clients; + break; + } + tmp_clients = tmp_clients->next; + } + if(strcmp(action, "identify") == 0) { + /* Check if client doesn't already exist */ + if(exists == 0) { + if((client = MALLOC(sizeof(struct clients_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + client->core = 0; + client->config = 0; + client->receiver = 0; + client->forward = 0; + client->stats = 0; + client->cpu = 0; + client->ram = 0; + strcpy(client->media, "all"); + client->next = NULL; + client->id = sd; + memset(client->uuid, '\0', sizeof(client->uuid)); + } + if(json_find_string(json, "media", &media) == 0) { + if(strcmp(media, "all") == 0 || strcmp(media, "mobile") == 0 || + strcmp(media, "desktop") == 0 || strcmp(media, "web") == 0) { + strcpy(client->media, media); + } + } else { + strcpy(client->media, "all"); + } + char *t = NULL; + if(json_find_string(json, "uuid", &t) == 0) { + strcpy(client->uuid, t); + } + if((options = json_find_member(json, "options")) != NULL) { + struct JsonNode *childs = json_first_child(options); + while(childs) { + if(strcmp(childs->key, "core") == 0 && + childs->tag == JSON_NUMBER) { + if((int)childs->number_ == 1) { + client->core = 1; + } else { + client->core = 0; + } + } else if(strcmp(childs->key, "stats") == 0 && + childs->tag == JSON_NUMBER) { + if((int)childs->number_ == 1) { + client->stats = 1; + } else { + client->stats = 0; + } + } else if(strcmp(childs->key, "receiver") == 0 && + childs->tag == JSON_NUMBER) { + if((int)childs->number_ == 1) { + client->receiver = 1; + } else { + client->receiver = 0; + } + } else if(strcmp(childs->key, "config") == 0 && + childs->tag == JSON_NUMBER) { + if((int)childs->number_ == 1) { + client->config = 1; + } else { + client->config = 0; + } + } else if(strcmp(childs->key, "forward") == 0 && + childs->tag == JSON_NUMBER) { + if((int)childs->number_ == 1) { + client->forward = 1; + } else { + client->forward = 0; + } + } else { + error = 1; + break; + } + childs = childs->next; + } + } + if(exists == 0) { + if(error == 1) { + FREE(client); + } else { + tmp_clients = clients; + if(tmp_clients) { + while(tmp_clients->next != NULL) { + tmp_clients = tmp_clients->next; + } + tmp_clients->next = client; + } else { + client->next = clients; + clients = client; + } + } + } + socket_write(sd, "{\"status\":\"success\"}"); + } else if(strcmp(action, "send") == 0) { + if(send_queue(json, SENDER) == 0) { + socket_write(sd, "{\"status\":\"success\"}"); + } else { + socket_write(sd, "{\"status\":\"failed\"}"); + } + } else if(strcmp(action, "control") == 0) { + struct JsonNode *code = NULL; + struct devices_t *dev = NULL; + char *device = NULL; + if((code = json_find_member(json, "code")) == NULL || code->tag != JSON_OBJECT) { + logprintf(LOG_ERR, "client did not send any codes"); + } else { + /* Check if a location and device are given */ + if(json_find_string(code, "device", &device) != 0) { + logprintf(LOG_ERR, "client did not send a device"); + /* Check if the device and location exists in the config file */ + } else if(devices_get(device, &dev) == 0) { + char *state = NULL; + struct JsonNode *values = NULL; + + json_find_string(code, "state", &state); + if((values = json_find_member(code, "values")) != NULL) { + values = json_first_child(values); + } + + if(control_device(dev, state, values, SENDER) == 0) { + socket_write(sd, "{\"status\":\"success\"}"); + } else { + socket_write(sd, "{\"status\":\"failed\"}"); + } + } else { + logprintf(LOG_ERR, "the device \"%s\" does not exist", device); + } + } + } else if(strcmp(action, "registry") == 0) { + struct JsonNode *value = NULL; + char *type = NULL; + char *key = NULL; + char *sval = NULL; + double nval = 0.0; + int dec = 0; + if(json_find_string(json, "type", &type) != 0) { + logprintf(LOG_ERR, "client did not send a type of action"); + } else { + if(strcmp(type, "set") == 0) { + if(json_find_string(json, "key", &key) != 0) { + logprintf(LOG_ERR, "client did not send a registry key"); + socket_write(sd, "{\"status\":\"failed\"}"); + } else if((value = json_find_member(json, "value")) == NULL) { + logprintf(LOG_ERR, "client did not send a registry value"); + socket_write(sd, "{\"status\":\"failed\"}"); + } else { + if(value->tag == JSON_NUMBER) { + if(registry_set_number(key, value->number_, value->decimals_) == 0) { + socket_write(sd, "{\"status\":\"success\"}"); + } else { + socket_write(sd, "{\"status\":\"failed\"}"); + } + } else if(value->tag == JSON_STRING) { + if(registry_set_string(key, value->string_) == 0) { + socket_write(sd, "{\"status\":\"success\"}"); + } else { + socket_write(sd, "{\"status\":\"failed\"}"); + } + } else { + logprintf(LOG_ERR, "registry value can only be a string or number"); + socket_write(sd, "{\"status\":\"failed\"}"); + } + } + } else if(strcmp(type, "remove") == 0) { + if(json_find_string(json, "key", &key) != 0) { + logprintf(LOG_ERR, "client did not send a registry key"); + socket_write(sd, "{\"status\":\"failed\"}"); + } else { + if(registry_remove_value(key) == 0) { + socket_write(sd, "{\"status\":\"success\"}"); + } else { + socket_write(sd, "{\"status\":\"failed\"}"); + } + } + } else if(strcmp(type, "get") == 0) { + if(json_find_string(json, "key", &key) != 0) { + logprintf(LOG_ERR, "client did not send a registry key"); + socket_write(sd, "{\"status\":\"failed\"}"); + } else { + if(registry_get_number(key, &nval, &dec) == 0) { + struct JsonNode *jsend = json_mkobject(); + json_append_member(jsend, "message", json_mkstring("registry")); + json_append_member(jsend, "value", json_mknumber(nval, dec)); + json_append_member(jsend, "key", json_mkstring(key)); + char *output = json_stringify(jsend, NULL); + socket_write(sd, output); + json_free(output); + json_delete(jsend); + } else if(registry_get_string(key, &sval) == 0) { + struct JsonNode *jsend = json_mkobject(); + json_append_member(jsend, "message", json_mkstring("registry")); + json_append_member(jsend, "value", json_mkstring(sval)); + json_append_member(jsend, "key", json_mkstring(key)); + char *output = json_stringify(jsend, NULL); + socket_write(sd, output); + json_free(output); + json_delete(jsend); + } else { + logprintf(LOG_ERR, "registry key '%s' doesn't exists", key); + socket_write(sd, "{\"status\":\"failed\"}"); + } + } + } + } + } else if(strcmp(action, "request config") == 0) { + struct JsonNode *jsend = json_mkobject(); + struct JsonNode *jconfig = NULL; + if(client->forward == 1) { + jconfig = config_print(CONFIG_FORWARD, client->media); + } else { + jconfig = config_print(CONFIG_INTERNAL, client->media); + } + json_append_member(jsend, "message", json_mkstring("config")); + json_append_member(jsend, "config", jconfig); + char *output = json_stringify(jsend, NULL); + str_replace("%", "%%", &output); + socket_write(sd, output); + json_free(output); + json_delete(jsend); + } else if(strcmp(action, "request values") == 0) { + struct JsonNode *jsend = json_mkobject(); + struct JsonNode *jvalues = devices_values(client->media); + json_append_member(jsend, "message", json_mkstring("values")); + json_append_member(jsend, "values", jvalues); + char *output = json_stringify(jsend, NULL); + socket_write(sd, output); + json_free(output); + json_delete(jsend); + /* send version packet */ + struct JsonNode *jsend_version = json_mkobject(); + json_append_member(jsend_version, "version", json_mkstring(PILIGHT_VERSION)); + char *output_version = json_stringify(jsend_version, NULL); + socket_write(sd, output_version); + json_free(output_version); + json_delete(jsend_version); + + /* + * Parse received codes from nodes + */ + } else if(strcmp(action, "update") == 0) { + struct JsonNode *jvalues = NULL; + char *pname = NULL; + if((jvalues = json_find_member(json, "values")) != NULL) { + exists = 0; + tmp_clients = clients; + while(tmp_clients) { + if(tmp_clients->id == sd) { + exists = 1; + client = tmp_clients; + break; + } + tmp_clients = tmp_clients->next; + } + if(exists) { + json_find_number(jvalues, "ram", &client->ram); + json_find_number(jvalues, "cpu", &client->cpu); + } + } + if(json_find_string(json, "protocol", &pname) == 0) { + broadcast_queue(pname, json, MASTER); + } + } else { + error = 1; + } + } else if((json_find_string(json, "status", &status)) == 0) { + tmp_clients = clients; + while(tmp_clients) { + if(tmp_clients->id == sd) { + exists = 1; + client = tmp_clients; + break; + } + tmp_clients = tmp_clients->next; + } + if(strcmp(status, "success") == 0) { + logprintf(LOG_DEBUG, "client \"%s\" successfully executed our latest request", client->uuid); + } else if(strcmp(status, "failed") == 0) { + logprintf(LOG_DEBUG, "client \"%s\" failed executing our latest request", client->uuid); + } + } else { + error = 1; + } + json_delete(json); + } + } + if(error == 1) { + client_remove(sd); + socket_close(sd); + } +} + +/* Rewrite code start */ + +static int socket_parse_responses(char *buffer, char *media, char **respons) { + struct JsonNode *json = NULL; + char *action = NULL, *status = NULL; + + if(strcmp(buffer, "HEART") == 0) { + if((*respons = MALLOC(strlen("BEAT")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "BEAT"); + return 0; + } else { + if(pilight.runmode != ADHOC) { + logprintf(LOG_DEBUG, "socket recv: %s", buffer); + } + + if(json_validate(buffer) == true) { + json = json_decode(buffer); + if((json_find_string(json, "status", &status)) == 0) { + if(strcmp(status, "success") == 0) { + if((*respons = MALLOC(strlen("{\"status\":\"success\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"success\"}"); + json_delete(json); + return 0; + } + } + if((json_find_string(json, "action", &action)) == 0) { + if(strcmp(action, "send") == 0) { + if(send_queue(json, ORIGIN_SENDER) == 0) { + if((*respons = MALLOC(strlen("{\"status\":\"success\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"success\"}"); + json_delete(json); + return 0; + } else { + if((*respons = MALLOC(strlen("{\"status\":\"failed\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"failed\"}"); + json_delete(json); + return 0; + } + } else if(strcmp(action, "control") == 0) { + struct JsonNode *code = NULL; + char *device = NULL; + struct devices_t *dev = NULL; + if((code = json_find_member(json, "code")) == NULL || code->tag != JSON_OBJECT) { + logprintf(LOG_ERR, "client did not send any codes"); + json_delete(json); + return -1; + } else { + /* Check if a location and device are given */ + if(json_find_string(code, "device", &device) != 0) { + logprintf(LOG_ERR, "client did not send a device"); + json_delete(json); + return -1; + /* Check if the device and location exists in the config file */ + } else if(devices_get(device, &dev) == 0) { + char *state = NULL; + struct JsonNode *values = NULL; + + json_find_string(code, "state", &state); + if((values = json_find_member(code, "values")) != NULL) { + values = json_first_child(values); + } + + if(control_device(dev, state, values, ORIGIN_SENDER) == 0) { + if((*respons = MALLOC(strlen("{\"status\":\"success\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"success\"}"); + json_delete(json); + return 0; + } else { + if((*respons = MALLOC(strlen("{\"status\":\"failed\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"failed\"}"); + json_delete(json); + return 0; + } + } else { + logprintf(LOG_ERR, "the device \"%s\" does not exist", device); + json_delete(json); + return -1; + } + } + } else if(strcmp(action, "registry") == 0) { + struct JsonNode *value = NULL; + char *type = NULL; + char *key = NULL; + char *sval = NULL; + double nval = 0.0; + int dec = 0; + if(json_find_string(json, "type", &type) != 0) { + logprintf(LOG_ERR, "client did not send a type of action"); + json_delete(json); + return -1; + } else { + if(strcmp(type, "set") == 0) { + if(json_find_string(json, "key", &key) != 0) { + logprintf(LOG_ERR, "client did not send a registry key"); + if((*respons = MALLOC(strlen("{\"status\":\"failed\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"failed\"}"); + json_delete(json); + return 0; + } else if((value = json_find_member(json, "value")) == NULL) { + logprintf(LOG_ERR, "client did not send a registry value"); + if((*respons = MALLOC(strlen("{\"status\":\"failed\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"failed\"}"); + json_delete(json); + return 0; + } else { + if(value->tag == JSON_NUMBER) { +#ifdef PILIGHT_REWRITE + if(registry_update(ORIGIN_MASTER, key, json_mknumber(value->number_, value->decimals_)) == 0) { +#else + if(registry_set_number(key, value->number_, value->decimals_) == 0) { +#endif + if((*respons = MALLOC(strlen("{\"status\":\"success\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"success\"}"); + json_delete(json); + return 0; + } else { + if((*respons = MALLOC(strlen("{\"status\":\"failed\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"failed\"}"); + json_delete(json); + return 0; + } + } else if(value->tag == JSON_STRING) { +#ifdef PILIGHT_REWRITE + if(registry_update(ORIGIN_MASTER, key, json_mkstring(value->string_)) == 0) { +#else + if(registry_set_string(key, value->string_) == 0) { +#endif + if((*respons = MALLOC(strlen("{\"status\":\"success\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"success\"}"); + json_delete(json); + return 0; + } else { + if((*respons = MALLOC(strlen("{\"status\":\"failed\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"failed\"}"); + json_delete(json); + return 0; + } + } else { + logprintf(LOG_ERR, "registry value can only be a string or number"); + if((*respons = MALLOC(strlen("{\"status\":\"failed\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"failed\"}"); + json_delete(json); + return 0; + } + } + } else if(strcmp(type, "remove") == 0) { + if(json_find_string(json, "key", &key) != 0) { + logprintf(LOG_ERR, "client did not send a registry key"); + if((*respons = MALLOC(strlen("{\"status\":\"failed\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"failed\"}"); + json_delete(json); + return 0; + } else { +#ifdef PILIGHT_REWRITE + if(registry_delete(ORIGIN_MASTER, key) == 0) { +#else + if(registry_remove_value(key) == 0) { +#endif + if((*respons = MALLOC(strlen("{\"status\":\"success\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"success\"}"); + json_delete(json); + return 0; + } else { + logprintf(LOG_ERR, "registry value can only be a string or number"); + if((*respons = MALLOC(strlen("{\"status\":\"failed\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"failed\"}"); + json_delete(json); + return 0; + } + } + } else if(strcmp(type, "get") == 0) { + if(json_find_string(json, "key", &key) != 0) { + logprintf(LOG_ERR, "client did not send a registry key"); + if((*respons = MALLOC(strlen("{\"status\":\"failed\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"failed\"}"); + json_delete(json); + return 0; + } else { +#ifdef PILIGHT_REWRITE + if(registry_select_number(ORIGIN_MASTER, key, &nval, &dec) == 0) { +#else + if(registry_get_number(key, &nval, &dec) == 0) { +#endif + struct JsonNode *jsend = json_mkobject(); + json_append_member(jsend, "message", json_mkstring("registry")); + json_append_member(jsend, "value", json_mknumber(nval, dec)); + json_append_member(jsend, "key", json_mkstring(key)); + char *output = json_stringify(jsend, NULL); + if((*respons = MALLOC(strlen(output)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, output); + json_free(output); + json_delete(jsend); + json_delete(json); + return 0; +#ifdef PILIGHT_REWRITE + } else if(registry_select_string(ORIGIN_MASTER, key, &sval) == 0) { +#else + } else if(registry_get_string(key, &sval) == 0) { +#endif + struct JsonNode *jsend = json_mkobject(); + json_append_member(jsend, "message", json_mkstring("registry")); + json_append_member(jsend, "value", json_mkstring(sval)); + json_append_member(jsend, "key", json_mkstring(key)); + char *output = json_stringify(jsend, NULL); + if((*respons = MALLOC(strlen(output)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, output); + json_free(output); + json_delete(jsend); + json_delete(json); + return 0; + } else { + logprintf(LOG_ERR, "registry key '%s' does not exist", key); + if((*respons = MALLOC(strlen("{\"status\":\"failed\"}")+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, "{\"status\":\"failed\"}"); + json_delete(json); + return 0; + } + } + } + } + } else if(strcmp(action, "request config") == 0) { + struct JsonNode *jsend = json_mkobject(); + struct JsonNode *jconfig = NULL; + jconfig = config_print(CONFIG_INTERNAL, media); + json_append_member(jsend, "message", json_mkstring("config")); + json_append_member(jsend, "config", jconfig); + char *output = json_stringify(jsend, NULL); + str_replace("%", "%%", &output); + if((*respons = MALLOC(strlen(output)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, output); + json_free(output); + json_delete(jsend); + json_delete(json); + return 0; + } else if(strcmp(action, "request values") == 0) { + struct JsonNode *jsend = json_mkobject(); +#ifdef PILIGHT_REWRITE + struct JsonNode *jvalues = values_print(media); +#else + JsonNode *jvalues = devices_values(media); +#endif + json_append_member(jsend, "message", json_mkstring("values")); + json_append_member(jsend, "values", jvalues); + char *output = json_stringify(jsend, NULL); + if((*respons = MALLOC(strlen(output)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(*respons, output); + json_free(output); + json_delete(jsend); + json_delete(json); + return 0; + } + } else { + json_delete(json); + return -1; + } + } + } + return -1; +} + +static void *socket_parse_data1(int reason, void *param) { + struct reason_socket_received_t *data = param; + + struct sockaddr_in address; + socklen_t socklen = sizeof(address); + + struct JsonNode *json = NULL; + struct JsonNode *options = NULL; + struct clients_t *tmp_clients = NULL; + struct clients_t *client = NULL; + char *action = NULL, *media = NULL, *status = NULL, *respons = NULL; + char all[] = "all"; + int error = 0, exists = 0, sd = -1; + + if(strlen(data->type) == 0) { + logprintf(LOG_ERR, "socket data misses a socket type"); + } + + if(data->buffer == NULL) { + logprintf(LOG_ERR, "socket message incorrectly formatted"); + return NULL; + } + + sd = data->fd; + getpeername(sd, (struct sockaddr*)&address, &socklen); + + tmp_clients = clients; + while(tmp_clients) { + if(tmp_clients->id == sd) { + exists = 1; + client = tmp_clients; + break; + } + tmp_clients = tmp_clients->next; + } + if(exists == 0) { + media = all; + } else { + media = client->media; + } + + if(json_validate(data->buffer) == true) { + json = json_decode(data->buffer); + if((json_find_string(json, "action", &action)) == 0) { + if(strcmp(action, "identify") == 0) { + /* Check if client doesn't already exist */ + if(exists == 0) { + if((client = MALLOC(sizeof(struct clients_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + client->core = 0; + client->config = 0; + client->receiver = 0; + client->forward = 0; + client->stats = 0; + client->cpu = 0; + strcpy(client->media, "all"); + client->next = NULL; + client->id = sd; + memset(client->uuid, '\0', sizeof(client->uuid)); + } + if(json_find_string(json, "media", &media) == 0) { + if(strcmp(media, "all") == 0 || strcmp(media, "mobile") == 0 || + strcmp(media, "desktop") == 0 || strcmp(media, "web") == 0) { + strcpy(client->media, media); + } + } else { + strcpy(client->media, "all"); + } + char *t = NULL; + if(json_find_string(json, "uuid", &t) == 0) { + strcpy(client->uuid, t); + } + if((options = json_find_member(json, "options")) != NULL) { + struct JsonNode *childs = json_first_child(options); + while(childs) { + if(strcmp(childs->key, "core") == 0 && + childs->tag == JSON_NUMBER) { + if((int)childs->number_ == 1) { + client->core = 1; + } else { + client->core = 0; + } + } else if(strcmp(childs->key, "stats") == 0 && + childs->tag == JSON_NUMBER) { + if((int)childs->number_ == 1) { + client->stats = 1; + } else { + client->stats = 0; + } + } else if(strcmp(childs->key, "receiver") == 0 && + childs->tag == JSON_NUMBER) { + if((int)childs->number_ == 1) { + client->receiver = 1; + } else { + client->receiver = 0; + } + } else if(strcmp(childs->key, "config") == 0 && + childs->tag == JSON_NUMBER) { + if((int)childs->number_ == 1) { + client->config = 1; + } else { + client->config = 0; + } + } else if(strcmp(childs->key, "forward") == 0 && + childs->tag == JSON_NUMBER) { + if((int)childs->number_ == 1) { + client->forward = 1; + } else { + client->forward = 0; + } + } else { + error = 1; + break; + } + childs = childs->next; + } + } + if(exists == 0) { + if(error == -1) { + FREE(client); + } else { + tmp_clients = clients; + if(tmp_clients) { + while(tmp_clients->next != NULL) { + tmp_clients = tmp_clients->next; + } + tmp_clients->next = client; + } else { + client->next = clients; + clients = client; + } + socket_write(sd, "{\"status\":\"success\"}"); + json_delete(json); + return NULL; + } + } + json_delete(json); + return NULL; + /* + * Parse received codes from nodes + */ + } else if(strcmp(action, "update") == 0) { + if(exists == 1) { + struct JsonNode *jvalues = NULL; + char *pname = NULL; + if((jvalues = json_find_member(json, "values")) != NULL) { + exists = 0; + tmp_clients = clients; + while(tmp_clients) { + if(tmp_clients->id == sd) { + exists = 1; + client = tmp_clients; + break; + } + tmp_clients = tmp_clients->next; + } + if(exists == 1) { + json_find_number(jvalues, "cpu", &client->cpu); + } + } + if(json_find_string(json, "protocol", &pname) == 0) { + char *out = MALLOC(strlen(data->buffer)+1); + if(out == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(out, data->buffer); + eventpool_trigger(REASON_FORWARD, reason_forward_free, out); + json_delete(json); + return NULL; + } + } + json_delete(json); + return NULL; + } else if((json_find_string(json, "status", &status)) == 0) { + tmp_clients = clients; + while(tmp_clients) { + if(tmp_clients->id == sd) { + exists = 1; + client = tmp_clients; + break; + } + tmp_clients = tmp_clients->next; + } + if(strcmp(status, "success") == 0) { + logprintf(LOG_DEBUG, "client \"%s\" successfully executed our latest request", client->uuid); + json_delete(json); + return NULL; + } else if(strcmp(status, "failed") == 0) { + logprintf(LOG_DEBUG, "client \"%s\" failed executing our latest request", client->uuid); + json_delete(json); + return NULL; + } + + json_delete(json); + return NULL; + } + } + } + + if(socket_parse_responses(data->buffer, media, &respons) == 0) { + struct reason_socket_send_t *data1 = MALLOC(sizeof(struct reason_socket_send_t)); + if(data1 == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + data1->fd = sd; + if((data1->buffer = MALLOC(strlen(respons)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/; + } + strcpy(data1->buffer, respons); + strncpy(data1->type, data->type, 255); + + eventpool_trigger(REASON_SOCKET_SEND, reason_socket_send_free, data1); + + FREE(respons); + json_delete(json); + return NULL; + } else { + logprintf(LOG_ERR, "could not parse response to: %s", data->buffer); + client_remove(sd); + socket_close(sd); + json_delete(json); + return NULL; + } + json_delete(json); + return NULL; +} +/* Rewrite code end */ + +static void socket_client_disconnected(int i) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + client_remove(socket_get_clients(i)); +} + +void *receivePulseTrain(void *param) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct rawcode_t r; + r.length = 0; + int plslen = 0; +#ifdef _WIN32 + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); +#else + /* Make sure the pilight receiving gets + the highest priority available */ + struct sched_param sched; + memset(&sched, 0, sizeof(sched)); + sched.sched_priority = 70; + pthread_setschedparam(pthread_self(), SCHED_FIFO, &sched); +#endif + + struct hardware_t *hw = (hardware_t *)param; + pthread_mutex_lock(&hw->lock); + hw->running = 1; + + while(main_loop == 1 && hw->receivePulseTrain != NULL && hw->stop == 0) { + if(hw->wait == 0) { + pthread_mutex_lock(&hw->lock); + logprintf(LOG_STACK, "%s::unlocked", __FUNCTION__); + + hw->receivePulseTrain(&r); + plslen = r.pulses[r.length-1]/PULSE_DIV; + if(r.length > 0) { + receive_queue(r.pulses, r.length, plslen, hw->hwtype); + } else if(r.length == -1) { + hw->init(); + sleep(1); + } + + pthread_mutex_unlock(&hw->lock); + } else { + pthread_cond_wait(&hw->signal, &hw->lock); + } + } + hw->running = 0; + return (void *)NULL; +} + +#ifdef PILIGHT_DEVELOPMENT +// void *receiveOOK(void *param) { + // logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + // struct rawcode_t r; + // r.length = 0; + // int plslen = 0, duration = 0; + // struct timeval tp; + // struct timespec ts; + +// #ifdef _WIN32 + // SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); +// #else + // /* Make sure the pilight receiving gets + // the highest priority available */ + // struct sched_param sched; + // memset(&sched, 0, sizeof(sched)); + // sched.sched_priority = 70; + // pthread_setschedparam(pthread_self(), SCHED_FIFO, &sched); +// #endif + + // struct hardware_t *hw = (hardware_t *)param; + // pthread_mutex_lock(&hw->lock); + // hw->running = 1; + + // while(main_loop == 1 && hw->receiveOOK != NULL && hw->stop == 0) { + // if(hw->wait == 0) { + // pthread_mutex_lock(&hw->lock); + // logprintf(LOG_STACK, "%s::unlocked", __FUNCTION__); + // duration = hw->receiveOOK(); + // if(duration > 0) { + // r.pulses[r.length++] = duration; + // if(r.length > MAXPULSESTREAMLENGTH-1) { + // r.length = 0; + // } + // if(duration > hw->mingaplen) { + // if(duration < hw->maxgaplen) { + // plslen = duration/PULSE_DIV; + // } + // /* Let's do a little filtering here as well */ + // if(r.length >= hw->minrawlen && r.length <= hw->maxrawlen) { + // receive_queue(r.pulses, r.length, plslen, hw->hwtype); + // } + // r.length = 0; + // } + // /* Hardware failure */ + // } else if(duration == -1) { + // pthread_mutex_unlock(&hw->lock); + // gettimeofday(&tp, NULL); + // ts.tv_sec = tp.tv_sec; + // ts.tv_nsec = tp.tv_usec * 1000; + // ts.tv_sec += 1; + // pthread_mutex_lock(&hw->lock); + // pthread_cond_timedwait(&hw->signal, &hw->lock, &ts); + // } + // pthread_mutex_unlock(&hw->lock); + // } else { + // pthread_cond_wait(&hw->signal, &hw->lock); + // } + // } + // hw->running = 0; + // return (void *)NULL; +// } +#endif + +static void *receivePulseTrain1(int reason, void *param) { + struct reason_received_pulsetrain_t *data = param; + int plslen = 0; + + if(data->hardware != NULL && data->pulses != NULL && data->length > 0) { +#ifndef PILIGHT_REWRITE + int hwtype = 0; + struct conf_hardware_t *tmp_confhw = conf_hardware; + while(tmp_confhw) { + if(strcmp(tmp_confhw->hardware->id, data->hardware) == 0) { + hwtype = tmp_confhw->hardware->hwtype; + } + tmp_confhw = tmp_confhw->next; + } +#endif +#ifdef PILIGHT_REWRITE + struct hardware_t *hw = NULL; + if(hardware_select_struct(ORIGIN_MASTER, data->hardware, &hw) == 0) { +#endif + plslen = data->pulses[data->length-1]/PULSE_DIV; + if(data->length > 0) { +#ifdef PILIGHT_REWRITE + receive_parse_code(data->pulses, data->length, plslen, hw->hwtype); +#else + receive_queue(data->pulses, data->length, plslen, hwtype); +#endif + } +#ifdef PILIGHT_REWRITE + } +#endif + } + + return (void *)NULL; +} + +void *clientize(void *param) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + adhoc_pending = 1; + struct ssdp_list_t *ssdp_list = NULL; + struct JsonNode *json = NULL; + struct JsonNode *joptions = NULL; + struct JsonNode *jchilds = NULL; + struct JsonNode *tmp = NULL; + char *recvBuff = NULL, *output = NULL; + char *message = NULL, *action = NULL; + char *origin = NULL, *protocol = NULL; + int client_loop = 0, config_synced = 0; + + while(main_loop) { + + if(client_loop == 1) { + logprintf(LOG_NOTICE, "connection to main pilight daemon lost"); + logprintf(LOG_NOTICE, "trying to reconnect..."); + sleep(1); + } + + client_loop = 1; + config_synced = 0; + + ssdp_list = NULL; + if(master_server != NULL && master_port > 0) { + if((sockfd = socket_connect(master_server, master_port)) == -1) { + logprintf(LOG_ERR, "could not connect to pilight-daemon"); + continue; + } + } else if(ssdp_seek(&ssdp_list) == -1) { + logprintf(LOG_NOTICE, "no pilight ssdp connections found"); + continue; + } else { + if((sockfd = socket_connect(ssdp_list->ip, ssdp_list->port)) == -1) { + logprintf(LOG_ERR, "could not connect to pilight-daemon"); + continue; + } + } + if(ssdp_list) { + ssdp_free(ssdp_list); + } + + json = json_mkobject(); + joptions = json_mkobject(); + json_append_member(json, "action", json_mkstring("identify")); + json_append_member(joptions, "receiver", json_mknumber(1, 0)); + json_append_member(joptions, "forward", json_mknumber(1, 0)); + json_append_member(joptions, "config", json_mknumber(1, 0)); + json_append_member(json, "uuid", json_mkstring(pilight_uuid)); + json_append_member(json, "options", joptions); + output = json_stringify(json, NULL); + if(socket_write(sockfd, output) != (strlen(output)+strlen(EOSS))) { + json_free(output); + json_delete(json); + continue; + } + json_free(output); + json_delete(json); + + if(socket_read(sockfd, &recvBuff, 1) != 0 + || strcmp(recvBuff, "{\"status\":\"success\"}") != 0) { + continue; + } + logprintf(LOG_DEBUG, "socket recv: %s", recvBuff); + + json = json_mkobject(); + json_append_member(json, "action", json_mkstring("request config")); + output = json_stringify(json, NULL); + if(socket_write(sockfd, output) != (strlen(output)+strlen(EOSS))) { + json_free(output); + json_delete(json); + continue; + } + json_free(output); + json_delete(json); + + if(socket_read(sockfd, &recvBuff, 0) == 0) { + logprintf(LOG_DEBUG, "socket recv: %s", recvBuff); + if(json_validate(recvBuff) == true) { + json = json_decode(recvBuff); + if(json_find_string(json, "message", &message) == 0) { + if(strcmp(message, "config") == 0) { + struct JsonNode *jconfig = NULL; + if((jconfig = json_find_member(json, "config")) != NULL) { + + pthread_mutex_lock(&config_lock); + gui_gc(); + devices_gc(); +#ifdef EVENTS + rules_gc(); +#endif + registry_gc(); + pthread_mutex_unlock(&config_lock); + + int match = 1; + while(match) { + jchilds = json_first_child(jconfig); + match = 0; + while(jchilds) { + tmp = jchilds; + if(strcmp(tmp->key, "devices") != 0) { + json_remove_from_parent(tmp); + match = 1; + } + jchilds = jchilds->next; + if(match == 1) { + json_delete(tmp); + } + } + } + if(config_parse(jconfig) == EXIT_SUCCESS) { + logprintf(LOG_DEBUG, "loaded master configuration"); + config_synced = 1; + } else { + logprintf(LOG_WARNING, "failed to load master configuration"); + } + } + } + } + json_delete(json); + } + } + + while(client_loop && config_synced) { + if(sockfd <= 0) { + break; + } + if(main_loop == 0) { + client_loop = 0; + break; + } + + int n = socket_read(sockfd, &recvBuff, 1); + if(n == -1) { + sockfd = 0; + break; + } else if(n == 1) { + continue; + } + + logprintf(LOG_DEBUG, "socket recv: %s", recvBuff); + char **array = NULL; + unsigned int z = explode(recvBuff, "\n", &array), q = 0; + for(q=0;qnext; + FREE(tmp_clients); + } + if(clients != NULL) { + FREE(clients); + } + +#ifndef _WIN32 + if(running == 0) { + /* Remove the stale pid file */ + if(access(pid_file, F_OK) != -1) { + if(remove(pid_file) != -1) { + logprintf(LOG_INFO, "removed stale pid_file %s", pid_file); + } else { + logprintf(LOG_ERR, "could not remove stale pid file %s", pid_file); + } + } + } + + if(pid_file_free) { + FREE(pid_file); + } +#endif + eventpool_gc(); +#ifdef WEBSERVER + if(webserver_enable == 1) { + webserver_gc(); + } + if(webserver_root_free == 1) { + FREE(webserver_root); + } +#endif + + if(master_server != NULL) { + FREE(master_server); + } + + datetime_gc(); + ssdp_gc(); + options_gc(); + socket_gc(); + + pthread_mutex_lock(&config_lock); + config_gc(); + pthread_mutex_unlock(&config_lock); + + protocol_gc(); + ntp_gc(); + whitelist_free(); + threads_gc(); +#ifndef _WIN32 + wiringXGC(); +#endif + dso_gc(); + log_gc(); + ssl_gc(); + plua_gc(); + if(configtmp != NULL) { + FREE(configtmp); + } + + uv_stop(uv_default_loop()); + gc_clear(); + FREE(progname); + xfree(); + +#ifdef _WIN32 + WSACleanup(); + if(console == 1) { + FreeConsole(); + } +#endif + + FREE(signal_req); + + return 0; +} + +static void procProtocolInit(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + protocol_register(&procProtocol); + protocol_set_id(procProtocol, "process"); + protocol_device_add(procProtocol, "process", "pilight proc. API"); + procProtocol->devtype = PROCESS; + procProtocol->hwtype = API; + procProtocol->multipleId = 0; + procProtocol->config = 0; + + options_add(&procProtocol->options, 'c', "cpu", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + options_add(&procProtocol->options, 'r', "ram", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); +} + +#ifndef _WIN32 +#pragma GCC diagnostic push // require GCC 4.6 +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif +void registerVersion(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + registry_remove_value("pilight.version"); + registry_set_string("pilight.version.current", (char *)PILIGHT_VERSION); +} +#ifndef _WIN32 +#pragma GCC diagnostic pop // require GCC 4.6 +#endif + +#ifdef _WIN32 +void closeconsole(void) { + log_shell_disable(); + verbosity = oldverbosity; + FreeConsole(); + console = 0; +} + +BOOL CtrlHandler(DWORD fdwCtrlType) { + closeconsole(); + return TRUE; +} + +void openconsole(void) { + DWORD lpMode; + AllocConsole(); + freopen("CONOUT$", "w", stdout); + freopen("CONOUT$", "w", stderr); + HWND hWnd = GetConsoleWindow(); + if(hWnd != NULL) { + GetConsoleMode(hWnd, &lpMode); + SetConsoleMode(hWnd, lpMode & ~ENABLE_PROCESSED_INPUT); + SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE); + HMENU hMenu = GetSystemMenu(hWnd, FALSE); + if(hMenu != NULL) { + RemoveMenu(hMenu, SC_CLOSE, MF_GRAYED); + RemoveMenu(hMenu, SC_MINIMIZE, MF_GRAYED); + RemoveMenu(hMenu, SC_MAXIMIZE, MF_GRAYED); + } + + console = 1; + oldverbosity = verbosity; + verbosity = LOG_DEBUG; + log_level_set(verbosity); + log_shell_enable(); + } +} +#endif + +static void pilight_abort(uv_timer_t *timer_req) { + exit(EXIT_FAILURE); +} + +static void pilight_stats(uv_timer_t *timer_req) { + int watchdog = 1, stats = 1; + // double itmp = 0.0; + settings_find_number("watchdog-enable", &watchdog); + settings_find_number("stats-enable", &stats); + + if(pilight.runmode == STANDALONE) { + registerVersion(); + } + + if(stats == 1) { + double cpu = 0.0; + cpu = getCPUUsage(); + if(watchdog == 1 && (cpu > 90)) { + logprintf(LOG_CRIT, "cpu usage too high %f%%, will abort when this persists", cpu); + } else { + if(watchdog == 1 && stats == 1 && timer_abort_req != NULL) { + uv_timer_stop(timer_abort_req); + uv_timer_start(timer_abort_req, pilight_abort, 9000, -1); + } + + procProtocol->message = json_mkobject(); + struct JsonNode *code = json_mkobject(); + json_append_member(code, "cpu", json_mknumber(cpu, 16)); + logprintf(LOG_DEBUG, "cpu: %f%%", cpu); + json_append_member(procProtocol->message, "values", code); + json_append_member(procProtocol->message, "origin", json_mkstring("core")); + json_append_member(procProtocol->message, "type", json_mknumber(PROCESS, 0)); + struct clients_t *tmp_clients = clients; + while(tmp_clients) { + if(tmp_clients->cpu > 0 && tmp_clients->ram > 0) { + logprintf(LOG_DEBUG, "- client: %s cpu: %f%%", + tmp_clients->uuid, tmp_clients->cpu); + } + tmp_clients = tmp_clients->next; + } + pilight.broadcast(procProtocol->id, procProtocol->message, STATS); + json_delete(procProtocol->message); + procProtocol->message = NULL; + } + } + return; +} + +static void signal_cb(uv_signal_t *handle, int signum) { + logprintf(LOG_INFO, "Interrupt signal received. Please wait while pilight is shutting down"); + + if(config_get_file() != NULL) { + if(pilight.runmode == STANDALONE) { + config_write(1, "all"); + } + } + + main_gc(); + uv_stop(uv_default_loop()); +} + +int start_pilight(int argc, char **argv) { + const uv_thread_t pth_cur_id = uv_thread_self(); + memcpy((void *)&pth_main_id, &pth_cur_id, sizeof(uv_thread_t)); + + struct options_t *options = NULL; + struct ssdp_list_t *ssdp_list = NULL; + + char buffer[BUFFER_SIZE]; + int verbosity_changed = 0, show_default = 0, show_version = 0, show_help = 0; +#ifndef _WIN32 + int f = 0; +#endif + char *stmp = NULL, *args = NULL, *p = NULL; + int port = 0; + + if((progname = MALLOC(16)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(progname, "pilight-daemon"); + + { + int nr = sizeof(signals)/sizeof(signals[0]), i = 0; + if((signal_req = MALLOC(sizeof(uv_signal_t *)*nr)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + for(i=0;i 0) { + for(x=0;xhardware->init) { + if(tmp_confhw->hardware->comtype == COMOOK) { + struct protocols_t *tmp = protocols; + while(tmp) { + if(tmp->listener->hwtype == tmp_confhw->hardware->hwtype) { + if(tmp->listener->maxrawlen > tmp_confhw->hardware->maxrawlen) { + tmp_confhw->hardware->maxrawlen = tmp->listener->maxrawlen; + } + if(tmp->listener->minrawlen > 0 && tmp->listener->minrawlen < tmp_confhw->hardware->minrawlen) { + tmp_confhw->hardware->minrawlen = tmp->listener->minrawlen; + } + if(tmp->listener->maxgaplen > tmp_confhw->hardware->maxgaplen) { + tmp_confhw->hardware->maxgaplen = tmp->listener->maxgaplen; + } + if(tmp->listener->mingaplen > 0 && tmp->listener->mingaplen < tmp_confhw->hardware->mingaplen) { + tmp_confhw->hardware->mingaplen = tmp->listener->mingaplen; + } + if(tmp->listener->rawlen > 0) { + logprintf(LOG_EMERG, "%s: setting \"rawlen\" length is not allowed, use the \"minrawlen\" and \"maxrawlen\" instead", tmp->listener->id); + goto clear; + } + } + tmp = tmp->next; + } + } + } + tmp_confhw = tmp_confhw->next; + } + + settings_find_number("port", &port); + settings_find_number("standalone", &standalone); + + pilight.runmode = STANDALONE; + if(standalone == 0 || (master_server != NULL && master_port > 0)) { + if(master_server != NULL && master_port > 0) { + if((sockfd = socket_connect(master_server, master_port)) == -1) { + logprintf(LOG_NOTICE, "pilight daemon not found @%s, waiting for it to come online", master_server); + } else { + logprintf(LOG_INFO, "a pilight daemon was found, clientizing"); + } + pilight.runmode = ADHOC; + } else if(ssdp_seek(&ssdp_list) == -1) { + logprintf(LOG_INFO, "no pilight daemon found, daemonizing"); + } else { + logprintf(LOG_NOTICE, "a pilight daemon was found @%s, clientizing", ssdp_list->ip); + pilight.runmode = ADHOC; + } + if(ssdp_list) { + ssdp_free(ssdp_list); + } + } + + ssl_init(); + if(pilight.runmode == STANDALONE) { + socket_start((unsigned short)port); + if(standalone == 0) { + ssdp_start(); + } + } + +#ifndef _WIN32 + if(nodaemon == 0) { + daemonize(); + } else { + save_pid(getpid()); + } +#endif + + pilight.running = 1; + + /* Threads are unable to survive forks properly. + * Therefor, we queue all messages until we're + * able to fork properly. + */ + threads_create(&logpth, NULL, &logloop, (void *)NULL); + + pthread_mutexattr_init(&sendqueue_attr); + pthread_mutexattr_settype(&sendqueue_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&sendqueue_lock, &sendqueue_attr); + pthread_cond_init(&sendqueue_signal, NULL); + sendqueue_init = 1; + + pthread_mutexattr_init(&config_attr); + pthread_mutexattr_settype(&config_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&config_lock, &config_attr); + + pthread_mutexattr_init(&recvqueue_attr); + pthread_mutexattr_settype(&recvqueue_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&recvqueue_lock, &recvqueue_attr); + pthread_cond_init(&recvqueue_signal, NULL); + recvqueue_init = 1; + + pthread_mutexattr_init(&bcqueue_attr); + pthread_mutexattr_settype(&bcqueue_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&bcqueue_lock, &bcqueue_attr); + pthread_cond_init(&bcqueue_signal, NULL); + bcqueue_init = 1; + + /* Run certain daemon functions from the socket library */ + socket_callback.client_disconnected_callback = &socket_client_disconnected; + socket_callback.client_connected_callback = NULL; + socket_callback.client_data_callback = &socket_parse_data; + + /* Start threads library that keeps track of all threads used */ + threads_start(); + + /* The daemon running in client mode, register a seperate thread that + communicates with the server */ + if(pilight.runmode == ADHOC) { + threads_register("node", &clientize, (void *)NULL, 0); + } else { + /* Register a seperate thread for the socket server */ + threads_register("socket", &socket_wait, (void *)&socket_callback, 0); + if(standalone == 0) { + threads_register("ssdp", &ssdp_wait, (void *)NULL, 0); + } + } + threads_register("sender", &send_code, (void *)NULL, 0); + threads_register("broadcaster", &broadcast, (void *)NULL, 0); + + tmp_confhw = conf_hardware; + while(tmp_confhw && main_loop) { + if(tmp_confhw->hardware->init) { + if(tmp_confhw->hardware->init() == EXIT_FAILURE) { + if(main_loop == 1) { + logprintf(LOG_ERR, "could not initialize %s hardware module", tmp_confhw->hardware->id); + goto clear; + } else { + break; + } + } + if(main_loop == 1) { + tmp_confhw->hardware->wait = 0; + tmp_confhw->hardware->stop = 0; + if(tmp_confhw->hardware->comtype == COMOOK) { +#ifdef PILIGHT_DEVELOPMENT + // threads_register(tmp_confhw->hardware->id, &receiveOOK, (void *)tmp_confhw->hardware, 0); +#endif + } else if(tmp_confhw->hardware->comtype == COMPLSTRAIN) { + threads_register(tmp_confhw->hardware->id, &receivePulseTrain, (void *)tmp_confhw->hardware, 0); + } else if(tmp_confhw->hardware->comtype == COMAPI) { + threads_register(tmp_confhw->hardware->id, tmp_confhw->hardware->receiveAPI, (void *)tmp_confhw->hardware, 0); + } + } else { + break; + } + } + if(main_loop == 0) { + break; + } + tmp_confhw = tmp_confhw->next; + } + if(main_loop == 0) { + goto clear; + } + + threads_register("receive parser", &receive_parse_code, (void *)NULL, 0); + +#ifdef EVENTS + if(pilight.runmode == STANDALONE) { + /* Register a seperate thread in which the daemon communicates the events library */ + threads_register("events client", &events_clientize, (void *)NULL, 0); + threads_register("events loop", &events_loop, (void *)NULL, 0); + } +#endif + +#ifdef WEBSERVER + settings_find_number("webgui-websockets", &webgui_websockets); + + /* Register a seperate thread for the webserver */ + if(webserver_enable == 1 && pilight.runmode == STANDALONE) { + /* Register a seperate thread in which the webserver communicates the main daemon */ +#ifdef PILIGHT_DEVELOPMENT + if(webgui_websockets == 1) { + threads_register("webserver broadcast", &webserver_broadcast, (void *)NULL, 0); + } +#endif + } else { + webserver_enable = 0; + } +#ifndef PILIGHT_DEVELOPMENT + if(webserver_enable == 1) { + webserver_start(); + } +#endif +#endif + + { + char name[25], *server = NULL; + unsigned int nrservers = 0; + while(1) { + sprintf(name, "ntpserver%d", nrservers); + if(settings_find_string(name, &server) == 0) { + strcpy(ntp_servers.server[nrservers].host, server); + ntp_servers.server[x].port = 123; + nrservers++; + } else { + break; + } + } + ntp_servers.nrservers = nrservers; + ntp_servers.callback = NULL; + if(nrservers > 0) { + ntpsync(); + } + } + +// #ifdef _WIN32 + // threads_register("stats", &pilight_stats, NULL, 0); +// #endif + + timer_stats_req = MALLOC(sizeof(uv_timer_t)); + if(timer_stats_req == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + uv_timer_init(uv_default_loop(), timer_stats_req); + uv_timer_start(timer_stats_req, pilight_stats, 1000, 3000); + return EXIT_SUCCESS; + +clear: + if(nodaemon == 0) { + log_level_set(LOG_NOTICE); + log_shell_disable(); + } + if(main_loop == 1) { + main_gc(); + } + uv_stop(uv_default_loop()); + return EXIT_FAILURE; +} + +#ifdef _WIN32 +#define ID_TRAYICON 100 +#define ID_QUIT 101 +#define ID_SEPARATOR 102 +#define ID_INSTALL_SERVICE 103 +#define ID_REMOVE_SERVICE 104 +#define ID_START 105 +#define ID_STOP 106 +#define ID_WEBGUI 107 +#define ID_CONSOLE 108 +#define ID_ICON 200 +static NOTIFYICONDATA TrayIcon; + +static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { + char buf[200], *service_argv[] = {__argv[0], NULL}; + POINT pt; + HMENU hMenu; + + switch(msg) { + case WM_CREATE: + if(start_pilight(__argc, __argv) == EXIT_FAILURE) { + if(main_loop == 1) { + main_gc(); + } + exit(EXIT_FAILURE); + } + running = 1; + break; + case WM_COMMAND: + switch(LOWORD(wParam)) { + case ID_QUIT: + if(main_loop == 1) { + main_gc(); + } + Shell_NotifyIcon(NIM_DELETE, &TrayIcon); + PostQuitMessage(0); + break; + case ID_STOP: + if(running == 1) { + if(main_loop == 1) { + main_gc(); + } + running = 0; + MessageBox(NULL, "pilight stopped", "pilight :: notice", MB_OK); + } + break; + case ID_CONSOLE: + if(console == 0) { + openconsole(); + } else { + closeconsole(); + } + break; + case ID_START: + if(running == 0) { + main_loop = 1; + if(start_pilight(1, service_argv) == EXIT_FAILURE) { + if(main_loop == 1) { + main_gc(); + MessageBox(NULL, "pilight failed to start", "pilight :: error", MB_OK); + } + } + running = 1; + MessageBox(NULL, "pilight started", "pilight :: notice", MB_OK); + } + break; + case ID_WEBGUI: + if(webserver_http_port == 80) { + snprintf(buf, sizeof(buf), "http://localhost"); + } else { + snprintf(buf, sizeof(buf), "http://localhost:%d", webserver_http_port); + } + ShellExecute(NULL, "open", buf, NULL, NULL, SW_SHOWNORMAL); + break; + } + break; + case WM_USER: + switch(lParam) { + case WM_RBUTTONUP: + case WM_LBUTTONUP: + case WM_LBUTTONDBLCLK: + hMenu = CreatePopupMenu(); + + AppendMenu(hMenu, MF_STRING | MF_GRAYED, ID_SEPARATOR, server_name); + AppendMenu(hMenu, MF_SEPARATOR, ID_SEPARATOR, ""); + AppendMenu(hMenu, MF_STRING | MF_GRAYED, ID_SEPARATOR, ((pilight.runmode == ADHOC) ? "Ad-Hoc mode" : "Standalone mode")); + AppendMenu(hMenu, MF_SEPARATOR, ID_SEPARATOR, ""); + if(pilight.runmode == STANDALONE) { + AppendMenu(hMenu, MF_STRING | (running ? 0 : MF_GRAYED), ID_WEBGUI, "Open webGUI"); + } + if(console == 0) { + AppendMenu(hMenu, MF_STRING, ID_CONSOLE, "Open console"); + } else { + AppendMenu(hMenu, MF_STRING, ID_CONSOLE, "Close console"); + } + AppendMenu(hMenu, MF_SEPARATOR, ID_SEPARATOR, ""); + + // snprintf(buf, sizeof(buf), "pilight is %s", running ? "running" : "stopped"); + + // AppendMenu(hMenu, MF_STRING | MF_GRAYED, ID_SEPARATOR, buf); + // AppendMenu(hMenu, MF_SEPARATOR, ID_SEPARATOR, ""); + + // AppendMenu(hMenu, MF_STRING | (running ? 0 : MF_GRAYED), ID_STOP, "Stop pilight"); + // AppendMenu(hMenu, MF_STRING | (running ? MF_GRAYED : 0), ID_START, "Start pilight"); + + AppendMenu(hMenu, MF_STRING, ID_QUIT, "Exit"); + + GetCursorPos(&pt); + SetForegroundWindow(hWnd); + TrackPopupMenu(hMenu, 0, pt.x, pt.y, 0, hWnd, NULL); + PostMessage(hWnd, WM_NULL, 0, 0); + DestroyMenu(hMenu); + break; + } + break; + } + + return DefWindowProc(hWnd, msg, wParam, lParam); +} + +int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR cmdline, int show) { + pilight.running = 0; + pilight.debuglevel = 0; + + HWND hWnd; + WNDCLASS cls; + MSG msg; +#ifdef HASH + snprintf(server_name, sizeof(server_name), "pilight-daemon %s", HASH); +#else + snprintf(server_name, sizeof(server_name), "pilight-daemon %s", PILIGHT_VERSION); +#endif + memset(&cls, 0, sizeof(cls)); + cls.lpfnWndProc = (WNDPROC)WindowProc; + cls.hIcon = LoadIcon(NULL, IDI_APPLICATION); + cls.lpszClassName = server_name; + + RegisterClass(&cls); + hWnd = CreateWindow(cls.lpszClassName, server_name, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL); + ShowWindow(hWnd, SW_HIDE); + + TrayIcon.cbSize = sizeof(TrayIcon); + TrayIcon.uID = ID_TRAYICON; + TrayIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; + TrayIcon.hIcon = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_ICON), IMAGE_ICON, 16, 16, 0); + TrayIcon.hWnd = hWnd; + snprintf(TrayIcon.szTip, sizeof(TrayIcon.szTip), "%s", server_name); + + TrayIcon.uCallbackMessage = WM_USER; + Shell_NotifyIcon(NIM_ADD, &TrayIcon); + + while(GetMessage(&msg, hWnd, 0, 0) && main_loop == 1) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + return 0; +} +#else +int main(int argc, char **argv) { + pilight.running = 0; + pilight.debuglevel = 0; + + int ret = start_pilight(argc, argv); + if(ret == EXIT_SUCCESS) { + uv_run(uv_default_loop(), UV_RUN_DEFAULT); + uv_walk(uv_default_loop(), walk_cb, NULL); + uv_run(uv_default_loop(), UV_RUN_ONCE); + + while(uv_loop_close(uv_default_loop()) == UV_EBUSY) { + uv_run(uv_default_loop(), UV_RUN_ONCE); + } + // pilight_stats((void *)NULL); + } + return ret; +} +#endif diff --git a/lib/ESPiLight/pilight/debug.c b/lib/ESPiLight/pilight/debug.c new file mode 100644 index 0000000..f13fd8e --- /dev/null +++ b/lib/ESPiLight/pilight/debug.c @@ -0,0 +1,608 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef _WIN32 +#include +#endif + +#include "libs/pilight/core/threads.h" +#include "libs/pilight/core/pilight.h" +#include "libs/pilight/core/network.h" +#include "libs/pilight/core/config.h" +#include "libs/pilight/core/log.h" +#include "libs/pilight/core/options.h" +#include "libs/pilight/core/threads.h" +#include "libs/pilight/core/datetime.h" +#include "libs/pilight/core/ssdp.h" +#include "libs/pilight/core/socket.h" +#include "libs/pilight/core/gc.h" +#include "libs/pilight/core/dso.h" + +#include "libs/pilight/events/events.h" + +#include "libs/pilight/config/hardware.h" + +static unsigned short main_loop = 1; +static unsigned short inner_loop = 1; + +#ifndef PILIGHT_DEVELOPMENT +static uv_signal_t *signal_req = NULL; +static int doSkip = 0; +#endif + +static int normalize(int i, int pulselen) { + double x; + x=(double)i/pulselen; + + return (int)(round(x)); +} + +int main_gc(void) { + log_shell_disable(); + main_loop = 0; + inner_loop = 0; + + datetime_gc(); + ssdp_gc(); +#ifdef EVENTS + events_gc(); +#endif + options_gc(); + socket_gc(); + +#ifndef PILIGHT_DEVELOPMENT + eventpool_gc(); +#endif + config_gc(); + protocol_gc(); + whitelist_free(); + threads_gc(); + +#ifndef _WIN32 + wiringXGC(); +#endif + dso_gc(); + log_gc(); + gc_clear(); + + FREE(progname); + xfree(); + + return EXIT_SUCCESS; +} + +void *receivePulseTrain(void *param) { + int i = 0; + + int pulselen = 0; + int pulse = 0; + + struct rawcode_t r; + struct tm tm; + time_t now = 0; + + struct hardware_t *hw = (hardware_t *)param; + + while(main_loop) { + memset(&r.pulses, 0, sizeof(r.pulses)); + memset(&tm, '\0', sizeof(struct tm)); + pulse = 0; + inner_loop = 1; + + i = 0; + time(&now); + + hw->receivePulseTrain(&r); + if(r.length == -1) { + main_gc(); + break; + } else if(r.length > 0) { + pulselen = r.pulses[r.length-1]/PULSE_DIV; + + if(pulselen > 25) { + for(i=3;i= 2) { + pulse=r.pulses[i]; + break; + } + } + + if(normalize(pulse, pulselen) > 0 && r.length > 25) { + /* Print everything */ + printf("--[RESULTS]--\n"); + printf("\n"); +#ifdef _WIN32 + localtime(&now); +#else + localtime_r(&now, &tm); +#endif + +#ifdef _WIN32 + printf("time:\t\t%s\n", asctime(&tm)); +#else + char buf[128]; + char *p = buf; + memset(&buf, '\0', sizeof(buf)); + asctime_r(&tm, p); + printf("time:\t\t%s", buf); +#endif + printf("hardware:\t%s\n", hw->id); + printf("pulse:\t\t%d\n", normalize(pulse, pulselen)); + printf("rawlen:\t\t%d\n", r.length); + printf("pulselen:\t%d\n", pulselen); + printf("\n"); + printf("Raw code:\n"); + for(i=0;ihardware != NULL && data->pulses != NULL && data->length > 0) { +#ifndef PILIGHT_REWRITE + char *id = NULL; + struct conf_hardware_t *tmp_confhw = conf_hardware; + while(tmp_confhw) { + if(strcmp(tmp_confhw->hardware->id, data->hardware) == 0) { + id = tmp_confhw->hardware->id; + } + tmp_confhw = tmp_confhw->next; + } +#else + if(hardware_select_struct(ORIGIN_MASTER, data->hardware, &hw) == 0) { +#endif + memset(&tm, '\0', sizeof(struct tm)); + pulse = 0; + inner_loop = 1; + + i = 0; + time(&now); + + if(data->length > 0) { + pulselen = data->pulses[data->length-1]/PULSE_DIV; + if(pulselen > 25) { + for(i=3;ilength;i++) { + if((data->pulses[i]/pulselen) >= 2) { + pulse=data->pulses[i]; + break; + } + } + + if(normalize(pulse, pulselen) > 0 && data->length > 25) { + /* Print everything */ + printf("--[RESULTS]--\n"); + printf("\n"); +#ifdef _WIN32 + memcpy(&tm, localtime(&now), sizeof(struct tm)); +#else + localtime_r(&now, &tm); +#endif + +#ifdef _WIN32 + printf("time:\t\t%s", asctime(&tm)); +#else + char buf[128]; + char *p = buf; + memset(&buf, '\0', sizeof(buf)); + #ifdef __sun + asctime_r(&tm, p, sizeof(buf)); + #else + asctime_r(&tm, p); + #endif + printf("time:\t\t%s", buf); +#endif +#ifdef PILIGHT_DEVELOPMENT + printf("hardware:\t%s\n", hw->id); +#else + printf("hardware:\t%s\n", id); +#endif + printf("pulse:\t\t%d\n", normalize(pulse, pulselen)); + printf("rawlen:\t\t%d\n", data->length); + printf("pulselen:\t%d\n", pulselen); + printf("\n"); + printf("Raw code:\n"); + for(i=0;ilength;i++) { + printf("%d ", data->pulses[i]); + } + printf("\n"); + } + } + } +#ifdef PILIGHT_DEVELOPMENT + } +#endif + } + return (void *)NULL; +} + +void *receiveOOK(void *param) { + int duration = 0; + int i = 0; + unsigned int y = 0; + + int recording = 1; + int pulselen = 0; + int bit = 0; + int raw[MAXPULSESTREAMLENGTH] = {0}; + int pRaw[MAXPULSESTREAMLENGTH] = {0}; + int footer = 0; + int pulse = 0; + int rawLength = 0; + int plsdec = 1; + + struct tm tm; + time_t now = 0, later = 0; + + struct hardware_t *hw = (hardware_t *)param; + + while(main_loop) { + memset(&raw, '\0', sizeof(raw)); + memset(&pRaw, '\0', sizeof(pRaw)); + memset(&tm, '\0', sizeof(struct tm)); + recording = 1; + bit = 0; + footer = 0; + pulse = 0; + rawLength = 0; + inner_loop = 1; + pulselen = 0; + + duration = 0; + i = 0; + y = 0; + time(&now); + + while(inner_loop == 1 && hw->receiveOOK != NULL) { + duration = hw->receiveOOK(); + time(&later); + if(difftime(later, now) > 1) { + inner_loop = 0; + } + /* If we are recording, keep recording until the next footer has been matched */ + if(recording == 1) { + if(bit < MAXPULSESTREAMLENGTH) { + raw[bit++] = duration; + } else { + bit = 0; + recording = 0; + } + } + + /* First try to catch code that seems to be a footer. + If a real footer has been recognized, start using that as the new footer */ + if((duration > 5100 && footer == 0) || ((footer-(footer*0.3)duration))) { + recording = 1; + pulselen = (int)duration/PULSE_DIV; + + /* Check if we are recording similar codes */ + for(i=0;i<(bit-1);i++) { + if(!(((pRaw[i]-(pRaw[i]*0.3)) < raw[i]) && ((pRaw[i]+(pRaw[i]*0.3)) > raw[i]))) { + y=0; + recording=0; + } + pRaw[i]=raw[i]; + } + y++; + + /* Continue if we have 2 matches */ + if(y>=1) { + /* If we are certain we are recording similar codes. Save the raw code length. */ + if(footer>0) { + if(rawLength == 0) + rawLength=bit; + } + + if(pulselen > 1000) { + plsdec = 10; + } + /* Try to catch the footer, and the low and high values */ + for(i=0;i 2 && footer > 0) { + if((raw[i]/(pulselen/plsdec)) >= 2) { + pulse=raw[i]; + } + } + if(duration > 5100) { + footer=raw[i]; + } + } + + /* If we have gathered all data, stop with the loop */ + if(footer > 0 && pulse > 0 && rawLength > 0) { + inner_loop = 0; + } + } + bit=0; + } + + fflush(stdout); + } + + if(normalize(pulse, (pulselen/plsdec)) > 0 && rawLength > 25) { + /* Print everything */ + printf("--[RESULTS]--\n"); + printf("\n"); +#ifdef _WIN32 + localtime(&now); +#else + localtime_r(&now, &tm); +#endif + +#ifdef _WIN32 + printf("time:\t\t%s\n", asctime(&tm)); +#else + char buf[128]; + char *p = buf; + memset(&buf, '\0', sizeof(buf)); + asctime_r(&tm, p); + printf("time:\t\t%s", buf); +#endif + printf("hardware:\t%s\n", hw->id); + printf("pulse:\t\t%d\n", normalize(pulse, (pulselen/plsdec))); + printf("rawlen:\t\t%d\n", rawLength); + printf("pulselen:\t%d\n", pulselen); + printf("\n"); + printf("Raw code:\n"); + for(i=0;ihardware->init) { + if(tmp_confhw->hardware->comtype == COMOOK) { + tmp_confhw->hardware->maxrawlen = MAXPULSESTREAMLENGTH; + tmp_confhw->hardware->minrawlen = 25; + tmp_confhw->hardware->maxgaplen = 34000; + tmp_confhw->hardware->mingaplen = 5100; + } + if(tmp_confhw->hardware->init() == EXIT_FAILURE) { + logprintf(LOG_ERR, "could not initialize %s hardware mode", tmp_confhw->hardware->id); + goto clear; + } + if(tmp_confhw->hardware->comtype == COMOOK) { +#ifdef PILIGHT_DEVELOPMENT + // threads_register(tmp_confhw->hardware->id, &receiveOOK, (void *)tmp_confhw->hardware, 0); +#endif + } else if(tmp_confhw->hardware->comtype == COMPLSTRAIN) { + threads_register(tmp_confhw->hardware->id, &receivePulseTrain, (void *)tmp_confhw->hardware, 0); + } + } + tmp_confhw = tmp_confhw->next; + } + + printf("Press and hold one of the buttons on your remote or wait until\n"); + printf("another device such as a weather station has sent new codes\n"); + printf("The debugger will automatically reset itself after one second of\n"); + printf("failed leads. It will keep running until you explicitly stop it.\n"); + printf("This is done by pressing both the [CTRL] and C buttons on your keyboard.\n"); + +#ifdef PILIGHT_DEVELOPMENT + while(main_loop) { + sleep(1); + } +#else + main_loop1(0); +#endif + +clear: +#ifdef PILIGHT_DEVELOPMENT + if(main_loop == 1) { + main_gc(); + } +#else + main_loop1(1); + main_gc(); +#endif + return (EXIT_FAILURE); +} diff --git a/lib/ESPiLight/pilight/docs/make.bat b/lib/ESPiLight/pilight/docs/make.bat new file mode 100644 index 0000000..a5ceec0 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/make.bat @@ -0,0 +1,36 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build +set SPHINXPROJ=pilight + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd diff --git a/lib/ESPiLight/pilight/docs/source/.static/Roboto-Condensed.woff b/lib/ESPiLight/pilight/docs/source/.static/Roboto-Condensed.woff new file mode 100644 index 0000000000000000000000000000000000000000..23198d5886cee2bef85ccb4065294e5439217dcc GIT binary patch literal 18432 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ⅅq+6YR`yjy_u92J0+ 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 literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/.static/Roboto-Condensed.woff2 b/lib/ESPiLight/pilight/docs/source/.static/Roboto-Condensed.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b2726ede04d684c4c2ccf25a76c513af4b91df22 GIT binary patch literal 14512 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 literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/.static/custom.css b/lib/ESPiLight/pilight/docs/source/.static/custom.css new file mode 100644 index 0000000..d0375da --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/.static/custom.css @@ -0,0 +1,212 @@ +body, +h1, h2, h3, +h4, h5, h6, +dt, dl, dd, +blockquote, +td, th, div, +ul, li, ol, +a, p, input, +table, table td, +div.sphinxsidebar .sidebar-toc a, +.sidebar-block h2, +.text-logo, +.admonition-title { + font-family:'Roboto Condensed', sans-serif; +} + +blockquote { + padding: 0px; +} + +.underline { + text-decoration: underline; +} + +h1 { + background-color: #fafafa; +} + +img { + display: block; + width: 100%; +} + +div.sphinxsidebar { + margin-top: 5px; + padding-top: 80px; + background: url('pilight.png') no-repeat top center; +} + +.text-logo { + opacity: 0; + height: 102px; + margin-top: -100px; +} + +blockquote { + background: transparent; + border: 0px; +} + +table.footnote * { + font-size: 12px; +} + +table.footnote .label { + color: #428bca; +} + +table.docutils:not(.footnote) { + border: 0px solid transparent; + min-width: 100%; + margin-bottom: 10px; + display: block; + overflow: auto; +} + +table.docutils:not(.footnote).alt { + display: table; +} + +table.docutils:not(.footnote) img { + display: inline-block; + width: auto; +} + +table.docutils:not(.footnote).alt img { + display: block; + width: 100%; +} + +table.docutils:not(.footnote) td { + border: 0px solid transparent; + white-space: nowrap; + padding: 5px; + vertical-align: middle; +} + +table.docutils:not(.footnote) tr.row-odd td { + background: #fbfbfb; +} + +table.docutils:not(.footnote) tr:first-child td { + background: #fafafa; + font-weight: 800; + border-bottom: 1px solid #aaaaaa; +} + +div[class^='highlight'] { + overflow-x: auto; + margin: 1px 0 24px 0 +} + +div[class^='highlight'] div[class^='highlight'] { + margin: 0; + padding: 0; +} + +table { + border-collapse: collapse; + margin: 0px; + padding: 0px; +} + +pre { + margin: 0px; + padding: 0px; + border: 0px; +} + +.highlighttable pre { + margin: -5px 0px 0px 0px; + padding: 0px; + border-left: 1px solid #eeeeee; +} + +.event-success, +.event-fail { + position: relative; + float: right; + font-size: 16px; + padding: 0px; + margin-top: -1px; + width: 60px; + display: block; +} + +.event-success { + color: green; +} + +.event-fail { + color: red; +} + +.text-logo { + background: #fafafa; +} + +.sidebar-toc ul li a:hover { + background-color: white; + color: red; +} + +.sidebar-toc ul li.current > a, +.sidebar-toc ul li.current > a:hover { + background-color: #ffcc00; + color: #fff; +} + +/* .sidebar-toc .toctree-l1.current > a, */ +/* .sidebar-toc .toctree-l1.current > a:hover { */ + /* background-color: #dedede; */ +/* } */ + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: hidden; +} + +.footnote-reference { + vertical-align: super; + font-size: 10px; +} + +table.field-list { + display: none!important; +} + +.versionchanged { + border-bottom: 1px solid #ffcc00; +} + +.deprecated { + border-bottom: 1px solid #ff0000; +} + +.versionadded { + border-bottom: 1px solid #aaffaa; +} + +.versionchanged, +.versionmodified, +.versionadded, +.deprecated { + color: black; + margin-bottom: 15px; + margin-top: 15px; +} + +.versionmodified *, +.versionchanged *, +.versionadded *, +.deprecated * { + font-style: normal; + padding: 0px; + margin: 0px; +} \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/.static/custom.js b/lib/ESPiLight/pilight/docs/source/.static/custom.js new file mode 100644 index 0000000..a8675f5 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/.static/custom.js @@ -0,0 +1,6 @@ +$(document).ready(function() { + $('.toctree-l1.current:has(.toctree-l2.current) > a').css({ + background: '#bbbbbb', + color: 'white' + }); +}); \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/.static/font.min.css b/lib/ESPiLight/pilight/docs/source/.static/font.min.css new file mode 100644 index 0000000..b547982 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/.static/font.min.css @@ -0,0 +1 @@ +@font-face{font-family:'Roboto Condensed';font-style:normal;font-weight:300;src:local('Roboto Condensed Light'),local('RobotoCondensed-Light'),url(Roboto-Condensed.woff2) format('woff2'),url(Roboto-Condensed.woff) format('woff')} \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/about_manual.rst b/lib/ESPiLight/pilight/docs/source/about_manual.rst new file mode 100644 index 0000000..76b957f --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/about_manual.rst @@ -0,0 +1,11 @@ +About manual +============ + +The pilight manual is a community driven project open for everyone to participate in. The goal is to provide a multi-lingual and professional software manual for each pilight release. All users are invited to add, edit, or replace content to their best effort. If you want to contribute then also add your name in the contributor list below. + +The pilight manual consists of various so called RestructuredText documents which can be found in the `pilight development repository `_. + +These individual documents are transformed using the `Sphinx toolset `_ into the pilight manual. + +| Contributors: +| CurlyMo, pilino1234, wo_rasp \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/adhoc_network.rst b/lib/ESPiLight/pilight/docs/source/adhoc_network.rst new file mode 100644 index 0000000..ef072bc --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/adhoc_network.rst @@ -0,0 +1,322 @@ +Adhoc Network +============= + +- `Introduction`_ +- `Network of Senders and Receivers`_ +- `Network of (Conflicting) Sensors and Relays`_ +- `Stable Mail Daemon`_ + +Introduction +------------ + +The probably least known but advanced feature of pilight is its adhoc network functionality. This basically means that you can create a big network of pilight instances (such as several Raspberry Pis and Windows or Linux computers) working together. A bit like the Borg from Star Trek. + +Consider the following, quite common, user case scenario. We have one Raspberry Pi running pilight with a sender and receiver connected. This single pilight instance controls our remote controlled lights and can retrieve weather information from our weather station and/or from e.g. openweathermap.org. This system has already been set up and works. + +Network of Senders and Receivers +-------------------------------- + +.. only:: html + + .. |fig1h| image:: images/adhoc-network-nodeA+B.svg + .. |fig2h| image:: images/adhoc-network-nodeA+B.svg + + .. rst-class:: alt + + +-----------------+-----------------+ + | |fig1h| | |fig2h| | + +-----------------+-----------------+ + | Image 1: Node A | Image 1: Node B | + +-----------------+-----------------+ + +.. only:: latex + + .. |fig1l| image:: images/adhoc-network-nodeA+B.pdf + .. |fig2l| image:: images/adhoc-network-nodeA+B.pdf + + .. rst-class:: alt + + +-----------------+-----------------+ + | |fig1l| | |fig2l| | + +-----------------+-----------------+ + | Image 1: Node A | Image 1: Node B | + +-----------------+-----------------+ + +The biggest limitation of a home domotica set-up is its range. Of course we can tinker with antennas and such, but that does not always solve the problem. How then, can we reach those corners in our house that the single Raspberry Pi with pilight cannot reach? + +The solution is to create a network of senders and receivers all working together. That is exactly what pilight offers with the AdHoc network functionality. To be able to use this feature, we need (at least) two pilight capable computers. In this example we use two Raspberry Pis to control our devices; a lamp in our bookshelf ("bookshelf") on one side of the house and a lamp in the garden ("gardenlights") on the other side: + +.. code-block:: json + :linenos: + + { + "devices": { + "bookshelf": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 123456 + "unit": 1 + }], + "state": "off" + }, + "gardenlights": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 123456 + "unit": 2 + }], + "state": "off" + } + } + } + +Our settings for Node A will look like this: + +.. code-block:: json + :linenos: + + { + "settings": { + "log-level": 6, + "log-file": "/var/log/pilight-daemon.log", + "webserver-enable": 1, + "webserver-cache": 1, + "webserver-http-port": 5001, + "webserver-root": "/usr/local/share/pilight/", + "whitelist": "" + } + +Now, when we start pilight in debug mode in Node A, we can see this: + +.. code-block:: console + + [Jan 24 15:34:18:191682] pilight-daemon: DEBUG: ssdp sent search + [Jan 24 15:34:18:292486] pilight-daemon: NOTICE: no pilight daemon found, daemonizing + +pilight knows it is (currently) the only instance running inside the home network and will therefore start as a main daemon. However, we notice that we cannot control both our bookshelf lamp and the light in the garden with a single Raspberry Pi with pilight, because of the limited range of the sender and receiver. The solution is to add another Raspberry Pi with pilight on the other side of the house and to connect them to the home network. The settings of Node B will look like this: + +.. code-block:: json + :linenos: + + { + "settings": { + "log-level": 6, + "log-file": "/var/log/pilight-daemon.log", + "whitelist": "" + } + } + +As you can see here, we have removed the **webserver settings**, because a pilight node **will not have its webserver enabled**. Once we start Node B in debug mode, we can see the following: + +.. code-block:: console + + [Jan 24 15:40:44:334028] pilight-daemon: DEBUG: ssdp sent search + [Jan 24 15:40:44:434492] pilight-daemon: NOTICE: a pilight daemon was found @192.168.1.100, clientizing + +pilight has found the first daemon Node A and will connect to it. It will identify as a node and connect to it +(clientizing): + +.. code-block:: console + + [Jan 24 15:40:44:544657] pilight-daemon: DEBUG: socket write succeeded: {"action":"identify","options":{"receiver":1,"forward":1,"config":1},"uuid":"0363-00-00-63-000300"} + [Jan 24 15:40:44:547148] pilight-daemon: DEBUG: socket recv: {"status":"success"} + [Jan 24 15:40:44:547455] pilight-daemon: DEBUG: socket write succeeded: {"action":"request config"} + +The last important part is that Node B will request the configuration from Node A, so that all nodes work with the same configuration definition as the main daemon (Node A). Once a code is received on Node B, it will be synchronised with Node A and Node A will again synchronize it with Node C etc. Whenever you send a code (using a 433MHz remote or the webGUI) it will automatically arrive at Node A, because all clients will always connect to the main daemon. Node A will transfer send request (such as to control a socket) to all connected nodes. So not only Node A will send but also **all other nodes**. + +If the main daemon Node A crashes, the network is down. However, the other nodes will keep running until the main daemon is back up again. They will of course first clear the local configuration and resynchronize it with the daemon (because pilight cannot know what the new configuration will be): + +.. code-block:: console + + [Jan 24 15:45:37:250271] pilight-daemon: DEBUG: garbage collected config library + [Jan 24 15:45:37:250397] pilight-daemon: NOTICE: connection to main pilight daemon lost + [Jan 24 15:45:37:250691] pilight-daemon: NOTICE: trying to reconnect... + [Jan 24 15:45:40:250971] pilight-daemon: DEBUG: ssdp sent search + [Jan 24 15:45:40:350471] pilight-daemon: ERROR: no pilight ssdp connections found + [Jan 24 15:45:40:350758] pilight-daemon: DEBUG: garbage collected config library + [Jan 24 15:45:40:350835] pilight-daemon: NOTICE: connection to main pilight daemon lost + [Jan 24 15:45:40:350913] pilight-daemon: NOTICE: trying to reconnect... + +Once the main daemon is back online (which does not necessarily have to be Node A), all nodes will reconnect: + +.. code-block:: console + + [Jan 24 15:47:50:565899] pilight-daemon: NOTICE: trying to reconnect... + [Jan 24 15:47:53:566159] pilight-daemon: DEBUG: ssdp sent search + [Jan 24 15:40:44:544657] pilight-daemon: DEBUG: socket write succeeded: {"action":"identify","options":{"receiver":1,"forward":1,"config":1},"uuid":"0363-00-00-63-000300"} + [Jan 24 15:40:44:547148] pilight-daemon: DEBUG: socket recv: {"status":"success"} + [Jan 24 15:40:44:547455] pilight-daemon: DEBUG: socket write succeeded: {"action":"request config"} + +This means that when you want to update the configuration with new devices, you only have to restart the main daemon and all nodes will reconnect and resynchronize the new configuration file. This way we can control both the bookshelf lamps in front of our house and the backyard light at the back. + +pilight can also control various other devices like relays and read from sensors for temperature and/or humidity in the same network. We are going to continue on the previous example but add two additional pilight instances. + +Network of (Conflicting) Sensors and Relays +------------------------------------------- + +pilight can also control various other devices like relays and read from sensors for temperature and/or humidity in the *same network*. We are going to continue on the previous example but add two additional pilight instances. + +.. only:: html + + .. |fig3h| image:: images/adhoc-network-nodeC.svg + .. |fig4h| image:: images/adhoc-network-nodeD.svg + + .. rst-class:: alt + + +-----------------+-----------------+ + | |fig3h| | |fig4h| | + +-----------------+-----------------+ + | Image 1: Node C | Image 1: Node D | + +-----------------+-----------------+ + +.. only:: latex + + .. |fig3l| image:: images/adhoc-network-nodeC.pdf + .. |fig4l| image:: images/adhoc-network-nodeD.pdf + + .. rst-class:: alt + + +-----------------+-----------------+ + | |fig3l| | |fig4l| | + +-----------------+-----------------+ + | Image 1: Node C | Image 1: Node D | + +-----------------+-----------------+ + +Node C is meant to add additional coverage in the house to make sure we receive all signals, but it also has a relay connected. We are going to use this relay to turn our television set on and off. The new configuration file will look like this: + +.. code-block:: json + :linenos: + + { + "devices": { + "bookshelf": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 123456 + "unit": 1 + }], + "state": "off" + }, + "television": { + "protocol": [ "relay" ], + "id": [{ + "gpio": 4 + }], + "state": "off" + }, + "gardenlights": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 123456 + "unit": 2 + }], + "state": "off" + } + } + } + +Until now, we did not encounter any issues with our pilight AdHoc network. But what happens when we add another relay (also connected to GPIO 3, but on Node D) to control a heater? Our new configuration file will look like this: + +.. code-block:: json + :linenos: + + { + "devices": { + "heater": { + "protocol": [ "relay" ], + "id": [{ + "gpio": 4 + }], + "state": "off" + }, + "bookshelf": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 123456 + "unit": 1 + }], + "state": "off" + }, + "television": { + "protocol": [ "relay" ], + "id": [{ + "gpio": 4 + }], + "state": "off" + }, + "gardenlights": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 123456 + "unit": 2 + }], + "state": "off" + } + } + } + +As you might see, we have a problem here. As soon as I turn my television set on, I also turn on the heater and when I turn the heater off, the television will go off as well. In this case, pilight has no way of knowing which relay it needs to control so it just switches all of them. So if I set GPIO 3 of Node D to HIGH, GPIO 3 of Node A, B, C will also be set HIGH. pilight offers a solution to this issue by giving all pilight instances a specific UUID. By adding the UUID of a pilight instance in the configuration file, pilight will know exactly what relay it should control. To know what the UUID of our pilight instance is, we can run the program called pilight-uuid. We are going to run this program first to know what the UUID of Node C is by running it on that Raspberry Pi: + +.. code-block:: console + + pi@pilight:~# pilight-uuid + 0338-00-00-38-000300 + +And then on the Raspberry Pi of Node D to see what his UUID is: + +.. code-block:: console + + + pi@pilight:~# pilight-uuid + 0363-00-00-63-000300 + +Now we edit our configuration file incorporating the new UUID values: + +.. code-block:: json + :linenos: + + { + "devices": { + "heater": { + "uuid": "0338-00-00-38-000300", + "protocol": [ "relay" ], + "id": [{ + "gpio": 4 + }], + "state": "off" + }, + "bookshelf": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 123456 + "unit": 1 + }], + "state": "off" + }, + "television": { + "uuid": "0338-00-00-68-000300", + "protocol": [ "relay" ], + "id": [{ + "gpio": 4 + }], + "state": "off" + }, + "gardenlights": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 123456 + "unit": 2 + }], + "state": "off" + } + } + } + +If you now want to turn the television set on, pilight knows that it should only control the relay connected to Node C with the UUID 0338-00-00-38-000300. The same would count for sensors connected to your Raspberry Pi. Just add proper UUID values to them, and pilight will know which sensor is connected to which pilight node. + +Stable Mail Daemon +------------------ + +As you might have noticed, the main daemon is very important in the pilight AdHoc network. Once the main daemon crashes, the whole network will be down. You can easily restore the network by just restarting the main daemon. However, you might also have noticed that a Raspberry Pi is a bit less stable than normal everyday computers and less stable then your regular NAS system. What about running the main daemon on there? You can! + +pilight has been tested on various platforms other than just the Raspberry Pi. It successfully ran on \*BSD and Debian based systems. The only problem is that these consumer mainboards generally does not have GPIO capability. That is not a problem because pilight can just run on these devices when you remove all hardware definitions. diff --git a/lib/ESPiLight/pilight/docs/source/changelog.rst b/lib/ESPiLight/pilight/docs/source/changelog.rst new file mode 100644 index 0000000..2930f92 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/changelog.rst @@ -0,0 +1,216 @@ +Changelog +========= + +.. versionadded:: 8.1.0 + +.. rubric:: Improvements + +- Ported events operators and functions to LUA +- Complete rewritten event parser with: + - (nested) IF/ELSE/THEN support + - case insensitive + - operator precedence compliant + - better error messages + - string concatenation + - calculations inside actions + - etc. + +.. rubric:: bugfixes + +- webGUI: Take `stats-enable` into account +- webGUI: Warp long labels into multiple lines +- webGUI: Keep values together on small screens +- webGUI: Fix dimmer element being too small + +.. versionadded:: 8.0.10 + +.. rubric:: Bugfixes + +- Ignore dst in DATE_FORMAT function to keep input datetime unaffected by dst. + +.. versionadded:: 8.0.9 + +.. rubric:: Bugfixes + +- Properly reset time variable in DATE_FORMAT function to correctly handle dst. + +.. versionadded:: 8.0.8 + +.. rubric:: Bugfixes + +- --debuglevel=2 replaced --debuglevel=1. Now both are allowed. + +.. versionadded:: 8.0.7 + +.. rubric:: Change functionality + +- Openweathermap now requires a personal API key. Until now, a free pilight organization API key was used, but that exceeded the maximum allowed requests per minute. + +.. rubric:: Bugfixes + +- Actually allow --debuglevel=2 to see additional mail logging + +.. versionadded:: 8.0.6 + +.. rubric:: Bugfixes + +- Readded min / max dimlevel in generic_dimmer, but validation is still disabled + +.. versionadded:: 8.0.5 + +.. rubric:: New functionality + +- IPv6 support for all in library clients +- Disable min / max dimlevel in generic_dimmer + +.. rubric:: Internal core changed + +- Callback in mail library when host is not reachable +- Shutdown on more signals + +.. rubric:: Bugfixes + +- Fixed pilight removal with apt +- Calling REST API with socket API +- Prevent using ``.`` as message body +- Segfault due to wrong memory freeing + +.. versionadded:: 8.0.4 + +.. rubric:: New functionality + +- webGUI long labels are wrapped + +.. rubric:: Internal core changed + +- Olsen timezone database is now used for timezone parsing +- 433.92Mhz now respect the UUID setting +- improved datetime, openweathermap, weatherunderground, and sunriseset library + +.. rubric:: Bugfixes + +- config not being saved at shutdown + +.. versionadded:: 8.0.3 + +.. rubric:: Bugfixes + +- webgui labels are word-wrapped into multiple lines on small screens +- webgui takes ``stats-enable`` into account by hiding CPU stats +- memory usage statistics has been removed because they were unreliable +- arctech_dimmer signals sent by pilight are now correctly received by pilight as well + +.. rubric:: webserver, mail and http library + +At this moment the https, mail, and webserver module and the full ``pilight-sha256`` program has been backported from rewrite. The asynchronous I/O library libuv has been added as well as the new SSL and eventpool module. The openweathermap and weather underground protocols have been adapted to use this new code as well as the pushbullet and pushover event actions. + +- pilight now supports a HTTPS webserver which can be configured in the settings: + + .. code-block:: json + + { "webserver-https-port": 5002 } + +- pilight also stopped detecting if the mailserver you have configures requires an SSL connection. To tell pilight about the SSL requirement of a mail server a new setting has been added. Servers that switch from a plain connection to SSL require a 0 value here: + + .. code-block:: json + + { "smtp-ssl": 1 } + +.. versionadded:: 8.0.2 + +.. rubric:: Bugfixes + +- wiringX log was scrambled + +.. versionadded:: 8.0.1 + +.. rubric:: Bugfixes + +- gpio_switch protocol that stops working after a while +- pilight not starting at boottime + +.. versionadded:: 8.0 + +.. note:: + + Not all changes from development where ported to stable. Especially the rules can break when upgraded from the latest development to the latest stable. Porting the new eventing code is in the planning real soon, but until then, just stick with development. + +.. rubric:: Breaking changes + +- The PHP parsing functionality has been removed. + +.. rubric:: New functionality + +- Proper REST API through the webserver. See `Development -> API `_. + +- Protocol names cannot be used anymore as configuration device names. + +- Supporting flashing the Arduino Uno. + +- Added TFA 30.X weather stations. FIXME +- Added Quigg GT-9000 protocol. See FIXME. +- Added Secudo / FlammEx smoke sensor. FIXME. +- Added Eurodomest protocol. `Protocols -> 433.92Mhz -> Switches -> Eurodomest `_ +- Added TCM 218943 protocol `Protocols -> 433.92Mhz -> Weather -> TCM `_ + +- Allow event triggers based on received actions. See `Eventing -> Syntax `_. +- Added the ISNOT operator. See `Eventing -> Operators `_ + +- Added webGUI support for illuminance sensor. + +- Allow filtering ``pilight-receive`` protocols. See `Programs -> pilight-receive `_ +- Split pilight daemon debug and foreground functionality in two parameters. See `Programs -> pilight-daemon `_ + +- Removed internal wiringX integration and changes to shared library linking. +- Validate duplicate 433gpio GPIO for both sender and receiver value. + +- Default pilight paths have changes. +- The tzdata.json file has been deprecated and moved internally into pilight. + +.. rubric:: Bugfixes + +- XBMC and LIRC protocol. Properly try to reconnect when connection is lost. +- X10 Switch. The same unit was sent for units 8 and 9. +- Beamisch Switch. Resend the beamisch switch 10 times again. +- Arctech Switch. More precise pulse lengths. +- EV1527 Switch. Allow a bigger ID range. +- Conrad RSL switch. Add learn parameter for device learning. +- RSL366 Switch. Better protocol validation for less false positives. +- Arctech Dusk. Fixed swapped states. +- Clarus Switch. Prevent crashes on too long ID parameter. +- Alecto WX500 Weather Station. Fixed negative temperatures. +- Alecto WS1700 Weather Station. Better protocol implementation according to specsheet. +- Arctech Old Switch. Better protocol validation for less false positives. +- Quigg GT-1000 Switch. Added support more group codes. +- Elro 800 Switch. Support for more systemcodes. +- Teknihall Weather Station. Fixed negatives temperature values. +- Dim action. IN timeout could take too long. +- ``smtp-user`` setting. Any character is now allowed. +- ``smtp-email`` setting. Better email address validation. +- pilight startup. Start pilight after network at boottime. + +.. rubric:: Internal core changes + +- Frequency properties are made hardware module independent. +- Added file_get_contents function. +- Updated webGUI jQuery and moment library . +- Better internal pushbullet and pushbullet action argument parsing. +- Better binary to decimals and vice versa parsing. +- Support for AArch64 compilation. +- Send version after request values API call. +- Differentiate JSON types using bitmasks. +- Better mail library status checking. +- Added python3 client example. + +- Various typo fixes. + +- Fixed shared and static library linking. +- Fixed unused protocol repeat parameter. +- Fixed various uninitialized fields or incomplete buffer initializations. +- Fixed memory leaks in Dim, Label, and Switch action. +- Fixed inconsistent min and max dimlevel parsing in generic dimmer. +- Fixed webGUI dimmer display bugs. +- Fixed possible deadlock in datetime library. +- Fixed various buffer overflows in protocols. +- Fixed lm75, lm76, and bmp180 i2c-patch parsing. +- Fixed ntp time library bugs. diff --git a/lib/ESPiLight/pilight/docs/source/conf.py b/lib/ESPiLight/pilight/docs/source/conf.py new file mode 100644 index 0000000..ec36f4b --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/conf.py @@ -0,0 +1,173 @@ +# -*- coding: utf-8 -*- +# +# pilight documentation build configuration file, created by +# sphinx-quickstart on Tue Sep 12 20:56:47 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import sphinx_bootstrap_theme +import guzzle_sphinx_theme +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + +def setup(app): + app.add_stylesheet('font.min.css') + app.add_stylesheet('custom.css') + app.add_javascript('custom.js') + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +locale_dirs = ['.locale/'] +gettext_compact = False + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['.templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'pilight' +copyright = u'2017, pilight' +author = u'pilight contributors' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'7.0' +# The full version, including alpha/beta/rc tags. +release = u'7.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = [] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'github' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'guzzle_sphinx_theme' +html_theme_path = guzzle_sphinx_theme.html_theme_path() + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +html_theme_options = { + "project_nav_name": " ", +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['.static'] + +html_favicon = 'images/favicon.ico' +html_logo = 'images/pilight.png' +html_show_sourcelink = False; +html_show_sphinx = False; + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'pilightdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'pilight.tex', u'pilight documentation', + u'pilight contributors', 'howto'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'pilight', u'pilight Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'pilight', u'pilight Documentation', + author, 'pilight', 'One line description of project.', + 'Miscellaneous'), +] + + + diff --git a/lib/ESPiLight/pilight/docs/source/configuration/devices.rst b/lib/ESPiLight/pilight/docs/source/configuration/devices.rst new file mode 100644 index 0000000..6defc04 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/configuration/devices.rst @@ -0,0 +1,198 @@ +Devices +======= + +* `Introduction`_ +* `Structure`_ +* `Device Types`_ +* `Multiple IDs`_ +* `Multiple Protocols Per Device`_ +* `Overriding Protocol Settings`_ + +Introduction +------------ + +.. warning:: + + Make sure pilight is not running before editing your configuration or else all changes will be lost. + +.. note:: + + This page will only explain the device set-up basics with some protocols as an example. To see the full + list of supported protocols and their respective syntax read the protocol pages of this manual. + +pilight can be ran with or without a fixed devices set-up. The advantage of a fixed device set-up is that pilight can use them in events and for external clients such as the built-in webGUI. Status updates will automatically be updated just like information from weather information. + +The protocol names outputted by *pilight-receive* are not (always) the same as the protocols used in the device setup. The reason for this, is that various brands use the same underlying protocol. The arctech_switch protocol is used by at least five different brands. So there is the same underlying protocol for each of these brands. + +#. Check the brand of the device you want to define in the device set-up. +#. Check if your device is recognize in *pilight-receive*. +#. Check the protocol pages to see if your device is listed and what the device syntax is. + +If your specific brand / device is not listed, but *pilight-receive* does show output, then contact us so we can add the device to the specific protocol supported brand list. + +Structure +--------- + +.. code-block:: json + :linenos: + + { + "devices": { + "television": { + "protocol": [ "relay" ], + "id": [{ + "gpio": 3 + }], + "state": "off" + }, + "bookShelfLight": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 123456, + "unit": 1 + }], + "state": "off" + } + } + } + +Each device you want to set-up in pilight has its own entry. In this example we have set-up two devices. One GPIO connected Relay that turns the television on and off and KlikAanKlikUit controlled bookShelfLight. Whenever an action has been performed or received by pilight the registered device will update itself when necessary. So, would you in this example, turn the bookShelfLight to on with a KlikAanKlikUit remote, pilight will also record this, and change the status of the bookShelfLight to on. Of course, a receiver needs to be connected for this to work. Each device has its own specific syntax but its basic properties remain the same. That is: + +#. name +#. protocol +#. id + +To know the syntax of the specific protocol you want to use you can refer to the protocols description found in the protocol section of this manual. + +.. note:: changed in version 8 + + Protocol names cannot be used as device names. + +Device Types +------------ + +pilight can work with various device types. Each device type has different functionality and requirements, however, they sometimes use the same code characteristics. One example are the KlikAanKlikUit switches, dimmers, doorbells, and screens. In pilight a KlikAanKlikUit code can show up like this: + +.. code-block:: console + + { + "origin": "sender", + "protocol": "arctech_switches", + "code": { + "id": 100, + "unit": 15, + "state": off + }, + "repeat": 1, + } + { + "origin": "sender", + "protocol": "arctech_dimmers", + "code": { + "id": 100, + "unit": 15, + "state": off + }, + "repeat": 1, + } + { + "origin": "sender", + "protocol": "arctech_screens", + "code": { + "id": 100, + "unit": 15, + "state": up + }, + "repeat": 1, + } + +As you can see, a single KlikAanKlikUit command was interpreted as three different devices. You need to choose carefully which device actually sent the code to make sure how to define it in the device set-up. The difference is that a dimmer will have a slider and an on/off button, a switch will just show an on/off button, and a screen will have momentary up/down buttons. Defining a screen as a dimmer is possible but does not give you the ability to control the dimmer as a dimmer from the different GUIs. + +Multiple IDs +------------ + +Each protocol needs to have at least one id defined so pilight knows what device has been controlled. However, it is possible that you have multiple KlikAanKlikUit remotes that control the same KlikAanKlikUit switch. In that case, you can define multiple id's to your devices. In case of a KlikAanKlikUit switch: + +.. code-block:: json + :linenos: + + { + "devices": { + "bookShelfLight": { + "protocol": ["kaku_switch"], + "id": [{ + "id": 1234, + "unit": 0 + }, + { + "id": 2345, + "unit": 1 + }], + "state": "off" + } + } + } + +Whenever one of these id's have been received, pilight will update the device accordingly. + +Multiple Protocols Per Device +----------------------------- + +pilight supports multiple protocols per device. The new KlikAanKlikUit switches are backwards compatible with the old KlikAanKlikUit remotes. This means that pilight needs to check both protocols to know whether a device state was changed. In case of a KlikAanKlikUit dimmer, pilight needs to check three protocols. To add multiple protocols per device, the device must contain at least one ID for each protocol and all protocol values should be present. An example: + +.. code-block:: json + :linenos: + + { + "devices": { + "bookShelfLight": { + "protocol": [ "kaku_dimmer", "kaku_switch", "kaku_old" ], + "id": [{ + "id": 123456, + "unit": 1 + }, + { + "id": 10, + "unit": 5 + }], + "state": "off", + "dimlevel": 10 + } + } + } + +There are a few important steps when you use multiple protocols in a single device setup. + +1. The kaku_dimmer and kaku_switch protocols both share the same id specifications, but the kaku_old protocol can only have an id < 16 and a unit < 33. The id set for the kaku_switch and kaku_dimmer is thereby not supported by the kaku_old protocol. Therefore an additional id must be added to match the requirements by kaku_old. + +2. Because we have a dimmer and switch protocol combined we must have a dimlevel and state value present in the device. + +3. The kaku_dimmer is the first protocol defined. This is important, because pilight will now interpret this device as a dimmer instead of a switch. Would the kaku_dimmer protocol be defined as second or third protocol, then the device would be interpreted as a switch. + +Overriding Protocol Settings +---------------------------- + +Each protocol has some specific settings you can override in your device set-up. What these settings are, can be found in the protocols section of this manual. These settings can change the internal functioning of a protocol or the values a protocol can take. These settings are device specific. + +For example, we do not want to have our dimmer to go to a full dimlevel, because then it is to bright. But we also do not want it to go to its minimum dimlevel, because then it is to dim. In that case, you can override the minimum and maximum values of the dimmer: + +.. code-block:: json + :linenos: + + { + "devices": { + "bookShelfLight": { + "protocol": [ "kaku_dimmer" ], + "id": [{ + "id": 1234, + "unit": 1 + }], + "state": "on", + "dimlevel": 3, + "dimlevel-minimum": 3, + "dimlevel-maximum": 10 + } + } + } + +Of course, the maximum dimlevels can still be overridden by the KlikAanKlikUit remote, but pilight will make sure it cannot control the dimmers below or above these dimlevels within pilight. \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/configuration/example.rst b/lib/ESPiLight/pilight/docs/source/configuration/example.rst new file mode 100644 index 0000000..39d1385 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/configuration/example.rst @@ -0,0 +1,58 @@ +Example +======= + +.. warning:: + + Make sure pilight is not running before editing your configuration or else all changes will be lost. + +.. code-block:: json + :linenos: + + { + "devices": { + "tv": { + "protocol": ["relay"], + "id": [{ + "gpio": 3 + }], + "state": "off", + "default-state": "off" + } + }, + "rules": { + "lightswitch": { + "rule": "IF tv.state IS on THEN switch DEVICE tv TO off", + "active": 1 + } + }, + "gui": { + "tv": { + "name": "Television", + "group": ["Living"], + "media": ["all"], + "readonly": 0 + } + }, + "settings": { + "log-level": 6, + "pid-file": "/var/run/pilight.pid", + "log-file": "/var/log/pilight.log", + "webserver-enable": 1, + "webserver-http-port": 5001, + "webserver-cache": 1, + "webserver-root": "/usr/local/share/pilight" + }, + "hardware": { + "433gpio": { + "sender": 0, + "receiver": 1 + } + }, + "registry": { + "pilight": { + "version": { + "current": "6.0" + } + } + } + } \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/configuration/gui.rst b/lib/ESPiLight/pilight/docs/source/configuration/gui.rst new file mode 100644 index 0000000..a1d8b03 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/configuration/gui.rst @@ -0,0 +1,90 @@ +GUI +=== + +- `Introduction`_ +- `Elements`_ +- `Group`_ + +Introduction +------------ + +.. warning:: + + Make sure pilight is not running before editing your configuration or else all changes will be lost. + + +pilight has an extensive API that allows developers to create custom graphical user interfaces (GUI). A pilight GUI is actually nothing more then a presentation of the devices a user wants to easily control. This means that a GUI does not have to show all devices added to the device set-up and that not all GUIs have to show the same devices. You can have a more compact GUI for a small screen such as a mobile phone or a more extensive GUI for you computer screen. + +Elements +-------- + +Remember the device set-up we created earlier. + +.. code-block:: json + :linenos: + + { + "devices": { + "television": { + "protocol": [ "relay" ], + "id": [{ + "gpio": 3 + }], + "state": "off" + }, + "bookShelfLight": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 123456, + "unit": 1 + }], + "state": "off" + } + } + } + +To present one of these two devices to our GUI, we add the to the GUI list like this: + +.. code-block:: json + :linenos: + + { + "gui": { + "television": { + "name": "Television", + "group": [ "Living" ], + "media": [ "web" ], + "readonly": 0 + }, + "bookShelfLight": { + "name": "Book Shelve", + "group": [ "Library" ], + "media": [ "mobile" ], + "readonly": 1 + } + } + } + +Each device you want to add to the GUI has its own entry. You can only add devices that are also registered in the device set-up, but of course, you do not have to present all those devices to the GUIs. There are some fixed fields that are common for all GUI elements: + +- name + The display name inside the GUI. +- group + See below. +- media + Which GUIs should display this devices: mobile, web, desktop, all (default) +- readonly + Should the GUI element be readonly? Default is 0. +- confirm + Should the GUI ask for confirmation before switching the device? Default is 0. + +To know what the additional options are for the specific protocols, check the protocol section of this manual. + +Group +----- + +The group attribute allows you to group GUI elements. pilight allows you to define multiple groups but it is dependent on the GUI how it will interpret these groups. Currently, the pilight webGUI and the Android App Illumina only parse the first group and will create different tabs for each one of them. However, possible implementation could be: + +- Assign element to multiple groups +- Create a treeview of descending parents / children +- Create pages with grouped widgets \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/configuration/hardware.rst b/lib/ESPiLight/pilight/docs/source/configuration/hardware.rst new file mode 100644 index 0000000..06a86bb --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/configuration/hardware.rst @@ -0,0 +1,85 @@ +Hardware +======== + +- `Disabled`_ +- `433.92Mhz`_ + - `433lirc`_ + - `433gpio`_ + - `433nano`_ + +Introduction +------------ + +.. warning:: + + Make sure pilight is not running before editing your configuration or else all changes will be lost. + +Since pilight 3.0 the feature to send and receive from multiple hardware modules has been introduced. This means you can control various different frequencies at the same time. However, only one module per frequency is supported. Each hardware module has its own syntax as listed below. + +Disabled +-------- + +.. code-block:: json + :linenos: + + { + "hardware": { + "none": { } + } + } + +433.92Mhz +--------- + +.. _433lirc: +.. rubric:: Lirc Kernel Module + +.. code-block:: json + :linenos: + + { + "hardware": { + "433lirc": { + "socket": "/dev/lirc0" + } + } + } + +.. _433gpio: +.. rubric:: Direct GPIO Access + +.. code-block:: json + :linenos: + + { + "hardware": { + "433gpio": { + "sender": 0, + "receiver": 1 + } + } + } + +The default configuration to be used with the pilight PCB. When using custom wiring, refer to http://www.wiringx.org for the pin numbering of the various supported devices. If you want to disable the sender or receiver pin, set it to +-1. + +.. versionchanged:: 8.0 + +You must now specify which GPIO platform pilight is running on. Refer to the settings page for more information. + +.. _433nano: +.. rubric:: pilight USB Nano + +.. code-block:: json + :linenos: + + { + "hardware": { + "433nano": { + "comport": "/dev/ttyUSB0" + } + } + } + +The comport value needs to correspond to a valid COM device on your platform. On Windows this value is generally formatted as COM1, on Linux as /dev/ttyUSB0, and on FreeBSD /dev/cuau0. + diff --git a/lib/ESPiLight/pilight/docs/source/configuration/index.rst b/lib/ESPiLight/pilight/docs/source/configuration/index.rst new file mode 100644 index 0000000..cd2a983 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/configuration/index.rst @@ -0,0 +1,17 @@ +.. raw:: latex + + \newpage + +Configuration +============= + +.. toctree:: + :maxdepth: 1 + + devices + rules + gui + settings + hardware + registry + example \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/configuration/registry.rst b/lib/ESPiLight/pilight/docs/source/configuration/registry.rst new file mode 100644 index 0000000..1d4aada --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/configuration/registry.rst @@ -0,0 +1,8 @@ +Registry +======== + +.. warning:: + + Make sure pilight is not running before editing your configuration or else all changes will be lost. + +Besides all the fixed configuration objects, pilight also allows developers to use the integrated registry. This registry allows developers to store information that can later be retrieved when reading the configuration. pilight itself will for example store its current version and available version in the registry and the pilight webGUI will store additional settings in there as well. You are therefore advised to leave the registry untouched so all additional information created by the different webGUIs is not lost. \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/configuration/rules.rst b/lib/ESPiLight/pilight/docs/source/configuration/rules.rst new file mode 100644 index 0000000..07f31bd --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/configuration/rules.rst @@ -0,0 +1,30 @@ +Rules +===== + +.. warning:: + + Make sure pilight is not running before editing your configuration or else all changes will be lost. + +Since pilight version 6, eventing has been introduced. To use events, you need to first define rules inside the pilight configuration. + +The basic pilight rule structure for the configuration looks like this: + +.. code-block:: json + :linenos: + + { + "rules": { + "rule_name": { + "rule": "IF switch.state IS on THEN switch DEVICE switch.state TO off", + "active": 1 + } + } + } + +As you can see, a rules object consists of various elements: + +#. Each rule is placed in its own object with a unique identifier. +#. Each rule consists of the actual rule placed in the rule field. +#. Each rule consists of an active field that tells pilight if the rule is active or not. + +You can of course define as many rules as you like. \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/configuration/settings.rst b/lib/ESPiLight/pilight/docs/source/configuration/settings.rst new file mode 100644 index 0000000..07f0ef6 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/configuration/settings.rst @@ -0,0 +1,691 @@ +Settings +======== + +- `Introduction`_ +- `Core`_ + - `port`_ + - `standalone`_ + - `pid-file`_ + - `pem-file`_ + - `log-file`_ + - `log-level`_ + - `whitelist`_ + - `stats-enable`_ + - `watchdog-enable`_ + - `gpio-platform`_ +- `Webserver`_ + - `webgui-websockets`_ + - `webserver-authentication`_ + - `webserver-cache`_ + - `webserver-enable`_ + - `webserver-http-port`_ + - `webserver-https-port`_ + - `webserver-root`_ + - `webserver-user`_ +- `SMTP`_ + - `smtp-sender`_ + - `smtp-user`_ + - `smtp-password`_ + - `smtp-host`_ + - `smtp-port`_ + - `smtp-ssl`_ +- `Miscellaneous`_ + - `ntp-servers`_ +- `Firmware`_ + - `firmware-gpio-miso`_ + - `firmware-gpio-mosi`_ + - `firmware-gpio-reset`_ + - `firmware-gpio-sck`_ +- `Module Paths`_ + - `action-root`_ + - `function-root`_ + - `hardware-root`_ + - `operator-root`_ + - `protocol-root`_ + +Introduction +------------ + +.. warning:: + + Make sure pilight is not running before editing your configuration or else all changes will be lost. + +The way pilight functions can be altered by changing various settings. All pilight settings will be described in this chapter grouped by their respective category. + +Core +---- + +.. _port: +.. rubric:: port + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "port": 5000 } + +By default, pilight uses a random port for its socket server. Use the port setting if you want to set this to a fixed port. + +.. _standalone: +.. rubric:: standalone + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "standalone": 0 } + +When pilight starts, it will first check if there are other instances running inside the same network. If it does, it will connect to the other pilight instance and will join or create the AdHoc network. If you want to force pilight into running as a standalone daemon, you can set the standalone setting to 1. When running pilight in standalone mode, the SSDP server will also be disabled. This means that other pilight clients will not be able to discover it using SSDP. + +.. _pid-file: +.. rubric:: pid-file + +.. note:: + + Linux and \*BSD + +.. code-block:: json + :linenos: + + { "pid-file": "/var/run/pilight.pid" } + +The pid-file is used by pilight to save the process id number of the pilight-daemon. pilight itself uses this information as one of the ways to determine if pilight is already running or not. This setting must contain a valid path to store the pid-file. + +.. _pem-file: +.. rubric:: pem-file + +.. note:: + + Linux and \*BSD + +.. code-block:: json + :linenos: + + { "pem-file": "/etc/pilight/pilight.pem" } + +.. note:: + + Windows + +.. code-block:: json + :linenos: + + { "pem-file": "c:/pilight/pilight.pem" } + +The pem-file is used by pilight for the secure https webserver. Using the default pilight pemfile makes the secure webserver still insecure, so users are adviced to generate a custom pem file. + +.. code-block:: console + + pi@pilight ~# openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout pilight.key -out pilight.crt -subj "/CN=pilight.org" -days 3650 + pi@pilight ~# cat pilight.key pilight.crt > /etc/pilight/pilight.pem + +.. _log-file: +.. rubric:: log-file + +.. note:: + + Linux and \*BSD + +.. code-block:: json + :linenos: + + { "log-file": "/var/log/pilight.log" } + +.. note:: + + Windows + +.. code-block:: json + :linenos: + + { "log-file": "c:/pilight/pilight.log" } + +The log-file is used by pilight to various information gathered while pilight is running. This information can be used to debug errors or gather information about triggered actions. This setting must contain a valid path to store the log-file. + +.. _log-level: +.. rubric:: log-level + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "log-level": 4 } + +The log-level tells pilight what messages it should log into the log-file. The higher the log-level the more messages are logged into the log-file. The highest log-level is 6 and the lowest is 0. These log-levels correspond to the following log types: + +0 = emergency, 1 = alert, 2 = critical, 3 = , 4 = warning, +5 = notification, 6 = information + +.. _whitelist: +.. rubric:: whitelist + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "whitelist": [ "*.*.*.*" ] } + +All software able to use socket connections can communicate to pilight. Such software can be *pilight-receive*, a user visiting the webGUI, or external pilight plugins such a provided by FHEM. If you want to limit the computers in your network that can connect to pilight, you set up a whitelist. This setting should contain a list of valid IPv4 addresses that are allowed to connect to pilight. All other IPs will be blocked. If you want to allow IPv4 ranges, you can specify them by using wildcards. For example, if we want to allow all IP addresses ranging from 192.168.1.0 to 192.168.1.254 we can add the IP address 192.168.1.* to the list. If we want to allow all IP addresses ranging from 10.0.0.0 to 10.0.254.254 we can add the IP address 10.0.*.* to the list. Each whitelist entry should contain a valid IPv4 address with or without using wildcards. + +.. _stats-enable: +.. rubric:: stats-enable + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "stats-enable": 1 } + +pilight monitors its own CPU and RAM resource usage. This information can be shared with external clients and is shared by default with the websockets connections. If you want to disable the display of the CPU and RAM statistics and/or want to disable the communication of these statistics over the websocket connection you can set this to 0. This setting can be either 0 or 1. + +.. _watchdog-enable: +.. rubric:: watchdog-enable + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "watchdog-enable": 1 } + +pilight monitors its own CPU and RAM resource usage. This information is used to shutdown or terminate pilight when it uses too much CPU or RAM. If want to disable this watchdog feature and therefor the automatic termination of pilight when needed, you can set this setting to 0. This setting can be either 0 or 1. + +.. _gpio-platform: +.. rubric:: gpio-platform + +.. versionadded:: 8.0 + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "gpio-platform": "raspberrypi2" } + +pilight can be ran on various GPIO compatible platforms. However, it is impossible to reliably distinguish them all. Therefor, you must specify on which platform you are running pilight. Under the hood, pilight uses the wiringX library to interface with the GPIO of your platform. Only those platforms that are supported by wiringX are also supported by pilight. A full and recent list of supported platforms retrieved by calling the following command: + +.. code-block:: console + + # ./pilight-daemon -H + Usage: pilight-daemon [options] + -H --help display usage summary + -V --version display version + -C --config config file + -S --server=x.x.x.x connect to server address + -P --port=xxxx connect to server port + -F --foreground do not daemonize + -D --debug do not daemonize and + show debug information + --stacktracer show internal function calls + --threadprofiler show per thread cpu usage + --debuglevel show additional development info + + The following GPIO platforms are supported: + - none + - odroidxu4 + - odroidc2 + - odroidc1 + - raspberrypi3 + - raspberrypi2 + - raspberrypizero + - raspberrypi1b+ + - raspberrypi1b2 + - raspberrypi1b1 + - hummingboard_edge_dq + - hummingboard_gate_dq + - hummingboard_edge_sdl + - hummingboard_gate_sdl + - hummingboard_base_dq + - hummingboard_pro_dq + - hummingboard_base_sdl + - hummingboard_pro_sdl + - orangepipc+ + - bananapim2 + - bananapi1 + - pcduino1 + +If you are running on a platform that doesn't support GPIO, you can either use ``none`` as the ``gpio-platform`` or remove the setting altogether. + +Webserver +--------- + +The following settings change the way the internal webserver will serve the internal pilight webGUI or it can be disabled altogether. + +.. _webgui-websockets: +.. rubric:: webgui-websockets + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "webgui-websockets": 1 } + +By default the webGUI communicates to pilight by using websockets. This is a relatively new technique that allows us to receive all changes from pilight instead of having to poll pilight for changes. The problem is that some older devices and browsers do not support websockets, but they do support the polling technique. So to disable the websockets and use polling instead we set webgui-websockets setting to 0. This setting can be either 0 or 1. + +.. _webserver-authentication: +.. rubric:: webserver-authentication + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "webserver-authentication": [ "username", "password" ] } + +By default, pilight can be controlled from the webGUI by anyone that can access it. If you want to prevent this, you can secure the webGUI with a username and password. The username should be in plain text, the password is SHA256 encrypted. Use pilight-sha256 to create the encrypted password hash. Regular SHA256 encryption tools will not work because pilight hashes the password several thousand times. + +.. code-block:: console + + pi@pilight ~# pilight-sha256 -p admin + 4f32102debed8dabd87e88cf84c752ccb23a74b29f90b42edde05cbc7be41f80 + +So if we want to use a username user and password admin the values should look like this: + +.. code-block:: json + :linenos: + + { "webserver-authentication": [ "user", "4f32102debed8dabd87e88cf84c752ccb23a74b29f90b42edde05cbc7be41f80" ] } + +.. _webserver-cache: +.. rubric:: webserver-cache + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "webserver-cache": 1 } + +pilight has the ability to cache all files used for the webGUI. This reduces the amount of reads done from the SD card on devices like the Raspberry Pi and Hummingboard, and makes it faster to load the webGUI from devices with a slow internal storage such as routers. This setting can be either 0 or 1. + +.. _webserver-enable: +.. rubric:: webserver-enable + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "webserver-enable": 1 } + +The pilight webserver can be turned off as a whole. This could be useful if you do not want to use the webGUI at all or if you want to use your own webserver implementation. This setting can be either 0 or 1. + +.. _webserver-http-port: +.. rubric:: webserver-http-port + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "webserver-http-port": 5001 } + +The pilight webserver runs by default on the non-standard port 5001. This is done to prevent interference with other webservers running on the default HTTP port 80. If you do want to run the webserver on port 80 or any other port, you can change this setting. The port specified must be a valid and unused port. + +.. _webserver-https-port: +.. rubric:: webserver-https-port + +.. deprecated:: 8.0 + +.. versionadded:: 8.0.3 + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "webserver-https-port": 5002 } + +The webserver does not allow secure connections by default. Currently the only way to get HTTPS support is by manually compiling pilight. The pilight secure webserver runs by default on the non-standard port 5002. This is done to prevent interference with other webservers running on the default HTTPS port 443. If you do want to run the secure webserver on port 443 or any other port, you can change this setting. The port specified must be a valid and unused port. + +.. _webserver-root: +.. rubric:: webserver-root + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "webserver-root": "/usr/local/share/pilight" } + +.. versionchanged:: 8.0 + +.. code-block:: json + :linenos: + + { "webserver-root": "/usr/local/share/pilight/webgui" } + +The webserver root tells pilight where it should look for all files that should be served by the webserver. This setting must contain a valid path. + +.. _webserver-user: +.. rubric:: webserver-user + +.. note:: + + Linux + +.. code-block:: json + :linenos: + + { "webserver-user": "www-root" } + +.. note:: + + \*BSD + +.. code-block:: json + :linenos: + + { "webserver-user": "www" } + +The webserver runs by default as a non-root user. This to prevent the execution of malicious code. If you want to force the webserver to run as the root user or any other system user, you can change this setting accordingly. This setting needs to contain a valid system user. + +SMTP +---- + +pilight has the capability to communicate with several types of mail servers. This offers pilight the possibility to use for example mail actions inside our event rules, so email messages can be sent in case of a certain event. Most users will have an email account from their internet hosting provider or free mail solutions can be used like gmail. In case of a (non-existing) gmail account named: pilight@gmail.com with password: foobar, the SMTP settings should be configured like this: + +.. code-block:: json + :linenos: + + { + "smtp-sender": "pilight@gmail.com", + "smtp-host": "smtp.gmail.com", + "smtp-port": 465, + "smtp-user": "pilight@gmail.com", + "smtp-password": "foobar", + "smtp-ssl": 1 + } + +.. _smtp-sender: +.. rubric:: smtp-sender + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "smtp-sender": "...@....com" } + +The smtp-sender requires a valid e-mail address. As soon as a mail is sent by pilight, this e-mail address will be used as the address from with the mail was sent. + +.. _smtp-user: +.. rubric:: smtp-user + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "smtp-user": "...@....com" } + +The smtp-user requires a valid e-mail address. This e-mail address is used to validate the account details at the e-mail provider. + +.. versionchanged:: 8.0 Allow any string for smtp-user + +The smtp-user can be any string, and doesn't have to be an valid e-mail address anymore. + +.. _smtp-password: +.. rubric:: smtp-password + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "smtp-password": "..." } + +The smtp-password is used to validate the account details at the e-mail provider together with the smtp-user setting. The password should therefore be a valid password for this e-mail account. + +.. _smtp-host: +.. rubric:: smtp-host + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "smtp-host": "smtp.foo.com" } + +The smtp-host setting should contain a valid mail server hostname. Normally, the host name is similar to name of the internet hosting provider. + +.. _smtp-port: +.. rubric:: smtp-port + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "smtp-port": 25 } + +.. deprecated:: 8.0.3 + +The smtp-port should contain a valid smtp server port. This can currently be either 25, 465, or 587. pilight will communicate over a secure connection when using port 465, when using port 25 or 587 it will depend on the server how pilight will set-up the connection. + +.. versionchanged:: 8.0.3 + +The smtp-port should contain a valid smtp server port. This can be any port. SSL connections should be explicitly defined in the smtp-ssl setting. + +.. versionadded:: 8.0.3 + +.. _smtp-ssl: +.. rubric:: smtp-ssl + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "smtp-ssl": 0 } + +The smtp-ssl tells pilight if the mailserver uses a secure SSL communication from the start. If server change to SSL while initializing a connection, pilight will do so automatically as well. In those cases, this setting can be set to zero. + +Miscellaneous +------------- + +.. _ntp-servers: +.. rubric:: ntp-servers + +.. note:: + + Linux, \*BSD, and Windows + +.. code-block:: json + :linenos: + + { "ntp-servers": [ "eu.pool.ntp.org", "uk.pool.ntp.org" ] } + +One important feature of any automation setup is the ability to trigger time based actions. However, these events greatly rely on a correct date and time. Problems occur when the system time is not set to the correct time (for our specific timezone). This can happen on systems like the Raspberry Pi which does not have a RTC that allows it to keep track of time when turned off. To overcome this problem pilight has the ability to retrieve the correct time by synchronizing with NTP servers. You can pick any server from http://www.pool.ntp.org/. Any number of servers can be added to the ntp-servers list. pilight will first try to synchronize with the first server. If this fails it will try the second server etc. It will continue this process until an actual response was received. + +Firmware +-------- + +pilight provides an easy tool to flash the firmware of several microcontrollers in the form of pilight-flash. pilight flashes microcontrollers by using either bitbanging or through USB. To use bitbanging we need four GPIOs. These GPIOs are by default configured for usage on a Raspberry Pi. They can however, be changed to other GPIOs according to the device you want to use. Each GPIO is named according to the SPI requirements, but any GPIO can be used because we are not actually using SPI to communicate with our microcontrollers. In pilight the SPI identifiers MISO, MOSI, Reset and SCK are only used to separate the different GPIO. + +If you are unsure what valid GPIOs are on your platform, +please refer to the http://www.wiringx.org documentation. + +.. _firmware-gpio-miso: +.. rubric:: firmware-gpio-miso + +.. note:: + + Linux and \*BSD + +.. code-block:: json + :linenos: + + { "firmware-gpio-miso": 13 } + +This setting defines the GPIO pin to be used as MISO. Any valid GPIO for your platform can be used. + +.. _firmware-gpio-mosi: +.. rubric:: firmware-gpio-mosi + +.. note:: + + Linux and \*BSD + +.. code-block:: json + :linenos: + + { "firmware-gpio-mosi": 12 } + +This setting defines the GPIO pin to be used as MOSI. Any valid GPIO for your platform can be used. + +.. _firmware-gpio-reset: +.. rubric:: firmware-gpio-reset + +.. note:: + + Linux and \*BSD + +.. code-block:: json + :linenos: + + { "firmware-gpio-reset": 10 } + +This setting defines the GPIO pin to be used as Reset. Any valid GPIO for your platform can be used. + +.. _firmware-gpio-sck: +.. rubric:: firmware-gpio-sck + +.. note:: + + Linux and \*BSD + +.. code-block:: json + :linenos: + + { "firmware-gpio-sck": 14 } + +This setting defines the GPIO pin to be used as SCK. Any valid GPIO for your platform can be used. + +Module Paths +------------ + +pilight has the possibility to load various external modules to enhance its functionality. These modules are single files and should be placed in fixed folders. However, these folders locations can be changed by altering one of the following settings. + +.. warning:: + + There is generally no reason to load external modules. + The latest pilight version always contains the latest + protocols, hardware drivers, event operators, functions, + and actions. + +.. _action-root: +.. rubric:: action-root + +.. note:: + + Linux and \*BSD + +.. code-block:: json + :linenos: + + { "action-root": "/usr/local/lib/pilight/action" } + +pilight event actions are loaded from the action-root folder. The action-root setting must contain a valid path. + +.. _function-root: +.. rubric:: function-root + +.. note:: + + Linux and \*BSD + +.. code-block:: json + :linenos: + + { "function-root": "/usr/local/lib/pilight/function" } + +pilight event actions are loaded from the function-root folder. The function-root setting must contain a valid path. + +.. _hardware-root: +.. rubric:: hardware-root + +.. note:: + + Linux and \*BSD + +.. code-block:: json + :linenos: + + { "hardware-root": "/usr/local/lib/pilight/hardware" } + +pilight event actions are loaded from the hardware-root folder. The hardware-root setting must contain a valid path. + +.. _operator-root: +.. rubric:: operator-root + +.. note:: + + Linux and \*BSD + +.. code-block:: json + :linenos: + + { "operator-root": "/usr/local/lib/pilight/operator" } + +pilight event actions are loaded from the operator-root folder. The operator-root setting must contain a valid path. + +.. _protocol-root: +.. rubric:: protocol-root + +.. note:: + + Linux and \*BSD + +.. code-block:: json + :linenos: + + { "protocol-root": "/usr/local/lib/pilight/protocol" } + +pilight event actions are loaded from the protocol-root folder. The protocol-root setting must contain a valid path. diff --git a/lib/ESPiLight/pilight/docs/source/development/api.rst b/lib/ESPiLight/pilight/docs/source/development/api.rst new file mode 100644 index 0000000..113b69e --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/development/api.rst @@ -0,0 +1,425 @@ +API +=== + +- `Identification`_ +- `Options`_ +- `Actions`_ +- `Webserver (REST Api)`_ +- `Heartbeat`_ +- `Buffer Sizes`_ + +Identification +-------------- + +All programs communicate with each other by using JSON objects. The normal identification process is as follows: + +- Connect to pilight-daemon by using the pilight IP and port. The port pilight is running at is either a randomly chosen number or a fixed number as configured in the pilight settings. +- The pilight-daemon waits for the client to identify itself by sending the following JSON object: + + .. code-block:: json + :linenos: + + { + "action": "identify" + } + +- Additionally, a client can send certain options to tell the daemon what level of communication is the client want to set-up. A full identification JSON looks like this: + + .. code-block:: json + :linenos: + + { + "action": "identify", + "options": { + "core": 1, + "receiver": 1, + "config": 1, + "forward": 0 + }, + "uuid": "0000-d0-63-00-000000", + "media": "all" + } + +- After each action, the daemon will send either one of the following two status responses indicating a success or failure: + + .. code-block:: json + :linenos: + + { + "status": "success" + } + + .. code-block:: json + :linenos: + + { + "status": "failure" + } + +Options +------- + +The identification options define what communication is set-up between the daemon and the client. + +- receiver + When the receiver option is set, the daemon will forward the received or sent codes to the client. An example: + + .. code-block:: json + :linenos: + + { + "origin": "receiver", + "protocol": "kaku_switch", + "code": { + "id": 1234, + "unit": 0, + "off": 1 + } + } + { + "origin": "sender", + "protocol": "kaku_switch", + "code": { + "id": 1234, + "unit": 0, + "off": 1 + } + } + + In the received JSON messages, the origin will tell if an externally received message was received or a code sent by pilight self. + +- config + When the config option is set, the daemon will communicate all configuration updates. An example: + + .. code-block:: json + :linenos: + + { + "origin": "config", + "devices": [ "mainlight" ], + "values": { + "state": "on" + } + } + + | + +- core + When the core option is set, the daemon will communicate pilight core information. + +- stats + When the stats option is set, the daemon will communicate the RAM and CPU statistics. + + .. code-block:: json + :linenos: + + { + "origin": "core", + "values": { + "cpu": 0.07822473698105643, + "ram": 0.1535397936955158 + }, + "type": -1, + "uuid": "0000-d0-63-00-000000" + } + + | + +- forward + When the forward option is enabled, all incoming (valid) socket data will be forwarded to the client. + +The uuid setting is meant for the client to send its unique UUID. + +The media setting is used to tell the daemon what information is sent based on the specific media. As can be read in the GUI configuration, a user can create different GUIs based on different devices. The currently supported GUI types are all, web, mobile, and desktop. If you define your client as one of those GUI types, pilight will only send devices, GUI elements, config updates and rules that apply the specific GUI type, leaving the rest out. Therefore, you do not have to do any additional parsing on the client side. + +These options can be updated on-the-fly while the client is running. The daemon will start or stop sending specific messages. To update these options, just send another identification request. An example identification object: + + + .. code-block:: json + :linenos: + + { + "action": "identify", + "options": { + "stats": 1, + "receiver": 1 + }, + "uuid": "0000-d0-63-00-000000" + } + +Actions +------- + +As we have seen in the identification process, pilight can handle several actions. The first action we encounter is the identification action. The following list contains all possible actions the daemon can handle. Again, the daemon will respond to all actions with a success and failure so the client can check if the action succeeded. + +- send + In case the client wants to send specific protocol codes, the send action is used. A sent action is accompanied by specific additional arguments: + + .. code-block:: json + :linenos: + + { + "action": "send", + "code": { + "protocol": [ "kaku_switch" ], + "id": 1234, + "unit": 0, + "off": 1 + } + } + + These are basically the command like arguments. If an argument requires a value, then the value is added to the argument (as with id and unit). If the argument does not take a value, than it is defaulted to 1 (as with off). The pilight-daemon will check if the code was valid, and report back with a failure if it was not. + +- control + The control action is used to control registered devices by using their device IDs. The pilight-daemon will check if the values are valid and report back with a failure if they are not. An example control object: + + .. code-block:: json + :linenos: + + { + "action": "control", + "code": { + "device": "mainlight", + "state": "on", + "values": { + "dimlevel": 10 + } + } + } + + | + +- registry + The pilight registry can be managed by the registry API. The registry is a multi-purpose storage solution within pilight. Developers can store any information they want inside it so it is retrievable later on. The registry allows three types of actions: set, get, remove. The syntax for each on of them is: + + .. code-block:: json + :linenos: + + { + "action": "registry", + "type": "set", + "key": "pilight.version", + "value": "6.0" + } + + .. code-block:: json + :linenos: + + { + "action": "registry", + "type": "get", + "key": "pilight.version" + } + + .. code-block:: json + :linenos: + + { + "action": "registry", + "type": "remove", + "key": "pilight.version" + } + + The response to a get command is as follows: + + .. code-block:: json + :linenos: + + { + "action": "registry", + "value": "6.0", + "key": "pilight.version" + } + + Please note that the pilight registry can only hold JSON string and number types. + +- request config + The request config is used to request the full configuration object from the pilight-daemon: + + .. code-block:: json + :linenos: + + { + "action": "request config" + } + + | + +After this command, the pilight-daemon will send the raw JSON configuration as it is used internally. + + .. code-block:: json + :linenos: + + { + "devices": { + "tv": { + "uuid": "0000-00-00-07-646b93", + "origin": "0000-d0-63-00-000000", + "timestamp": 0, + "protocol": [ "relay" ], + "id": [{ + "gpio": 3 + }], + "state": "off", + "default": "off" + } + }, + "rules": { + "tvswitch": { + "rule": "IF tv.state IS on THEN switch DEVICE tv TO off", + "active": 1 + } + }, + "gui": { + "television": { + "type": 4, + "order": 1, + "name": "tv", + "group": [ "Living" ], + "media": [ "all" ], + "readonly": 0 + } + }, + "settings": { + "log-level": 4, + "pid-file": "/var/run/pilight.pid", + "log-file": "/var/log/pilight.log", + "webserver-enable": 1, + "webserver-http-port": 5001, + "webserver-cache": 0, + "webserver-root": "/usr/local/share/pilight" + }, + "hardware": { + "433gpio": { + "sender": 0, + "receiver": 1 + } + }, + "registry": { + "pilight": { + "version": { + "current": "6.0" + } + } + } + } + + +- request values + + .. code-block:: json + :linenos: + + { + "action": "request values" + } + + pilight tries to make app development as easy as possible. This means that GUIs should only have to parse the GUI configuration object. The downside however is that the GUI object does not contain the device values. To solve this issue, the GUIs can request the values for all devices at once. The returned object will have the same information as the daemon communicates with the config option enabled, but now in bulk for all devices. An example: + + .. code-block:: json + :linenos: + + [{ + "type": 4, + "devices": [ "tv" ], + "values": { + "timestamp": 0, + "state": "off" + } + }, + { + "type": 1, + "devices": [ "bookShelfLight" ], + "values": { + "timestamp": 0, + "state": "off" + } + }] + + Please be aware that right after the request values object, the pilight version object is sent. It is up to the GUIs to ignore or parse this information. + +Webserver (REST API) +-------------------- + +The webserver has some special pages: + +- The config page will present the latest configuration JSON object. +- The values page will present the latest values of all device. + + The values and config page will by default only show the configuration that applies to a web GUI type. To retrieve the configuration relevant for other GUI types, use the media argument: + + .. code-block:: console + + http://x.x.x.x:5001/config?media=all + +.. versionadded:: 4.0 Send codes through webserver + +- The send page can be used to control devices. To use this function, call the send page with a URL-encoded "send" or "registry" JSON object like this: + + .. code-block:: console + + send%3F%7B%0A%09%22action%22%3A%20%22control%22%2C%0A%09%22code%22%3A%20%7B%0A%09%09%22device%22%3A%20%22mainlight%22%2C%0A%09%09%22state%22%3A%20%22on%22%2C%0A%09%09%22values%22%3A%20%7B%0A%09%09%09%22dimlevel%22%3A%20%2210%22%0A%09%09%7D%0A%09%7D%0A%7D + + This will send the object as described earlier. + +.. versionchanged:: 8.0 Implemented REST API instead of posting arbitrary JSON codes + +- The send page has the same functionality as the ``pilight-send`` program and uses the same arguments: + + .. code-block:: guess + + http://x.x.x.x:5001/send?protocol=kaku_switch&on=1&id=1&unit=1 + + As can be seen, the URL arguments are the same as for the ``kaku_switch`` protocol: + + .. code-block:: console + + pi@pilight:~# pilight-send -p kaku_switch -H + ... + [kaku_switch] + -t --on send an on signal + -f --off send an off signal + -u --unit=unit control a device with this unit code + -i --id=id control a device with this id + -a --all send command to all devices with this id + -l --learn send multiple streams so switch can learn + + All protocols can be controlled using their respective arguments using the webserver send page as described in this example. + +- The control page has the same functionality as the ``pilight-control`` program and uses the same arguments: + + .. code-block:: guess + + http://x.x.x.x/control?device=nasStatus&values[label]=computer%20is%20disconnected&values[color]=red + + In this case a generic_label device is being controlled + +Heartbeat +--------- + +One special function of the *pilight-daemon* is the heartbeat. The heartbeat is meant to check if a connection is still alive. The client has to send a "HEART\n" on which the *pilight-daemon* will respond with a "BEAT\n". This is the only exception in which not a JSON object is sent. + +Buffer Sizes +------------ + +pilight will sends all streams in 1024 bits. If these streams are smaller than 1024 bits, everything was sent at once. If a stream is 1024 bits, then you will know it is a chunk of a bigger stream. In that case, read until you encounter the end of streams delimiter which is currently made up of two new lines "\n\n". + +If multiple streams were buffered somewhere, you can also distinguish them by the double new line delimiters. An example: + + .. code-block:: console + :linenos: + + {"message":"test"}\n\n + {"message":"test"}\n\n + {"message":"test"}\n\n + +As you can see. pilight wanted to send three messages, but the TCP sockets concatenated them to one. + +The pilight socket_read function takes care of these buffered messages to check if we encountered concatenated multiple streams. pilight will then convert these messages back so the output is just one big stream separated by single newlines: + + .. code-block:: console + :linenos: + + {"message":"test"}\n + {"message":"test"}\n + {"message":"test"}\n diff --git a/lib/ESPiLight/pilight/docs/source/development/debugging.rst b/lib/ESPiLight/pilight/docs/source/development/debugging.rst new file mode 100644 index 0000000..311ee91 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/development/debugging.rst @@ -0,0 +1,173 @@ +Debugging +========= + +- `Introduction`_ +- `Prerequisites`_ +- `How to recognize a Bug?`_ +- `How to Debug?`_ + +Introduction +------------ + +pilight is a product developed by a growing community. Due to its Open Source character, developers around the world can contribute code. Although all developers try to write bug free code, it is not always possible for the developers of pilight to check for every possible mistake that can be made. Especially, because not everyone has every hardware available for testing. + +Prerequisites +------------- + +If you found this page, you probably encountered a bug in the pilight code or noticed that things are not working as they should be. Before you continue reading, consider the following. + +First, pilight offers code in several stages of stability: + +#. Stable apt repository and GitHub master branch + This code has been tested to work without bugs for various weeks by the developer and a large community. If bugs are found in this version of pilight, the problem has probably already been fixed in the developmental code. + +#. Nightly apt repository and GitHub development branch + This code always contains the very latest features and fixes. It is updated several times a week. However, this also means that not all bugs are already encountered when a user starts to use it. + +Second, this page is made for those users using the developmental GitHub branch. This tutorial assumes the following: + +#. You are aware of the distinction between bugs and changes in the pilight functionality. +#. You have read the GitHub commit messages to be sure that what you have encountered is indeed a bug and not a changed functionality. +#. You have enough experience working with your operating system. +#. You have the patience to help finding the problem. +#. You have some knowledge about programming (and the C language). +#. You know when to recognize a clear code bug. +#. You are able to manually compile pilight so debugging is possible. The automatically compiled versions do not support debugging as described here. + +How to Recognize a Bug? +----------------------- + +The two most encountered bugs are the memory issues or the segmentation faults. A memory bug can look like this: + +.. code-block:: console + + * glibc detected ./pilight-daemon: double free or corruption (!logfile): 0x0000000000c6ed50 ** + +This message means in this case that the variable logfile was freed twice. + +A segmentation fault looks like this: + +.. code-block:: console + + pi@raspberrypi ~/pilight $ sudo service pilight start + [....] Starting : pilightSegmentation fault + failed! + +This message means there has been a general error in which pilight so it cannot be started properly. + +How to Debug? +------------- + +To debug C code, the GNU Debugger is used, also called gdb. This program will run next to pilight without any performance issue, but when pilight crashes, it allows us to track the specific line where the error occurred. So first of all, make sure you have gdb installed. This is how you start gdb together with pilight: + +.. code-block:: console + + pi@pilight:~> sudo su + root@pilight:~# gdb --args pilight-daemon -D + GNU gdb (GDB) 7.4.1-debian + Copyright (C) 2012 Free Software Foundation, Inc. + License GPLv3+: GNU GPL version 3 or later + This is free software: you are free to change and redistribute it. + There is NO WARRANTY, to the extent permitted by law. Type "show copying" + and "show warranty" for details. + This GDB was configured as "arm-linux-gnueabihf". + For bug reporting instructions, please see: + ... + Reading symbols from /usr/local/sbin/pilight-daemon...done. + (gdb) run + Starting program: /usr/local/sbin/pilight-daemon -D + [Thread debugging using libthread_db enabled] + Using host libthread_db library "/lib/arm-linux-gnueabihf/libthread_db.so.1". + [Jan 18 16:23:33:657363] pilight-daemon: DEBUG: ssdp sent search + [Jan 18 16:23:33:701618] pilight-daemon: NOTICE: no pilight daemon found, daemonizing + [Jan 18 16:23:33:718878] pilight-daemon: DEBUG: -- start parsed config file -- + +Now pilight will start as it you would have started it normally. Just let it run like this until it crashes or try to invoke the crash. If it crashes, you will see something like this: + +.. code-block:: console + + *** glibc detected *** /usr/local/sbin/pilight-daemon: double free or corruption (fasttop): 0x000369d8 *** + [New Thread 0xb228c470 (LWP 26235)] + Program received signal SIGABRT, Aborted. + [Switching to Thread 0xb4d7d470 (LWP 26230)] + 0xb6dddbfc in __GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:67 + 67 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. + (gdb) + +Again, you see the **(gdb)** prompt that allows you to type new commands. + +The first step is to get a backtrace of all functions called when this crash occurred: + +.. code-block:: console + + (gdb) backtrace + #0 0xb6dddbfc in __GI_raise (sig=6) + at ../nptl/sysdeps/unix/sysv/linux/raise.c:67 + #1 0xb6de197c in __GI_abort () at abort.c:92 + #2 0xb6e15cf8 in __libc_message (do_abort=2, + fmt=0xb6ec78d0 "*** glibc detected *** %s: %s: 0x%s ***\n") + at ../sysdeps/unix/sysv/linux/libc_fatal.c:189 + #3 0xb6e20584 in malloc_printerr (action=3, + str=0xb6ec7a6c "double free or corruption (fasttop)", ptr=) + at malloc.c:6283 + #4 0xb6e24e00 in __GI___libc_free (mem=) at malloc.c:3738 + #5 0x0000b5d8 in broadcast (param=) at daemon.c:260 + #6 0xb6ee6bfc in start_thread (arg=0xb4d7d470) at pthread_create.c:306 + #7 0xb6e7b758 in ?? () + at ../ports/sysdeps/unix/sysv/linux/arm/nptl/../clone.S:116 + from /lib/arm-linux-gnueabihf/libc.so.6 + #8 0xb6e7b758 in ?? () + at ../ports/sysdeps/unix/sysv/linux/arm/nptl/../clone.S:116 + from /lib/arm-linux-gnueabihf/libc.so.6 + Backtrace stopped: previous frame identical to this frame (corrupt stack?) + (gdb) + +Copy this output so it can be communicated on the forum. + +The second step is to look for the exact line causing this crash. This can be done by zooming into each part of each function related to this bug. We start at the end and work our way to the beginning. To zoom into a function the command **frame** # is used in which the # is replaced by one of the numbers you see in the backtrace. As said earlier, we will start at the end: + +.. code-block:: console + + (gdb) frame 8 + #8 0xb6e7b758 in ?? () + at ../ports/sysdeps/unix/sysv/linux/arm/nptl/../clone.S:116 + from /lib/arm-linux-gnueabihf/libc.so.6 + 116 ../ports/sysdeps/unix/sysv/linux/arm/nptl/../clone.S: No such file or directory. + +This doesn't tell us anything useful. So we continue to the previous frame. + +.. code-block:: console + + (gdb) frame 7 + #7 0xb6e7b758 in ?? () + at ../ports/sysdeps/unix/sysv/linux/arm/nptl/../clone.S:116 + from /lib/arm-linux-gnueabihf/libc.so.6 + 116 ../ports/sysdeps/unix/sysv/linux/arm/nptl/../clone.S: No such file or directory. + +Still no useful information here. + +.. code-block:: console + + (gdb) frame 6 + #6 0xb6ee6bfc in start_thread (arg=0xb4d7d470) at pthread_create.c:306 + 306 pthread_create.c: No such file or directory. + +Nope. + +.. code-block:: console + + (gdb) frame 5 + #5 0x0000b5d8 in broadcast (param=) at daemon.c:260 + 260 json_delete(jret); + +Yes, finally something related to pilight. As you can see here, the conflicting line can be found in daemon.c in the function broadcast at line 260. The actual command that leaded to the crash was json_delete. Although we now know that this was the line causing the crash, the actual bug could lay elsewhere. Therefore we continue until the last pilight related frame. + +No useful information in frame 4. So, frame 5 was the only interesting frame here. Make sure to copy the output of the informative frames so it can be used in a forum post later on. + +To exit: + +.. code-block:: console + + (gdb) q + +As you might have seen, this way of debugging makes it a lot easier to track bugging code. gdb will tell you the exact line on which the bug occurred to in can be easier tracked down and fixed. \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/development/index.rst b/lib/ESPiLight/pilight/docs/source/development/index.rst new file mode 100644 index 0000000..879bf94 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/development/index.rst @@ -0,0 +1,8 @@ +Development +=========== + +.. toctree:: + :maxdepth: 1 + + api + debugging \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/electronics/index.rst b/lib/ESPiLight/pilight/docs/source/electronics/index.rst new file mode 100644 index 0000000..baf81b8 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/electronics/index.rst @@ -0,0 +1,8 @@ +Electronics +=========== + +.. toctree:: + :maxdepth: 1 + + wiring + pcb_soldering \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/electronics/pcb_soldering.rst b/lib/ESPiLight/pilight/docs/source/electronics/pcb_soldering.rst new file mode 100644 index 0000000..062a7d4 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/electronics/pcb_soldering.rst @@ -0,0 +1,200 @@ +PCB Soldering +============= + +- `Introduction`_ +- `PCB Eights`_ + - `Headers`_ + - `Voltage Regulator`_ +- `PCB Quarter`_ + - `P1 Meter`_ +- `PCB Half`_ + - `Pre-Filter`_ +- `PCB Full`_ + +Introduction +------------ + +The pilight PCB can be ordered as a do-it-yourself kit or pre-soldered. In case you want to solder it yourself, this page will show you all steps needed. If you follow all steps, you will eventually end up with the full pilight PCB. However, if you want to leave certain options, just pick the steps you need. + +PCB Eights +---------- + +.. _Headers: +.. rubric:: Headers + +First start by soldering the two headers. This makes it easier to position the rest of the components. + +.. |fig1| image:: ../images/soldering/1.jpg + +.. rst-class:: alt + ++-----------------------+ +| |fig1| | ++-----------------------+ +| Image 1: First Header | ++-----------------------+ + +.. |fig2| image:: ../images/soldering/2.jpg + +.. rst-class:: alt + ++------------------------+ +| |fig2| | ++------------------------+ +| Image 2: Second Header | ++------------------------+ + +As you can see, the second header is wider than the number of pins on the PCB. Just strip the unconnected connections on the left side to make the header evenly wide as the PCB. + +.. |fig3| image:: ../images/soldering/3.jpg + +.. rst-class:: alt + ++---------------------------------+ +| |fig3| | ++---------------------------------+ +| Image 3: Stripped Second Header | ++---------------------------------+ + +.. _Voltage Regulator: +.. rubric:: Voltage Regulator + +The voltage regulator consists of a capacitor, resistor, and transistor. First start by soldering the transistor close to the first header. Make sure to match the flat and rounded side of the transistor as shown on the PCB itself. Also make sure to push the transistor far through enough so it stays under the first header. + +.. |fig4| image:: ../images/soldering/4.jpg + +.. rst-class:: alt + ++---------------------------------------+ +| |fig4| | ++---------------------------------------+ +| Image 4: Voltage Regulator Transistor | ++---------------------------------------+ + +The capacitor can best be solder with a little more slack so you can bend it in such manner that it will stay under the first header. Do not bend it too much because then it can interfere with the resistors needed for the pre-filter. + +.. |fig5| image:: ../images/soldering/5.jpg + +.. rst-class:: alt + ++--------------------------------------+ +| |fig5| | ++--------------------------------------+ +| Image 5: Voltage Regulator Capacitor | ++--------------------------------------+ + +Finish the voltage regulator by soldering the resistor. + +.. |fig6| image:: ../images/soldering/6.jpg + +.. rst-class:: alt + ++-------------------------------------+ +| |fig6| | ++-------------------------------------+ +| Image 6: Voltage Regulator Resistor | ++-------------------------------------+ + +PCB Quarter +----------- + +.. _P1 Meter: +.. rubric:: P1 Meter + +The P1 meter consists of two resistors, a transistor and a wire terminal. Take care in placing the resistors, because they are placed in between the resistors of the pre-filter. Also check if the terminal is not too high for mounting on your final device. For example the System on Module of the Hummingboard together with the P1 terminal make it too high for proper mounting. In this case, leave the terminal and just connect the wires directly to the PCB. + +.. |fig7| image:: ../images/soldering/7.jpg + +.. rst-class:: alt + ++----------------------------------+ +| |fig7| | ++----------------------------------+ +| Image 7: P1 Meter First Resistor | ++----------------------------------+ + +.. |fig8| image:: ../images/soldering/8.jpg + +.. rst-class:: alt + ++-----------------------------------+ +| |fig8| | ++-----------------------------------+ +| Image 8: P1 Meter Second Resistor | ++-----------------------------------+ + +Place the transistor as shown on the PCB, with its flat side to the ATTiny. + +.. |fig9| image:: ../images/soldering/9.jpg + +.. rst-class:: alt + ++------------------------------+ +| |fig9| | ++------------------------------+ +| Image 9: P1 Meter Transistor | ++------------------------------+ + +.. |fig10| image:: ../images/soldering/10.jpg + +.. rst-class:: alt + ++-----------------------------+ +| |fig10| | ++-----------------------------+ +| Image 10: P1 Meter Terminal | ++-----------------------------+ + +PCB Half +-------- + +.. _Pre-Filter: +.. rubric:: Pre-Filter + +.. + +.. |fig11| image:: ../images/soldering/11.jpg + +.. rst-class:: alt + ++--------------------------------+ +| |fig11| | ++--------------------------------+ +| Image 11: Pre-Filter Resistors | ++--------------------------------+ + +When installing the socket, please remember where the dot and notch are placed. In the final ATTiny installation, the dot on the PCB and on the ATTiny should match. + +.. |fig12| image:: ../images/soldering/12.jpg + +.. rst-class:: alt + ++-----------------------------+ +| |fig12| | ++-----------------------------+ +| Image 12: Pre-Filter Socket | ++-----------------------------+ + +PCB Full +-------- + +.. |fig13| image:: ../images/soldering/13.jpg + +.. rst-class:: alt + ++------------------------------+ +| |fig13| | ++------------------------------+ +| Image 13: PCB Final Top View | ++------------------------------+ + + +.. |fig14| image:: ../images/soldering/14.jpg + +.. rst-class:: alt + ++---------------------------------+ +| |fig14| | ++---------------------------------+ +| Image 14: PCB Final Bottom View | ++---------------------------------+ diff --git a/lib/ESPiLight/pilight/docs/source/electronics/wiring.rst b/lib/ESPiLight/pilight/docs/source/electronics/wiring.rst new file mode 100644 index 0000000..c98ea9a --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/electronics/wiring.rst @@ -0,0 +1,92 @@ +Wiring +====== + +- `Introduction`_ +- `ATTiny pre-filter`_ +- `pilight USB nano`_ + +Introduction +------------ + +The wiring of the different pilight hardware solutions will be described here in the best possible way. Please refer to the Configuration – Hardware page to see how the hardware modules are configured on the software side. + +ATTiny pre-filter +----------------- + +.. only:: html + + .. figure:: ../images/attiny-wiring.svg + :align: left + +.. only: latex + + .. image:: ../images/attiny-wiring.pdf + +The ATTiny pre-filter is meant to filter the noise from 433.92Mhz receivers. Using a filter is not strictly necessary. However, it greatly reduces the CPU usage of your Raspberry Pi (and similar devices) so you can use it for more applications than just pilight. + +Wiring the filter can be done it two steps. A required one, and an optional one. All optional wirings are made purple in the drawing. These wires are only used for firmware upgrades, which only happen rarely. + +The different pins on the Raspberry Pi are numbered from bottom left (Pin 1) and top left (Pin 2) to bottom right (Pin 39) and top right (Pin 40). + +The pins on the receiver (large rectangle) are numbered from left (Pin 1) to right (Pin 8). + +The pins on the ATTiny are numbered from top left (Pin 1) to bottom left (Pin 4) and from bottom right (Pin 5) to top right (Pin 8). + +The pins on the sender (small rectangle) are numbered from left (Pin 1) to right (Pin 4). + +With this information, the following wiring scheme can be used for wiring up the ATTiny pre-filter together with the sender and receiver. + ++--------------+------------------+-+------------+------------------+-+------------+------------------+ +| **Receiver** | **ATTiny** | | **ATTiny** | **Raspberry Pi** | | **Sender** | **Raspberry Pi** | ++--------------+------------------+ +------------+------------------+-+------------+------------------+ +| Pin 7 (Data) | Pin 3 | | Pin 1 | Pin 24 (CE0) | | Pin 1 | Pin 2 (5V) | ++--------------+------------------+ +------------+------------------+-+------------+------------------+ +| **Receiver** | **Raspberry Pi** | | Pin 2 | Pin 12 (GPIO 1) | | Pin 2 | Pin 11 (GPIO 0) | ++--------------+------------------+ +------------+------------------+-+------------+------------------+ +| Pin 5 (VDD) | Pin 2 (5V) | | Pin 4 | Pin 6 (GND) | | Pin 3 | Pin 3 (GND) | ++--------------+------------------+ +------------+------------------+-+------------+------------------+ +| Pin 8 (GND) | Pin 6 (GND) | | Pin 5 | Pin 19 (MOSI) | | | ++--------------+------------------+ +------------+------------------+-+------------+------------------+ +| | | Pin 6 | Pin 21 (MISO) | | | ++--------------+------------------+ +------------+------------------+-+------------+------------------+ +| | | Pin 7 | Pin 23 (SCLK) | | | ++---------------------------------+-+------------+------------------+-+------------+------------------+ + +pilight USB nano +---------------- + +.. only:: html + + .. figure:: ../images/usb-nano-wiring.svg + :align: left + +.. only: latex + + .. image:: ../images/usb-nano-wiring.pdf + +The pilight USB nano allows users to use pilight on any computer with USB support. The wiring scheme of the sender and receiver with the Arduino Nano is shown in the drawing. The Arduino Nano should be connected to the final computer over USB. + +The pins on the Arduino Nano are as follow: + ++-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ +| VIN | GND | RST | 5V | A7 | A6 | A5 | A4 | A3 | A1 | A2 | A0 | REF | 3V3 | D13 | | ++-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ USB + +| TX1 | RX0 | RST | GND | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | D11 | D12 | | ++-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ + +The pins on the receiver are numbered from left (Pin 1) to right (Pin 8). + +The pins on the sender are numbered from left (Pin 1) to right (Pin 4). + +With all this information, the following wiring scheme can be used for wiring up the pilight USB nano together with the sender and receiver. + ++--------------+----------+-+--------------+----------+ +| **Receiver** | **Nano** | | **Sender** | **Nano** | ++--------------+----------+ +--------------+----------+ +| Pin 1 (VDD) | 5V | | Pin 1 (GND) | GND | ++--------------+----------+ +--------------+----------+ +| Pin 7 (Data) | D2 | | Pin 2 (Data) | D5 | ++--------------+----------+ +--------------+----------+ +| Pin 8 (GND) | GND | | Pin 3 (VDD) | 5V | ++--------------+----------+-+--------------+----------+ + diff --git a/lib/ESPiLight/pilight/docs/source/eventing/actions/dim.rst b/lib/ESPiLight/pilight/docs/source/eventing/actions/dim.rst new file mode 100644 index 0000000..fbc93aa --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/actions/dim.rst @@ -0,0 +1,76 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Dim +=== + +.. rubric:: Description + +Dims a device to a dimlevel or starts a sequence from one dimlevel to another. + +.. rubric:: Options + ++----------+------------------+---------------------+-------------------------------------------------------+ +| **Name** | **Required** | **Multiple Values** | **Description** | ++----------+------------------+---------------------+-------------------------------------------------------+ +| DEVICE | |yes| | |yes| | Device(s) to change | ++----------+------------------+---------------------+-------------------------------------------------------+ +| TO | |yes| | |no| | New dimlevel | ++----------+------------------+---------------------+-------------------------------------------------------+ + +.. versionadded:: 7.0 + ++----------+------------------+---------------------+-------------------------------------------------------+ +| **Name** | **Required** | **Multiple Values** | **Description** | ++----------+------------------+---------------------+-------------------------------------------------------+ +| FOR | |no| | |no| | | Determine how long this new state lasts before | +| | | | | we change back to the previous dimlevel and state | ++----------+------------------+---------------------+-------------------------------------------------------+ +| AFTER | |no| | |no| | After how long do we want the new state to be set | ++----------+------------------+---------------------+-------------------------------------------------------+ +| IN | |no| | |no| | | To be combined with FROM. In what time do we want | +| | | | | to change the dimlevel FROM x TO y | ++----------+------------------+---------------------+-------------------------------------------------------+ +| FROM | |no| | |no| | | To be combined with IN. From what dimlevel do we | +| | | | | want to start a sequence to the target dimlevel | ++----------+------------------+---------------------+-------------------------------------------------------+ + +.. note:: Units for ``FOR``, ``AFTER``, and ``IN`` + + - MILLISECOND + - SECOND + - MINUTE + - HOUR + - DAY + +.. rubric:: Examples + +.. code-block:: console + + IF 1 == 1 THEN dim DEVICE mainlight TO 15 + IF 1 == 1 THEN dim DEVICE mainlight AND bookshelve AND hall TO 10 + +.. versionadded:: 7.0 + +.. code-block:: console + + IF 1 == 1 THEN dim DEVICE mainlight TO 15 FOR 10 MINUTE + IF 1 == 1 THEN dim DEVICE mainlight TO 15 AFTER 30 SECOND + IF 1 == 1 THEN dim DEVICE mainlight TO 15 AFTER 30 SECOND FOR 10 MINUTE + IF 1 == 1 THEN dim DEVICE mainlight TO 15 FROM 0 IN 45 MINUTE + IF 1 == 1 THEN dim DEVICE mainlight TO 15 FROM 0 IN 45 MINUTE FOR 15 MINUTE AFTER 5 MINUTE + IF 1 == 1 THEN switch DEVICE light TO off FOR 10 SECOND AFTER 30 MINUTE + +.. versionchanged:: 8.1.0 + +.. code-block:: console + + IF 1 == 1 THEN dim DEVICE mainlight TO 15 FOR '10 MINUTE' + IF 1 == 1 THEN dim DEVICE mainlight TO 15 AFTER '30 SECOND' + IF 1 == 1 THEN dim DEVICE mainlight TO 15 AFTER '30 SECOND' FOR '10 MINUTE' + IF 1 == 1 THEN dim DEVICE mainlight TO 15 FROM 0 IN '45 MINUTE' + IF 1 == 1 THEN dim DEVICE mainlight TO 15 FROM 0 IN '45 MINUTE' FOR '15 MINUTE' AFTER '5 MINUTE' + IF 1 == 1 THEN switch DEVICE light TO off FOR '10 SECOND' AFTER '30 MINUTE' \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/actions/index.rst b/lib/ESPiLight/pilight/docs/source/eventing/actions/index.rst new file mode 100644 index 0000000..b16a304 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/actions/index.rst @@ -0,0 +1,21 @@ +Actions +======= + +.. versionadded:: 6.0 + +.. toctree:: + :maxdepth: 1 + + dim + pushover + switch + toggle + +.. versionadded:: 7.0 + +.. toctree:: + :maxdepth: 1 + + label + pushbullet + sendmail \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/actions/label.rst b/lib/ESPiLight/pilight/docs/source/eventing/actions/label.rst new file mode 100644 index 0000000..77617c1 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/actions/label.rst @@ -0,0 +1,59 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Label +===== + +.. rubric:: Description + +Changes the text and color of a generic label device. + +.. rubric:: Options + ++----------+------------------+---------------------+---------------------------------------------------+ +| **Name** | **Required** | **Multiple Values** | **Description** | ++----------+------------------+---------------------+---------------------------------------------------+ +| DEVICE | |yes| | |yes| | Device(s) to change | ++----------+------------------+---------------------+---------------------------------------------------+ +| TO | |yes| | |no| | New text | ++----------+------------------+---------------------+---------------------------------------------------+ +| COLOR | |no| | |no| | New color. If omitted, color is set to black | ++----------+------------------+---------------------+---------------------------------------------------+ +| **Name** | **Required** | **Multiple Values** | **Description** | ++----------+------------------+---------------------+---------------------------------------------------+ +| FOR | |no| | |no| | | Determine how long this new label lasts | +| | | | | before we change back to the previous label | ++----------+------------------+---------------------+---------------------------------------------------+ +| AFTER | |no| | |no| | After how long do we want the new label to be set | ++----------+------------------+---------------------+---------------------------------------------------+ + +.. note:: Units for ``FOR`` and ``AFTER`` + + - MILLISECOND + - SECOND + - MINUTE + - HOUR + - DAY + +.. rubric:: Examples + +.. code-block:: console + + IF 1 == 1 THEN label DEVICE tempLabel TO on + IF 1 == 1 THEN label DEVICE tempLabel AND humiLabel TO No information + IF 1 == 1 THEN label DEVICE tempLabel TO 23.5 FOR 10 SECOND + IF 1 == 1 THEN label DEVICE tempLabel TO Bell rang AFTER 30 SECOND + IF 1 == 1 THEN label DEVICE tempLabel TO None FOR 10 MINUTE AFTER 30 SECOND + +.. versionchanged:: 8.1.0. + +.. code-block:: console + + IF 1 == 1 THEN label DEVICE tempLabel TO on + IF 1 == 1 THEN label DEVICE tempLabel AND humiLabel TO 'No information' + IF 1 == 1 THEN label DEVICE tempLabel TO 23.5 FOR '10 SECOND' + IF 1 == 1 THEN label DEVICE tempLabel TO 'Bell rang' AFTER '30 SECOND' + IF 1 == 1 THEN label DEVICE tempLabel TO None FOR '10 MINUTE' AFTER '30 SECOND' \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/actions/pushbullet.rst b/lib/ESPiLight/pilight/docs/source/eventing/actions/pushbullet.rst new file mode 100644 index 0000000..ebdfef4 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/actions/pushbullet.rst @@ -0,0 +1,38 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Pushbullet +========== + +.. rubric:: Description + +Send a message to your mobile phone with the pushbullet API + +.. rubric:: Options + ++----------+------------------+---------------------+---------------------------------------------------+ +| **Name** | **Required** | **Multiple Values** | **Description** | ++----------+------------------+---------------------+---------------------------------------------------+ +| TITLE | |yes| | |no| | | ++----------+------------------+---------------------+---------------------------------------------------+ +| BODY | |yes| | |no| | | ++----------+------------------+---------------------+---------------------------------------------------+ +| TOKEN | |yes| | |no| | Unique pushbullet user account token | ++----------+------------------+---------------------+---------------------------------------------------+ +| TYPE | |yes| | |no| | Message type | ++----------+------------------+---------------------+---------------------------------------------------+ + +.. rubric:: Example + +.. code-block:: console + + IF 1 == 1 THEN pushbullet TITLE Doorbell rang BODY Doorbell rang TOKEN abcd123abc TYPE note + +.. versionchanged:: 8.1.0 + +.. code-block:: console + + IF 1 == 1 THEN pushbullet TITLE 'Doorbell rang' BODY 'Doorbell rang' TOKEN abcd123abc TYPE note \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/actions/pushover.rst b/lib/ESPiLight/pilight/docs/source/eventing/actions/pushover.rst new file mode 100644 index 0000000..3c64033 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/actions/pushover.rst @@ -0,0 +1,38 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Pushover +======== + +.. rubric:: Description + +Send a message to your mobile phone with the pushover API + +.. rubric:: Options + ++----------+------------------+---------------------+---------------------------------------------------+ +| **Name** | **Required** | **Multiple Values** | **Description** | ++----------+------------------+---------------------+---------------------------------------------------+ +| TITLE | |yes| | |no| | | ++----------+------------------+---------------------+---------------------------------------------------+ +| MESSAGE | |yes| | |no| | | ++----------+------------------+---------------------+---------------------------------------------------+ +| TOKEN | |yes| | |no| | Unique pushover user account token | ++----------+------------------+---------------------+---------------------------------------------------+ +| USER | |yes| | |no| | Unique pushover username | ++----------+------------------+---------------------+---------------------------------------------------+ + +.. rubric:: Example + +.. code-block:: console + + IF 1 == 1 THEN pushover TITLE Doorbell rang MESSAGE Doorbell rang TOKEN abcd123abc USER pilight + +.. versionchanged:: 8.1.0 + +.. code-block:: console + + IF 1 == 1 THEN pushover TITLE 'Doorbell rang' MESSAGE 'Doorbell rang' TOKEN abcd123abc USER pilight diff --git a/lib/ESPiLight/pilight/docs/source/eventing/actions/sendmail.rst b/lib/ESPiLight/pilight/docs/source/eventing/actions/sendmail.rst new file mode 100644 index 0000000..c2e74d2 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/actions/sendmail.rst @@ -0,0 +1,52 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Sendmail +======== + +.. rubric:: Description + +Send a message to any e-mail address + +.. rubric:: Options + ++----------+------------------+---------------------+---------------------------------------------------+ +| **Name** | **Required** | **Multiple Values** | **Description** | ++----------+------------------+---------------------+---------------------------------------------------+ +| TO | |yes| | |no| | | ++----------+------------------+---------------------+---------------------------------------------------+ +| SUBJECT | |yes| | |no| | | ++----------+------------------+---------------------+---------------------------------------------------+ +| MESSAGE | |yes| | |no| | | ++----------+------------------+---------------------+---------------------------------------------------+ + +.. note:: + + The ``sendmail`` action requires some additional settings in the pilight configuration: + + .. code-block:: json + + { + "settings": { + "smtp-sender": "sender@domain.com", + "smtp-host": "smtp.smtphost.com", + "smtp-port": 465, + "smtp-user": "smtpuser@domain.com", + "smtp-password": "password" + } + } + +.. rubric:: Examples + +.. code-block:: console + + IF 1 == 1 THEN sendmail SUBJECT Doorbell rang MESSAGE Doorbell rang TO someone@somewhere.com + +.. versionchanged:: 8.1.0 + +.. code-block:: console + + IF 1 == 1 THEN sendmail SUBJECT 'Doorbell rang' MESSAGE 'Doorbell rang' TO someone@somewhere.com \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/actions/switch.rst b/lib/ESPiLight/pilight/docs/source/eventing/actions/switch.rst new file mode 100644 index 0000000..0cbe562 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/actions/switch.rst @@ -0,0 +1,64 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Switch +====== + +.. rubric:: Description + +Changes the state of a switch, relay or dimmer. + +.. rubric:: Options + ++----------+------------------+---------------------+---------------------------------------------------+ +| **Name** | **Required** | **Multiple Values** | **Description** | ++----------+------------------+---------------------+---------------------------------------------------+ +| DEVICE | |yes| | |yes| | Device(s) to change | ++----------+------------------+---------------------+---------------------------------------------------+ +| TO | |yes| | |no| | New state | ++----------+------------------+---------------------+---------------------------------------------------+ + +.. versionadded:: 7.0 + ++----------+------------------+---------------------+---------------------------------------------------+ +| **Name** | **Required** | **Multiple Values** | **Description** | ++----------+------------------+---------------------+---------------------------------------------------+ +| FOR | |no| | |no| | | Determine how long this new state lasts | +| | | | | before we change back to the previous state | ++----------+------------------+---------------------+---------------------------------------------------+ +| AFTER | |no| | |no| | After how long do we want the new state to be set | ++----------+------------------+---------------------+---------------------------------------------------+ + +.. note:: Units for ``FOR`` and ``AFTER`` + + - MILLISECOND + - SECOND + - MINUTE + - HOUR + - DAY + +.. rubric:: Examples + +.. code-block:: console + + IF 1 == 1 THEN switch DEVICE light TO on + IF 1 == 1 THEN switch DEVICE mainlight AND bookshelve AND hall TO on + +.. versionadded:: 7.0 + +.. code-block:: console + + IF 1 == 1 THEN switch DEVICE light TO on FOR 10 MINUTE + IF 1 == 1 THEN switch DEVICE light TO on AFTER 30 MILLISECOND + IF 1 == 1 THEN switch DEVICE light TO off FOR 10 SECOND AFTER 30 MINUTE + +.. versionchanged:: 8.1.0 + +.. code-block:: console + + IF 1 == 1 THEN switch DEVICE light TO on FOR '10 MINUTE' + IF 1 == 1 THEN switch DEVICE light TO on AFTER '30 MILLISECOND' + IF 1 == 1 THEN switch DEVICE light TO off FOR '10 SECOND' AFTER '30 MINUTE' \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/actions/toggle.rst b/lib/ESPiLight/pilight/docs/source/eventing/actions/toggle.rst new file mode 100644 index 0000000..46c876d --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/actions/toggle.rst @@ -0,0 +1,30 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Toggle +====== + +.. rubric:: Description + +Toggles a device between state X and state Y. This action is especially made for ``one-shot`` devices such as a remote control button where a normal separate 'switch-on' and separate 'switch-off' rule doesn't apply. This action will check what the current state of a device is, and will change it to the non-current state. + +.. rubric:: Options + ++----------+------------------+---------------------+---------------------------------------------------+ +| **Name** | **Required** | **Multiple Values** | **Description** | ++----------+------------------+---------------------+---------------------------------------------------+ +| DEVICE | |yes| | |yes| | Device(s) to change | ++----------+------------------+---------------------+---------------------------------------------------+ +| BETWEEN | |yes| | |no| | State 1 | ++----------+------------------+---------------------+---------------------------------------------------+ +| AND | |no| | |no| | State 2 | ++----------+------------------+---------------------+---------------------------------------------------+ + +.. rubric:: Example + +.. code-block:: console + + IF 1 == 1 THEN toggle DEVICE television BETWEEN on AND off \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/examples/index.rst b/lib/ESPiLight/pilight/docs/source/eventing/examples/index.rst new file mode 100644 index 0000000..f90f765 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/examples/index.rst @@ -0,0 +1,12 @@ +Examples +======== + +.. toctree:: + :maxdepth: 1 + + ir + kodi + mail + mail1 + sunriseset + time \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/examples/ir.rst b/lib/ESPiLight/pilight/docs/source/eventing/examples/ir.rst new file mode 100644 index 0000000..f323c22 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/examples/ir.rst @@ -0,0 +1,62 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +IR Remote +========= + +.. rubric:: Description + +Switch devices based on your IR remote buttons + +.. rubric:: Devices + +.. code-block:: json + :linenos: + + { + "devices": { + "television": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 123456, + "unit": 0 + }], + "state": "off" + }, + "remote": { + "protocol": [ "lirc" ], + "id": [{ + "remote": "logitech" + }], + "code": "000000000000e290", + "repeat": 2, + "button": "KEY_P" + } + } + +.. rubric:: Rule + +.. code-block:: json + :linenos: + + { + "remote-television-switch": { + "rule": "IF remote.button IS KEY_P AND remote.repeat == 0 THEN toggle DEVICE television BETWEEN on AND off", + "active": 1 + } + } + +.. versionchanged:: 8.1.0 + +.. code-block:: json + :linenos: + + { + "remote-television-switch": { + "rule": "IF remote.button == KEY_P AND remote.repeat == 0 THEN toggle DEVICE television BETWEEN on AND off", + "active": 1 + } + } \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/examples/kodi.rst b/lib/ESPiLight/pilight/docs/source/eventing/examples/kodi.rst new file mode 100644 index 0000000..989b426 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/examples/kodi.rst @@ -0,0 +1,69 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +XBMC / Kodi +=========== + +.. rubric:: Description + +Execute rules based on XBMC / KODI based events + +.. rubric:: Devices + +.. code-block:: json + :linenos: + + { + "xbmcControls": { + "protocol": [ "xbmc" ], + "id": [{ + "server": "127.0.0.1", + "port": 9090 + }], + "action": "home", + "media": "none" + }, + "speakers": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 123456, + "unit": 4 + }], + "state": "off" + } + } + +.. rubric:: Rule + +.. code-block:: json + :linenos: + + { + "speakers-on": { + "rule": "IF xbmcControls.action IS play THEN switch DEVICE speakers TO on", + "active": 1 + }, + "speakers-off": { + "rule": "IF xbmcControls.action IS pause OR xbmcControls.action IS home THEN switch DEVICE speakers TO off AFTER 3 MINUTES", + "active": 1 + } + } + +.. versionchanged:: 8.1.0 + +.. code-block:: json + :linenos: + + { + "speakers-on": { + "rule": "IF xbmcControls.action == play THEN switch DEVICE speakers TO on", + "active": 1 + }, + "speakers-off": { + "rule": "IF xbmcControls.action == pause OR xbmcControls.action == home THEN switch DEVICE speakers TO off AFTER '3 MINUTES'", + "active": 1 + } + } diff --git a/lib/ESPiLight/pilight/docs/source/eventing/examples/mail.rst b/lib/ESPiLight/pilight/docs/source/eventing/examples/mail.rst new file mode 100644 index 0000000..8307df3 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/examples/mail.rst @@ -0,0 +1,67 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Mail on contact trigger +======================= + +.. rubric:: Description + +Sending a mail based on a contact device trigger including the time when it happened. + +.. rubric:: Devices + +.. code-block:: json + :linenos: + + { + "currentdatetime": { + "protocol": [ "datetime" ], + "id": [{ + "longitude": 1.2345, + "latitude": 12.3456 + }], + "year": 2015, + "month": 1, + "day": 27, + "hour": 14, + "minute": 37, + "second": 8, + "weekday": 3, + "dst": 1 + }, + "frontdoor-contact": { + "protocol": [ "kaku_contact" ], + "id": [{ + "id": 123456, + "unit": 0 + }], + "state": "opened" + } + } + +.. rubric:: Rule + +.. code-block:: json + :linenos: + + { + "frontdoor-contact-mail": { + "rule": "IF frontdoor-contact.state IS opened THEN sendmail TO foo@bar.com SUBJECT Frontdoor was opened at DATE_FORMAT(currentdatetime, %c) MESSAGE .", + "active": 1 + } + } + +.. versionchanged:: 8.1.0 + +.. code-block:: json + :linenos: + + { + "frontdoor-contact-mail": { + "rule": "IF frontdoor-contact.state == opened THEN sendmail TO foo@bar.com SUBJECT 'Frontdoor was opened at ' . DATE_FORMAT(currentdatetime, %c) MESSAGE ..", + "active": 1 + } + } \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/examples/mail1.rst b/lib/ESPiLight/pilight/docs/source/eventing/examples/mail1.rst new file mode 100644 index 0000000..9278c3f --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/examples/mail1.rst @@ -0,0 +1,67 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Mail on computer disconnection +============================== + +.. rubric:: Description + +Send a mail when one of the computer goes offline. + +.. rubric:: Devices + +.. code-block:: json + :linenos: + + { + "currentdatetime": { + "protocol": [ "datetime" ], + "id": [{ + "longitude": 1.2345, + "latitude": 12.3456 + }], + "year": 2015, + "month": 1, + "day": 27, + "hour": 14, + "minute": 37, + "second": 8, + "weekday": 3, + "dst": 1 + }, + "nasPing": { + "protocol": [ "arping" ], + "id": [{ + "mac": "aa:bb:cc:dd:00:11" + }], + "ip": "192.168.1.1", + "state": "connected" + } + } + +.. rubric:: Rule + +.. code-block:: json + :linenos: + + { + "nas-mail": { + "rule": "IF nasPing.state IS disconnected THEN sendmail TO foo@bar.com SUBJECT NAS is offline since DATE_FORMAT(currentdatetime, %c) MESSAGE .", + "active": 1 + } + } + +.. versionchanged:: 8.1.0 + +.. code-block:: json + :linenos: + + { + "nas-mail": { + "rule": "IF nasPing.state IS disconnected THEN sendmail TO foo@bar.com SUBJECT 'NAS is offline since ' . DATE_FORMAT(currentdatetime, %c) MESSAGE ..", + "active": 1 + } + } \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/examples/sunriseset.rst b/lib/ESPiLight/pilight/docs/source/eventing/examples/sunriseset.rst new file mode 100644 index 0000000..b206cab --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/examples/sunriseset.rst @@ -0,0 +1,147 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Sunrise / Sunset Event +====================== + +.. rubric:: Description + +This rule executes when the sun sets or rises. + +.. rubric:: Devices + +.. code-block:: json + :linenos: + + { + "devices": { + "currentdatetime": { + "protocol": [ "datetime" ], + "id": [{ + "longitude": 1.2345, + "latitude": 12.3456 + }], + "year": 2015, + "month": 1, + "day": 27, + "hour": 14, + "minute": 37, + "second": 8, + "weekday": 3, + "dst": 1 + }, + "sunrisesetdevice": { + "protocol": [ "sunriseset" ], + "id": [{ + "longitude": 1.234567, + "latitude": 12.123456 + }], + "sunrise": 6.40, + "sunset": 18.50, + "sun": "rise" + }, + "light": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 123456, + "unit": 0 + }], + "state": "off" + } + } + } + +.. rubric:: Rule + +By using math + +.. code-block:: json + :linenos: + + { + "sunset": { + "rule": "IF ((sunrisesetdevice.sunset == (currentdatetime.hour + (currentdatetime.minute / 100)) AND light.state IS off) AND currentdatetime.second == 0) THEN switch DEVICE light TO on", + "active": 1 + }, + "sunrise": { + "rule": "IF ((sunrisesetdevice.sunrise == (currentdatetime.hour + (currentdatetime.minute / 100)) AND light.state IS off) AND currentdatetime.second == 0) THEN switch DEVICE light TO on", + "active": 1 + } + } + +By using the DATE_FORMAT function + +.. code-block:: json + :linenos: + + { + "sunset": { + "rule": "IF (sunrisesetdevice.sunset == DATE_FORMAT(currentdatetime, %H.%M)) AND light.state IS off AND currentdatetime.second == 0 THEN switch DEVICE light TO on", + "active": 1 + }, + "sunrise": { + "rule": "IF (sunrisesetdevice.sunrise == DATE_FORMAT(currentdatetime, %H.%M)) AND light.state IS off AND currentdatetime.second == 0 THEN switch DEVICE light TO on", + "active": 1 + } + } + +Or an hour before the sun sets: + +.. code-block:: json + :linenos: + + { + "sunset": { + "rule": "IF (sunrisesetdevice.sunset == DATE_FORMAT(DATE_ADD(currentdatetime, +1 HOUR), \"%Y-%m-%d %H:%M:%S\", %H.%M)) AND light.state IS off AND currentdatetime.second == 0 THEN switch DEVICE light TO on", + "active": 1 + } + } + +.. versionchanged:: 8.1.0 + +By using math + +.. code-block:: json + :linenos: + + { + "sunset": { + "rule": "IF ((sunrisesetdevice.sunset == (currentdatetime.hour + (currentdatetime.minute / 100)) AND light.state == off) AND currentdatetime.second == 0) THEN switch DEVICE light TO on", + "active": 1 + }, + "sunrise": { + "rule": "IF ((sunrisesetdevice.sunrise == (currentdatetime.hour + (currentdatetime.minute / 100)) AND light.state == off) AND currentdatetime.second == 0) THEN switch DEVICE light TO on", + "active": 1 + } + } + +By using the DATE_FORMAT function + +.. code-block:: json + :linenos: + + { + "sunset": { + "rule": "IF (sunrisesetdevice.sunset == DATE_FORMAT(currentdatetime, %H.%M)) AND light.state == off AND currentdatetime.second == 0 THEN switch DEVICE light TO on", + "active": 1 + }, + "sunrise": { + "rule": "IF (sunrisesetdevice.sunrise == DATE_FORMAT(currentdatetime, %H.%M)) AND light.state == off AND currentdatetime.second == 0 THEN switch DEVICE light TO on", + "active": 1 + } + } + +Or an hour before the sun sets: + +.. code-block:: json + :linenos: + + { + "sunset": { + "rule": "IF (sunrisesetdevice.sunset == DATE_FORMAT(DATE_ADD(currentdatetime, '+1 HOUR'), '%Y-%m-%d %H:%M:%S', %H.%M)) AND light.state == off AND currentdatetime.second == 0 THEN switch DEVICE light TO on", + "active": 1 + } + } \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/examples/time.rst b/lib/ESPiLight/pilight/docs/source/eventing/examples/time.rst new file mode 100644 index 0000000..35fc021 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/examples/time.rst @@ -0,0 +1,67 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Time based +========== + +.. rubric:: Description + +Trigger events based on time + +.. rubric:: Devices + +.. code-block:: json + :linenos: + + { + "currentdatetime": { + "protocol": [ "datetime" ], + "id": [{ + "longitude": 1.2345, + "latitude": 12.3456 + }], + "year": 2015, + "month": 1, + "day": 27, + "hour": 14, + "minute": 37, + "second": 8, + "weekday": 3, + "dst": 1 + }, + "outsidelight": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 123456, + "unit": 0 + }], + "state": "off" + } + } + +.. rubric:: Rule + +.. code-block:: json + :linenos: + + { + "christmass-tree-off": { + "rule": "IF DATE_FORMAT(currentdatetime, %H.%M%S) == 23.0000 THEN switch DEVICE outsidelight TO on AFTER RANDOM(0, 90) MINUTE FOR RANDOM(5, 15) MINUTE", + "active": 1 + } + } + +.. versionchanged:: 8.1.0 + +.. code-block:: json + :linenos: + + { + "christmass-tree-off": { + "rule": "IF DATE_FORMAT(currentdatetime, %H.%M%S) == 23.0000 THEN switch DEVICE outsidelight TO on AFTER RANDOM(0, 90) . ' MINUTE' FOR RANDOM(5, 15) . ' MINUTE'", + "active": 1 + } + } \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/functions/date_add.rst b/lib/ESPiLight/pilight/docs/source/eventing/functions/date_add.rst new file mode 100644 index 0000000..9b39b56 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/functions/date_add.rst @@ -0,0 +1,56 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +date_add +======== + +.. rubric:: Description + +Calculations with date and time values. + +.. rubric:: Arguments + ++----------+------------------+------------------------------------------+ +| **#** | **Required** | **Description** | ++----------+------------------+------------------------------------------+ +| 1 | |yes| | | A datetime device or a datetime string | +| | | | The datetime string must be in the | +| | | | format YYYY-MM-DD HH:MM:SS. | ++----------+------------------+------------------------------------------+ +| 2 | |yes| | | A number and unit. The number can be | +| | | | either positive or negative. | +| | | | The unit can be | +| | | | - SECOND | +| | | | - MINUTE | +| | | | - HOUR | +| | | | - DAY | +| | | | - MONTH | +| | | | - YEAR | ++----------+------------------+------------------------------------------+ + +.. rubric:: Return value + +The returned datetime string is always in the format ``%Y-%m-%d %H:%M:%S``. So in case of the third example, the output will be ``"2016-01-01 00:00:00"``. + +.. rubric:: Examples + +.. code-block:: console + + IF DATE_ADD(datetime, +1 HOUR) == ... + IF DATE_ADD(datetime, -1 DAY) == ... + IF DATE_ADD(2015-12-31, 23:59:59, +1 SECOND) == ... + IF DATE_ADD(datetime, RANDOM(-3, +3) DAY) == ... + IF DATE_FORMAT(DATE_ADD(2015-01-01 21:00:00, RANDOM(0, 120) MINUTE), \"%Y-%m-%d %H:%M:%S\", %H.%M) == ... + +.. versionchanged:: 8.1.0 + +.. code-block:: console + + IF DATE_ADD(datetime, '+1 HOUR') == ... + IF DATE_ADD(datetime, '-1 DAY') == ... + IF DATE_ADD('2015-12-31, 23:59:59', '+1 SECOND') == ... + IF DATE_ADD(datetime, RANDOM(-3, +3) . ' DAY') == ... + IF DATE_FORMAT(DATE_ADD('2015-01-01 21:00:00', RANDOM(0, 120) . ' MINUTE'), '%Y-%m-%d %H:%M:%S', %H.%M) == ... diff --git a/lib/ESPiLight/pilight/docs/source/eventing/functions/date_format.rst b/lib/ESPiLight/pilight/docs/source/eventing/functions/date_format.rst new file mode 100644 index 0000000..53e6739 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/functions/date_format.rst @@ -0,0 +1,152 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +date_format +=========== + +.. rubric:: Description + +Reformat date and time values + +.. rubric:: Arguments + ++----------+------------------+------------------------------------------+ +| **#** | **Required** | **Description** | ++----------+------------------+------------------------------------------+ +| **Using two parameters** | ++----------+------------------+------------------------------------------+ +| 1 | |yes| | A datetime device | ++----------+------------------+------------------------------------------+ +| 2 | |yes| | Output format (see below) | ++----------+------------------+------------------------------------------+ +| **Using three parameters** | ++----------+------------------+------------------------------------------+ +| 1 | |yes| | A datetime string | ++----------+------------------+------------------------------------------+ +| 2 | |yes| | Input format (see below) | ++----------+------------------+------------------------------------------+ +| 3 | |yes| | Output format (see below) | ++----------+------------------+------------------------------------------+ + +.. note:: **Input / output** + + Consider that the flexibility of the function depends on the input. If you input just ``%H:%M:%S``, the DATE_FORMAT can't output a format like this ``%Y-%m-%d``, because the function didn't receive any date information. It only received time information. So, DATE_FORMAT can't be used to exterpolate information that's not present. + +.. rubric:: Return value + +The function will output the exact format as requested in the last (second or third argument). There are a few things you must consider when working with the DATE_FORMAT function. The types of operators you can use with DATE_FORMAT depends on the output format requested. If you want to compare the output format ``%c`` you can only use the ``IS`` operator, because the final output will be interpreted as a string value. If you want to compare ``%H.%M``, you will need numeric operators like ``==``, ``>``, or ``<``, because the output will be evaluated as a number. + +Also consider the usage of quotes. The flexibility in which DATE_FORMAT can format date and time values isn't always accepted by pilight. For example: ``DATE_FORMAT(datetime, %c)`` outputs ``Fri Apr 24 11:35:36 2015`` which pilight subsequently can't handle. If you want to output string like this, use quotes ``DATE_FORMAT(datetime, "%c")``, which will output as ``"Fri Apr 24 11:35:36 2015"``. + +.. rubric:: Examples + +.. code-block:: console + + IF DATE_ADD(datetime, +1 HOUR) == ... + IF DATE_ADD(datetime, -1 DAY) == ... + IF DATE_ADD(2015-12-31, 23:59:59, +1 SECOND) == ... + IF DATE_ADD(datetime, RANDOM(-3, +3) DAY) == ... + IF DATE_FORMAT(DATE_ADD(2015-01-01 21:00:00, RANDOM(0, 120) MINUTE), \"%Y-%m-%d %H:%M:%S\", %H.%M) == ... + +.. versionchanged:: 8.1.0 + +.. code-block:: console + + IF DATE_ADD(datetime, '+1 HOUR') == ... + IF DATE_ADD(datetime, '-1 DAY') == ... + IF DATE_ADD(2015-12-31, 23:59:59, '+1 SECOND') == ... + IF DATE_ADD(datetime, RANDOM(-3, +3) . ' DAY') == ... + IF DATE_FORMAT(DATE_ADD('2015-01-01 21:00:00', RANDOM(0, 120) . ' MINUTE'), '%Y-%m-%d %H:%M:%S', %H.%M) == ... + +.. note:: **DATE_ADD as an argument** + +When you use DATE_ADD as the first argument, you should consider the return value of DATE_ADD, because that's what DATE_FORMAT will eventually receive. The output format of DATE_ADD is ``"%Y-%m-%d %H:%M:%S"``, so the input format for DATE_FORMAT should be the same. + +.. rubric:: Formatting characters + ++---------------+------------------------------------------------------------------------+--------------------------+ +| **Specifier** | **Replaced by** | **Example** | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %a | Abbreviated weekday name [#f1]_ | Thu | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %A | Full weekday name [#f1]_ | Thursday | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %b %h | Abbreviated month name [#f1]_ | Aug | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %B | Full month name [#f1]_ | August | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %c | Date and time representation [#f1]_ | Thu Aug 23 14:55:02 2001 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %C | Year divided by 100 and truncated to integer (00-99) | 20 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %d | Day of the month, zero-padded (01-31) | 23 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %D | Short MM/DD/YY date, equivalent to %m/%d/%y | 08/23/01 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %e | Day of the month, space-padded (1-31) | 23 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %F | Short YYYY-MM-DD date, equivalent to %Y-%m-%d | 2001-08-23 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %g | Week-based year, last two digits (00-99) | 01 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %G | Week-based year | 2001 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %g | Week-based year | 2001 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %H | Hour in 24h format (00-23) | 14 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %I | Hour in 12h format (01-12) | 02 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %j | Day of the year (001-366) | 235 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %m | Month as a decimal number (01-12) | 08 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %M | Minute (00-59) | 55 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %n | New-line character ('\n') | | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %p | AM or PM designation | PM | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %r | 12-hour clock time [#f1]_ | 02:55:02 pm | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %R | 24-hour HH:MM time, equivalent to %H:%M | 14:55 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %S | Second (00-61) | 02 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %t | Horizontal-tab character ('\t') | | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %T | ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S | 14:55:02 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %u | ISO 8601 weekday as number with Monday as 1 (1-7) | 4 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %U | Week number with the first Sunday as the first day of week one (00-53) | 33 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %V | ISO 8601 week number (01-53) | 34 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %w | Weekday as a decimal number with Sunday as 0 (0-6) | 4 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %W | Week number with the first Monday as the first day of week one (00-53) | 34 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %x | Date representation [#f1]_ | 08/23/01 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %X | Time representation [#f1]_ | 14:55:02 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %y | Year, last two digits (00-99) | 01 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %Y | Year | 2001 | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %z | | ISO 8601 offset from UTC in timezone (1 minute=1, 1 hour=100) | +100 | +| | | If timezone cannot be determined, no characters | | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %Z | | Timezone name or abbreviation [#f1]_ | CDT | +| | | If timezone cannot be determined, no characters | | ++---------------+------------------------------------------------------------------------+--------------------------+ +| %% | A ``%`` sign | % | ++---------------+------------------------------------------------------------------------+--------------------------+ + +Copied from http://www.cplusplus.com/reference/ctime/strftime/ + +.. [#f1] These specifiers are locale-dependent. \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/functions/index.rst b/lib/ESPiLight/pilight/docs/source/eventing/functions/index.rst new file mode 100644 index 0000000..d6a376d --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/functions/index.rst @@ -0,0 +1,11 @@ +Functions +========= + +.. versionadded:: 7.0 + +.. toctree:: + :maxdepth: 1 + + random + date_add + date_format \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/functions/random.rst b/lib/ESPiLight/pilight/docs/source/eventing/functions/random.rst new file mode 100644 index 0000000..2a56db4 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/functions/random.rst @@ -0,0 +1,34 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +random +====== + +.. rubric:: Description + +Generate a random number. + +.. rubric:: Parameters + ++----------+------------------+---------------------+ +| **#** | **Required** | **Description** | ++----------+------------------+---------------------+ +| 1 | |yes| | Lower boundary | ++----------+------------------+---------------------+ +| 2 | |yes| | Higher boundary | ++----------+------------------+---------------------+ + +.. rubric:: Return value + +A random number + +.. rubric:: Examples + +.. code-block:: console + + IF RANDOM(0, 10) == 5 THEN ... + IF RANDOM(1, 100) == 10 THEN ... + IF RANDOM(randomLow.dimlevel, randomHigh.dimlevel) == 10 THEN ... \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/index.rst b/lib/ESPiLight/pilight/docs/source/eventing/index.rst new file mode 100644 index 0000000..adb5f5f --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/index.rst @@ -0,0 +1,11 @@ +Eventing +======== + +.. toctree:: + :maxdepth: 2 + + syntax + operators + actions/index + functions/index + examples/index \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/eventing/operators.rst b/lib/ESPiLight/pilight/docs/source/eventing/operators.rst new file mode 100644 index 0000000..f94c96b --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/operators.rst @@ -0,0 +1,106 @@ +Operators +========= + +.. rubric:: Arithmetic + ++--------------+-------------------------------------------------+--------------------------+ +| **Operator** | **Description** | **Example** | ++--------------+-------------------------------------------------+--------------------------+ +| \+ | Adds two operands. | 10 + 20 = 30 | ++--------------+-------------------------------------------------+--------------------------+ +| − | Subtracts second operand from the first. | 10 − 20 = -10 | ++--------------+-------------------------------------------------+--------------------------+ +| \* | Multiplies both operands. | 10 * 20 = 200 | ++--------------+-------------------------------------------------+--------------------------+ +| / | Divides numerator by de-numerator. | | 10 / 20 = 2 | +| | | | 10 / 3 = 3.333... | ++--------------+-------------------------------------------------+--------------------------+ +| \\ [#f1]_ | Integer divides numerator by de-numerator. | 10 \\ 3 = 3 | ++--------------+-------------------------------------------------+--------------------------+ +| % | Remainder after an integer division. | | 20 % 10 = 0 | +| | | | 11 % 3 = 2 | ++--------------+-------------------------------------------------+--------------------------+ + +.. [#f1] The backslash is also used as an ``escape`` character. So if you want to use the intdivide operator inside a rule you must write your rulses like this: + + .. code-block:: json + + { + "rules": { + "rule": "IF 3 \\ 2 = 1 THEN switch DEVICE light TO on", + "active": 1 + } + } + +.. rubric:: Relational + ++--------------+-------------------------------------------------+--------------------------+ +| **Operator** | **Description** | **Example** | ++--------------+-------------------------------------------------+--------------------------+ +| == | | Checks if the first and second (nummeric) | | 20 == 10 = false | +| | | operand are equal. | | 10 == 10 = true | ++--------------+-------------------------------------------------+--------------------------+ +| != | | Checks if the first and second (nummeric) | | 20 != 10 = true | +| | | operand are unequal. | | 10 != 10 = false | ++--------------+-------------------------------------------------+--------------------------+ +| IS | | Checks if the first and second (character) | | a IS b = false | +| | | operand are equal. | | a IS a = true | ++--------------+-------------------------------------------------+--------------------------+ +| >= | | Checks if the first operand is greater or | | 20 >= 10 = true | +| | | equal to the second operand. | | 10 >= 20 = false | +| | | | 10 >= 10 = true | ++--------------+-------------------------------------------------+--------------------------+ +| > | | Checks if the first operand is greater than | | 20 > 10 = true | +| | | the second operand. | | 10 > 20 = false | +| | | | 10 > 10 = false | ++--------------+-------------------------------------------------+--------------------------+ +| <= | | Checks if the first operand is smaller or | | 20 <= 10 = false | +| | | equal to the second operand. | | 10 <= 20 = true | +| | | | 10 <= 10 = true | ++--------------+-------------------------------------------------+--------------------------+ +| < | | Checks if the first operand is smaller than | | 20 < 10 = false | +| | | the second operand. | | 10 < 20 = true | +| | | | 10 < 10 = false | ++--------------+-------------------------------------------------+--------------------------+ + +.. versionadded:: 8.0 ISNOT operator added + +.. deprecated:: 8.1.0 + ++--------------+-------------------------------------------------+--------------------------+ +| **Operator** | **Description** | **Example** | ++--------------+-------------------------------------------------+--------------------------+ +| ISNOT | | Checks if the first and second (character) | | a ISNOT b = true | +| | | operand are equal. | | a ISNOT a = false | ++--------------+-------------------------------------------------+--------------------------+ + +.. rubric:: Logical + ++--------------+-------------------------------------------------+--------------------------+ +| **Operator** | **Description** | **Example** | ++--------------+-------------------------------------------------+--------------------------+ +| AND | | Checks if the first and second operands are | | 1 AND 1 = true | +| | | true. | | 1 AND 0 = false | +| | | - values greater of smaller then 0 are true | | foo AND false = true | +| | | - strings equals to ``0`` are false | | true AND true = true | +| | | - strings other than ``0`` are true | | false AND false = true | ++--------------+-------------------------------------------------+--------------------------+ +| OR | | Checks if the first or second operands are | | 0 OR 0 = false | +| | | true. | | 1 OR 0 = true | +| | | - values greater of smaller then 0 are true | | foo OR false = true | +| | | - strings equals to ``0`` are false | | true OR true = true | +| | | - strings other than ``0`` are true | | false OR false = true | ++--------------+-------------------------------------------------+--------------------------+ + +.. rubric:: Other + +.. versionadded:: 8.1.0 + ++----------------+-------------------------------------------------+--------------------------+ +| **Operator** | **Description** | **Example** | ++----------------+-------------------------------------------------+--------------------------+ +| | . | Concatenates two strings | | a . b == 'ab' | +| | (single dot) | | | a . ' ' . b == 'a b' | +| | | | RANDOM(1, 2) . '34' | ++----------------+-------------------------------------------------+--------------------------+ + diff --git a/lib/ESPiLight/pilight/docs/source/eventing/syntax.rst b/lib/ESPiLight/pilight/docs/source/eventing/syntax.rst new file mode 100644 index 0000000..b189ebf --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/eventing/syntax.rst @@ -0,0 +1,366 @@ +.. role:: event-success +.. role:: event-fail + +Syntax +====== + +- `Introduction`_ +- `Rule Parsing`_ + - `Basic Structure`_ + - `True or False`_ + - `AND and OR`_ + - `Hooks`_ +- `Operator`_ +- `String and Concatenation`_ +- `Devices`_ +- `Functions`_ +- `Actions`_ +- `Using Device Parameters`_ + +Introduction +------------ + +The pilight eventing library allows you to automate your house by writing event rules. These rules tell pilight what should happen at a given time or at a given event. pilight event rules follow the regular mathematical conventions and because you can work with an infinite number of hooks, they can become highly complex but are also highly flexible. + +As with everything inside pilight, the eventing library is also highly modular. This means that the operators, actions, and functions are external modules that can be easily extended. Developers and users do not have to touch the core of the eventing library to add additional features. + +Rule Parsing +------------ + +There are few things that are useful to know before working with pilight event rules. When you better understand how pilight parses the rules, you can write really efficient and advanced rules. + +.. _Basic Structure: +.. rubric:: Basic Structure + +All rules basically consist of the same structure: + +.. code-block:: guess + + IF ... THEN ... + +A rule always start with the IF, followed by the rule logic, and is closed by a THEN. All actions are put after the THEN. + +.. versionadded:: 8.1.0 + +The IF / THEN logic can be expanded by an ELSE. The actions written after the ELSE will be executed if the logic contained in the first if block is false. + +.. code-block:: guess + + IF ... THEN ... ELSE ... + +Or you can nest an infinite number of IF/ELSE conditions by using adding the END keyword + +.. code-block:: guess + + IF ... THEN IF ... THEN ... ELSE ... END ELSE IF ... THEN ... ELSE ... END END + +.. _True or False: + +.. rubric:: True or False + +Let us start with how pilight handles succeeding or failing conditions. pilight converts each logical mathematical and logical step into a true or false. The final condition must be true before triggering an action. If the final result is false, the action is skipped. These two examples will both succeed: + +:event-success:`Succeeds` + +.. code-block:: guess + + IF (1 == 1) == True THEN + +:event-success:`Succeeds` + +.. code-block:: guess + + IF (1 == 1) != False THEN + +These two examples will both fail: + +:event-fail:`Fails` + +.. code-block:: guess + + IF (1 == 0) IS True THEN + +:event-fail:`Fails` + +.. code-block:: guess + + IF (1 != 1) IS False THEN + +.. _AND and OR: +.. rubric:: AND and OR + +In the first examples we only used one condition but this does not allow us to make very advanced and flexible rules. Therefore we need to be able to combine several conditions in a single rule. This is possible by combining them with AND and OR operators. Let us take a look at some basic examples: + +:event-fail:`Fails` + +.. code-block:: guess + + IF 1 == 1 AND 1 == 2 THEN ... + +:event-success:`Succeeds` + +.. code-block:: guess + + IF 1 == 1 OR 1 == 2 THEN ... + +:event-fail:`Fails` + +.. code-block:: guess + + IF 1 == 2 OR 1 == 1 AND 2 == 3 THEN ... + +:event-success:`Succeeds` + +.. code-block:: guess + + IF 1 == 1 OR 1 == 1 AND 2 == 3 THEN ... + +:event-fail:`Fails` + +.. code-block:: guess + + IF 1 == 2 AND 1 == 1 OR 2 == 3 THEN ... + +:event-success:`Succeeds` + +.. code-block:: guess + + IF 1 == 1 AND 2 == 2 OR 2 == 3 THEN ... + +In the first two examples only a single AND and OR operator is used. In the rest of the examples we see multiple AND and OR operators. pilight follows standard operator associativity rules in parsing AND and OR operators. + +.. _Hooks: +.. rubric:: Hooks + +As we saw in our first examples, hooks can be used inside pilight rules. This can be useful to better structure and combine the various conditions of our rules. Let us create even more complex rules and see how hooks can change the outcome of a rule without changing the conditions. + +:event-success:`Succeeds` + +.. code-block:: guess + + IF 1 == 2 OR 2 == 3 AND 2 == 3 OR 1 == 1 THEN ... + +:event-fail:`Fails` + +.. code-block:: guess + + IF (1 == 2 OR 2 == 3) AND (2 == 3 OR 1 == 1) THEN ... + +Operator +-------- + +Various mathematical operators can be used to do calculations inside our rules. A list of these operators can be found further on in this manual. pilight follows standard operator associativity rules in parsing mathematical operators. Let us just show some basic self-explanatory examples: + +:event-success:`Succeeds` + +.. code-block:: guess + + IF 1 + 1 == 2 THEN ... + +:event-success:`Succeeds` + +.. code-block:: guess + + IF 2 % 2 == 0 THEN ... + +:event-success:`Succeeds` + +.. code-block:: guess + + IF 1 < 10 THEN ... + +:event-fail:`Fails` + +.. code-block:: guess + + IF 10 / 2 == 4 THEN ... + +String and Concatenation +------------------------ + +.. versionadded:: 8.1.0 + +pilight parses individual components inside a rule by looking at queues like spaces, comma's, hooks, and preserved words (e.g. actions or functions). In any case, pilight can be forces to parse any of these components as strings by enclosing them into quotes. + +:event-success:`Succeeds` + +.. code-block:: guess + + IF 1 + 1 == 3 - 1 THEN ... + +In this case, pilight will compare the outcome of both formulas (which is 2) with each other for further parsing. We can also tell pilight to compare the same formula but now with strings: + +:event-fail:`Fails` + +.. code-block:: guess + + IF '1 + 1' == '3 - 1' THEN ... + +The same formula parsed with two strings will now fail because both strings are not equal anymore. + +It is important to understand how to enforce string parsing when working with functions. The following example with give a syntax error, because the DATE_ADD function only expects two arguments delimited by a comma when the first argument is a datetime device. However, pilight sees the ``+1`` and ``HOUR`` as two separate string that normally should be delimited by a comma. Would be add that comma, we would still call the DATE_ADD function with the wrong parameter count. + +.. code-block:: guess + + IF DATE_ADD(datetime, +1 HOUR) == ... + +The rule above should be written like this instead so the ``+1`` and ``HOUR`` are parsed like ``+1 HOUR``. + +.. code-block:: guess + + IF DATE_ADD(datetime, '+1 HOUR') == ... + +Another issue arises when strings and device values or functions need to be combined like in this example: + +.. code-block:: guess + + IF ... THEN label DEVICE alarm TO the alarm was trigger at DATE_FORMAT(datetime, %Y-%m-%d) + +This rule will trigger a syntax error because the TO argument only expects one string, but five strings and a function were given. To make this into one string we need to use quotes and the concatenate ``.`` operator: + +.. code-block:: guess + + IF ... THEN label DEVICE alarm TO 'the alarm was trigger at' . DATE_FORMAT(datetime, %Y-%m-%d) + +Another scenario in which we want to explicitly cast a keyword into a string is given in this example: + +.. code-block:: guess + + IF ... THEN label DEVICE label TO on + +The ``label`` device is parsed by pilight as the label action because it's a reserved keyword. pilight does allow using label as a device name when casting it as a string like this: + +.. code-block:: guess + + IF ... THEN label DEVICE 'label' TO on + +As shown above, keywords or operators can be parsed into strings so pilight will ignore their default meaning. + +Devices +------- + +pilight rules are quite useless if we cannot work with live data. This live data comes from our devices in and around the house. So let us say we have a switch called switch and we use this configured device to create a rule like this: + +.. code-block:: guess + + IF switch.state IS on THEN ... + +Depending on the actual state of the switch this rule will succeed or fail. Let us now use a dimmer device called *dimmer*. + +.. code-block:: guess + + IF dimmer.dimlevel > 10 THEN ... + +Again, this rule will succeed or fail depending on the actual dimlevel of the configured dimmer device. These two examples can of course be combined: + +.. code-block:: guess + + IF switch.state IS on AND dimmer.dimlevel > 10 THEN ... + +As you can also see, the fields (*state* or *dimlevel*) we can use depends on the device we are using inside our rules. A switch does not have a *dimlevel* field but a dimmer does have a *state* field. + +.. versionadded:: 8.0 rules based on received codes + +Some devices are only used inside rules. Configuring them as explicit devices might sometimes feel a bit bloated. Therefor, pilight allows you to trigger rules based on received codes instead of device updates: + +.. deprecated:: 8.1.0 + +.. code-block:: guess + + IF archtech_switch.state IS on AND archtech_switch.id == 123456 AND arctech_switch.unit == 0 THEN ... + +.. versionadded:: 8.1.0 + +.. code-block:: guess + + IF archtech_switch.state == on AND archtech_switch.id == 123456 AND arctech_switch.unit == 0 THEN ... + +In this case, an action will be triggered as soon as an ``archtech_switch`` code is received with a specific state, id, and unitcode. The ``arctech_switch`` doesn't have to be configured as an explicit device for this rule to work. + +Functions +--------- + +In some cases, standard operators limit us in writing our rules. For example, calculating with time is a hideous task considering that hours do not go above 24, minute and seconds do not go above 60, and there are no negative numbers. Other functionality like randomization are also not possible in the standard event operators. This more advanced functionality is added in the form of function. A simple example: + +.. code-block:: guess + + IF datetime.hour == RANDOM(21, 23) THEN ... + +As we can see in this example we use the RANDOM function to check if the hour is either 21, 22, or 23. This allows us to trigger an action on random hours each day. Actions can also be nested for more advanced logic: + +.. code-block:: guess + + IF datetime.hour == RANDOM(RANDOM(21, 22), RANDOM(22, 23)) THEN ... + +The output of this RANDOM function is the same as with the previous example, but the idea should be clear. + +Actions +------- + +Actions are the final goal of our rules. These actions tell pilight what should happen when certain conditions have been met. A rule can contain unlimited number of actions and each action can trigger an unlimited number of devices. First two examples of basic actions triggering a switch called *lamp* and a dimmer called *ambientLight*: + +.. code-block:: guess + + IF ... THEN switch DEVICE lamp TO on + IF ... THEN dim DEVICE ambientLight TO 10 + +Both actions only trigger a single device. However, if we wanted to trigger both device to just on we can combine them in a single action: + +.. code-block:: guess + + IF ... THEN switch DEVICE lamp AND ambientLight TO on + +As we can see here, the switch action takes at least the DEVICE and TO parameters. In case of the switch action, several values (as in devices) can be combined by separating them with ANDs. We can also combine dim and switch action would we want to switch the *lamp* to on and dim the *ambientLight* to dimlevel 10 based on the same condition: + +.. code-block:: guess + + IF ... THEN switch DEVICE lamp TO on AND dim DEVICE ambientLight TO 10 + +We can combine an unlimited number of actions like this. Again we see that we use the AND to combine several actions. We can also switch several devices across several actions in a single rule. Let's say we have a relay connected to our television set called television that we want to turn on as well. + +.. code-block:: guess + + IF ... THEN switch DEVICE lamp AND television TO on AND dim DEVICE ambientLight TO 10 + +.. versionadded:: 8.1.0 + +As described earlier, actions can also be trigger based on a false condition like this: + +.. code-block:: guess + + IF ... THEN switch DEVICE lamp AND television TO on ELSE dim DEVICE ambientLight TO 10 END + +Using Device Parameters +----------------------- + +Device parameters can be used as rule input almost everywhere. Let us look at a few examples to demonstrate this: + +.. code-block:: guess + + IF 1 == 1 THEN dim DEVICE dimmer TO dimmerMax.dimlevel FOR dimmerDuration.dimlevel + +In this case we use three dimmer devices. One dimmer called dimmer that we actually want to dim, and two dimmers that changes the way this rule behaves. The dimmerMax device tells pilight to what value the dimmer should dim. The dimmerDuration device tells pilight how long it should take to reach that dimlevel. Another example: + +.. code-block:: guess + + IF 1 == 1 THEN switch DEVICE lamp1 TO lamp2.state + +In this case we want to switch the device lamp1 to the same state as the device lamp2. + +Device parameters can also be used in function: + +.. code-block:: guess + + IF RANDOM(randomLow.dimlevel, randomHigh.dimlevel) == 10 THEN switch DEVICE lamp1 TO on + +In this case we use two dimmers called randomLow and randomHigh to dynamically change the input of the RANDOM function used in this rule. A comprehensive and advanced example: + +.. code-block:: guess + + IF sunriseset.sunset == DATE_FORMAT(DATE_ADD(datetime, +1 HOUR), \"%Y-%m-%d %H:%M:%S\", %H.%M) THEN switch DEVICE lamp1 TO on + +.. versionchanged:: 8.1.0 + +.. code-block:: guess + + IF sunriseset.sunset == DATE_FORMAT(DATE_ADD(datetime, '+1 HOUR'), '%Y-%m-%d %H:%M:%S', %H.%M) THEN switch DEVICE lamp1 TO on \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/faq.rst b/lib/ESPiLight/pilight/docs/source/faq.rst new file mode 100644 index 0000000..48fbd1e --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/faq.rst @@ -0,0 +1,186 @@ +Frequently Asked Questions +========================== + +- `General`_ + - `Retrieving pilight version`_ + - `pilight doesn't start or immediately exits`_ + - `Fixing SSDP connection issues`_ + - `Disabling SSDP completely`_ + - `Using other devices besides 433.92 MHz`_ + - `Fixing broken Lirc and 1-wire protocols`_ + - `Fixing the high CPU usage after a Kernel upgrade`_ +- `Sending & Receiving`_ + - `The GPIO connected receiver does not work`_ + - `I only see sent codes, not received ones`_ + - `Let devices learn new codes sent from pilight`_ +- `Configuration`_ + - `How to use raw codes in the configuration`_ + - `How to fix an empty webGUI`_ + +.. deprecated:: 8.0 + +- `General`_ + - `Using PHP inside the pilight webserver`_ +- `Sending & Receiving`_ + - `The send-repeat setting does not work anymore`_ + +General +------- + +.. _Retrieving pilight version: +.. rubric:: Retrieving pilight version + +You can use the following command to retrieve the pilight version: + +.. code-block:: console + + pi@pilight:~# pilight-daemon -V + +If you run a stable version, only the version will be shown: + +.. code-block:: console + + pilight-daemon version v7.0 + +If you run a developmental version, a commit message will also be shown. It will point to the last commit included in your pilight compilation. + +.. code-block:: console + + pilight-daemon version v7.0-24-gb64a135 + +In this case, the 24th commit after version 7.0 with the SHA id gb64a135 is running. To see which commit this is, check the `git development commit list `_. + +.. _pilight doesn't start or immediately exits: +.. rubric:: pilight doesn't start or immediately exits + +Most probably you made an error in the pilight configuration. Start pilight in debug mode and check the output: + +.. code-block:: console + + pi@pilight:~# pilight-daemon -D + +.. _Fixing SSDP connection issues: +.. rubric:: Fixing SSDP connection issues + +Make sure your iptables are set correctly: + +.. code-block:: console + + pi@pilight:~# sudo iptables -A INPUT -s 127.0.0.1 -j ACCEPT + +Also make sure your network interfaces are configured correctly in **/etc/network/interfaces**: + +.. code-block:: guess + :linenos: + + auto lo + iface lo inet loopback + allow-hotplug eth0 + auto eth0 + iface eth0 inet static + address x.x.x.x + netmask 255.255.255.0 + gateway x.x.x.x + +Especially the **iface lo inet loopback** part is essential for SSDP to work. A reboot could be necessary after making these changes. + +.. _Disabling SSDP completely: +.. rubric:: Disabling SSDP completely + +Add the standalone setting in the config.json and set it to 1. + +.. code-block:: json + :linenos: + + { + "settings": { + "standalone": 1 + } + } + +However, because all pilight clients use SSDP to find the main pilight daemon, you need to pass the server and port arguments when you want to control this standalone running daemon. Check the documentation for the specific pilight client for additonal information. + +.. _Using PHP inside the pilight webserver: +.. rubric:: Using PHP inside the pilight webserver + +.. deprecated:: 8.0 + +You probably encounter this message when running pilight in debug mode: + +.. code-block:: guess + :linenos: + + pilight-daemon: ERROR: php support disabled due to missing php-cgi executable + +This means that you miss some packages to run PHP. The required packages pilight needs for PHP support are: + +- php-cgi +- base64 +- cat + +.. _Using other devices besides 433.92 MHz: +.. rubric:: Using other devices besides 433.92 MHz + +pilight was built with 433.92 MHz devices as a reference, but the code is not limited to this frequency. We actually always wrote the code with other frequencies in mind. The only reason no other frequencies like 868 MHz are supported is lack of time and the lack of other developers to do it for us. The hardware part of pilight is completely modular so adding support for other frequencies should be as easy as writing new protocols. + +.. _Fixing broken Lirc and 1-wire protocols: +.. rubric:: Fixing broken Lirc and 1-wire protocols + +You probably installed the latest Raspberry Pi kernel. The new kernel works with device trees so the kernel knows what devices you want to use. Check the Raspberry Pi documentation how to use this new device tree. + +.. _Fixing the high CPU usage after a Kernel upgrade: +.. rubric:: Fixing the high CPU usage after a Kernel upgrade + +The wiringPi GPIO library used in pilight version 5.0 and lower contained a bug. This is fixed in pilight version 6 and up. + +Version 8 and up use the wiringX library also written by the pilight developers which also fixes the (old) wiringPi bugs. + +Sending & Receiving +------------------- + +.. _The GPIO connected receiver does not work: +.. rubric:: The GPIO connected receiver does not work + +The most encountered reason for this problem is the quality of the receiver. A lot of users buy unsupported (cheap) receivers from either eBay, DealExtreme or similar sites often referred to as FS1000A and XY-MK-5V. However, these receivers have a terrible range. To make sure it is the receiver and not a fault in connecting the device to your Raspberry Pi, make sure to keep your remote next to the receiver. If it still fails, check then check your connections. + +If you do want to use pilight for controlling devices across your house, consider buying a good quality receiver. Refer to the pilight shop for supported peripherals. + +.. _I only see sent codes, not received ones: +.. rubric:: I only see sent codes, not received ones + +The pilight receive output always contains an origin value. This means you can see from were the outputted code came from. Only if this field says receiver you know that the code was picked up by the receiver. When it says sender the codes has been created and processed internally. pilight processes these codes as if it was a received code so it can update the GUIs and config. Only if you see receiver you know it was not generated by pilight. + +.. _Let devices learn new codes sent from pilight: +.. rubric:: Let devices learn new codes sent from pilight + +Some protocols support learning devices. This learn feature temporarily sends an increased amount of codes to the device. Check the protocol send arguments to see if your protocol supports it. For example, the KlikAanKlikUit protocol does this as follows: + +.. code-block:: console + + pi@pilight:~# pilight-send -p kaku_switch -i 1 -u 1 -t -l + +.. _The send-repeat setting does not work anymore: +.. rubric:: The send-repeat setting does not work anymore + +.. deprecated:: 6.0 + +pilight version 6 was the last version supporting the global send-repeat setting. This setting told pilight how often a pulsetrain was repeated. This setting got removed because it interfered with a lot of protocols. + +Most remote control devices repeat a pulsetrain two to six times on a single button press. On some devices all pulsetrains are identical, so repeating them does not introduce any issues. However, on some devices the 1st pulsetrain differs from the subsequent pulsetrains. In addition, some devices sent a wakeup pulse sequence before the very 1st pulsetrain to trigger internal wakeup logic. Most devices use footer pulses, while devices transmit header pulses, and some devices transmit both. +If you keep the button pressed on some remote controls, a series of pulsetrains is sent until the button is released, while others stop sending repetitive pulsetrains after a certain time period, and some set a toggle bit for repetitive pulsetrains each time a button is pressed. + +pilight was not differentiating between those various operating scenarios, because the send-repeat parameter specified only how often a single pulsetrain was re-transmitted for all devices. So increasing the global send-repeats actually broke a lot of these protocols. We therefore removed the old global send-repeat parameter and replaced it with a protocol specific repeat parameter, currently not configurable from userspace. +We also discovered that in almost all cases, the solution was not increasing the send-repeats parameter, but instead using a good antenna. + +Configuration +------------- + +.. _How to use raw codes in the configuration: +.. rubric:: How to use raw codes in the configuration + +This is not possible, because pilight cannot know what these codes mean and how to interpret them. + +.. _How to fix an empty webGUI: +.. rubric:: How to fix an empty webGUI + +You need to add devices to the "GUI" section of config.json as well, not just the "devices" section. diff --git a/lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeA+B.pdf b/lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeA+B.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9b1a01be318550a9b88dcd9b2562ae24e59431b5 GIT binary patch literal 335799 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 z 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 eH@HV=Au^p!l33L0*}-ZN zX4Z7E9YP%GZHD*R1MWVK%v@!|<&WyU&i~RPlo^*rN{iknH~|J~$(`tN5(3_t(_tq8 zt)Weym#sIOpO30OkAKq zZ#J#E@ntDR{M{@TS9VTW&z0UK^!X}z563@p%}W2*Zew?Uz9!{F!GW?+(#FQ0Ejiv0 zn7Q94a@HaqIcpcbQvNv)5x+QYhX3HWJ@^wl(E@;_p0N{f+{R!p-6M7a6H6}gG`?c& zgvP{RC*fe3T^zT^zM~nr)=JmY6G>3RnQv;x0YzEIJ9YwPKvd*f4m%ELE=6zL$BsMD zi{oba$#MIQ`$lIQt9F2+CHJE-C<+Q@vR-j#rLSu1{~K4Xq6LiE3culzLl^N4<*78~ z(2dI4)4W~N;#AMXTbAC9BAxD}@zIAt4cQEEk8)QRC2|yvDem zmcuVvM)#2y*)T|FM6rM$?}2usnrRZ>8U>5S+SeBb^y1Jx_`yN^gg0e{aMMz7oLem`$00l4>U_j#kIo0ZGrd1EQP z(oTQM#nF4u8?MB{ju^+&{FzeD^9FCUSitK(Z;U^-HO})ECH;HeKFR;ToeeCvcREhu zKNtS^O=w7qk~t5*302HKmwTSvZ_-(EditB2--NWzG1}?zIA$vNO)#%@Xmm6_jfM-; zvv@4#r42>W@R+H`yj1CCjzWle9n8!p=5?S^GQIc@Ht2(QWJ}cUJFQIC!G*+HEOKi* ze=qhE>FkPy658J+@T8O{t!LQ$1U`|%!|?Huy; z)-O{zeqlfl$rSL59UX9VqN~-B^a7 zk}2Zvd8;UN{A7dqdBZ;}sovZG{KHze-^_mAD$-uozL>vJ6Nu*x+;~yq)A_WBqprP_ z;(0?Z;$$tu^Sm`SIBDfPZ;`qGp0|j`^Y-HZwOIs*|LV#{_zi!@sVw<3Ee6?HhV{`* zn?^>^hh&ZZYNpCpM1QrSy{$|$ooc1w`K=y(5)rC#r7%9)Xx$q0@7Wjc`=8kwzu`fn zf8_aZ_!a8}dl9`SZ+_x|Ke0}79lL6wZ>$q+Nyz&Cb;dfuxh%^v7oS)s_?gI@%FzNp z+1nx3d9b&G|L9Mw?mWsGzvCAR_ZJrUi9h~{iya>D=c|JEBg{aEb%yymVx2m>Y1Jdv z8CD|1IuG<>hdchpI>Wk!SZ92X80(C0{l+@u7rs%-gB>1Xod-KS+D?2~RyU8Mu+Zgt z&Z+Vf!5$WSz*(;kKamXNWXz9;pV(Peayl>G_=yp{+2IckN?Cpw<}7JvE3jrd--GM5 zoTdK0HCK00UWP9WJKnHpC z)$LFA`4cOR(k+Yuh4mXx9b~XPmcO~{AYk5$f_L&0kC}=(NSxUaE44x^{p7!4&1!{X{?JVj&zn2l z{5P!pD8-q%uA9Uhg;zI;=&{p|T#1DiCto&l9Ud*osAYA&2VyI;Cf{lP){MlU(BAQd zA!p;v`*{3=*9m_7fWT2zxc(VGPQ2kiB*%jXzw{x2A|54K#NV$va%G+w&}dvu=ejX= zM>hVsZjAKJQOlLHgQ#G=R`ZhVNA8gE+`_sAo?Cp6$a9Nt{qo%67ls_BGY{&CwO)Bs zukQAqk|X!(IZ+|j8qVJlYt_@5*2#YhCp*MiBYJ8I0e@nxK@NmiYkZFwYmIOH##-YS zhMf>Krx0sBG_7O*v9a68f5I<~&F~+ZU%lR|IheUp2tsmw0-~WX*q5eH;H2vxK&+t)IYQnPFicBcmzM80*J- zOllbAdTTJfCM@aW3nyAfL6dmr17n~;W@2XYJAdC7zR`15Zb+g{tHCyM&XCSsz{{Sz zhAaL!*t&sZ!-=yP|3pd-yx;OPhMSzdcYmOYG4wY0VZyGFF~G|%>^*%vO_vNMJ6@@x zSR>I~3#}%GLpEiT;B2@-d!;2F_4GwFvt_k@OM;OuD4K9g)~n)+=4$UzkgddcD}oK6 zEOMTZ4KuU`)rrGnIe4Eu;}Ea^0yC+ezlw}+RIxwbFc&skUHA8((bQlkmH74WF^|-) zd1W3rYZ{*On%EL)U-Oz4TSLrq#S$VHx&K(-G_B$7u^Zxve0R>La|-QL-f*ELA6K~W z!p?&yxS}2nw)*dag zr%Pcjf!-;VeA3ok{fGUgszS4PjcgH-X24=LtW~`ly-|m50f$&640eee88Ki%Gg{ zH@}G5lFL@9xRnI}*)Y*oNXPgfTPbxJ=-sR|i<>dCIr2Xzjx^A%+>R43C|)9>rI3WX zDm`lmFN%d$fTBc%*3Lxzu%fKyq5&e-pXa58eyj2{lA;p3v9v@20Y^r|TJ%xVH%I@7 z%rP?CAn~?KNPgn&N@`x7$s{T2vTmTrOJ+wT%GZ(D?V_;WOJlcOoYn&75uQdNW^($% zc}F?|)S-S!2SnxMFt-_T%u@l^FW2*KL0m#U&TkxaG{r9>D!17e0VrxUOdWe7uY1_j zVhPHQD2U6U554^&Xjxm)xy!JdFM(yEV{GO~Z2LyhKGPRbQA1}@6cj3qQBiYYHj_uG zrmFKKTS?3jR^|{KG|c)%RQ6&ubZ$5^iLR9Ajxx>0*lQGDuYqouh2*T-^~=$baw}TV z1c!VR^kz$a=$eDFH9DEXVTZtY99!3%6Pb&mRc3N1np*YUwz|Kv6WDb)uosi_tc0o{+Iuw%I2MP5i!yF4fC|4FMBzp;+5xaj27&_5Y8j z8Qjt_-jSJU$!b^Udmy1CF?tZ+8sfJx_d9-JM14MN48xDx=D;6W9DXs#?eKnwln-AM z?u78=K~{!&IwWqG)#K@B1&)!Q^}62US>5>7VdsP|jA*!R4jf&;$Flu|?1w~dlsqq* zUK{6r2e~U(-66DVi`{SNVD+3k#F_2=&{sL>Db30nV5;q|TwUceHM`k&N;A0(89f)9 zk(Tt_6}CCq=j|3{*)i8a_Ql(+v+3(f*BWFtA$RLUtgb#3m63}*D;jB2`AII~_8Ya! z-B?uyqwKv~j0O_$AH^M zy;=yiXD~yEq8Y2}DGhM|-W&3OYf)lcw(0kYsJ7L{mL0yfKAlB998vG!og|iIGYb~1 zNE-wGiMC8{n@~CQY25y{6GWrV)owfaOhX?ln0IF1qu4HMXm(3f=B}A-H_C2yzrs~! zT2#l*@-dQSe1pIsS3Xw}k(k|WWRW1e=aCD%Go$eEeDzvXmO&NhYSAN4ZscP3yjWWaZ- zN*Ralu1IkwiW6-pOuFu?-X~d4(7B3Oh|TuM=sMdt1<2Xte#(Pgv4L*b+P?e5u2UTz zE(~ZN>)$H`-`YqhBX#n6o014lRX(OH+`#91C_*RSIjk*MDg zX*=Ez^fokpb}8)N13vy5J|`eQX_SK`K4imjrj}^@Nl{QZ+bNwN^pegGZqiu}m--;y zQPBFLX39C}m(@0~`m9k`9ng2UY5a3NX~IZAMH$+oTA_cq#k zFU8SEHtXK5;JK(BA*W+?J0DEXAzDbRwln5u56XN(cExdeGuiyqKqKmw%iq7q0JVVz z+xh+QP9ON>MSx#LURF!ghCzUqrN{TcdaGuIyVZ$b9cW@yscA!g6$BGXXMUL0^9yGI z-l0;;aY8T#S{u*Q_kE%Qeyn^L=fvM%4Lc&dA!tfs^``TCXvWp0D-pgP9eWnCT9286 z5FUg3IHJLmao~^N;~4qzksR+4JSxXqKmM2F3ty`%&PTM}X2p-6HX7%(u~^|eN0}Xw z13gdgFV2DBdmH!rA*ZBijg9a%bF$g;KEFJoah?KxtUKyn54&*=9H*y`b?z!Oavqwm z6m}r;b(H6R?pM%xv|e}I-3WYc&5;TxA)-+yj`*uV$B|!cJG{rCn}@d!ntb@epmB!z zIP})A?uXtQc1ai|?5OaIVgDWP7p1`aHBn-`U;atHs9u7W)(y>Lg7x*!i7zDetycBT z1CIXfYA+A`k@(q)K3v~ceQyfVc{CZpltngbGtocn}!z*E4 z^gKB)ex96Tl;`BcUwlu_`F`)oiC^=ch4|$W^?5o^&S~XGydVt4RSUleGQueIM}_y> zRLcESzF&iQcI%X);mg4b+w{`Kd3w-OqQ5xT_g#fBN?5V*i(!3__Y1ord`;YG@0Wkt zf83d9Z`E1g;MABS9{qv`UQwzK`Vi1HHzg_V{)wd3!d7phe417v-=y}_;6>A$X)Gxx zeR{JJThg0I7D^0aqTq*Qy@wjhA7Tt-J(QZwizxQp#M7`)NV*^@6OSm!fCF>PYBKuq z3!+t==rqZFX6hG2d$5UW@W-uy=4#dYFT}e=R1v=Q@$|Ri&T9#y6s_D}6-ABbrYJHO z9A)qcW7ounn}+v>iW5ZT6RM#Wi5dtI<>#KC7Y)! z3jSSJ6sgZP2J1a8yPHR$J^>UBNDbYII_;_sMJUZWPZh1svj@IDda%&|U~yLi-IbayJdUZUtvX2lo74Q=86CppX}B3W^O%DEd!Ru}jd;*f zZ+y+g^#Yo!+HugtL5(7cqQJbHJAFZP(~6y=Popg&Ca5*ZvLtwnLWcqAcNd6?+*n~l26ctW&8>8l2%*vDro7|}j2^rHYedz03 z(OR`CG&rdAd~yslP0u{h&{GiA(v?9407K!V8Marv31Xhn zUa80hK&M0Qrk#`fNlGdj<;PB)7R!kY0-PCil`Mv*&DW99oI|lh>sL1zbW4FA!$w~Ok*sGOg{6sD!m2o0L+><6VGAJiIn`xK_ z>+zWZM|nH*M9xXy45jB#?-RUZt0TIFHj10>GxdV;^5YmHW=d-oy&S#s+#wBpDZ_#6 zRw#lhuWOmdTyqQv(w)rLD(8H4mHD!a+t7gshN4Iev2{$K)B3$3n^t{3@2cZA*~L9r zaNRUT<*Hle!FqgEY*i|Emf3*jtBN;cIA5RcSG{?&)@!^Yau;sCDxk7A_4GczD$aIR zMql(*VQo;&cYH-(6d8SH;GtqYiua@dW{2R_)^T9I>_MuJvFa949GS*74*;ONzJj zU?-V43U28}HW<)e2RzF0mPRNFjXV98hDww5y*GGW=Pivd-^fAWZQOfF=KljV!X%Wo zjxRRXa`6tmk7do5$@kfY%9i(*jbd<6(WeyWa_bmF2q7~3@33UuXX`iQVIe7^Q;t*^)*Tpn|$5(M^Rlx^#Xko$Q z!G^dskA9AV;xN5u^P9AdKXN~fHn(Y?vh(d!WB)btNhPFl_N{wWG*$KVB?S5TcK89Zq{VWU%0GEcm#o{0@tt9i!c@~hJ&rKnYuTyXqPP#zDdK+;;u z^FpI`@kzFPTkZS8plX}Vy!)v_>mo}tAr9@4L)5BP#u4z%9j33ISDHI$u#z+oIqn_lEOshyS_DJ;*A}6*q@ePC?c3|2a>}C z|A4Gc=&(M<54I=g3D4KHpZV^}ph9M6HNOwnXQv16IhlU}ovZT)Jg`OszFAt*SfjHp zk5kFrN;VQM{8{~uU$dz0kN+rE6Q6lAiDRHjy9j9B{Y5n6Nj6+$jXL_bvPQ)cQr}8= zdLSWVnAc`DR9z$wRQ8d_{_y+8_=N7ihv^j}sL8GcKQz_lF}G2aOA5PgcKhx!n|iqw zSFS5@#Hqd=@7+9Bg|A9HgT~7{7i?07Xuto!J`FfzE$-TzmHHcgvQ?p^cG`W%?`B?q zIp6O|eCBa~7x9sgc`#gyY}u?K@t>?$x#*T@va{={g$UXY6H4A){lgSlxFmh`;C>_P z6~X#-u5@I*#(lw1$fj-|o<_BV$(lxS$BE9h(Zl)PpCo;ZcI{?JxLRG?^qn8k$Rs;) zIaf*N^^=@b4l7&{rI!*%`sczom^G{GyU#L{vEAgNf`v+V`__Izi0{vC(gJ=Ebon;j zyx;&ULwF94?>oQl7PE)AgR`>dF zf?oVQp$FcYT2wbKU$y)FyO270JH!5c&riJc=lQvEoCm{ORm+OAh9g3BuCbpPp3wRr z7h!Ka>(Qr4Km;WphGj0fQUa1qA@<9CX-mWg*Rx0%4w3*QC^(79P!m>esOa3iPP9H zTnx)>JTKH_v5XF}DvD*HWCVE?1*fIk%|BOpaz&=752mq{w#djVbX2)^W6Z5XGjWt- z$o@wK{p)G)MRUnMGM0pzkX%B`HIQk#I&fL4Y+6>@n!8ZoC>YDWMWiSE=RliizuV_; znFRhrUXJ|we4a;g-M7iNoXdRHXBWqRWPE;%>NC_Ds~YL})3ig_UB+7}Y!Q~)j~R`4 z{DKRwQ|-4E!mY~zB4Opk!WACE$S5*BH3uuCh{Ug&u(Z4m*ql3tGJq;JU`UNpE8yb9q zVm@0m0Iq z7r9_(3OOTmjMM7?R^`x~5oD~HF9NBBw<8qh;8Hko_k6kB}M%7G`*6e;q zsr#MAk4zFp|NfClqWJe8GE7jJu_*J9r3TA-GEd}_>0JR42cE@$Df1M&FiC^6p#IdQEDt9QziPFN^x%!oEex4bck9xf9P!m3QAl+`qg9e;OvF*4osO zVY+v6L~tpAs{ciFXV z*P(^#`zzKDaBkj@G6f_GNaz+31vC*LG!FvZ0>4k1ABpWb$I=xqZJndF+wQB6^u%$T zq`CRwcMUu9Wb|KflW9X4i*xtG(dtc9tQ!<%h z4a6nI_leo`riLnb{KVbNySVje7T+WboY-eTl}=mJQWJEE3KI1#E|A3=HL1EuyR1gp z>UwM0aP%yD0pM~fb~%4BaiP4W4M=j>EcmaLdnx-yNDSRCUVuMj>+=S^^~3`2MqW+qNcOVWNkea_iN7_6&OaHeOG zyq&Y&ciAt1T5)rKe&ngjyH}a&Th3D4xv%*CQ1`lLG$;!O_mxGmC+{vGal*(A8x<;p#nJ!ktu@4!WIZ^~Yql~~GP*UYUm@a#`{&wxC-n?t#q)ZvaaC574oh5DUn|peCEM>L8 z+$Bq;4at}t$h}ySr2$kjHs&0P3f8@Jf{On(j4N8_HO6*lWCBz-T z=KM*lnsNu)ljbK^me$o=Ra&$u2a{#~?ComEcfEJ9q;cQpXyIw-5fIms-%Of0$R|Y= zCsEjGmnV-4s4XY2NOvAva#F{xdOMvb?O7cf@?8c0k?(r(yJzKJ>>A6-p4GI^?ODy& zm_4ica;eMi9TS^PN1)17-q}d&Vt=?jTQ^VlEU|U-)29=< z><;Rj)KAFPnqBXWaGEQ63%IFjOWu*IWRHU8wv^Qe6+Fp!h0VzhV-jWei`Ogs6|uiY z^%rT?+c z?|KfEJI!g_f=*`jVruTrIhYuXHe{zf=U$>6k)gMs`LSalXd|?py{BY}pH*nfJFv>h zTmr9M`U43ixeC+ttO2WXoC1YEVWpmVS0sADXI7m@Sv4$v$(#LV91F3`Q{*7~MRTwCsP5sULBx4_xY3?l8FD9-;oNGN#;B4< zH%F>XzvwL1TiCjDCXKu(@N07VgPWV8IHDubM>(NqO48?|3=ih!asG|bW1~sDQ6sM- zqlr$G-a7GX*VwS#F@|`(L~ocZ!otDc>}E_K8zbA56MwHOG(oc zuGDH(>+XFFIX^sJO6S6o+<#^ zu~C!E{#>VW9?srT^P-WbytaCs%+Udu&V$uv;G6C<(Bor}a#awbM)bx({bwsX(KNNn?boAw}|iBZAS zl7~Ns3<@D{%;2u`4$K(DVy%>`3c+V$o#;+|%Glg9u}%TRR%Vr)i3PP2ITLfJjhKuY zi;KW5o`@?bnki@B#k@k$pfW{tuYHw7xuz&Ayssh6Nzxp(U+#2hOayK?2c}npYK@El zznQfM-gt34P-a4GXH!ZZw;J~af2<|&7qY&RMQsFb>?ZDD41OHYx_SAh_ju=ie0j&M zo9=ApD6;#nYW3jB%W2-EHMnxTxifQ_&SFm0L+5)HDWvSevd?W#QV4Du{XNp`w+0A#7xYPAMDwD}+%`CZ2 zeZK6Zamt25wpd^qWDgKwIJ+Er3y6Q5@d>VDtwnh2^D1%C1fbe)pzOA_-B6Mm9Lmk~j!i2sJky z<)-Job?+{!JLiu}Z@7-FETMLEk5 zdFcv@XjMHFjp-_=hD%h4X6K5b*shM1Z&Wge>=ZEnFxcOUPgT`~q_0>TN*|3bc_WFA zDri2WCV6I;3lUURE*B!Gs$4Dvozqd_MfVn(uM)X7l0=nV?QU$bXx}Qbiu|UwBGJux zzRmkQvmD_avEw9u1P=3rPeR@_@og?}Qf*Q^bFMD%*4xrE0Eoj2&*F>_Y5SNH1~hC} zT}v(+R9h5}sx22EbhDgf6*#f|VidX3vI>9`LTAp9fr1P8`sa5wm+<{889+WnE4x&Mu|Pse3-#@vZhh2^6n+}UtoGA02vymFNWci$JmG0hlVl95| zt#MCOcINvcY+*?kOuiIpi=xGIUfplcfWaVnNN3HT;)PL@q%eB6{XESb@G zbD_9+L@-*4e@hue-yV#f;5^Xz+;kj+@lYsBoNn3ly;?>-x|y7M>}S>Ws*mjojyZO8Y}kO(FuE z{Ytw}+|e(7_M=JS4dm{~jGL=<$+;gpWr<`?@LMEe;X^=;h9=K(EJ$Z}C3Csdaqrbz zW3|DC-1?z8yJuS8v!b)5ZNid*ioGb^mBsfJ#24+X&s%Xl%(=YK_{9yU#NK1?CAr3D zwNCQ1@rFnZPd`w5qS$dLuzU{AzXMK*n5w~bg843IerM0ML}%yh<(jY?+L&_AI7tePnXwm_o$}T<{s62p}A$Vnqc;>&T4|$yES~RbHs3Fif z0yJOamE-iwEgID4E)FTILJ>5*nKSSq@RB(8H|;=zF}Cvjj@N34M`x6tbzf+e^vuk& z@rIqLHr_DGfFJQN@u-e? zaUAn)y2*gX9cx}dPY^sh(M&v>uANwYuv5iAYWV^kH;dxoI{zo?h>b3?2yLW>8r2co z)kyW~h>YKu1F5V2Er>Z-1%iGNOb3ZM66;*p_EF4HYx7_8q6qut77gl%ibr+Ci{k?1 zDKB!A1D(MWF81nTBA{osN$r6bL6L%Coph@4qOH1*P1Q-K16CbTQ9n~2PUDMFfb(~6 z!H98v6#m7$4i4b_QD<+!yBgPAc}17Tf%oTx&LG|kzU+g(|Cjzaz2=0 zKwnPzz@$Oidhgx>FB&ZH;$nfF2y*T%G-9mRLcb__#u#7jYu7$l18ZX1udy1g@5?P} zXYgUJs~bvrL!|5Yk+6-b?|v(8ec8yM_tpl=3kFgeFAB)|8?x}B%5 zc=bk-Fe$bGor5b+5a|eM?WEg@^IN%xJ-^5IGQjtioLlq?WlKV>EoEU!cdXq>bURz? zNis0-%c5@di=O8<<0o*;Qc3Lcr=he2xkia|gg;F>pS6VjWzhM&`^%v7dH0v3AXY<; zCaYShnl)xg!tF09h@G%R_PMzx)hA5!oAQp5Y84H^E$UjNAi7zp63mdBWiaRj@{1M3 zavGW+vvy}SLmZ=X9tfhaNvk<)7B;WN2xgFsexOh^kPe3z~7I#EQA7=exjDaH!J-eYn>JbvUl262Aqdo+w&N zSj2K+6iRwm{jZ1(V`IkJ5OfNN5~ZRdTKATd#7?)ctQMLiZwDl{CALZhPl{Hbn6tAc zEe_S2-b0qUNYNKtJBZ*hijq`UKlON?Ejyq+3R@H|2v(DL^!O)g2WU>!^?7N@p! zZ1!BL&Odfdq5yhk$W{96?4fA9nxgsiSJQW#g>VbwsaDcKB8Av;6(Z-LN?L=enTk#- zB{meX5#UWLrL=)V^KZe+)+&C-Ru}syQoLpLhRap`{+qrib&&3q8|BG-izaWWS{Er- zVi%L{=vd1uDmmRzb4KEHN6i@t>5k?d&PYgyadzcup`xYB>ZOI!3$8|fyg5*S_dk>cGHtv{SJobeOw zQeq4*Rikf(b@PtvB=K58p&(Rcy;0p<)an&x&7caeeae`XPT65tv%t<3*64{wxtG94 zm8{+MuUcx7{y7*(esw z2l!Wo)o;en%D|Oq5ENpgCU{Sr%R_QVNS-Hj6B&lTzY|{-BXOKXR<3X2y5=&PQ#FYy z9YYa{VpYQGI|ECK!pO*~Tse@q;&~*ss^hTd<7Z~kzC8n|e8ICS(3%6awJJPk7OTl> z-BXlJ$f>R>GX#WeIniq*jYuf$RVzuJF1WKS*QK?9PmI1r-S<4LOx<1BH_#o`8k!}% zYPq_XNC#Af;L0kV@By9g3*RYUP%6G>g+bZ)o)wbjXX6@%<}H*>Rkbc=FPrpVDXE_` z?!cAKxn+$gkhCQpcBjd^Y{pr6<#MaPIeHlTo<8g02s%C3k5k8@^J~D5NVhx6l{SN|)Bq`$=TQ%PK`x z0rtzyB|T7>T^8OyNmMjhaZjA33M*$D)Q7IPRc8p&FdAtj6P;YndMeH-C~^mFd^0-^ zf#O+1uVQ&2k@w2{D>RkR${L`gUQkLG6vYDIzotoE4ewhX5F|%gtIC!=@9)2xMp+J&Dkdi(6Ow_v|&NMB`^sC!aG$@`l{H`uhJk|-mQ<`tjg0zcEP=$UleG;&(5H@xfd zxNG>gz?)MrR}GJq){otFUwe71jNfeJ6VvUkJ6Ld`E{?nv!ck2=FR4#(0{SiMUeme} z#Gs>U5{L%+DzfvQO>zf-ABVsv^2h(pG-UUVx{-2{R(nc<8`S*X~mwBOJR7ajCWmx{GKm8G0g;id8lKeU#E+!zN1^~;M0 z3hMXXnd_XaaPLg>ucR%?5k)GzKyq`)@Lp3$gCntXE!o7rZLfx8&sQ&#^x;Va^ED(k)XJK`K3W|{qj#pah+VYdkgAHF4ixB8{#`9+Bs(SQ@r7k zx-!JFs>+wG$laH7xml(tuFsvSROLBc#(EKOhPsC*4*6=riO0Q|c!4cDHU#!FYb1Ww z4P~7UQk)jw@I#4R&JE9giz`B6dvLY_il6OU7bYo~%M$&omx60bot5GZ8Wh@p_`2%_ zbI<)pMJ9tgOR+dM!L5s4{PFEYxU^@-#Wfb_I;sm}_G~kBm)s~#SMj=;p-eSC^165_ z>EVMt5b;sh?e(*@(vz-1xrelONsUf$uu)qnCG~_ATJmC@v+L-i_>%IV`rdN(&{ip` z=*}ms(%STk^fH4VHiJWid}`l6&{}mdcr8^6oPOtHeVY zx@+={W9lgt@;sZ`;n~>n$u3fVc9OIBkL?r|7QMEh}1?tI0X= zrX&(xxn^zm)EKHt;x#vw4Hl1gLaZrkTB2enidV@(hMm;wWtZr<6=cNnsT(q_q0VQuMdPI#g;e_PRt!3F4Np`&%#wBP@XvUwz%zKmW_0|LLFq_WbjI{6l)=CwvF5 zo&KSJ@66~w;Tmr5^fXcGDgFDO|L|Y_$N&A$*MItx>7W1f^}qe|AO5TV_&@ylpa0W8 zjQq#{^1t~f{rNxtlt2IV`QQKg=fC^!)1N>8Bmdr?|HA%+|9LtM#RNam$?0ea7XCl} z!Owq{M_@z53$=*CR1jT_x zRU#5y*wXFe4lTIOqRV@aXGwVVZ$`3J<9EDvAgpMm z^k`?KCYIXvc81&SM0GA~e_S-!*~Mub8&v^J?k!wb7ZiQd624bB-Zt^KKvpc#yXn-l z?ae*1M2W=sA*>NYw0;b#_C)V^__e?9fOo3Ja&;y77jYt4xVD{XU*izI^0&XQfgdSz zD*Il({CT2Z{TZ$pI6gSb)%h=TSIRbR@N^twP!-vSb6k@kE=_1comtuKXS&^)8z0st z_h6xYNTa85{mNO^1xrW6S>@Sa;25_xk1i6=AY!z~7r0$rv{LlVU_Ijm+P4D)4^*jB zE74XjTs;pxG0-nu7|EO@OnqfoThS724Y%UO3lz7u6u071w73@y9;~<&cemnJ+})wL zyIX=ggy7CQz4w0aycB}uaHT}x`x{;yftTM(;FZQ}+ zXE2RiJndYul~4HDuh`0W+qw&5-V0HLlmg74Ab(aFsW7My|u->nc)7_Es+FT(>f?(}EIHoYr`0 zGB@4qZJoaKz~W|)1|-KP@T_vCf}1>LBtq0Ra%6mp5|ND9F5-ty-Lo*tEN(C1iBNEw zNXcPVn7kW<>F;=52(t|AZy#e6Sq4M}M*^brrG`8p*9?U2IL$&F!S+Uhx6WwIUy`xP zXCT^q4jt!>95#!iF8_=KtKL3l#{(QJK{`BJD$9phT%UH6*s)#b_RB^3()yTCP`mEY zz#9K1`P;&AV}aeYsH&0~!PmOz$(jh_1SLEik_SvFYn7v^ovdaB<(p{kyXEl6nBVJW zigj47K^yZK?XLw3e`xGBkkTO|M#8C_Y&0^BcBguQ5-0x6x*c!!sH5OxUy_HY@8e|a z{+4{h5uuWlAx~I!d*>3xCxJo{()D{QuLS*1gs$Q8;c--4nbQ5V(_?1)p`p|FeVjkL z3OQDnP?&h`xm0&r3h#J2as)eW$WDcEaH@0a(X05h=%SC_Ym$Oyvq4;gZ$|T(4wy+i z-ngWzHOf2X`R~_t%iIh%4>A>-4{BPD^Yvx5`N2OBVv*-Zr@Tcu;wAmmn{%(`k`cnE zoTV7BG(^+4h?C7-$#SoCg90V$Z~FmF2NA1a8(;;u%2(#dHptI*Q^>HlE763S+Ffwt zW6;eq-V?+g6&lke=e?xa?T8dPkFDKX+R`8wc4C-O-`Rh)D@_Eu8kG{4D|s-Zu(#;% zu}%V0IL%{x&OKrIqlBpzbc}7-3+pM|7gAeE4TnPNsUIZza-2y!1Q)uw`t`u0wCguc zyw6bb27>idSs9qUDLZevRu)I&rx+PZ#mB!#`C4hrii0sfbc@ai5i3$(NIg!qJ5u+Yw(GA)vp#-X^FMusL0> zfKuG0O8VNAQAXoRbgkKZV76I`%Pxvf0`q0&O*QYd$A7q&fVAreBS<&&)?JL>ChK%7TSEPw5B&T1BcC1MIx!;{E9;ZSvp$(hqNDFEmKS#Z?#p{GTbWZNa zH!!lL6KW6#w2{Z(t}qsf2Hi`F2nWkH`709`cE`vvgAB7o$f3JjIB1TW_LCn^22P9b++?bvaunA7rat8YP!&+*mT!{1}n_t9iDiV-aQ{j&s*(ROy z@JBg*LDSrnf{=5=uX9W<8WNBCu@!eFtNHiV0n*jC~U z{B&1?PhFQDhMS`BB?6sYCWrBx%dDp|K2lc1f#viN8upOv!6ce`Rhj)(lqjo8ZvXjP zkMTApFGGUw!nrD?`5r|wbXPmawP!y9>u*v~+zEDsc~B!fd-gNcMqH2LsSOy)1I`89KgL#Qf9+@{r znL}7lWJPVJeM3>Nr`^f<#B|C(K0yTkW|kM@7P1I$M|=mNnbBO%kS|AQ$+now2VV_j z4WDOtJR7hH4!3@4yy83)RG%Ai9VuYM{vgc6xN#ey=@7Pr}&zo%4w`35>2gJh=Cp10SpwdTPAbM`^ z8+SRFS80K|8luaTQRi@@uz7@To*J>zx!?poYMw6G@5w5-w$M|v>@B$uKOiubTAn~_ zgwFX(ZvB+&)Sc_*K)M&u>i77r9v$2>7;@t2wzpB6(B(;hA4< ziG9~RH=PhuMSe{99Fz`!z8HUoZ<=Bxm`t;AS%wcsAdNW{_nM~*p`ni{?eX)?({Pa| zD|p*d=~1?ne(Eu2>LA%}tyYT`NF7+HL4am3y2Rhv*}nFP04|q%GoU*k8RpKY6nl&(+dTi5HYI1 zqh6&eo^LNqIU~Rl=B3fKqu1c{z86<%EG0T1#Ne{LE@xgT)g@gXvP)3<%uv2zYAw5% zE9&G9AH}Ef4x#Iv$7{kTdC!8eeN$I|(OwpsQ`4lW`~_0VKz?-8*1JS>vaCS{St2SD zjBpMtbxN$*Nvb1FWBEmkJz-npWCxrrb*^d&iYJiySzeY-NwDNFVg}k*6RC7cER0-5 z=V~N;bgk)YTq!N{9Y(k(7|N1fGqd{^Y}LJM6>+OIQDc*pOwY%{9l5{<{l4s5hGH`1Iu2rN}c7OX&$iQ{C zJx5EJ83`8h`!n>Ju#SCp%_d)qlrdSG$uupYGR!(tX;pPuG9@QW%39jyY0naM6J_2? z6V^*`!+q5^ubGl#06a?p_LqxO9u8?VMfStdVpt4Ms5bvZgGcBq4jMpNP8lh{E#4+O zsbH_4GeP_^G83kpp9(>ziM`v=-o#zzvPRlo&%Ty#xNI4gV6-=Qjzxq|?V}MM-|q=_ zWWP|`dh?Ok^q@DvvdV${grz5h(P)TmtbNzS1-k*+2qK*-1}4G%9kdl-n#4!K!NcJGzQCveM&-eC&riS4HGqr3jdg5PcgMW_b`kHw#qaFSdBBky>gVP&qL9NOb4c2D63*(rmN{lv3Z5UebVEDBEd83YO4b zS)sYAV@ry_P8gh93DRCSXJl9R&$XqZUc$19jbjU$6d&xj_j}ce;)X=?n^4I`WO8_r zp3!#u7b36)Atv|7DQ?^rBbZ2)2XzBjF}8kJ`&a451D)hL?g=-BqR+&21x{rBa^Vx{_HSJ<}A8xyQ-nG&V6@IC=7!%*b?gRw`2|n_nMR8>%d5) zziaZ~=1M=|<6~oo-FJ|D4M z$*YBxL5&c4{2~Jo|w}fP;umC?VOJuD`@g zdmWZ%i^*E&hXY0){RZ|Zn)M9!<`D!WK7a&5~^BnjUy(rMvW!@nnnp zq!napb1pHE?cQLNfajCRCiHCdG`kuBH?tN%YA@7v#W+#Z3+uKiR-^9zd9(8l`?hr` zc)V55YUOcclEbh>#Xi0@>#SQ!H~RYBxKZFh;$)?p{zEEtlE5D3U>m}ga50&Td+ki> zl1N{WQV&}C07<}OAFU~gbnCQe#y8b=g2*%`asSsnBdxH5P}x~)YrY%KC}%NU;>kgs zj|CXNJ*62LTrSFfBRVtX_ebsTYr1U8zFjJbAw`9yD#ps@l#FcW-MU|?2rbB1r$i-z z;ChTlABY|epVO6D82BSf%HmDrmKBe;$yj(hs>&kN!j5)3x3fG2=Xz^|)O25TmqNd9 z&*vC`Jc*u+Q&sJ$9L65C{EcsO$)bDK(n-q29YLNuhiP2Czq{lE3`dZep4sfWz@@`= zS@chFKL=eF*dGy`ndN$^zbV`CURt<;e}#N~U@B(#gHD>3KULF+k{GA4WRf>##j=sD znD@2vOVQM7ayHuhobDG4wr|Rl15+wGnkj##k02rl^M!g$RqxSY0k*w%b1a4)*_^gX z?7yK4snGD;NW+?OZ}#0S4a)S>-wlK~ZUr$PS*l9q?*$TP%{zjIY)^>Wk>L3Y>xaUI zbaAESFmSo9%w3zQqt%xOiK(2J*`mg}xL^7$ce8>4@GC>9VZ!>xO>$yV*V;DK*?eMM zo@5$3Pt@n?OiVw! z01NX_HM`~Oi_r{|Gh-6Nm^+VHFm1e$$9uKX1QobV)v^a>TghaiV+jqlHf~2??)=ZU zURdJf)?c0l@KjIgQV)fB#gn@(zdS~8@JIZ4kRu`^L1>MsE!_N0{DABIz{WlGV0f|! zwKbaTSlHcWJ9IVJVq+q|9VYC@BXxVy)Xc+g`&hC<8(mNk9KfhavtA=?n~Ptqw1N?} z^oJ31=WydmAV2vmb3otpg3deHZkw%Q5#%zAVoR49d&)LNhCEQgQqwQ2G)Tkcu#2mf zqip{~TrMg~v(8PP#|GociR^f=9Zz}uYk9@pqkqNbv8&LyDf#?v9QylUVfym#kY{7< zUa5D@6PdGqR^zTF34d-6Hyp-3do17O5;Qp_6C1rHj*aJdIach<^UYi-K$LiPkTgXE zp~LlocY&fOsWLI!Oe2DowLm6-sbsOCQm}jIny}=cwQR8IU0lyab)VlvUpzln59X?5 z{>8THxGJj!OW&HE7{*iIdIP*w_D13&BU9F;mm2qJqpv!|va*Z$t7o(9!GPCT7G{tC zL-NSSNjblItFfi9&m;o4Pow7J{@xD6vNz(*iaRU|gC7`;ZQ6p5XkAZ;Ge!9>Iu8fV z6|XKXT-k#VX%-oNVA?XiMe zF3t$4q^^v;3LjX^b9jnKW{+iR>_+d_^kSMG)dLeb$!mYBb|9uQCocNk@E%k=1Hvfq93UF1l?o*Y=oC}gzt{0p(3|_UFFzOp=ag6 zxBOUgzk%b9F%=G+gUHPufXvT?b}c0AEvX&#I(*RM2{(naD1MO-u8D{eRE?P_E-D|e zk$C^iFi*9nxNY9C^~0k}*CudeHp*pWv5`B}-KH(~rMi||{-tJK;2V1^q-&}f`41u= z;8_f=??8QHtUM$RO6`A1P?Bo0_mVa%7YitYA|S2x#oow4qYayO3sxmi)_I^3799)R z_ypSAh$!Y^>@c0YB{2U;J5}D@fR}c}F4@7E*q99#qL}}n{WYF6&rKr1$|wAIA}S3- zqN6okN5`I%Af$e=!S-=o<&sc+WAWE(g1Jq}`|8g%mA3IEjskgZGhuss!_x!UKY2*7 zoSTR;?Roek*{|-tMfTIJYu%p+u^}TyV>HTt9L04rq=g}N(oR8CN2tn|zpaUpy`>?qiJ^i_N>PhR0eaAo z+MsVX8I7CMIIL9Dcv;hNyX``|Rwz+m>KOJL1Sq3g*GdcS?1R}3>*p7`a zbxr3xbl!Xc2F;F2Jl;gtY)belwPBEII=IRPDy)-$z0S9Qa|C<}yYj$DJvq*KR-dOW zQq3>gCvu!Vpp&!QZm2*_N-5a8Hk?cmbgpPJ;U7iuubC1%Ng|0fIBan+r0QBM^f&C} zPkDQ(S({U$YjC1HP57Hs_$!7T#(?&#z<%*!O7VoqK%ulHymY#cgN4E1g*ei&l>gB>pABVL6nrl^o$k4p?K$ys{>Mbh zWrNx|cXq+P^hB)Ie5e2LjJ{&Y;v-DC;bX`XX(sxc{T~V7xrZc^p)%P{! z`7#?JH-rPJOLB~Af-@jWVvotP$}MJsq8e%b_Q?;aY!tcqOND+Aou9kO+S1bSKaY|( zq=X92LUU+#f1^1#i_gLYP1w)QwTrtA?B2m1e@Z28vg+LFdN=5L6n6Dn3a#tHuj|(A z>s1P1Rl@xj0!T9^;>4{JE#i}UlE}{R&En=m7b+6$Qio$nGEZBC`Hk=i5X0JZma%_B z2{7f6fxlFc*}E|sGMg3Q>9;7d2-Eixe2Xb>@>|Fsc45>mcbX(YWarg$-i| zev2j8y|BIhfr5d%(Vq}z$)H!0hDZ+nV%{N4l;~=ip32TFKB0AU)dMpBd|+gIe-YMM zM9hA&u7fV$#%H=uiCADKsC%4ioyuT28J*{9H}k{H(I%9O&dOwvlZ3JC0lTejaP}ly zVzGa;oQKbOEFJ-KzZ~3q-#m`BO-gleJOky2nyNp{TPb*v-=Tlbyo`+YR&SG%X%ir2 z5DaBI=Wob7O@kfe>4zQjmo=Azq-Y{6iQj!OjnGTma;ZKF8X{IvCdj~-#^%lVIe4cM zQc1^$irj&&w;gLsXux0{L9W)LKQ~@M!Bpb*(f;(O1sO=pp-C3`;?Q(TKI36!m-86hDkU1)O2JL|pZlffa>=7flkk zYZr2<_9jIg7e7U<%v3z3a>g`TSL9w2Or+YfUwQt2u~r4t?*B@+GinksEGV(B#Py_TIE`i8fNmG0LWXqn|9XBj0T$|m)pQN1gpbXe$zlU~OR_w-u&Tl%o zF`p5Son4wK&T|UmnaSOV5wE?ry>lM8x^Rby#g?QNx#r#4gT(jx@mSAAZESCCq4bIS zXK2^q^PZ2#`-L2R2o#J!i zPIZ)Y65;8}Wtd}-*FRb)~xi0I%%XTmM3b+JCpwroo_a);0*JGr$(XKcN ziG=;3!gdwoOBH)%Gp#-Ii}#}m4bMd>f>8tc@zELz&Tq&V;?P}nY?gU{7T?)QPP##v zu08Hu`&;*F+y;Cwh!Dfc$&OfZmahTqy0n*1bIDLN-EdKUEvfFDez$*g6*xVet)wuZ zid?u9$0z;e>iXEOl)k8lwd{#1(o>Q#+cWi~NL$ejBqTEFbAPrQ;&ln4>}P~!m~j!r zLooC*O?f{^DI(Sf%hNNJ;-;vP3-6P0u+l3!$-t1(>Eksmzfv-;%#U8QyU+!Y6v}$gW0(sM&IlI|S-w-`lXtk)1r;C&2_w+Q06iO@QJA$T$D6tOLknxx8Q%+_q z99_hO`3pJd+oqE;q1tC*cRRl6&c(|OufIIEDl57b2(nlLe`8}kdlghSTX1obsg~y~ z5~aW_zn{K?eiq_4#kby=>X?$z82{%_8Y$5AbC$F?+P_D_+-3nTYYR>%ncH1xa)g6Z zU+=?{9<6|0pC4meoIqOHpuG%iE~gY+d36n-E;GRLOfS#5{^)y+vKw8PjCjs;!G%2M zELur#YTc;@3a2_x*1>L9sN18Vh7yUYj};(*TGTX1dyH6fKmB1~@l8ZaPW2R@YdU*O ziI{ik#ff^C{@iG^gX0m|bwY`Arh~C9%wX<~TLoL#T3{W32Hcm!D~X7L4!FHMD}(-K3gP0&zKDaC zH`XBsDGXFtC0CVR$d~yzMJT%o(T5W5-~eJp>JF#H2K39oF4Dtf=vy+{3WwuAa^F&@ z{ueOUVe0z=wJ_knE1I}2Pk@EF?kj5z`W-?S&OZc#Vm>yKpoFDf6;8ES-mAJ{>ANLB zbUOgi=Yvc!n`1sY%tiF5x&baI1G^&3oN56>mE9WjjpjJcw=p@W4eYpZIxd}m&=}RA zqx@>-XIflylaP^tAyz2tKZ+6k9&hDpmVv#^;Ngo(`xm3^YI2xgy7?V4ahVbm52nq$No`;V;zJVdGq=NkJ0%H&?j zN}DVShM)iJ{0muj7FSB^qTP-9IvU*o-Gv&?3EzpYGwJmq)>T-ouImGqOR;MWzIMCV zPW~yzT>QA@xn83VLlfHA6CPR#;bxS>68LGfV;nezfY^BcNXXQNt7ThK0mo-*o1S-W z4l7dFU%i|W$i#f~oDEo=Ru5TdyFDNXa$4aNpFh}jJtEWsR)ie-Wum6B#dm%k62thf z%F-ulq|*SPPN178>bWMM#nQbo{LXqE=nH18e4tXu*G>D`iXznR$&=@N?&MH|<8^)z z0t6lRG-!CMfrMsJnqr}Tpmq+h%*bcnQE0Cx>Q68x9st;&5zUW#sDbyJRZ^ zBU&s1A#nmG*%z95eaueZ1~Oj$dP7a$MnO6f*j59k6q${Yz@WEbQ(0YJi>FI$QFaSL zpiqcTAjy9Wn&3X3{DL?S5#(!Ob(1kQR)pR>Siv`4l$t1~l^PU;(1h`)>+_Y}3Y`A@ zp%d$SdY`G$u!2tF-Udq~VNi1$ABZB(t+I#*VxLF{#YD1~3hai8n_&Qdf%uN-zUcaRg8f7#J&b;`ZVrZ5sa0YdR~T%AO2Q=N3f-{PP*Gpa}RCHJJM?`>L}7~M8VdgiV_ z&AErmG7jI51!(=SLiXjM3~kdPkGDp4GB8I!CuVkQfdXR$oA$?p67D=__j`Psxp)8R zEgd;&?yo|#i-6>SaG=*}WSr;REKIU(QC>L3x0+4qJq{#gRO^bPNtYTY*ihGKN@omo zKOVAgiZQ5_1L_0r-tQZil65iW%vQ?-AS@lWZ2C=pe>F=8JonDo$rNgMY!zEMMW$a> zlPq0dA%)V{Yhy=*7cE%K6-J4YTK^#NCCHmY5BFiAZ6Cg#BV@#fE_)+C5 z2vuf{n#%k@7cMfjj$!tLDiG%PUB5ZYz_wmSUMq0Po8&oPQF~fEzEpDK%Ggu)26FH1 zRYx8Ee^T%i-)*56!3Q94Ly+-JfZX7T6>J0GAH)~3!aXyp;@6UFVP}|Y1^mFsiPsQ- zJ@LBHB7o930oih!(|E{n1i12xM7L~PBg7}}m2)eXDT2+Ncx70S=`}jBb8W6l`Nvzl zM)SmUmf90x*dxaWU*!xTMJ{EwcDw5a75${@@WM~#1&tYXZ5Mt*(!9Q`l60d}XX{CLk#0iqN1$^#5-B&~vZ&h0$ro_xRyyi9BHn6Yg-{eqiB4-koq z8>ByJ|Mhjy+D1V~R4)L}W(x9ms^&-lf(53MzcSFb;bt`PUIMPGEofVvKGh=Js|A2o zs7watpW`15WZExLrOqnF7xGp@GYh=9XYImHJZu~7|Zk%4__cR(-MYd0@@AvjHn1;#sn`=4$V5bCd9FN!qn z130tv@yY$Wrw}PJ9o_&i2xtzF*}_1n${&V+FD>+k7!dNDtL2d8)F=?@C8l--vV3y0 zT(;=Zv_Pd?3zP`PU?ktsbCYhguGj{<|O0 zPeb?e-PwwVlqK1dB5Y2RN(#dVly3ZyWM5=xV~3(9M-E{E0a}X#q%aM{ zWw&r6&ZxVD`871m2&xqTN(4Sep8$`Vt4|2HjEB(RnD+vFJq#lTIrp>P|Dcs&F8W14 zWj}q%!zmH)tm!0b9U$|5*3yCY|CK-%;V`QWV0hz6Dlo<& z8Q4q>9f5}M{_29$sWrL!KY$*Yi+0|g5U+pe{%@bCH#;Hbg1J?i7WvA8g>bPGu!y93 z)^cHmX`VAg8nY<0NCuXXd$O<>?p5^+eD+-XuTD8sv;l|?8WwL6V;m4vnt!8iqw<&v zxMUb@{R&LK>>cC`J2;7*YS9p50d%f@tmUNWHjn(znL5s%ap)fUnn~jkAOF9mP^Wk0 z7q&=cwxZ2q8CXvTFD0$y9AE@yU=`MKql$Yw+gH4=l>QrnaM2Imyjnd z13O_+-%r#o;T)oAO5pZfyC*xxBv5sm*Z&aMuj-a`W$u|;a>1$} z7c_kl&&I~^{~9^<+@&S3-?&#qSPy#?o3|v&WbVxbnoWdB1XaH4`gYd{q3#)Vox2?b zg(NFr@y4RxTyZutK*0+CJszK~$@2|x*iCi&f*LsBA?($o@j?0#ti)=$VZ%i@O#iKj z9(y<9A$gwG5Ju}#Km^=)mhIu`m6vq{MyK34h~As0%P#+h`G31Mz-+~+Z^;Gu&Ik~0 zp1N2HPqBf7G%7Ld-{7$HdHp!89Vkp#0J`lK1DMrw4A3X}P+A5tcxU3Tzxqn#1YKZj z_wh>I$gP6QkEMUjDSPshG)$IePNOm2r@$6A#TD@pf{w&TfJ`vE$iTeD`172(x&fS| zMhHr7jGAXE!*?$JS4!RXX5(W3<-|=|$;Ao(%&gfpWF*T5-=&d4DToAmH|+8>Qj|43 z|JiHnKMfh6vN*kqhlIdAI0FZPAd>2>BtFCzF@Up6`%AvN$x*!}-JVfmHAUHOGFmyi zar?=8s1BL?58N;3Uf(V$mD1son%setwY_l1Z)FmQx+dalZ-2mV(V5yDOl4Sskiwox zI!izU@&ja-YD~ir?;s5t6@28jdf3T6py)C$L>A#P}o~ic6GpB5?wp~3-DIPxRd>o&kSJsp%K%B!HLL{&-+@BPUlx> zEX4LA7o~r<3pH2n7NHOJ{J5u@www;Vk^a33bam}%Kqh$`gHI-^Hkiw1?LJ>b3RW8& z{%*;S@;XNK%wsHacx+!?6<|R9=oD&hNnBi`b_RLZ!2K^yw5-`9AcR^ok^Y^zH2S0- z^$;V|!v5nC)W)N4f|~|`j3?^Me!0G$qkyBgABa)@X$1=7A|yA}`U6$BUFL##U`ouH zdc9`$q%q)#voGMb>%TZm_x=Q$%TWXr1ziyMr>LW9)pSvZ*V5_1mLIfdT*Q*3&D8ZW z4P3h700w{}5F^1DNfMNBe6*SgNwD4gIRBl-H$|BYh&#cC%b-~lnWUE zl`W{?eX<4U;DOIl;+7vU7c|DJTL+ku4~NqICQ^G~!-(I_ba&7jJ}gx8^q%X@RJ^hq zmy4$iES|c?;LQ=>Z|RCwCIC0uyqqgg%mZ}>pk2pjGkklS8k==NUX4_7Rx1bvzBYNC z?&1x^;Z8{`8JMqS+igkeD3QOr%AkmGg!LH1(1`nmW^nkFjof7mkZdnU!DG7Ya1CI? z8D(}*FHDilZpfdvtPs$5&D&kWGO%AWvzVWAGd}r4SgEJ{tu}_?(F(7cOaZf4>+L~c z^;FAR4Zs3A`!NAQIn>6z4mUbX*?}pcF6SwiO~y9m#LahQh`Nx zt&-dO|NgNIVJF5osHURG82kjlP@c$@eX#v00z?~g;|~QCH}X}5&Ky$C zDg$#-Gt2ZMKqJ`r#L3g~{T@*=tQy+!;PIX`ZRn#nGR(c_RxRsQS?FPAHPa|C1DsHC zzavynZNBx7y2x#>H#Xz*=K-|NlW=iO0aE5XI!L%S<*eJER+FPbP+|Xu+e{3kF;u@ftz3KLR zmt5lw*zu6=hgKOFZ>F{@tN@qbj7pX16F?t(3tWMQ!Ho>y;T|gas`HoV)e?4y_!H3_ zZgz#ebZr>_Dzs9|wgXL|`4NwcqiG@ucP1OI>`p`eyUpxm8)IbH?Py`M1 zjX&?Y zw`B2<-i~PXLUbudD7SXI6l&&Hgnt#9RWqj z3bbyi>E&JX3HeR6jO_x`%H~g*S(bndxnR4@-K*(yW$LEux`}VAO!!cvKV?IQ{^EYX z4o=~}kZ&s2KmFI3#-D!P!r#n?C8D=E#7u(Y7dU{DZ63$f>8Dc2!VK#1^td716lc=* z3L|n$;}XK{HT7-s)^9h;{D>PW)t6`43p^d3l6)Zsek$3U*oOpT%_5LWD!w;6dKoOp;{mb$2EVIA* zwA95y(zS!DYrLVX8XPM4u)Ime^kaklXAr0v#!DSrB~OE6U(lZENF8S`=ZCLCJWEr6 zO{Cj~7AYbYXEZhag9ZF{$&8ib&)fIn1f48h3qex=HCKrLe(gx-T7m-!KMeQ9urllS zM@42G(k&SmS-x6XN5d$7q=YGYURA^V{6LfF}?VAe*-t>1TU zEL1`C7X3EhWHj3KtF-?D=0KS;5&gWy+m+uc#vKzmOB5H8K`l?(aWa3mfuO6$@+5(4 z61bDnsYm!ZQPGKU0VVyYOPsf4NyV`g(S0?T-Y%B(2p=@~I?d$y%Xcy5!Szv<8N=sF zb-ZtB$jQ1Tqa&R9W=fV79k(xe7l)<3%g0}R4C(U2U09=JJrU@9G5QBnZ*$b$Ypq}7 zz5ey7-}g`RRC|kKexH8xeZP`+1aFABa;k;$t#|GJk=acAVO(4A$}Lgjz(FQN3@2W4 zxP#aH^B^Cqo)VEJ)D9|(KxFp8im#CLwI$VWwbvA3cvqu@8PdWi@cXF4`7p$BJ2*H> zS=@HfM0@z`rlvHEZ&+k?F_2vbq}lk!Cf3u21r5KM$!0LU>{p?dbi+tC$U8zO#Z1#t zM!eLaq+|m;XkxV6*O{k@aEI=QZjX7L(8ks>R&uZ&A) zk$gHXZ%uDqO{gnwXsIT+G0ke2=h9!DcD8BZ5>i-OGI$6yuS;G8HndnAUvdeZk{K4X zzrW|!yzLyh336BXI$LaMV&m6)FXqRS-`t*+S!ayxnY_b)vNBnt5%ps4NRO<*H_PVv zuoNMA&P$4r^__A5suJy^kyxZFmE}qno{~sW66zs;T8?R~)Ymr_P+x^#iWv_Zw=yZ- z2sn0IaTD#7cWJ+q5O(*@IQ$qv22bg7>;&8%w~IM{b|#kG--)NEY+u{%Ic5qg`gFrv{c_~{=3Q46k_5H3jQLxsL`VLB=}v`k%w^-L%iSbi6) z>c_1U2;$m`JdkIuODSq#D5?nHu{ZQR?{w{b@}n}tL5%OFbjX-SuM+vIpQ*F*2w1=e zkJ~CU?e}}?hL2Z+I`)c3?Pooxxq0LhxJ+Ly`FaI;s=97fJ%id^4Ho?onw^;U{5T@m z^-BoP#w>?f)m+$bu5ZVxMD!CxWUfGRA1#P`T&KM^?obXiRg(%OlryXM*j_& zxsMb6lJndxZki%Exx%%izxj3ak+u+lylZPFR>>3!F(B`i~@A*<{B%S#SQC@zEgfd!E!nNKP8l z-$fH%-;?*RM*13ho%jWwO!s;ajStuSY)#{|EL?LApwOwgul} z^eagzJo#*f*Hx@D7aBNw?4%2Yyh!<4he9x8+dr@LqgV4SnUs<)fu%6vr^P=EGU#4`t_Gr{`-GCb7R+exI|rBTsFx{PGewh(l=JV(Sra z$#aPRU0CE19$O0D0O71QFBhcpN4A?mt9eKPlc~ zSZr&X2%g6n(GEt!PjVb^vYN7;b9)GvzRSNfwx-5|(lD6on|U6m+STY1vN>XRcFMI< zrHB{B93KWU_Bbee`z4ha8l_&|7}%H#$40U>Ds}LjAFo3m4ej^@6Ye~v zo+Ess1?>*>2z3+fkc_QfeJ6+*dq1AzdX6EEEky$r(jDJ<`_pUHV_D^;@2zn?nTnM0 zDXCkTL{q$QEYH8`1dT7DeBRseU8vW29JCo%*~@=(TeCb0ShfkGA9Gw}$)NWf;u@`T z)GbRG3Vgd9`@Q53VZV*EhP|~(y9xElu8mKav4qGZn;;vD+>JAApS_RHKTQ;xwigc9 z=%E!zn~1C{BoH|-t6wR-4j`zbHaImKM5GW%x*QI7Y0R`k3`(K?;Qbt$N_1ztd&?Z@ zz8Z@1sZHQmtT@q| z4vq-Y+l=b~m@u|R^1J778PTAy9L`BWO(|MVK5M$E`zEI&4<=Vgd`sC(! z=1nTO5aRM3TdTYu^!Cb@5BkfA$KCxLqjhYW(B2EQLvr<4ck!_XwVIhL^R>X2GhVjH zGO^6zajpR-Q!Te6j}pf?A-6Q}sium=-_eG{b+79<{SKFj&A*>(l5DA>rHZ%LFPv03 z@FE#59Q+wPc?}#T&`>-S(d+`1-;KY86gcP&>xsX-Di<(OoL5c~55rM+K$}lEG*<>U zOeMPHi`;$tV(74~S6d)qfd?fcz4UEPbNvwCerBZy;t7{PQ|IqN_U=sYWh7^Tu8nv- z@%WLS5KUmtOF?Q1ISztO)jF)+tx_8!+l{ZxQ13;)x($n7bl7!{hq(rNA$)Pk4-@4T z%qw!o-=PQL8E!k!E@R>aC0baO&sLtUBtlCxoLcs=#Hp!u;0w^q(@GI~a`luj>Rxap zMaKBL(>7Y;SVLILZQ|Q#_0aJVkKCL^%`ux%55H1zy4|&E5=KY9FF1{6!EabIC>vG- zGr{!MAGybSM!4vQjkmR1Zv&;a#d@!0({@vbuWX5^!x6pUy+;1qRMq`)55K&Je%z9b zd9j73c2cuvI999Ob%v|!5WSF<^lD6#Iw|JA8zTL{`uD4jh}h7dPMS795#KH|7L}`6 z@jRy7uI+`F7$YvdbWZqI+Avc5m6h*-CyZO9__BHfxVnhH(sF$<$c40FJx2OvANJ0PJ-UJ#}Y-vRk=xsK<2bUpW9RxJ!v~R z(5k-D-*?5rHngQ*n%neyrU52id1a|rYY7}(>Er4RpD(#EwTLBqX(4&bqc?L98yLx2 zi>K8Ay(h?oNpjqeEhJN_Uqa zJvv4V7|n05&-?NH{jtZkvz`0C>YVeu;=Zp=-ea=+!B)S^bAW7nCazyk*0P_;3HWZ5 zZTwL1ib9arcC>L4kH+%~-G7NJx=?~e=4GrL03luvfZUg`HycVsqjsGjah$BeB3ryralDm;PCKF z0oQ(u-+=FYW)zy!>}lJAG>YmRu)WqMq^q|~1rGvDpH|l8@0qZtjvKSfO&YBOP&<%p zkYzO?D#g)hN<3M6bnIQ^zh7^isL*x;Iw;N*IlgX+(qjswWQ+ONsq!N$ohBD$2;)kd`$_`x2%v^3WOf zekph&W?0{;qMgYDfs0R$9>rZqF59_7bmiYTMPA1`qt@XOsrb5h=*ZevqJ5HBaYR?n zbkxTkcx=nhsNYJHF*}@3LaCw7Jil5#IIT=<;IBxFxp#{BG~wP^Ofm2+VLJ3DeF^E; zU(=kPKreu9cPgNoh?6dCJm^qqGN<-~!(GP2*Es=7jX3Bm0lICIWpr$d5eEtcXw8y9 z1Z1Ii0XDLX8&?G*k9y}2dlY*At}RS#=Lv}QGBh)+7SIS%IwpN%%n+RxXjr{7+vL0| z*UFH$lg!g@&^CTme(Y6V9CZ@zPBDUpE z1te3?ipT#n7%Aslb>WQ_yU-74xVP6r8*eiETDs6Z5h2^gXsug(NcSu`jeDmq0?z3n z;89v$oNNg@L{9?165iai|V(`UA&z=W93J{+8L{9ja6#WQjP0hCZ z-LXCfdpJq#Fvq0Hpt(pbH|p~_yb@e8Ct{<9g^?bYe<^1gwFYrAiw7Uuk{9Y0mixVm z7~kIOi`C|2wX8DXQ3x@Vx)vOBGQKu+GX!IjTF#uk;CQ&8aj2o45db(MU)j_wbrk0o@vb0fgmrB+xBK7 zP8@RYthh`0MrZn-9VTc|;G%6NH~(G6bvvs&!I4$O+@0W7bm92n1El*K!c~e$-H+hb z2@Jum1yyjkKtkQP79DPpqHD$fs+I?-%%h5Qv?QffmMJfIO^K0p26ni7otpY~k?}&S z+7@B<+zGtLS>ATGE?fHTVo*Z~_Bc?ulv|k%L$;G?HI{qI@d>e9?Tsjn>Y6{)2&Abf z4jmC%x;MnFuHBIMfsH^0!v;^ispKvB6f8OW#$Qi&Tdh$#rM}^@f%Z26_4N*vrTdHN zR+~y3;$w*Pb!{J_$>`|YQ6-+f!m^t1PER9Q^GEKqBsionSZ*~l(W)dTW!K0Lhw!_Z zo8MIRA0*H@X=hq2mVR8&j6vkUL>DAVM4n9s@$DRaY3W3v`j&E^(o)pAuHv)o=Z(?n z7yV(?-d<&e@8K?XGNf4VNWVwc-rva#F-TO3L|W6dH+XNJ+|0?5N2&F|KKFIpHe?n9 z7>=6nXt6oNOjSG<%&9~UU=}!ul`J>>EV3ErTm1`H1AN6KqIZca!*bv6|Dmw`n7#kP zz=t?fdF?&jZRnTC^3aqg>n53(DML6+{$KdmwLGNAMhr9(a5MAy)K1}BA9IX1DIR3Xj z@E)D>YJm+%Qd?0#DCj7hHZ3&S5B^U znTwO%r*57|+&YZRCi%u5b0e*mI zi08E5hb2jEdyyeWN@!~%7|Xs{gp#@F=g9Ih6#>aN+5N81KJLJLuaD-qhg1X;0-Gzd zEJYt~wv;KU5#!E}AtD8&(a5Z+h<+l>l^sh%QHKFD12u0~hMic)U;@NgO@z-kyXq@R ztd1-1vdxW?2CnADe*jYEz|kY*W6q{?eJsoN<5Ridy($b=iU88yoyYsH&P_m@pIdWx z?Ktd5bu_4KlnjtV_%@6ZC6g8ztn~rL)y#`RT|b%{J{L0LoTXQB?bQ5ljaKeh0)rgPm_7$8GNy^<$v1w1^ zqIXYS^t5Mpo)Fh8ll|3GgKQgXANjei5GP$)!zfyEXk`CQzPwpG65~Ps-!5!BexF4q zcK5`+-sU0|vB3J3WM>3nNBXe$W4UoB&$<5PT@Yxfx>5LRF=e95i(+IL7P{h9B6#*a z>Ru8BN=$W+Ba=Ppzdo6f4uw?SpNonr_dztGcT~-S#2(-Bx`7> zNuV-SO4e$Jqg+I9@!2+R$5gJEMyp~Q$HtEdkwRyrIkPpdZLA+=>`ay_m;Ji4`Vu!( z;d>jel3v*lw#-TSZ1-ULG}jTl6tK+lqbswe0zxc_zWY{m|AK!`dSNuz9O=~_0KPdR z-5vG5H@SM5OO;x=rt3ooMg?QxldD9CjOMB=s!)&1l#*a66{|E(Ml|0A#x~B!@m&41 ziLv?o!tklh7ydeSlwp_FPq*oCy&(;MlJ;lk*<-qYgxXRopPcuU0W1`Nt z*iJG+x216n{r^?VRBxV=HqJ&SlW}7BcQ{qPnaFux@E_<{{PrK{;4cziSB_M;!lpSb zR(1UkbX1~2$0;cqbhQ5mIx5kiLv;*<1|7O+&|$l9eQCn68UwIh(9B?-L4%G!*<>{6 z@VvYJKhVMEF)LD*Z!XuhQA{w<5)Eis%WxYlooA}Xoq$Cia=S^5N4dE$Gq`~i43#;e zRL8ZdR3zG;bu>8`SK%0THo#9w?aC_77H&UAF2;ZGs5J}BCjB9c72AJ5!gIAnc84#> zd%iw~)S*mfWm?ujpXoh7MiSveWB7Ep8q@~w@W%AWOA*NaZqObuJ;Mu8K~I45(z{D5 zM{sAPAuYA?&(Q>Oq+e@I^LVrF%@u9~>-P5%cdCGj8o|X~MPezM0>%vSic$ zFAQLl>DQ@}J$e@@cNZiwe$%b;Q1}wZXY3-9^&R}Z8+v^8=cMj7{)Cl(IWEAZetz@t z%B-gyO{;_rO{?c+-!W%4eKD5vjhIB_2k#wf^-PkBQ%CV?$1(V5!*&fCdt{VSxUO3 zVjGXs;Kiqv=)mx{Bt^_InwD$rnR&N{7F~De> zP+@TzP?_76Jk=yzo59q=?$5C|xG}?VU~;_N)NGsL>>8Y^z-`g~{?-pJFgBVKvBJQ# zHj$I=aT>5_W`1)W;=M9B>oVevp=XO)+VC#xiAnDs|DW@(YU^JMNaSfZK%lzq(TvjT zkZ_?WI5t_^3?Kh4IeKqpdSk%r-j93biMgWt@&d4zBRnO!P%R*zZB~f9a|gGHCD|7g zql$Bff3~^Pz;eu{uSmrgQ=y3e`T8`cM%4g9v@k>+Nx0AzFPzSCG%;SH4cqJ&Np| zm=Q)+A7u;4B~36!3UkALj;3l6Y6IJ9hDpYOqse+2D~xX1GoC|KzR@9s6eOy1LNW)J zZ`cEIUo7(AR)u_=65T0>V`Lz9F~}UxY>iCWbxESi{WLrzrMWb}-_XR}Nn#t497Fb* zI(4B%@qx_P>*tOLqk>E*DK+-yx9s8%c^@29@ujvLH=Wd(Fm6&c-<6qh2hKaYUc80R`|a#ermjKPu@~q=3g5eU(XH_8Y_QA@=(~^6uk<4n zgrBN!=iqZ`U0OOUhU-xV<`4IV%@^<@=t+PE^!fLc{U@w4u=Y(!V}x#=gH;M zh$vtZeb+j;ebuuKs5y`q>SQYYiRUOxcRs58<3e$>B_X7`0&?0`85?% zybhznKjNX@fK(J_=p~{)dCRyI#BD+P6EbUH<+!3#1{ZjwWMs3P?Yl|DWG`r~#&yCe zF&2^*vXgOQbKqsOFyU5Ouqwt{F$;y-d0>w7;*K%ry*M!@sps*51KzqBcZYeEb)HJa zmLF-)5_T9SCe>%%uY#DQj{IAHnCD~<{qso7@Aw=Bd!mW`Bqs~2&+)oDH1g^9j>EqR zXuhPcoZ-A3Jz&IEOUXpBE&bXiS| zoLJlr5&vX*`^gaNIQDQUW02+qVRMl=fityv?#8-~w(gvLguml1J{G0W*PT^40ROeBCu}dKh(8j^+ zF=puCw&I3sZK^aaY2Y+yv)`Y!At;|Zg?SF2-EVQ_^HQr_<7c5f8C``plEAVKW=?zF z3??J{QhD{VVd^aMNPFwSm|f1diu1av3%{g^yQ!KlmQ0b9ZC8IqPnx$#aBP;tj7v#e zCh#V|`52Wja5INw@iP^9|J3KTi3o(4stIXgCrEbvxuD4o${tgy^Zd=9#0Z?Gn+ncs zkO6w?Ma-=jtA2M>{5t8kPb=c6cxtv7=Gvj{#vn654t2G0n2sfWPU=&=-CuS?C2{O| za$7e4Z-dCdaoBJCqWKxVd?f{pJgtX-C>@8R(|<_#yw4S_jIzWJ zxVVA5GeRg?x82^+(oU(Vt$TWhWrkFV3f+(oe>~b&g>b2Ob>y&6@~L3=idbpxS?fOa z;;l%fz^>qoPN(;8pMbjbM`dMpBFT0nLu<)JCGhmbtaYYV3!5|E1u+OE3#Tq)?OiugqG6MTxz{(! zodwOAPmNKBF`Rpt$bc;|Vx^iotu14t&PX^c3bTAv|1IFltPV=x6KutJzn1AGuPThd zaipCo>CiIzT&%?C7c=Thq?(ytQBPTLam5Qs6`Zr!5~wnvpdAb7f==1k8T1GGUb{*( zwzfdm6dyEQ9i@&G9p$yo9`gQD79ZP(_glJ!d(%-0-#{Ff7d9kwSUCN}A{f9NGF)#L9UJ73LbKp=sh4E(7)SC6l%WZk+`a{`Q~B%u)S12La|NY3DzP7@6$Lr7 zsdG*~{1L^hs#vf2<*s&|{ldFlsjdJ==`HDh{* zSB7PnhCqVB*Z50p*7}@S5!{FYtvWDcA4a3jAN?KsG{aLQ1R&9&P(&LYH}(}J_G4pe zetPc3X{^bY=ILkZAJmM)E8#;oa<@%kTnK8!fyGdeFf7QWU9b&5=Xx!Z<|^x@%nb_C z*-`Q4ixghMfsMJ5gd=@PHD#6i`llKXuB@n6un8o-bu}XtNNiC&T`!(-^0?TG39kNh4&_NCAqyIDYOy zI;tR~+Qm25uK;5=m24as7#aRy8u&fvSKkrs$X#;&w3RHS!t3=DvDM>NgQaZzU0lZ7 z-=jNrjlgVtN!7Ux2b#o7-RBx(E&@*oRU?}`*_BKK!>oizKs(&SE&@4hDeMP?`j2eB zE69xx& zud1yD2q?-5)^*W@U3ysSIuFC8eN`Rbl&n`y;z3R1O;N+DOlft9z@5FE6`JiLYs}rz zS_22l+GakRgy-l{P~M^}b)<{m0O$R-UojnRU5{Yd~cW^2)>SWPWM6$I#b(MeZK8 zb-eOgcnA-~mDd5L%XFwFsgOaoBeJxn5WGHVuFj4FBq~yhr3icS=9WRx-3pjA(fiL9 z{@m2BRGAs>TpbB8lBjM7$mMn)iC}q}eyGC6yS8=2%4;w9z|a?f8pF(TTT{{aazs^~Wne8~8GYZNJKg!K|9X<&?xBiO7Lz6k%(xaj(%W zBDxOe7=KQvHI)E?SP@lrcXao;U#8fUQinh~P>5*y2v>|@n&q~qmGUJo_Yg`9BEh@I zD@nW(oVHPjm81pnOH#}g%lG-u!zu2i8X#ch87Lr|m{jm+!$G+nJUxv;ptjv2I7|0V z2j>Bybg^2V?&5d6vLt`Cx8x1~T0@=|Ub?_uE>G}a_4e9@ef?7?Aw<=PBEuRobrLR# z%Q_#yIR01^!6Zm3!~G{p4>>c(of}}gSjs3vIQl6~yDsQTk~aYJm20V(o2p0P=eD`I zv>?B-)VJmV>cmS8e379ehrUEx(QC`{<5$8!{6I+dIX{(X{zjV?YAXuj*(HKgxyDZ3 zXFPncc4GTpKeM8wuw0?wHp~X2DB;c-Y$v@&yZ+h8{8t5Wko>h&FV^#{E|*AlkLS^! z6vnXZa>DD7A^nrD^p%Fk3RIyUE5cZ(0BZSL_Egqt{OdTL3x~poQ=lRvJd8-LPW!pc z+Y+haZU2$C1)`OYM1gXfLv!EU8uygqxbkdcHp~ABJ(_;Z*C4d;C(9ER+r-tjRNxh|a4wfx(fyN!b_sbxF z`{Op)m%_t-vn_Abs8L$DX2d5r4siYB%IPNW{?BQT+QU2R9QjdZK^knIa(E#4K>L>g zu7j!prC9fSufs~#SXMjioyq_?4R6Y_&-8wz9(L(*UmjRJ)MdUTcBHlzqqMHkMUH!; z`M68K&n^?i@_Dqx^EuZ2aHYz=U+EJ<@r4_Ppk3f zfC$z!RGpqQ{hFRULUu`8Mw*xWp0mWJ0!piM^1dc1BlgKt(s`pk?4zOEi^U5KZ~SWd zqU8@uf{`IFUF5f^LU)T&Ds+3Jb?peCCUCA#kRKDzo9_Qvf5H}$t^io9jM$nilXw*2#e)i)RRyG`PYiP)83!rW_w@^uTH#If42_Xm^A zLc_pJ9J9=OI4J%c>$m*H&9VL6vg&F_tDNiemx_tx>?L{Rgw*RUUiwSf27n!xCswk1 zWg`5n`z5yW*FtTqc9+!(GsnN>>YZ#=4ja1=+1<@zK+&JUv{zPD+*suC&!REdZH-+Y zHdJwAo_(Xi#|lj?m%W%=i}V%hKx|Y2Xia3^y-V_Affs@POd~N#L^-$~Puf@E?tFlq zc)-%yrwX2;hLc~aH)&>8$4{qgi=0wynCKfY%2rNdu56ygSz9Ixto+;k zPBvXeQz{_zLV{0f_BZyRNv#MMK_)LP+ce+QSRRIi(y@jDvyO_pw*|)$d&#ZXsvoc@q8);|%wj=5 z*oE)PpVHvuXV`&11kawXKHQ;b>N=qCsa}Uw^Q?+R}h9_=4=H>R|zg4?QY6T~r zOX`Lf)&HF+5PRnAaX;;B5n1XmTR~Ctj3~bH7+6cdpYdf$H4s5q4}1LhF?(?%P@=9E zfX$uO2UvKBr|rT z)@pnxWiOMhQVM)57cy`+$P3(98kZ}JQ)hHD^_Ib}I=m&d)`+#>K5@T?;agLa7ra7552+s9eJztL(Zp(IuGC z?v#aM?|(OCg7kXyPRsKfLjc3b-Zq8e_rI@SgU9(c9Qh}Jr{>hCRzO9ifJjA1FZRzX z(438|M}&#wtOkdHi{a(lOJD2yhZ=3`f8SK2K2#v3-E!{Y%zt0t`BEj8PfVKjK-&dw z)>Q1zJ1didNO*Wg>w;lnd+Xy(VDYWII#{r*id7 zi|HXR=E;;A?Apv}a@RrABd3$$F;W-e7Pj%aZdD|ymRr5{z_OX;Kz0N~oK{+j-=isv3=0f;4fEp%)cc1LOnM&VQ0fb^5LgBG#6Z?VA6N*Bw)k2 zsq||sz`O*2^=6j1GqYK1ldPKdoP=%+*X%w0(cytcSu@mz-wgOT^R01e>5N$V zroMqM3H$VAW@p>}?GMr8%5X`0T8cB(<)#?USssX86{#{nKH@siz*{~gX~0`RVSQ9e z4Nqg!-zx3mig~Hn^tBaqH(s?CcG5)dt;NdpT^awp24r$HMou@2UEQ!QjMDzqO!TyT zQj~C5dcH4K+mxV06rd;gifp)kaME^0<;H!7geK$MxT3MqvZ4`K^RiBHb0W-L_E$MX ztAthSnZ@UaHf?INacyj}HBdP(p$G3#z6U|Z)-$E1k-$E!&>9`i&GS;9b(#gPle=SWe1X+QY0eJyk`wn=mJuOrB*Tu#wZ4H5-fU3ax~KVVvF#%4R;+y}aw+pM(r{aE61yqm=A*m%I@9GjDX zFUr*Ea$Y|vanN(AH1L@7P*lBnlKFHuV(Ov!@FJAPycE#v6Q=q`TDrR}fcdibU`mZI zMxwW6BY{0gVqQB<2t^uquuFX>|FDBum$rfHlkFDnLfiSg~ve=jKXCk2D*(*4L6 zN0=23M;A*q-ONanfoCf;ozCJv>Ch~;&b7fOf14KWh{$O;PLFA)r^em^53aSN8Ma15 zP70%*T892*t=4R3+yA=wf&i7^1xl!lb-qbV#qxcI7n4ju(XT#yxt4AoJTEC=GG&!{ zI%S4Wde8qR9;*&^rYooZnqZAqtP^Oyf%E3}k5bTEfo>=v*Jv;HRYvVLwXGlkjF)$Z ziSm7m{deol;}@Cd&Rcy$@ZK# zUKfX5RV}G)(#7=hO-p&_99u0iYL7qp0podZboBZapp5rX@>ihqrC%%>u^wx=nl)orLKT=3 zQQma|5)M#}3S!86^9rz>_pw#af1BK?|61v%#~ zOz7knvsCEncje6O=%olThclE+eoz#>5M{VPVA`A02INAqkS^X|$H6YA`E5t(;?atN zrq~~cb<8++fzP7ez#B?xlFXMqFG7&UgVoEE2LP;m;u8Z8563ZsKP=jR>UXlK!|;ll zFV$$={Fr!oafSQ$Azw;3#A$284yCjtd0msm(rSJeZvWO}dlt)cJX-BZy^;}GCivBU zG&D1~Iq`Rjmxp7FGT6fr&)xm^V+5~?a^KUIb6a%Zf#F%1r5sM7y@5UtXAdzy0^Lrt z9~iJ5mzoyi0VysVzA}=zyzGFb6{BC>^wlw1p_>$qf0v-V4$T#e7yN?lcmDo~wFPD! zESB%P7&e9nw9dOvrY|{|g=Nyze{z)-`P@F$45>1s%+LQtXWiG0(L9BHAu7rgb9r*| zo$|Zl&|I{K`f$3h|MY8}!vk@s9?kpRy0G?w;mE|wCl$dqogZXt6c~jZz~0IaDsEl# z*cL5IYOKSN(jJZn+TEuauL!66cUQAu(O)$?LV8Jp#9*+JUc)baaQZUhL*HMtre{Yc z;lVdKKTLQqu(Q($`l-_DtNWBxU$bc6FzJndZzK9h1J*MZ!jC$oy6E0LZ=tUz86A-A z!3)_np(I9ezlA5hO=jTGkJucbDMA3rzuE8+R4T+JS; zXQaF+Pn;x;q0=a39TV+7+C0{hXaRLQ6JRTZ7nLExegPH}uu3~A{g-ksEaF|JU+?NZ zi$U}rB_A0KRrmUT`VOn48bZ&p`!fe%bz@;>_?FzVS|D%0xr*ykL65~{SFwn28>ixP z;=B3ws+l&Llpb+B?~p|=b3Q3=2o{}}$ak=LFOui-JFi7k@%QG8lCKaMJKY^=`do%o zAJZ~^Iq$FHo-FNq$_9Ot89bu`-&JGR8rz>3r1P8ho=&t$(0NdvL%NyNv&n&z=`RU(3Z$`ep zAd_Ey%Nn1W(JwAz{BvZKj~O!BCqq%cZgx9qPawCok=ZBUarw+e$vRr&B~ogy$BZUT z#(B7yCzsVQO*P6m?*-QSOT! z43pz7%(Rs{j?L1mF+5X)!kJyO7tMEOO=n~nD`{|Pb!Royjgd@`Od{({i8S6gKVG^u z5eKOug3b&E1%vvUh$DvPYtGxIz6+7~;*Z^7=<34cf#rY*%C5{1skRW*E9=Y>>110^dnUN=%(OJkJz@)x2e%T6aj@{Hp`H!ov2zfA&S9D!%HvE_=uBn_w5S{Sz zl!3T0=l%jHHa^{~ZWKqV-o}W2@ef&K`2g#qSeo9&c|Dzy(P)_Q~p6*W`bJ1s~*VbliBiv9u!I{9k->hPANyeb!`u&3Fwm-MQ z1Q%a|u>I0-2z}iLN88q@TwS>C9$K0J<=74g%;Uq@n_FTzTa9hQRIn6q%Yd2n*&D1K zgWX0wz0=zaaBd?|XVism{U3}!%s7cZ2p&i;4|b{^jEH`Yk4_5AKJ_2}4i7xGV|yVj zSV7jaPB#BCQf^`-@vtIk(^Ha0o_FSM_-Fe*!Tdk1Pq|&bE)&e6h^JUR1F_PMZXoG> z*`q6wae(-4JYQdS)({Zk>gyE3^I%2N7t3|Y1+>i>jvY#0h98ujyLFIcEsJ2J$zw#JfvF^J64ZC5TCt;pDxjY4lkOJMd*9k}Q)Ghzwu zn1E`*h!O0V+v{R2o7)a2G0jaBzK_dG(RF$*F_|r$BDd=#0yA3S0F4ZhM4$Vc&Yd{I(_|cLM?B`d5m6_VH70p%N!O)D??(oKd@{7R z+cU4&WZ3rb2~+fPJ^Y9MHoCG&D?wXDS>>2KgwwZTSRtmstKa<32*)MM$h)_+Gi@8x zYbW*aa-2WVr&gEQ@I@Vcl5knyxF(MRk>a1<6f1@>BJx|f=NL_SK2a&K*-|+f zR<7gq$G1#YhSIsiS9MRdCLh?F(N|1FFeL9*=96`xRnH$dQUizppI`qR>wUQ8ht)vU z2gg$_OuA_OwgDdG(x?fYSjXkb7j2sd25kw^xKgs>N#hs4&$~Opn*r=1zBju5j39ei zOJ3n?dfdePU*)O^-l1LuD}k%}!2%IAqsfDp2+5v(kvY>NPv-{_izw%snIhz;pT=`(7MW54;p$~T@I-OXv0h(!U zA8eK4xL-j)evIvH2$?oi?Om7|$R+Dn_+3>MTdV|(n6AakE%}{Kd#%2)=;qpIMdbSi zrt)8RgT8ldZ6OO&zP{UH$O=F->l4C-=I=zY)>5IC74KZWj2ZB7#{4Z}v`z#(`DN=l zcj%3klVZ?fceZ6L>1_U%``+B~6H0?US5(9tYLO^cRcD6cL)7U?`DU~U<+U5ODbAY83qRXfG?my?_2_hy#^e?JIvQoz>+^p>uwY+eq~mct6z zuos84#n%38O&V@tr^4vBJGe3$a}6JYB(56fFl0$4g}#sb#BE`sB1xk_>Dwyk@QJC1 zHB@XB3Y2~D?&wpHR7Q==%Uxb1;yc$fr|H-^Zi%qzGSg*YZb6eJP?`CQy&0Ma_70ECR)0*S2n{eFjoiY`#Yj@|KwXMn>#9@`3W z&~~ItrcP5_Z&DQJ7+%U2#8PNvhiwc`l%9hvFD&^?&|S&Wx!6)g0tm~0>??g(QzIy# zIox{;;KjX-dAyI1I6MSM7|MVw(w|1~wp`}{VWSSS%g*qT+Si04ExF=jBPxl>-t*D+ zHi85-f2?QBDy9KE`wI(#4>d5uR#xn9TjXMJ+*B?1-;=y2~WrVi1Nn&MQ(`p(WeS;zIJ?Lgb;m99kVBRyyl zHSxG z5^XQO`6I;)@2%bYjo)Gg8)S4Jm}s#W?j*+vEayyC)(Pb1yR6nhR@q5kr<(39J*`BMreQI~!AQzL7cI=0I=l8-L_fb46oz(OAu<}z68u~jY@7J5* z{{Dv-tKXpwkji>Gw6GA}Ix{>?{9X|j3~^q!B5(f_31UwTy0hYKb8bax_&DXaF|&Jg z{Qc0gNLFQsVLN%!+xGm8xU{ebAGJ}pRz*+Aq?-2|({~d5UNuu|L&G3vG-Vy-7uDCA z(GUg2_(uGSc4ZFW0th%YD_0=}8qtq`JekzD#-E};$oPD4iU`k4z6JE@@Z#1dR|`k8S0;q z`E{&q*xmES?B^2E&F?NOX`O7VMMEG@&&)i$(j=%Xl%rR?+I89wD<*k`GA4!pER(kd zhk~-_$=jm!FvlwKZA)bKlW2O`ezbug;i=w*9uN9mIljpqL- z!v++9Cb$FnAHmmujdwF_&#hKEnq*_O!ol84q^`_I&qKlTZI(|5=jDX%7Z&8$$1-jG zHr@bs8iOx8ncJ8E4U(bJFCc?V4o|;R!i4pMp0$a*wwk1walaG-x}RKEzzN}D**gN; zWw^fG*#uH@^JoZ}70Bt^9i%tdd! z@ud`W=!6!AVfeglg+BWlxW(%d^(W52Hl;H#zI}8cR)dc zp;)M@OAy>QSK7xiFYy0PbbHY&W+kV()O{oo0gj{2X~aJI4;My*t^DXti>HWDjlh1f zpIF0x3mdUzao8#)K!n~5V;@&zwOe=!An?G15U2ax&r_6~#|~nM7T|C!2DwbWpnJkr zzcGWYuJ?Wt4Yub*GhHf8|9zP^A-lAXZ{{(y?mree%+M_MNnL~ZZ05%gymO`Hr{4Ox zvBI5>ea~N+-c2$`(deBSI?YKo7?Rt%^^I$xnHqhv)!%fTcL&rJ9EyeeI7YL$ zeYV`t98+xdUxSwJfYkh`h8DvCW?MHzM}NvQxFveALy#LuuhP;3v@!fh)BIOn zp0}z~%|dtHq`gXLaXV~mM{Y3II*rDN6OYA;;rNn5gkRV&K~@=k(p6e7kt9#BlF+n&R1S~ zjmaGNjusyaHJmo=EcGULOUU+@IiiWY ziDU>Oy*6kiXZ%%zASJcRlYfHYOHcL9{t7yoWq|LMj%EpC;cJZ2#_XTtg4(pLFfEKL zJDXpx)k0!~Sw_)DtI`r_`AIN|7=C7xQE?%;?}XggyD$RqhA{dM`WZ2|2sm{sMF)NQ_ji| zaS0B(5KsPEn8`qyA_cW~3TsJ0{L zFX+QJ++bK!7ZOQ*RVIh??sxlF`_L-adku} zQmZ?^;-WjH(F47Q&v6-xs4ss^e`Sct-HDA;gHio9Mh%?{i^K%@3|+j_N*ycDq8F}( zG4)N7;Ud+OU;TI(vNG}stwELa_9k=!B;-jDaiy#p7SmCL44R5; zSf|sKb1ONJrmWXYpGmuV?%>J$0O{+^3lA$Vlw2!$9L_=y3~f%I^;Y#o!nL~D~br48sX&gNnWeJHY`Q4=)o9P7qeQU zq#eMzVqQ^b(awHWaP;)#|AM5=w$rggGu!+_uEj;9mAsrg+hO#7ahYFQfve7*{3Q6E z+XJoS!ZA*b2EGU4J|6ss*ME`XGJ=&@7Mgdr)u*FnAoJVX&?3<3aG4a?ztud)D3x4nPt)oa9V|@(pbua0S*kcg|NmRTTqa?5 z@R?0o`NgQKuLnN~4a?7rVOJA5L!%Z;_}K9Zti5r_VrZnSTJx>g+c2$eWqVM<_E|Zg zvakMKI{IqHFZ{-%QTVpE!R+;>D00>pcd^pdE^A7ouW7YiLLKSb^m>tJzxn3%Seu&P z!R3Kd=J?><(|OFaQ!t?ms6Djv-xeF#1@%GFxHpqi+D%=zFpKN$w;B(yk6H5e|4fl$~>C=S*@9eI!4_AP}&%cjRBI-Y&1@@GF0 zdYoe@4oOwx#bqDdzUZ-zj3dX@h9`hoq6`?M4#T;;TC_O3ZCP< zMioy}WhPOxR;NP5)?|8%*80kLyI*atp#=SeQ=+69AN=>-s#D6}Kv;;;_sj6iyhi_n zFu(H>-wL;lPlP0glAxrF3q@H}cQ0pDD|^pc#L+xU*?gU}%a0%FDCxnBo@cvX+f(;8Xts5CxeRuON zzk{L&w)U;7TR_vJflsxH+(8l7WoLH#-v$hUA53q_)S-nW6{aHINzYgu*S5>NkUt$s zJ9?FGL%=?pgX|m&6SNe?Z!2;#YF1`RM@}6L?WD7lMXqY5zP_7X){B$V!2RuT1SmVx z>>hp{*|=@#t$m+z4hd}!p_4}qllk13&}6zlUyizqNhEOhsrBpjSv|@=xW3QDXg*r@ z^Nrd)w7!HtVD4}M8(~;Da{UQ;ljL`$c7zunc$^dWYn8V?q%Kb3^8Bq|$TG${kWb2r$;z)SmYTixs$71tEb#< z3L;BVn93TMjH-5BF>B$eSj*8%#fu8beC%v9DsW8na zl7YqJrnyBdvArvHkc&}M5Ijfp4LQH(&Ur9FL9)^6W4u{kMscv9B42fXWkUrFHari8sqX16kgSnTPL%hzX_cZ>xBv z@g!}a06t_c9p5)YLD`pIPQqw!_T66CWg}eg0iq5C5a@T-2bj#&fUg|id2rTMhtqE_ zi0Uoy6Ei9)gch)eFI0jEF1z{IC~w)XyI?!m4cQh`(Odb(=DqNmL9J-E-JYL5&(bIc z&;a-~Jd~_p5;l|H4kBrIU042w<})d*v@3*2U%_(zL6km}g~r*+-jyxzpNr1Sc5Xrj)H~-vZ_-YZ~9Af%C0^L40`@RwczJ zIh|fk^xT95KAW78bI%w;STBdS7oaSs;0Vuxs14$%m*AeGCYzGQ9dka`~AaICW)MbfTqoBTC1X)}urmWffK0!P4Nc_Zy}>$)TshkU&A% zSNg3*BB?#j`i&qrTxxTP3uj+;TtVwcVA9N2(e^A$PVSgAPjY2SM^M<7`cf@+7UNmQ zv%ltNnx+J{FUUZ4Xd8)7PuQBkCEpYZRgGN#Q5*5Z{7}$=*rl=07nk{Ziu~=joK3~J zZ-6j8v59TWeL7t{cTiyH5pg5WCrD(WzYDYWYvu|r#|lS}iK{|SsC0ReztXqsJlUxj zzFjrTwbHnWLRdHCCMv&Wi$?&0^G;TnOHa+rcpZq2ScboO5B%->oD1Ceg!TAod`&kX z{krme+x7S$9E6trZ(K_+Ax9y>;*QFt&u1g_k#LSQ*kz2|dmc%B$nU3svjywO$b2-* zrzvlhR35Q(>u~AE=k=NWmT)3YZ`w$W#8Xl#+o=sFyH!CH6D)X`>C|RDqf2UG;;!$0 zU)NC5S?2Xsq)0^OTFLo8d$0Cv5(Nt+>raTjDLK`s1SJD za1_T0>+eC#n@`SCKDh^N#KEG>)}Ea(O0$ERb~thFPYA|124QmQsRJ~@fCmUBA1nHp2Q{MP~c2_ zsCB@fKL_f7SF99Mq`mer@aj9RzV&Y_6x#I`>Sj$L-w{z}z<&;UZs|BGV4*+UbrmGE z2>}%<@J3D6W0truJgu*5$^7O)9kv!>%dQ%OH5%wm%RY5bquKAjdG!>-$LL;}w*Ta2 zcZZgC2Ua(kdW{+Bn=f+o;IL!ROn8&&S(P88jWty&OC*`-F`BE)G!2O2R}q=iZ- z>owPWTnGH>2sE!##zSM#=k`T=E&b1~7Qv@ib-m?=4PK4%>uZ-MRiO`AhZ2@+{mBp!g|Zk9}`z!A`U(fONpVrl7PlUx$)dw^YoIVp(@a1JzbT?v~p|)M+}6Br_@i z+=87M=KI`j+B7$V457t#5Q-Ycig@xXb5`6PAW_ShZ~5f8b&th`&F0}i%QL3h-Bam~ z$FfE(zG{dOIa=Ee^*VR|MgJ>Bcyrr2s-ofc*7I?Eyx-#k?6gdLJmc25WxWU$W>Ap3 z=Jw^bBy#L?q4|8|GywVTD=`6Sf!Fw z?Jr?A>tstImQ4HxE56ybC)q4>#J$Q!>IdBK*r*=yowC=3>dDANEqG(c{lUwJCSQLY zrk31%y3k7eaA|07&r1}p`UASj`sR~`V$FG*V_1rDh7RrCdV=n65e}&Z5~IP z_nNZTMH#dh|igkSGboYy><*PbRD>Dn6HK#swB)2<(h3hcE zpp_LXh8X+%1cF|hl3kf`KX*1jw;E1LhTeTIRHrT|u7tJC=k~|p43VycK#P#naarmJ zr(A8I%$>L^;euRCH+^{=*y`q#W@56PP>WvqI;~<)2RpoOZ|hPBM0Su;zRd0@Vd#WO z%&%!T_Wq>cQ{>tX&{Fy!g+}D4rjIpqS8YAK7<7YMA0;3JRG;(AU2C}>SkHm`lP=ny z=yMx~FLCA=UPGqJseHLv-?<1)J$YZBQt^NK*Y}a{>gm20dzH+*(Kg$tzR_`otjP_< z{EWKDaBTl2uQyEZ{h58gG!Lo4HYFK4^}NE0d{0_hJL5`tGx>qX4#&blOmfbhsW6+Q z_CYk29P^QA%=T`IKik7zvOm&{3Zhs!V(B|m?2^&DaPu}CKXBR**MpwHL(92PnUb(KJ0nF13x@S+(}*z4cZG6C>M|3-$@i$5tn(L z7X?>oOJ8M_qDk(v#;Ve$k+0L*W<5JL1$>Li6KwVP*~a@tY}~0`2-B4ft-tqQ)1W`h z;B)(~kJYIG4x0A9&i76S$Z7S3y#oX-$35AacYT}yEwd(A@p(l5!<)0;%n$p!_DEkz z`>O3D9FMbcMmKmZ102)5d4AVP?bZ&b*-mxaP+GmV?F=4SA7gXa*nm}2{T+)}DjU?e z*0&6b)#H1VA=tBy?NjM2j8ht3;Id>bBf1=4U>JHX7TNGtXfIG#i+u1N3v=rHFuB@b z6@10ber7=5zsq7s)XZ#5vA!H{N5)irjSk~)TPu~PMd!LXOr2k=mmwQ-aJi-?z>ew2*7 z$QS&V$Q%{8aagv+``^s8{WmiT$eGzh&P*g|)d$ZZqU{`L>&R=^XL`1u)I4$SN#2<< zZ3$bn>R>umuF_@$=Li3!j^(R$NcWD7FqziNonU)A?^2=ASF1jDsba2^tv(<{hIVRQnX8^gZS*OQ|}z@R%o`Y$43O_iuB=j zyj^|#b{_nn3N_FCt}s|2A3c@pp}dTHA|89V?Lyr94vRb^lP1ftHsF0H8JV+xE{b$cvaPX$A_Lbyx^OI!e59{=xTcUsj*ydt z4xLZ+op~|U+}Wsq*vJ9_3o$h_8G)E9`)7%Al{z5fRi!d*>JQw>c@!g?dzaO2tJyF1 zud=xqW1<)6GPm!_4yyyd%bugeJnyNfH4iA?f_My^iyHEGO!UexN^^{|xexznd|`!k zBYsEX-BaC>u6}iySq%*{f4PUN*G`sveka8qze)K)qAfRZ(Num}&Hp3}yd)Sh-^ZQq z)!M^12J_&2Db&beOYJ{$>;E}Jnq_>Y`)Ic-dP<1)Au=rM9uBszTdVDOZyBzz@Ydx= z>3;I~lJ7s}7^+PJDzAd7)GYrU`zZZ06yJQ4)F!H{ZmgNO z6>!`Z^T6&a7(tp2tq^^919{vI8C&FPxE3qSNku?c)EzD0{ zEn*GU<_;pbJw0~Edr>abNM}ETZ+P7!zaFQYa(tL!ym*n~4E8qD^^ZI$dFND`p4oJ} zpRW2S6#;53mQdndq998~hpq2@CW;O~?nGg#lH_nLndxf^=Fb=L^Z^nY1kM<_{Dm5W zM$|I&EXz+LM{@sYQ;jr=wBu5tbIQ|yX`Okz(I|{GH7Uv_?Y(}tYgstqI56m)=;{s@-=+b&FQaOb!Lk($cGZe9ZZPkR-E0@v4Tj2 zuF~3EH>cbt`F`*#_n4h$tBC)DsW})fs+`ldi-jAg`1?)dTa#J`#>6kZ0C-$K8_CcHZGE|4cxPkBz@Pj^9#Yjbxb0(ejAi|J zFf3@7Esk?1myP`0U!W+K%Oj5jvuh^^R+C$;Dal#mC9od&B@4RWVh%O?+ctnabbv39 z>o|8dT(^4>fC*jv&FK#_cm4Sp0@uv(6LV_}JK}7=s+CM}hLXd7R2__h+I7iEC+~HWq#0{E;l~bO@su z*LG;K*Dzo8dtXrhw_L-N7O1vCu*FE%e2}Tp8c;jA%q{!U;@4TthB&0Vc|kLC1}bVl zZ{x?A1~-d!7H6J zQ9{Yqo}sMLrsS2_c|QY~8M?E5CKYA$YnZ0ezxoBU?pITuI6~&SkVf2#z39A?@gJ)k z$YeK8hx1MoL*VOer`i!^Qx<%}0k+U_DGruE%JBLyrHevU)p_1`er-!0Xen$y+7>tz zC=;@GTdR7&GLgkBf*eT^?6ec)+RcxNsJc#FFar;`w@4u=}9I@8t-*@XXr5-W{rKDTO}8 z362NH#W`8kw;q|e$3Eh>*ZL@6s6HDnu8uw>a#E2?*Gss4V6<2bANthr9o+9>004s% z-2MUR&Vf%f>pr&-kD~RIZJ#lyoG_klBFSidIS09Pr2zc(g)) zkep`V5-xH(v_@{Y*vunt#GX^kUiExeOtnw!=KJ;QUc{G+Qq5%Q-9muL!7Gb(vm;|F z>0FN3(2CLG-eG^miPTK;hHLC~oqv}S>Ythu@Xz{xHc-`k^du^7Uc|!~nl@n3PEn8o zPnKL>J)XF)x+_R*td6siO4@YG%2P=vzQwyKc zt9YeFPt{UC#%l3aF>E|uuVK|2*E_8~ObgRnW(_A-v7^hT*|k1;xDDEiN3V>bU` z@Gum%2h7jjoZ#sP~7tu8AdoI8bAp5l+ujP~TM!h)$t^9Y-{vGP`wDf$LEPTku_1y)4nk7Mc0Z zv_N{ZS@5$Xr?WQRET@gAolLmku~#gVjHC6SHw*6e)JaRdy5_(|Ml?VfJgtf2Wb*f4 z8zkrUsqgpKCeNA2zTf>{(6MkeVvYZbn)3GanotNAM`5-VDaj+N?e_gX=ku1oi(DD} zeZ(|Wn?vEiI7GX{?29W>CVoRu!LTH4yEY{J?js#Mm?5;jI8J0b_mRs|#go%gg%@`^ zm&`F3+bpaf zuzdo5USIY7#`2!amJK2%Vztkbd>a~u3DTEkH<~UdCUVue3m69rY5hhV&$hSp`Q34qSRNo+g*5Vm?eL#?6%(?C z$aEJ*We;s!yi$PQ=(s&!@?bp2R0qY>VrNA?CvFM`m-PyzTNEXC(B7RX97`o^ZBl!B zEXbXCvrdoZCPQTPXTC*Kayt?3I0$9VTEPS20o0m%#y&sAu>V{S1VVM_xM8vDIl*%Y zcgsXNw^6At;K=QvRQ7l7Aoq`-s744?>>ncEUveD3g`+`(TAy=E-aW9OC4CMx!+)Ke z6)pXT6y;On;C!gXg+{cpeoPA4F*eAc;Zm)Bp!)27kElr ztxz>W2!qNRTE<-khY-1Av&1TK{-H{#l-0tWQ&eCA_wkYQ*Y~qjX}uCx8D5_u3?X4Z zhG+!k)A`5s*hPWD^K>5h@U$niQ5E?D zqAJQ3*xVHO>FR5C>PeCcxPryHbe<-!|1VU~ilvQR#GN`rx+1NJDr)e26tFtR z@yV#%l&flJ_AxefT?puof4b5^{5HVHe`z%DFdKi`i(Z>x?`Mr08`UPkWac24nu1?| zyS+Atd#D)u$}o8nT6RaZ99Bw_7;n$OSqXU?XV@b~2g!y-c-(IqSE|7{sBx(}qqeg& zK|klG$v$;vob`nayga04vgkpz$HhWG()o7W8wZi-(gZ#SAg$|H@d~=&40`l zDMogE>$i;SZ|7^X{ z)nKY?3X4*DGu_Gy=KLs;c`jcA)i*=5s5(^GmN$c}#|ZY@>&wB_v?!7NK?ejo4Gfll zhefdl-9oTm+Vv1@Xwr;{uH5K7p-rSJv@#?*To776@F?@M#_Oq_Fiip_R+6qZWDH*~ z>mH5_eu3*eO4`%;dFj*vC;3_|{_-g=Nq7jf!E#5G(sD*`Eq_}?j~s4<ua!W&oGKZN_u*itE`?jaWD!vh9?f|RUXDKG7r?faCWDlkPeCaXs0f)N@ zH%uZvw>(|&%Xr;q>+6oNDBgP@iqQ>pU$s|qQUv&~T%!AOq43?5Sqzb7r5a+7 z^|ijxk4~tQb#t2#hXn=_d42@x{5hfYp(NF?f+$ij-;skJ9B;qhza&tMA0HNjF%$er zQ_&Z{3+<20@xXmde4#BRRfEWN6oK&n(a<%Gu)8dWQY@AiaZc+U5%(uGxk!s1rT~5S zbF+FFG4g!9EN6bnV>t~PFLZnwU{O5Na~o7`7ZCxrCkg_Y|6Fs)(tR?HBlM~z&g6E_ zw|}=Fd^jZT$W2g)xg(hq_zi5Q{n^*i`S;%YkePMoM$S(nBX!d8mR9AUpQ&Ay%q5V* zFo#+1YXTbGt)BCA>Q%%i0dP~?PUAtowNl#R20sDy@00aj%PWCb@&?4PW~ckM@Vu&) z>4J;2o+|4WazR{YsU)C57doFz_#@8DT2Iz(+wz-5I@y_03#q5e=9SBEYd5?OpPr1M z*jK}?Xs4NZiH4G)4m!(X;Ldy>CyoPb>x8}fc_=kYiLu?%q#*vtEyyd6sqMhRKY|Uy z-V3?16Fd7lA8Ya?SuZMIT<<*qY?YoLaGga^3LuU~C<*`*d|x*Q@4+sPO(^wGebJM9 z&5iX}rnbM)+@<3e`lIXN4t)H2Os;tVr2tsQmJFU}W@7d${QSA86)t%jnVam~^W`-3 zz|0~GeDdc9Uh~!c#N9y@YZM_+COP57{3&)e+pD^JQ8GMUTK~{e`O6SGm(wQ=i2KcB zzsIe!nuK-kyL0YrmB95(p^Y9!mdaESH_(HB-f3UJ-$2^EHE2h%ef*KJjHpS|VShwR z_J-}L2fPpXC18BLm}&W8B$r>*dTv`W6!9XVYWY4IsKG$>wJjwH7&xms)%g;N?2Q`{ z0USe=ZkA|5C(bd9UdOi}pa>z?npws4@4iC0k~yz@W1ZP4!*#bL>8FV{JR%M`Yq-w! z*(Ji5yCN4fnR5kp+!3rNLIm}b8LSu-HN#b^o(uUg%4GF*+Ia$gkKSlO#w(__(ax6Abl zJ%dcGxfxuK>@n%-nQyL!&gdS#M!Im!A>no#uFHr=L}mi8%@%qDIoi)M3l*FQdyxN# z^fuLtO2!u6{$h_5l=I>&@RSCwr2C}P6k|IVqW{Stze@W!*HiF5aVB)8Dm*+AQpIxF+b)XE&M3zr}1Id^)`&MVY!?B;rlCnxu^e>;rPbdEkC>auY}!gT%_6e*v6|b zH3o+`?3TabxscQCI=jvtcye|K&gk&0ijLC2$N7`Ttnzm64Hhb{B{18}maOBw&j7F5 zzN$D|;f#o@=^Brk&3#~zXk&?sQJOO;mM^K(ZG4eaiF>-;i5p>GQNP*}SUp##KC7mz zPDNQyQ9r-28K78cG;d5;v4v@so_t0=RvL&rpS@(S467v9temr2Iy`#qXK^oJN! zy$;aaXHJ}XqXLr%J=QhHB{X%s4BltUsB9R;=-gi?g+~po_Elb9BP65^r>4#K~=x*<6$nNv>ezYXOFt3@$6N3dIfN z&P55ZHn1Vk8o=abyTtp?Lw(F&+{T0MZKb7#bP>$pI-;&jN(^Qzn;7CB2&89Ih$x#Q z*^rQiR$n*W@M$|C@;YrLbGv^U{wMS6?PcjUO{=wx#Zyn+SMT}=)pW(iJ{rdEYt?^u z>GMqN`?>R^7Ilj-7qU}Ve`sfC!-(7sO8m>eG;1sQN`Ohd8H6U1o?;gWC`G(v<^d_h zHA*`*pN$bW;L{dk#F}c9`b@S)C@21q4c%VeH*j!BUwO)9Z-`#IXs%8Cj&53j+3W2W zp|pWJO=e>nZ4ZjF9wAB50P1MwT0R#wIBpgjFfD($it6H}v0Ax%QqT*ugvwV`#n*MQ zW|`%p)ekA7;snaBGDBq9erI0B567rwUN@z|8%_-y~}s@uU%a`96iw`bko=^ z&x|J+{wKV4Pp-L6k3t&FD}+fg6yN#t*lQ=py`r)5)2|KwK9xVUz2S%b&Lxj#$vW^~ z0l7?5pShT)hctzfw9IWFJ6zC`S1%Qw=Qpwi)*+12;hF5ABa@??y)Cw|XwRE^Qx;$2 zm;4h^;PKL$ZD*ngRj+dR4~WyA*RS|S!J^F|PN?dfmqb#xDvY)8?1!F@$C7fZd4uYA zwYJx4%46eNvy6EncjG(p9fD-S+zZtD*-u0PHF;cP6xOF=`g8Dphd%BC@p@joG6iWj ze*q{>P^0?q)TBC|dH_YgO2yp%rj|7+TO8X-O}Wkt0W;@-W(QR(mra?E=6F^Sca7{` zX|HLm-IU`ff#&;iaNZM^u>b+)szbwK3Bi6`&PVktvq z?pa`t8qD_4^ES%rE+ef1fKr}Fj^YqEniEm0VdIG&0qY<8i_SW)AlU3q@3dp7&YOd9 zsS#rO_I|nh7)a1_I3sK3S$d44|HPs`N7cDaRtsN&lP)r5`X>GdL)d;efnR()V{Wl z=XyhMc941(deU0SguZ3yJJJfP$ir{y3+0)m4-u7Kyp!sE2bL1HlWFr-8ELT&)`iB> zBfOII7C0=V+;fx$b2lE0rwkf^lk+7heGbAOf)8qQwC!}xx#^&X{Sw$eqBIP$-#n3i z3@#ZU{!yn@f~nN$N=L({k2ilhNSnxzoz#(C?=Bb+JXtFAszM0bn17Ttqx$GzmU+@d zun#8=rH^R_IK?i@3x7f7wA!Q@%2QHD3~ZD>1oWx|!{-Un7JDp9ib|i5@tURU7p5>} zb%b4W+25=!i*NS@>LJ4MU!*2fb`yuiZqMiL<=*O#LmMVK?W*5Aq^GtwP=+_WqB8>s z$(ENb1MfBTUKxD`8#Bs`ue!e(v>X2(tVRvcNUT!PU1layreUJ=Yd+kLI9xU~^^j?? zF4vFR({p3+lE#jH4*k-B?o;~6`=oJCOD&IUS}q@uT3-|A*cWc#I$lq>N;xsg3<4SI zTHEr(kxy5)SPtD_WUVS|ws(TH984@!2+SDhAzuL*u zksy|>eLt{wG~%$72quO%+6sr1m`Ae5*CR3Ay_CBrKdQW;rZG1g7x_Ww+)-f#ddguD zKS7DQxLqZuOQq4?&;zV(P}UqUIuG6?P8DB)x-u3175R@mKz z_hpg{h0DG=MCA%*^{3gjt-(1-Sx7<`vTNhOPBb;sN`K`^S-#Yxe96W&z}-L=-5+gF z7~0l#NuXnJaJ`i)#*#QM$2XhN{yQvuBHuiylYhe0X>{q!#?GOK<#D5jxbrOg&yU1| zc70tCEGIiW-l&~hcIOS(>zXC4@fkp0LE4b?<7boM9+&A!D%5+@)$^=0Du?pz+N>`& za8g&V@K&9iB=o(wBzw0jj>`A1d>klpznP`(SJYah)qSRj(^EaJu(5HubEcg5^={(0 zYcax2B;B}>opxk?^59zdF4Q!b)OybYs}|OPQq9pSVG`Vz3bdIm2~z(EI=>=&VoHdy z%A~2Z)DSkT3P04 z&^H;#8FiDu$l!|@-{l9;hp?sVW-C!aGQCN!`TeORrO1nH%}vPIa%?}t7b=QFK6}#C z>+86(V3n}1R8eR~%rEc$T1_hepV5&pu9C83c40yW;+?BuX?T@x!7?cv=Rs`T2mO!j z$KeIPsuu2^lEMBRlzG41cI#sN{Ng!u7eO&HbK&fby8s&MnA~P1&TWzh95-+Ak%4Ct zUyop1aObchmrb-JXSUlIA4lf>-*_wQ9-%fldz+@k4u&Se$RLY6P}^(ct*rSKXNJ&= z)}=MCkLRsR3PKMW%_@d=Daar1pt!Tcgt!DBq29x|kzNbR_k6LzjcrHNU*qkc8X0+C zl=C=}&Y$M!+WxvhIYP3xO6af_l(VBas_%BJ^v$a;L?Y9uy7NBBX0!dc-lALPgW@0t zly>b;lNL7w;2REu=FYcscFhO;?~oz?YqB%glNt4CY^`yHE_onJ9n3)|Bw^t;{dnE+ ze=Q=BUcj-uP6GhaJ&iXpHDH*T7hrf=*i~HdU7N_*n-j6<`@qeomrhg7c0LC2`;Wgx z)l)U-@qH>!YhOg&afJZOsxzfb7CX-|2m}`hG{&s;!TMvCb^MZh-_5IRDS}LdkyL|O znz1aDSp?Uysa2Mxjw*(;}@lm^Iga?hHPKqkvzv1xHvueVmqJfN^s z`>}lM>@$K7`DD~`UBD?4a(EwckrWedfBB|Yw`T7`Iu9SbH2Z`G#F03$E?*L2T6y@? z3d*C%ZsX)Nbas16cnTv$~2|W7;lZdJDZQYuFi&ljG zv%}FH_N&4+-2jj8rvE=Pqd>H|sb1!(p2_I0=k8x~92{K)zDxGl@D{J_J(35ha-9KG zdd!t$5>R4#v_s66Q5i_uZ3``RppY9C-{&9I0i5XItfU^>oed4z0OqZsW_6T=mzF3| z^VOao?@IsOYdUY*8=ee=0&Qx_?%HpqTOd!YOkK|EynhdH=KHEXVo5f;&owfK5_x^K z>sij{+Iwg1)l^?{iS;=IRvcmZFZ2~zihDtxaIwk1Hg}cA2=^%b+?B{PM9^T<7tJn2n|lEV*9~$7v7$dAJ^ZgMn&QnT3XADp8u@Z&2%m0G5eKv30~`&RXel(3Gvh0*eo`ckF`pxq44{k=>ZSk z;e(k{H|IKYTH?37Jfh~pG&5ouKk$7S&T>^3c@6f_L|a8i;?gHxV3J7h%sVsViSu(D z7*`9g2O}*ttH&BuZ2g0x@a>av1ee83UE@0z#);!ZiVXIYMouF4=7FJk#OPeezNbfJ zhWhb%6O~Mx=qNV&vn}SFFNIGNK6w;2;i{67|3TxELQuBe93SF;cN%>^! zcBX`4Ck{vYy)Np?>c8+Fq_5#}h2{Q4o}yHZOy7-?VDGqO*yrQfvwg-QoN0f$`zP6+ zRV7BD7zO@DEeS30uqouWmg#m#J>Qb!xrUG-?h$@z>fY59nF8fuP5_N5WaLS4t^o4| z&gN2R3VT1TC?X6>-t(h9COKu9fz_ z#LDwlGH_Wa!!5gx+`V$hx1BTc+frd>gTAin52aMhClM;%0e3VXfZtOCcCDyb=iiWi zogGitsvgkk@xZK=sP*EWf3q&1tOU0mGp-PAkS_6$N1bJ)!23r z*Ry#ezdV;kk4`T zYMK&Y9x%9&HIZH?(5V`Gkm*E~r(S9Ar|j{J5>`AXq$nNcRl{{Ikm?iW5Fb;h_hvWZsrNsTwO!(x zaIG_b+MG712kj~L;F<3$6*}2>7HVYuuL6)NFVXwBIP1D-ksDb%We(S>2Nk#nVP1AP zRP=HP_FFILAaz91DyOpTL_G+N#)zHuX1GFtS%`h79q?HLkhuNvWb{}y$kctA!oLU? zD}7))W4!;U>A3o>xc*7>T@s|aJ25?>*Xf?C3>WL?VsSjQiDbBUbp}GlKh_gISNo;-0h zKAATnflSqFnb{%LyQVR0p;58@_dBs(B|suatu75{&Io1f^I%q-Tb`#Cav|Jam-IT? z3A<>yQ9neg2EoGNvqmlF`2x(mY_!^^w@{5BmjfSdg)-bQjS&8a^H70!7EQBj^O1y0 zdVS|4iC7soSw-6;){q;#wf8NNs0&rQ2yr)ArGo&MBnf!XS?nXH+za<+C{AA;z6=)|_qZ?#uuB1DERdhym;8D?AdoXCm$>*X4`N0&nfmDjko!#g#VN)p2JfXQ%6>Fx$71s31;rwn zHta{mLZq#gOCFd5R^gy~^KxzAzbi%}6hY9}mL>LssQXl$9QnAVY@Tht{cXkU-O5{<|E$57i%68cVvErMw&EFWdBFLDz9a5}2 zmAM^ke^wcRau(uvji+^QE#z;ufU00|SGVA-#f3MDSlkx&Dn8bC^nNU(9Yvs@Zwmc{ zR>kps<_+&3a^53C&-Pw1s#}?69@fO&)BjWZo|dw5G${j-ZD?*-(kXCv%jS87jwkYx zZ`-p!&HB~VhrdatWx}9I?eZ@ElT8BX!@DJnra%d`h-0900EF8kOs|c4G=3nUHRV0^ zQkDZJQDS(#i+&xkwBb29j;TQCvif+cwuDq_h2TGI&A?d480=!BgF($xg!IH|i~NaQCSq^YNa!$&VwH ziTp!Ye>m$;PK<7gtD_%AdB5qGy4JkRti8P7!V1%{>K>*vfw}&n;Hj^AQQNbEA;L_w zp!;thRET(_zO0OrN>}SD$c!v}oFdu-+CE%(LG|8kh&PPSFq!VGGVL|deCjr(uyJj5 zwEB~=K=(3wVKiWC)6lDO5!#rCMz&+UCJcdxWrPACo=$wi*B1AW`Uhccb7`~rm~YGS zUM7c2P9IPll_D@19Yycql$KvzqMTi$pHE@}+kIOOEU!WnCq8D`a@4*RqF}v>dq7_u zI~>?x12s1)VDP5xAu6-htgaui5zM zGY+eFhgvU#J8uw7<8Mx#1CoU=O~7YY;_l)*zuvR0B7*E$;1QHPoy}|U>U#!rO$RAt zR~utZV#=AcoC zNE_A^fO|LuQXPqLiv^!_54+-3zRijN-`|7oIIAj|qAQhBAs+l_^ACN&!(wyA-xq>G zNf$}1U+`E5MSVc81@9V2@y>42{@i+9!*R}}MH9~JHUz#&k4@wN@;{i3MUmaOk_qsA zg6!`%tidbjC-Z>g9B@h>emc`=LAR(K8(59Ob<9iereC}jje0=csj;9f$h zm96@X;)CpSU5mq{CV9Lk1S&A>z>9Vo{1vKCJ{Sio6l$9!THK37$zYer zTJliI0_|rCx0u}QC+Cd-pgYYiCW2PSGUA5+4rhvNcUE~%o1R?o460d9f7tt+f_wG5 zK$n>g5IED*O%I4K-uRoyt9VmMPWnj|#gmrWaYB{OWjy(F_v3MNR9Kf|xFuejv3|6K z&CsoN5@7Z6&?V|TplK>WmB(?4|DcG7(h;@>sM1nEZB6FgL)19*k*G@JwUtt|@Eqs! zav}|~R7+DsaxSZp!x?nD9q<$QDC*#{O}Nu;-Hs1718Onp+U}g7*^;LGxDd{eLAEj65Hf_v<(Q@!ak-H}Xe4=&U^c2^aRc;TeAz-pbz)J{~F% zvqS%UwtCcxawX^Py+5~dnBGC|Gg3Bj#_x4m5PXnyaDv9#X%=#J;^Kq9CP#kk>H2D?y^f~6>BYpY+v8FW z)op5&eKRUQYXp(p{1cesz409L_X0-l`ojW^4IQS4MsAg#Q^x3TIm!#~i@k~XT?mP zv5BmlN;v@3cGh<7{N>b(S2#l%NAo<_;#b36)2j-E+ETT=H6W|d!ukwlKvM^+2!3}$ zSD~1B*r2SRuhJz*<%^cnN%U!J6%*EkTOudKJ6HLIx&FlVxSBSWLu}itPkim3Oy>EV zoy|MY(aIu10KDZg$MCi|Dd8TUZ`x&^pSMkW%dIg}vCMpY2{)%`2v^M2>!csr{(XR{ z{@gmKxNCLC#Nqq46vmNQmSP#YwBr4C8ikh0+yoy-XzknML%9_IyX5Pg2!cdztIf~3 zU1SDHKVRa7^_Xm@%BH-XO5u*mfIV6d&bK{vZLiiK2U!)~t29HVV5$HENYu0gv(cJdvlM)#Fv=FXZ5r_CZq+K{gk;#3c2eL-_!j!mlNi|Hr#9L{y-;ji}hU}{OD8^?2 zq`PzclUJzW{GtN=w%4;$&sm&S0I`57SyZ|3w8_+*+VeM}&mvu^J5@v=vQFq~)4>$8 z(C>>b?uy#_)2+t_`5wx5+A_-bL{b{u^BnbnuS(%GH5weRTfOkmpE&Yka@6gljf4}O z2+`x&=BKbS?M@b7SxhIHlc8KSHclb)%*sv!dWV=mzN6_$`&6axrM6rpaXRO>tb`03 z-H1=NPYRlveWZITk7u(vvv$3u+3kJRctkc-umzj7LD$~WV$|m10zklx_ z{<=%|oSg_dP007&NBXZV8DYG(Gmw{YyCJ@!FKw-35|q)*|GutL4f2XSEw&fhP^rcO zaoSFN!h-_PF2@h7_5o<{YT)2cUqqz8MU2~f9$g0)8(;qW(}|6ugakh1^VXop{90S_ zLC~8X?Es&dbtXj-=FW^)KzIlFSxKUi>EV&YD$?z;WH za8J6Tb6{fNzmU-7bRl-ZQAaZmdUIs8@vs#(ihRBPIe57bDRJ8Z@P=^(`8m9VvTjxc z1&$2xH2Xxd3%w8_z1cr^Xe4CQi64TcUCP9T?+xC;=g=;r&1gz0W;v_OWu6#u3~jJY za&7?qe+_M~cg5K}`DvC=XFKz>n#To!r^!!=MT+(P(T`WO(rosW@%Ykdexe3whH{I_ zz1jidijhr>P=F+fIte1BiS3-R`7dj;=XwNkbbSu7e^LZrw#hmo5_) z26zM*V)x|)4ev&8F?Vi@_CXt*v)%3wf-19c^lhO6kECpejsRj?*W7+f#a2YyHy~qQ z^UO!})m6_N=TRp1+m@DAu*hAsRAQqpxVSy9_#5bB>qj!=S8xGzR6CXr9;#1#a$>pX zY_jgm%kB)9UfXGy4mpTh+52l{{D)JlJptMQk8bWeS@3SZ;@c%+TxN^f~WThDZ9F;|t#I{10D$85URXy#b>Ythf}n;ts_fid*sGP@KWtwYa;L z0z+|%ySw|~?(R0&zyR+&zyEp9bv~UB``X!S-&tA7By+DTJ6Vxhh4sL$%kqSPtQ0V5 zXjbnC1RQ$kD?{OFYuxdX;F2EU=crZ9e-&mzQOSh;D#q5I9X3>_l#Hkv>kbECeOoAG zS^fI9-_qtYd2bxiSpSv?IHS#9Ml2JtEFu1ZWS10P^)Q|>^^_Ezg^tKlhNa>E8O zA5oTF`6WH0j|Ls^1FS0)xVrD_!Kzlsn!_e?AQ&ZQ_2ZJz`%jk9(;%eNq%)xV z5JK7Vi0Hd}6nM!g=w!9=8~Sv?Qx&eBL|8OFBH*n#UYd!5Q7TS1{pCd_xb#r2UOvT4 zy4>PLxd-z3xcT(=op>Z~3q39)=qV3(w6g|#wHxGJkZLC^pTV}N`7(3uBYOE$vqAlp zERTA{K|^|AXj!6l`6(3zSNWoRwDIbAWP-86`m@HghM($ufWhrc{Y}MT{>j)MNSSwi zm|>}Z#dcMxN87@#`Nmn?NwevleCGUn0F6Pz%!!3ZZa5E-hWA~SmeeNWhyA+qNL3wM zHEfb1i|qNJ$R_5hx&}J>^(Uxicrynf<;2;CV0;TKGPejosHrTi0?Ps<&woLJcBS<4 zcxtlF|E4=ywCv-g_gE0`;ltB-Y83@RkZ$vw3z?_<$%ERP*B0c6$y+nJQgLGyxk=Of zc%`*nul_Cof3%};|GxVW_*+AFp1w4%>?yDGt@Y@c-!E5{ZDCwyKAjt^b!Umz_2Wgi z&rsviy<(^z;HKZ;z4B3q$xej^A3?NGcHNL6QvE?oT4erZKEVRt4uq7C#ddq>A3)Ql zQps`lGT(dmqLJ!BX`)r~T*ips!+s%5#W$9){h%A2v<^(V^pij<{tSdzZ+oJMFs*4? z;galL1I_08_D5Atv;EKjFZw&7=BP@SZgZ=tn{@{ZR(R zeuU0ro1pZxQr)ln8RE=DujS0BKIySl&P!a-zzd?+ZoqeY&Ep^WB~ieW=+f82yvxHS zNZrqpjQCPE>w~J3L?ZuxPlaJ!r5ne(@m?NZ%koR-XVcDft%8XrO0U$Ten@H2IF-JZ zB`RyMxXac>Hx>saLC*^akH$5D8a5MEAmk7vUQfdoI{2OcY?P>4;i&<^6P6 zMgDfb`7-tfz6A$}ctJq04W$8Zk4CR&e4*(l zp$>tKn>#w`{V@_9c@B@)&Dpo-P5%VK90`23N+`SmB>MQqc`TNq6W73ZCe^xYOY2Fu zmB=ux1;yWw-5@Fa8V#cH`}PIxIIlHc>-2HJ86z_jug_x^=eyca3;1OrQLF6Snsj$@ zW}uX9|GC06`9roAwA4@m-^FAW*TB%nepcJ8`1sO7dFnaP*uAH!YCV2Df>`h}b9$h9 zxA668=jF)j^agD|TBmU{p^{N+dozJ`VYy`v$B^kkW6h6nr|Fo3b>r=c?d`OyC*9Y> zW1QW}_Vop8Ghpoe>FBa+|EJ&C!=`(_$m6p^s{%Rng?Bv<tW{|AryAH45>@a_M>ul|Fdy}{sC8v!sl*RCiG zo_YEoeB$Om_`w6y=9@uR_w)FJjju|QuW=kI3TYqGom^B+NVyZ+Au-)u~-8gkw5S4FZryiG-S*X=xFq2s{t^&K{Zs`0jj@3Soh6~jpzTg+*r zLTGXXyv?o)#ELoB%DbEvcr#&5YdSdX_oM)BDV@%F69Odel&MlxP~ss zbmH|cy+p>>{|3;>wFC{}H4_qT!isIWWxt6{uD2i1=}poOH60p;9jiDP>1_MGO;*@H z)WtSkhcL6ye~z9xe>q<$!9K}U!<5WYU@BN7W`c|PFyn;%;NuI!;d}M;ub{x3I*g^2 zhPtBjtsexI2ZFYp4(jwnO5YDgSsb9~H?+U9vADY=oYz)vZ0@A)6D)U|{%n4aJdsng zAtI)_qu&?OAq=$n>zkMe1z5Q--!hu5q0Khs}Eh zF6L3DXRL0k@PO^v{#!XVVKHKtr$G51bjE%h#Js4kXukiN5+ z`%a6coPKkXS5anr;^U$HE^nbmO3fHkW1}PIe|V-t$O|&mV(^1Ygj)f=#5td_;%13& zJ{tV~vYsg_a<|Ya*P`-{1#GrUwOIWd{7GdyLfIsf<#ZLHag--*ICRFAt?vTz^ zkmsG4s;{jXr7;s&%Zl0gj;k25rj)BcM!Uj@7wf{pL|j!%Q%x3{4aZOijyCsYmkXW` z1l~HGeet=HEhYtTFBw}-QmwCISeYuv@Ts|_!kVi|R;2DaDGOWkaIyE*6f&n6j$UfY z<{(gFa;POoKi`%>ug%GoJR|122|vm4GIiv;^V+SP4O+Cr%IC_jU>d_1)59qPLq-MU z=RcQ$6{73@M3EI%FL2-?i*`r|{$%dx8<2ENIZ4EHGv{^Ne4rn#k%i8Y>V3{xq0jjsYZ^VHDm zQ+2&MBDBK`-fY7{8B{}Yoovtpt$vQB^!6Cv*|lcO&!jdK8IsG`CbV=xsRh7rSo=}sPltO!d z(~A!-!SFN|sMYu9Q0O0c)HtsOE{qC!U5>~=F%;$o|`UrZ`chG13TPg>=Wx0 zmpX9O$$rn^$v6Of$G%X2yay!S83$PYVHc>MP7NvUrp}0D{^S@j=-dM!4UShNwFfM*4VFp4=T?{|pjOnWzd-hUWgWL;a1| zsZgSruXZ*sz#9l!?7Ht0xwkM2 zCF-=+2W#xwq!Fdk?G~n^X*mD8{(2M0BcIl9n72xBvRD~~Z!X>nyxTK!Y3RJHDSLU= z6cUC;B8xg>=gnECiRvVnm*jTSCEUqVb@atz+Dwe+_xh63zRC8szO^R5K@CKbivL2w zTNI*3?-t+OBpr{Lrx8spl_;yaq~V$-kuD;;w6o50dYkdtch|P9v+jNzD_0aOYWHo? zGgG)@M0`@x{}(DH74Tv?l*-<$YIGQTs*t5_yz%juq5bQNrx~u)+}-A-($@7St;Ish zl*9Ghr%%jhwh(UKWaC`XN`bE5p@MyyFuFn>ICgV`3xo05+wdPtj)}*a|4A#k&IP_({y+hXh}(9*hQ*`19tA& zz;zn7zOV$MGPceZAcNBkpKQ}1+?V!X{|z>*?X+%h>H~g7qu{$k#8Ky-fv%y($a*hz zIVx7eJ&SPjTvW2X4MmeztOHZ@4vw(>!mQch<;V>4rXyV2M_8Q3Mo5QLSCQRJ42$1} zAqm&%X5Wrd`R2olzWsr{)vMwi_5R+6%eeWbE$0HhD>JJE1i%m8ff*ym0nq97TO4Sy z{-u_S-XB?M{`hCE&MvP@6W7BWqKw0ve|+$Xiu%Ykk6A6vy?ZTvj?O;}!3$1$vmf>a zU;MO?byBAcRkb@mg|^3J=DZbsmcQCf>V+!P`*z7*JE$L>h$i(Z|GlzLjsN&^%Fw>b zuo=-yY`3fX$ohH1(pGc$3GuVE)coD%pWe?@ihWBK_X=!%4YH4}p&i@#gN8gpwf@ER zsdE2BIGY7;`Y#;0u~d;BeznZpt$c_WzRfc=(N{YlN>F#nFE@7QVd(L z+L^ccv6s4d&YDLmUZxbvD;eY~!XYe>Fb(Iz4zrG87QF=#_2MAE#Z=q9*^%IMPQvaN z)+%1U1!BSIQAKeq!;;kbS z1B-aIR_oq}aQnkmkQ+4iIY&RyE9G9ADl>^;KW=5++j2N=c$QiTm$wawq|BJvmHJ z$>9zB1Z#lK(|ZJM>b-dHod{X-JoDDK!#s5UBz^Ph3My;)mR}RAgZp!HTi1VI=hMAr z^H8YLaK;fbDCGd#r(@`jFJ+9&_eRh+WY%J^><*XBX)Ijf)kV=9!BIKc3^cc#3{4*( zUR8}-vzYu6Pq?;wV^J=@`vn?7B5x8@9iXF})SbL{M&2S6YAi07rfF&6v!wg`!N#c* zF~ul^sv*%0ENI2lAx39l(!VxKk4ZITv5CM$akhq>2+%;xnv zXuRm_(E+wj3(p5_;nTHrHT}-FH>@hVGZMnw({u=czR-<5(tB?EE+4tKPTr2BqSLN7 zK94%tiz4Qv_Ui2PE}ePJa`ioO_>+&vCN5k&1dr~nQbod_3{dH+hq(&t;%w^0(sSf5 zIBlRe=ppM`zi(3uY>Ka<$IfrRDlt;3)?`53O|TF})d7l~B1x6dEWmZLgA{&FV?Q(;`qa_H(#7@ws1#|# zQIP-kCtXV!(lXgf^W^z@Nd8EdDRD9+$|>dPYxyHdS^4dKe)jy{9r{2{aE)5Hi9wC~bCv6)IaX(0nI5t>m}iEh1+X%U=r! zZYOR%lJyb!+4=J9P+rN^@G~EBpO2;A#k+q(f9}zvne46Vp!Y_iIz?jhK&`+soNcw~19?H6 z&3zVCo74kZ(`oHsSKsB~jg!VN?MB-A#zqyQ;!;5_^u~lsUOoEne)tY=uS`-$>(ZJD z_SWFFF1pi?xaeyj0UKUq9d)dxU2nJm&S@Zi1NZ0f zKaa;Phs!V6gLJOIrkw}tm++y~7gLtGw&=M1 z=NUGgsl($Yv7A&ZZ>hgqPAwibXNOieYe(8dZG*PF%j-4ttq=BEzB0Y{M#C@W@bvY}U+79nH|#FFO4qNk@nYxO*T0_{+wIim za~QF{AR=G;-6mD~xzf++Z{%SGm`<6F43Xu0&nn~jgT1`rv&rkzgx|GCyI%X$O_kFq zR^(41qOy){=?etbI;LP3N{^qqC`2g@M=5KHS1)}|>Agm1=?5AQo=>P?*xWBGWH$6UJ96xv50!25-yLn%aQR=lm z`8ElGwLZCmZ)Be)pKGK?aHWiV({aNF<3L{8$gvGIqp}Gce3w`4f-}~?%~)R?F0bkL zr$)p27i4&ow22K!yp{Ff>4+%;;1n**^>+hfT$#YHZWh$4PIQ z@o$R6n^smmZCLyS`XvqDl@Z?bnydL}@d%_p5s!{Kg~JzJsRrer`KGU4TLoT6SEFFt zRosj>1y5gPTaHSyY^q<~oK}N2cj=gM+rZJ8yeVt$Yq;0IdpG3o{c@^8JkdUlm8`R+ zLJ!L;nB!BV9ETgnCkt; zk8rEMa$S?CX}QgPdx#ONE^MMF%I8wGWqJ`n*Jvfpw%~>6H|{c;Jq|ovjO<$58mzih zg0d2GVmf@E{3k4c*`HkMf;D>6ruLcKEBXVH06xVYt76sAAq9e9S1t!-v3 zcl~26U9;e8%B2zk|79(>Msmt$C78%)3{k_UYyB6E!;8FycB^VICD5#f;_=wf`iPoC zPOC(0l}fr&KH?_mTS@J)yR*^ns5iR%27sf*=b#CZ+OCf**ySX?tWI%jvDzZ;`I5kLiWs z`|G`4wQWlE)f3e`V(YBO)=15s8)lgnUy_yiPw??&UP^Vr464UNoDvVX4m{@A0%4np=|5(5T5X7{!^GG& zXUGkL>TljwaSIUbzIjV7ncc1hot0&4bP=g5W04${Kf$2OJR#L;Lm>;7*o#}z<^>X> zj-AT!>yd@J)vL z?Ooy?PYYG)2UG1`JF{CanpaMH@pF#PP5S{B>PYvBNU1t^k#|=N&nuXf761 zX`20e%d(DB&J~m%zlr!(T@rB1z_)`v?Nok+QdcLnv?lMC4Ve&I;a3Q79LfOF2W`b~s1$rTZgaPXobD9BnDo zLwKsOc^D}Z-_0M<1h>FnD>s&s#`l2M)X*>8PuIGRAuqGZI>)G<~=hP(;C!5xfo!z^bnfV^T zZj58$oqlI8wlf}|CfoaC5g@lfzyPc-b+(FX-16350I9&K|y|KX`m(wk8l z+G3u$)J4zStCLVX>cpjjoT=crB;V=WVug+)c*wv0K0adGDGUrt^Tp#)YQc3d%d&g@ zaA-Zf6x!KY0Y~nEQ?)ApndE~l1MURuo?6iMJ9TSUfMlJ*HYq-Kko5GF7Sd1J$#35N z9H{mtn%5rwuIrfsf~cf8>t`3fm(xraIwJ3{#H>KUmc->}%SBhR?{UxEn`y8?E$YL= zIbK{u$N|*(ae(EfGq^+}y4`JB>aYr%u{H&j3-w*jNpdK#{|TdaH;T#JV}rc5uXS_> z;mpWG|Eai*TUzixD{z)yKF7ZIfSb2}YYf*mn-Ny-?@rStyf;g$D0l4SmKTZtNN+SBeu7_Y)Yt5ET1f{q4*Y@N| zh4vhrzMAt?d|oM|zWKybUiDKZjos%n89ixMVkWX`$U7uJU5qM}BG2ju)AQ56c$ zo0og0i63(M{~Sw#Bf-!CTJ+v|yQ{sYs4n`JZWujxyW3)JyF8*T?qbnJ-w@u7VEVC?__o!pgxG+fVJszJ21!gIT=ee}i>^qwX87z_Xy! z#Wrg&~%z+@&m%SW&*wsrc(QKW?e z`CZYRmjv*E@!WjgOCkl&jQ4Otm)vKAc@4;m@hIdF5!}{bdpPmbA>x4QO~Dl4v+>L2 ze2dN@mL8=mZ1NoOQhUH+m=LUnE`kv$FY$1=+vM8&?D~5_&X^B5?UIBPkRS@FdmQJ# z%<`;hUMD{*5i<8V#{dHN*SH-GUWAx>3qp9MD7i%^2*0m^44JHUs_482y8IOV>nvP~ zUIXQK$Uf9P7Uts6>kVy)Ug1ZN?e1L^#Wvj^p#h_Cc13M>*LEBg+m<}p!X^dvXXRuv z4AfCf0eTU`GRuk+VG%+fJ-~}hk_9R_l)BAmSPc515m!>>PG~%m^+$CSdEHTKs8x0p zl=r5|Ys(q?9J`R03JttC*?<@`dZa-6D|u z%khEKq?8;b$XJ9hrKtX45qr^YYR+L1sD8AP{SXzlONu;hA5u!)tQiW**pvTLxy>k9 z&{-lb8NJCP=}NQNwzrBoo#YDxag<3&63tUkhGt?;_qs(`%5|b+u{_yESWe7^Mc^5_ zMj#38mHH40$)Y15SwIsI8c{!9iJ2&-5iz{QC~0<0 z^?$u4#rF8w=8BNc zJL!w-PPvP~W5Cvwb#+j2qx$ZYKso*+|LbN0w7Hlt=(2h=t~sB~3VZ|D&Tunu`4pfC z&H-ms$Xo~4gENx!^c9?TIbp|5E!)+bYx4c-loRxid-L~gQ%loH0L?}`-l|n2Gtcp z|2I-HP3uNFDE8Np{;y`nv%Pdto0e4^p@7nDap7~n)g1gi=IPE-wr7ZDDp|W+!1UiJ zk!bQdcB&lCu7gcbo%EnXbq>1*5hiDxUdbu7iTh5kKZ4oEyT#st%wI>bk3_bwKU-I) zn6FE=wQRCHwy*MY#)mWf?;?IN2q?|f25hIjpe&*q7}g)c<{GVeHM*wgV_ zt4DO}d)!sVzdh*Ge6C=9wky{H^o>seeGQsoITbKN>O) zMifginmPL+mp;YzbpLuYS5$sDbM;SNGJ~m?^d6*vP4wXS!dZ_Do#s@ung*}2x?LUA zrRzW1Bi$@N2S|yf!v?qU`o3C^45R)F#F;p0mAAlq0vjuR3~0$X-NeOQv@wAcJ6ga! zeEp-z!0$=SYiVA*`vr84yW*KBJ~yhCzIYz&p^%0by6AdYdpkrZKCTg@s_`K7spnXn zKO5_P3jVLj136EGH9qO38|tr8Q>VJiH`KpFhP=V+i$26RO1V>9>C!zMDKKbz}u{M<4!=Jsi@ z1ZY#I+0x`(3pa<TguL%KP);Edk?;7Uho!m0vG(D)v4ex-ht3 zP6?Uu#gADy@A{tG!u3>sbf>Yl336z0>Lyh4`1d0DL@V{*lVd~ zL}vt_M6^uq@Pk(;VO)6zKvhH$r3N9BVy`TnC~0yPmBNrvyG)f4$~JQ7LIf)PEq%kp zrvcXhWo_4xW35-bQP@XAbYj^pbiEMs3M!wbH$6+jP`}T>;DNbmDKf~hMc1hNVjLAk zSX>fuqqGo(&Ms;RB%hUVPL?AH&Jf>g--s(SG$AmzPOtYu(xsp4dv~6VVE|VQ7IOg6x7ax;IdQHTnazqzW~|4x8s;M?ZzrLdTG>Gcls%}y=30W0U*`blf+D@ zHKI~nF6I7uv9%4G>U9fCK)gQw27<|ST$&~k7nvl6cfZ*URe|)s;2jvZoz&-MnEvQ8 zM`BsCK(c$xpfI~m{qOqZ8ttR)v)*RO5wi8cWTaFmPmiAz$Xnoc&#y)(u2vR*=?1G< zxn$~3IYtS~iuegk-R22Q?`}XC=JohWpkCP2Q^zDG$5Ci`yI~lnIdxRb5-No|a`{#r zFQNDuqikd;twaPVk{{n=J4Z;!Mlc8vmH=EG#jN%Hnei5Oe7aYd>xC&#+ z4w$b{q2~%CX5L#Ex5B&!wPqOc`i4f#;cG<5P8W+y3SfwZN4Ns}k+F_Z!*Tyd%>S<= z@BL(>N~3_KJ3;$E@;7TAxdKokOc+ere4WbZ_LxJ6>rXU3R_6 z;$of;8CSXXjg4=(vmeuUilbfpXczDeM*J-T3v-c$w!TGsX_yK%zJvDLWo58f=P@7o zduy9pcMl&ghX4xT9nLK7B_YHKWDt<9!6rZ!>;OQD<=Flj+k~1Mx(d5av&jE!|GQ7( zO&MzS@Cn0Q?^Zgu;0QUoxLclcpRQ5K%&T?$@5*+q?X;Yh${C1XK1y8tkA3L~#i@!; z2sk+i#gSn>4Oxp{6nki(pQc4VUv)=y-2zGO2a{<;IcJEG#%vWCR<+cSINCF={Zf_V zfXbazH0u+y|G0E~yM_Nmm*@!Q4g4T}!QXuriHMHG>UH@Iju4}nS_=IbT8Uw|-`3`> zQN}HTh}N7Tw^ds9@nkx=bfmNrvePdnPI%#CKY?Gf4B z9^;t3ggFFiRRb12^w5DFp}AS4C*t;WuSDZo-ivF-0}Xk>$;Sj=Eps1w>mQBb;;_k_ z<8_V@9ubBtbO(_`4>L39$F;v-uL)@X5s&`RIBY6M-^TJ3Xm&Dl)BcZ;VWR^0?~I$~ z|3>u($Tz~0yZ7OUGXRxu0O;CIjch{g1)nLv7s-|*L>4W}<^Wg}dhWfQ0_oNdgn5yo_84&gm39@&a&{O z3EjhFXX)z<+XU@DY2!c-CLdgeclzWu>;pJ!OXsqn_G>q1{PUfpO@Ey|Q=iV82keE9 zpPix=bGvee5la{!UL?s@8ta|K77XaNl_{gQ!7-cd@9%iVM6Pwx4x2N2;gI{HXr_38fZ1 zIBdCeHi!Q|$i%zs|FT~a^29gMyjCgg4L2FBF0Q-C^1?4}K7&Iw_IW-X96Croc8G#{ z=>;!EFTv&QKn8+qjeW?Lo^ipIW97u{#DaqzPd8m{4&o^TaJgvSO+YDNL z=r5F8T^t9Vr%Of$OrN17r?ZI|iX4Jp_y?ipc|+b~7_WVYcJ2M+rR&O`=J!gkV1JoO zjqWXz`^yuE;rB}egU9F!aAoJ?z=o$*@e?V;<(RbV@KMYDLNG4ixT-VX_oo2xvbi&z zY)|m!a0b^`=84U(^?~GVl;20@Ro`3ZlK(Ze?Y8L#vY>e96ZeMo1gU7-?V1NU7<_oE z@a=TVe2#-cFkhexFDHU=ZxpcC#2^p-O^j)f!@5`})eCuE&Soo2?W=EuzyB%lBDlh* z;+jTjhN)1@`w(y|a!~1ZSN6rEgBJS{5z*q4!3wY0GIpf3vci{a@^0P-c zhjNc~fcTD&*K=$2`b4{cpgGyP@AoxJ<&keo?q*SlD63q;zf+0~I|InzUOMSbKe^~U zHj0W+l6z#Clk7^@O2Fv-7u&mzfS3OLQ#9)@;kU^4{|uUonmM!9ciu?@WVV!zOQ3o-2~u}j~C zeUlGo!Fkl@y5Sypy~E+n^N-iF#;^Q0;~9vU-8MJ<_5bWi@ARSA_sbGon{u&_^?};s z+G`cdA{O0L3-C7Y99|z>fh1@50a>Jd%^Z0UUe>Z@&mIL9de~XIg8`syUJ+4uvg}50 zU;n%ID#*pVx9nzzUWQH1 z|F}ynq_dhNx9;Mb`AHr8p=7FYxM;$GARy~P-J|LE2P!3BZSZSGqvsu(B2ovY|9ixh zOa;HJIz?*~hrK~NhE4Kwq33utj{q%JsaJ)O(evd72THwb2-9*{@--(#5GLN$cd%r0!gL#KZNw&iCHhV)Ry%rpiY zG&c~!0L(T^zUfkHsF|1I3l>Z5EfJTFyWpaio0yoiB9l!gyPTZ!oC56ucgqF#C%^lmiQ-UpVj}0gkx)`jfmA z3NLOa_)a~RBOi+>iJ**0{v1{IPrqJPcqZ404Ilt)+}4TOPi@*j6-B$=9yLYFuHOzO z;)pg+4n4>NW2rLqi!FSs;0(PK5@^id@(u@2C zYq8Ui9A&-d(|(|G=8M}0Q1Qg8fa;-XFtP*fp6|vX8;*krtm!`S7~t@i!>Kt@40j_H?W|9HZPdTf$##Eh;(JEDwu`&X`2m~h zNhEz-Qcv;P&LBn3J>B`gVg8oWu{m$KliiY1vAD)+-$Ga`}<-5>~<=U_uUOBmCYC z+5d)k;szxpQrnjPPE^k2lf{r|y1);B5=dn9p0wrJ6g--l{Ro;HcIYDcRV85fSroTZ zl~1X9?_lxMMhD3hSku9s)#I>gb-nz0>e_?eX_cs{ne5PbtRIQyczM<7?J1I2wQGpG z0eSHUVO9qd`()qQXL}2eV3{FJt`3otUYoV4y2e2k|0d*zvRNQ_|3rWHPfpjHg-qnZ z5tcX2p8$=by){qf{8_aXo((3@{KoDCI#YDa`5=#xJ;@f-S5$=j0knDFLOfKDQVmC` zcN9vAakN}}hwr4R)*bNiA+kbe|5L?QVcRdz!RNns;%1)Mi0)rde~cdf;#AINqw%}> zOS(}JFj>Lh7;L^c^V$0oJYPRw!wT^NQ}neu@ic0B{XNoWlir2KE$31)N`8SyFjRldN1-rjqz>4=|+5WTIL`#7rMI>L~*FO2U z>I$c*YkonV;k&cF?@l}V)#8Mw=jJiLf4j~){h>zHLh%$^?v^*=QX8TjMpqaf{c`4V z%)nk#gR5^TH)w>RQCfAg8vXhttE=F}vx7fE zAce;hesN}?B>K|Na;$;IkAKWjHMib@BTdhZb`L1XQh0k#1l6C80?1oEVo%I8~*Z( z5U!H{2W_K+j|q+$sy^|4*vm9WXk#se=w7urW2^ zOs;{f&5nLAR0Ds`2C_>IJuXBQ5#QFpv$^B%`%PeTJn7q{bky*v5ebfZ+kfj5<%wmg zJalvvtj*xN|3Kd1p2$%dGb|oB+1qF)YEl;mZ}aXGB2`4+`jsu*&!x`|l5~w`+Y~zN zBzn2Vr^7fu^7s}7_W!{#sHwJ-dk$4StM^C;egBb2;)rb+(rN4#K*gD># z(Z8~@fWvVK;k{wZOiIURUXK7;o0}38oPQ7Xm9oO%!cNywoQa)fV^;3_<31u1U3#B0 z@Z1<@W?$49Lw4%brI^x3!FE=(A@IjM8L7g0W9;O2{)Kg|oNhpwhT^Z>EPAbD_`5A)~azJ(EScW?goxpG}g`)z5?XGE_4pBQ837-Do z$%xkO#WlhJzaLLCs!G&qs=Um}qQKh+834nLN2*1*OoL`Q#;mUw-T{KAawj$2BSP%$ z_rkOK`CJIte-#bHDcfbO5L$-qMMA6B^Z0ie$iJ#eVMI#(LQ|K*J|Zd*sX!dU{jzfN zcwWmrj8X1ozoW{!y0?$mh_^sL3K@8b>ciWSi>rC&_8`4K;4IdziAqtY=NOi8S##l2 zHJ?~cU(?V!30!$z@wZkwqRa$$ z-@{0jRi=0@?RvgX%i7b)=#BG}Lej<}b$!m}dAO5z+&`Z0s?kH9dK^aW6O=T6_VRp3lC zg9>oL@4}zEt?CTFMcciV=QL&f+sJ(6YoB@=XE)x~dk)Qa?<%^#%v+UEnKx7y)F&+E zVi&75*`SboNYY`Hmiur^6;DOtsBZmNakM(&%iP?l?qECMcb?Y{Wun@L9>H3oVy~PT zV*24lcRoRLcimwwSBCRy*`@B(0S8NAb~OYF3@Kgrx^#hx50;9`#6ix{3`TFWwcP?- zzsV@-1~@ORNB#|S3QQ#+&kZJgusoPV9}3GNpHu zs33tc{~$!6ydj`7XHoGvh#7C&2mO7=a;Cp(g_X!i-mla{!Ev6KQuWN=ctimqrY37A_@8x-|I>_sM@#Osrj z4JNfghiKLN{0Qe?O76Z3khGl3al2}Dze(|*933BUH-2AW+j3aP#*W-y~ zQgKr-XdGuaJ9{VAPN)+87M?vzkCH^pX(219u1QL#4&wW9LJ$o6#72Dly9W+s_I12o zR8Wa@Nn$!OwGSuWf?N2V%xY7V0gYdmRj%ub(eKu1Q`YLT>Q2(rV<)pz0k3c`47R*k z^!o--2L2$wl=R;%Us9?%RZcT(I)4244QggCm=}mbEFN2j9}+Q7aum5Wb#Spy)YuZm zCu#&VQSVj@r8q|*Wx2UMAm}#6hl7~l3cx;kQ8uRFycNtkf8Vj$_MvIU3mZtwCSS?W zWV%o6_dgCCYjxc)-y)Z~rl7PlZBBsN5tpi*1$ZZmBibn>sLnicmy0dE%WnK=W}x|Z zcKa67afzxuH`#<;RS6;P`(+Lf<-)J_qP|Z$fUSS9*lb^PQ+(bL^Q#U$(-OC!aVh;s zAy*U@Th{dPtp0J9SaD{)sH%RreTncVR+2a%yO*Fvi%hi-yzRC@(8unb)KB$6=1Ul4 zBxXFxjt|F+wWm9HL>g!hJA^`W8h0uE>##tFlQQDBR@I?idI$1jfS5h~Q?=1G+Z;Q> zcX~^Y>s`kk3rFWk_@JzTjRC?a9l5n&sWSoLEP8*WT{Lk-ro0~d9fBnpyR1y0xe^02 zEQqPyL4RTmclA#W32hpq8UwDOU)OORLu@8e#tQL?11LKm_tQ=;@4IcjFxl&ZT|b6u|wPPd2BNKAD_R z2=CGN5Wlnf!mS1j{~XO*h3MfmpQ_($e~A-dlG2?piJn>vdM$ED^juJwf~OMh>#-Gz zwQ3Wjl^Y@J_V2EdwhHQbAKC8}&))ucw1;i?L|`N(m(t%Oer)&mO2h?dYJ~DgTf=&d z*X_O{2tS@WoSb6d%=e?fNWIi~VVf^ddtMB&V|`FqIqOigqis?!l*1jN1AfVx@8drP z>RY*!Q6%lixbLVjJ#TcRLWKE8v`A=ZJUaMK(^o7dRKyR0{v!T*1P2)c*elUFfet;a zH+dsQ)qzz~B?tjj{TMdU>xgIq2Z|$QLhzRSYB&;EaN#`Td>Kx!(*V1PF#$os1iIipoDh8cjw9JDbq!aQf;dnx`5euZo4$*8 zhA^kN{3LcDglQAZZbCplcYcdvoPuA&!|@V94R9)g|LCc$9Jj&FBIB6ZL&|F+f|@i{WL?kW zSexA2oxGaJ+(Y5}rOb8Zy+)o~238)?l~i7JHI*{iO7arA$tqU(x>l`ZY-WFe(du-k zQ({<3IhE!+1k4wltT!5$0U{QMtc4wyZ}<<)*P=TKSS5pLUM(2*NdiCVB};)e{t4>}*R&AaN*faXc_Q5RiPh9+q+zlP479 zNC=^OS|UWDUkMe{C6K);8Yl`v_?>7Sp@*rAQx=jlqeA9MHOWpen3$blR+Sw0=U8lC z{jgu)$OxUhui4L%K5H;B@%_@Ek%f~)rZGGLf0V1GW8T9*I^sL(d=$pGZ;A|0IAxK3 zp}45vMZW2+c}{V-kIL?3ZeJ%?X-%)TkTf2t$&j-r$4|npy!N8!E^4-fMpEoZ%s1le z-knmHp$|@<7Ps*#p@XPIqsKI(M3o3j$R}0Y$s`<|X?q%&vF#$~+Inw_ED2(Dno3;wD zNP=eHp(D9VV7;&|P*-?HYHVLcIxC2;;v6kSN4oz|npGP}13>?|PtQ=%u3M5L3_3|7 zoBrl;G$D{1+=54KPqun#>orY%r9A^D^ww8$cEpNT;Sq5cT1EFMm0{m)PkbO)Dc%QW zWUBO+<`xT-`vS-Q#?{y(?M2kjH1_q-n0^gPH8(#J>%M$%Ltu(P1-?2ns_^k9o|=e} zi1f$VgmbUAG)mj45}vnup}QXayPb=+O{2J3FdD0zTQOTLv3iwQf=x}CO>i98_y6$r z)=^P){rj+p0!oK;NH+*Wr_$Zh9Yc2rNQks_H%NDP2+Gh5-QC?GE&LAN-p~C!-*{uK zcfJ3yhO_ti#PzwZ&&=6-A5$Cbue@JH-N;#8ci{xhDnHY%f=1O~iL}q!3Et^i*S^z3 zYpb@)r!))O`SD5v$F;ShHEo+y3I0CBx|>Fj{{RaLC4CXh3z4^FQ%Zhmo38(=o6lnk zy8e+nYJIf&8Zs95_DSf=bOHz1I=*JI59wDwwS}pdjM&2OxmCu_#Y3*LCx8RNxtSZ` z>5k&k>GnEJH9Sr>=#ic=*OSJXsunm-8F;U#__FGIOoZfrr-5XmD3vG?Zlu|!!$gZqQD60rw4D4vxo(o2EzUgn+G_zOoqJx7A?!0iml_EH-9lN77cM_Z0Lj8M7fooG8t(mog z670g~E;GUl{P)jF!rE_NOxqhKaNleor76m{*X5o;onCBzrrY8ukM^D4#}=3Ln@px= zYapRpJA_pFl`)QIzoG7gWC})j6IHk52=9|tO52yLT)t`xbX!jP5$_5K@bnGK zS$~!F#BJGvm1ELPEy+w+B9!(`0L0a0lP9KK>fyx$6>Wso1|$WsQn}(PHZ$g_pM!J3P#*O|xQjjs?Uk5@dSXA9I_RA0oH9)D>u?DdMf5bIx?(VylfbeR zcUVlM9KXtot9BZk`*yNXT{{_KgMAz)pNK1o0MqyLLC@L2KG!Rf%Yii~`Ws9MqHNqSBw z1^tw#QCnzMciS z)-qq7#sWJ?bj#v!sqoM~Q=(&xwnxkHQtbtn_>3}_+E+4qYu!bo@Yi-LlE?!Pj}RI8 z`X3K|>8tn@l^BR>NXY^70ZYGRY=hl>dGV!R=1sH{1)asBTT0nnULhQbz9umWI975i zCpQ|7L3npJ-FL~8#_4)2Pyr_p-6S>O`)+QGUB1`)hL$L6#jPCOZFDs8;kkFAl$Ye% zH?j3ng+34L4&3)KiSGGoie`Rxhq@Tsu5<79QhXFF)@bTYTbNCt$fGZhYQ)5{-J?Gu ziy`x+*+`(-+K^p$JM={|&&)*%OE4XQM5+Z#Rc|BB0 z_zqvB+KC>j;VMSu2FQx@lY}QF2!VbkldPtl%6%4qv)z0HkKJi|E{C|(zQVQ~h6E1v z@BR@|_=bbk=F_&@@{{FlK1l=dEgz16jZWUq{k_~w2e}K+3ZByEX#{26->-@X3V34UW?!FL``ff{~BefJ3J<9 zE-jxyEyv2v)j;aw>klIVp$&>>ZvxOM+xsj7 zUSq@X$!}r|Ar-g3@g%O77_ZTFD142tfD&r0qFz6EQnZ^Ko)KN;PQ}=#s;c3uukLZf zIVPT)*~9zvB}@&`89e2~k>34+_uUVzNH$082hRJS-Vd?q_ptX54=3jt_thWWZ^{Lq zLYHRzBWVe2_)zXm?C|T?6pfZ^O(UP~IE`&754^=}yFvbS?YlEt({Z79)}F@~+A=H( z->uFiLPum&5@p_12hW4u$0FgZb0v|j3K}QZJMry5VYbavABEV8mQmslV=()XMF&!A|1h#z- zy064*Y8vT8=W(Ro+ebM;QF4NanVP-LF zPO?Jb5nrv9PsN*?Kil?s!jBe@;;K`oY}oJ=-ne^eJ(^5n zztMM7R!jP>W>EKJgOoO*|7GViS4R>{5X`GVr|gbjOi3LUu`k7or(C~sx!6w+|8j&@ zMfjp{d6o7|R}Fnl3ObAS^Z80)ZW5K>_LVD0-&!3D1Gb-`2NyqoMLuIV99qE$NeMs+ zSfV3mArw{|xLZy1vtSqAk$<*!(R;im!V<8#6znT+a`BuI97{&()SFJ)ms(6#V0xG0 z*ef%Ki(^DPMo7oj&QBz>$$_PzXLB)#meqs8@j6J>WAmw=DvbfFF#_r~sW-4{JHMsX z$~A7CaX5`~U-m&&!K#=`VK-9bCJ_ymcuJBJQ~u?SCC0R0BBC+%fo<*n66x8 zrDXQHCEgFYa{JR-)@iEC0Shciy`K}$&pJmbzxiAi1PHYL>_G2Iv0^8nGI%xX0N#Y- zzhdj+I+3F6(H_B}M}-Sa5w0FLPc7JsVo@GiPZww+c*T6SO2n#&8;=pYiPGgJ_eu^g z`3D>DmJ2ME!~l~KhFXU?Lg6(i{*JuMdPk1`EGG{xO=iZ`SzvB5t%+0qJ`!Gh2X@WP zhDiOdkE_hsQx4{K0chKi$!P=Y*3(0>E^jzgqjji!qU}!xU&mP{5i=b_DVk_0<7f|L zGcd*OCwERDJ$u1J{4=b|xj$)IEWk=GDS8a)v(dB2f_*llQy~;L6mYag26qZz%q-tP zD|zg^#4kT<%#M!*0%qf77|6vPuq+m=X|CBM%F7R+YsRjfsU zb&V{ToIsBAqGcH6Z!O~}4m!3~$1wVBzub1xe}FLXuq61}a1$19^C$j|>*5wuFeaE|nq1wUAvWpS{5`IK`JBkv`#GwFyS(=U zdt$?VS7{?e*a_>tZ^jNQVLGX@E;dX`v{|T`-CWYkczjo?rZAX8D9GOpnx(EpGGrZh zOAp@gney6TA`ZG8n`BGnIZz5= zqMuw19IzA@*f$amtja^4$Um?KH`LT`23B3T+3(v)VXr-JL0D`K=?#B62fvDq;^c)s zi*2d%Wog@J6e(MA0-7gfyE|N!)cEdI29lS$ zyyMoqeao6mKe-6JyqqP!<=Gve@soVZINzT-981;Yo%kw!sd+a%?y@diti>~lr(Yl- zj|768IkDU+m_|iOo4m)P)y*~w*3)Bi7auXL8RsU*9vMv1+ii=&>NNGddetU5mm$Ah zfXA+zC=rTjqg}b8-aFRJoK}A=Qz*ff#=2%uioOzZo7(`0B?|cKnrdt7k^+L?-ffl zA4a^%)i?MD-A`xkTmkFw^(?6>=8n+;iCZt2r{b{rr=k*O@CEPCL98ubx;{Z;GP7B^ zNkb9sWj}1e2Ax=qL8F!8$m}5K68e_fd=NnidY5=JMTj-k)BbOT8cB}ciOwp`(2}N` z+UQ6}V{-W~DCC~h6Jkn3c=(M1*FQp(YEk9xzumoQhMVM4&iWOz;8v4jhNW{PK2sQ) z06K!mTgno*-eb(K31>}wi8Wi_P8BXu1T)M3x=Mw7wE$Mixq*3Z0zD>A$)=3w)-ss6 z>y3DT#a4`-+u~G+1k290ha=Z$<<&DSkMI~9DHc71b$8cO(W;@KRYGewhiB<(`vgTU zNnP?bDN#dlEKaF=Ts7!tP8PV>j_V=FDP zK2zDD^u_`3;M7FsYccH=I4@o~OY;u!GkJkH%mlN$j{G

j_byJzGzPv3z>3jlfV%1P&+=V{kD%lS0=o`+OS=4c(p~iQWAE`b@gFMNJ zUY(%8>M)F$5VxU1i!Umyse^1x5Gdm`G^VDfTCpvY1Ld3DO+t9(8$9k zX$Q-EkUeGsMSXBS+abwQOK2$9GtBI#mb@)37(=QjhWCqSC*Ok#O~B;iq_@34`LPGM zIPd9g3c?-tdTPTRwOY;)Vin2sPKUTS2hAk7M&#)AyBdXiu7e!c&Y=#AAl3vS0{g@7 zuh-5UBev_q98u3%2KkTiwgNuO!kMP>#zAAD*P`hYq54(pk~{F8ttd&`GEYnIQ<0UM zMhl#JA}>?jFbeB|+hsI_n=W;>ai%s>{3K&)J$`-BJYSc}MOn=2cEl-mDU%@Y&`YcF z9s_3!bCsMa-R+wFpt37Ras;H_ga3Sk@49Rzi-W1vj!LNZdJoCSp`#}0=>RnAop`u| z)SFsH{i8w8(X<@vP|Rq_7;>h;S&-*f(xy9H9FlD#ZI5MU)uEQpdt5icw)W@#ppoFh zym1+p3wx$9r8Q;Vk+&n2=baTl$&lK~!->Ba3S>tIOKOvcFRmxGswa4u5s<8I!+M5h zqu#a5t-`+Lf5}eoDoB=+Bw&fZMI_tDWvyrFT)U8Mkab!Gb@Co#~kBb75X9a!oZ7EHaLO$O{k3;XobeGntv6GM8H{+@7Od4qL*v z$J}6#(MmN)A?yNMcW_%z*%t5y);s(7nokEyXQ9mXyYpPK_{znm+Mnd?lBuIbo_D63 zDq+2fYSh_)o}9E~YC6)~9R_T@@|dSPNETl68S30^=pC(BfYG{as6KU`7h;)EiLSkq zkWaz);G6vEy!i3QVJh~^((eY}z8uWoz!tH0w;M2Xxr2<1-PFl=f|KaHhDR*8Z7!B$ zP!MGcT#N>;dNR0C<&6UDKCHeqmyDBjB;58QcUu-FUo*a_`e0*U{6l`;3?)oWV9D4A zKmK8-6aij?AHP3R1gAnwH?iKi!h3i5efC4_93KJZo;?3a351sINIjxq%8M1nX^fCs zZU9}Q;R}wudn`1e4+_KE+QX>_sght!JMYxpDs_e3OA`b`cqBzIGoC_k4XMs9fpcxj z?X7zWS}OQ3Ou}dbNula|B)D&KM#UZ`k;xicG-A|pQrasIpgNbkR@z2VusVbU!@4DQ}w#M zhx#cVhYO412aDIO=s}KF0#|3BIj|uTkg`omr^F^W_;>bWivcPVH736Lamvyr!nKsP z)k<7*7i?lE5ICZtNb?L_o~s6?Z~|@FT0U;tv1mclf-0jDQ_%20wBSi4N6VU-ODrFm zR@H~MBq2lY)kgi7yChCmv#KMk%&g^FZ%U!t}+W^HVpJa1;3nYIGSdG*p%%>F4JoEnChsSo`(Dm^pe0^^uA}alB_NFfyOl0$KuaBM43h zL!)`*_-U)zZF&p}>%CIlJOpZ%B2mvz0)W~qUraT!{{rk7o(sEacY7G(tP(L8RTX4R zC#y7BELdYZGFh~RV25{yxd+bjm8eaThALek@zL_*TRJr>3R=$&w!}nh)wO})Ug``O ztt+-O9{-SpQWJ^OGR3FUkyDYY^t+i*@C~-~S~ik!?m~wRXiq)G%~D@%Wn&S7kcGKQ zMi9L75oR434a7d>GTe;Ope2CzC(J*z8^^T3+#JXda;oO9#8&C#ZX-*V%;@2qC~9$u zVIwote$de0`ARO&v)e$Byw@MVVAG$yj6}(!Kio;{Ya5+sPtr(FLV5B1L$4m!*z89} zFySHXWDy}YA^lx+uM!FhAKrylEWDZh=5PgqcCS&JSflmx;(9F#@J0YgeLSIGRj-z>?06$;b4MzF%Y4^!xs5Vpa54Fgi zrJF9w4n{|<@oJj~brZ%!5uGL)u^vYmMPFf0FGKr2U4?-X6%*Rq6GUkW@#B+27VuwI_dQ;Zvg+XV1qu=G& zK1~M0H)+Abx9-go+>vVaj*T8z{G%A`|2+!9UZq(W@!X!IvPk-X=8=8rlrR)?Wl zQL(!aa}~zG_=XjgPA?#Z<}kg~sl(;cDwn+ORufw}$k}cmg;Rr?Q$wD>YrmHtc=w2f zs%5t&N>8asED~8Kb0Y*{1!}x&vq^H?MK0B-T8k07VxVawY|Sy=9wL&Ls>9isYhX_# z95}xNZ6`{$XoM*ORqv&)RE^hL6|4=K4+ZcXcy_h_SOwdZ1zq5abKJXabyy`m&E&7j z4Cl>fK;8Igb(n~Jlo}+pFyI7D{UC>3JEMRoc$jLuei(4%yvU8mGoBWcdDG&^3et|Q zFcBtd@&+c|*ok8(#&${ZnxuS$z<6CVI~Z$7ZwOIb~asIiXvz-RL5g@1WqVXJP+sj zg;UI#@L+iUeWy)5%;SoA>gIN9e7}|j{#LP?`R-Ux0#RW5_WW7EgAi7$#o<^n_Z`k4 z2E3WzX$SC8EVBlR_kIs8@Gap!WMlu!H|a?&{S$1^%YI@5Ky_Mi^KvS$yk5Y2Ldr=O zg@(-gAjg(ga*Hcd>f=($gUI_B;OHpw?@0u>Jhq;UL{ODea_Vt~fl)XQcN=hn16F<7 zhYpL&H1`e*4GEpaIj9|9N_AsjIEAC>GW^zgNZZV&zQ%F=v;Dh?VA6*flaI)y)^e8$V|aF~sBf{ydL$ z-~FxXWe*G>01n@4H);%LCr3w5yB!V(XA=B*Z5Zn?mly=Y$~_Gkdw{=2{EIb`=5KRf zG(y(K_oZ#CC?*-2^QUBM#FJHjj`lFvj)Z@{L%q4BVVd>;)7CRasIIKiS6@+8-x?C72;g-_-9HkbdJi6tv3=Mb1K%K)x z;?}eui46|7et}db6|S+W>|t$x=++dtK$m1MiLaNaXT7OYC& zy>xEbC*C^}PiLI_wv1>afvAOJ+mT3Fn_ z8_D;OLF~gYqw4|c8O7izBCnqM4fk>HZpcRVvZRd}^3ro=`}KFl?+wp6P6IkhXh82N z{Y)qIUS4)Ot>a~kk{$Ir5I1J!8>hvuq?>w7Cx}^0l*jo+L>1DWdnq_2E;uS#yUcP6 zS2N3d-PPQxpA7AP?6l3M9>1C2qCdMFsdePPc5+;2kv<{&p&)Y*fq zb;2N?ipLb*TS79mwCJ-7)Zn|tiQlgd)Ut7y(DLH+x8(2WC)iSzF}B*Q4ja|pvf#)25Q+l^0fTLMK2UdsJ=Roo8*t7u2d0@gRFj=#7UC7@Gf2{ zLTSTu_GqS7AukUq7yTh`OYxWM$oF%I)uNyJ3!RHwE5dQdnl|uUD4Pwh$vWBfiPe0Z zkOVIgL%`K zy~|AZxKbKVW`@DvQ)TS_>)LCe zc{V?fFISX|@11TZO)n4Q`mYXweJk?X-6^Sd@ptyEvZJ@}MhskrBx`5Pw~z)}`L0iH z5OW-t=)DN|Gbguh{Krl{Zki1)K?(!>LOy-p<&(DD? zn~10lCIY>daNww`Bx?37gWHg3@_>O$%u1;l(X%}fw;lUUrBz?6@%2Oqiyrt5D))wy z*<5!5)mkTiXIFe1m&fuK^)JGWT78r*vwpfR1R5ld>l9}^N7 zDh~Tv%6-F>Z-b@zM}n&v=6#x@4#;P;Nr9ii{QaU=?c2JaHdMK^2%}JSHMa$E8@4Dh zyb7>JzL**{B_oc~o-X5~4VWMFsCez4(oX2BQOcj{D!9R2DH4;mHI2hSZF%i*S+(i@ z&?YkwiHnm&F4_mv?)V>eyuRHBz&6*WEnYLZrLqFVBHT`Sm_R4F@=O#yBNF2TWgBBc(dmwF8UzNAuKFvC5?1jKu3eh*^}R5RJ-e=k&%{Y4)G6i@D4T2%|t; ziRc)6H2L&gbX#e$8i{y)+sY|#8;zE?$2s(PMP6_dH#jjQ-ermN+S%E=%6z`HC-1t9 zEc?k*UFwF1yZ$q0|5u>_V)KGcfu}OCCXZ1`Up+#mH`*{f0HrSzi~QbgIL$)9ZgI9{ ze*Ymm;X+L{(g+i6lT8s>`rVHw(x`JG@gyIgo^Hh9HB`hp#}YEO5`S{isMzU)B6%^M?y0a;{AmWoX6Bl>73q(QmXg{Y4o+EO7~1)> zpCC+7C1%bQ>o0F#d^z(}W~yA@EaD_&2K`c2g`915nmsG`9rz<8;%O?JhnFVSVO9#F zfn7KgtgH&H6H1_#^=^6P%2VbXmebDkKr$y){8we`^i?xx%`R}hRkef{MKwfkxIl!w zAtQxRn7oeF9kvrnUlqv1UaFn4i!qgyn>x`ZnbsAL`-lIkS^hFar7JyH#oaSszijvvwaUQe_ z1&XCHNM5^QlwneHv^*s?+N{~mYthW51nfo5z!f&y>q}q7Uft#eoYcAl{j%IZth4O zr=g*Np+pZ?*hXtTSfCZDxwOw4ccwV2y}~w}QqDlh%$U6{e?cX`24B*+J$7{<#Ny_* zFhjwv{VTbYt`E}lQpZUj$zNKK5_lu={Z8y3CdVDV7Dc(8?Dbi}g-T*+5+c+1i`huGzG#H3sSZ+?9Z1(5r{uhH%^$7{q=>@yZ!YYzbcT3sTP1gb-ijH@A*>u1*ID8 z%dY<(URhN6^$8y04<;6zBFVK79T`{W)P zS;EYId78g82Nc3QdL!i35wOqNX3+s#qo-(45r14APJ~B(p+`j|waq2L7RpYB0sb{g z&OB+sb1r07G*Lc*G|`iAcjf1=e|=T#KYV3~L*l5%@Qm$ZL#U=0qAA72UqBU>?61&Z zsMgF=!cOE)$~J*G1=1$hJ6i)`XX%kl;;SK!l%ZHoayDopsJ`*g299m55A+}Y%eB)9 zgVLQhzc1hyWQxFZ5NllrhWj}YwN0Zx+FFicscWxONF{0YaT@*nhU9~v7&|Om z+4OthAF_cOL0-W7X#dWFVmYcMU=NGlmObfo!>t8rV&FvsTD1Q~1seVY(l8K|roV%- zJN5IArGBPfe*2=$X!tlT?=RRcM_o1D`w%VHRC)~3qw!6U($gqg&NWBdz_JCWZ%&1P zdo%5~o83!BFqEXt>p3yR8Zi|8ET2O9*`s!M73#0w9uoAu4(+9$!=7XnLPEU#(E=ak zLHO|~XHqn@u7z zS?UQUku;`*IOnmom`j)HF#x=C%={c2KwvA9GzC6A=V;R{x8E3I6m0z*pp(F zg^yG4*Iz<->P}MYYy+K3xRfAX>fNm5bHItzkFexXn&{cRdhe77(Nz3by7L)CngvP# zu8xnBBN;;IRn}7-Yb2j$UOfrbm#^*y31xzTsn=D*N{qFEw(imJCLN+lpbkR)BLjMX z!UGDL;rUrXvV-yHQMQGlYMb7@3y}~ zGU@I)k6yCsYQnxDK&0P{W-V3+q-dO}<9D$Cl>6^s|1OFTq|;l0SyRnALG5=+4*d)w zCS&KVptpdT=jAw-KYI`X2mK?}h^$pMbjZbfkCt{63N#ST_8bG;*QLEY$}FmYNJ7dS zV+bbG=?t`jlzkHQGWxngJ+kJ6QX4da9E}HNMFVw$L~E~qatnhV^LtrQ2aFjgbKWfliVUTd;81&nb4;4)JyHd&(MH0`ghlA@OZVgpt@tT_%$S(D0XPm2lWw)`6D))8G)@^qiZ*OQ2g=F-v5P&-iRUR?R_Bz?fwIY zu$oY2@xH^L4VN7~W*pgw7KLUs#3_enu}Rj}?FwE)MQbn5!Qs$H6d~IK_ir$m!ee+- z!Y_>ILaO?@{q6=yGciiuNh=6*YG0Gwa*~M$n79bA9WObm{OY9fo#5kq`LQ-py8)!DWfwS5XS)uKx-4Rxy-L6fhv=e0 z_upbzE;S$o2w!QFlL~8D8O=br0#5SH)ZVEw5D3T0vT8;-LJs5p7M8!8duUPS^T=-<5{lg6MwypJ= zoTXLtd2x=CWbMNA)+(`CIfMwWvZn_j`W;n4XWlobXLVOIvwbi$GYX_nxVAqVDd0sv0bMP9Dk7LvCyhev!rFGG9fVk)%G$V4#j4C%^Z;Kb3Aox}VVkoYFDspYWj(FxrJ7je$#JF2rI<}u% zV$CZ5wxXI`j9FdyuZgR1N<0O0KPrd<9s<8dpelsGl8vHs$+b_qocl#1zk2%VzuU~; zl>7TWfnVP;hRaBbFMoQaRjykBNB8UryiO#NMP{JWvl_5Cl5WMtwd;X_*bc&S4n1I3 zAVMy=-8vdqIJFS#pGdp-?PL<6x9B4y&U7-7FmEFen#P4ck!u1otFNh-x`-TqW=Gjq z`eXHHoRYt${wvZY9q>s|-ATT>T>vjxIN&hnR z@&4lDbstkYZ#UFJvL2Sr{Uu5>P50K;(SR(XH(Jr(R$0ijMXFaB}feg4#n1G zOI}u6_*f_G7!K^&(23`~_#NS?*2%-2bnE(Zae|G^Z8TDE28LwDH<`S=ko#vt_4GMg zViu!p9II~qJUVpzCD-lBtNpP8MehZakNVrPs?ZvTPA*el$xX$Gip5ty_e?9c$uF}x zOB5jI-Pj|0F0b~y%b>E3!^KK1Eg!Kl%araHZR}B2^+SoW9_RA9^7^NtbjG5yWcar? zWXAUtHWS`Vur7qRJVsXMPR$>X&aJLtIHhqQBwND3!9j5uOWR;ey2ZpX(=QVPlaYra z44f^|ea-bi|UK#04p0g9BM$)!WzUX)B2!!OuO&no(&rXUZynf(aUt%PUP53~u;u}RyootJi zwc@J-L^lw^w=hg8s0Vw7wpf+FrhkSo^@?bF-P_%tr3x~q<}5My%{ur+>1lLK1^X{(85$^WPDXh)Ken}YC8%s<=jVFb%48B}s70iH-GOS<2Z3wYH zXQ!AO4P6{LfOh96!nm$;2#;r~H!^#p=JNAxGF+VZrbh`t5yoh=PxI-U&j$K>UI*1j zwX6o+?YNwCGa|wbU@4`Xzi;=jW;!7k-@Nk|j}j&vq8yZvOO47HGRb?(A3XMNZnC6W zxs9sS5v8Zp=Bml7cuJB;>KkJdYP@yd=u~^Fo&s1$UdQ}UX}7xPvb$FYZT!W-d8MuE zZDeWGeIec+{8!@JsW%=IAK{1jppoBd^C8?Pol$TZJTy2f0aMNKBkFmi6d3O_`P19e zwxNMU7-wh5zoim0?PC)r$cUO=)da-6pd-RzU7!it03RYpr2q&#w6&?_24#`fg_hi zZ!>lmUBc+S?xxfIO+y}?P~$tthT8W;&dewiG}DfY4MA)Qg|#1z5Pdq~ z!PBM-si2r3z<+rgTv=&!`=K#udw%R+871X(ygeU37%Q{k*WxkSj6xz4UB)HtK1Wsr zqjk(l=-P|jbBk{>mZOp>a|ICg);DTga!VbIIa@Qmf`9R`1$=A4FX#INh+?YCrZ5x!geD1diR%& zc%ZLkHn@+V?d%FaSlR$*Im&acuE#ihHyw%(oQEEaDc8$4H~qBQ2~84b4Z`x-I?w#3 z^Cy|)-bGvyQ683)o?WEt3hAxIC9br($;n7Uc6|am3@%zia?sz>I;XLC1@NdGJuLMDFmLALU!uia4C+yKf zLZ2;r?qsCTSMMp>mNBj`36q7Z=@SmUB%?fLv^?k?0>n`41#lXS(Y{mqe*X>B&H<(Y z5x#%ruf(!um0e>lv8+vNa>I-qWN!>(-&L2Fw1_{;0I}<3)xM7K$JDD=)~mPgE3dAo zbL}Z_^LsRnkB}vLOtaH-@>3BNh5wN zZBOG}tPvVStkmv(S2`vR&V6hO^3kR00yyg zqe*QT;_>`C=V|oSv>&x$W~`b+;k5>VJ(%sQQWer_D75VE$Pv{0si|qELSep1!}{DB z&<$mPY=9yr4NOw(j_;m_?mgo37Qp98H&hr;B>cN_Vg!}%6EC9PAujRy00ZUnF{zM-Qlt!h%2YP0HmsJV``?Z_Db`SPqS@rg;zQ}CwE{MkkkMJ@f5n_1KWdd zOUB@v7C7PD>+U|K@bg>3K98Q|}hpc;J3w29y=o%B!d*LP1Z#g-;$=-&am$#~I z2WC5q)`L-2=9kwdtD}GTVYj;La`U$SPNUp}U(;i#yzOHA-O$C~&ft}K2%!L=V?_1G zywu1?b!xW#L!$1Ja4#t=$p=H>RHWkHrAE!f0VGO=r=Z43@QBaiu+~S0DFPT~xt)6b z4QO}zG%>}^(|z~CT(3Tz@jlUw#SErZZEMFqlRM(Z>(191od{L z48AnirLeRDCw1sK6W%ks;5*kc)Caz;Aw+8NQ2p}0+4ye&gHo|# znu=9hZM=HJrU7RcJY9AN4+$=wD=eSmiJ#K=C}j}l?e@jWe-eoNzZ`s&{eK+%M-SzP zX5ac4TLYN?B-P6r1Y&J|)I$o`-JJk~%m(M`+3mS|9UCg156-Z10<^y&`ZtB%HaS01 zXy7BkEvgl9-`*+n}ofWF8pTnwbDk8YsJg|Eq}?uu6K7UcU#=v zx?FgHk-Is1Rl-fk*Ar;7Ju<0y1IbDuMoV+Gq{|qUI@hQHm}-v%V+|0DiN#5zp11VJ z)hwg`1)so$yxnhy;z{hP^G&V4zOCX|g_^z11>=3kOVYVs+5#uTI6Fap*Wjbf{Be-! z5d_)cj1jWof8(<|e(+BQ#b!6V)K;gW?m|JQN5bJyM=j~va_(r`1Glbk<4j=(Zesrh zpg`;P4~K$M2@Bh52UBp`aJEO4FYAu#6<&5gR#qocSedN z-1x*mfdA^`fCW&*fXwgCk0Cc410);@knkp0_jgA#Rcaa{2qx}(?eHu-s*ZmM;Wt9X z?t7HOp+Nmb(T!(kaO}M^psAG>c1&0NBY}Sd6omM12$e^oK54TayNMz=K9sJmrwA2@Tito8nW6|vYxl{$AFsuErb8xGEDTlSOmT!OUDnm|1iwfEIs(8 zx!5amw~zVixQ+*-u55eapU)Zr5q$D@`~9CJBbm5}%4wMb7s9XT&Ip*gG3;pQDUZcl|0Tf{a z(2kC#j!`h7&&56HbJ;ud{&Yq(@=62FH6+ccTBKcj#Mj@LL;_mTe?;QniqN#YHtK%_ z=@>FZ$bJu8J5v9vd0xipa2GE1k*I(oL~Ts^{q5r7@!Q28l`rp~o+lFfL!*VOe6yqA zmt(0@dR+j^(A7#iDg!GEGZ3{|5r8h|M7tO3YyK)Y0Zc~xr{TtvyV#EJm!6!>(>}$g zpg$8{tuBNaI$9Dd|Ai1-cqs`;J7>q zbQ_3j`KHVOZOrnV?@~pv`_rZU5&0j@NkJKn0E6apdmC~|K1UwAh%T`XFaN|2ca!HL z322}rt#w+;uG{Lr7!)Y04b}zw6rhcXnY6Y68W8V4O-ss3AD~~bfPN`(*=INdT6x>` z-x<^xuj3DcMgw1&{zpvyX3)l@zgx7K)rh|&!YIf3!`>%7@l()XPn%y$dR1Mmigb~} zQnn{@Yy52Pa2W~ue>Q33(DwaNnU1x8X*|YaJDwX}e zBoLs`I=&ZavsN~}Cg09R4kKNx{vY^v6#4mo1n2)72A%KmXrhg_T+fg;wiyHkFsc;{ zi8mA1#LedB>IjkzZaqyvdfFi3#iz#le7n$<8gs|^Pu1bcg`;Z{#12r>-t+ZC4K3x*i_N>%H%7A#-yNS2l_`9NqKB(5Z)CM-P{JU5q3x z$a~m&Fu-2>olvVBmtK;MXRR_v-5fb3oEJ}g2!V%y6RZ|FT6 z*f$Y`uVZmFyP?LR`-gORW)tMSPXrD}7A6_LWUm`|k*xMxDe==K8^5)z3Gk2HKRKay zKJ{+!A4oh#RrD=2!Muu=n~&Jh4O4kr$2b>Tr&LeLJvOVZI0D@y1U0efp&6F0rO@Q5 zZ(v?fCDF`K5Ia_vrZV`iZ%jvj97x$VFauXx3`|y_Me_?_q(p6zviFJl@Ejtcu6<0r zI8QM0?#OW5DV~1aiVSB`lqCs?T(nfi15NT!)oSg}h*H8%*qdHqXrX?TxfeZ6He85w z(87DbVFQ_HX0tQ+8An9)jBB|!Qi!*9Cgt;^ERuT%yGRnivY^u}ox=)cWN|}B1ezj z^7JBEYX)}4Ajz`ISk`eM($1`{flbp534=z@kh$8aj;G&iA&~|LZ^z7W5YfH}DMGER z)dakCl#`1UtoSr}!gAKM?<)mIXN8|0-<`c@dMJC^B6=BmA>RiU1*N?IGbcIkS*)N1 z{^pLwJf1)Ype;LbuarBl92q>>bGq|=mBuT8pm5hM2C{-noP!SWOf$lazXI{gFx*2M zyWy15UF~oon6$R;dU!q{^S*QjA6uxZyZhTBup2j?@}jzUSe2wzyF=mhDJgP2*1f4@QCf7KJsZgqlu=drA4pLX2UO@~;kLrMN^ z==k5pPdv_|IIeF#^GsKVX*W*nS7pe@mnn9ek*eBtiJr)_Je{*uda}K5{beBo8#FWX z%F})z<-c=LiRVT<`UT3S8^#MM?(Z}etH-Z96eZJ6R^3F7uXE zf#^ekT0*w5qdd{W=A!`yq!b@L&QslbU?U;6G7#G&$Jab{vXZY_n&w$^(dq|%8@5iRad+)mD6hs#hl}2EPD26j!}sET#j3{qaBoMj zMc8D`Fh#S+JYLdN^!r1%BWy(U&r>Ev>|4cqSjLi;jAswI^B@C6eal||ehoy+w6o2c zMB3;3yUSne0vw^6P&io?U9%w?-;_hC zst;quSgdl^fT`E_MRj)SlkqzP|7GW-FVWVLA?|iCp+KoKvH_1Zf(O`5<1Bk>VOS48 z0d~}`7vEOeNlGWSKb=l?T;aB=dQunPa^1uED#bYK_a$^u+6gsIcXLk@&8$n!GbLTF z8$Jy3#Vge8OBF5GZSuvxPUwGQ<>}5)p4S2$n%K{LHY_^T8c1lBVDze2q_Ie1elnGI zW-`AJUah*2T@!c-3gE_BsvAQl4FhA!_sUJ}&+~kHH*6)#78eRn%>;CfO9L^i9DV#G zspzbp*0Y;RbltF>M^0D)&sr)TL%Ggp;8$#K+EB_JLD|FDBp{pDkj%gNgokK# z-JZhaLHj+cB7m&9WDw=tO--nG30V0LFWVobx)F>n6D3d$V9$f=_M+yqVwq+cxWY>9 z7V)=I-DEfDAqAF8w6ej6+*=9>ZKb5_6r4`Gb@E6HAL%R+c^P_3AyIzlfoiQY`I z5{Hl0T?ZAaA!Dh&aTgqh)*Kj<686>Or|WqMoticcZ&)3Lk^d^d8ZG4kfP7Y|Io!}J zd$Gtt9Ffzr94Rz-1>w99MlYqRPEEXrAm}(yV~_PZ-}nUk>;X3@&%k_A?|HpRQ6&TA z0lAU&{#2}qmE&*^pEa$AobMs1n=}#p!}0p~PPFQ)D+vAH?BqzrHZ&jDSetxa;nt_I zft}2*`NKNN0(!m6(l=OH5e!Vhjibw!k$%=I#VA2d3k#uH*Jb$Jz-XiSRtj#KVy)hR> z8}3l~mt-zw;k=o(bk4|lVXbnvYT5$hEI_*Ijd7!+xcaZelaWhDk^!1Zh~Q1T?osZj zs7;~$td=l$w(iJyn=rwD$!EePrQ#1dax+W;myGhrf1a|BC9-;FfMoB;EyZz}L+k{$ zu;v2DL4c&5=PW8esC#~L?1iq5%}~scHFwUWG(hgaVBSqiyqdw7Wg}gRO++aUpOoJm z2hiy6;K%HrMNRXaV%ZbTYI6T5?muul<+hD!cqIMBvkne?3iOXdG0PPj%mF{IJQZ2(-RLts#`Z=r7hT&=7cUgTmwpbFJ6F58a^2q}*DfOz ztk=CHw2XL1foVdCa=h1fhN2fs`SFii*{-|+~6XgIhGMbhW} zzU+6a@tC8bq{mU^=l zS<++0#PrKLdSyut9{!)Ut^z8m?dv}SeUvB&3eu%W&oDzss7RNB!8N z$@{{37@$tiKOklBqHJ}pVCR1xzKVP%@zCnF##0auSBiIp?Nf|?1v-El;02fIM954j z*&$^pnZMD;vn|_*Y%t3WoF;~9RyKU6AC&qgpn6xu_@mkb?ZO=;a#d_s@M+QACdH(WW z%0(5@?*~-AgOHv&5INuhOW4vu@ehxFv!2Qs9qq{FEkHNTdj@}!sQ$=n%Y+=rY{JPi zu#LsZ|D3KLhQ$!yxD;2!lHb2$tU6F{Qpz%_sLqlX<|a6T#Q_}Fr8sbOn3V-Sn^Tq}$ zqa$Le6I2Zji0|O$0{Y&eD-WaTdAkHV1>Q69{8N3T_4Vq?1o4ln*{I0`)qnc)$gp`| zL*lg$3=|MvFP`AE8EFiar6?*%e2&n&ASBM<0xqtubNoex*kfVZNqD7a5@0@CmwwLS zX)HGX^FnNLBnLg6HDkPV(Qk{eC&|#FIdM7)52eRJXlT;PbuTk$ctrMr!kGaD1K}aX z6ZDVh06}7g5hN&-tl`A2y#E-Zm*?PKg*k6?Bw-MlX<0@e;)YC5D^x#t6zV$!d+=GQ zofoSqUSge0NW>m+R z0rAF(r@LJmK--uJZI%mF*Ub-d_wPt8DM7qv1a|lY)~AfwNQEjr;jx*81n_`L821fXXi1+gyY*fH;>1!oy8D_M_l}a$i>ouz+S8EWEDf}P~zFMaLP_mSP z^=JKvnTdJHaPiHB&-{Y5GaZ0ylVA=i`_!nK_c%@_TG+HaQ-UPIj1VYa%V;LyFC0-a z?24so4rOh0VhIi&h>f>4QTl3_Ng*N9o%Tn8?Tg6DOseZ?4h{Em6d_iYx78N8ML13D;lMpP6 z2e^oBg?v*F&P3T$0;Yv`11u+8xT+6+ZdjYfQ8aVjk$9J;PgG8lj)2s@U+yC*d+4TwF%)GF}Mm{)`sQ>bZw)6G|nVZ?=DWAzo@*vmj-G`hiTzb3< zpXO0F8$RSK%#gb{C?Fr(kC9r4M27@imLWZTaMpu&?;qUW*(>J;6)+IK-xZXYA&DLQ z+#v{+ylV<|$xz0cJ@CWk5&YZ?oT4Pt%ru zBzU*$tO`O@A;{r|pVE3?U)Yr&pD0H7u8#^>TE^<7e#IC?Apt750`wqZ)8ez^1i%|g zo~7EClfCwW>1j#@^oF;8y)7rh%KJukDK%f}Q{t@6G;d^QkxL8tzjsIjWQ93sLpQ#1-` zEZSd+u_4q9th+Z_88{9H%wz(^*!swVHDKO0`Nvsd9yTZRV7yFBm~Hcn zJt|wnkpa^KCIney?0Y7*Hx#xNIq<%Lj4ab3#j{l&1ralhhD8Oqv;5n(CDvUfOZ}~+ za^k>O8h0TY>S#Tzy8{WsBLkTQz!qhK2f4s$=?jJhf=hr9}3D7>^bQeUu%0z;=L z76b+>fiPTQ$ZljMMd(Q-WMA(!GYQl%R`H=Q3l5G?BrRzLl$4a$i#fp0QsVfR1LO9B zI&v(f5>%}_xZ;WDh9bS*57qDP8JQLVS_<&ovTQ_Wq!BR&X`XTU`6F@XDnCqHvb0gP zS?K$JT6xrK2Cw&644Q(F&X>`!SVvh>QFqS2zWKKxH3m_$$Ip0svZzEpd5=!{Vnq2%Mj0Nvw$OkPk&ofr^r{y$`nT=+RPj) z4iF+kS1s;|v)nG}WF%p-G4&J4`XvTS6N)f_jPqumA<7}|Q>98vFUv??!#Eh{t%Pj^ z=QEl74k3X-TSsh@A%J;`46i3KottH*1srB3p zjm-?|A-f+z6Pp!)A!C9V6sIKr7_A#$YKAwx=q)ygxS!Jv%uKxU?I<6Q%U@wM6K8DW zrnhdC6Bo^U{~x8i5$RGCDKkYPWPJs49#vTxFf-@Y1_q!_#4~f>VpcS-$^2VDNA=3+ zxn0~d5kC%yXIA*kHIqg)P*ZEbX#Vhs#aG~f10MakF&gCl3~wYX#$6YA-LrnHeRe8{4alS%pSmhXZ- z0d+k=?zNn8oJq!2`}sXJw`A0$Wv;L9Abxt5YCw33tM4ZZXj8O&61eYg*NHeBnmZ;G z+7SaO>Pe<|4)l@F_PyvexkH}WjGGY(0KqHFqGF#8dI_L+13W$79r0}#8~nHsoV0=TP2K+L5OoLK;E z;tqzxmeU=_ANzGn7j>tRSOB$XWOCGUy9c&n=Bt=f%KVdL+fM2}08AvTf+Jy)9fODvIuJ`I8EERJ;-6A}pl zR9mflS2l3K`B+Ir)nx7r1FFfNt!D&>i-|PrlQGZFVrtTJ?epzdKESA*7b6t=jZ-)X zAsT%l#IGJy>X|ZsOFs`!^0A7G%0vgazkKt=wDc_bWxaMwJUtThnnqKIw&7jBAP*fj zsi0hg-rf9A9^iCzX}lQ~(|a&1$RjMU=R^i1whU-6A#&HNgvJ?#*shhX&qN6a4(ds@ ziIOuz^@h~wtj|^8?k!TuQi86(escJZKBK**(XlRo`nWXu{{UxU%Nn^a)zSPBjyQ4@$nIy?d zw`U>G=z^IvMlBpwP`xvsG<)@rj5!Flig7Bt)(!>D7liA*T5h|?Ab1WYA2=nYvRgJJ z5nw3`;B{X2_eSrj$@8bSxJ2{<*9&$y_>C!G1&gopBoOZ@sp=xKi|>-{Brm*(y?kS| z7qk>*@`xanldrm^gTt-qNsJ%TrtjelU999ioL#X^-I8!v)pz2}ZwIg7Fpc@iPS&V@u;H+g^@*nJm3VkfC`jX(Mv)-!T|G>_(05hGq){?V$WN zvgV!mTfxjDMk>}Lx?#puiz(78)>l8WzNK*k(W~!xob{bgDhXC#z5hVEiN)Tg+Hx|w z_+}qRl3?9uEvMv^KriAuE;)LiYksCki^!ths%Zvu)_w*{BE51bN$Ygl=>37&kIm+P z@6h}*j)zUzCI~VDham9Gx$??~6d3$h6oFZx8|e+oj=|G3^Va*2dflq0Qj!E0$k8e& zbRZ_tOXxnXyq3crn@1V)IoWQE-$Wby`~?&XhctI?A`maHm6zhl0hqent5yNBr^yRAO+}mUX46vePYg z_l*7N+~T-R;oj8F@?A^LbbvQXYwiWLosJn*T* z=G(8M8e})`PCn!=+^SP02DRpRwA_z@5tE^EYNHx~N^=!;L$w58ZbB&Dq#1c)fa$O^T1X+{M(` zI^#MPNQ}w0Mt_K%M8)h)G)>}a+MxE}y!dQ?UKVY##>2~p4C&iRY*Ovy8ow1n!;1xsK4<7}`e&Gl( z-f;F;t#`6+`{wFy)aTCgy^U9`0P6c*?*l@t7Pn-^IwaG4LSQ@@#*k_2@J9~i!74W|hqdrvOTyM$sOj&;DI?g`q|W8A zTA1a%I^!oGyg}3*9?@X{N`M{-niR-^YbJzjR0T_oJTz}!b9mQ&?S??ZbJDsmoNdw| zvGm0h)L?NG<_?vMD?cB+H*UL7Jy>h%u6{NM^v>bPQ;)RHrS)?iXQFpczfP0KSh;O!b zrz$fzl5I$u|E7%MUb~AA1H&`zE`7COAbrq+Zyi+lP*qf~U$~k5T>Z0A1qV%9xBb)% z)S7~}rB=RpUqM<&AB*CazlBW}zwrp)7FrRC7lHEP5mSw1q5CdAzxVz;&^w3no5fc& z)BnNN5bE%^*H%Cl4KHGFs{*a-En5Ku!k2W?bi_r}ttofWTwkL{G}nuj9b|WM$?MTh zjzaSN%JoaOF6FJEZmDPrhn0nyYW~G`2A9QF-;p1~Vdi6OX~4@?>>e!Z=$2PMAgk7` z>W=*BYFL+^E7Jx3YcZPUCr6jQPy`>|hCZK*V?uw>pzCGjla&gAqr-!y5{A+83@6!U z=l?H~lpYE7YKJ;WPXiEXx0HvSvsvD=}Q{QeQx?$(e)K{UT(T2KwEmv4!AZ*Cha(t<7J+0j=C=h;(?LUWzhFHlGdI80bgNULYRiR3T*()T~V3^4be9kjTWwvOegg1v-c5 z0mf0TaA9{#1Mlf-I3D@SbiIwZS?di6+3X(>r0%--wTJXqt`mpgjePJ9!OI_ZMgz%d zp6~?Of`Hx(yeu>AA*w3aU15uTxzk0e6SB#Z71rwG!M)Sdo!#zJb4Qm$D!K4|q;F>{ z(!#hSj`67r6U$Y~MCTZVHv!n_BsK@}cwyd8z|dnY-&F;iJX}2DFYs#-#D#nl27SvB zqkQD$&D3?-i+|zWEN8MY^1*hNQP`#5@wfa1EmYQLY~N4VuB50}a#XAS-IBvC32bf> z;e(urhk?Yzozmo-RIu-_t%vv!cD)tSL}4C4V5^rwM5@x|B|X6$xm<59ai^x{gkJxIywK3FHPoUVIj3e6PB?FMF^SB=!kFdMu9~SO1AD#H) zMNh($_}_l`784moHFUKvHrl@J{;Sjp;aU_;#X_7G^~mI%ZRJ?7h!*Ryc|OY2xh6~+ z6Wl}2(TZh5=#|lZ8q<@50CS)lNjGZi7st2&%ZO$!8WtNXa$YmY7_jZDsWIMrM62XUAz z?Zr)eJOeQSX|_-xiQgv4F%caa#Es?@huQ_039mQ59WH+%BF zb6lcG#6~7Tgdlx56{6NH8@ICcqKj76B97Hj#%t?fT`?~I*xcAbQ@>WSC@oSpjulAU z0*wJc3Lvot0^lP_30$KKs45G@4-zOsF02`CUMVV+Z$0Y|LO2b#;hk89R=Yi-Vi4cy zl^SW0F;qFYpT=LdH-qZc&a!QSCQ+^=meso-)xfSUJ`%Kb-h+`hGO@7gN7~6YKvA%l zw6$eA3y8UOUUOzA#}Pg$$rnLWTaB=EWxw{0%e&NlzmByE@81=ojzHIxXW`?MI)3SSIdUBBcBkOSU5c{0!SN9y; z;lXV`GwaFS8_EPb?N;gedrRn{Pnmq%rpYqA4#tyH?PP`mgU31-cpG*OO;p~FYH5tR zeWYBBj&UnL4wEkf-V&UrE0jC%!-~G_?*>KJOKe9dKz)oJG?g)o{@85~9m^ORnyOt9 z!0-sHs4g${yRhiDq@^_^c}Y*JZs^w(-x2h{J#_>WKq-8~TmqU@l`$=Z^ZGEu)Wthj z?0|t{xmCM#F}gU3=Qey+b#!^DGy|uInb-5bJczcU>4&wJ6`LImk4j&cJEv<6FsuM? z%{$s2B(uMp!1)Q`)NPk9T-k17wRiPDJsd7?s{5?j6beBgm+4lPIkbumM(Hkf6li|Xs%+Oj3Ea7-K(XUGFw5P?F1@JsZ8EyfE%=DF zt^mHT)_;udXV=iRd$&?X;f{(?${b){MDKnhhEf@qq#t{4eya;a9lBNoG065j^$12g zsrwfeC@^>Sp!fYv+y)ot5*``0VmZQKnn*nE28=_z)g;&g(rSwlDA$Rg*uYOCtj>Zsnnw35Bk zH3_*^x9FJ}d|N$udwM#rZ?f5L?R0IR$$HbN!;oE;TXbTfiT#z8zlLiUPVI*&+=;iN zCxSt92Z?p&i}!HqDBeEj(BQ8)vS9zobBX)DgcipH9E`OeM`}uSDypG=n;-1>x^Vq6 zR&dsol6+pB$Qtt!D=(4{QKYuG+e_8Qp^sj8vKMcFi~?qpV^#Wcg)A2EjOH6YQ-1=snTWv z3YpVRbw|oc^bVn~yBJoeTuWIe=+uJU_(xf7ceLZ~A${&Nb9Ieq0Yn4WO-|ZnV&)rP zM%d@0Z}HLZG}liOqa#=~^qq`{*Ib3P{?2|=3O-1QIECd#4-}V$Mcj=Ju_zZW(@yZo ztPI%dyrX?%3yU>>A*6QO)Er+%ON(lL>jq@~B{m1upyO<9X)_W2d-x0J`d8zCzf~QY zdd28bLM{*6%kHOM`9Sq;yPg@vhS_esU9 z;cTMg5As`&l1~@C=KZ(#>`Hr zy|cKnKQNU`KHuB;QJXf;$K#h24H}@R;@h$hQ6%jwz zTIB9S5y5e3mr&Yd%eWfJP&w`v%)^}{Mcvun&W}`9z&)L%3_sUmr=1-BjV+m+I|hDK zmZCM9p;Qj>a@^6HJGA>|M2m{yx!q8I&AFOnbDSDBp+mi`g|phXFtv9$xxwcx1*I-ZR4osQ>unHbKpPB3aZ=K1;<4zv~ICYdh@zxJ0#du(FfLAYXpC4bC9rb)ifzv zAr!W+YP1?>^SEthH|0A-!g+k+W)>YIz|C4>8wr=Z@5z4W)!kYGQq9cRD%yqStx7B9 zt69r_e?@EDlKgy(CwQxh3Ncw1tZ}Po0X;%Yx_Mgbrc7TeALUl1ZNJlF9=ss<_aRxg z+f682(joP-G=D{~+0r!9P0s~a4jy7oId=5HeK7v|OZvvlWMwK#g;|&u|4>u8YG_Lt z)28U_lVfYf{q^wDh~)9GBEia@n-dM3f-6sk#LM@e)Qt;%eH{dQNceWax%Xf)jp$1s z_R<#RyTCWD_2a#wM9K%rNA!6gGI4`GN|_{Yr27PSZ;7xquVo{9ljw6-_TgCzf{Ps! z3R+z%>;%zkYw%LFlOGSa!zVjcR^gki4bBc^s|)XUf}@$KG(HJVc-zBA-hQGz9=ooM z+^-;*iLy7B?u0N zQGeXR%Q0KDcNbzKOy&^zLd%>pFQlnEr=xdpxFN*qq#r~)CEQ##Cle(kwM18q)G-#( z=Oip=5tYZu9b55LvEw?98(G;_Jn)I`2a6AbYgg2mwbZEm2ila2vm*-}6__pMTO$NQ zOEwkjv?yxZ+Y<7gc3C@z6j%si*HU38_uhB=Jffo3tsT)XDr{fUW2IsK?sgv4jIX+4 z-T?$ML_>9Rc+dux(_d|go$M`RI$^ss#H+TY*@Kv`nUU$NlF;s~5(tH?oz*U-rOrlE zJFT<<8TZjTvL4^mZ*EVj^^$V!R(3B~#E)7X(Hh(q>9va-*f+_8OonKVkR32*)5!wV7&c^ORk+;k^25ZG)~CDckH7q&UeZ5f89ISv|h@eS*je`3DzUp3oSUI zeCn)pVAWijzcmV-HT^1Fnbwi_S6qxZdT*`eX1aal)~PEE4Lt@1TCo3f&6;$Q+9|OY zGQD)`I^{4IR~yH9BEDTr$5sP)Rr|sS0A}m$Uv%lnLUr@H^Pui3l+BrbO`|h$SKd~x z9b(1PJ&2)$Wj;D(CyP5Xy(hQ&Cs8E%?`G+Muj;G)I~7%zT6dEAE2D+#lDitvP(BFD ze)7=Twt~mA3;qPne`7MX*Zjj^m#bM4m?(o2NZ$hh^Kj>HvDqcl0F?UBb?j${?g{0y zavK96W4@tkSogu@D~|QN?pDISihv;i8vd9B7XFQ>KX=aw<6pEnR@9e~z9#05Zbvs7 z06dcJ4M0OhzZ&YdUf=~Y#JjZZc>{oe1_0;0yZ?jNc0t&Rv&t?pw!A`JTAAGN#@1Ya zdRIb0P`6-aK6||q!#zn|pZ@>}N;Sz10VLy2kuztBY;s^n5xssdfdAiPX^GW-&tt1M zvurzZKxn2|n9_y-((%Bh0pLo2ff4KZrGeJT!dk*E*M9hw`iL?f!95b`Y@ri z_9`sW%m}>t(Bcdt0Xmt+VCC<$#JUNt26T+hXAT3?RN609RMr&SF}f@=Z@x(jenBQY zrXCd5DUf|V5y+zL%x4S(2v5=ZqkhQ!PDTs1GIPy1eCEd3GNgY8Y#k`C4R#DA4VzBV z3kQJ8fGhdk41m7Rm+l)wfz>&Je97g49o*}x1{|^pMs^SpFl8bJ0Dv@Ng8;yQ8r3)f zR=C(w$EnHd`RJY8GA1{%2kw46D<3FGk4IzN)7?+`YK~h@ZE%2lIqoNu6H?P|pWF8) zwg*CvCLSsUq6ifwO`AV^U!D9OxONDt>*V}A)KK0sIL5OYJ<#h>N_@OC7*VTQ-VMW} zGOKY8!_uIB>quFTs;>5(o%(r8+Up;<-(oIu)A2Buzzwp$1hQN_N|2ARgU}PVAT^h8qRDlgS2*PXaLH=8`TNA+ zi#=nfQyI=P(kZHBhs6VNjSqm7a!oi!2ZqsQ>R)A!Czdgb!$7&u(8LL1a)77bFzh}# z@9+Jdeq6Whn^8suJIwN1h9pUZ^sVHslS5Ht`z)uvksi)({I)CSm|#5xT7R9f+^{-! z3K0)2xL>|ds!TLyOh!-2axyGQvTfq&(j1Sys%m4kQyw>!RARwco)4fts}^{Egm`~{ zl$SF`1J+QeSaykt+Gau-^SZ}MTX;*m+dFsL^TX^q-2DsgM{Y!U)lbeC`Ja;a^y==Z zC}1}Tx$Q1nk(%51FRa&U3Hm9Wm^kfHcJ7xN3cYQIMFqbWqQ%ifDXGm?2Kl6t)9R>s zRt5RQ-!m(#g`gA_RD0 zVd6NL@UySp2LOu}pZFAHP^cHarFjmk(Gcv2h2hJ2jxKXmH4*m8#7@f#ce(htH!1sd zg!#LWXiz(CLg+1u6eI=J5j<-dzo8HI^YCJ^VP*D_$)po#NFjnChZTxaTq9&Z<8HvmeIctV@*k+ly=X8s8vbf z3sQ04$+mzW&^gM;f4}2e&`YIFwAjt(yx48yxETE5lV>>tQ-m3I;3wa0?=#UUBuJGZ z-Y@5VwLqec&t);#$Y=XL;=b%bQIO^V-Gi3#9~nZJ^4oX6Qvm@&|LBuF*Rj}>i28e8 zDXMS=3kgYJhGSnda$#opd-9A;Z*`l)W9x2a8`YmuT&1azc{wV5te+^ChY7hu$mVNiXzS`jgm{xJ4IKJ_^xO}w-_fB-nVn!;gd z0pZ66T6FNAyZe@&t1o0x&bq=$Zj|3hAdW4B|A34TGaCfaObDUhfE3r-WvWu96{Cdi zN1Bq_o59;_h08+kHJLj44_*zKSJ}oaGcfPjVApGx1@^UWR@e{SFs&N#XEKWxaWV&F zv9By(lT^QZ70O@kj2H4GKmYuy5qCa88)~IMuvl=s7#afUr zMZzPE!Hnb?vQ2812!G&8lJq65nI&hk&BJS9(M20MVj@He-+rSs54m{e2a{{41(UC3 zHq13JFVu1iu50%Sxp8YM3bVewcLS^739~Fkg4F|O8uFmUznc_!$Q3xN>6{!ILZ%=_ zzO(iHx*q}>u)TH8u30gW!)shLN9Wu@A1vG7B#qCZSxv`PvG@?ZOD!kXq(%YeWf2~5 zjYY%OqdW(E!7h7}`ul5%hRhDBW6O10L(UEi-ANvsT}6sKlBL9te%9{@{El5)e7vgO zY?~jy#_x|G!XN*RUA=x|Cc$xWkda=UpC=1swJtSus^-J6ydWHaQeV#!Arb&*r zH={nWSWL*T=T_?*fkHb+_?+4~fWOGu;hwYutNMb?D3*#&m?Z4JB`H^X%6sz(n~avk zC(Bh6(~QK18iFJU z$va7{Mwj#MIE(Y|eDrv@v|S3`R5*in2)Vkz^S|x`2YMNEjm_L+2~B=8ks-Dr{)urN z-Tt+=;(aLz={r9tibdsYzJ7Y-Y*Yu{7pyK$a>j!L+MHVqkef~(ODb$TNBHqyqNP@E z?d0q~Q7e4dqntOyq9hh?y6Q1-sFX&7xrpHr96fd=i~ttmO?f?fEu{oNXad-FI(93H z@U&@(4J)L;*IOoVjsP|Vx)?sMIF}DQ@EA5=zj9!?R?Je;I#tXvrMBp(2A<;s1q4@B zrud?|aA!vSUX?wVihN&CCa{)U%+DMWKHlz+ z<*Xici6QIz-(JT8B)<#I$O5YL_Evi$`Vqd5P;7shzEbzyn+5T<=~YxSbWyGhKb_h_ z8Ofs;o6W^C-FufegB6Y<6pl!5x?gMTz1~<(Uf?7ZgnMH-%C@qL0lEbrJ^3140{7}* zH;gb{`03l!WH^)fsgtURtHx|9>Iqlj%J5OmWx)O_b@5Stv+R2-xmualK{*@P(1gRzJM=^p z$I7&?rMWHHNt|0XS0@}^9jP$~>A{{+e}?!me+{T5yMtN+3#Ry2{~rq zBE#xkw1(xban|dBAZ-_&0NfUMjl!eOMX>`kZ{xU<#kPG$GR;<$sRTmXK0Wz%T>^<; zB@0AH+CJHzOm>Jk-s`g{T`8qH@~z>VmZz31Zp{mu7y*IH?2kML%xWqDB#%W^)GT`0 zRfx8?OMW$B72OXPqPp?-+ie$K@enlyUg46-VP`7_f*{I~wS|UDx*>4(>)0Q+?>^A& z(HOQ}>W^Fo(D86Ee*Ef&B9wbPva?_?D|)$YHCst5Kg-BK!9gFFGD!Hfe$m-w(tWGP zLxkwG z#tX4rPL@|fN?$3MKmrv;WSZ7SOJ7;KPAN<51>Gbiy3hR#NArqm0E4Vgx))xk?)pXTQnAckII8^K9pdDFho$KLak?W#Zo58_$#glwYuj_bupV+V`L$f(hr4c` zgP$dl(2wt#94`U3+Av_KT8G~`Ivw11pP4Lcsxy3jqQHG+4`-PzBCo7J#`R1%>p6&7 zF2vx{dydaf zFx0O&q$8_dOAIw?esOg~vvu0|YS+wE*!t2~t4Cu9*zrRcHVi(u8*tKN`SIoa28j8UnIh(D8OJw`){84oT=DOEwo~nhw!(hwP z1J%9#mNNIFrPE6!jyFH(Tj<%^+30JV;{cy5bxd%e+|(S@m=7RMZYU4*HyQkk%FmC( z{?f@xpPK!-wxPZ)4!e}Go-H*F3;Jr9DE^bcFi|ul8bNxTOT$ru)KW#vuAl{2>1c8Dtt}h1!3g!B< z9Q2R%g@SpxE{+$VK`*W)lncataU1~ckFh}^+<)>yxOx8Ig#z2?!q}itPGBeh?|8X6 zK;VmW1<)XWmVK5#@_+&Ag*gCdJQv5o!^O$@M>#G|@I@LgCzR*nTJmxNGkBp5UJx*;f6}=A zpm9UFFU|`uHEax4 zazeSl7y1myKhBGN26%b7FN_z%%lRK(I~#3dGkqHzjEq+>cGkzpVs;4&150XPk^$k) kE^ldRM-5Ca@EMTXwszV!c4tx>Xb{ZFi^ISmA}5OTf2_x3X#fBK literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeA+B.svg b/lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeA+B.svg new file mode 100644 index 0000000..ebe141b --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeA+B.svg @@ -0,0 +1,1580 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeC.pdf b/lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeC.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4a420752e18f608e4c18a371449c12e7274da4c1 GIT binary patch literal 324817 zcmeFYby(cbvL`$Q2mumYLkRBf?(Xgu+#$G2Ah>&gV8K1O1_BIjL4po8xce~pPJZW{ zd(OM}?z4CIkG;?HKKIM?Gt%8vpQ^5|uI?_VR3)XE*qAv{*hpDPoz3h}1O-u8G;Q4- zEJw25`d)+dmrHIy*_4y2JWQ z^0TwD@v!o-akKJra&dCgp$H43SUOq!VZ;8f?0i02lCnscx|=#UTcfb3np#`Bk#fKq zsQ*g`&VScI%G+H=!yU#6g+)V*)ZNwN&j%$^R%TXq6c%$+QZ{B*7<{q6y^G0dkXo5K zxc$|})XkohMcLWO@}GFP{!ZQi#@^lC($$HSMbgsK*4$EEM%?Hhpn3is23-|1J4?@wRDwmcKirq@8nL( z3xnwF;OwgL(bOEKgun5WaW(ZpVNtYnvWC&%{Yw!n(zXsTSfnh{4ls!&EzO-REdOZ7 z%^fyAjws$=k8^y2mA0P;PhWFT+^b7c6~7wRhGGq4)k~5|s--87q-%o}=&F;wQ9jC>7z5`%!Kyz zh^|4=t8+lFy+kmia1QS?^VXq9z9r`LoT((;IY(bt&~?~}u>r|fPb;USep6v3ee^h~ z-q0@%ZtA6}?8Nv0tgrW7mj~n9YxiKK2&>#m&tC%8Dl#)kaHK_>rgz)feM=llNY-Ck zk@c#&hI7LWNNBfSPg>Y5pRO4Tl<3pKr(oSs$YFogbY4{78L0BMJMlkNn=2&bxegTX=@;#ZS_Gne*#I5^H{W ziCH1KlkC`0B^hKuP88M>q}1dCzaj;&I%EHz z1}+J!r#jCh3KF>bplIokckHi0oI6xP+1r;QG4ib*;m> zM_Th@PnY4PJBM?~%@?flE!%hd?*v`1*P5{zt=W}7#J7?m0jDP{)wj$QzP~Beb7Hk# z;0_jMvFC6pU7MII`%2?1lPfu5i5OwGxZ3CYB?gOND`axJC`aNZ63GjZ@TdP_UBmD= zC6R?ATEW-FH+K>@xyW05R}JqE<=F(Zw^`xRjg|@2jPBDXc zc1@PAA>k_GL?|Xo1DY<_n$Fugp!oSGZNiX(K!kA;nlt^z6Y<4*=2pw)qAN8^QI4)Q z=Lr$jsd_V6(i5=9(TW`5B^|en-15^r1@Zdm=X-{#D95?}LE+gzfJ%j$8a|V6z?iik~N@^@rtqt!!RsLguSabd)-d*k7?X2!9pzpky1YbBL^>r$b7I3LV?}Um*O4vK$i1Ri;UPs6mU$<@ zXw4QMXqH@!io3-#>I6=qd$I~u?eSJR%) zG~@B~vcFk$?5u>ru^azZH0C%Z_SjS|w2ty5yk5kRVJ0bLNG(P$ID8NjTkqB2aDO^| z2d`i{@c3S~#;prBQzJKvm}!^IoE4%>G_4tpK@HxnJIv}JUj17eY&l-E_VT;4yMM) zGP!#n)oy#!RjV+mQrLRlhINA2sGZhilUhkImH~AVdONze?G1{9(%Ti9+CSlh)#NJP z+k+uOz2wdWDxp4io7ehh$rZJ#(fm8WfJ=;q=}-XTofgd4+st?Ri+!B7OM5$Q$E>GPBgXsXe=^=Lu(ys~n0kC}iT0 z(&Jg~h%G4LZV_pbZ&yF+uzBof|NYAS_m6ff-__Y^(j;=^O!BNUhe201j&dA)U%NAH zIwM`|X*t}9X9}KyBVyB3IYqJ#kH6|2uYf)sYXk>n-&|Kq=bm*9G%KoR12uHhLZk-l zxqy(v1-qZm${kd*zEn9U-S=|Ip4mfzQ-Yb%GZ$(;)9t=~a-WuW>+C|c#oD9J6OFCT*ed{aE=)y@EkQVsbpd38bxwZx}Xv~8xbOblS+SL-iKE7 zYepN4Hc69`$6NP$JH9K&+dc2GYe)*BrQGpb3b8ljY8N2`8Ur3?zfHgOF;Rx7Ynlo@ zw{aLwkC|rPSm@(wsS^?hrY8uRcaF&*M!Y22%DD}4dTWy+*>>|T_EGFo2}P)XU84s6 z0H}{ND$y_)^ea|ZbHoCB;GXsncS_B9)DsEr<$QgT3y@*n})3R}vHK=<2 zF3EIdx$(NHU*zZehC&zqk3UEf%9H}iQtMDJUEo!7ZCQ!gJw($P+q+22vV6_X?JkX+9nCH?mDnusi{ z{~c0>x`74KJfUK$d)<=Ljoj_olV$ub^|d)r?-!4h#|JH{u*=^+3|7amCY&>negMH& zouLN_$ABOgYy2;s;`>o0v%Mla)qsSd&T9Y$dhDcx)g zt@pUGui7F`HeGUrtG+Y5qo#eGe6sQ2>GR8)eRV=;>!6N!y(L<_dt%17zq;l4N@UPi zthmtWesqL69)7@X;-qa5Y^~6-;M~%oOxD#^wVtcWN^XI&67j%C5B_S8=2{X>I3+&I zu{Yjz))wf1q+2Lx6}V%4@?(my?5%hznLr*e%;Hekgo_3>E25J(G;uK3$^`0Z=6Aqu) z%y>Y%3i<`>W-Tixc3}f!wiMM3n%H~7RtHz6VL38gjnRZ^K7(%i|BJs^#-5xHD zXfc4fktGj|gy7_fdzy1P_g4}Yd>9QH4b#H`t~;HxJ986IfQP%fbv%4{D~(ghb558! zI-9v?D2fKC-?BMZ)-|#2snI`Nm;~XbPQb{rTa;)bAtS~b3=yF_GyM5GmN?WD>k!Ob zzHzZSx_mZ-(E_HPk(gjJ3M<9d0Cida?p`zmbDut5IXDfO)wTDDT(F`9=C77;^n4=mV`Nz0&uL>L!>9D{P1r8k@dAZLJ0XTvN z&5l)u59851RrnR{tJz5F_$lbBF>rVF}x;}zCAH% z>@w@M(c=%`8}IljuNrZm*7dxh;tE46s(kZn#D}*M!b$NsU^GlZm!M5gk|5?f3a6exuHxeCTS;k<9!Cxp+`;#q zaza1HsxukMz^)|rgy{>SVO_El3{1?Ms_*J+1F@|%=YIQx$;=MYlAvtj+wZPz8Ru)@ z*G_5PF$hn@G9-3!By=2D@Gb_C!L1F1$mkYPxGt#4vPHA5=A19U%9dr-jOMn`?B0Bz zHrK%FNe9pK8}fY~5O4GWJf((eku;bp`@S}(h z1h@L3)X3f{{qhvV@mli!G-ua(q$w>B)UK%)S`&hUj^XtRMn_xWcxMm)rYS_L;;1T8 zyc7H8t*J7uG|F#9wT_b437yfe@s`d@futuG#?gLB=_55$EGM2J*5eGOI8&GMpnJ<5 zUIKdTABJ8QP#i?!B3zzvcp!1Fgv(^AVIC9tQvXV{zF&DT;>J}94|pOls-dnlSm>f#%3*j18uiVWmhL(WsUwm zGO~qZbgxK7roQFo zZR+M*Q;a7|v5#|NbHhbU8wCa+q&o)Q=R~JXbuo?sbbgthhDk4y!`Cpygm5BG+fYgb`UTe8+sA9#ES+|z_<1PS~kPp_9KsK#(&7mG42#!V+gy-$F9Bi^0{ z39<485>M(Dpt(f+Vma|z*?PB*Sq-jXl-;~bu^EwlSqRRRXz4A_!V*nr4T#yZf`MG> zf6M}cgSftFg3_An1?Vzhhb0^RWvwRp1}>?=4Fz(b*cc2j8cfcaK3(}?QvQCU69Fp{ z#D#M0;jAz<7ZIrzcF|voDXoNl9k3bb+n*z(?>5^eS=_1+)W7%5A3~ejzHO=r(%9FQ zJj@_{vji2VWd2B_47>e4Ogg}Y@TQ@t7+-9fYxEnAGy;za6% z@;>rjuf3GCv}51HS`$RPr;Ue_B?fB$)Jg}NJ)G@@q?zA}Gb;#iz3ki5s6wp%)@i9< zDCvYoHXWiR41+MF#yFDkH{|&Spv`@!5R0{v#XM6N6X}+Vq<`SHa#>Tl!7}@7?9~RN z#?+p6{SRus{X&|mN6uB+&OWdjkM^{b7VMDkuplRUV7Z zHbzp?%r{7BT`S1`)G8qgdTT>ZyVb^9C7x?I7VRgp5=#nK^WFttMDcIE`${)3+pkGY z@h-N^v_TzvRtSjg*OB)xrJZ3uko4qx`3?Fe`{?c?E2@tx8-tVdBBEFmA`@8o0}fI| zD{63SU-2B=fL8kC;Ktu5WWy-XEjC4FCvgyin*lBn!(sQjI(qL-J{t|C#OS#MDe+Ly z{u+mh;g@;8A2|9LDS!YZe!qKcWo!w@iSrkTykFz5=y}(qotyM~Tu315CV#cT(+aXS zwt(Zdr`;OvuWBV+MO-u@^uY~Ezwr~Y<|73XzW}2}Gz40iShPL3Ykxue`~{cCyh2Yk zzXSh=R=B&*f^lbY7tAX~3cRLw+Ay>T3=_|lQ$hkg12q!j+BUF$r#V>lKT@y6=8N8N z#h$cFPagtK@QDBLKF)O|^2X0x>pm2uIJSXdM?iiPSS~p$w`|%d1@*HrKC#4 zK%-y*7mkXW82X=Wg^AJkuLo3J5+B*a1R1)e{azOwo=dJhao3%FQpKYAJx zh2-hc+`!Be)m~q?VrQ-hJv(YEKQ3vljk#sQn2PIxGF~;yIqW|2*U-j-yCT+*%bEJA z!N$AGXKQrWk!&u5Zq7=4Jf&hs&9PA@fcpib`Qya=!51*Ln*9ND%xb$%v;};w#NhbS zW!_`JnvZ8f0-Eq(Yl0oP##OPz@A+3ps9sF#4XfFs+vUIuZvSS7 zfwS;l+#Ch%4N85ImD|1@!@!Mhnnl?3E{if? zm43G+T%BZ(d2@52Gx!M~YJfM1WuZ7Ti~Ih27~)){cQ(df||6U`k8{8f_OD zK0j4+)g|J&)M~Z~*RPocG2i(olz%}<5&L$@PI1yg+1H(9ncsPY-^dSB8&g?`Jf^fWmWp#bouiNO0vBFSA#Nzm_ieJSM(Bze#f zHUOpC?RFPPq0o!r@!+Q@~cq>Lar zm~4F!+^OBwz5S}MSl1(!QLSTS9$)QAs8IcqyV_|7R<@NjW4@4ppzcLMF zV_KKXj48%YF5Y*hk=VSe7hd2-^sim-jE%hKsQCK{6k711ZKqF;UlX*GR@M3hWH^_1=H4@#Sg3Zz&jj4e~(f$k~YJ;vv z#?$Mr&1t?@u2iNl@2iT*!}pvdUW8#M8*N=bFw_*eOw+)axlR>MCMGS3pO}KW#ZIQC zCWH;{N_LPG%-Nj79z^>%*2ufj+}HZYqJfWZrY>AANHdk~qXveqBeT`Gnn z8@HBYTE3+L^k;Q3DI^{ky*0&Cl(Yo%ZyRjOVi&Hr66RZv`$;NVoE-Ys^tQ4sDK&O7 zK#Xj7R|XrJCq1TuWgJHu76oVOn_jLA8*`JH?}k(lm%6y!APt=Um9$mdqc#+pt(4_- z%u+N{&yIm1M-vyZ0s1Vu>SoEsQ)>%;tRi}y!9en@KHWrWZ?qLFB{k;<1;=Lj3K|pY zC6J}SUAa88t3LJ=U3@lu@WNIuBYlQxoS|$7Oi>8^zMHy+` zc${X6z~`L0FH26JHD%%{m)?;gnbc4-$y?aIUq6x9bsVt!_KntQO?JOYq7xB z@5x6#7>U!Lxun10QT1{!E~nA2W*)+js?RkoE`pF5U(7^4SP7BymS$vr2u z*eyqtWTDbCsK&DVHZwx9RFXkFNS?gsidw$InzCc6dC6I(r)UGPOf!oh7gI>dgN-D> z$P+^jbo`X;^pL1Nk=iQaFy8Hy?v)?&==v<~yp@W29@&uvc~i6o;L8jnvdw#=K%9Le zq3M?DSH{9$sGllz$!>W>ml@9-9GRGIx*0( zprwHVN27!{g0*>!fal4w^uyLmtD^n=SVO3!xhe#=jgox0lV?^r_R|uptdD)~o{Wh5 zYhowdyd<|P;Y}g zCx*)7$M1A%prMhlhuAK%_(RZnW{mmeDf)@q56-lOxwJ^sx}$tTqXMVJ%`g zrT1xvNcY)i6DVNm+gBq+VFYxJY!N`yWlF^-ep={^C`g-r!PwbLQ>Te^q%bdGBukra z#F3Kts0K5>iMrvoO`t&snK~n&E4snwdabF>WT#AnHxSnO3&pj3O zIbWR%{I&Gvw;PlpPMPIYpY;d43wCOzbpVY~jqrh%hMmH!>8duVSE}#tx3?V|+FW$2 z7f=1&zXm^|b@SAO$3`7scW3w~Aj7w14P95m8`99oPC6NPmgFy%= z<0L~zWoVq03JFJ{E}m-_b3tLPj-0-HLFG>cVc&irYCbVsW~2Qk_F#TvJYv%30lnt- zWgO6|3EJi|YS-VJuBnqx3sHX~u=Z<|>QRG=|H42nXW&LJ)A^*uR^HkCnmVABMrd=7 zML}9y+ji&jcUs$M5X&vfMv?gOv-{p^rE?^apP|v{IWn?~K>0LyiMiT-XxxTh79@MB z#&BeKWvad{lG9Tw%r3 zo*fKR8e6)gnh~v(pZLH)WHh5{NmT%NPMM*H^A}m#?*pmKq69>+H_-jFp}YV#VT$06 z2LeV*U`+v<*XKs2cQ!9?Q+J##GOhT9;c#zFY@*vZ4FN8GqHfA+&1+IV&0=uYzgnyi zhZ<>k>HJgm`p`raQj_)IF%Quhw*QMVG7p$_v=*d<0FnUZ zVt5I7=sMQAK7A%v`JrM)ZMJ6@-NcXDMOA&cSO^RZr ztI=y~KWysK5qo~QuAIg#$@T3UFHumg+P72o(To1RS}(UBW(8$4d;7$AwpAq9Cl?*B zX3Wy5STrF6NE30X=8?+^SXrREJ%-_7mS?XI0coF^fA;vyuZXzy5MAcBS5}`e@nCLz zBO=NCVWW33R+mHG5T6834IsEz z63aa9CsPSLJm51DgQ+C?%qLjGO{VZxgG{v701P}Py(nfDZel_J={tH3w_#ckK0?l20hyw<1+%TEbPgD(LeRb~Pd9q;oviQfT!GPx9bm+N$7qoD)VlV9e! z6&;J{4Y2t=5m-@$jg<640IY~cN~MHL)2h#@#;tZrkvlsSGNGb1?_FN zvg3W}7hw{BsIW$(-93C~D!i&J?`D~@qjS{ASRDXJx#D5xXOOz>heVp5S);ZrqQw=! z4G6{?U{m^(ScV%9?k2>TN4+?oPeOUN_lcLxCSs8Odi(|*`{ z?jp>X!UKS*N9>N*&4roda@NHpOV=w08G~MZ97Mt7BhT=V!6I>3M%>@Cxc;6S_b21) zPmUZPH#h4)QqTDQAElnb(%t@K(f!Gg`;+aa{%>h$Y^?v^JTyrO&3~7L_Pp@C4#1F? zmXij+!NCDO!2STw%K!<$3pltxufIR=i12@&mk0>(h)6Gykp7fc$f(G#UZK1~LPB|i zf`a-Q_8=jnp}%>J_UH2-B7eI7=>>beeuebvPmBMv=lLf9^A#Ky{0clAIp75*96To6 zGY~)m0Kg%_(Eb7Z_Xq9;JObiN7$g)_Sc4`E7<_p67cj7h2nev&0kC=i0wy9B8JpNk zY&BCPau*!-Pe}!@D8%b}aMh>IC^^hrLy%GM@CgXtQc=^;($RBrar5x<@k>ZbNz2H} z$!ln8Y3u0f>6=?vT3OrJ+PS%VczSvJ_=bKC3y+A5icU^RO-s-Cl9~0bu&B7Cw5+_M zzM-+HxuvzOy|)k8KQK5nJTg5q`+IJFVR2~#yt%c#v%9x{aDH)lbq%?J-roI@3l0GP zH?jUrvj0ggOqg6RU}J!Q^hYkZ7hbRekBNXt#`Y3RObyA@1)H4x(<>bDq=LF0WC{-T zGh8#*DHJ?P&JC*bKcf95*?&&3kpC;m{!Ord%C!V|4G#w!Ja|li2;eDb?^`s0_P@)2 z>)^j_;JS$Z{;o+y!#`RP_>0Dwg@ zVnD_j`qQhF&9$g5;+dud+`}c45XNf(3fFXJd#0UoyX~{2Nw|w-_TdbXA6AAH^)FX3 z;KA(-*KWNeXX1IE=hXHKP0ne6N^)S#ARA)gy9uBXW&+0ux;;-?M@~mXJ1EaU zHQ8juKdKDA1eur3*-I7VlTctYsG;f$qlEn8L!C_c-6dd2b#Aid8c_P&4e z4d_t*^bu^gLSJe$2CCy`6Ym4(DD!xfOs+JOe`Ppt}(9_StK7q^Ji(XHT=HbHqk7YD~eJ zM50Q^qqz(A3Ou-?C}S-#jygiX?OZf%{)_*zLO+pEXzU%M(=>B+Z;*X>zn{Fiw6sc{ zZXaa?yUwSj%KQ=xAfybYebIz_=XFmX)Pv>ERj`-E-FB}0bYt|prfRIEi?Bt+vSG%` zoc&hC?RAMla@`lo6~ZuWE%(Q(4+4({NJnmG@k_lEi-C9#0&ELQVwQx?XnKvYiNHDv z*&U&2SuHr9cMU`RIg2@&kx1)5a38VvmV`lU=c;n060 z560CJ1;7OZaP4Vke<5AwNCk=KVRjKfoj1|aN*ACleRnj`jEzw=S-o%c2N)KPj7_n| z&KaY7xf3N`nYA*KC-5z`K1{;KDJQ6hwecAcEc`wLOwu>h-x7N4|E0;1+OH&8iEU+$ zG7CQ~W|*jh)Piv$emPt<2?MFmT}=vr^B)%D{$~KfGXSb)eO?P0Izx)M#%sPuXir$K zF>7r!D03=oiaW_dii_0NlceVO8vHJ&I<5%*O5h1O6xQ!}rrX-&)&8pBxls4AU{Lj9 z)!Crn8<2vT#C5%4-S}n&ndb4*D9ay3h2BO#6wG$7x0&D!0+~!SX0B9_s3UwFAn9+p zt{dl(OP>KnjO8D#;$@4Hx1_riup}94j!1QuM(;@O$pdHaNRB_9+0FO2GvaeIHxMyN z4}4V6HTp&&D0YSr6Ctf*TydCK-G&4I38vBLz}_sKW1q7w@ZG?aDfCmmzU&Fwh}7d&j1sA!{*k9xhVz6cl<_ltmC&H(mdIiS0!H^qf`0tSBLuHu z*O{mmDqszKNAI`~?$pKBLXT&CS==Ti{7yUVw_ub%<>ZOvY19O}i*aH9#uyjsw%Lts zV0Uqg$G)$RxN=}T+&NfJ9nX!n++)bBye^~v_!fpyIIv%zr*ADxU#H*5cx1rdpT1&4Z!FIdW@33#f#X3v^3MP>M|4Ool&iwN8G>CJ z-^oxq?on){yG&T)ff)Bz<$F5|d(~%*&{K+LopAS{0sa59uV?t(ZJxJC0wihn>R*FO zH8NC-s6-F^I`FMN2A$U~IHcPY_)tV;>VuUorSWJl20b_HxsoL>vL0cWLQtU}Y(*N@ z5*JNL{#NFk=J^Iw@z~G6=o#Z>k(MZk?{8DsLoFxCI{8CyAkPtNZ z`#ui__Qe@)9?*HA0jw2vm4PYYSfEltA+9NsZ6!QUutk#ENlz4;#t4THBJ!FR@Gbhk zq`VkNDO$0=t8NMlYwAC~J}O82(TSN!l`BoAg{edJB^kD&rj_Fd;4~=MZMO!1Vw~u^h-+hxXXZLR=$}s#4a9TsNd7^)e6Q*7| ztSv20HGbFG8N0exooaRPDi)G2!2dE4B=btPUa=l0mLcQSYF@Ryb|BHzNz)tYleymB z0qWeHogJ-cBJWu|YcI1GWq@S4pD((3y4R~j&eZZ=`)fh{*Iqx790Vt z&K>ROI2FXJI?~N3zg|C7(v>?WVrdfgME1L;>5arjckrK3&@U!CI{|%3feTopz|qlY z(ZEKTtSraJwfYOrBysIbzngf;y8|*CAiTs7xpUSWW?j6(8U13If{?k78kx$!qim3r zcm(v}MUc)D`GeH2CoFFg^>dmiE(S*m$!Ri>g?Ul{VA#rvOiL5b%2Ep<5q*Q@ znCJXP^RX;Yz&mD8AE;`ua@bH1ze?~e&e0JZN80lFR&AhW7{P@?UQ;l(7}U_g23Y^c zF~Czu7s`WB_6A8$H?p_-&ND#ex04`Sq250G>Vi+VWv30PY;2uR`MX>L98kv;5rUHz zAACuf`{^xG&ojVq{#J7qpmUjLG8GoYclDo+7j+J99xy7Olqi5E5FXGoU>`RvP<4Ju zy6Lt~tbaQ4tJ59Oz&_e6;3&`P-|3X3=D)QX3d;B`eGMM(ZN4jdHmEM>!~_PhaX6|o`o z65gfKe%{s=Kzo#QBEp$ar}x>WBWD4=2{Svtc8{I*p)AeSzy_YCye4Sl8PJQ4>`!gb zvtfb?_3EQgqjd^TE9tXhmUmk09@ScD@!RAZfDCFF;R1XnkHek;)Jf+GPyKITajtAh zZIAw=5o{TmdYU!gaPC1hiMZ2RNH97droI`;z*^d``@WV_k7UAkP5`P(mTsZ7?m`JO_nP3I=7<4=TaD#ZaG(mkf5L;*b#lS+GCPs&* zAwS{@hbhIFzPr+x<76gojvC^Oe)sNLt{o78GUV2Jl?SdFbB2R=z}^nzGsnm3a;Qv= zRs*Zzk?1JJTV6kZf{uJsMBfvi!*3$R1Tu0Joa;pU%YZdLyfYxyQO~+L>N)SQ{xaU; z`Fnybr*OJ$NS3)9zUO$F6Mp$v!-*O*iC~XfW@HNqxm2H_l)!z;c)y34Ym-3El@2C|t!$^D z2-7i>3Pe>CC7BBQDDpPQP9&ncq5o^W_h|nTbCjTJ@lbuT3)R(BXRdyy=Wu3`(RyqJ z26r7V3NY~HlqiXM;F`&qhLJPmXPCc0p`M|)^-stQXPn*4Y1UGf7$;(MK}I)QvXKFfo;d2B8OSe0Q#(8lqa{tJJ#A=;lG7>{|NW~H}4|S zBBmlxM$epY-r_U8-2_fe6mI5`RS$}ZT=O|E3Ncu4-RKf=HL=LsQoNaQDrKJm`A^vA z;jk?;y1~I6UU{j#zShnuIiz=+*>QKNpU5FnzL`)@868pffZ=xiTd+tWfZcv8Xle8b zD}JZQ{xA-_ySv9r%zpB7uF^sx#drfGN?&Q;MNb_%;SP-04y$OJQx z{4fvi!MWT!1(=mKQCod*NqBOyOW__D3;=wfuL!QFcu`SN5e$IG`!9(|jzz3ZLVP2R ziOxIv0+DA(hTG;(5maCJ}w4ghB=P->RY>ma~W zU+$}Ej}->BDGvjcmRpDpWYWbO%tPI(S-&648P;o2IZJqRAScN)BLnbbNVKdz`$p8c;>-CB0s0nx<>FL;px4GgVl?3`XV8TfD`dA6F3CzfACXFX#wex$~>6%k2Xn;VUB|-)k6kjllzZ%FLaH45NO7nm{f6kJ?))}h z0*vy1=JdkD1nmjYdkqZ9EL(-D^mNgmOXVgovYJd5+4A7m>B+IC_9i#V_PiB)-7oRs zd$gjp?cl!7ktuB9@Hh+l=zlP&}d;JU`%G5t_q&vmE@F#ti!a!G2H@N3qa`^*e&`r~b{8Dgnj9KlxwHGZ_>Tt;c0 z`i|W;DgX!+w#%#28BoGjZ>#?SRXFFKxR}rm0V6-K1ibq$TU1Fw2g@Z5c_kR~M&}t2 zE(~pf3E2YXdBXPUesJpc-OESsQTyXNME=!x#GHGDdIUv0k+n{99W$s;aoH<%1*APT zEE`I+N!09tUK&<1ypETE|22OlqzgL}dS?@aFNj$Nbq2OuHrIW#n<8+kwnnH5EhCM^ zwIpS4PaOHlo+!!*_i(Ldybtpj*pKN2k0~Oy0WuQb)2AAltSGAY&O|M#d#7!SHJjbY zte6O+64^YND`I7>=)3S?5s=PQ(3#@o;)^~=2lSpPFA`hr8Sq)7FFkKbKVfkyjd^)Y zD|)Jg>Ba|78*kFhh5I-2vbm_< z_lmKPyeKMSMzs%YH~rmzGm-4SOys_H9R_so8G!CD;9O+$Ry+Hft#)>2wg9R{O9<1L zUh_9VA)_4cyJQs&eRnwAkkq=*7-E=Zq!4g1Z0%(@(|IDe0k1t`twpXum5iSO=k1RN zFn5F)w2=_V^bD9{g2url_Sa+P{Lt0sm5P}TY{&QK#(0G<{w0w>~xJuIU zyO9L|ozb7Jx$(hoeoHkz-npz>=$M27^QNimXJW)sfh~bOYiG*UNDz@T%bdBE65FK& zV7X|v`m6=_O@#cHLW-p&C2To@IQVu#Q%~%zW^fp;a6HVyOrYj#F+o@V^!6~lh70}E z7Iprz#j^irElKKj`v*wT!}2hrgpeL6{*C>vaP;H+V|9>u(5t}tyf>$fj&=jRefk+A zek7O@rG3<;rJdx?ObA8DZ`U}6jMsbzwnIPezl(x;Y?2_`y$76oRuzKn(MYWsfmec}s)fo$3Iv_px&)#RicFe|Xk~3Qqgy7PhfO z`cCE8=r|%-125ev&+ncLcjp@-u=Nq{?6E7Qz}D9@rdZ$Ug0YGzd1;k+%&2)Fn0`C+ z%et#>Zb`5Ra`#3;*FOz%<&QzaHva#ir}#N;4$*=ZY#fsxs?G`%K_LUZ1Ng0NZLMdI zAk}4HwBDAN%}*^Ygk)s^Le_dEEU?V#UeC`vQ>jG@{4IjkWTYcMU0o$izR-K)i4RHa z$64wu$IxnOv!bWe!TiS1VMUG;+TzQLv`O{%T@Nu$Z$ju34Rm)?!5Q6KMzVXp$*)B9 zyMas+RzrnPa$BzyhP5i}TpORy3O);x0CgWchJOZ#BR%PGu06@tPN74oRE{=n&+s9N zQ!GQx*#_scZ1y+vY++_*>8x|VA{J_!$SkP{zUx_hEhnqomj^ugchNnNpNsU6;42k) zw@A!3zR@Ng9P0R7n)PW>aA^5tn9$-QrTEaYGBWOj&dK0$_q}k>y&`Oq(w$8%#6c<{ zGC!uY^eK}(UTJp18H+XXw47wtcXyxkS8$lc})`S7M98t{PoSIcIkhva`cymb#p>O;}rP7W-`HH@`Y#oo+JyRn0e zSakG52Md1|B?{8$r)Y*~=*m66Hw7gA>|j5T>ue{d)&Te_L@u#-yhM+%Gcz%Y9AvJv zOyGnXJ~Wh%{!^aeU=2#k@_>!5{+Qr?FM{Rmr#>sFv)=J-)W?l0xlcHhL;3JEd#Wea zz?2Vf>oNg*LqVK~r{%5uzwB{pX4dh4l3+hgKLfBCJLxtA;Qh*tcH}5s)mKL_M16Mr ziIZxim60hc%B(Ea;rizi!UQQQy-!VArrm{D)aE=Ce)OUW5LvgjX4|DZ*5xxUXi=_z zgcE`VRuE;_7GLZ^2+B~Tdmzlw(0o20BUo(z$y;!oep(j#gw& z;o%#6sfM%F1p89kx%9cW0kH~*O-+poINaxDC}olPh^nw8n_xshAbLbR$*$&!x)^$ z|H#`Ie83*uwC*>cYMTyx=N&Cz>&R5Qo~;qb*?Mw(Vumfo$>cs2RhUd(Q%(3mYpNka zJzx~V3Db?uq4C?t)}sf$a~;VRe&v`_BYVhHD!#8*l(1p%dQ3bHwB1^tWMN$>Lj~ z2{g5PeZ_(7uy_p?@>u^sg?K+!oiGXVI6Ic^JyFh>&cluq3fLq{IXb@&zqQQXwk7oe zz-b|L;ELxDA&qnXhqq4utJ|o*{r*4Ldk?Ut)^1%iiimVY zWHP^G&aaH|j(5CceoU)2LiT(K&muYB zhpjV4j2oo(_Sq&c_nFl3EU0SN+&yH2vMcBTez}Tw-iG*z#%@D6 zvb09AM8@!8OtmPV$rt>Fa`(*`wv?iRPj8MT_Z&XvJ282@kzImI{Ka(g)MRxI1S$e< z69t=$LJeAOLvA^&Bm%@mrWPmIiO;7l)ww80e(;j2HaqUGDRsgB?u@e=Vycm=yfpY@ zj8ImJp0bPg+;xA(mJokK`MuuMtB78l&3X|YP;8dSsBK6}cF&8RBxF5m*$qkqn?rP< zRtt|o0QL$Jq6j7>%L~56Z>+m5t@|Y#lQ6p7#4~Sa*0nu?p$XE3xvIyUEST=L>^Jb1 zYTR4yw$1{ks{{Vpx@yNN$w5142#$ZuedkVk!X!H{k2kJA>2?}Kcru#dw4LH;Nr;!| z?{h?7a10x6wjXbtUZ0A8{vq)wZl3rl`0;#!g4x#&o5wLAmc9KWmQ|ZKS;!$cctSs| z2B*(d2)R>^OAtNubWd+?`j%%Vw-I!KQ?82AVg}-G4v~0e9()7yJBZ$8CVb98_w*vdR z!Zsx8m!4bH-J#4I2|}nUOGT)sD(+)Kiu?NLR8<9EfqzrAM)Rg(mt&@hheUD@((07z z@wXneVU{ij8P3wm{w4*X%>xNj;0LPl>e~=yjgdAoVqHW zVhm@V&Nd$6z0hqG8iLow=DVu6`wl-FxXUa2_Oz9WziC4yv|L)>$MY!o@Ho$7_<@%S z<7THi%f+1!?0-PZpv4?_huN^}_DAydxPxUIR~0`sm)V`p>LIh!j6g|D;sG%H)jrfx z6J*u?1QQ5%d=515z83|VYcsGq4*TJv$U(6+XyS=mSo{R!z6{e84A%=k2%CQA2|B7e zrg<9@1_BvyV)(BoB1OTFK7$b%Y3j%6REZh^(DlOwm@=3>NPG)V)wKDPDv%R~o10O` z-Se8P3uSFuIvlOJsq=dv4|zs*QDVR0YwAh^!plw5zLgf#_ph1SFB=p3)9=OZu zvA6087LSz>PMm}Fw;adV%ZE-?3Fim3yhT>R2ab-gzvUf`t;vAG84N+bJxPe7efpox ziE#Wa@ki*@>lGYezG_%+L+ZhqZ~y%>vuIRFX%#F#7>R92Am`o+Y(?CTdV#29C(^@E zMtSLy;lZ0XcW4?e>P6e{=|@am8(vrgSS%kOcVeXahZkqg%)IIEnd{EW=)*g!mVK6? zNq1nUIbb$AIXSAtA-lvAa`+2ArjBG<@aJ}C z@H|Z~H?9#`I&mXZUe)yrk;&ueiAe88$WU@>mxts4Sa0WaH#_GmZqs3%jlOhHAH{ymGS9>@lydf;GR@6L%b) z5ht4u*Is!Q(f;{KQ%i_YHOs7?UPPmsl6ZS_mtC8 zeY}e4b09FKAiUmh5P7Fjpg3(6K0rmjGB6rT3hgf<$26O{e9vk?KW+GWo=9~E^rT(@ zFv#KR?HMCExxOuS@{f7WN4%Nje@^|Y|UXc<>lUTmi6;s2;JPN)|GNJ z(rFNQHTmlVPE)t5KC;CRiAn64Zz)Ke0$)z_Czmidy4_9>zyG_4LHPL+FbS{&o@u2lBH)O*#NypwU5re6{6QI{QyR9$6|zh<>2UL?nN^& zIAC%qx8@G}J3UpEeUjOHbV~ae4kP(cRhIxn0haA1tRGuj%J28+7$QJM{Yu_TBh@_ZXM?yN!MAV-9=;njEEj-+Y7uR}dd<_p9raj8ueZ5^KIP{d^riY>C z;NEKj^Ft@#*$+cgU6&dLeD-Ymft9^SnJEeI86ZeiTylziWhc80ap-bMZ^#gN`SsnD zrtqUsISFdXmi_7wn@F${u~xKw6t&xsLRjtir+hwwK!RPNDO^8BvU}?~-wOswxrW{w z5k53eJaqM4NH0i<;QG<~$t{Zei$0a}CiVBGDRJoQf8dkrPvUlEFlm9<8Q+VfM@Lgc zpHJHxG?a^;8%RciH26Mg^nN=AQr_HysrT3i_xw#&CNIVb+{XF{S+wNTAB%A;Q4IZ& z{bFjwe;ez0SixeyG(#3xN_|8;hmz(QJ?E&UUz8s=Cep;g7k2QfuK%5ocgI6*Y_}l= z`qkSIdi!-i4leOl>i2AP^1m-Az&;k`--))~J`UyevMd&>hlyHru}U=1!0P$A75i1$SVg&gSnhv1zs<1oHxXLlks5ybXdH zRNaPL(brwIhA{1LBa}AVkf#sv02_@AZ8;WT`Y#g!%JIqDhBTcgqP8Ko7fG`HpQt|m z)Jic;59JII6Y8tm2<)q9lBj?A3SN1vz`b${NlCqMX>li)MoHsc=X z72{ZHXui2EX}+kE3AI%{UTdUrVzQh6cEifJ#f8cY%M-rbidrDhqdWjwl$kcC+b2@t zH6HA>n>pHV&ne{htX0I%+uUNd@}$tA3gkhH+WP#HKsS>py~oC&Ta0)y-PHb=UsvlI zX|?T+v-2HckW3G&OZd_o+0vrU_aag~?enf&Co%+81rWew#x`USBpDFtD~VVY*swQh zMGv(=yA3J&yk|>d$7fB!h%75)J2}z^*!lWSY%wi1c&v7?fZMfAL51dJl=o zZfKd-mt2BbewTLq99ap6>X9Mq%0QTiQ$4HZ@Q+^qRC2~-quRazuD*X}%PVu|>KhS` zj)Qh+KQdPatpmh+H9k>`{Ct+OzI9>NQN*y(2Hx?ufnKwf#$f? zE5)`JyxghQeCk4D`(7U}`>IVrJ_rVUUvC~M=H6p@)6r>1Oa(9e!iBfOB8r@WJ%ZQoAQWCc)cAbG2~_WwbkxkPf+^i;Y#}W%p{P!rz+QkLiN=)A zeh=GWufaO#!gR#^bOS-cQ*HfYWNIzk;<|cCY5QW9n9DYV_2PkudzxqNF0q96^WKrz z=vAytas#&N+Jt$=XD_r>Zc+4 zQ*HCWYg6V2Yn7CIBGdK{z=bco#K)5l?oF3>EH>_MNOR+sh~OJKVRdIha^86fGp|gr z1L?1lB}nO#-n)sJc8{Aw%Gq|@ouZ~pPt~&X3a!qKw}ctuCX}d|RG(_^j}0!jPA39# z=K}^~U%Er?%&#mW7R)9`9nBFQ%TM8#!eVTgBy;A~Ob=PBe zBqLXbfMi6-1O(5H(GVnN2R!K;ch3=Jl1yjMhIYLVLz~kKnhXxA@dkb6yZUjV-cMIs zUC^5nX^g5mj~dQE^5A`!c(x%mLkHzGQLo(v)t^>z7Ns5(!MJRwGm_HetTlq&)s-gR z@J2)gK0SdF5Kn~-7a-4-;lk(iw!HH7IxdbTxVCAO+UW)>9}5(#QT2f!B)cUd5A?Ty z|A_wIwZpWpv6kZa6Ix*~tE2m$VwbMrPr}ZG`MR8Xe16%ys7mpJd&Ql|XSN?VkF?I0 zBTJBNfQF~?huNY1Wfetm2^;;Z18rZLk9rp|OL@}_w0I{(im9lmaiyQIvbMxinPCWA z$R4sFDNIpNpzIZ_fA!n@9Q&@%lJ%k)FJ!_M-m8(8Rz>=Iu({GR zJfS+C;UcVJFXD*RR?ZXZ#~cG6H4Ptw<21wZ0(I!Ql4PY(kmkJTh+1MGbG$yJ&JvL1 zQge}Qy7S59Mxo(Dz^5g`vw&Tr7Q*;ohf{}e*J<(kR62M^+^X3^FXKzDd z6Wh49A=jEPi+9b5wZD(SA7inR{+;nq+u@2V{G)&xTf1jC6S;=0$1dAJX;5?8fGi3+ z24eZ0@t}m=f^MEe1OXwN{m_=Ns7Kd*@p%x_3OWKw*N1uV85-7@vp=lDbjA1JBsrX9 zL^@&n*Fm6|ZrfP}$+W+(0>>_7hyLgg0E1|}5Y!vCz`G53Gmu6~ez~{88CY*HHJV`Z zKOo*2qn`HY6*Q3v4S?eqm_z}nnWk=U81wW_B57V6&#g~Pz&^&#X_o-cI&czSSOHjV zA0|}e06v&pM+1Oh?n~OPS#VE^VA=W10#}@bcO!owAV@qFn5JVSke&SN(Lbg#=>+)m zete#GISyUhO0D73ub1GKIy6v~b3V+jV}#$UchF5VpLgHzt>Hs2$i6*OazwhLm^w58 z^wsJ!R4@EU8j+fY))F^(JFyhg!5i4YGWrz zoVAa^_|YTud{-ZpIR!6wWZ3r?05Q+t(9q!Ej+kd<&_s)SN6cfG(3fi%xFhA2G24|M z`kgQ!&62_aC{hG|srS{6b77Rh3&Y>Ta~6s5s?|dTMrkyO$KM;&eE>$JO6$)QhgmS; z23TwZo>u|xEz<+5v(Mq<+a1G9u_gZ9RM>%auZO*C1QFhB!%SCWUu^xc>^87?0jgl> z#r?>y&?Ad78t7bOO*aJ}SWJgg;$*jj`%&tHn-eiIZAxW)-Up$D1$g1_AbWtg1G2He z6L<7FY@~Tp16?LHKp{fJrELhQ2D>`p09Vm}hV0)GO?*#)dTRS@b@Z>Z5=Gw*W;lO1 zu4j;$9CHE!bksa&6I;?A0QJn;j{EgW0n-8micv*NETkY7*p{(1oVlkTj=O-_Jcpu3 z^}YgTE2Z%Io~`#gFC|RfXSJ8%eDv1xQeNg9p-sE&iwpv*yI!NBi$%UcujNZxW3g4G|{}k2BY)Smt zL_vsC|4J7BZycvsk0KugZeED^4=t?zM-)yyd{cGmhqX@?PTP|7rv4`Zea}4qKY>TK z6jNt`1^-@*vjrq%Nd#W^wlQqI7Oi`cYJO1>Zs_6Kx8oPJKZ~2b_Sf?tJrUo}z!Vb2 z`eDA9`eoL-=}cJz%m(IT6fl2$30q@!u#<0DOomWJ)8>cBt$f)iKVbL?7R#VUklQ;T z8>WW&8cv00KaY19DKn+5?&n00U}$G5Q^MjbCs{?tM2zk8Lzd4p@|A}zpW#o43$)mi zx-;s6OH-AxC`ROdd}qyB&zMg``0xuA9rMY>Hw~^D&VS_-yUxHUb?C{#54UMA6UFcZ z98K*uBu}fhd5GFQx3bS(@0t7f1tXeXb#6gFoZN@r)2H{*HB}iJsxHpE3lbSs*A;!& zvG~Jx%LbXY)wu*Sh89QsHKrIoCeM8ykEXu=h?9sU3#w zci&rP|8vPJ%I|33m^;@nEcQk5TD6Ed(~}F!h8g*bbNfpO`$Wd;Y2$kyB=;tZtxx1c zHNK>6wHF4Uk^|g@E`Uj*DDt-qSl~|SWb1<(EbXE=QF!bd{HVMCS6$ou^h{oYtnk}Q zck||o375Pz-s!DlmPoJwv7ne#O$BOap(kkA1I}!Jq*#xG;+HsWyP#~d=jav|Na^knUSsdM)*RW6vDt^`Z#v|1+ z?V$k1%YoWpvmN1!#NZHo=(i0PIXO;_ALo{pnE@K;2Z=R=8-{JA!!{kZAsePU5!KGj z+jZ!dHxN%lf*i8xt1KzK++qvndk<5{4j08>1fE>9OI2B5RNtwmbrrH><&9S9cUWy( z2kzNNmMDT(MIc;8AC=&Jvo1o^D!eaG zlN6yy(d*8l_F3kzN;i9ni$>!D-;E--71cw|CL+c`btPO6_hN80oTGCzXtkHLAQA!c zA9eI5KNe(`<99O4E)zrf;Y5b;5%K!*vhwWqS2zKzv`(^qBJ`oCBV(Nt*JFjqhkM}B zoLZumk@|W!qaKvWb*ySrjlkv~0wp7Q{WLyt>qsg3R;SZObF%%C%GDuVZ#ua>QMt-Z z0gofKBbs@6i=uiK(en~OmWnE%s>-yiJ~qzW5{t_-G;KZ@onMxn!Ce}%|5^!Ko_F(m z4eoQM4~c^K*x_?npyDDbjRbFII*FH`d1o@?COIG_EvddQ^Qa^tA>#epTo1jWpErlxg!FX^@k_Q!N#!;27D4jLq&Ofi3qfVCPWPuhCPN=!5NI&;K)LRS zxvL0m;JpX$g-o6i+YwXMOCHbf$~k^{VP(VGkQE8IItswR;dZhDd2+Si77yZc>*wxA zzu^nI#GkqNitkY(3l}0Z`}XYv+|fR{xnW}1yC^3_@5U8UZUv2rtsp_HxwcTX?Nfn6 z!xw+F?1Wf`p3NwM)UC^P9Bb0T+#qsw8%+5WBSEym))lA>s9|4~8hhUr-~ zYill_gZt=|4PPFiSbvSDvLR@B?q6bgxQNJ-ZdfbUR&}EmE-24win>&%^%X8DGgv|y zd;3tbKlCviiUsDF5!nLlqPXXY(E$qUcSaBSu5ybbyl5C0+~E|Sj=sKCK!YtTEJPw^ z36I&#O%0>^<&=Uomx}!J7wL?RBX8LGs@`#oQ9+!v5*9HIu`9C_8-B?VCPaZ_2qK*Y z2#!c+Tx}F=w3A35Tco$Gk|QPC7i!O{n9L94HOmqtR&37YMQq&ph33S)n$>H`TRXF(*KpyR}o%8@8H`Jr& z`f#4s+n9}u6ZSh+q3VO-E{1Y;UL$3@*ey6ZW(jnbi@MwagsX5t#+%7*o@uqFoG|sH zyi^X^(`uOR`^1;P8!&4jXy=_rDdShP3M1hM1~cdfP3!i>BG#LEEd7rAYI2=lxO%FE z;S5J;M49+33E~OxIHe~kzX03UTp2I-h{)}QFdwC5RXz7*=;A%f^=RAYjM8_)p+6OTmb2!n0^t8AX)fA1K%V7yU7+S-7 zi;aqD3&!>=vNAeBdN7wkm3+~qGL-ObhHuCr2*$KKc z%!!y+gp5W9%Tn(w)?6;dR^|7 zHNyhE)!~AnpOss`HfKx3^Or`9d1Zm}nTItH6%R-c(;s2__Y%Kb&{BG)6drw_bGY4OiqTm}~R#^1FBMHs4N#+$gGk`jej6 zL)f7MI`DpiwU}OqkuPg?AHqeuViNm*%kDKv&a^L#Qg>vy^04n!+^e7y)anI6O_7xJ z4UY&Z$Q>oyDG=MgTnFLk#^W{dBknQnS>;TlWn~^&;>_yfXr(yjOHy^z*qHW)<7Wt*9p(HQ@$FQ=kZV!?=wQas11cQicQNS2->%$)lb0DsR%>I`bPHhz0T?`rpEd z^t?47=bw{M*R$>)_kdI|DqJ=s(2bHbKBT&jQ@489<1SjTg{Ey`A~0{|22xdjhKfj6 zwC>w3;(2Bi?yuj&TxitQ{o18f)aq%#=dPD(Q=u$QU)n`W73G+%BN|LDeei}|`pH%P z{4HDs8%{0H+54v3pr&@-)m zzfg`^pCZNZkT8IYNzkYcR47QyVQim0rtqaIs)h2^RT3WAXimQnb80lhrQ_mvlBrjiCtmS4~I;sjrma+XR z2d8btb=HL=SCk278JTiR7Ofdo?km$oYh@FGekVfzAjuw3P&C`OYk&? zvf{IB7uIBaR9tcc=^i_3I0?~zJ9LUY56H@ezerE|EtC+F3y_}p$?UZ*6a|!I1h7wF3t&MrsregEOulF&OaSv z-}&5B_)=axc^x5|ylfsw(=c$I`PRuO?}Mj@k3oonq-=LmX2m~}q%tXEQ07@q7^pYE z*l+Az)a_mrz`jQ}8xUtwoPh;{=r&87)`qk}s9S&Mr{8P8_T$}mTUpeDYK~$oSnDw= z2VSFap-K4d4PPbS-+1m(xAH%ejm)m%wTq-W=^UACMe#%d`J+6P5g)w-s{tKcelX2F zy-q)>7w>k#`wLvdDWdVVCF>@)I$tPXT;o9wM;=$L7pmPpTDZG-}n z*jwr8%>$^jQ|ECLUr4@-*2@BRH;Tl)&m+E=TrR#9jy~P6&(jNTf~sO9y4V5ur+JU? zY{BYz-C3r|I9m%{VU9G5GJ)ToT-bEYJ>-35G>MhZo3^-?@G9fp zcYTZ-g>q=h)4Z+qb%{5=``*9s7s`Me<46`=}gtAb&3 zlm(y=r@lH$-R;f6aVz771PPg!=N{R1Fa|~s(j8+md0kcvA$oNn`S8I?OJ(ly_3-YD zaaEB(KYlLS+C8P0jNr)~mDY(Z zRTf64>K>PQ8b_bI(!=2Bnbk263(Eo~ReY`+X0;9JtG|G|*D=#`KNI`hCC$vRYC_e` zSvbZrYDKZGkIog6dm+G{^l8sGCj1>RfJ}IhQlM^I{{jeFFU&mFu4_PdMIIxJ7|=n; zms?HQpz~ajj&YSAsTLHFN0Ea7&jNX#Gr0#%=XpNLu1L1ie!1Vs#6Xtt;JL#sW2KXY zlZPvWbb=}TMbsd45UQs;q0k19Lg#_JydBQ9yJiFxE>M_<%WD}^>1GviNKqFFnLk`L zZSHaW*=3K=XA1&S&rmu$wZ0oE5CER;9&voHEKB8fCU*xH{H&AnkPFE=m)5~G2OU@8^NWj zpd7C$X{Y+{{4r_$0CEG6o2d8_Eb(pig^KJQ3&ZV1HiZn={^XS#-wvLBhM;3SOzrQ14pasN_6(Vp57wxW3IIGbo%9mYSg!OJkxX?sf zgfK;aIL>=p=jjB5@0~Rag=Znt)DN3pRE+@jVd2bnETa}VHE%Q!Z>!rKO(Y^!y!{6a z9DC10j@R?iHkS%fEW!pr3!S&bi=CKq1zhSCEN(p%Wt-iaIUAJYz@8`+^7_DN#8}aQ zAeuGGGi3Vec`j5m^3blV+ccSuc&&?kfOzE-(fDQSxP2+*sA*NKi@Ga1{)DV#PMGpw z*em~WS2KSsponbR`l)JQ`90MHT4r~>RnwUbR9U=W^`OBOh&V#hYA)igq@)t1p@y(9 zw9;q|(Fa|xTSCoQj}a2ws)zbE+U=QhjlRwpJ&V^=BuJFj@dYwQ6vfeC{3(+*59`-rz6`cmS<6G6s4ILM@LW55|Ia$x~J+XSi-G(f;f>qO6e2E5j%2r>6W;o!!eUa zrjOCK)6*N@CWh064@WRG5~>Xl^k;j*$(>l7iNbMt39l5-lN~bZ1%V;!&6%^=s!Rnh zDKELvU5vF0rakrWRJb{PjA}C%aS zI}I`kAgA<%$O25_QeUHe3=qx9(>pURRnKjFJsxdkII*Ir%-os#tfyH}bgD$8T0UvdTpXUtMoIF+I)aQHVGtxoEA` zGAl%Z7=_h(Igc)e$%r$!$6hPxT5C14RQNJD?i7&?fgIYo8=dpIy1Jm^#bVd(FwG3* zq2~jaXxH_-E`6n4I^31w+dO45bBzqda%FrUOv*)<{jCG(8lGEGpW@Je2A-CH^aPO5 zXWc#Ow@w+xC7YU7TI2E<1ITAT-}&<5w0+Nq>ZX?a1&*X zZgRY+oi~t;UF74T8oYSK5wBml>3ttx7zF8D3J)znKThO98!YX|yaO8SPs;Hd+NF`R zlQ$mcytLzpIj5tmqDB4k2qXhk5bw>H-l`i4D0pCcQLD5h2b&WoCYt3qVf&^inpN`b z*(bWu-dw&<&dV4DK?n}R^+XolQK+wI~7Jii_f!N%|lqZcPhW#?Om(vzB z)2XADBm1b_yg(f*V71c#s~xMl4Y{j7r2xdq5`Q|X^QZU!T2lp>r)QQRFp93K3t$CE#6 z)@XnFk@l&+mTRr&zX`_jkotH<9{=XV#%|ldgS`lh2ncq<0x|}ate50!+|DWxS~*m& zefrd9SulR1L!AcuoZ&;F*#+qq{9PubE*BJ~0|#tpO&@5uxCKNf%K`6D%L*QECZ0Sj#JI(`MoiaE%Eg#5~f^= zz(Ev`GVS4GF-jPA&-daHq`8xJ1v2c?$1w3*B;AF*r){iMK;;woI9e#a3_M!pL3qJz z>6h`Ijl4|XMs+)DX7eJ*F)6+mQYp$}PVQP;SibxrF)n=&!tC(v+fe z=KG%dFgErb8y~ic)R1C!y(#}Y>RN-dr)%ek;Jw)5GDd{K=kE#smFYhpygm zx*n0L;zGqGq0Hx;e-8tU#4Vtt7Yst#F9!6O(dOdT<3_Y-W;G6e=9coRSe}0!+e-1# zN{Qn^hd{LoRN_U0Zk+J=me5a03dJB0Q4M_ifXYE)oH@fp*TN6mJM$H7iGDlf*DJXY z!%TJRqvh4-xF(e^(}bgl&qKIv2zD!ZX!9OwgC7v;=b@L8{b<~^a5iMGk=8mSw-A@= zTibljE+#6!(=0d5kwuEG!an0+g02oD^VO<8`heDZzbi{^@i0&i;q7Uf;!vtt-zQ_r zyev#OK`e-Bj2EP3pT7a>bibQLp1ij&X@@XMNUB;D!8-YVn3wr6 z>abkIZ)z)jYF1%#E8K2E>gO@u(?)WtPW@O)*v-ZM^bbS1;lblwMD}!cDYuEtwWsZY znKDA{8~b9Uwjq19XZ4hijF`Fs1r}Z(bbJfmW-P(gKwe`6ONZajwlGPM54~O5RghV% z*}mDS%y>2b(S)Lgg;YU>w%U2x{OKLh@W|Xy-U4bIAi5?_kezK<8^Pv7i7XnI+UHYq z@zx{h2^J&)_YbLAuY77xHoUS5V;yRZw$hSf?`Qt))ycuPkPR4KC}6(lHMs$O$SI%j zAhvjE@v(??xN=_6y%iA+VV)t45<@+qp=iBplevr>2RUJNY5hN(Qo)$l52xhv!zsC) zq1mwv*C@wnS)ofLj<9POSQyivF! zT*G^^nOo(afE@Ry^t9|PV^C;rf(`2DnYlgN5A|6qd!ThfoL@F?z;x*K*aL*R=iBky zv@JQeuHHRL;pk}!oLC5|hWrsW9tD7xB@CFj9b-m-t*T>}r+ylA#kD0sp|T{^^#>cF zszryz4^Mw*P>Z5wk#1iAgGx|r@$CCJH*V>4W>a+xJ@2+8y#6$dwcKHpbj>KQ$SU%j zcw~R0l@gaBvW+@fMVmjuv$||OhpnDz3J@>T*k6?|J%EX!qucQs!{4=ENsK^T`iolm zznIzlkFcQs=gx&IfpNn9h6sk`XFVx>gH9T7ce@x5l^wX+GyXsgvB#j#Gx@rQsVU!~ z+ylhdO#Z|WZK}4X`qOfc0MGNVv~DV3e!NGKf2Pzmt*V^x;4ssotK+2UP+p-EtdJ zI!&?iI%B$DX6iBUzA&wV5-b+`y`E_Fdxq~M&p*nuu@?itux{XUfB&GZnsr0cLq&FS zLk=7pAl)cqdS!jdX{=kOHxnbHL6@UW7xdM|?~ugPc+=5S6?W#62>Mz&3b2BGtdR|8 z1LlHp)W$HnH_t(NhW_J4SbhO*UhNwV>E(8wd=G!mA@L)FoWEVnm@rgty`Rt7a( zVJ6zSC~u1Eybw0#n*OG5mSuy^4gMVmkLC3p$ zo@^&ell#8z!>zwRSkhrr7PH_ko5bJNmpM^lkYH+PBxkE@sy4yq&GjODFo>uI+F0Og zuHfY62XM=T>%|0_jH0Ms;W?X@9@#wO>SArRFCuSCrllg!@9UX=|7#h+RjGYf)gedJ z1;OeMATk~$Q?J=dCm4g7cTimH*k;ND09F}mE0sBJK&q>rMz+-EZW1Y}jT8nVuS3>g z_!C1!#%otdFXZ{(xgV{$MlH>A9 z%}Lvk5}`l6eeF$)M@^BgB8a6hLS*=^*PsmI*K>u>0U;Dz)NG|@gMJ!*Xmwsr*Revm zj-0~%$NXgjBg%Z{WOu1Y z{ZpjNV4GYULxcR3SBUY=Pj}3Oe`vM$Z1??T*Oc!Ylh#ZjQzRsIZJc6h z&UH#m^3?DDxTwW1D*bvuQSpy?yg^(m&hnIJ7se5UUEemPjv>^{$Yn&ar*q5Wa)zJm8vPs`HWr>OodvmTfc~5ABLs2WTle=qLf`jC`gK1((UGuY5n1C&JhKFruC`)EO zz>WC!bfq)DnD+)B zy)XLtkU8r&1B)E`SC@5Da`hEV!cSzz-(#K1eevYSYamAE&w?@_ zKf%v7x)BVQMnB!Igs9SX3clr~C{dVT>LkkJ-92w~Xvv2%J-zfwNM*y*hT=>m+rCJJ zfV(i!4`Vh)P6Yt8P&7ina!Ay$-YPq+CE9G49JyScQ1BG3x6!@+J~~ouQV4^{$0>%} zIOPaDzp3l&%XdNLTcTmE*3?y0HE;4Z0z9CCB8{-ej#6VG(*&Z!QJRZ(&1>v-OR_R?^25qNNZlBxQNQeRSCt7PD( z;MB*LwIdxI-XzYXe!1sGn@}O(c`kN@ob{M*B_pdyru?^|X zek0LKh)3eLh*(L4NFyTjW#Dz|+gcQYKJFvoJQa5^9l7##qi>NbqhaA~dE`=bZKBX^ z7x@5bxUSwS!!ybb3;FXxU)CLENZqj-xj{l0TjJ-RM2m12>?Udxa25l!q<3ceW^n|W zS#{?0w0=7BttGyuJImgWe9@>ENR{%Cb@arkRA?zIM`LjSDx&r6ke*&c(CwLa)om=6!xaJO4k)GM3kmA!FCQT)XEEbUB#| z-9FXQ;30^!h6WVecX6Mp9ip!r)nYtX33IuHw$UFv5bGc@DA5~LU!<^Pdiv7lLO9jq zG$nHn>oWTxQGl8fF>ypgOXj%Ige(1&eTUx<=BShi+NVF+uLYjeEi6CdK+!Cmd`BfE zp?Bo^5p}**rWNMQcZxY_gI}8HtxKcd+)kpVVYnhS5Kp4;;}yFfIb*%?g&eTV5?)~E z1*g=QU(p1ETAl;A8-b$C@}N~6Wv@8m=bx#3rdK0yx@PdxZ%-H6<|r^)et6d1x{-?Q zs>+=Y4vIl>)l$KaqB}ng9S%$n$ULOX(tKLFbFNbp_8zKjXOvk{l&b7zcTx*+c0twb z5$a;EZv!vW1Fg@39T>~vq6jeeOOD?MbHC{R=D^5MZF5_|#?^gV1%{d}F>?f!x!X;* zT@&NRB3Ac3(DFxe+i{A9!E(OVO{v%SjdKf7IgQFDUZJ`ZQ8g7r9FuBHH@E6H`Lsy( z!txU2eB{-dSDGY3Cf`};V)oCweLY;z^1M&5rOoT?TMAJ89Qz zjKb^Ku6OIg1ZQ?4$m?!Hct2rBJW-#8L9e0+)UaKzSNesv3KXkIC82;CLq$x(aTTyx zCh!;p7zv=vf4ugXXY?{c-yjcu0I+Tt+psFW>)OJ1y$08*n5mVGaMcQ&r4btxj%6)10Wp2lxl zCnZ%S@57eqL7JM7AD{7Y-lgF@UC%Kk$eKmu+?(lfR~tYp{@J$3(JLaA6HhA&p6lz( zJugq0V9kU#@_%`W-yD0GG@YdO@Qc&pXX)g1`Bn1Q$}J=q`= z(=q?0>5FM8C>b?-xXk@~-SE%nob2}t50){N?7C6-d5y;X+BwUhk#>DSK?sM701${i z`eqDhjE{hLcz72TYOP~;@fz(Xk}Jma$wxC0WZ$zG zGG!xK8ddF*2`C*KKyp-;z&_-@OL$w|wgFb?OuKaeWXpU(=BY6ri%W1ot+I8Y zaAI0ZNxQ#VCR!P)pF|8^fR955&IFM5T?bV)fLs}Gh2yUjV7CsMq)b zC?x7yhd@?Pz#dRrzYJ9P?mp_) zW%M!&UluPxJwg3FXgjm`??KzO$p2nx-_7FREA1Z!`)~93Kia2Ben?3-bvPP`5OWes z(e3B7qsiuYVYNO^b}aW}kG^#(X<3KEYonb_k^7G6qi{+&M&|dDA`2OcQ_&=(>l-wE9UE0eXvGA_0|8J_j+^Y$3{9AkZ zf0y?1zgpv%KKn1F4l84c!^TDVK!XT1y;hxg@{!3``ZCw2?3?_eT2im`<^Q!1qTB0! z_6r*(p>wIdc=;>G3OUo09{WBTE46#`{+hZUqt5jkKY43L9n;v#MVfFreE*pg{Zn@7 z>prdtDOK!yxI#FHUkL~5jcS-4hf-h76pbvI9rw_@)p;r@_7gr$U4>MJjnpKTfBZHg zUTut`wfi)C?9mCuq_Y{1BL$g#{ULi#BjXg5SdTX@3T2^3rfO=&_D6b*+h)AxKX^f| zZ0t1KM@R!-#N4@vO(!|_vz;#KFg&Lk88;HfT4UX7@8M*u$rl?vKA(}iRa8+_FqaXj zDxv(qEA`>(gL5u{(gTv|FW7h(wd`$1r=3=BT8!&(+L-~(3jswejSw!vJLA|nT2hAC4EEx zZxTwu0xc7M8Bxe_5GKQ7$B|N_s{3@>BsV`w6beK-9qBJKEmq9D+{)jf=irL|D6ON6 zj6^YkQTp+es{5&PfT5Pa5b0^g|6GNRj31?{A%Z zFO76dP*P>r5f`uHokTGk)V*;}y;k_p^&-MeL?=tVKW%(ZRGX6FTKX7f^Y|Kiiwpv0 z6&Y*&IcfHLuZOHRd5NQ~uUIY9tEn5W*olE3@klk0PWwFk{ein{T777;C2GB98)B~? z-IKQSkiQk64=#ifu9ka(=PFmD#9N_B?jSqEug5|j0{a}?Rk-@Tts1s`(hj{g!$S5J zuKDLTy*Uy-`gs)|m!!<7pXe1hh2?}zf&_yjcKz~7|EhR6bOmHM3Wo^%9`pB$5hF<} zgDa$Ulz1al*8Lk<)ysyAO$D1Vh8pVr<<3r{hHKi9YTJ<0E9gyD3)r^_Es~hIGNWF7 z{LaDy3gSE%5#%f81IV8-!kFtMFdCC`fYE`ir?>;!pYVtbkB6z?o|7;CKkU5;Jk)R3 zKR%+gD5)fcsgSLbrR=6%C_*1jq1MZ``oYp@425xuPiam%(>2TUFW>dd0#K388|>t-{ltLj=2eS9s7tFsF7yC zkhhT8WDVwlBXZ2V&7eTE&F$Dyd3ajrUT8Dy5js&|pY!Mjz^X z`6g^z3pIMPdufAARFL|mQ35@Hif2IJ*d4V#H33Np#noS0Y}nAv^)#>oQrzK(EtWgX~S%QhO|b<02%8NI!@l}Zo2|K@t*1-rSbky@t@jqf&!F1t!d*~x zbDb26pu0@N9v~T+plezRZ&j85oqYZ6xLatv1AeNJjuY`{oNaA}*Z^FYb3HUbg&6DV zLQu)=paRBy02p8A2dL}x?P(Y`1Tmfsyv|t2f_2PB&bG9qJcCI9W<6+SBm-K2kj`E( z#=4r~Wx?3+)`lXPjGF{EMLi1a4;l920X!uJ0IR_s!i}?;@tgIw!zsM-cdYi5q82}hNur%vwSSm7t5a}^X$htykIXt2lGm=K}Iz&mErI|#O zAXGN;avDY$pN3Io5+re_fuk%E@*`{Kn)hp81a9Q&guqOX+WMLs`snGj}uZSt25r z)8)O~BcObIH$}JyKSwzk9*zL<%ufR<`3Oq2B`@O{KHT(mZXl%e3ORsZacM9-KxsCn z5;#@E*j^TBKilrQ9cP6OI08_yV^}=|EvupO;{bsKTg><;^szasm|3--JGa6DS#lJ?!$>dk6rO}e;N1$DV71L!1)^Bzr6-Hj&H>3AIdN_tnwK%zq7>veV;=_fJW~m?d&p7v0>M5 z0af;W#OKkci%)1MSY=B;x*3F$BmAV)Y16Ljd#2t)W%(oRNAE-$%64-+Rn(WMWxF;I zh(D^^?NXMtW@hZ>?0VA8h(t@0xdFfw9($(D#uWOzwvYn=0dr&v8!h1+O*y}9f6mE( z_JE=Ywd@h!p57>XdwklAIi!7M|BmPfKuGAxMGq?0dh@`JnDYfQPsc*G+ed>QYRp+2wsg5h27jGc; zqY`otRe2AG#`f=YFgYCes`drNZT#c=FVCOQC}^zOKkYcy>qMhNjg(c_@7AVeoZ@;J zJNV`Lp5Bcqo&I(o?CpF>g1=}-&d(7kmsIxSxozlMCzj(WKSaUc)x}(%+_<&kxxxL~ z-Z+Glen5&ps_6df@}Zbo1Gmg^EHJocc;(lAk1V?CpU8iVx$Y~TpfppT z{uhH~+&>}6ll@8+r?^XA>049E_dIZa+>|1}>$kgpSiEuHwVwR4>!)F+>u2H7s5STf z--z>Xntq<`ty3x^NUx^Ij2e1bP?0JJ^wxa$_n6>AiI$3-iu0RoR15bf zethy`=gUWNuj={o{@wmOj7h_?bh8_aEBv!&W!n@v~&O6`%)5bdA@iX6@I^Uf--<|qj?eFv5so(d2 z&!edGDC%E5`|~L3Jc>GxqRykJ|8^Ahf6F9=+@w`)&^F}p^iA}}4$b?W-E2!Z)xnGw z{jTd13m0UOEE!p}EBvOgL$l^9EW29-zx|$)V}XzD!aFK$@jSPl@a7n~CF+fT+VG@Q z{6jLuTldzgDO{mQr*yUoJs1C6s-C%q{Ct~vVRB=7c5dns|C=x^KqV-+d!10Wzyt@m zCnUak!0igsDJXh!EUC+}Ph(u|w(4~mWIAK7r{tuHpX+*wXDWe&7t^o-cV}#cRJFa% zs_H1(G)(-x@LnsPBXN5*FAaygJ&$OyiX5p$KKSwrcD{dsalT0o&U-kKq3E|X^8JRa zrh2*)_nmxUKR|NneATPJQT+q<70>qiv#-vkh@mgLcVuVxYM&4~X)5fybL(*F(x>*C zVozfU5p<8yH`U{M(YuGUocq`7vu)T^j#m;$Sy!rh`Gc%f^P5xMW-l%FVcTA(k%qT+ zXq~*UDBs$bCIPN+)jd?~mLt8tbzhm|FMw-tY+dJ?AnkJytS(M6*l`QsK*%4;Y^G#3 zfXS?~nNbVzXIGU`KG14ub@=B)JnD7l6=aRmhBl-WN)$A?nFnZ8@eHZ+lf9!|G8LJn z?tD+g;O6&kJ`l{g-Q=n$SfarhA=SHHs<_f#d0i}cptGqbavWdtN~M_VuO9X!iO;$~Pt+D3f$y3Ag3MwxXo~xweHa@ zZ@EmxBtc$#dt0_r{fqg(VtDA(@D_VNa?EhtnLg+hhAjPrNM+P7HDNlSrCXxjlcgv^ zd4Cf%PN+s{Tzw~gTKJ+iGRGY^kU}oy9nG{X;ysq~Fg4k%%#n;%o7?ME-f_5IldTv%sCFn^nZ>ixIfS3X z{1D^ekUS>;XjvkebipFCGimg3Z?pM;nUz@*KXV9LjzSE6LD%e3S_n#)q)sTrP$Y7aZK_((Mj^i>0i5i5Q9nJR$T){6uL321h$~>LKLKwCH2;C7`nuTkit; zS4m?)Qqcrh54g>Y&0`3 z=p@4*H0r#48s-?ov3x#(Z$l8aXaZc z)rszmFYSn19`KdZuzbV;Y6Sae8dJ*&FvncNjq4+&Op&v7>6H@(y{-Y5H__2!IsS+) zPq28{48(XQNZFj=iZdPCt;`RAp5-${0F)wqWdm1}05d$Gqz!BtVCJHLVl>Py+cCS5 zAL-}}VlPw6gPY-jx{tTSo+Td#Z;aQ6kl{bLwIODkCV_q>CG=y*fv%wKwb=nmXOuYYZ!W>uJUrp>#l+hyJ2ahmKb(0S z=+=k-?NR(_N>JKl27-SVZV`sXi7}*ZF{9vgGG`p)M#mbvORbX)B0ef9Y3!AF+^5n` z6Vnqlj$+jl##XPc%V(y(EL(S8Q-ARX6+4rL3ZbT(U!0FXVV!3i+dqAzDaaRgQVkxT zW2^>}h}x?^#cGiSDk)u_I0 z;xPn{k%bW7PwKNj)fqoygI=g1bY%h@&|d-QBm^wYo4>q;Po2P16ds9nGm~4lUV6 zp-if&4%O;mvj<_7eCjUPr%HPrPQfDwP>H8s&?I-nG>Vepy_wDr7?2D$AR{ljTY7(2 z6H3&Ed=9jdC*rrV)XMt!!d&m6{ff9EDkBRYtJ4?(bLD(KK5kQW?M4IIjyUC;KEiAC zFrD@)NzaRDa7*XVhWjMB8~y=yD7o59g|RPT+G^=F&6N+EMRfGSggH4Js=|q5ssW)A zv_ttPr}`LBB}4nVs($G?`T7;i%%32<{*DqP9q5)h=(yLCv0*0C6qsT0I z>wZAH!*FH_KR+-?$qO;NT#vp?ug@4CsjpW{D;CwL2DU@-cRsNm<@RtU;G1l2J&oQ6Ph6X?!0&wJ{7KbkCi!QTB;u`M^iXC<`lgpJ$)e zv~>CD8*syoF!e{_?C(XA5~N7m(L1~C?RMR}x7^`k#P%~~hCkMTzRpj`0IpN;Th`jk z{rULB-1YwB8W2mx-_?NT3|9Py)_@jh!))hkK>xRDK#3Mjg1xtGLYpd@j2}KC>p7&K z;|i|g3M_BC@LXTdq{ivseT&+}om%%zqQ^D2GGMF(n7N&NK7lMP?P$|u%uR8*8RnN|;ExsIe!vy+ z@a58R3By=J)$y)yk~(6?J3E*4_~mzFB^^vf!XY9u+}ahC^^G3y`7X+HY7_D8pKvR8 zI`0z;K5vzgB*JmI-~+ElTtV;C0`;r3lDm0;jSjh6SFs5DA7Hg|+HzfL_`ZI8GW>zr7Mcb)>+rxx;CGyxghpPyv1ltc9vmi&nE$4>8&T_s?fs$I}{7nsekT7 zv3(-Twl7m?+IGHOY+3r{Qb`R(1X_5MeQDm|MW+q8cN+SAjPIjkCL)QCPrg+=+`3$K z(OKOVWOqnjpL&oVEeUJ64em(F+I>)Cd(n;$B$9vP0YI|v0GTD9v#>-K*yITy=Zrs*^Zhs zA*&8W=X#s2JAZ-?cAZ=AWJW?8iXu2}LuK9oXZmetZ#%{8%0ZMz+|pY!I=&jI6O9;u z1=l3l5fNJ2PtK5rGD9=&>am&JGr>F%DqX5UUrgXO^CrTXXK<6H(=c;v>FA2uMrOdd z6#bF{1b7~AaH0?Lx_!oDe@(C<(VDcYs;b2Npwz24-ACxXyM@(za*guv#jPaCi_pXu zY35a{LaC|(oMTj{Vz`9i&CnsQ*!x~J#Lf69Egp`fG%0oU3+$(1m_5N1j1j4SLbvHG z^Au(hWI~pN5JLY$Kuvl&c8uOg=k6%d?|6AUj0Amo1uWI9fC6Sw*T4+1*Pt%vYTN*o zo3Sn<#3+9u$TM0Gg5;+UF@C0A5#5HbW*#0-wV|v7Ircy|g0Y>m#<35@2ADIYKr#hQ zy0J(*uL5>ZUclOkps9JO-C=G(R9B)Ilkoo%_rBLnbC(>znyJgo69uf9%UOJXez>k< zAlDhFK`~&2Tgb>8N3=rL97qj)LZkFjdI4ex$NUIrJL_b* zrxpVW(p?a{OB#!QREqft(2v@IqC(z{v3oPhMJ)iQ!I3D4Fb=26SV?AhfOQbg2PqS( z3hFC!Z=GN*y!$TjzI64N?gVaVwW zc#kV;NCps2>e4_imp;H^-?Kzhu0zcbBi0Owia!S*UP)nIVlEmr2mGT*MmFFd?O>f9 zIeRy;qKYY^;K8ci4ztkI&4(hRPpvz*K==%I?aIYdyp_n~L|u^GJ_J<|XxxAx1TOS# zya;Lm8r8Np4e+*_30Ny#zyzp)Lq>XVf|bQGQothySWKSZNle)yM!qx++b4^dY5?oI z#f=x(i5`{b+UQ>M8*jn}{mY6r2gPzOtmPTs7)U1E1+^BC*aj{I9Gs0HBQC}YU^O_2 z2!jsA5FlVF9g*nsZQe;v>8wOM*DI^pVegi%kYeB5em_wm#RhY{R3b|)zBfJ)Wom{Nvk7V~Nd zMM#1<2yB(?CDD1DDn=0u0k(Q_s#I+h32I4z%GVqelh(3|NgY`FZ6v7F;91e!rQ1yr zagB=MDZ-5aUtCIW?1IvtM+f!4KK_)ur(ktu5&FK*MlN@{&lqoyV=J>7M^XW%NAQLE z%B8Mi>qsYFv{^Q1^)%AiI?lTu@9?+6Xf}66ae#dVdz5^X6?^`!$=2pC2BE_ageXw_ zc`E8^?G{$RP2t^+7#PBhb70F-ph85okPxWWnW4v3BtapwaAbx19O>NQ;4bl%SU_=% zVfq`5R*c(1>=Ww3cc7NDpmdj3jI(H^2o6C5#fb59A#acn4Mh5~5#UT_5@5YVk`~}j zmIET%I5+4a(~}J1rKq|JGapd_l2l~0$I+P*=ImGlDrp4>P!%<2WPs|Hu8Av}mWU$a z%BbqxAT~@cW9EaJWli-+T|bHg(RJ(<*jd21P1UO0%slNjAG&WCd}6Ydx&YaA0@se| zLvus<(i+qmZJwU;`D1N%w5Hq8115139T=*tRvRcuMuF`Oyff??@a}?;Y^ayuuB_o> zd5Fqsm^vLuAA}JEOAhY_hXSb@b@7=xS3Fq^NUm}iY-l*D#6ZX#m8zC9>ak>0mnR&= z(lQ#@F;SL){@Y@ze?s~?oFr)i5t^aCC9HxgaUUqSqNy|+2AdRVD~gC8*YLr$@cuGPs4jzF z)Ry-LBdxcGrX3w+H?9kb43HIVzsbEp}`STj*Un5|Hu zv&;b`U7Dnh2IrqH&+Fj7gSzE-y8FazgJcz4XL;mWX|g$0xUhA^ubSy|9vI96&vv}W z+!%WH2Y~~)+q`0n?4)Ux&|BOtm#iUBS{Ba3GF(7$JLuKYk!jd$qa9E}&_bkj#}IfN z53Vb=6e5&Tb_2bQqkU&^h5q~{;EFY!kBA{G)7P!rYK}J1!0#Osn0yqtMgb_0s~13o zCWvaJMxAYsp@cXOP&*FP?_}mTgPN-r-H(qh$KYunnJVrBfhQH%OQkyTZ)_XJlfbV6 zTL{ct0}zrlO%^(X-Ex-IPCUjiD#BtZnBLagtt5j^+(0M&DNvo8M)5*cuaF~-z0EaW zv_V!lwJ0_1p6p83OR}De4#D-Mf_|t;oAAG+*gB%7P!zA&dg59^!w%KuyM|~DxYs1W z#%w(Xz=c_U_@mrmEV()VrQC5IHmv3Pt3*AX?Dt8X?{=?;X^trMcS6sJZ=nZr`FZI1 zo9M~E5HJb|NSlVucFenT(1d;zFw3rE;6#cA;iO6k#4lAbBK}4Pe5$k$XYd=575P;> zuy-f`_+x}h20eyAp=N=jGil>oxMarm&7~=V!?=NB;DYBIdwSu+$2}2cG}H>HEA|c8 zn2ITfC&T}F*zpHpXM{Ot<51{?=)R%Tu!%_=m7Ty+`dsZ1F@@^fx1m<}GluTkxnUH% z)j4j;K!KQPAM=H2PUQTl(E=+^3!?{2p(Z*22e_;%=_iyl3OvX74g=O6L_T;o9) za5P2nb;~tb{kS!Pd;hc#4bhih>U(9`qA8*z=5SdGQ?AjCx__p17(dSGbEaiGBbdQc zQ+zD?Hq)b;=1+%2K-D6Ae%3hnvHpOHQ=wgVfw_D zL%Hu*kkLPo-TyXZRObN>!a+~sK$MVXtO=i+y)P`M6BL5ISazFOT@ z6Q6Rx&GKYq7xd)QX;wO6!|(*s$0UQ7OQyV;Ior)e{APmpEVCYSKu<~LW4b)CJ_wRQ z8#K^Cf9`%{7GOJCF-u&^F1a?dSn85O)QBv&zM5WL1&p>Ae)&(0_FtjX!(Y+q55qfH zN3(f!`hPV#jor_9GpF`Kys4c3!4`dR5K;Mm^2B5oG@Qo%!o`zFm(rfBnw?t?PHH z0X`&XxozhFjjtimeN~x1isQamH+%M`^2wzTx0sq==%Qz4s2du6>T8j)+P=0yF9sh4 zQ7TqxdbIc?6J}pT=5pT6=dCV(0Tgo}rgAXLsqOYurbkz~s{4yhp&J2YI+ky3M|dCP zVcYGpk4Idy`Jv^2XF!dwMB3rdQTZU*Xp3cXGH;G52YE`pSO1)b_fk20cl*P2=Vir1 ze0%S$s1$G$fR_<4^{qwRtI@pV0L|)S`&N?92rFITxL2z7LGw!~drLNr)|dW{Kgrzs zUUNxJS%cWc7v+iql}_|=Kl&88INBWjNfv*InGwHb*DY_S1fcy}#~*kSka zvA>L}vsmJVf&3k{x!P;&T0YBH7dcA~9p|5Tdo6fkLOlb07Fra0F|GLsZ;|wq)cx&s z$+or{f_vh_@xJ4D?#p~xlc66{C^w7G1e&V?f{g)lpC0gj=3ENBNN7T)&_7C)!j>1L2~xN0;}?Q;hI7z3MS3 zU$_2+rq%61+fP?l)b6dz^t*hzT0BQ|tJ~3MdaYB*7PZa|a{IsRidPVAQkhgmTX-M% z61!rJb+S0aMT&YO=@8HMa4fn{!*MeYBScr^8Rwx(A|x`axda&DS9@d|G+`D(}_4~1*>g(L1><*c)YcK!DV~anm z{U0|}vDE!nLzVoTfyV#PhAKdqdT_p>>iC9(i(;o(zm}$6#

}u`pGD7Fi<2H-VwzUem2KM16&<8h1``N+DrA1ZGbP4jH8B8vS}aT zaeHbu`^JuZBpFML(kE+n>^twK+U#myA9nFoKsTpdU!k!51V_Nr>${cQ01?hiv&r{g zX$EbEcldmm+%8UwjSgyV4eAQp_@oBC(+6hDUnbNrP@gY_jYpir+*#@JsD0dMD}ldu z+`7EGT*6Z1YNlR^#%I&!9ZQ;c-7f3x7E1Z9j~p~#9sQ5_FjJsiYT7>yTb^ECsrRt6 zwqE|;ipFcTBCdQfPSj*rC9YtqBuG8-Q+bh=Y9S(1_K-thM*%+vIx>FzDCbK{ zR3_3dowm3=e47w;{|EDk&o|LQx|;-%0guJo+{O$M?HReCF=_WSjC&f^dIv`ya$&4t z8-x>^T0j@*QwZ!JBSo!rCp6jGh8Ld2N}7 zb!K#eH=7I=2vds=H?w@K9tM{;eY=Q;pTG(XNBc+@zZiY z(X3lTue=prvE`)Jy*+GC9@&_5+rGJWUFu!mPfj=ApLFKG|MB$qKVVG|KS4NV%Gs<@ z<(&$OyS`P~{|0rP{5OO{UIBdnTL_2z9D=%EA{-5SR@~gkweaX|FeY9A#>Caa!I=2g zlMlZ5@6vj-`^={ua`a)d#Y5(2InEwM=!FJ#9TNF+$8gVPUwf(Q&@bv9aXP7lbcevZ z=LcNPt15#JRSO*sM+QU|NrmPVNR5-PE?dmxK_-g|E}krbWp=@?=gC~(X1OO>VN0^; za`3a|TkY}-#&0uEy|k5-IaX$~Z$L9Ya~m&-yIz7hd57TYsJ`NfY#vv!(%$F64lY4F zG3!Sj-H6undx1?-P?q}``vbHwBlrwoppyKzMgJSK`EwTiPoWKYmY%buUUv{5|4hvyXEK zxpwW~EFV9PU+LmC_4f7q63h$Za!Yp$n&_QUNhpxx)OE#;*JYO*JYDd!t2*-=$YL>j zqUgfJu3gm>yL=2+*JUy3&36RG`YTJT%mbu4+-Nu273e`Yu4!0+{dd|pE!G|CcB!)Ki;t@9jIio-qp?pKgAVr9kx+9f^S<_OAy$hzCw>~1r9rP~ zoty$wH&VS+D*GfD=Xq$%YyrL9-eBx?_sodR+`5D3HQF}NlfR@2H`F-|(-Os^2L`zt zZJ392yuqr#se0RBZmjkWcMxgs6=|9a7@xai)k*!iIA~^5D@h9sP0*H>f|1w@ z*sy_q?q*}ArWpoIexCqSBZuoqjGy*Q@J@0LW=+FH#P)(EK{Lcd^AXr&#CaTLlQJJ8 z7y7b4ovn{$ao`OM0o99Ob*Ev;FCprdixjW?r;H3>I$yw=@uGoozDG&_t{l{{$>TY` zy=|B81-=tNUmh!!OjvN%Myc7#P4HzbXBvCURkc;XWw_x#yaJ&Xo|#1t%0n>Urhswa zhY8)(8S5dx#~mZO9;?VE3nqhpnYS8^nf+P@cjq&1>y{bBI@SD z@ID8|4|fpWO-yhOf}su(>`|7oG1M*VVUw&vrz+5NG|QX7fLSw+dH(Fw31Vw?L5ci zC$$4Eg6=a0Cu+blxMLWq@_HEcI?&GwXztrb*?OF0xkHByZJ{aD7l!rug;Aek_(EOr z7vYmjgQsB{`^*q#1vB1%40u1U7&GA3RrRMV^TLqRSe9PYI=S>UuzqP2H{la}&MN*q zz%;PjMl#%oaUJ+Xbrk_kNM++2 zor*(@U)k9?F$ho5rH35Z$1Ko?`uZ%``)4o)I+z2iS_(e@+#d7(5hmh5n2^+E2rhSF z{9;KL;1C1j;L|Ub?Jy%~XZ98B-Cec^Q&KNFjTvj5Sap0azkTk+=T!j?1qi(!$3A#! zD?QA58M6g39$^Hdu^j1NJnL=-m@@3ju|Q3ZPQ#)}1WessvE!J1b=FwxbEKq~-J0#5 zk(tW(Ds1gnEEaTm%AGHcMUcftr;d;lV-9eUj2i~xNZJ=rLUynxqYLccUDXr_DZsD0 zFus(vxcRpk(Kt&fy%-Z0_d>$jsYG|4fXT^StM&&b7X-+aUD!zayhecg(XhwJ&pm7I zF8^=(_s>ZB<-f9r$;l~w>ok=A8}wm2zvba_^5Fa5%fsi8g#9`XmswHB%EON?IvDUq zPtnL;KHx2ntn7Zf4dUYlJQBu_njrVR4TiV&r|1W{7i||mV(fhAW@&`@f;-~v$KSr| zDbGu|nenOMs&~pbXYUQEOz#r6qFtr(9bS8bH3=5W_}UfLJ*Zhc9TX@bwuv+8aGbZm zg9rLclx#aIC}9tD`lOQ?syRGoV+3W6h4X|}kh&Ax@+8)e1$#TbIs7^GO=sEpm*nRK znK8lFkK)p7lO@Y;h?kp^U@o?1y+5YlUt2rBqid7@fG?Pk_D7N)MAH^Mv~;n6+ajWBy%$#sB% zG5=K!?%W86rbVxVwC=vS2ctz-aaLYAe%DwFY$lg4B}K6|6PGPV3Nn?0Udqa@SgfWP z|BJM@5tByn?jXh%46P8SXS%<0%nLo>zsc#o4JA)2?pS&M$}4^9a@beutD$l!BA#(Q z5gOMz%DIP?J-&xB@!lODb4{Z!R#PrgpX3xuZau9nf56MhrbG1H@h)3ofruML1AW}h zQOxr;GOLJ*=qvg?EA~6$Ts5j19uG$=Y=+HetNxP@4L|6q%SAz0$|j8 z+{akwK9DF|gOzuK7~W^W@l6iN%6fiCaesbh`|X_UXD<>vWb^DmJbi6$#KAz+;a9hM zHb%oLO%B}ZeBO9sG+;Ls9`uW&*?gMzU7F@oI<$pMRDUFa7uYUrE-^9U)QxNY0JlXHAs zM1z*J*@@U6EH>N4x#^m~b#A3KY*XF5pm@jusx{UM#p{n5nu+9OeROom*Hzd3T;K!~ z^BT$7U{|Kd5tx-!H(s7=_pI5Xs$bt~y@{J+A;r#gXYCpO4VVy=iYCSQDs+>2bWw~4 zyyLwya}}ERq8lcp3$pn9&ar#=bN7gSv%|H==KOE4ml#n9OTTSa2lI%%K24f8@m-%= z6RhvvI~8*KMktqkH0J(`jf=Pz6P16O=+3RI{k#7CGo13R9JWF@<%x)U{Nd)bo+{z`6Fux! z7UVa{tCZ|E>u$E&x3puw8~7qrbmz+cj$8MolFwyArzml$GL+kdWf;@cp}{ROxq4!m z6DU!t)*YRH&oASy(@LF)O)n0F-I$lW```|{AX0JP@59<<^+B!u zKb5w?mx?UJ5swV%_m?*tjvny7TV}sjMO)+b-UsVMA4YBLRkc>*RBb~6zA`JQ7L=Ut zqnWKJ6gRixEj#@aPS}>Cy2Cx{ZYHPiA0W|evNf4L@2((|={k(txt2sG|Mp95enn1_ zgY1^=;q3;t$F?omklLJfdupigT-!PFgh$Ky`<=4Xh<6(_--lGOdnHSM$3FfZreXj}W9%k0@3 zkZ}T;HM|KUHk>ZPhse+~jaZA=$X!uME#5XQmNXWNh6*?h~*u*R2TZOxB_PX^61wp zHev%GQ=6Uk9dO5A%V)PV6SyvsvG}7weskEEy2Z-2E=iuUg8s(7#mj24M)LW|kY0w% zx$5+8jgrGhx9S$)xn7+nucskRO~{1XckvGgioo{X+Nj0tzf0fBO~lTa{QR>L|Kjj) z@i!W399OxdFy}AtO7+woh1xkHmOjA_@^;spzpSyf{$>O(+EFaZi}Uf?b}7G|70KBV zYfqRQbB&bFQ@^Wz_X;F-rAbXSOE&RlqJYkNL#xr@@P5oh;zNqf0eAG!7h(-!k%x&N zGChlQiLS}^q)dF}r^x2*btXLb&e$8PgdbE=z1Chw4}RS3C_CtAvK;BmX*FdWJ9b2l zx_VpbK7Q|8k`Xn?@!@=(b{2J`llQmN4``HL>f!{gbBQ`qV;v!qUAO&N`kfe&&A9OQ8G{uHu=h1~-feLDg(LqJ_ z2kW=SVW5x)4g)63-Qa_O0zvq5E5ii=t_Q+p#CvRIo=zajeX@Aw+o3w9Qrsj)7xCh& z-MaTJ-tqEiX^;Q2Y`ByV_rZb>vNEXc$U0?a9K$EltcBub(=gP9xiFM78F$J2u{kd( z<4RTI6Bp};W79DD8pDz$>MQ%Ews9SCSdkp4A+g((C-On+t$sG~n*lUr6|!Vv(uTf9 zmwD)U7{Cl);l>XXdz?qTZ;=p5qcl@CQRJq~7Fu`9;KsDaKp6npYu>;*SI>MnBG{p> z3^IaQ=!BxGNrfiGw%O1_ahw3Qzx)os4>8W?F(c_vDK{X_-mb!EiY1>1b?`C<9J`MZ zj_7g+h#eL@7+jYWfsACnhm+I*C`h<5bHfmAd+b|$PdJWUt;AP6NfTOHtk^B;wrc7*>D?qe8gGdMDakS-tJn-3esZL3n z0&}StfIJMeK_>7CMcv$yFN^J&h5=}_3z8=8Bbg6BUIJd>!8FVl6%J0yIA!&suV+4~ zIPwO-ii!n&?UNf)!8`t9k}*g4oUPL^&nTuM^u<=mu64K$Q7FyWqS422GaoE}t|@)T zQRu2eyUfitT=1BfhAmuIpLmLliu{7# zF1gvEOSE zc%&5(V%!?Ujk_V8PBLj4bXx%3x7l~%KF341P}IZdYU%{G(Sdn(CYjB!Dz~b~oySuE zK`TI1>#&3IxMhfNDG#oRc=2biKClae5&~(n6*SR~VESF8_~t(W2nzjnIPex-pwOoL zGfCkaSHKD0J*1uV#h%DYv$?E4NNTo4HiNi zy`Mq50d?tWuzDV99sp+8QO=Lw{C$p2|G=P)7-5JW6@XHLDw1JtXr9%i3E&!^0i}nG zm=y`cG|IEAH+Un!r{~}HN4DIJBTMMg%b`gI;6R)pef9((+d>J@wjs@I#Z9*48)JLm zfD1OV2x`Vr_v^O4Qef^MhlWNN59aasxu`nD)H3lMBfz7x^=S4^h~{eO5_(TmObyP|7On$MaH*>a@iB*0|MhxAF`c+iQc=a z9(|89Zs(Y&C-*3xsd*u8=8iIZB%Zf!-`O;-ym}Ad@Ux|jL$t*p#zcYPOfj1Y?;Pm` zEJjg9G|hP$cIXam1Q=sk1e%ctknJ5{wL7?DXVP9)i|T}QLl#r#Y$0kA_)Bye5>S77 z72`+_LV)iq3(F7<&-(x>l7S_B%=~?zbwDHR33#s8II<{3Zsg(|^Cdv%n_br~zo;Lu z*~y!?Oy$J2O&j4y*O~XLSy4&YxALQzyDsb1gyNaB+R&`pZX9Ou-B3bddeu+&*2j4W*E0OdxJ4Mp4zJ~_e+Ts_sY z9K2aIIIGgCbsB``BDfB#s>1rxrH!VL`oMO|QB5y$X@x_VT10zW}fwRgHd zmIK?5zcjo;;Xqy3FJ#`2- z?pf?2>fZXpk01#<934Fhbwc-b`@GhHH>LxpBVGbv92=@u1&Ww6Z5(suVKHD18c)N- zWZJPbH{jbR6F#+LC<3RUfiA>&w5w|?-7f*e3RJNAB-WO-{p`;H+s_mT=5_=h!YePZ z{cJV`TL}&9F0Tft!&z@3#SV4$YOn`%De7oc3~r=`k(-aq`gy@#)^SK z`7TNE@Fk5tWLW= zEA%3Ub*rO>sK+R3AAPoJ9gmWADiLozfY=LH1EmvUz+S&fngO>nTVe**@`oRyDokvE zozYR`*6!6*_$@@2fe)BG8`ub3vm1To+Xnj?*A@}F!<2597j)uGsJ5w)K@Oa_Jk1>w~VeDlC6ght@$?Tr(cFhsm!>RO-h-ZrS zk8UA-{FukdpP7-s0N+Qo7pNe*GWs!-93Wh1G!w4>Xoz+a`AO~9LbXB_q#hNKM+gjT>UBX9{;bg{7#;dbRF@n_jO za=>e5>vtGFdr1bOh))`zt7Ngs8rJSOD$RHey3Mxk?9S*%Wrl%3dj}dKfIxd11lleg zP;3q?kz(e9ql%XKxD(j0H}}Ka&|Rz$#x=2kRm)|4Kv?5fL)*CG~(+x56&MnWha)=8h$Z7GJ=pW#9YDj8R#g{}Jcy@vZI}^^W6+H+YI@IBMqZ1w2X>IcGVb zV@R+|)IHP&IN z6a+&8Q{5;=_j>_dM+AXWN3LA$x3dS;in$~!(WoGioTlSy=jymHqf&1OA#a!NJM{R} zsdwuNlvG}QSfPF%>}vsDn*qmnE_oE}7eVD)f#~2yfB-j2 z2SBMYykM{4cx@$BkfZ%N*gZAL>~k4ABoKI2R(Uk=!yaaG!rIPA`h?L6y{f4S$qj;g zm+RMwWkzgxAo8Jcvu$64qN4DPvdu5Z*b-&vhJ1ZC?$x2I`uaOG9?Gn1=gTe^Dpb9v zl%#z{QQtYG7m)#{znSS9wnPTiNhHWUxa!mj z2h;jQkDbrVE-Iu_b~&w7t0Y-(>n`y<`3SbkmQ4{BK5)dqyJs*IJEpc?zWe;b1ob71 zq>KbpX!7pp{>dOpiiWCFWwTbtp~wIUzI)2bJMjDb{r%UEx#2o+Ji49SYc3jPRO}B^ zj;YPEf4Tc6GVopUQBB2i#d3sEB&wwGx%9w^riPHoUI|Z+hQX|EH#QhP1-)2n?&O)^meLbgqI)jEVD7GbhR zv5X;ufy8Ed&TW^?Q7=aM?O(gS8Zsw@QjOom9@!e!a0Th_Vl_!3dnQppjV8P93QFp7 zYvxHgO5+D7$`+jm{GS7&_|B<1j$7W# zkP#{;m#xFw+7r2s*@QyDL0VRtXHd0k&IxeRAPJ9y1IIrOj{nWC>_5S8W=i)g6k*p6 zS=n!h!k>>k?NIuL-^eS-{w{tqXRztl_)Q*Q(&Jj#wjXKokVjVQV9ti2gQJV@uer^s z-d+^ARb2e3%dq+ZrY24Q3?sE-_@3RE?p60oSGm|;z25bzWFjsHzTnF7d)h(|s;n_amrTG#O&v|(1N%J2eo39;&GGPAhD`fNM z4TN(S_>Uo*+4qm`oYPwPp97v>p{`!)oYx&mkuNU1SCN3cICk6+dE%te*>mSF zm|Iw0bhzT^e!tgWjjG&DA~cXW1j_w@FC=^rJHjZaKYkttM`Tx>A*e~1M>|3k1ja`6DU z7I1K|b8xccVq4%0KG=CU7H*PRv}%tY=V`mun`N&pUb8naGNoXNu$(@T_l$k@(zPP; z?V_VB(Pkw3J;AR3Ey=zK_Lp2uFfMjBpgeXS7y`zG`u^)$>#wQR&%fsRw4(RNZ{3orNf(j^HW+p4l+EB>~E@37%9GPH!YQ4KXhdj`~}d zaGQ+Y?ZA+?jDK1FDO}ojbLbIDW>$W>%vJB#sxRJ`nRTci>U%mmaa>iQW3jclUhE@`JJc?f_Q ze6(=o#DeuxNF|qwrtQZHEX4fT?fmZ%X0VS0D{;HA?)=URkcLurtVmJGrtw0TfHHXR z6dEWjR={t#SGFrU@%yq9c4`60CiK`$;WkWir`u&OdS)bsk-?ZKe6q4RX%LnE(nX@- zWstNgIP2{7P4`XeOS=X3ZD{#7-q4(efGA44gKQmRnRl=$Usa-hMq<1ii@CHT2w-sj z`j~WZpdKLW7irup0j5uZHy^cw6QYb>N8R?--r<(RrR(ZL3X009_trjGI#}DNs*Aqdm}HO&gvkx723*gtRkf3!JkZD-|@`j5K z{!LsYYxzD&Y2Na_R>G`nYzr99q`A#!@Hzi<4fy& zFDTfqOG4Yl9w9+GZ2b9Ac&&R>_6;fSUPPrxUvHRYQuVpSTlqpW)6&wH`e4TgunQH$ z;&P^LOnzBzncFODCQXN^{J!+0&Ho)p`2(85K#+9s)XTE(%_amig}{iZYnME}OEE9Y z>PvSJn1c$H^dC@|(yI^Ow?DJ~4_us2aUk^o+{lR3a_v4Q;8HeX&vS_T=3}OCh?_4111B2CrM_d0BJZ2R;WEJjmqhUSgU&&Xw<@DaGVM{ML658Oo zIPq26j}7)ijr!;t>e=YkJ}N@M>pxBfH;L{HE=qTbYhsU~PfK?LK)B>{&mOhe@g9&3 zs6@91OOZ@8495(yIQJ{$)5W9CsVm>dbkE?!3^5*8PG4d?c7EPXu}T8zsGcq%@YlAl zj6s^4ht2C7df%&*KZd@>phmfIH75i^Pwt$(5QWC$Ujn%AC5u7}i>&xarsL!{sl zCj|b;U2U{{VIPKsDzbuLZVx(RzrD~NYX#3By_XDy!1rCwkX8H{_W#oayLLdZKl7~X z4fvM`tv_VL89an*`1tH51hJB5+Y5gl#dO&7Qv5-4fw33*i!m<-|G0G2{QN^>SPI_z z{c*FLET<|P)JNpqe|q<{ez)_-u2bL>;Z!8gKc=o1Zl#Bk;*-Y9;a?JMWoh zw8MGd>PtN_OmEG!5$|90600&KVc@-SBt041NaVUHPyJbZr++TIx3Qb28ZcHcx{&$C z9lqe|%JBX@vnTqqp&HSU$o)wTQEv8?D)z8>7Cs+mnGM2^ZqSFwF9Qz9ygXj{X^3CO zKFfO%V@a;;ylPI!`ZCjDr!twCM@97Q*-qG|CL%uT%Ua02_FEM3ILPFw`bv5tg zc+uahx-`G8(2$({fy__kE}7S=e|<}_As^l}Qy%6+a~H2zl{{MAK4V*E5O1N+$_WN* z!@OmE$3;fakrV#HR<1eoleTJAw*J!QrSK|))-s(!*7}>igY*?-yFwM)fA%a0R6i%Q zTc@yV(>(ER$qLhX4mm+W^~~7jze}dcJ&`%?h=uBozq}F@WV$N#(VolmVtX#(1D!Rk zuFg)WKKi8DbZP1rX1&+-!xph8&-waJ#aTf@?u%f>S$Q}bk`$NB0(a4VL2Y8QBxh-J zq0jB|)1kn+iC*q61A++8p8YoY{6}`%+4<);IcWEwmEm5V<@0{W#~x4|7mNWbbN?RM zy7#d>CYKM}b58NnQ8wKRhkneeS02|#j)Z$+wwC3@cJ(__mAl(bl8CeJ?&D&sxpRwI z+Qav8-7K!Q;lnmn!na}jiN$e)GrFB9^Uc`)TaLsQ zuLrEykj=6?8s6QS`ki0tK+&OA)NH;xwFH*AS;}_6&EClzwKfnGT%*Frv z82Rx3CmQ=dQA0QZ|AWT<-$_;lLo*XZCIv$W6I&;;zfNl+AX_I$){%_;?}1`UCXOIy z2cU@~8OI+#Mu?l6kgY8Uas$U-cSBhdV+%uJkQ|`u|yY%-C4l8r99ArKu zZP?hzAn89fTx9=5i20|6os|rd{?@Q_kU`R)45Xis^p}4BXCnX1k2aa^f6D%u{r}9F zjESw8lQ|jt{}T1(|F%CNuT?sRp*5O{L$IB^4~|y)w66gf@8-LoIEsgXn?auL3iCyc z?up-PTjOjFd0u~OwSK+A+Vg0WeGLU=IQb`sbJEvB-Zw0-cBv9|leP^x2U)Fpd9%6i76iE$UwTH7bUpELr zzE2_ZQujyswWep*SwHTO`i$jg!kO+v@Q%Qtp!@!8-=y%_L&A!*$IDr@3$Jf`xE#K$0uD-t4^DKO}z7&DSqnmQ7x_hwckNbA> zVSUoOIjfr-pE$w5EId4~=pVIXP_O>JKF`m0eXsYYPj`2Jnm>|xs&Bt~WI0Bo3K=6> z^xaU9HaKF@o-mM3HLDUl&WV>`q8_J8@^-?E#t=L{Ru1ERc`n=;vmHu1@Y|Xxhyv^$ z-H9Ck1|+<XZF2>-9(^kx7T~)=#A|pA8*bdm@!f- z54;q&8XoIbr_12Z!z46rvCOa4+JGan^Sx*B#Ca5_gc%m=7x#Iiarg6K2!Vv|SWCUF zX4+N9{I*wz@`&evg~$+S`8&8ry2@jU)BP6`c%N2w2@bZoEhPQXK45{76^F;5b0(m6 zW2wF`Y0He^LlAW7R9itE`WQI8;MUqVnE3`AKGT*R0*Al6x+NY1UOYQqs*gi+@{A#F zU-L-&@eFAQ-jsI405ci*sZb{0@S)eIsD@ZRH*m~ypG(b5;Q?Lz zizTilYW%$^{`I@VdpviMnA`dD$I|+^dL}P!(ikw0vE^eX%37PZeg+EvtV7>v;+pts zp0Q_)NWsY|cV=6gH>tbC?d|;8@qeC4`Qh6*7CB~aDu?8qQ2*MNMZuEFGHp}~1SDE7 z)};{awACiF#D65nBvi}4vhZM!4h-oH1)UR-AvhPnJdwN-w>_WS`p(tQe^?ecjq zCGL9ID%t4!KqUQ2RNE0+%r(5sTGOsz&bq0O6jkCrufX-OK(-Cl{&lOrZX<#?oI|Ff z2Ye%4N9^&7sg?6Ju;cx^cEYzzFP5@f)dhSPFIG32*nO+};{}|yQ@WF?^{8!eEZvM>0p zJsf3iECmXVN8e8O(qQ=$SdT5ltlwHsK3a=8K1h{SFdT#C{eK0*cBU<9FETzpcF5j2 z?BGY}j|@aQ_&k5%hsmxi90f~d)jfM-%Ty+&1dn}3kX@Hb%`k%(>}75xQr-)*2CdRY zii?D}yVdQn1!r`Z3UM1b%SfZ9))$P+!klG{)YVvIq1H?dx=u&F4ByfefD6M|?Y*SG zshB>BRg(qHers5>IWS{BpPwiP?k(Rn<_4pf?-`YL6-tiv?}RNy+uR5N`|g7)llF@& zGW4$bcdJm2SfAMA4+>5j+kK4MWXo!@WSkmB3R+d7D|9Q;iiXLorULD!i`*G*LSid9 zy6g6~#|(N>!`>^ldLCB0JAzskAD3L_;gvm9Z79k zTdH9is35<@IB-KGJ4{?JpBDRJ*q|20rp?E^tW)D8E$yUanz;!(p^C)#w4 zVw|yBi*2WVI){*9M{YH2O4eCD%Gx7^S0I(9p!eD8)Ng7nIBh_jqgLaJ#6{}{uGOa8w3!JldcvBVFb|{X z*lqCuwi}Fmw4XYaHz!!RqB9#DhMw9>KMwvqaCT+NI$^^< zbBH3#dFk0}b`o@G1)qrT%BMc!7q((e=ABQhZ1awt)9p*HGOd~XWG};rkmrnx@w!^3 zX+Bu9-?>IJgPKXT2!CRLYJPRh%Q+g#HTCV+S{8ny+;Jryd7SwJp;NDH9cQ=YPr-dt zyP!Grs`2-~$%Qk8nJ;Bdp@_?|hlmxc=C2tnTduOXYd z`ib;Li7JtL*(bu$QmYC~iM)V8+`K(6`FV(@+r+y&n^{DDvV+hz9@yqEOH(Okt&vVM zP91BxRLc=m`!(pHNNYK{%)?IyiV%8^*6D}y_!?~gem=4q z7TOErJTluZ1u~`TOA$JKPF4)8*pqn-DXAVT7&a;IGAea!3Yw)fsXG)egnm<#A}P&g z)R5qsaA?xJmSmqUzqS}(2n13hrq*>N%q=C_Wl%#U8C?Ko+gc`GYr4Aiq{o;587OUOl#>aS)q7)WpBL83N2&a*9NS}07K3cal_wIGC=G!uv=W(=z) zmUTdU!B&(^6Zc?(ww$KS0(N|=$UkTQ%HR90#3E?$*;m^T-cn7UhMK|(xepCwEjYKj zG3PFExO&sH0Jr<=?vs!_$;a#;*vgC79VoTLI@t;J)xG0yJ`I#@*lg-_&%4xNGE6@^ zbvJgH+sxjZWAu325O(O5ip@P05aic#@^yh&QAU`$X1~M%>^9${*;1~%48y(3PCfH| z+GO_pamLq!Q^E2iTG2kc=K%r?-mRj;>1Q(r4|c(Z(Z{S-;5@lFq8m+GD4W^xc*_!} zX5iiN7wp(bF$Xi`aNAT-+F9e`iG(77H#7_B$(H7A1B_6HRp@!v{PBl~faI%cM70wJ zc}B!(tww7TOeIVukBgb|xbxgKGWHIOb;qAa6oo}0C#@-8$O4f?^>A#1-v(QmMyK`> zP8y;wrh&ba*rgE$ITdkalB{nf#W8eF2l4D`09C+2u0qot3uLbCT3$=KqN!ev*wzD+ z%2bZ7b`FmozLtv3DN`Q-1@p3$G8V?=T{h=X93T6X2=Paj&aMceh23f7^&e9L3v+T& zhH^+)WM^-fs>tB1tBobxK~>YoPPWy6F zPuNFqFy$7#p&SNrdwf{1MI+|)1|qAASggmy@Z~DRkG{`Fk7{UZQq)sb<|^Ene4(?w z`>L*D5p@;{vO}{M4o<2`3%SPyukw^Rp|9zCj=pFim2F7;hgLsyhex}BSrwusRwa=|` ztca=2OJx$afJ6TQ+ak!cxbmK0z8-!g3!%TtDbOKOTCKjY60Sfz8D&Nm{f-#vC~*Tv z_JCvpToFqrztB0ZZFohbW$09o`C<6lZ!yfe*Hyc!!cO!voSa>B`C$OBU0C_@cqM>LF7I`MXu5pJq;JAVv0NG}1TA6LN2WCsp<1&mm(! zRW^RqNMbn#1g7QzM@fyyVHV~%#ncjVtU~YAb-B*5YdkSy=KOQA?jWez4d$OEd9y%vbP8%WYbS5hNo zpSK5{8;+5A-NH-WD`U5M6MdA~b%vJFAGSbqU*Ie-P}1Kc=bNChGGF(dq1_D6AxfH( z=9R`RB8EdaRw{|K(9-T}|7gp^41fGf9N@(&0Mr&p8w+)2Lz=G9yub^WG#i`qhm!=54(crK%%mAnSiXEG772f1!UC#r{V?3Vv=HqY_N0HfF}?6tm7t_&5k_H~ z_nERzMieP``HB-I`R7v>F(>DTwAd*L3uGbWbo5g@ zbF(x_&Cn$-kbU*0EQ(8C_HV9`iu-s?KCU?=ColQ35!sfAF)13!kC<|mN3$`lDeg~G zV=*Kad~9y)1y;*TEY;y_F?3O#9aB*b4Coq(eU1Dp>-5Y{A^J79Ul-XnLX3oupw^T= zG2?ZUSm+j#VJuY`b~zmyh;FMs@!Rc7J03K8%D}4UaE-=f2u-0vBJcjK@%Q5!zSQqDB3ayyz5y<4& z!P?zXcU`@kAKYw`WI^D1SaB|sERmf!1N6&{vZ03c;2VDvAp|88RX-hVJSAu-Yt|O9 zB#D0DI~E9VUz#So6H^9^FziXeMiQGyP%xQe(HB(jg+k>t$@E zn@Ek>qG0{&1uRd)nw6tA#IQxXFDgHvg5~>$QnSBNDHim8xa9BDGP5SZz&2u<_9N~T z@Fq}ekZQdRoktp3locPAs|Vuxo+lKc>YEv_cr44qFTZYlO%z25uH&^WSBfoFwqrb$ zE9e%9PyH^sfw8;`1Me{wK1~*`vk%o-!3?MupgQRNpy+afw(4eprCqh_lMf!QkUx)b zNf5sk3dsnCqVbpFcBfn;s#&=9Ia3kVTqV^}U+FS#rkahyH-9akE4o#Gh7$@5c~%^JFKCe!C!4PL1o4hO9_8#)*E& zfko@cEom^%7q#KiQJMhy_S-hj%*L$c8{MqM_?8NLX|>w$i-MMOGmJwe zW$}1y_Yzp-SG;>N(L9Rgi+(_k+WL7Y-h%6rUep!t+B!4>mg!I<%qqqss-WDAwvl`B zE^2&5x0aeUQK4nrnUMt8iupMbAVk}iD|0(cZ;Wjtu4`Dgm>4D${%n{UC&wKX3-hVm(KSR|BJ zbgf7~c9q4>hwJa;4@7liiL;70;j?XpUnsLJDPmZK%S_Pl8Vwg1utMKxfuNVl%z~Nm z0pTqfJ9varoUmP;U`s8=kC zvzs#;Y{;}S!0|s0kISSpEer+A1JdQwV69zb`GK9puROaZ(5Zb?#K10-I`HOjKkB*| zh*PLU>|+qVAe7Yu6k(7l_8811!mxTAPDhY%URVG~Cc{=m;#Zg4`i^}XS^)PBEF6G` zMY@0rE52?E0|ALo=)EYr_nTH=k)~Z$3fUZkfFduZ)Tm?B#+~=$Qxtn&DahhCE|GSR z47`_#Sj&ew@=~ipI@C$M>>H!Z$%v^E*=JL+)y{-l(c3qjlc?=oI;Ad_ue0vCPU#3b zePKt4;`;T4yqhVlc{@ui`)jRKIn zd{H@wbK!KNw%_QLqbQx6iKwZ=4AjM{cF$r2@!nW4SK}-7Ieur@sf!En`=H zde>rJkCqR+GN>d zDfU}*Y{)ZhS_gZ8M88Ea}JM1q=ZAv6eh^j&3%u@asfk%U_s_g zLetCa47?D4e6cnsr?yJ5=XzxXfTO_THl8|-CLmEu<);~SGpx*a6yJj_kz?u?jVH<8 zweYCAXl-9(nYnbM(N$4^N>NR+TY6*WhXr1Ey~cl-qKCHfI@pOz@l?xBgAqga^#+#D zH7*Fu9XbY>8Ss~PBdO7>P>;t;d;rLxuRnuzc4?5DTM_1lQE8)E6!fLjN)svE`EAJY zJ+#b8zrkzMcus?uhE)@SFpYA>9iR_>_-Px!0+SsGcg`=r9ny}UL z%#-bm^}na=e%c5{#kyZj3#7oc+`(SPh}OB*dHA+1-St!Rn{)qOD-{vG(hmn>4sgDW zhR2iJ7q^~;RBXqE%)0tI#~&FOdWKtlL|GWo<|eM?FG*)ghNm<3Qe0Ix!|#jb5!%m1 zzKulQrB_E4ZiDVV4J_TAo{4mgbaBK00+qXvmK7}qWV>wCtc7MrrWiJ`>pOgIous)Y zt3IA4yMo22qv+F>yU@XxMZGsp-M^_;>LeSocQu2~6YRFFQk50t5hP|a@C$bm&Sdq_ z5PYfn672LYaU_?ngJbQC5kK>h+5;QV7Oa0f{Q_&o7Vcf=>lB~9+dn7ja@^rD`p{VO zQQ&6;-pOMdfx^i_|Fx-9_V|0Yx2yn9oT^4BHjKEBHmmO#ejsY9AUki` zE_h*&=}A)$xuL=A9htc81seNx{RnOxPw*v?0Xykr86g7{zL75skJ(7w?>B7S5NQQg zr?fL~@aAz3MjIjbi;t7Eo}FT@-R`q_=BMmj4CgGI zK=3pecKB!;0fW3xuk`mC=Av6QJfIxC*j7j~UsKobuyMijj3J4*!dOYA9l zJ1RwK1$O`kde}P|7a<)y%fu>${)@qp8d$yS5L5 zn&zjIScc;mNJfmsx!LZchj|}|F$jArt>y20Py$ZKk4~oD@6s9rOYRR=F_C{;*~AXA zI~Vk(hgm!HCHI~0pU3zAs)oPGnue#}fsf0Y{5(85~}MZ5ic z`tT`UlQM5GVD089`gGBibdT6)cH+#}PotqF&(F*Hb!XpYEXX&jfm@qFtgqgFbz_O^ zW(fWF@9RP8_BQUEn<9lhqP3QdWmp75_NTX_h<8NcM5=+>ffO)U?xeo!XE)flf_;tW zj%9JA=_$_lsB70hqXL=>b$r%~b_W2SBtavQru~#~nxGBEpLJtnyib)$=wh1vj?-ap zNz-79c}eUqOaWKOJu3?(?lElymTDHJ9dFK=@_2yd^A2je$# ze%U1_gwHLy6|$@%fAIL`exiPIy0(G&$3c=*( z0SMf8U81fBpUdyp@o?obxZvF8`N&d#rCqA0@9@oMueOP#fKGW zW4UF;@SC=bt-f6GPZ5Eay!3I~LQ1oDxAeq3(1{z{AHxB;{nq;z=UM_qzU0VfIG(;z zqfuK00Oa&9!HbL8<_+|L=OSduO ze5uF}-`-%|!#H}#saoWtMEM!;J`?OB%EI)2lPu=%nt!*|ON>w(yvY;H3Hp58`kNRp z8oB~?F1)ywz2-A8(%oE8nfHbwo0uR02!k^peQ80tnA#>qs%?u~))&{(AjgQUY=oSE zf1}CQX6t}-5D3Go0p&JoA+bLp@ZKU*vVNloNh(J!^o!j)XL_(O4XM0(o=&CKyD((t zjjzICEZ^WsS;@xpSPa?^>PRFr@lQo%jk9Ah0tv**Idv&jKlK7FT%hSAoKC2peF zGf$GIio)88aR#TPY;gWe!>B;nnCE~~Lq{HdQ^V1dUjpn2_eUeS6RnXn_XcgENIoLg zw3?2HQ`3%Cya$-@6Twac2WElzc#J?pCB;WwJ2bA{*ozpgUV-ST4lHQK*jbcKXP3`6 zi`z37FHWo(m{0r)_6aoZVbxgAn$-#T`MU!Cmn|hd!Zt}797R&Ghd2&v^>9oFsG0f$uaBSMC;+01!HFWI=Ola_bze!pe0Xm5%J{Fyjj!EwP}oSH;= z@XdTNITe`u&;=dAp{|(>^NpL58qM)fsj!!ON%WY*DWHB+vD&UNE+{c;d-yCW`}LyEo0C5x-ysUfNRPP6C9 z+cg3cL=pzo6aQ?K;va>|yd9^uz?sUGCKy_}geieqXngMH{E`FzB5VRhtm+3CC`OQoOjZ_q=_KANfat$mJ%FQxt zx9nI*rkV+kBkucyr(qGWu{y`woyFmTIG2P&E`y1D4}qvpW$c~;`3|_qV#IbbnG+R| zD+w5})!W48ju~QxQZM-(M!fLc=w)h8h)muU81FomEW?&Hg|%Jq{OL{HC#C1De%G(&TTB>XL<% zMO}77IzE_Sb5?Uu2LAI>L#5rzLEZKGB`mReD7BNf`EJHh-aCwTa#D(v=YzTx<>_B6 z^)zefT>Tu4Fxk~?-aA5sR3l!0k-R34g2un?9Um@}vkT*o61S2$y@ulJXXNt$*IIf@M-ho7Th`w)R28_9u+%(~vasTq zsX)|Qax|iPAITDUKllXWU~MRir23h9II?}8hs&@JJS;;1D%?c45Ypf%JekmF^lH2g z5^l&mXH<4}JY8@x0N#Fx68OY~AxZ8xNNXLlU*7-@#DgE)Elso1~`@$Pu?2Gg*CSbFkr4-~R#~RN} zH)*{@dtsro!Wx6>ic@qAt4?$=QQX3n@c#Q(!;v420t4q580|#&=A~0S665taqEoE4 zTEoCp-oe@+K}mwFEsH=6hf5ZxRex1D_T0{_THnN*(H2Mun^XTE0t0q)_D(g@q%|OuoxhR5zZ|m}F;9gIDKn z*us8pZU$CE*V*-bMhI!RTef>ISr$h}b5jo|@0-HIB8#QF&E>oMX2WYykw~Cr_UXZK z6FP*S9`Spv#|T#0;dk;*=r`fT`>W;P2P@3}n%8WGo8Pt7)CCT%B*7Wol*$hBcuLHZ^A2>A9#Ig*6Y-l#CXQXr_2qzLJ&3 zH}~$=Tm0BDFh8}0IEH{V?*U(81QW?Rd`=YFgIzJlS+V9^38z3UHytOdj8 z7Wb-=QIAN86EWIhVAdEPJ7M8QUZ@^bVh5ENQ4JY8y=}tdz53|@)0;~)m<{(}HMpQX zFL6)Trwi7v6vA3vcd+pCYoe*=!1Q{q(YK;AffV00q6*b%PE<=ed1v&Oy*OoXE&2zt5QO( zH)CNh2=j!NjFN*;1lxVn)?Du@$zR`!&j+wz{*DQi<_BxwzA!BFjj!sj7bHgrqM=F1 zl#H({CmwR8z{%CD;pw^(3B0!jWXY7Dp20)YzunoweKPpEa(>*5O1(h51~x|HBa`-; zT{{bKzv+?>ULXebyAV8|H-Bsc%#gT2<;qF($`xqw(mZ@C73Ps;w(^JVb!>7#9_^G! z!nJqzKLCa5qB`f&l}-}PY2ql`pli}&njPyL5^TW+9M_*sCJ^`Rp(kbY`MKmyiHIBR ztb2;wlD`u)CiRqc(~3OPoE@&%enz`WbKW-tRjjA<`!zGG@>3@YTmr zQ}gm%)@~=$3s0k5xknxDuG*-26NC!wMJz{XY~9PaIId)tN+XmpRqlgF+h37e&QeE1 z;*PZ0dg*$XP6bCl5~^f{h~$ggXHzYIjCGSxO*|WH?|D|QRoQ#-&WHb%F8$z-_XL_J zgtxacsh-fX&ws3;Ki_PbDj6aZiZ zr#RU?S}<)_et2TAe^;sN->@7TVTd`|qehevCE3;#m$@I`eb*HiOxRrR#8~{^k2kSK z`E%jCrUYu374a255p)>1D)5LeH0;Vt!*}_NJp-|%13 zXu2yIx%Jn6TK|Rfa2+6`eFs`zEJ`A%>RDZXtzBMe0i$Vhzo4O>x!$?Fg_)MDH)HRM z&iXjumj+DsO~-@x$#jEX#fpFO>n24S8v4-|00c7BX=~Jh9d$pR(Vbku`;2r4&^;3S z#9T_Dan;w^G%8qZWiBrgMkg0-x4sqBR!oPwnKxJ`jU3LXF^YUm!Q4Uqauz+DcthiN z+_*hyg9^F~eQPeAq0Q?mhC6~#jo@U;B=b|UJ_}7%%r6MMP4o4;7$-dR{dx|EbcEt) z@1+uW+n}u1z2$-s5U{yDEAFIcPUF*LyS#|>>|tlc^we4UyuIv_w$0$#gu+q8}+rK^&fV77^|4IB54Q-x4ZA3ja9K};Qdsjen??vml|UHn#r%kxP=O(sI6eG4$~KG_pi0(4gWLBezanpn>k zfY^VPu8lRhu(#R&If2cW=v$X#2sj9cq zmK>lQkMCQwesIX(=KvO3?Y;<68^-8C8Sci5j}Fh>fK#c|*3g;eC);03_B`7%W9&12 z*E#!Fuccf@RHIv2>(^}~{+Lz9FeFr}&)alscZtOZbmz~~hY0;3-|(~t*J20UUl}Cg zK3t1*1!Xneae6JGbNZZ=K%+Gd7s?5q$BX%P0jvK)79{uK0N-0s^K9`h@NBf~w1 zGEb35Tfi&)15xENC5d^r8xXN9Q*)XH9vsPCb|gxWr9XPK>f9b4We_caeaW^zQDu8B zlDi3o>(Eb62(uXLH^ib>x$paWzUMqQy0<~@9iiLaL%%Df(9a9+B5o{~o7+U&x$+Ts zk9Av*ACS$l=K@z)b(b1902EO&W4Yx1*e+chWOxegU2&+-g^~Xy;%l6c45srEDhRaC z?{Kp$s6h|l84`RFZSRvf(ciRA4)!luZ;@?enKIu2;(5|BBAB&5!06lp$A6jA>Od-!ro$o-;c z{p6yB9D`mTjPbMmn+!n8LE8~;;kfjJcCROD$Fc1!wQ75}9 zE`>6GuAm(N6i zj86&M&=Q5cm1m?5UXl&O)b#06z5T`Ig;l7k(6aef+vJA({ejuc|r{Ge%!3DqyqCDB@r+`lZDF?xbA;y8kVq2+~Z zq&b5k^{hSZOm4BF%i)Ndbr~)2psC~b`N#S}d}xtL!byc}F90hZZb_V{tIn#)!*Sa~ zb$?ND#9XIWKrMrJq>?+i4Dpj2J?dQRIgdz|H)GrD-KC*e+j|&?v^TXIRSnes2I+8_ z$s+jgibNP!slG-Or;6qos^7vX2vHWKcNQ3{_||x)9`t|2VPf%si|RV_SHDNDByK;7 zu+MZpJmK-;vx#LM-C?jJ6V=-zF`S#>K&5>%`2`o@VfQ+) zPH;ZKO`Hg5KcZ(SppH|tERiJSR&KktS~B6GM(S%EaIRDE(tp1wTh+{`<4(XC!ZdL_ zG%K5n%l2!96i163^-j!~6@QCvaEEcg5%U>)ArNjirbrE8-Mweq&gSJsOJy9VT5seR zzt*DWjqBB@Ge9#@{WvY$jkE~$fnu+-0zLfDPZN89un9j#8Vy;;uQ3E6{3aj1&W8xT z?Rsne47qn>=5d?2?fSIgyxOT#mXO&J*f_&u13 zI(^vie%RZ?hSb_D!vY2T;%Kk%ojQgWKV#MChDqXp!16H2DtMZbL zon20v&R-X!X(W(uk4i33*G#e8(a$w0TDEQn`Oct>v@pPmI8CmSDJo_ryzcOjhr5(q2dpRn$NVX1eU#r&5mc< zJ@v%#cCy@yPq4mo?!OsEZN)yka7nIi#Msj!*%vuIDl^zq zi-%Qopd&dR>6g`ZFyYwgQtXX482}qr&x3&mN{q&iqaWxHqCA_myUKY&8+QQk+$L9E zQWjz(-{ztzv|BFTbonp?fc8z!b1UOMGx$Y9Wz%~avp}G5I{DaU$}$^1$nw#|PjA19 zNIvVv(1PU7I+-fuZ7#kV&Ic6M`fY`gRAZ{GQF=O$zy|Qr=(|s_n$!EnHYPm)NIJa1jskp&vCalVy^Zk$A5qCGbOTuJDUv@Ydm zfSB9~8Ln9P#1^L4DW>YuLTk z30i-HI!f`jN{3pb%GEe#$_8b6yC&pg`#4ii==fYtmVEq}9` zi8!;lyAw1vlQJt`ud|hnL>nK%axItgy|J8_PFyTv!TUaYhmtR$+?>x{=wDuwPAUQ7 z;1WKjEA;O)A4@|Rkr)FtJb=iA34myh8i?!+J%LkgHH_2_~Vr+yaTQ7#a z8kk8vzG7QInPA3f%#>%W9i5#O(b;DIDstaCiVG-9C9yciq1^X@lj0fk7V;@oGl~To zE@T;0cH+hf<$gMdOgH|v^u1eKdFjpY_eNk3uW)A;F^hg>{LIF2$IPb_zbxVn4jm^b z_YHNkM(8!3A%43wLKj81O>@J#3kZ|V(NUQ?Ee{)qml&;TA!)4wL{G=BU zB9rhlAX8J%S*!!;KAUc#y+w_M`I+NRi%XVpbCcUMa#J;=3AADEF+F$r={Mz@jH&hO zst3W?dH9U@UF&cw07d8nit8gqf~r-zIyI{1uW-v7W*Z?;=)*=*tKI^=oY&bzqiweS zY9nJ+#=ton>Qarzj-Qrwu>|BmcBg3$!)sfWc`q9a6+3Zf=d$YGn(n(Clw}rQ$qn?> z(nmZ?+m6g{pZl_y7S8b$Q(j8tTtB$0M}=A|-83n--~R;JXS1;>?H9FSv9xSHEp~Vw zO#nSzR65Y$EolSXnfIM=HI_ZTOB6PvFdbE3wA|v#eMg&>U2+)yULQcU$BD#YbD%l^ z;>4t(5eQvcEg4m|9LhZ*DL6}eAn94Z4gGFDw(1_vrA$IJ*P6L?u<}{w5%17enXSd> zXP841i-<{yfX5FiXH{V$Y5pubzeP0(p1iTd!<$?-4hvzkmQiw_oRjd+!4od&z*yLR z`L~;@_w~ObJGno*{VK1Ti zSMi_ZUYi9e6!^#D(t7H`TX~XVQme_!+v_67~`R zQ}OPsWU||#gG3oub$F=FN!TV9w(WD_xuKeX-mD;kSB9gqN#oCB6JB(E1s-BzFt$ryWZ~nvc&%)2{2< zg>BG%DgRzj+iQMY7sOkaQrOZk*1C$wxtN!VdDy`v2y;ZrxpSSF*OjWcA zoUnF;R}7tx2m!Ep%wLA3g2-2=CA*SlIx(G}WseGqPILQyEhrCBo~*CVXks6KsGc8! zM@(}*jkz3{rJ*m&Aeqs&H$bW=h_2Ocfj7c!Dz>I4$*WAx&uw-beK*IDZ|7V^nfbIF zo{qVrOlI*>GBY7}e+F7?$1Gt+D+s4%h2|SWqi)Y`r@@ z@T$3zaiyFKtuiL#*VvPPv5^d`q-c7Nrs|X34ZrNS?gNlKW)JUkh2V4BrflGquFFZaCI$^_N!owtjx_&qb1j||>w{1CYW-;DHgiBOT_asPAz=4(}Q z;pq{9XzTFaV^tAcW+7AfUe5?B1BlnTfkWsvYNJX`#QE4@Fi-b6C!!0h1KL|filFXs zQn`R9O2nyxSC+wBqSj~fZz_n-Gf_j z3-0dj3_dUfx8MYK4esvl?(Ph3gAa1&yZ5d4>&%*U*6HfqySu8Zs;foQOeLNihf_1o z-u3a(7k1q&tF9eL6LT2TYh=ioW|(zZOJ)feG7}P$B55zdHPDiyVdDNB{_Nd)bf2FR zM7)1(`YqLfb)tkFoqj63R#BBwkeC`QvW_moHsrxCfM!2TEFdmuv52steFTz4+&_V$ z9Yk+Fkx|H1cSXH-4c2+DnOjU`Vr@LXbb|nWK1tf>=8H^=GKsEam{-0^EQ&fZItR&vXxT=2U4&;ly7nkK_ z7_j2mwe<23&1X|svBL~v>;5ffX>6gbO=UcQiz53yt?21x8^e7vIdeRChiz1k81dBC z(a{r=q#%^~=`_V>`}D_<7Xv5H*B#v;h_Je^81Aq9JRl+K9#*jtE0TbRxe;v-=dzD^ z2Go(CwrnF)pV59AY@0{eKIYjrFQya7mLJrLNDg)mb+r%St#UH+iH;-!B*b0bLse^ zt*xa?wxOTurY_^;*&C2CxTTaPDv(}mU8h{}3OVo#MZ%p=ZVUg+OAvtZFH=%N9+VwT ze20T#Pqp#(-p+?1(FoF35>2RLORqkcn&p&FU16#$j)BL~XgUa`6Qt<-!OKjte9;jr z8~962&HKDZ+J~-9d_M}w!If2~er_NV?v?-}n=Z#UiJpojq)uV>X!0E}nX{5{`Lqxuzc znESI8Bw=+sl#155sjyD&Qm3P>dykdvn-WLL*9P>~++aSvDZRf}r8$wjxCkOoU$UIa z1p-igoNDGLa=likEG6P}?@Vr@kPpXfUN;>R#WB=84h~-gF6=irE+sCep*n|2_pcM= zcMz*R$N{nUpMUi9Zgj*G2H#R-VK)O+5R*(YJSi5Pj(wfUZcOtl_n2nIJF5*=FN{-t zJ()bo+}iAsRJ!POf0)L2?%SRb0QzPVdXi^*XmDDU<$2B+mk6~gl6SIHaZ zZ>_7>t1LK2;IpsrhqGajMk6wf>xVu;=++UkW8gQQ!^Hy3`=c%Z6di33i z#Y7Mx%VhoI5(}zv|DCmVl$paOj9M_Ub{KJ1J)3HYDAY29v~L@r&{8IUvpD-}?TlVS zzCU9L?B)U=U90X$Wy8f*>Fja4fyqN|YQ*L!E4w%*1~M{2Fu8URW(%lO5w7ztqaj~8 z4y3fgd5!4`5~B26MXPk;{?cuN3Z3u@A>qTcU1EHFSSRp3y%9BO8;~9^TnQD0wDqDQ zyN&niJkJFZY#51_=%enY+10Ww$a!lU@U`S&q~18c6KK9K%rd$~<;Y5j71%SrP0$#N zNTEw$jrmht{8f|Vii^^OGIS89nuVPVvb(26VJauy5P z17g;p8;{|&RX|t~=XU$G6Y-G@NRgz{9p5@}K94o$r8RkLy(f_MN}qP0d;)7h@He$c zCTm~)G-idP(oj3y5M{SDI3u+zZ$=P5bT)g6>shvd#e&dND}5dq?=-i~OVf~8LrU<}R73azTqrPc`lRX#N^N7y%J%Q5 z#FT^>e!H6@MB3N>>;;8*%wpkT?AeN}u->;M%`t5NOt|$sQ|M6l;U(YA9J0=F#{AlT!v=ok_>AvLL-764l zx7{oDM-fW*mw(A`iKykvX!XJ*X(3T(eyYXInF_nXt-wYlT%oqmW18%-4F!$8r(?7z zTrZqes?*Uf3GK-0P)>e{bs#okan_$k(ZQ85=|TBBrTEMZ%5NYGNTyY#lgvZk5-v9;fHmKQ$)@N~9k#U!e3%Er}aq&7%FY zEHVdwY3C53Qmfv1<0ETI6$M^K2N0`|)Lv!!bWqJGSSHjYmqIQAu>-VBb&M z$~nK*(Q)AbDZ7I<%`Rc(L*5zo6_`AKAQ9KdGizkQXm! zj(GOS_0zSP_eiiQD4KoL|O!}8*;zPpOB_^ZzE=4~uKa&mN^%3 z?nv@&JJ#!wQX;IaArrJ_6LdEsYf`7i> z{#+X}MVJ;9lv%yVbawS)$a{W1zEi3ZH_nQBVWv9ccHN-j6QrLsjxMhzEnjKy^XDdm z5m>@L)`!C!+Or4{LI!&4cK&Lv&g%B2DI)T2;Bnz{Z1ymfVgd<(Sby>{#W-G^p3)!;k>psX?V zhiejxNK8i+-D-ZPhU}=5h1V{l0|A>V6z@|0mCKCEm$0IKo5q*(Fb9iq36`^?XTRf?C{l%T>=mYR9t>rZMlhn#zTEz^z;V%6F_a8Y9&@Nc^Zh3a z?gBFr+k}7Jy8bn8G;i&BbC_JrxDe=R2SE$i!C$J-MQ1D7J6M^v^gZLiJrG*>M`TB>aMc(c+x9u58EfQ&h#kEBaiZGttS)|Ms&e)V z_fqM)QY96Sd}jIGN3iNibrQr%U(d@PuYq+{-2LOUxu!s)#4UfUybOXk=}#rOiCB{m zw*FMViX^ByAHF-M@SCi;27T>hRUW;LMt;+7us<3F!>h!lqObwx$2c8*ERtF}ooxDz z8n&r`k9}i;cSKtP9JX?a9jAv2k~V`{b_a=4@0UZkTOILuQnmu`|J5_S*eCkaQS;@| z!7e!F4CAf~@C&r#Mkx<3nFUoRZ1OgBenzjsY+qI`a-mi6Y zTT$g8CF>4CKIiqq4DJ2+^!a0#=54j>=ikRph1DpH%q^8;5ggnJM1=*?ajWq|oLJ_PAI85i(>wEhj?92-hgzOJbZ6Xl+0{zrU2?S=JHVsd z{nbpUza#D(#4%C++PTH8OMem6bnPR5-)6fw;{g9AdVnA=#OS3)Oz~k6dJf2Ces>Ub zpTs^t3-{4gCv^8GEp^jVRCT(7d)4`*r)TaDI^Ivk@b@i>vjy>0dDFI`=NAcmeV?UJ z`+7>PfAM^kL6zw;zgt0_pL6`GI21JBNq;~yPNVy)peLY`AlX>f{cR1Cwj5u|$nqFB zq6LXl{hXrhaJW|ZCu^S1XJx_LgLs8us)^-(B}`MZ+UXX4Pe;#49$n69V$pQw z*k!H~B7cUo_ymLP26q{#Up$lM#WhMNG??f?zyG0YJZc(YVOhcpv$6+?HH;)-Q=Gla z?oNyZ0l}sHtM7_wt;RTcoJ|H?F=gj?SJ~j4dXVq2s_zs=wxiq0DrUF#TiFcaEk;Ch z#jWIKjN>*$`%Sl}B=*mIb34#NK+}0MXTIxJ(n?I}<@=xJu^RLtJN0|a1N0Cqhxfpr zX^ZPV7CqnGK8E{ga8_qgR8C}MQKK_i=NS(ZQjaIPrFSkzumPR$Pr@-BLQ9$7@Drv^ zPS4AvX9P3@t{ zbZ!prtF%Rdwa&(ZC+_agYqYCT!02dJRj|+L+WiBoeAscom`FnYsfV|nigDd4-=DGT zCh`J4K0|o@j_rgS7eQ9Fpo5i9JI8!XmpY{j#@RTnF2<=$(8KqXZc+zgJV|g1c!3Qd zC_s(t+Vgb#mfyLe!}T}~;B-YQpNJ+rn3nkk+2@(&d_R@YO zh{ANm+BGy)Nt+<+CRCPy)&B=*3#(Q(~p`HVRj+xn;s=MU){mby{1T zB|3OaB`)wAoSc63foP=lw65bA?+|KZkryC_hRS`y9C2Z5x}i5k}DDS-ycT#MPc)WmaElOHX80Xy#?$P&NvS8I{>anm!Gh!s=@%Lv44_Xej@ zyUV3siOFdcqMwk~(4P{&9ZtDAR#9E`n+Ta7pmm)~BF8Oq*L?{ zYNc7Iz8fx8LaGKYpza8*+An{yaB$5YBnHa=~4I!#v5N({4q@$X6= ztVfb{Y`plc7STiX@8_$MaNxF@v%a2PQ{VUC#FxZ^s_c%ulxQ9& zrdCdU`8dlZ?UUDFar-r__vwIncFNKoHN8JX!+C|F?-B+lv=5VPE$6cO24~~{9F+$D zD^jfQmHYP860cyj%!Bub;mlZitWEfIPnvE*B;iAvyXfqn(-#muZ7|b#pucUFMuBCE zd5xV4>;jR3nznDV>*KW;MXB+w!Qz-_M5oH+(666_jtfv0a_7|GXreXo{rb@Jzx5vB z%g{0@am18_aO&I~GYwn|2re$mxWC3MYB*04v7(z8&bm7OEd1j3@sf}q$8dYINB9g& ze~aeIMiz(iEcCr{%Mma98JqZFu(5w~(dP3#*^^2F^6!sB7K^$_+O)mDWGWHAS9m-d z%3f>fCdNLDvl@O`OmW9F5xWyOzxC#2+s}QF4v^T#Wh&YBp3#@J4ee$9zCc_~Hcifj zYtLgccl7yl_CR287iZP{SyfnzWz;qiPVnWxsLdFL{e1`o4|ZlO6yoRLuDALCzk#Mz z(UK$Rr281WpV2YUxVe5wJ__+O@SI=0Abt=;r3Ov*GC$n5@}YR8Y};x;9~9b5t9@97 z%;?|{N-cY6iF&!wv2;!C3XIdgCP1FxhrbmtGj(dE8C%9w$0*;2^I#qbuWeN!yKXdf zgt8&`^fc!&ov1uR2WN*?Js+k@flp{1OS%P7w|%%H;zS#m~{d7J!BYS8Pozzizk za=UiHpB}KRN8vDXLtD5C1E5X_nqoIgIyis#~i$k?U3N3HZ!l+^I)ML z^MzL%yNl}^IXs)YX`ed|wuxS+_TZ!VPISl%{KFd%86Hm~G>OGw}rTGQ-<0-|@Df|HPOuwfj6kk$T>U8nHLU0v{Dc zxgQej8BMbLJjFL7b;zA5pk1{ph5YD5`Z{HII52JgV8q8Ut)&0DQWHDHK~bvnWKLc` z^!#Af+Zx&TIZ;|mxi#`5al0<_nqB?~2xPTfYJZ#kqR&L1^x637io?FpVz|pI##9b zAE+~j*Elm9FdPHtdSF?gtz01M9*j=AG^o3RcUlNF3`v~l*L7r}ACH``VbrQ(49^X* zi1A-pA_Iwt`fpp8r6OI)tA*_H2Qa79tXx;6s6jdu1R%>y zBB7gpr1o8WTGr?e0lR!;-`8vWqp+e>XYUoM$TfV9OipFE$Ir9%ZUn_S_KcBtb+J{% zEZp)02sSwF3eR@8r}XWsQiosl0prm{NX37_R^)1K_3ga-u=a)Hn{`L5$g$?4E%(MH z{3YlB8Lo|ys*e3rBjNn|oHJ2EZc{y3d`_#=l~?1~ygz#Ro~Ky8pd~!_%C=mQq#nmt~>;JyAz3)J*Srn z=}TkYA@LM1?+rdM8S@9iESq5M1n*1WB6o6g$=KYkt;8E$L2#Cb&<;^k4`NMA zriU!RQ#eIh*IPlcYktd3-tFH?u}F^$yAS=k?7(6YBbH>yKTAvZaF+`uJ-AZn_r7X6c1u7 zX+Xy~;eB3{NsIM{_W{kccSjS)(7@jsbB@phMX!%jN zrJ}e&v+FUD>BPy_`CobuY%9SLEhYI3hc!P%P;e=S{CYo#vQX<3ur7UT8zA6jYF;ZA zp=oA%6fw#25U3;^<3Y0N57#Y75R>@5=3XBvF=@oE`%k9ZpAXBz?$m%fQ}vXIJ!`oC zb2VbqM}Bu2UKP>;$Zdz&0Gz~oS!q7^o3H@p_(j{bR_XMbLkZnw^e=pib!AU@yS(KQ z#XkP84O{~$iaUJLml5rj9ion0)2~CAin=LjJjqG3sw&~P_ke8qUI#WfIXqO$JG{ZT&?*0Xi|ozF2U1cY!@%*l1X}FXVJeH$ABdO-Yz?ql zYp{e}sq3CBbkOOSU;T!sFgL=I)+&lmw885@^(;)q4E+3%=8UwtU39SQShs$3Oy_P{ zMYPGW?H8b=%9D>HPh>-u$3*uM@tyv!)vP=ur_zt>zG}3vqK;v@$(r zf&x~Y*S$kdJ$}?;AQMT+4S|+WoV?+zPuLjuxJd)%RY;|!MKpJFwV03ExSD8^pV8vV z;Q6~=j@$PE-yA`ozz@!$EG38n=j^S_+w8nz$ZcZjZB|F5R|ap#QZfn9aI}qE)v)T&%g?V zJO(_C9lJCd!p4$!Ym%#`?}+NQ4+*i8sp01OtSWSRdY+l0^!NFY z8-g(5**4m4v-wI|V-dWnv;VHZXZ%yP>Tx!x*XQ4~y0bA4D$ zE&hW5rNf$>7Q1JyaSq)i|t0A@o*+X&=7}zLzc}BppZ;;PY7d_So;P!f@yJ&28eh>A{?;&g=Sq zH6QUSCPVhHPZ`4HI1)l@IW;oH!zxB&;?fce>xT7GC(Y+x*mvYou{>@)g{dHhB!Cs8 zjK$=bCd*NA2b_#j-5n}V=dhh?#&tf+ftKU7Ik?L;wCs;q98;w}*WyC437U4dy@^>r zg`BEf-QT#M;dhEziJ$@?9a6pyV10$Q|oO#R#VBoOs zWWHn9#xaI~ukJyYEV^5|L!gW6-DfB=SA70G^~8_K2XwB#3KHO5cT{iSBnCWO-jW2U z`vPWK?+Pe9zrvaYjO!Y&#@PLz$$Isv(n&KpK5?A~0gBjiF&7r!C%EjqkOd>L)^Yxc2_gw+^QQi>_GacJgH$1fJozZVyO4&3h zK?~AuKGi%8REl^%gboaOAU0V#~9GpxGjX7f=$(Dd5<=p8*y8&pcp^El3*a6bK4F)Y= z`S`Z46mUbKE3OmS7pAjgEwfQhN9oi`YONhD`E!;dZX-ln8Agw)H%?5^?lPs0pA^p?`b|P z%WcpBXtcR}aV01ETVxZ@#9&v5Lr$$-&xF*BSr$SXVJp?UKfUnmkjhq-A?D>5a9Q#^ z)pT)Xmmc+mu<`!Ny??kA!^FcHWrIDzG2^RR=1Me%=tFcon712d_4AYPoeFfE&EY`h z`JDfeF1TjRcmO@O{-KvydYRDR&xOT*9V17$E6y3hv_Jm)`)kkuQ%8fP)F8PeBZ$M| zUkj#MqdfJ6F+7|D{tT_erqUlJt#?gy`-`)mT=cDOTSOXHVCVg1COrONrgv+iSB#@Q zl<1GH;Yzb$`Z3&o7OoXwk7D{35pUk)_e4*Re29&6s zX0GZ_N9~yyIEm9ZzH3j6W|l?)qTJnxIy0rahhoVEO~3m({H~CzM}()>tzff@ZAp!FA1>hPjOqllbsiz*u&WP1JP0` zkh}}4IqF|g^r-|l&XGO($Cy2qZDnuwki9kTi^%2rScjzn8vSTac<`M9ti`n2PTSYAO^w8>S^@a(y0jrqz z3>MKxwGRt8Yf=G;867dsK6yoZw%jZCE37j@3qz;&AI^#HL}r11zE}M2o}d66DY#s_ z5PtxaAyUE{XsW*vL&!w9DZ#MX1m9i~dLLaR0b*c$adg}fqZi8^6u&i1#$&kib5@h}t5a>9AmAWMqATUdl8gw0V3 zMy9dcUi**tRnP?Yh;%sQ$MephNdg%gtGa;fH=r;^g+%!GDAL=pAuUk+I8FL>Jj5gkP!N zH(TZ_^e_3$^*(rIy21P-0*Xqa=!eex^wQ0^NBK{D-^$$qN*c5}0jf>R+jxDs44kIG zzjVVPd0BBwzJ{R`o^)Ov4b_>IZ9eZIWZdS=6?Tpvja_h=wAT1Bs@ab*l>Op*3GqNu zGw}z>6i(P&98$h#-Ke?3b$y4fNwT^2Yf3+OCyL8i2`zl5!qcd8BZnJ}k!<6O@Q{t1 zY=2)=44#^(&h&DRN*sT0VZ$62_HklQ`+fcV5uT$i{D)Zg`vTVQJln?a7|EabuO8=v z1~M<=I)4YFjfk7blI&UJR^nGw&9+E~{fpa|#y z6%0{L^%6XD9NB!QgbLViC>plh#DV4vqj*Q=w_NQt3LWUjail}J(k?53=%#iu@X4b1 z>gB=+3ATy`<89YpPcg6BT~3H@6*b)UD~dLD2uzMJ3<$diAK*bJ%kcJ+b}Hwa{{Ar4+DQHu;>$t^JId+u=w2 z*Ql#5QUF%Qrs++QT4Ph!4tN_F*n>PzUwkh6thI`HX}}h+JG4!M8@;#1r!BW@4Y+G9 zn^D}1!$>h$Sud~gM$~Vfb_D7&bio0xK5ZEGyhpSlQJeRIBa6BQ`z_s`u?F7+kARaS3J6=)IXGry_ zq8DHkZBs|HpT$U%|CW#;zMN3?cI^@Rr?u_=PKpr6xsLus+jJZ^As z)~}gu-e#STx!4L?x20$8Xq~Xf$=t@QCNIZUai62Nx>S{!;zvP zn~zS?Es+#^QFYEAFMMYumrvQPIesvCh&Br|eiOpoYFG6g>Ba_j9@I$5Cvj+M^k@9Vcjs8) ziJ#=0B%Di(zMBqv*KwMBZUJw|v%zk6&wulC2($r0?NGc=%_iv!8kd^@et!w zx{k>kTkT$p0y0jz6n}J=auP*>hvem;7I(GwJ!2sLdVE*iLF{+8&K!G^9ad5Tmkc9a zWwv3Lz*@SR?r)PW>1-#3!AwJbnQ?C00anjX&UMn#0-mpx%^5s0GgH3?Oqvd&%%#JK zN?Zf$)2MzaYeDPls>=M+AKjo6I{&gz8F?VHFD}MKWAnnFV_6&Tx`R7Q+{|^sa6Lw5 zte4^qB=PlG($xixqSF3lFY3K&s60C=8nqIb-SI_d9+q`-8YFR^J6l`h8g)CgNpYIG zT))`H&-m}%-jVvKntjEww=|T1@Lmi995CJ?Ud0Kx)p(pEqvo43k`PR`+x=P_nd~>9 z&4j|OFEP14A2fr9!dwEcU{7GO3deJY>D3wmicDzwIxp5_yAM+Gz|QQfC}t^7#Pm6i zKP(TjA3Xb=?ku;u$>V%mfDDsY9XS`WMi7PT2Owa~1d8?#?Fv?SoZEFz)yO!vU9I)1 zvV#9rW;X9MOWtFuI_q(CisNHgWtV@Awqwo&_A1Tw>(6ja3Mc`_QZ3{oz^`HsnNXt5 zWz(#Oo$^HoH&+9GM^*l`NFLw8i!1t)aTmB(lunQH`s?;dEF0>{_Hup(z}2V&|9wK} zkWFnQctf37&;04witfPcoPa%jz)xBJltq=q|HW! zB=WZ8aZW2x&gJT@&3}Jr5+E^NTDrK??5?X@0YmE&T^(nvAD}>6ch=E|O z@;pcW#Gb2Bw*hN*oVN|z<7!QXQ|>mnAl{$M>vW}}6ne9;Ck4RMC`o&I z8n9olNVH@TkJ9}2x}>J$z-JBq`)q>l{-K>+9sc{M!6|0%rzftt_zL_1n3zW*s`KrP zFlo>MRuOsn{P)2%>7-ttyLOt364K~9A1?XlklS6c7SD4I`QuR_ z=EUX?&&;TBaHfOhap%(_LnaWUz+mM{k1^Sv8BjJNpsS`1%ef1Y|AF1En*o~NcU2BGILkPcR|9fY++e~eLT;4iJnhBf` z{?R()SqT$9g9AuU>~6q+pSrolXAi@RF(zRzRSgDC%l0P!O>pnjmNr}MLjzXm;^8w z8BZ1|1?LbuaKSp>W_pylUgdG_Ig%HIH_%$(Wv z9~ogu=o7F`PySNnY9^u21XhiwrjF&5J*eL%WA!}Nir>ff0~}~P#CC^u6{Ksk?9C+g z$Vu-7vJ|+EllLuP0^59+b?IMD2XEXaHLbvK6h&IPfb4isz?#vu%fGT8Iqw+^g59w|H@)D{K5ckQiw5S*ZI)|lIRCV(wRj}j5^=}qI&ngb*rC>3T7 znZTVdCLU_A6)sF3Yz141c=$BuA7N|;90=#0{)&Z70lIlgJ(%$H$O@-BwOJr_G!g)l zF8_VcwhANcal;@tUru}ln~{G8RKrJMA1bz>{tCC4@gE5sW?R)^6YuQrx4%}+$tRN; zu8=hV$x2RD?#IR1Lt%|H$Q^6~@vR9qLNoPXT!9zx2!eeo>64vg2_!KLocTmYZPDK0 zdA>hvKHmac6<^ydaMxfj1~E3q0WV1~3QB#I-|K7U*4fb~~jn8ccWhQXh zR`@aJzf~{c0M*ln@_r2sPueMip;{6YC*9Z%9G=9FAbeORe+zbKghhG_Z_>atA}u#69!KBI+{`V`H{S*AFH<62*+~IfUuCAgh-7qsX`eb79UsFJmM~AG z_+_v*@N(K0_QxQ~r^6^bzZpvnCrxFZbBa?Ftb zv`~w@eHkyK*K#gRZIJS+XA6>fpTpCJTr6#@S%fJ-f1fVA!qSKL{!I+)muH-;dIOdb zo|FO#<_%9R-7&9Y3`Vv`vU>xr27@?v^j5`(IR+X#vk+0P1jx8yj_k@Xjk~f3YE!!K z?HK1JC+M=8JsqEYeM3Vt;DOA8W6!rY$$j+e?b`K|2&JsPLa_eMKV!LZK4DVf2zN=b zSrx|(s&5vTT>Wdi>qU;z0iapVC+>dTKyrZtZnnK4fK*gNa39w3sUt=A`mV_1x|5g) zR@ts~RY0R_y*LNA=ul`lqJqo=VKpr;``b5{a{SKl7THs{`Q1q;Pt#oGl!Vl6$r zrM+!J2r)%IIx3fc+4f6Ni@q&dTSwEGTKde)6AJ(Pi6Lb!b@AP_WnX78ZtfYjc#2Bv z9X22>mRhdg_keMK`kA)xx5d4mIb41&6+WV>rll!D&egDx37wnO0Cd^qdXpiw4vWRy zj?eoPZY%KmCG6k5dt(0{qh}Re0;{(P8#-2m`&%*8o zu}^Q#XRXbXO;}hT)gAt=m)Rh@i9IOum(Z;IRuLUF66$65A{2BT5_TkxO5very3si? zO5o}7qEED0S4n^R9YB8r2wUfIRDEfS@9GVA(QQ zfYW<81Pytg-W5%3dt z=&Py1)DJ#Wgso;Sih0oM!|n0+!Q1TPZ&B>hO6KI-Y_K?yFgM3=pG?Kya4j2}I?(a; z>2>Jr8S5RHl6wFq-S4yjbqwD7Jrc2*V2h?IckEooyNZEY$;N;%RB^(3wbaVC%<7s7 z)RM!zegY+nv@JNRAr!OB*FV+rWlhb?Yj}Tp(k{XqG}On1T+RdAYD&>e<=3#Bj`#WO z(}wy0DDaiB#_|rfcko5ppo#>YU!$+O+_=8M6X9-eJAFpok|mwnt1s@}_spM2 zN7A54lo+q~|9OY+K4&>O4)rC)a$im)CS4sowUsC+k~maSM1L?dyACANu3my93~#0G zTnF&ld~4>5tVm7x8bUsLjFO+r2O0Q=8XozIHbEz|>lwn6oKnoP>8ArgHRp7K74%K& zXty1$HvwjSDmk@)q>K==-ysE%Gwn15y@rTKPD9tun0IbS`Eb%}1Kj{=KSpCZNsN8O zPW2Uk$pO`87>NJoEQiuyE~=4)kuWYW z`NCtQWhG3Co!hi<_ho;{=*X5tcbaubF<`Z`nAc4@ket9PJH)Krso`YX1j1vT5T&fb zF6Q34KjNBwARlVIzFHeL-M;9Pt*xqGlybDQ_TK30W9O=Tt>V3ll9VE`h6UR;Z`QjJ ziGVWk`1?{HN6!j5e%D!dxhglG>8y83{X4;R->ilJU5gVdnTd>6ru6 z&qoNl#Qhe8`S@r3?2msO?)?&fFB)d6prUu4^Ze$vd+1ovWDaKiB8N2`SzmRtVaL}X zWR$;FRlR?{8w!BNWJJQ@m$#(`nGY{((V0nFDOA1Ur0I{H)vO&{)wyjS)d*o{TXt|{ ziWHgoP8lEa>m2CJtcD<-59w0gRb`Y*rejGNHj|`l)r|23PRwLm3^U~Yt5Lr@9mDRf zH(fZsX~Q|@WC)bGFltSGI-k*aS5*9rs@XtTI}nyB2Ov0ED}Zqcsz<2<)GB*TXf7$#qgTdi zFvl}cR$}U-l<>E&@E-JQ+S-5UnT3ljJcbd+ZbqUWG*xi3^2rMBc6Vt;wXDhF4K^S} zgEYVY4bL)_lksQWkRhWAxE(N3o>}BTrQ$W zFW;ey_qmK1&gLvsS|kwWhZKZmHoB}U`Xqn{OV-smhS%=m(5|qMM&Ves$BEJ=Tr_;Q z4|6F2|DR&qe=Jpq%xjLHh!FzcGP#}ExwS#vPX3wKC$}^L_z@U1iXPuQgjr*=Pf%EZ_AQtG@ADv|M2nNhI+br`@Z@VdiUHzF=_A&@VOfzVJQYJc;I83NeNZpTlI%K z4$qx?{0)s6i{}p1W2T=b%^SV&hv?X%_m6=3-_@ zx9O7`hxkozf{$kk-oOAN$y?)#;~;^{y%km=@CC7lZ45jvEG_V*m?;@Dda=Q6?PN!S zI|=n37@sPna{vG*V3z9#KAh&8lTE*N9AS37fyz)N9{QLsZF$%nq-=Py!b)3otlOUW1SXh36k0v6wd~_ zHp?bPI<+)$eFArXo2M>>6ufn|@q7d*pZ&8Ejcd8HoG#%axv=eerycm5ABZ*?wt|Eh zj{G(uyLCfc9XfZD4-KNayO(G}?x}WzPk#)6=hZucyQ?EUwJ7x>1hOAay7j`a!bkq{ z9E|E~2_r&tUp#mIv+OL{X!IV#i-%9u0UGfmY9qgIe z2D=AHQX`i~w0rpEpQPA_Koatm;wv2A?n&lapY6#9fyTSohd&PFPv+j-&dBSXtaldU zp^r0j>A)0#A*n(^$5=Dbrmtsj^nBwkRIusgJc=tnG-Gj}ykoud$h(-|*S#0@q;4I| z-T^hb2Xt(`>StZ8)7d{5wZk;qWW%PwNWFI9l-*GWoA(7~MoyLnAc8A>ji`s~#^3H&+?m`%8*z30nGa+2LNCqmptB7E z5answzPXm_&Rr?$Qd>b-|LJaoV^N_2!A7Psp~M4Na;nN}Ni!ORY@Veh;fAN*p+ z9W^gf*}1zKs{b&WwA^tC^oC4ErCcLyUSRy&on@jjyI*x|f3z?z?0DuJGmkJOflSWS4NT%!eA?O=27JnOr_LcxkFD@j*)m{r!r2D5`6jZh;R zwo}X`uiU+Bf8)GX<->y}qi4xBUzhEdg?8^zoT7UrpPOfO`4%jmSLma$?(sI&&(mBj z>2FSi-X4Wcv)=CDPYpP=x&i}ypM7iIwQXH~a1MrUzPv)g2CwU#uf7JGZ+BRalbt?q zoxZR8n{Ov?FSl>ct0bgvPZzJdS(mq)oimHRRlaX0i*Jv! z3HhESby}ZviFYbX*@hKjcl+fzI2a1{Yg5tbkG(F>Npn|;=C)!JyXF3%pX&W|4_MpL4BE+weO^BU{`W1`fAe{3`B9Up@y3h3x4)?eUD<%_Wpp z%b^vp-4iHZ7h-a5Zthm+;Lh6IM3q*?Zd`c#CP8@4E1QIFU;8h(y!nLwt*9copi4$i zrqpily~|Z`aF@XW623MftmxxV=2RD%AL3Z(vfLTJ@qkILDbRI)pG=XxvUt7B$Sjo-# zKO*{16-z9o4%vTeU2uVGSg=y=wCBl-xAl*Mrdi871mF{rNErA{W#oO|M zzoKDUV!dY$u!Jr)Q<7blRIX`=D%n|H$L&dnF^ysAA%Q{Cu;Q<+4;>-I_;C_jasRX1 z+qkz7xW>K4XgAsh$cn=ghvF815pNNxEaZPHDI1VxwY1D2^n^)FtF~?b3S#ALQsH}p z5Jw~LC#y>pU-#K`w!8&U#naW97W!T3$)JIecq6rMQvzUHRIftXS7lH?;`NA`P>!oc zXTziLviLvTBfSPsIIGmeC3cKh(LN)2ukMS-kG$1gy)YhEU&*Fxrz!;PAC01O{F{VtTA-X@P+u=k21+uwty`tfg~)M0fGgt(N6*oN*O zjlA@2dIhbs4c?{FC-Uzg3nR!7SOCx|K7c)R|4mX~Zt+)|)3Qk^I9UKhOlIAy!D9ad zen5f0@mt7X_h`P(6P$rKqpz<(+B$ski9Rhob7E}MWjaZ|#Xg@d{O5yxqSAXq z`$wOgC6{kzmaE|;u_W%27jAcIB(aFJ8Ho(aWJ-$-MVytC_8;;6K6R3dBc+eHc>@EQ z1hwmTK~f{X#zg0LJN9AP)m z_;#|GQ9QP?z{27z=pc~G1$%HwtY`uwx7~0^7O}7gcjD^F5??sPzWs{cT)26$@AYdX(0&1s44TC2~ zQrCT2us24{21?s9|1ikp68N4Kh0%<*P)!*~M%EHbpfz(qx0tG)17tKo{C#S&$0=9 zk1huRSqP>SO z6s|^csaK+8a-L!8`@-}!?PzF;@_Rt_3l0fqH`XEN$eKCy6jEau`rCO%Z>^ypsB}JI zMgWtTV?J;j2($)i#8EnyNk#$OZiJn_p)WIMdM)6RoRp|(AfPgjqzFZQqU=LQlO{@ zj&vnao9;r%*vR)TnT2s0Q#7}m0j~18ZIUCAgD;+#%iw+qbBR%UH*a2MltmYC(KMq5 zTW%`x&Pu7SyPJIlrCC5o(MW{S(4#viy|@DHRht6W6O!YHIRJa#$g9x`--c%fY{t{3 z;VpxngW?%6X#Eb>T{2>;Xy79)aU(Yo$`cV7K^|SRZ-C=4WTECL7N5anzvFIk$5r?? z&{+;b&Ca1f9p5p#M|z>Whb{chhQ$49NYF-b)bSSwD(E%)Mq?>8p82-%RKF$>2ylzc zxYM#KneFTxkC18Q#L%Jd0zw;$cCje{4T>RIKFQMMK!t(ICG{B@f(u66PuA{ zPD0Z)?}4S66|bT2jpTL>jZoM;HAkYF$PbhS9m;(iIJQ^PQ#Kwjun?VVw=v>t?DWU9 z53ahN zuh_}_2wG3j+eBHd3*|ZjJJ&4jarJFIu{)|13YIprlakL24I^Jijm6VdxS?=0u)1oT zE0%-@SGA68F>sy+FuRTJI{|Vn6zjS1pB<-n3U*a}#};jck?Rw9Fn5?M9cOn8sD+A z`*FYXH5VSwf!gvJ<$>Q%jf%wF#(MKXddvpy^hlAH5D@E%j{{ch9}oz6HV*A6oY&xB zW_dlLYcwwL9y~kcx(nE}TGlQI;-;wB6G3YsC0e7_gx3G%g`Ftao%^`%vG60>+t%GD z{Mzs6-FJA;P5V7|i3-h+zre`?qRjci4JD~KbK%!sW3B~C6hP#|U#(qSdWQ27X1%Z7 z%~05#I^FVDG+2DWDxjI8_- z6x4XaRI)$A?xrXk$?i(6DLyw63Pre$Ii^^TBphP~6rM-t?5t)fo&jq$UPx_5?vrXPPAmt&~}y744Z+N(;Bmmv5e7oRYGlmq*y)c;>O* z8(lk^3(zi{njLd`?J<#ABX#tUMjXn5tOmO2ak2O@dm_)PZ9Z}TS zD3fxauw1cR_qcGdzflkczX&2j=5h)=yv#dey9|sNGFmp8&yS2Pkfh-7$!B6)cE?|= zcrE6j;k5G}sF0Sw1s+Vuz^?CNK}GSL7rs8;JRzhCZAAec9n*%w@)ueo&~{UHg7+wF zsOLSfO!DL!wSlDGD^c4D5mI4}nZ;uaK=r0LG#(%poyu0Tbd_0Rtbh@xvO}1sT`K_E z&Y80p9NScM{nlEvke8V{F|2AuqXI?Q>f4hz&;)fd_9Gv7KvYCpF0AGmQ}HY(n7x`- zVq;(**R(>mE0LMc+TdEub#r z1<&L&@wgo4&%8S$Q2KbFevym`p4$vJ&tc4y5Q8M&y&^x5Jr`A=2_UObdf>c9{@LC= zX#BwG7k89%@}8^v)fp6H%ZI9kEex2GJ+}26BTG3#R?!Y0 zp{w4zV*zRnfP7Z>fZj!9L`k*UQP=2&w)}d?$#vNZ+ajBvboMNc0e*o&h9|?31L(4F z1*4>_c|^)6W!c|Cf;OVlToIp>u=r8;Ms!9Q6wDgiO6VUaOivz!S|AHT3Vv}UqRaGk z4lPKmSlOYHpmz!P3Sv_0oE~vdeW1vFq^b3_<5#=|H2X;ej*MsHZds78N_-CN86eYN zYomxX{NAVd)M)DEu8nr|qNhWLcVSct(aKQVhGS*Sq^KDVs%F!+!&K}%Y}3Y=qItn1 zScD%M(+qxw(%c(r$#)*4EK6GFnagu}<7Y7!F%VQlKkvuR2&KHgCk~@DInV4*aR{vZ z45VlxXCHdXXAPc10Ua1)myZ7SQCKZeIdc$qbi`0$C>H@kABD1piFv6D#XTtOM8Vko zYP3U%Vgjg{0>myI>;Sf>dKP)KsoZGq==;$Ot_*tUK{Tv_8r?sHq9eW-ikW7t?g>tc zdEg!!4uMZwYm8AkYGQlg9`PQh6*ec0`q$fiKH;=n(HR8!l$CtD^!aVSMe(PNB*;(5 zeTze_%=WjAp3y0$?aAC;(e4H@tt1V?DZZj}@rM+}3+i^n-2W>3w^R3dvjC||wLG^k-Do_oEWmz=SEvP+@4cK}vX)?Ms) z1l^tl~clsVzGY?X)xO#vEhF=UTY54Ee?l!kW@GsGywmqn2(&_9omfgRJKHfHS;IK@w z51unQVWx$-W>m|qc+6nYHgcH!#YCZ1dd_4n;)*Jy98|~S?nfkRvQGy9y#o@4fbyCJ&W$w{Zv__|2PPT6^s zSYQX)Wasnfh`A>F7be@Ip)f=8zwbF>rVDO#9FG|_5bNX_+vDowtO%M>Qr7_g^aXX!KBKzm`A~n5rZP2fPAaK{AQ^-@yvK~%al}gzLYqH-co$pb#k1uD3Cl12 zVu{0JF`TVn2LXw&Z9hI6kb~9p@pz%775$aOwps)}9pSQK(80n+jz^^s`Hga{k>SfZ zpI0LdTQnkwg=ZtNFm`dEPgSxin^a+RwrIF3bxtvF7_*HMp=MMyItW+u_$k! zIXIOldFVM3$pTfuwPlQK!GM{xwvV`(CwLm2jQ899KjG)Dy3bhbszr@vI1poQoV%*6 zCkmmVq^n3B4!dd)=P~Cd+RNM8RU_$-;Q>#U@of8~#l~Qu)DFDus+fgPmYnC+Rk9+U z_cUY2wzdihGbEg~tLEw}8{Eb@H_zx<06&~WX3aE8S-qgwywr?^#t0|7Jj8%>F=i}< z)2gcG7A`5u(dENMWYIW(I!BwOFKNENTniLcXVtT1>8ep2!YM`&+5sZ+LqEGEn9nt2r+IhCxrADUe> z_aeyxN*zk4vt)P^U0w%;)+nd-pP460$DY9Nh#CcwHXc`#d~=-!+ixtIyVB=6QI6#J zXr1>XY^bs(q0nFK;i*B zhC)#~r00l8?bTJURqSP=zPgV080(Hms`Py>WFASV77PLb_7_v#@t+gF&P0jBxRcNb zIL_OB{@Ls0B0CSFhDA4sE@Dp2%UuZdbS3v1G z`uM?Qzxp2(OV&ti6DpdBTMZudW zZm678YQ^an(;(FkJiXri6dPj#!X>v2D1;n>~5v&gOe{!b~$t-E)H1sVHdH zJM@74sT;}vNYrji)=y^(b)O}Wocv@JL3v>AgJg7>&J0HndbP0MG5`G=Xs*N4>Z)u~oY9!ay zYz@l6E75Vdj2A|NuB71aUUK*EK=+P%B*cfrlWSTBU_9$+k!A4Ld?jk$2^n|a&tuJS zor>4|oZ+gzST^jQ;mi)C7|$7wTBuc5aL;g%>P`woo--VB6S2g4&T#m-BWOL`bC$kg zDDyePVQKoTkM)2GGuA5{GaQ1M!E0>y8IHQWq`dAn!@HDG`Z>eV8Q;|JbIGKnUPV6)Mny-%;{%#(#{~6Ad zO`v!@`QJZkVu0A|*O50?!AE7I`-!WvpnH#@d6v|lRbyKj{b93ooEOMVcH&I2mhKe| zXxB>zCFy=b?! z*)GP)h`4>E?pa&&MRBkasT5whW21$lA#gTh01{R81EIofWN~9hl$9Z)s)!{}h6e}W zsBP?inl&l9YbY~0&9lv*!_x{BL6yR@RrkOQ(mD0u5iinFkph1q`*H#dL*#orRI?71UI%Q5i6_#qd<9XKLjA49VZx%;WN#3_JA z8_gE<{$)@q!yV2+lm*Ku6|uKQ@B_>|eEXZzSupU`Z98Hh1%sy|stCsBMtzC9JAgCC zCVHMbdd%3Pm*AMOIH_i_Cubn)6G9v>IKs{{=8oI5WXe1T_l_e(syHuE)aR!__EfBS z<=b1_TOChok;Z&A&xzkSBKyG-qZo0{N9qvv3z96`zl~kCDnHE;`BK8J*wsgHb?O=l&Ijcd z66nzjW@JJa>=>u*r{aAiZ?ea0AVP-*81~iN`-(xt7oA`eM@x^)8+@RDQue$wC{ldWXw&Ng?>(t|dwS|PR>{EuomQY0KRn`e5T>c!;Q;|kJ zrIaJ}Zy_4nN?!f@3cwQ?%~-<2PNzJIlq#XRGzxu6Sfav~lZ2#3Y1R9Y@X4S!Mj1*) zI}`yPt}l;V72F%)=+ee>gvqwrshwj|9u%oHHsj?T<+rUQwyBS+k!KOVGExlS!PXZ~ zGs~u;GD%&goF8Rg9a>=^R{)0<^}oYWMA+HqSQINM8bD?dTXdYPUrFBkHAw8rd76h* z%}MFOqqsQPNTEz{K*Cw-bC~NRCi%M&jv|a#L`J2@?7K;arj?jJ_kvk~14{XFrxYlXaQzN*;?&wU@ z*R)t$w(&SPUO0O86!CHOK*X#nrU7FxgDd))g-E{7sFwWFf{w!@2K0!Juj7kj(;q?V z^>5~fbc@juVgoQVsyK*c#6a!dk($qMh%CE0XeGy{YUUaX&VgD8!t-;?vK*ySf|+AB zWB5rYGSuDGf@_SY+XT|kM*PXEtE6vsZ9QN)FzLf5Ad>a*|hwXMq>zt2Iv^-Dkxw z-Px?n8c~mpVj|+&(#&~f$q%!&fYGv9YV&nKL{0R_e2!1wq4 zgm2IDU(PqU{>I-Or)`8&cd6OhXXQ%Sf8p(Y@C*ML%z(8Pa@@ABCnMjDqXuulfEkK% zGOs;^*Gy7*Fuy^Cj;Hicv&qwW)!?!>d0G>4fW3Y>HAS%d^r?(rsOPp zcC+SOS{(%&@>FMmp6`>pP^ixw$yM!FgB39k^#I>@hUN@TK*r-az_@6R#mWZxQ-htc zHPu1iZ@8mRF2{v4W@|_n>(1h^V$BgHF!UTbdgZ1~`6PZfKDFvKplugJSipz# zym1`Bp=d;0j%poZeixP5m^m5UCUvWp$rl&*5LOj^nBKFMhw_+xc;^fcDVhe3>~n4$Y!Kda;Twv7inmbPESotATB@ zQLdZ4W2grf4wrW==_I`uafScYKW0LVf0-es>&KLkVe6v2edL*f(t} zQh)gN9N_B2aLwbX!RuM7YJ%=J+|efs=)$SR%DxW2bMqYAh@)T6F;-MnKVntnd)^|~L!S)>f6>B}7djI108@`<% z7YnHQ=f$fwZ4_!13n*i##rIj+1|(a_l0A70k+KSv-g58WEdxFdeRUj6*t0par$P|& z4w``~-pzw7(tNOhF7#VWhqa9nkE>zfEr@CU9N_b!C92f4D~fYMF7x_gy@%v1pcZ0r zw}M7)P{%e>p_4VQ2fDL1Za8Wp69sBG7xHLcfdh@UC>GG*y%DIE9=(RO3M?icUd4c- z8fTy!X-==oM^)#+in^iS&H`F;cwRjqj@nkFU)-Y%6ecJ-o587-`%3na;>B85BL8Al zH^Mr9hD2o)3#d0GvTmk$-zRYN7O&pF0fL#I7hDWx2c916pc_6}npmIgk0-vdj6QH% zFX0tO;)92~tWGUBU~^VdG)s7ul*P|wI?FBhLshOKCkmNtNb( z@|ooyTq9$KwyHt{%jb6V$x3?R$OC5akD~EPJzr>3p~hjoBUej;OD$z0b6s!*L#q# zF1~nUNsTjBP7POZA-OWJ56@hTIlX(ad4wpuxWnSOCSaNn0X8Jm6#W&?tL{n zCeUc9U#!^4#LHVKw$5ip-CkN29_c)12Y~e>KQIo#>S9bRnF8krdaT47k2;5GT8U_S z^B&1z?sU|1v?6Xg7Kx!n%2#3pH>xaC;z62L;#5Vrh=mzF?v`nxYo{@9^m#Q_qR!M{ zj!F}oGxKG6^^6ARXu?+v)9bh^*t*3|jq1O;tSq?r+n3J|)$c$+aikvBN_@{Nec*`5 z$IH&~89(l`*28=Jbtik_#rEsXeO9$FJ{FFpe5XM{a2-=wyS_~i=5Oo*kV5$h zRS!WOAc&fjO4Mn=eZMOMWBkMVo$Wuoa zWQ*52v%k@uqaJm3W9^!$dUsQTiGSgj7y7;Uuf^lFU(Gt<;F&yolkPnCsFZOOKU&sK zQ*z7Bo`uCweWyvPoh;-RF3x{#e%|6}f*T)}C-sKs`n~;r<-bOo7hJg~|MkLugy%VG zdxK*{{dz=%;=jghtFp)UORvH zh9CUh2j1X}tA70xe(-%S{N(k1;05;N{M{3O@PpqttZ6K(m|wW~!R;$XKYOT9Oea4$ z%&}L-#1x$Ql-yce;=t<^rzbYp;PEKEk;M<56RD{XjTTU6@E-4Y!+-wx^|hvTJsi~^ z@rh4pd3>>v0gd^1?n3_5RaKQEeQM5Cn=*^B+8hJ1RU&|_o^b@bU?;;P!pAILbMT4d z#Poqa_{4?FFE{I!#V1}7344T)I=N4gN?@j%wrj90`CEMAGl$}pEuiBM;%BzKO*|e* zGIlcW;`GOBzY`Ot&h`6_XZ+`nvv{{Fk27i!10{N^T_1zJ?C9hA5#y@4+d3`U=lMH3 z;1&XPldXGp%WPJXg+QQ-6pVfuTbIwcj(~4v_cITT9iPtX$RH?CUyJj|X0GmT=xuUf=;;Z0lcaT z5BOLs1$dr$;oU7DSOyE12bF?i;5tks`0rl(hGMGZ3II{MA1FRaNlaAWJ-0`Tt``8o zWvU1SGJUvS0CX(t*J)`M`u(s>3;#vY0C+F8hmZLGu400?kYX<7#d3efw;jNiX36FG zyE}gFBpZ$(vDB9x*E6)R5s9*0w* z;1hn|=basJMFY^3g_(CR_U{7+e;^_XqB*3r&g&=T>%oIxo2$tn$3LC9n}M_{RVP}s z8e%3XRy5TD@c5g&;;@}bX9_rB3fJtmSwD(qy@=wb6b*81$y=lB2g$_?YNi_LOAnS@ zHn+bK`?0hOkRYq@@ESXHq;iQO@1|YqR5TF!{i0|f{O1Kfln&&Re8L|}2cMJ?b{uRw zI-Nch6ApZkVW93ftpTd{ylS)9?&pdLNQFCh&}@FD%+aOXhpNYizCBpmqGCHKZY0;x zXjLcPJXmW>iGsL#smLcgu00RIb-(bY=SC%Kn%VPwHdUpdfm#^(?1dT=UA}_Z&1Ma;wv4&t$#6uOJKkn)kYyOGW()@JiZ_wf6Z)!|>4Z z5c>Tx!-YR=@h|wcA{PE!SsRZ2o*LuJ3f=L2r62eNy<#gnE>)CXqjw>h5hsf~q&Cdt zc+XNvwZyf8uqyl+%>^L~J_=Y`$nNW!C&!rxx>`sGxP`0U2};e8T!UN0TA3NZ46-m> zjC~N2DcsjVUNZH26OS~qd+ua>T&#M9Y`NzQ?_{2tU+?F=Rs)myCLd{&^_nXXYX$MiZ?kkx3fK`4}?ctKIs z#q(1rJRoK0)#E5%ozAyDy@rYeNn)URt6lQ*$FKK#bzGm7;e@7%Jyi9RqvXm1;7By< z$+st|Ln*EkQKh(mkj$=f^@4^#YiXLGwAu9|nsdCsz*LIt9_T~Ul)E52Z z&IUV^nI2<3y4U)QKC^49Aerb29?;sBzYQ&ns2(8Ht@Re#i>8TC{|2_V^>AK|nvL12 zpXixMi9>w#C0=KR8C4U!2m0Z?#~aR457IQi=!J1*x22Xs4TX?bZG2o2#XGH&pAYl+ zXKA3cp$;f0DRz{d|JBT_BdVSgV;EBtt9}ly^n%<_)6B#yVWA~E0aDiK5Z>Pm=5WrR znz+O`U)d+aIskChIhw#&%!O6x=v8f398fs4V!I4(>5F@ye!nlookWm3eGl0@2-rJRwW@S8pcx3LH(sh4~H4% z|8u5A=G(f~7|ubnR%+!^=K8g3OIa(mPF3&<7n`K;u`=uxg|NcG*L8Kzjp5b--g{X5 zV|gO*<@Xx1u4@C*AZunOm7^;g#_T<22sqfXP%~H5ERzeHRtNX>+$h$rWqM`{9J^&% z#tlC#=E9GeeBv2C)52fo@jb(f*m(+URjl!{;Zr^3pfny+IwUAHFVYAAOT^^NLN7`z zTC-qeufDTmJ*1MnDoY=R<7JmgM@N09zV1hM_9e#T9yz~L|M?Ma?th)@dS`-yLP_jl z^_ET$Qh!OG1QCVeoZ3uoP_OVtgvO-Ksz~m`g3lOsG_WBJ~lRe>qKGRTlaO&p@LT!4*!0 zOAD4bk`q4*cg|GcRi_kC5rVXhe_{Ko({*|>bQ;~xkZOyXKC54g)au1&GZcVagO93N zuJxnuzPP&vS@aL|p(1qQIDnGhUn{egetwp_Jc5eYDQML zVjW4$twgs~aIw4!*u0|k4c@2={rvIkb<)V|o3u4x#cYx=Hy*j|#WhPx6uTB4_EK`O zJ8=F*b_IDffW}7KmR)toHi_cvrg*nN#Nl&}OTUW=V0p>I6}jK45k2<0kNB=qwBsm= zlNKeLL!D8I>H^xkk;#*GaiGWAE|sFxRhJg%(k*SUQqtmjwGd8ki4<^K%ucmA3!v~6 z>cXpM8oB4H-6Rom8#`o=lY_!l$G644lA#~~dJ~pB0 zZJ?}sI*TIGv#h|vx<>fssz&I4Ov?_~4a=&%O)Xw_U{gUl@J$8j#w&WcoKxsCeyb*3 zcsx~;P8_-!W#P6s^HNi4HD4-A_Ge3(xI&>){zxn}Ia83$+~N9s8HG(c$pn#lS~eLp z%!~Duc_4Z5p|Ix}6;q&K{yJ5b7V2}tHp4p3s|PwMV{k>!k%Ba|(4*@8X3c%)??0~Q zCB=6Q;Zj+eDXLO_B0=pwHSwfVT;jeSi02s>p8bpfWnU0+{9?^n zno=U2WE+|n2RhmL8xML_VTrXA*J?rybwy)kl2KfNuDv`t(T+>b<{oc~Z;wI`k4Z{C`)6>d4`qdRCwC?LO#_ z==CM{z2VoFdEyZ*wzTOi-*+8S1U-ZHpT!4bRcIuzHfV-$#>d5v*cEY3)FCL-6p))p zj8f2w7}Ict8VK>lHM3uI#e8O??KiCJZEqDG+4<*u$mW|*-=V;zw)l`|&8~Y^8VkEr z*@!X&_cG13UMqDZ>En`2C^hHHt(oGt5B)Wv9(xQ0nER0mJoGt|0x z?j)b^$9-@#?0kFRVU`ElGLsU%(`U6GU=KtUnA@aGhGFT%Cbw$fw#^<(A}*$dB_4W~ z3Mg1}T_{FVwRZy~bJ2s}V`St6MWXM)x2RG_Le}5Jh)QKI{u);klDzv$5&7 zWUs!Ou{O^hn4L)O6PRb>p71-}M)!P1am{;NpGsa?v#_eTINhn8JE*8PoY}0&cGLRB zm=`xINxt2CtRby_iy~&<-IC#?c3d9lg)YzW5z`)?=85ZAblJTwo?`GYh3MHd_`NgB zGw(bzEBX$|o4N0dZaH6@P@G)qo-w)lH<$qP5c?YDex@}*#-XU|0Lk6hs_Ti4u5X6p z5l~UCNC2d}{le!J35>2fA)c8#`ykXxOO_r-V)q=+C@O=C>^aRERliVK#!*~N$YLi~ zajzt#8XoT;bR3GipsC{>cowG9AKcL+lGHmCZh-Ba&a}w{k>K6RMA^ z!I{*rE}qmB(J_11J(3T7jo%P&p|gIpq-@%Neo9!Z9OmFlV>P4PPg#k`nu@gcC>!nR zngzCV&bBfkptHPiQ11T7_CVLpyGzZ`W>@&`Ib4j`J$2WHoula647MlrD{`x2t}Kvw zX<1go_U-1%h?9-&%DNU+Z9=vJjZRNH01k6V@;&XquX>vmLSdKQrswi6oO)%@GF}YW z)bXKaU(2qbi5l;&r-5o;o^^Rwps7mI&}&2Wf>fRcaTawoZI{-}1WD~^?!zLU_1=2s zPL|&0flHtBfuH)E2VQUnwD3*ObHfik&jYuwTk9Jf9SYvpU%6TQNdGf;F)JVw!zN2A z7v>O?XTh-*b?JZR9;BohSc!7!mV&~qEc-!O3#blSI5E5qGA5pp;ak++7jurizw6+= z(*^zcAJlA@%HNGmUMF6N3+{Hvi;?fD92vz_> zb?&uPkTuHY;q-FQLy2kyN^T)Vo)l5>YZ^Sl~UQ4$Pd!$IarYKLUH_8z&U z-d^aJir!5TT;}bdUut%BdbK=6gNig7%_Uph(v_Sr-_nXSw`=vn^%d#fc)ImYANZ+j zdf;Y+R6X|4M?LUOAN9Z^dFq}xgq_m5-h995IEf{aSK&Y-wMb9Z#x6NGX_%mRl088J z?<kT_`2Ga;&yST}Rs1 z$ciq_;JAi1lK4X$&tQHYmlkTM+Cj1TsvderPd(KQhpwyZ1VgE{CFe1-&9D2~?#|nX z9RHX;9(cZ{o+O+UK&sibVX5M-dfLj~X1sR`VymWTt9Kn>-vUpUuT|Sfo393(%D4hC z&iaS+RPB?8#Zv(dt+hrbD87YPm5gG4vK1Jdn*f5buKfvF6y5`e+HtM3b~E<@hspn0 zc%R|IecwU_Zd1JiA|{rENVRvg?uvM+F(1IW8pEp9=tu=Hhe2z#-z zpcY|1&_jQ9!_kpbxQjr)poGOd0TRTdwQVEW{R|9w*h_zPdSs2|1Nvm?ua*|qsp`ng z2jC5>S%4t{mxJSe(~U0d|9cOfcp%bt?jsW?V{6sXt(7|9Z5Cn z%~i`fgL_|@8)RDN$D(hc)d_iN)uzmpTc`Utr7k&;bnzAPPVx5Vk6%B=eSLR}jO3D( z!67G-lk|Jxe}%<%1-^?Z)b5d8#oY{{YqR2mTd?LHGYYhps&7=*m0OKe)pzuv41D3} zg{)F2CPP{GE?f}K`&>gwVbrb<3Ff@s9Yif&5f!?$Y6}c|$*W$W)U~p6lkN^%nR>iD z&ld${U)j0IL)Z1oqbevDjn42krHH|OSVV0=ZMIU;7`2^lFF~M@*2w|fB~r$TbFfc& zU#KkCd21q*qpUo{*J@sU36xND?;k=pZW-ah4ebf`@#^YU$kZ)@g+>L3=bh|(x#tef zvMlx0$em14=wO$YcV&h#XZl7yuo!fKP$H1ID%ZWfaB@ee8OMu1CHZg@YBNM;E!c9v6J+)c%{gB2CwAb<664%d)Ylvh>{XQ;B%P;u~D`Ri2S z@NBm;2+i-o&a3TebRA4dwBS?$Iut;~^5QHM5iyMBCL1QF=hUOCz&LU#R=H zqo=38;na7fb~`-%BK1_PzQmj(GYnx)w*sIz*X{@Qz9vmK1x@q}kpiA`?fdwgzDCT< z7LRZWiz?ikif*?dG7mO0MM}6n%(1S|(<3O9K8CoiSI-PQ$rcrrvz2SeKA`POx_>BM zA4|s?w8MpTi)2zA?A^i6hnhsM^DJp{J<$8A)33F^s+=ut;7BW`1oOBuBfP$>=uu4V zZeKIXfpvW`4?W6y*RJkwM8lJ9bBL%%aou5%Se52cImMc@v(XRoei9u~DqfhNq)$1~ zBeLIcs`(Ya+H7%7Yv-fP2G#+HmlmHgN_^J-URH(@?curlQ`dOc8c7$9`%RR6z!u%4 zqTzT^-V!ZVF8ve0( zFnNt;HG^EWQiDi3z-45BfGCMT6KF&T&z>Xy~bX+SB(+RvVVxy%j|w1I7LG% zdqA8}UpS$8S{a5uJnM&ZW-EbsJqx*Y%ru7s4ywC8==?DCo`Ca!p@ks_+udo`bjM*f@EMp z55PILJ*$eI5kKDt-BnoGp&0u*uLw`ddR(aM;~yDROk2w-;}eScw>R|&w2j?2OE1=$Iuf;-Ff{Tzkm0_hh~I@8zHBrDH# zsmhhaC>yThR3;wsL#?X=dEkG9w0JYosSG{SZ6(5$tBmX4u3KNxsB_D!B7IxYHy+7B zj4m^*=+Km-2`p(%zM`uwF#ifD!qc9Eru!L!SEyJ(&pihx`b}K;(3{SbUpYo{ zXdt8>iy75MS(Tg_noMh^UHD@L3V)r+*NXUzkG}StePw;dw-q|rxEw#?uPc4C81Hek zCr0%~9G2%3eps-3d_Li)B|LBtNrZKO+lZNoMK^)%{bQ|YoB3iR30%fqE813L@p=FY zpqSZ1EtV_qBIm_Q70wSN_VcO}m`tK^FR|5?mJV}Z$>y>1ER^#UZO`ic*{+718pxCM zbhdPP5;B>Y58nBdrkLh&fCp}S`Pw*5nJ|R=N<`R~@SyM4t+H&B;hB2dKq&(?jlU-j z;;SaV6;cR6{vt$D)ZN!nJ(o-Jh#4|x{+5*8t6p_9pbd&KL0he#OrZBt8Af!*tWMg6 za*EP@R#DP^y5M(R1OJ=)@$=C$KN1#FlLJ+$t51T)giqhdv) z2Jy=~V7&@!pRrI@o8C#f?=_$BP220->mPWD(uyX#Z|h~vSaWn&HH~>Z=!)VVgbsQ4 zp}WpG;iE_zP^Z{Knw^-jY5D$0Lb6){Rxw5Qx60zG>!fH%weBdtB`mHw9=5B|wbR>* zvrw^<1=25#xhY;7DYsOYY@?Tzgp!lm%&uX!n2K2SMSJ~#8QHqxzdk{1y26Dwu zn|aK@8$W0Afm;9=uDuLAd46KpLh`%_ye5wl5V~Z_B;$?BEX^xE?d^-(*oo?4t>fux zFI?Y6Vo~gxK#RXd+zkBU!Zg>6Ie^`AER^4}G1?#J)u=E^UIEO4FM4k_Gh@_=1sMX; z^1P5gn#n<+IXWe0u@b)W z!1*tjGBny?;nOaFf)LM^Am2Nr%Z_9SJek94j*KR}9LK}P4xFFPzBJ~qt3g%d8qaVw zL11Yp$b?+Q9ETKHnV&%>0M+rqzr-Wh)yzdGI}aNR>LZ|;nf2*57D{ir2h}TEe$2qZ zjHHw*Kj8(jSJ2Gd@AJfMcUUtYEv-p7NN!b~#~PxD-2`uh6E$CLcma$GTE@`6DAZ<( zW~>b>8c;6Pk^;kEC{*wCrpO6(lHhT?tE6-^jFDWMLM|l6`I)DV&GwGc709GRLp?^U`N5=rbs9_?WRb4tk+LLKMtcFd9z%rujR( zI|}k@TsvA^HPHj6t0{xaED~!*%)p>`qk2XRWVG!uQVZosWeP*j$JMM|8GbdGnu@-d zE$ubh7H^1W5Z@QOqJJCIZg$OBh%~HvC?*jNMYTsrK0{)w(eHsmQFZoVcTQd%ci_hi zyzz4;A9%0s_X2OebJNClvE&VWlvGzH-ApmpCW!*(va!%rt9pNQa4iK+i0^6)@tbvZ zmDyf`%o;}Arhh!G=3zND8#}mx%!fsWO|pNNmV8Jgj1+fNEwbtV6!G zF)O>zG}zckc8Rz1QZp7E0?=2{pTtzfM7!f4tf;K48i;Qu1*NchKm@?`08Y2L=1(H| zm_K3Z+UY8l7c}c_F`E16Stakz#YmacGoHP?gH>g+kNedmPbiLBFglXYSkD66BQ@6E z`HT%gno|`TkUWFoT&Vhv_H?%F7za>sLOhkI+=bbA+E_}FWL3`7mIn1C;q1G1F_hvy zGfJDVYD2hYrv07fRmxY76mXO*z2Fg@hW&*f61Yv9@Z?cE@U8Rc#^XeyF7z1R;9>FF z-M{<5uW@+AwWs`w-@m)2MkMoK1xMV5c+Gkngj9%rMy;jWvyX1RNLxSFOO_dzo zLxqFYI~LKzRM#9!ktrPJnld|o2F}^@X!Xb*aj)Si`shx8Kb*Km(IsJXCMb6Nj)tVD9|RL;|P>(=+6Nd?{ZT+tg2`d|qE;#sKTch!;6 zO*FKivpIVv5cvn$Et}#N14QTgGsmU)j)l|uaAZuqbx<5l`-YnY2=49#32wnX1a}E; zi$idC3GNy^xCD21cXwxj#clD$Is1OUbE?iCQ&Tln^XyJ{&)qV8KUZ9A!kUu;f#y1$ zj<25WO`d)_;q%a-``4NfZ-BYoTwMdWTx~O}xN5QpC#8(9i8n+Xseez26~ zt2|D+J|4=bA=ne4gtSG|4xs&{_hidAU$#YQ{R7Qf0)*l~Z>%owRCOe%4%QmQ0Om9K zp&I?#(e9`?W50*j-7wpaFpqynK(`WZlZnl;I2Gy@hKoJ)F^G|EC|vtyQ}#zSb>$=T zb=nl|{0P^?U0+gD9Y#PV)kXn0Sz0R9Nz;D0QsZ{uO8L}pE09xeCz6bUr(CW;!h@u< z{$Mr-BT%dcU;jGdf>!aN$LGhsZfN~6N{TX(tQpxp?6$Qrt#?>S5zhm;YS9UG zuX=Mhc>c>jJ_)jupuCl|Zk$q+V~NgL%cZn| z4&UWyA>{Cv$5?FGUdKal7>0bL_m-k+WBS4MU37?gQP`)CgVZn+`D)yPoj8Ao!e!_@ zh|BTB5(#CmLCRQC&6Te|p+PCY_tRmjwvCi7EP_n-+IoOf_IKoh$-_nJsCF01@xtN= z=e(4vdhZ+Ozg_J7ZiOZRbUbpqG3$?u>M+-mQ;mH|_L^!1*+g3~Een(3QreO`#tgWM z=E|J4Dj7@Dw@`aF1162ZB-Qs@{Swl@Yc!thsgQ$HQfKUp1mP+?E(as=^ZKn~Eor&| zLgYbQk=Zb}z%5dBSOqJ!^hKT%(oeD6JDP%dCEoN(Hnvl+>*HBOk=nVY+`VFkJvG)3t}Q{}Pq(#rCvK+u8nIjUs;eY%0<@%p<(pk+eQ++)W4z$ldQiz`gmCz6&^9(r z%}|ieFW3Z-`c*=$=W8>vb$^iNm&_A&XbEaB@<^_kM~J$7#-JLan@1z^4um@{}9 zhmJkgctuOoZ`2sW6(aw&yNIX7o#(_$GuD7hQPI; zMC;xe|KquBsT{&op`n6moZEwEIL+0#%XBiwH)i@V$XhI+%`f|kC)NGQs;Sb%>`1v3 zr=hs-@XjX4GjY+~2Im~GX;kVWYpohsjAHS6R(PaOZ7t(9wGI0+T++p5OXRK_rEH3p z3y2uaFdlyd*BuIq5B))w93ut#sg%Z$=)RHmu(M#JCHOpE?OLP2k=7W4Pn zpi!ju)66bi2TfB_n|BO!bhNW#x3KS18q+(!fpyjTwhnv(2LHfrcZoU3a&Hn~~flhYFav4waEh?q`IsqNK7ws9fm{RwFUTf-tAGHL)N3y5TA&Z&c_X zwFN8ml}_xW-mTz^d4>>|mDo8hpOiOLSAQ_EKOyQ+CBSP+7nATP%_yg*2S-+i12;nz zHu)P0YxM=eYQwpxB>JR1NA0NT#eUJYIt~}2$hCsw4chV(<7oH?hj6KBsn31~y?5`3 zew&Bq9q+S|D{n)l#otyX;s6E@aqB*&W?MUxl}w4`TdOD=Ze=?la z3}73T7#*H5(K+E9(N4mmb)+-VH@<7{iQToBBMg%`e)I2kyAc$_P&+>ECHHP$`AL3+ zyE>AdL*-}35l+~%V%_y>mD0WZ3g{9-YXmjSD z4xF$~)Fh17dBE#D=PE`y2Yvm~v@Wl3$;9p%Bg3*BzQIhj^6%trv2|0=VPn^yaDj>S z7;q%6BL>hlNwqettVLkwG%DXZ=L$67J z+mu4^iE%@?(&{7L8q!GV-)4Y&y(;uVT~ML2adB| z-!ClF_zB^<+CH(Jj14QfEVW5;%;+84Fy!lopN_>3Y?*06 z0$aa6NHml~YoY)AicUiKUV?pstrU(V`+^FDt`bZ$Ov3GET z^jo~&rK#MPB-_+%$@E@B@(>oqU{?;F1^*D~T)NgeHqXbd zqMmb|{n3kpoPmbier(kmkAu|pNO&3E*>iX?zdYO8Wp@5{un~7ev>2^3Q|RO?yDO6L z!Po~&iFNKh+>1PwkFb{0%q(w_cnggj34WGz=hSGsP7)!sc6JXQ+j=tTa2?eTMyv*B zQ)USRd2O4=;8+oV&&^}p>X^CMJyzRUTdqGOj_jS3>pYw(`+n8G0%T@d3NGjT=O;o4 zQXhoo!VOGN^S(C&sFn{j%Z;C2=8*SOC3*Bp_8qyfioY-o#STr`O|%$@=`k!C`X+FR zvUWlTC7encR|+`d8vEif6UwGNa8a-Y<>?~yIR|+3|MW6zSMn*Z?8zQX;1K<*25cq# zhpPFn`@i`N@gV>499t0CRg!De?tqRbn%uRfrXS1$z*mpKIVmqaj^@6)g)A{2f^Qoi zr_xIw^o9C}1iyirB~*PRw2bEDz6ZALxAHO{swKl8Op=^jSva|I=9n0&U$?ahBXA8!d3q`&ra%CiW2Au1Rfk>bjQ4ytUvirGd|7KZI~q}r$b>O$|kllpbz`mD;JIIMWWw!%%}Hh>lFE#^pL}i7(ZLqQJ1p zv1=!h%Pi!Gv|J`E>U;ZCgc*G$JGTj+<3{I5{S-N7p`}Fjkp^HyC>N46f0ZD6cOy!wlUYuLtRpCs*5K z6F9Dnt|Y(Sxa1a4yM6uUd(WxM>XGIK_tZlLBmd>AJL`*4shbbPw(5TkwQJX_8UVf8 z?8wXX$c;uTJcBt~{T8uL<%-khb?f{reS~l{hF~L%b!}%l@BbhjbSK%GEsRz7rT?+c zt~v|}hKoeVzeCC-XYa-eBTsqP9Fh<(G&RLl^DI5%Bx}?#FV#18?kTi+oiO7)H@?%*icI{EQ{ecWCjdCK7ckN4HkMT-PcMFFc4`Eeh>U)$X)2%Zl$ERJ)eGU4Eu zN_5k5%E3`TB}fbITC8%l+3$p_!gHM*8qycrG9axF<^Y+@O%Ez zZU)UK2@wr539s&Mztog-{jbHHBcG?-aCB*J|KIYJ$mP0Jpo9}{Y`;`K(a({`+XVgr zivANEEoceZijsv%cA(%KBg1@_~f7Aw%7UTZg~g4HFj3f%GIw z?XfBJ_0p6Vf3J-NXy{gjWIAeoA08oV&I2+_g&mc_ns*ZyzI%nuz1mmA9eLK^sLlKX z3i#J5OTX(ff4cb1d!Pg<$utOt_|sThSDO>d38kvK895Dx_pxKAJthbp5=rnpz9pz^ z^6iNVJ)fClLTziiwa6mJ3u{tolF@)Xi!pe=e8y|P6#G`rsqK<0jw6Teoh~Yz9c1-O&cY{-?4onQmWKZL*dz__ip!QX@2gm!+i+`rP{AQ45Xq` z+r=L0MKY@ev`Mmj);uhi*$@zR(uvDYFq&Q`;+tYJ0BjHs5PD2GPKFDbcs=$(!G;gE z>rmS|VYlt`9^u893Pr8{a&(o%s>Oth6FeW<5&*1=rtY0yHLV)oCqKM1=r#2@mITn7 z3-PX})bziL0Q#;SjzRYuLwYfjImC0*wKH`XhQ=HpTJm(;x+kD-O?SFTrZ%QvmS>fY zgv;ivIVrD_LoKExg7cEDQlCNXCkcbc6H6v)-}fOQWesN6N$FahO&DhKsS)j+-?@cU zk_nzSWVg8^j;9{1W;@y(8Xohj*0k&T_**KLYncMrlyGqFQV{E@sxJl%asHHXDNhcA zR|fFUKPj9hGk#WEpvDYqU>*{0@?DNJPdgAV28czX|K|)|5jufdgKq+blX-?U{%GH{ox&`5ugZxQ_Rr-#M3PIPZpEEwT}rwYHl z{<w-581DTvWpi93Qs52W*75S2BBEhQ1O@&UP?tE^1aLUvE z4@aYF^1Ipe7pX06rQXJM8%^7bBseT8W9EFI^U3BHz3Ap(Lxg6-*ag!sC{j&Vru2Z8 zdz@iHR)kd4fwfAyWwmgWze7NAI34vFWXZ8S!rp58TI-r{p9le0L#=ZnpudB^GoIy0oVJVi zR~;<*<9Go~E3x1dhyGtYK~~bNnT%c=_O;UYGfQjHf~HfL}=r#93+>nk5bb3Uh@y#so7dUvLsa_7`RB#M4~ za;vaxDV!>>gD|R`7HOUnoP4!k>zt8WnI8*WE37^~)yq4IIB#$SFI8%|>{$?YEveiX zwC1zwx#|<%)$6flO_W}<FF1!uac0p=N^#& zXw45TrKCC9<7{$OV?o=fSGX~uBQ0vPJBClu1cC}BvW&fB8abGz7XNJ1YY~_!nu?VK zDL!Vt@@VU7w(C;j03GAdw*3k0?4^G8Q(^rqIBYE#ChOc0VSP}o1m15b@t$J$oMU7& z?&EJ9lns-XG*ubT^Ib(SS1*trB1~`=+`Pam&-u>IX`42uO-_!4b@>pTc~reFGpnKT5rsz&dg_78cgD;kyxb~}qx<)(SfW`BzUM|5;;E%Us;DJ#!BdYbB@c4PX{ zHK_-fX-HeQ=E`tCw|?+w^xdz&H&JhD9Q|}@A`u^69bFAM9ne%3vr_FK7)Dxi7>QS% zW0+%321cT2ndJw%quV}VuQ`#M3FS=&pL8^H*R;WNU($8CWBeVeb*oJJ6PJ`;rM5Jp zs9MePLZ(e8yX8@CZB~>q7=%J(5lW<`$zGC*+*bc(9^Ob*(RUZeonE~OQ6ZY$)S?kx zWmIzkA8-1rD-zI%;he)c51kd#NA5i=^`eD|>|a%ZTHK%$&C2L93`y?VX+Wm3+Gok6 zGMqOewtFn8}1|39Je7d(swgYWF1xYChiy|o1Vw|3ApU~6le!*Aa!_J8@AbyVoI0Dh1@ zK=;I5hzKb4-7|W?!iRX4=f6zP98doiQM&pk)@<7)%tL?y?+C2=%tYPWA2S`4NNT^D zG6NiRk4uwUFYnsnyMzuS`V*B8t~sC}*HH3lXufdoPU0Nvy&vQ^9-wYozqjlE*aPbl z8};k|xr<^fjr?cFiR~Y5#%%x(LR+Oi#0HYP*nZJRf3J2%XndY2Q?mM}dPOtOwFRU% z^mZ-IwsdCB&nfYyH|F$K~VDY(Vk0g2`yg$@jLMGP)B;-KH zsd)igYdqghorz~1)|_Wl&FXj)AM}hat%(+cjg-|W0`k(p!H|;5Z>XLLoYmQGpKn5g zn0{9s2a4bS!h@8}%;Vhs&6PzOo8T1RLtw@V!Q}pS}KsMs>qu%UTd08B5@S(7$L3Qz1>nq)Iien^W?Bf6^Vk zF9Rkf32&rF`iDWNijlAplfe9njcEFpvkl((nD503xv9L`{pCeD1PBvGm1f{jm{O)V zDFQmO{iWm+zubG1L2JMsv{KXxWf=0Zk;>UASvXnNJLPfivkJ)7mlQg$XwFz-b_@&W@Dx6phhWQWh#gIX&ev-B&oNxjwqAl$& zTW2{Ur%$t0r(EQ!`7A{)Zt+&4R~S+ZT#l8>K*IVZWzO)WV_Bgll>9SxNdd2aY<*2! z%^A)|hVwDY?BojxQ7Y z3}N2&H6|jovz6_YJr8+;hZ=LvO=dM$xv*}OWXf}yT$Hq30(k(vTquR~mDu+$e3`)flUW`Ipb4l~V2B@1$L zxl85@87tApCslP?wZaDSYyajf^Sq0z0dc2E(22CGx5)lz7HZg~5oIR;x|70r@J%c9 zh_A+aXrdm&n>qZ8$0)9}W5Boa3Lmto&L7NUeRltmLJGJ8=T6C?Kssoe3JC87wu_ys z$JhThBG)Wz2xP-K_fe&OQ~Mn1+t|EoqD(_FULQ!fcNaie%Ly3|h0E}aF=0AMCRaNW zGsL1HDX&KVA=@O^mrZf&#_F8AstmE*dkM!kV0q^FIsV!w^fQ>uTISzulmzWQzOPoz zh^IE~SVyF85t*jn92r;pux`BLLj7;5AGIGde+#a}1W_ux{mIUT{MZalMq6A0Sy89| zG&r2zd_|{;G11G8Nkb*H55OC}DLX*xSCX5+sjKzJZTP$@8bzvk4@)iQyV`r4yfh%i zFpjnsoJE$WwlvvBI`FGgit|8q&gpxOYtun}ug#bP&gZR85T1FIHR-yWve0nEEPY)O zUDbUiAX?s-^oZxYQe#X=&c)R?9csBW;Gz zW(DxIMvqNixW97q)UrabMX%+9;Y(zc|f*?wJ z5dKR#V(b4nA^sl!KTb$`Mbj>R1XDCiMf}Q@xJ8fvS>VhPi*G4E-{HzfVOHFT%r*_U z39nyrQlmE9*WXH=0Sr@V)J;0imWAk5zoZ=F)>OjT4?MZ-mWPb_nF<_S@h)#0??^B_ zmyp6v)ruNn&?+Sv|Cab^_04hS{5ka#bG(%hRoVg#CE$#0Tg+s6%aLj8^o;T_Sz^-i zao>EbJqkupiurn2N{Vi(s0B2|&k~e7K9lZQeG(!gj`UtRDpCxLc(rm-aT#1Mxuzfc zDXN=WQcIdrsTNmxiECkHpc}+YV&CQKNK$<8UH8e(?-GZ)Rx`H-50u7794l5NetgTh zfWdzEw=sca%$P&a-QZkd5^@*ZhZ9fz>-~+qqjS89Nv?{TySiEnpnMJ2ZPm7p}g3~kId++PO1kI$j|@%xKI zjjFLujXUlQ&@3;Et++vpVw1Uap~sOwO}$}8C|!!!D86V)_G34=lAQki&YK!T3Y#27 zt-Uq-)5*YtQjDZtti@UFqBi;=#Wc?&mO<6jQBpxeJ$?lyHE~k^)bjFqhdAG3<|!q~ z_hz9GU$eM^%(JuO?`U->a$13siOpX{#gLw<3c+s`hs@s#}~7->T#0rtMTSuER9?z^lW+%&vSSiajih5dQ`$s zd|embZm2kgRyn?-2VHX1T}+ z=aU;lp(M(XMmqxAQV2zM=Vv>Y%28#(THjEQ`VPrqaoE!%yvp7}`ub)ri}9v^f`snB zO`V?VRZrS|IXBs z5TjRK_^t`;AT-;?_b5vGltL4ck_eNDyQsPrcFjwv-6-D{Qq=Gm%1A1~NGQ~FDQ|b^ z?FKg!9bJ+!*SypnZD1URs2J?D^`IvQY?;ztL6(wa8=_wn?}jx%@g3#xCGAXXEwH@=cmj9$gR@l{%uyxOj5^d)-%jVGn)N8uI+V<^WHm+yd6>-F zLTM6ZoQ1{;Yks3DyrABoMOf&d>^gG-L|SFsI)U(c?Kp>zj}0!!`$99D`9ibni=-VJ{5yE= zcFA>OLUjFKBl@n+x~2oemk)fTO%p6(7{cJ-eZ?FPJ&nb@@g$wR4_eh4orQ}yjB!rq zfa`CiJd(&I&b@5rZsPY>R{%rmw(0h8stj5=l>dX@k@>>7C*d3^0i4CzHU^VdgA)O{e@$s{fgKGqsh3%UN2>jF{)f;+#>!?KyT z@Ta4>O@P`YT$5x=$F2IPqeFRnZ5$@JN4?R5KI77FT=UQo(iMRL;?Ghe{@6@=t+c`- z;go+_U3-8@YYQ?aj0M+>`gHS~r=x7H(Ki25p7>F%foiHNKa>OihC#u=+RqXyts&1l z2$f;pGzE%4ZHEu~i#O=pm?&Mc<~th!7ul1cwD(<#H$g8`l1$`NhufK#CzuF1ZRtxr zG-W67W~UDmHWhpHi0A1}(KFe&F`c!3BVwo!zvBHEkyR0$A(YrGocb$Jl}>PU{aya^ zU^ZyFBzckIoDfL4N6MP{ZER{7n{~y^i+TLgY4ZSy(2TzEXS{o)2r zYDcH?&S#1k0(lAqLx2t>aj|(^DEJ08SQ}UE@Ka^?I~FgI$dSjqvV?p+Fi7@fwm*2Q z(zd?F-djtfZ#DkgV0K2xxc^5Z2uN6)F(iy%Q#U_E05~ zb34Py=`nlh=+*>+uvYVU3=va-Ah>G|m+GN|Tra=v8BZRb|Kr_Q_{`B)*e729w_F#R zleqXdK#%F^uG8(jO4jr(nqiVpOQU;Nye3`pR@fNg6LGzOgci8O-$_~cnF-rPA+y-9 z6VB|L2QTORZ1)zY+q{GPMuuM^lv~6+XzrNpxaTtr4@KV?TI6u}5Az@&J=n^iztE5u zOZe@yoBd}%?_1s>{2$}UYe-WOGSgz=GrxiEC5_4~2%3%_!0JC8m^v0z`AG1*as{yG zMMx?DSsvK}EDmM;G;Noq*8~3_LrlBw$cvxEFDnbSg`S+^X{(K zy{zfudUX!Omk7d~N2>-uhnt*CE_6(=xKB1qvcu(bLJ@+pm$8qK>v3pP6Dts)8kvZ-%m7i8PzMpP} zS#9=J>iHHk5V~wWv+VBQrzF?0^Xz?&=i85t>d}X;@RW;x0%ynVE_2lFw($+2#DG`h zh*YX5bn&kuS{vNfC%MbBx6bIQWldGVNe}CxSoihFy_4^z4qyPJB z_4|F?`>n`J>ihZO`vdr0d9VBB@co#4=kOhhL3l5C>3%;w^nV2OPfx#30mSm6VeQXm zcF<4WFG}#4N1noAX#Ci<#N!hr@gVQZV4?T<$UeT+{6Phv-#H*q^Q))q`W1k7>l6Iq z5^;6zg%qL4Ot6W52eNobq3L(3wz8|gxV9KN0m|AGC`b(3F~44@HL2*79+X7+Qnh?6 za=FB>GH_6Ns!j|b^D1jy4<-^$io+)BTi6QcV($HFbD(QmBx2x2kSggnXTp3B#7A0 z>b#G&QlGaGk4CF3Ofcn8pyBsVn2Nmt&L<9OVF%3W) z2RJs&dK~=#9TT#HoQc`Knpex{xdoQMBkIo*FrMnutUGiUAGa*E!blGld3aHyEzO0j zjA||DXWi%#MZ;uar+6h*tRu3i&r;(X>20ZP|1>g=<{D@9m(V#BCKonzY6YV`cTM{%Wy^buHXH+u=Q76#_N4t_T}b}Dp!v_ zR=IYNba=BFyO-)aLP&3xZ}dYX0rlwNKf(_#l zbE1v$=sng$16(WeuZS@HWz|`eDkJm^DpYiT;>!6b1!=`-4{c0LAAay*-Yz z2|>cpm&I&Yn?_$tlEC}L_{joM;J;(fWTooqK*}K*Ys9wXKyLZF?=8S*tkbVY=#5VRQzM_MaWw1$8r zG+e=!;ZPGEEQzTNQskopDH(u+2MTjy1{-|F@<(0nvfLC9ipGMZ#W*7qCNSYZKKw=g9GRmTWR`bmS8}GI zKO4*6nO9;%Wa@zv^+7vpG@D8-N&Axod1UuEfrH&8X|LWu1!|~nJkdq<%`?l((?yL+ zP1Z{+-EdV&%~r!-CAuo?dLmM1XS2hHUIEH^mCgBj?Zh54D#i=K{Oc-*BGqBu{GTQw z#}ELS3Bdn6O~Pi4oGshv%!5Y8Fnl&!s%cBL^wnV{|CfJO#A54=-{qG2yq|Vf;Trly zN}@v5r>?;OgSGBUvGJUWz6gA@7>{N=fvq1$Wbh(8?XKDnMiPpGCLJsA*0+61*0;f6 z4Xet2sxIwPUhdB#EUZ=c90n!h2Bsl1xVYKMj5PF zQi^sb@9<`=NTiPZbJn-{!E^Q3vf^CWirviL1ABfMtKv0gj5Hpx#=^5LRGh}m4;|i* z9T~#@^FmCHs&~+xHi4#)cmiFajR7MezV)BhjyN-zeAw#1kf34;T9pOgjKykR(b~=L zHtt2mF`EgMz6_er7qy`O4mn}yJ|4T9zUIw?K8rKCH*2WHXG4Jxxm92^wBU4I`eRzF z@isPVliY}P>c94%{Vf2AeV|oR@Frp@$vO>@dF$x~Z1$+z1zpZP`I#aFfR&iGkxoQc zZ&D>N1r*mU6lzA`GbYTu3u^Aaz%0A(DG~Wj#HyPt3b4w*@Jwn9Eg3$*PxR+Ssl1RA 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%0AB%y-u8oTx63}`5kXVgws8kvT>lRZF*6aQ-6 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�%@6c*Ax`8kC7_BP` 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 literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeC.svg b/lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeC.svg new file mode 100644 index 0000000..fdf80ef --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeC.svg @@ -0,0 +1,1623 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeD.pdf b/lib/ESPiLight/pilight/docs/source/images/adhoc-network-nodeD.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f0aeb5eb7b4099812f4a38d49c5f848fd23b6f39 GIT binary patch literal 292598 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

b@Vj&*q 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%0APhQTu+%Rn;mjnxzO%MGa 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

  • kTgjY2@MuSEi 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/images/attiny-wiring.pdf b/lib/ESPiLight/pilight/docs/source/images/attiny-wiring.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3ec6404c5ac0d65fc811c072484fc4811fdd53b7 GIT binary patch literal 589143 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�G4&cpy8U00knI(AZRS<~8Zb~>H; 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%0Aj!oTsf`{CxsJX|9Hhy}^zZvO2@C?2k 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̋I2p#1AJI-+3o)-Wf7~Zt!)%$QPe9>*Dn^7*eo7 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 >uyXoQ8M~x}G>6L+ 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ǚz!V=dl+_zpv>Vl6A(_F^v`= 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 C!HmBE literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/attiny-wiring.svg b/lib/ESPiLight/pilight/docs/source/images/attiny-wiring.svg new file mode 100644 index 0000000..eb0a84c --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/images/attiny-wiring.svg @@ -0,0 +1,1701 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/images/favicon.ico b/lib/ESPiLight/pilight/docs/source/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d071c8cfabca650112870b0acca2e71f45dac809 GIT binary patch literal 1150 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 MQc0pt%;d*^0SV}yq5uE@ literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/no.png b/lib/ESPiLight/pilight/docs/source/images/no.png new file mode 100644 index 0000000000000000000000000000000000000000..7b5cc8bb4e68ab1bbef1d2f03e3f43d6485936a2 GIT binary patch literal 3841 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 Xo~EcTU`I9b-&km?8>rR6?PLB2Y&L#% literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/pilight.png b/lib/ESPiLight/pilight/docs/source/images/pilight.png new file mode 100644 index 0000000000000000000000000000000000000000..d86ce1000ed4c85fc53de49544d7a8e6247e020e GIT binary patch literal 9839 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 V@_bB5@S^|#002ovPDHLkV1jgZ(4GJQ literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/soldering/1.jpg b/lib/ESPiLight/pilight/docs/source/images/soldering/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e14729e9b3b860849071195d26c6ecdbad29aa6 GIT binary patch literal 414844 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

    >32RKboD;l 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

    @}-3hJN)D`JF(MyPOeLbxWB z>z2pC;I~%a*?D}{H)U>WES!6mET3J}*7kPJlRvoVrpVS}%-yFRE~^tqxi<}MV1pU8 z_WZ%}1}L7bqX_Tq_Is6S%b|l!z*6mMS`r$Dk}?rR6r!;KfFuJ-bkdY$SlK*9@TwUm zPZczZd<-g1br1s&I(5T2Q?_tBe;c~88}Ap7rQX|%8%e!-yJyQB+uvmDJ)IDyquAM~ z^ZR27gxq_kini}7Qdd;RAs|*Hgc8lk;j-SV#o*jVo)V;DZ-`DPvEl)faax0ZHVz3IERy&X+0ePkPd8DE3i zJ&(Jy`2E{O9WKb*aEuHzR5^~(mK`rqSzhl3GK0qrEIw3N{plu&V}d%!yK3oV{cS=e z7MWer8k!M7KrYwuq%R<4c|sORlyaJQIvUL*Qz@!i&R1h6y2sw7LS}K#az~ifE_+9YE0aSk@$kL~PN@ zf}pY&1?xoxgNGFSRjx=qa_bGL+C8_G$yIHQy^`%+*&`kExh5%IcO5P|6_$?}tG(!Q z^m!ZwX7#FchNROAtPv=ZL_zJ1P)~Usv@!}mWNRZt-H1W09hbT>LD<3`Yh>AT zzBQ;Tww50QxbR(X*BfHKmQhQPu0_b?h?0LMrB*6D8;RtO8KYCVTS(C9N!&WA?g*z) zGN}wI<((_qPadus+BB8qnN}G9kTb%%KhpwhrG*Vt1tD@)ogh0!@UlsesLT9~!1jG^ z{{Y8TZr$ZJ#;5E}#aDyfF(Svb={H?&cMY_5^tm>r500g%3sns=#PT6x;eFf2Y5W_x z;<=9ODT$+&HV+(2QHdGcJZj)j15D$EI&Bh2OTy+O9d#o{$jIzS)kQ(r#cECmp{G-J z&tTTkZb&k_NBEaX;j`OTErX8UJ98<&Hff;SbkxvPOTRZ>69pziGn>Lgkw-~}KB+PF zb@F`y9@1Pcn@zp0cHgTI62hsbS1nN{nIq7$7{Sz7(ZT>4wd(aO^Fs~F$1J({^~MUC zs&@u;FG?z&1dODnf=)EG=AKVahHkFhuGGuPqH%g)7B zQ;C8KtO})lPxpeVWjo1)o5U5e??1i~@(m45L)4O*F|GngQIcLsTcM`(vePcdc#*a#3VxDd?~`IX2$) z+kIiZQ#rh;Gs#UoEmZXx9?oo6USP3!`C?SdR7I6)L`m1|(p!c0+W22iVrd}#;|!(g zAarMhwLn=T5<>DS9Z1?zv?1t6P6+EP{{W>Svz32Lk{oIP8WpNYs9K_o2@Q<(|J2oG z@-*200JVaPIlFLF+s7|9%$p~+D(We=-A`UoPLw--wMG&gPH%VRuvrHnrbUuE)^M_@ zV9YJyt?{yo>e#d_b-OSObpzR=CL%R7?W?h-Na(^zJQ*Z=ONG-Kig650JF4JThQEbt zOlKV`H$++9oZkC~5t-OjnJu$hhNq;5X=X6ylWp$kGlikS=C^*|**mW-g2!%ZO1fz# zqo$I%kKgqho3A$ZV;P?{8@~~Z-93@Hb6cMemsF;bU4x0NY=_-# zx+iR0LZ#{Ho**V|PA~58+r;lf6t2k_Wk^v={6sS|76`iYR%`$UmCbr&nG?jE6$z_O zw|yuD0SQ_bU^vloYmzC_tFZ7LSBIvq%k2!`Y;HPSc6(*ubCnyPtoH5~WzUG88YZo) z%O*E+XRE1qAK5^!Lqj~lW^{I($EQf7OgvSRUAf|c=3q~Y6OaP%K!~g26OuvFtLDV? z`bKoiB$mQrS~kQ%3?StHRA1E%c8GX-uyX@Z&NznIj0G*GQ41 zAwmu#QPxckl1)0S?I(tgu1F+C3o8K4=cQ0FEldEQfxx$)N&4Bh)ix77*D_L6XZ9Y; z?K~A$<6LIa+I6**x$4}sbeKB*&z+v4s<$a7N}?2`pvTLQn;OsuRys+4ZO1J45!y~} z9iT!)K)U!rjY%q$3hvaaK9<1p$6I(7JBx_I1(}n$>1|<06$DhGitq$fob=I*sah?| zwrX(6F4ycTNjEm`T+Z}LO_8%UZhIR(Lav7$wK3T!a@%V$wjJq-p>&8xK284GBFc*X z--)HRVIX-Tol>Fd-YYQ_Iy5ezTC_tzNF>w_s#PUcjfaZ5fDwUJpr^zbfGNf5apzOi z?bDI2-Zi!R)3qvlLpPS2BQ8634a&6Rcx>#=ejVoP>}@vS%PUQg#_k!Vl6i5l$H`-0#qNCe_0^ld4oqrQEtG4|c1+)NU^fF%AV>>t?}Jjv(?rkB3nxpp%N{sw8tt0EcezW^NQ9 z(Q8o5T&!!VoNB~?2M(q_OMG?AnXR*oz+tF17V6&lTFjkx+Jc(8r?4va?L94aV`=R! zEI&_#lWZ)J|$uiJYoXzX3J zi~j&bm<+u<_!zc!?8xMHM$nIOWb;)OV9-lO)f5mRX(W-FG>~boE*j=!zMkdgtysv; ziZu)*LFmjB0aqbFUxa48I)d6eV6j7PhLr39-Pjzwg;?pS{52$;8gzleXZBv*#cpbt zy05KMCsUW3Zs26yvF}{gI+A>DHd<_k&%n(?ny06t-EAOQD(a^5jDu7G5seUr^IT0N zK`rKud_r;|N2uTeY9~k@R25^~&E?Zfh>i@&D`*3ZjDVWtuvG+_c@hGQ0q4~1g;Tco zT2poH40Tu<4Vq5mt;hD)YCg-rdtvjmJ@?wItCnZGzKBKPM zmX^N*lfcWjcGk|_TRJ#8`y+{)Ke_k6YyHj+O$QIu_=?PPZESAfuH01bmJw6eeZ&-U zOqBlswxd;Q^TMTDTF7X=9Bf$AfHM-x6=+GKg4}p@WelaiO@Lk{*aceT{+Ix@P5?Eh z^Xcr+e|YeF0}oq^+g%a3t7z$W7H7M+&MUh%{!=-oy~*aJL64WIPJLT_AcGa zZY<^&x|8=L+x2Y@Cb$nQg~0Tx3IZAAxR?bLMUE42+K=M!iBJd}9jdG7dZr`;!bB4h z#ibDdqcqfO$AJK9JSsXxO^561%+_X1erI|?Q&Bz??HWn;{F|bNP2!Y{+02$p9U4&N zBiqqQ#upz%v$YH{D%5L*EL zP6|GGZccq{VGb zpOM8>P}E8G`084!N*9@9khO=pXq?Fmv-k;W)d{6agQp~xF7n7n4N8GUano(!#*Z9q z(nt+ngb_o)1pq4jjMXELO&hjM_Wr}?I|F&H^z0fqQ*qVhH=5N}?!C{pS8dkN;C7x1 zdT&geQBzWN#T6BL#EC$Nn&gf|M13e2h8-yKq#ve9C(yGTvD8bue2#p&^Gxj|TBK#I z6-7M;6a}KKe9xy!uFp!nuetVS$cq(#*n4+-(CmHTKEU6*Lv!ujkxf#LXQJKM>Rjey zaqbA9-3X?aAzwzcb-73)((tM}sd7Xsd;@k}Pyzx+T5$lRO!coF40TqO6~|WwH-!`e zP}Jq0kD055r>39^k0aJy!H(`townqu&tfuo?yareRU7MjS5Q?^uG8PqRc9-4-C>@O zZ{>V@=NYx2uceZPiX4guWCf&(Ff7b4jaY?{31i2HuS2UG{-hx3NAsawOXo`UW@9B~ z@R*^;hyh?g;uc>u^(tt6dO_^%*HeqZ?TnW0$YwL!H)_GVcg_cD^v>+U_5S$l?c0>i zQbRuU-aCSi2{w8DkG7cMxl;q1uI@GtMPs= zn^mC zikE!mb{ub2*w{Rl=Ed$xY%M0xq^J@)Q)1+-sFFm8G@?eazi)*d&w!D_Sm|QQ^rk9m zpqih;G>p?dTUm8zNi6jk0frCZ;%WYv)cu`3=jbHHZceS;S+1PhR22JyyC;ywY@LT) zli8KKn{MK$C!hQ6pO-hd^LY)nn}WX}Ws;`8o{nV4QR;%|%0=XMMqu;7CD0XR2#KLc z?GCZvSB)xI`O}9~NVEz>lSZ}0S)?TXAcepfr8{T=>!qQ=;_|iFnYRA`UiVa(ouPu- zn|FA0{{U_8&574pCX$N2O!gaUt4CY=JMFeJ;m4g?1aeF7=bMnRzc>dmM|OubedjCW-JkS zCKLN?$0UCWzO*XlR?JoXcc>~0?2;t_!q;=09xo5>}^Rly>cX8rr_a!c4F`C2E zW}5-mwDfzoH3fFrlO+_GYTTa0+qi0=wQ$<*JLr9-6C z$WxE5I;uJabq5|;Q=cj^&3=BIIuQ3QM{(?IUJDtW+gN?KUAOjR`@65J_peRtEt{Xn zK-5rB?yd2J%RDq0Jmp?Bpow;^Ozlx4(Onv~vj@z;piUA<15dfi?l!@*mEmI<`DzY&O5301! zshs+$Y7Bh3Z^T%eUXc{7!$kpLJtIv(AoC`bK3xU)Np`nw?mGOQ^bwQ*7!gEE-YLRme9zZYOZ=Ey>wmdjv`0tVwZ{w9NL2OCStYB30KCM+o9lH*yD% z3biX=;_3MsNy4l_%(yhvf}_tQs*~~=>UPZRoQ@M4liOQI2iN(Gg(Ftrsw#8zDcm`& zenKZ7d=*^M2X%lR0XmeK*aw(D0hTbzoEA@oE5}GeDt=_2QPajlFV}RPGqT{J&CAvGeSHpBJ%P_t;3eL2 zb}w<()59KD1iQU(n|h;YQ0yo*dFd*r%22@a2qN`HSiHn(jwx;D(VZa}=?~`4uE6Jj zF%12kYDGp0@wziG$zTD}H~`8BVe)zr*L`!@P1pNNYgBFxi?R1_SLZh!Hd2EFxa!X4 z{{Tn%+8nA^WjhM5tSGX(cOAUytL0XFOuMpbx+G|PXd_c|LibR)nhE1s^pMEN9l-Tp z5lX_x_`qZ4M^{jV8Y!YCCLropC=EC(Y3^`1=>>k?k{ONdlHJt1)(XttH#f64UvNvi z_g>MT_!cIcc2;8R5*?y4RQSj$vinYwTB*X$^mz~A^wj#|(jx+2Y=a^K@k+pXf=LFy z#HbcGAn_qaasaJ5Zbg-wF!y;iD8jx$jaYqzpSP!c)^@M0dkVIuuM@R*?tcYa3U%uB z7WRC;+}Jylbztfs#M5le&xVgAqiXf>no<4ONMy%DTO^XpE9oSvf+E_cw9__f#Sy^O z=4cfeTl!cZBiDwwz)OT^z+F0I(Acd<63Rh2uOG9fEYDu-$_fpafZJW2v^y(vX7iPs zTQf(ub{6_+Hr;+&zJn)ImD@SY)eavMx$+db23&93V@#4%d0tI1M!@^4N|GxyYjO>H z+DMgSKA~jR)gzB`p{7kbu}4Bn_43EU2o3N%1~Bs?e()K>zrX)FW|9ILkyFjD@qbYEv$}? zpwDor!H`J9B~`)5vt7suq)6P%<29Dx?pW!=VqIRcq1CtwXr67!CEa z_vc^kt=Y4%MsBj*&{jnoVX$?3s+OK?e&@tuvpM)SH{Y!tc5R`jpjqLVMrL+UEDQ`J zYkA8k8AcBika*PzA(Rn8T=`Jn8Kf8igEi;ZeYv@Er)-6E?eJA=P_ZH@b73 zX+K-%YNFY>F1yC%cDD9foxqlxx^vsFw<)CCdnaS=Ty{oivGLN<(gt)|#*D4xYBjir z#*$kJ9tsAogAu0{Ei7T2mGmOC;a;qTW=QEWBx4lRB_*qnv9VS8@t{9GnzI`NXl_l% zzHoaUpL*_pdvGgyQ4+aI253A6}-Vx za4-)--dC>sFA-O@J1eq!g9q{B5sdr2y_DPCUk6%s#^K!EbDN>2q_4%`k#f8Dv^N)V z<}+&?6=HmJ)ihAbLaa|C1*kU)z6`sCv(FoiDdH-zVTMB-2pAG6-LE`FPg_$!*Mb=q z2SN*!X#fWy^-95MUKk#g=n_m`Lv3!1Ee>X9-$shvykkivu!!^obUdh2XrvAeJMURP)2Cf<_m?3U=-6q4_(zgO0EjZO-P zSLJ?KZX70m4HO&KXymaK4JHq2$1=}eAb8xJ!l(%cIaMflrB8P?EGcBOn}b>IUB4nJu$XPgU1FlK4zVTGnFo8(%q# z`yHvi_g`x6?39=)&FistcTNYQC12=h=HgUwixsG;&DO%Ins20o8@?vB=zV($H;HXaSt zj>+M+$69WB3O(7nwuJbIzqE(>pDsexm%jsF=eD(^@+&j_Qia=k}5o0UO6GFsA~G0o0${t z2v%=*mOz4AVK|Zi-MLm!*rt^lK}Hq$T7dO>O&iB7XwkHQ)S8k-4-!G{Q$T8>qolrP z8()Om8&;PoLqoN&S^Py!Ocycd4J0r~ zv2&<1h8dAevD-=!^%$zBx`W^VRODcSNdEv2UJV?Cg3;>j4UyW%@n(Pu`gw5aQkTuH6>QDh%MYeESf-az$}Ox<3mshML!6s#yU{XcA!A0Dh>r|tiy>?Dh8$WrB9bm z+mo)lPjNxl{b`r#`YpYguEFH1aP|9pVdUyN54|^D-N;J@;oBQ~H-^Y=h_}X8ifV?5 zGBk-riA82Epdyl@jSOTpvKgJFvhtt8wyqzp_UXj- z1tk_+_~v$#E1sgMqC10RZR$D}o_fsmvdvo1tvpComi}iFsfFf|6{KbbTmX*a0c%D@ zJSYnR>DG%z+MKL&Ftlu#7aFYNH2H zrcmJ0nWx#+!m@bq#U7DBK)?j?1#^SM9E_f`?A!+2t=)Ao&}UV*c6dM*8`fD+_aof8lnSG5# z+8c5%!=jT3nTspf9i!U&Ub`+a8Egdfzh{ldQe){p;3_jGAxbs*H8(qn&4=W zVvX4<^zhh+j#Cf^P&GNun)P`!!4a0##DAuBE6TuB3Wr5xWL7x^N0vH7VYB_W+G((7 z>`Ajdqlm!m?ZZ{GHfHnPLOej(*qQ1g?2P9B0Lox8IDO@}FtiUGb+FJ%C8)~kT?)y| zTf#_~*~fSR`jVj?nW-qD2f>|!g>?K#R5dBbuOcfjo#G&vg;^ItF`fiGYC)r7jxk*0 zp+joWZrt}*;WB+%`5f*qcIFQ6`4h1E!?E(6i`kR)RtF%I+fx_3cIHoM#Z%VXKOHqZ zba>PJYavroXNcxr4~anX2qZ@Mh^TN41$wioNg!+Q z7HdKWeIs^8;)InRBCz3*5Rh^!&@H{QF>S}}y{A4iyLNsLE4pYEddnwKg~@Hoouiz1 zv-rGT`rg!#oV*+Mwypl+mPpb$Bd3j0MAoboWyJ*YTtQ$U{S~2#W@QcVN#ZFPiHM+D z)lM^xljd<6&vmWU+btMY48IE@siP=8z+t%8sPt8lp1f_Lk8R)K-R1TVL$9{1VJannWEQfzpggjM*JKvr6C=zNY3^1bib)#hLTO-9 zSj!T1cCZu#^!$b0AV}xaC?JG%)UF5ij*h*`#C`%ut!O&$DO;ATtCKgE%;Pu4*vvz= ztFpW6t~%okxx5Brtx(lfZC<{`SJO~Mgu(UQO!3p?s*N;Q+KEVSB&Y@5({m(AX00R3 z;WSTgDGF6dEL0JzQ6Lu*MrsBzo|$tDPLdcAM~Wnk#Y(##&`H1`p3;qwe7YO=2J`Gr zVRhEucYqu-mE@bLERlv&NZ-@}o1`|m!o-E=#1sXCWxO^vHcs=U1m%b2L5 z)Z;@)2fACjSu3@~K-kLh=q_avctBN3OdZl%(u2fW)O?3lV7Cnm+nQ)b!lE=`%V{G( z3nXM8i@KQ|0o1eBZ3(wWSJu%`=P2@YG+PkO{9|Zu-L;V4ZIi}iH=)|ShxT=>kYu8k zDCy(d6$_D)P_Y`482flH(oC0jw~^@)zPTchv{DyCphy`s)GuqRsM2x@^=3hKO}y64 z<7-l?(P@zawrQcOhN-C37#a|In;i{KCwcCDze_>7wp?AqHA`%Xx4U1wFb@HDC( zpKD`rTZhR-vA4wYVt(F_KljFJSRiI5Mss@HMz-;nR_t3)N=rlGhr?A-q*>tZpaX?< z5Gg_HH%UT%N=qV;DRe-O;M^Wmwk7Dd>=VH)roM&p+Yr=^jl;R=@Nwj$8*@3@*@{Yxw%e(mS*q#grk1g49<~1fah4LrM!udKi`z@hqv>V2 z(0n1{mMsWh)L7(FucJ*tpsM^OC^}BFy2BhU^2R(-O;Cyn$HGcCXmEJcidPJJ<%?aL zKKPQibM`L5+BNn0-M6^#dq1!nA-XnB;-0?_&yC#uxxc7!Plkf43FLx2)+}S*o_A9e zK~!?x#FlbI5n;KG-Ju0cAj>EU$Ml#Ik_Q7Q;aF+nGt#Sg=Zwh991k#O46+c4I2wxf zx;d!RsZDcUpR-tD+S}{2Z6P6tnXpk}4R*Dm-l>gMfZ60Q7|H7T%ld z9lc`7+DwVsKHR~4(9GHnNpEs=&2T+sWEEA zERn5?*eXKHXo_tu3JpNKjRZ1MpGa|)m2hS7PJzo zg1VZ&rsqiDLGt_;MuDWbXwP)Je(0g$v{LjZnVWWv;CHa#|a`=4i2v2xr^Qb*Gf=}3sC7`W7j>o8&As5eo~jczZ^d(?peiA*hAp*QG>Tc8TJSM~;EkZED3hE2D~s(i*K&G&M3!I*FdaQ|C5z zP4jz)VdQaJXD3O9+xu^>al7d@k7MtB&q)qd_cbo?pvO||81p-Qr&@H!PPDHiRH78L zXdSO_Gfwi|T`Lq3EYeBz;;34xEvM2|;Q)@u3dp6fPNPbn79R#BUk1)7wJ|eic1$@MoNg~6Q-rRprIQ8P*zA*1 z&sp1e+Um1ckfMfNe`-=dEQEW!j*lhDOQ`C)KssuGmC}46@W@mB5sg4>)bzJQtPr$t zxMQiSU)0lDl53Pl;DZE?9=$N(^H|#I3Ld@38@jeD zZcVkdsQ1SBtgnttgd-mo? zotwM%{^gHpQ|zsoPeIeTT(vBe*$vCo8#k`@Ui{xRH7=A;W@g#*Nj4*H9MQyqR* zu&o_A)-A}>HSN@p&vqqSWvGrhWl2I4@iPRDG}ZXKQK>;fPfrGl7?v1FX-TY)5=k3V z$OddZbT1yz{a8ST$mijsm^*Jx(8L@;K$wI;2|)mCKl_^RqkWXNs} zk&moM>8T=y7m;RW1=2M2CW&E@Lzvy192clMNAySyS3Eut2XU_stini|MnVD;kPpOh zL8_&24O@heS8Hxx^m)}d>}Cd^Ctb3!SdPK2 z+4#(6Q*7s^YU5E=C)z~yBv3;yjYB;EjYa8!tnFeYnWvcwO5ji^Lhmae2e2|m(m1IB zan(CxhBTGsmP&xJ#6ba=lUC4!Q!vhrN{d0Qj(P!UsWX_3?Mt71$kp;iyLTQd{Uu`a zIGWzSsNNXNeQcXCaBijLvQ3DrQoo$3VqF;24I`Th(en&k@tU*WESL_%6WPdxNm4 zXxDwy<09S}%AKjT@?DXV+}n|9>#_;FDz}|YPV30^E*_O6tD3h7I#*ZJpz$jfx3v+; z99F+c6thQc7y%l%M4+K(l@Uuxr#cY79GX|Fy2$qlEyQUg;XTiUeq8WEy7KULcVt1`2=sH?dFK)^WZu{5MY z9hMbSq$_FtH5nR}DWan)r?{Mv)Xu%=j>GP~$3^1Ud-n;nsg4?_vAY*+?YtFM)YyAh z8MS`qF)cFG?cKjezY=OtS{dtU>rl>ysxc<3tCA-W+}~~!sI*OFv6?j0>H!f((iIi1 zD512RP@Hs}H;FuU*6L)P=n-@~8ZoA}(j9`HJ=Co*dP?LUAJ{d=H@NFEbRB8em@0~C zVB2(*%h-4=i$_@#({5TkR`Ab3L!7PbY{htdic{6r1d>XL<4+2y2vy-&#oW+^ETi;; z1r_`V3jzo~6X{S$slh#2k=4ztGWn6>FfEbsF#?2Anm{B|0Cc3KuiLwSYhe3VZgo!Y z#%?umtzoiORgoIMu199rh;j+%ANn}{UoTur7T9WwG?tcmgpz{Z$l?GC5 zK5BxGvoRSA##?FUa+Fea{{UO=S^EC~aBhwHRYf$o{>t24i;FpYPH!QOsIF=jnt-KD zv}%#0k;Dl)0HU7-M6KbKU0S>prZo*EOOu*{XmCj*9dEP58cd4|FlICi>1^sc4cb=#|L)a=duyDQ|Dg0BaZ>h8=rP1jRPviH1kRn^6?va@bI$4yPNF;z5P zYD(;+6cv?PAV}#huX4&lk;cIwjh%=LLaH-RXS=!d9zGfhyHg+zoO1PHGQwn>aw0K)lr+T!@*NqxN|i58K%UY zk=K~ry-<_EPcW&SBz7qiG_9uh3b8MWVF0NE4g#paW^&(*U_BE7jqhTfaswW?&HL>L{B(A#%oOGRCn z$o-qNIW}<=Ger5J|CZQvUJd!aUZtS8c{L2=le2)&a>7l$tG5Cm} z67pz{IvlY8Hn;R$B>Gd2P1ITJvQh2qJ!a^o+>vdL!k=<%{0%NYbxB9Kw;Yso@K9mo zmjgG3zpy(}j<-%qnd+gg#K8l?UrUdAF{tn!GR-IiX<@Ag4#C_OgNvOsJSs<4XF&Sp zZ6&D1>J^PV#Z;e?=kn{EIo#CwX*UiR`-ie-OkVBXpKF2LO|tgqSLAZE87w_lUv0g= zk*CblZH)FwS4v`p6>nQ#BQ%vtT(U7D#0$N|qsAhdv=w)+;ZlK4k18n$2T#c(x$v!H zt+hvKp{W`19I-l&&9mq_Y^vIHc)i!Ov6V7yylzsfZ*6$@9@?$LZauZID6ng@j!KmF zEglCkoBs7z=j&%mzv49YvCC0B3ewX=ES}uZo+~oAARmuHx}gGrKwMOO%|YXynOUVV zEFw)hiTp)a=QS(=A7~Wv7|%@k%II+09)gn-w_t{gbmX9=pRzLIef8NJr*Q3A>Z(rX z>P)^ul8bQdouf8piWpc^GYBVDM}1_ky`aI46=jEsSck>^IR!NepDL*N9-5hy)#lYK z!vUC+r_on5r9D9><~u{k`~MlM%uWGWYDZ9S!i+x=gO$R%fbrpAO<1kpN9m!kOc&4pPmgw90ye8zQ z#>WnKF}kCnf%2HArkVjPfO($kbgE)TWo=+#ijbO!_&_AJMSQcv9cZ$>JG84-nt>!& zHJ|{gA7JUquK|hLwMz{BbBo=hb9MG3chPP9FJNNxuUouo@@jBVW%3vr{mql?3~tt; zkz;MMH`wHAvEoT8k~EB;ZijBwweT8*3W|^z<-1i>c!T&(pea&M4yy3HOszST1{gJ^ zN0F<3ADE%d2S^m7&h8AX8y6J?WR-at_ZY$A`u3u#t7@5dWRYh#F74Z$e_b4BAGBiH z6f>*7Fh@ODr%zRo0?l;3xQ6EA1Aqv@}DC=Yvr05X*%Yk8P!|9lN`G@Yf)pRs4`UJ4Ru8{ zZ_UXk-pfrMCW%!kRTOlPgZPfBt1UQb3tu97pje$0DAoa?Y!y;Cj@;@e_=)+BrQ<8I zTdsp;#emt{LlOL6dto+D@GX(La@eiK+!@?OE;BuY#qS^DIeMBbemfSCiRr82F$BoT zBWO(u=-GDF5hftDz|a<+rP*n#(J%eJ9{jirT#xy9IiBRjK3;Op56uHAvXd>S9PAG}45Ce8>X6 zqoz83*OsFTO|mjG_0s05aJ4zOD)T*CvMO>a;*y^U)|lOcx^Qt&?uFddRAm0;Q^!q3 zPz2H$EbM$PEx8xCt73SRBIK-!C=Zb+aZ~DlKAW2S)y{R*Is!4--bx zfIYVC;zwaK8Nsa>w~n;@RBG!r{wCB2;ZB@XcBY8XLtNkpv%yq~eqahy&!_I&+&?5}Sg7@N|c*cFlctOms71a5a?~ z36dw02rOLtqygtX4!f$J3We23p~QqcEUog;2_ALox`a{dWq<|8>MAp+Cm{_1QRqp> zmq1(9=I}-z?+smFNWRsnsooS=D(JHLZLvw2-V~J8J8pw+?K*{gw#$<-jHaG?jJ>%NY9lUC%3+X zS{0|rQf79x>CWyP&r)EkaOYbh;!J8x(9-c!$!#_XN9ML|ym1{L8jR@FT5vX~W> zuCIP$ncC<`j z?()lFH!o>rGW~zpIc@z8J2}~Odp~bdRqsBlz*W~lJ}O)0(R?$NDBL`W3aoUk zaCMpwx1j@T;_>pxm#%_$R=Bdl5MMp$Gq>lH%C}! zdgpmG^jmjs&VrVLqO8`mi8M~JDRs3jbjYaXbgG{0MRJc?P=qnneMSkVR*fY_bn!Ki zxCmr{*ZngSMn5WnUtWv;#>LlDRBj%|*xS|}y}UL&!*T7(Dk{93eYcg(W-?abq3BrI)YVxGm3G6QAH6q_q23j{@MC(CEuFi&=K;C!RH?ah`@nCl&r6Y; zeQcexwkcSbYRD)?QMF2g#^k+6PZr)35=9_d#ANW}W*-SxrX(B)s3(C2omKS61hUl% zgGbS*>GK733N21CLFxxt>+&$}s=I88sk=iRS=nyYbp4Z)!1kmY({%2AxjiP+&Fzh= z6&Bpw8GP2k!cQy}4-}^vPnU4wH1Wn?O7NnzkcPJ;tt#)FVP^p zX`~X-2*Q8?8OtFo0TiO}uc@z1`%aeu4_Q#-TYv1>sc>^4 z5(R12(w-{0rhv5!3Nc+-sTD~Ugm*7+BO-^Sej#>q=C=)OsaM+=sAB#JgQD%MUT5rR zHnw6&sPjFa*)K<&mnXKeJ7YCgl2Sn&l?z!|-fb+Yp_!NqS$sHcS|WrJjEa1+tb{0F zMnM!f6zkH~XQa~tuE2PR#VcM6kDopvtBTj5I~)Fw`qy^vw!$vTi=yD4AA{a|nzLsXJ3 zBvNSY;amwjmjggFBBe+jT~!#mUBaxzj)@wiqYeYagoW-I4NUotx$I0I$UViqy3>2+ zGQEwqGQEwp^P4vZ+MAyXzITl_@ubYdBhcV>9X1vW_Iq)@f)h4fr5nW)MYIRoyO6IzVA3Alp9#(gYQkg>hGGR#b%P9uDa2ltFNgU=o zC%1b~HAR%`orAfzhgs8C#hb(Ay6<>lI^uV$ii-iWHl24_2=O$#P4?wuuvW@WA+4`= z`^t%tRZ7c?N#c-1ZW;6d;fzC2P%1+WOc`3W)GJOsF&>8{kVQwvm3<>o?+pH8J)NvyWIH}{)t0hCcR|PH?NC30y(hg|A zmS0L7Hv^pX_gxhhQ*6~f)Z5rhe$|&7UAwmq27bVK``de+qeY93NxL4qbS(sX%dIkd z)+VdLVR7)(Ryrh}4N9g@d$B|w6`aiyN@}92(W7CiV3-CAQAK2~lHgK=_32(fUT|IG zIW*GLs|t9E4M`uxOp5HO6D@t@|Cfzyz0Pf6tTDNueChOO}>Y?jhiSeeNsk)P6)=jdp zmDLBcci!OK8%i$2ixIW5F6)G*t(G>>D@O7IjbZz|G2A8q3*`BT2x&6gKkfF(%$Y`o}G_xgRGQ~**5dn6qNYX<0 zLN-Z?>1C0UR@4qWDOX65P!11}hQ4*{-JP+tx}sO@WKxR3se+G~*qTz9C+z8rNw+ch z>8U5%+ty8!lH9AdYWhnV*>%+0+PihqLp2r;D~ZEmG4D3x#bM1-sx^EMQ6+Q7N-V7- z7Tu$fSgcS9;tNvY{5epX;FDCZ78aYKmgM{8-9zS z`1`asR`bjJ>+9a$?9Gw5>9;gE{C8C6cJ@bmZ@v4A+q4;Oqw8+T?RpH&G_)}7<)DFb z*eo3sIVkHOKXPg#4MO+Ta}C{$+kKos_e~GTQEtMA)fs5Th^@rl{CZGZRq3s64vCxqrJjebp5X z*WSB(x1`;^dAh9d0K#oZa~vX(Oc0 z=5koqnw}<}Se{4Xt1_j#%RC+>iYx1*Jg);6roB<9V+zy_GAn7V0~&Q|Gs+=?T{l|6 z&;SBe3&By?=#b=)jimYm(wlbAjLGk+8229k0Ksm!diQB~bHT}5UZdTQsZ#beg0Z?~fh9Lnr2TD#Cy=d?;iBG70d zQPdMkC~YVS#*>w5(C4cMZxs>US>t1qmQzYFaz$By_>Tq|r%RpHme~||y}`Yu-5avI zuzuFMkFWRaJAWmK>kj3rtfl@7z4Ch>W~SW3(DmF~dkr#UWh6Wj$r}(n?4?vf9218 z0CDzK^V!p;(B3=4WH#1|35wiXs!iwCP)WHmbTZR!9otbyh=+D%vv@tHL0vT@Uu2(d z)X^DTQf@t>e;?_r?=7usI>=qrsC{f2s*y50WYgjXp|xPtbnKo4k9P#qD#XjAJ#?r9 zV8|I-nvM<+s69yA`&X&=p5^}R)9p-y)9y;#*4n{#mcY)|Y)-qb+?!hhMIIiHVbWkT z`5C(EnIT%*y6I@-&*UX?>|wjvM7MFnJSJO6?yXFytTeh#iy=C6AB@Tg(%OS7X&@dQ zT^2@yVz)*+ksC+>W$@$*Kw#Mls=3n2)W{@LrfFKIVr{G@>+2luMz;`|S+ZGf%FcDV zQawLsP(%Q$KvchRvTWUhpUYM54adB2xI86W)rItZZ&#U?f26 zq$-kPeLb>9&ccn3I5h*N7&A0w#ARJhf>pIJY&d_wLgIuIgHhHDCVrDK{lV$J&)pPQ z?x@+B?b({Drril&OS1F1N~l@!`>|>E1|V-roQ+gfNA9XlMzqNym~}*;ueup0vyS5O zIc9k7rw%Y#8a8!}inVGLm6p5#>u4gmCP@+~=8gi2r0Hd0Rj-H?k_e$t$)thA z^zB>QJI`+7YN)nPb3v2Xn|2CbpxS$TJ0|zRZEg3B+!WOj=f7gyhfq)VdUjtUD0A=Gw#HuOBr(wIfcoG}7MiP>* z9&}zk`Lx+vPdzry-o2~0wnIF$wDg;U ztg3P~w3VBiaPN%%J%trcI&mwRToy?5k+@`zWUBjDrL$P--N{{) z?9Hh~j?V6$&)S=2nVy29Z+wB<*cy64v9{iSa6<(yOB+j>mPsmSQ6!RRVmIO27_JuD z?&=%m3mPGdM4?uUW`xwl;bS_*8m%2xfSPpHqNd%iEnuBkR;wnc*uTPsm$^-T9ZOY^ zSEe1omZZ;R>N3<_QMUF5Hx`r|@?D37&rj8xBOOP!;)a_){n6Ul+Wf9u{{VfGqLJw` z_0r2*R09fF9S^13hPbfXZ{b6(Q54ce z5k0KIP2G>G-LNi4 zA&JOsYWloD-npH$o&^tzq(zX`H=3mQ^ai1rUcJjOi|Wm?GV5a-6_2q*Q?O-akvrBl za>12WgRRLJgjxkI@TqmL6~L`oS15IUn;juQ?$2NU*496CZLP4IGip6Yk{Zs%!2bYw zcP!CveVy4!PfNDqnayhLy|+vK^y_TSU`7?ie5Q7XTU6Z^{@s>HVwtT{Sjt9<>?0+G zSazXus~8~Ev}(jI0q*HkQOaU7w!J#a0^q1Q$rWPk2a^#)_ zg@wW6^LsCU=3>Ip?pW0){{Tk&U#hlVD;W;yug+pI)5-^i7YSIxq2Eatu($EC_w2a znaAMvr)FpB(;2z8PSwIijCt@lN*v}lvoJe}v9ZYb9DXaYr>4&3(w?-5b1~IAvB$_= zRL0?bwG+l(Smt2$k%VCaC>g*avH*y2+)Gpnn%AqHMPdQVNEcBitwHNh7r6c%Abh=g zQElDDm)m=vAiKkP@1223M)kDW?#kI2`KotDa;~x^+&gP-?hFnebH$3S#eWKv(bLn@ z)KgJX#Vg&J)GxY9w#6h#BUu8I*rZZf0io9Bip20|U`CNe2d#;2HN@eH$UxFqP$C{W zR4FPC#6Y7nQlxbkHMce%FRwPs^ng z+Ix13F@Tbmr|hZfs+H)}22$+P1rj2`HJoV(qNq})Iz=04t7>x9kb_EuKmg%DGvr?$ zOPO_sf~-U91>7m1Rg5iGxuY{yyiX37n{#4yKHke=ayy6Qe%${0wtAm=;P!`A;Ws4x zcej@tX{?S(^*$3$c>R@38hv#UlSjyDa>44ZTeh8MY=#-P&Z@Du}3O68}2 z=!m02;+avNy)<`s39dsFHpY~TUyC88Mx_*u3B^Q?LY$hMbdEhaoT$fSYN&eRvwp+5 z^YTU0J(Qh?Q`gb&%p5h<`F+ir#cVwLLpx$Jn3+U#oq0*a<6AV%;Z zES@0}k>aFC4NQt8A|Ti!#3oiWR0P+nxI;A3hMAxSovImpMx_)mKqM=`h=!WflR?uq z+^E}mT#Puq@4c&WTO(ub8muh__5T1zxym}-p9OU^vhDgDrpd$OO?F;Wo~dejW096v za;!v+Q5Sx=OThDFgYU$#VlW}c5wlWY>(#M=yIiDw6 z6&#e9nBG6RGRoFF4HmR{$LcsBrn)#BNGul!0U*8sV?`C~ZyN!n9tuaV0>M#L5CZMt#C#xP#yE8&7G0Lr8u)Rkr3hld7NpP`8Z+03ps5DDI?`)KKd30efN^YO ziVB6Nok*eM(4~j$YAvg`zrOg~&tX*drUMYTjnLI~n}1+!jf+z}#beC$z8`5!)9zi{ zNKngO)v>^``etR2f$iz2BVP&$7AYvNBRd%!`J_P=0wpRc%4qIQe|J*IQV*$LsdX&sn%JoF@g0{+ zs2;7YkB}WyfJ-cISYyCrL{e#*E}~eIzyLz|o{>9u2eI*+K+iVS+!cAuvr}TE&W+=T z$LyRn4o7m*MHO{pS7Ph(aZm^m=~_tHQD@aD{{S{)YlR@AD#jF*)a9EXaR4Z(IL1yq ztI}YA84Ecyu92i1)6S#;pFcbfguL_{Yj##|^~7$fKC$ZUnYU{;?h7k~+neXJG5yKA zFtra;jf%HAY3SkGnObSZ~PA6gkWW!N%fQF}3^BESjVdn9c;+5noQ1EF9jedC-FF;E`Nj)7tDjuwS&e-yLKK+YVHbM=J+GOpEa|M zCNFev33iua=PRojI{vyWF5aMAdDQb`RxHCvew6lN?q zmBgy|Ok|MN*y)j&{{RSPV?{g(6vqym5v(!C;V1~AhzDq=ktzm#MymSs=eKeBeXWnd zXFGSSGWC6LiLZ|zM_;_~8=Gj;HDr=iZX6WY8hk!OXzxn;&Ha)lk0ZJWpX_kbG-)#F z04SYq?R3J?N8=HNlq=v41~NvJ&ZgjAfK>HMc1xFI;<3kZQ^1euX<@3EP&jd?S!-xI zmnoN;yS;bKX5HM_+N9f0r^3L7de0&( zlg{9+=$_0K_Zk_a5(AK z9e^AvK=cHjnPu#K{fgUrmvP`|@I6Jd`+Kir+jN^(V{G{Gn_GThc8=ktqRe3S_DO2D z4p(o>_x7vEWU6MO87zY8Un^(Pg=SBMQ8`htcx}me(wF3xv&v+UesLHMv9g87dMf&7t=vB$ z_jh7a)noFt+shqKQBbuad6s&(qYngdqejo9+9zoqV26)vWfC#u6XPsL$T6->PfX}0 z9}Qt*4k%bTWAh!lSI|^Ya6K#XeS(>t(GKbE^z2UD#AdRapRYRBi*;pS>iwljwxG$< z;(xsj*t<_{Hqp-Q3M!{D)>GnXY2%`TB&ZS(AWv+oJPK!2)Mcq=ndFpdJWT@$3sckq zTxs&@^CHNQz@!C>8e>@0)P50BLH3fz=jYNF5w;_tZrt0;GWKpOZtd(A=-&C>z1@}j zlW$Q}QSK^AIP%*=abx19+u7{wc>IsrU~6-6h^b`qq;b5=0Nj2Hp^*w0)MHweEvVB- z)>V^N0(7ybl{3{F#nnkQFB&eP!-&*ZP&#;!2nUUNktW2(Y>mN9LD;o9O}D=&HzvZ| zbp2h~yJLA_cQ)(5Wb=h8(zAMPI;@5p8;#qT7^28m*G)?-(o}0|Xvm3?tdJ~i8W@J4 zNeY@JK|$*q*B**0Pa1WgjOr#6DT%RC#Yz7FdR*7|t3mVXbq4sOt>0VTEw;H8somS} zu`B5NA}X9#_4J`zldY7{>mH6y-)01fLSaJ|WOD6QJf`*LZYgs;fH6n(5<0kF22eC-pq4I&)l6vaLduG*vX9#VJ)FH^>g(K9I3NLYUlhU?_3<{KsQ# zNpd)iqf@qbZeu;SvHJ%r_Yz@tw)}V^pLgT;tT^iBs;k06i48PHm8MwL+uaZ}fW)ML z*&>5U9zX-Antb%v?CH9?%c-=A8dqLaoD)Gn2=e&8&W5_(wym1$ZPD1fhp&4hVr8OS zCi32yuH(vX42~11YbmI!y4PrS<~wEM_hnx~ZLDooC)nX>v9%AI%oLKGv|ggRiLK%c zZD)v;I+zreLJN6GloI@+jet?a^?4R*MkPn10u+XhGQe>vSRV|ZIUP-Whd}-#CyBsr z?aKXQkgt}edTq}=bQ?`GILvNys&{TKN=?Jl`%`D;u=)Mjj>*>0)6SD_Sxk=xIwR^; zR)2Z`&8Wr>qr(MBJZYs`fqdywX@k>YydViQ@}m`T_Ua&1{OAR8I*qXQwO3(o%6#_F z&+UqR(+spY%so^>rh>O_5pzy?~?{w1Gj5%V?DTOvKcM^ z0F2!kj5a>9OvcY_gKxdZlBwK(aZ>qA#WpidLHoK|nWvY<3@_!gRR)?yCkTL0>NHbN zn5aK4HTCOYCa(}Fb_cf^74_kOYf-|SbI_C5apH3w87>yHds1v%0qji9@!YAB>+HX5 zY^E6Lt?}U@1jz-Re!nS@*QF3RKE6W2u4~#YU3tO(JG$x|r6rpkP-S4CA$kGKGZ8k5o0au#wqZuEjFxqkO?1dpnUqe z$26LyR913pQzD@IC`hlRG?COT*R*#2$*O#>VRct*QQ>p@8eP%WyHPj3-^=cbD#xse z=j^@bTDZE}&8gS<%$(3y($UF`qt4FV;WmN!1(4bK zCdY2d_T0Myx|?)-dh6Y$V|9Hh`3$p%o-|cA9+Vk`Yb0f*^3^H@1aR@ujCBX_s5L&l zUMfJsMUg{{{{UvpK;imLMq1a2YJus}cDHiVV|#CLzAj8h#~MsFFt$^8?M=1X{odWD zo21VsUYjdj4`S2Jo6T(;Hfkwi6%`3jj*3VaKbe?&-kX3Rk?n~hq&2)o+Jk{0G={YG zENjGd=aLmtP}Wvp7)>h50UmV<1xu7flLw4>>$FVxv zzo)l`{@&T6O#9=nur>MYepZVMU$p7vrKySMg|Vh78EIjS+UIhaWJZ)Mj$1U4jx?oM z#>~Js@l@3Lby(w!0vXX%Ee4WsJrpv4Nc8mc=s?IpiK*L_om%-W?ZHr03M|IT>MUg@ zM}Bq2cA>EqQgyXXTC+Qo!squc;m>F4yo;WKDr_Dy2;_53CGGC3^y{Ws?Mk~S%E_fw zPZCj$9Y>jJH=qZryo?prJAe^L15ySgjNz4Pwc(_8{QBdt7HlpPd*`=zVsA>`*2Tx1 zhbc{x+gQEZ)%BZ)BY=v68XVta?o8O)m~6#<8j?yXOsyp(xyME{bPXPrb@XWzE`cMI z75HRFKoYzvj2YQ#asvK+Rz@W}Gc0}!8kA*{q>T3H(gS?h&~c&ZJnvJuGE$6cVDVXf z*^N!Dz53$6tE;!R52NWbHL^{J+nsZRud2>&I%+g$iKz8RnL3)_ zh=GVEfsT+4aICFD2(1AOKptkjQJIWNB$9{CMOuT@FzqAq2cg?)?F#XidVP)6y@S|! zZm_J+;3>Lgwhr&>&db?VyPATVDN)%yf!cj(H}Fi9IINJUiwlCRuMZ6bOEp081`PEl zC1Q9L9Y}2x1eOLQWFrTUOB^s2H2Zp~F)$3JS|SM6nu8xrNWu8|nhpoopbs@30$jBD zN?o@XU+u~^#U0$+PbHD;9jS_k9@Ugs$Tz-rnxXUb8>fA43RNM);FAi~m33{~0f%bdwa4Mr{v^}JfCf*J~F=_my{ z%^8w=TC%95=+P8OG}kRcXa#=>px_#V6wg-)G-W9sr%+8wk2>(KtW(OQSIeh*t>a0W zU8mSR!@Q*35a+vBC6(PZJ#o4AJx6EdsPGZS)BgZ_aaqbqsmW><@5u4_@#7!OUQ4>mc3Knd*I&iP<k5q-=&I&61nm}@B zMQd7*m_0J)Y4;vGe`dGJ%iLJbx7|-qm7&=iV>Z}+->cYr^0DZ4r9K9;1BAzIbQ}75 zXIgsv7BXlP9Zu@802KSIv5STiM+9F~P!b8MxfBjT05cCF2n-3xJzvEz(m7{78WIBm zO%<&MmM2L9hm8-B>4$#M)?)Gt4sUbpU~j~sC0(8scA_U`SU0gc3LF6_&7zg}&e{?*K6cMo{A4`A*&_TB=feecyh zF$UP#`;TVeHl<}|L->_d0^%!c=A=@R*P#Ua)K>GCiWuOxH%%ggQ!8ZEg$!rJjJnl9 z3R1jj(~J?)O5923<3X*)AHzM{cCV`Jn8SZ@8f zT^C~I_I3*uS5--o+F3^0nOd5?kBFCQDEf|@d9WD1J#9W!Kli*_v{VfJ_N ztbwcAjoG#PE)Ac#Xfhj5uc~pPu|M8n+c-bsyVbU?TXRO3EUxmZ7coa!S1gtFwMdsp*Z`RjS;Xv> zLnA7-U&Ci4(WDEjNaI&jp!+M+vILcjmDb1@)GBKW!h_&1PvO;H&!t5++M?dr2zwDT zo0lc=vu;yndf%onJGXxH{wuW?a^xDH6Ham+d4`snP05AF=I3ea-YO8SA&9+L@%aLV zp4Db=rtpV>-7GTBbrJ!qMnYn^D^=l9)fO9qfSBahB86ENGEk{C0flSpn$#L}-&xmH zO`XT>Ex!(Tb?;rR1iPlLI=-ph`&+khSgZqMDR$o7%M5{u4RAg$E)Jl|MF_Hy3@MX1hn6k8r-SlTll5z^T zsC5|>6(*opsTBFWp|bP)pR#(F4^Oi8?L7`Eu4*iv>d$Rn(Arz4H$hiT5$nC-yFZ9- zox`&mFvhbXl%<6yuZv7Zbc$blo;Yq+1i80Jq*(s|QZTF`omHq=7%|f3oE60=N{*d6 z;?iyI+DOYC4OKKJG<6^ffM^bpT8ihTHpjwt*I;gb(8KR7*V}swbIY*uJHNKOA04)L z7VF=8-(gYWsXvBnUC}jG;o6wmPP55R63-oVM34ScCA3ZzWA~+9S36KDUO7k*xRn*- z02;IsOCsv1!$w?SU;=5?7II;}@TLkYNfSY3cCIz5qiA8|zzX@FK9Idjuy*eK-rE}u zzp`C*ios{1%jc14H@3;d?>t5yW=8dNI8EW0-SN`xTqYMOka&e{Rb+KDWN8z@1Z0&S z+qjoVSk>6VXIR)UbzrP&U0D)Brh^UKs@OQ|%M6Jl6;&=2u;9o|DMlKX^A!Z~8S6Go z;CBw)+;|%3Hn!W!?`^?}eAd+2o5HS-rkij5tzbrV< zzqgYYw6?|)iyVnx_tY5-om0BT!km)9EOEtY^wHZSw-)kB%3=manMgWVM;nsr)vI7s z41jvu$tA#+NhFFXkb+xEENo6jrW8^R0IN`*1Rjg#S1pR$8RR-pt?YDl* zq8X|h+#NM2#cqm@vBXqU%d_bzvGnd{q{&Yif|{zsmMoz|#L;iBzr%T*0EKv`>hJ7M))_^OVd*mwo0sI4X=9JP#srQ&8Q?WB-iKxVep9mtxJ zsxWy=1*y{uuloe+5 zoyqjiZF4n)LZ44fMkq*(I~s{v5bW_X*S?rxk)FJNv{>#GvbeA6GWe1x!9aAXNvFqmuJO3+g-#!M;r5Qt!(-|yAo(*vw+<>?gKS-gPmapNHhW{@u~pJG zQochJ4I_DKWr?IPi%e|eQlC`}amfnG7D5^mBbt|jcdaCmhM*X$1;J29T8=4{LpnrQ zmt}WAdx8p5c$Xnm0JvIL0G^bX&Y9dfow3-soc&J2>rLYZ^M&@eO>Rx!*ZoyC*UG_5 z9WGCC=5Skrrn7U)wT21@iRPfKhK1^+X+fBys%cT(*NP0LbJhM%k5%wrF5Df)^%9*){H5TLjni_x<;W`uMk65{EuY4TFmH7!1Y zQpJiXV%6G94<0+H;k=$onV}OZsf?cuF0II7w5bZgNEts3dRE9js(Wc|#YX&s6b4(Cw#4==%K{(S|^rY*ort02#%pStojfJnkR%A2#vvqB(M@(*R z$l4tvT}e$*gO{>*h7WF2WwRUiIR@T`&h?WCDQV_^BSq%*hUQ74mDa`y8tzF^L@~Ov zP7$?66uSW78IF~xVgLo05z=B2l|-zI3P#_m`jAz}a4ZE-8VVCoq|{P}se7w2NtMIp zu+Z)e+r4`K0ISV5;i~M6P9H6~wyyf$SsDm%8$U5uh3v$~Zf%`MkwYX51k=*Qk*d?v zDz2|826J%;inIj?qZa$Uv-m4G9NP$6K0VKZi8&BF;~Sh}4u+ z&^0b20lSoH{YvM|beY;1orkn`#My1_m(S&MRa571J#~cZoZi*ld3wIYp`?m;-jZ!< z+Nuox-NkL#C61PlDGW0#lKHeFvfLtv>EyX~xPUdX6!BEIg(C?8D1jXcNEGGhRHJFn zTexS15uZ^7Z;YLy!cy<5R*E0yz`3;XhX;&uPz(v*2&#*^~fuAXr6GN>TCGfW|Qd{+|O5f@+#_y@Tf zL#1oMRygV?Sh49uaYoPd-Wa0(p>0J}3{*Kdr+00f&h**r>(_k$!_^_@++(3;L%fvr;Qg-Boj-NkLgwiJ{_d8 zge~GexipISbPlZb_?^fixarRkW4MZB()U3aswys!YfW`!V4+47V4q%ud|u@14#~mg zwxvxvVRyB4O!>+fHpM)7F38^T;AstecJFI^h3;JSOJlbDiB9s279N#yllayJ4|PMi zQJUT{0xS?9Bt(lHy`8wnbcI$+tI6KA3a+cGC#OnC)A+MUOtK&C9iC}rWB!K}N>V6Q zX+q2!8R5`>u<=_it9fncI}0_l<;7#LHDYL}dfRyJd{*oVxeDrRrs~AuvU^)S9`Jf? zRSYGb6iR&;QdBRy4M`mH%NxAts-ZL}P(c2fP^Znc7GqPy^vk4@cu>MsRiy51Mzkh| znnMx+zzU+Y%{cUw$>l1uc>2nXrhjgD5hAf?dFn8g`t#yBSfW1T}HZ8pEh$Na2+SGJ$Ekij)sS3ZQ5Pemc?z_3`TaZ zZtsd*-eY%HWMi8-xHgvF+8HVcGkKhL+}qKLO1gYVm9g4-_gV4VE2PnfSu-oVT4?c0i?2dZ#8 zeyeRmiKN*O^+r>6M@hM!p-fa;n>pAU?!Pm-yHh!{D-VioxrB?uNl{J>OR5Au?Ic$+ zI!hwvMyggX3N=qRhBaMtF#!In$Rh(eC#o#SBbpH@8h$-Zt=yg{#L_qrVxviOTmjH0 zjFUBzpR+cW!Kuk^9jX1_$7FZrYLBd_=r`u++IYV-`RtZXX{5>j0CF&txpxy*nCjt7 zgkc4Yst`9Ik>YK7*2*~p>1S0_Oe4re1D`|%g--%=(~+uDO>nIncVR~2?F zOOPu}wxZQE?M)fU!0DMO&ho=;%!VSiEWTCfR6ZjaO`XYRw(Of$W01pVg*I}ApBJ+B z9!9!lr-le>C!$y(;3#wq^s3R7l%x2HHJ-wnPXVc)%<%vLOb(cggk2O>T9NSr4S0$# zr>Ww7dJu3Kgx{Dv?)Tgj-L9P}vgK{_y>d9r?^{*w8GFu}N?O{C=Fm;f_$oBZ?i#q% z1g6L2rK6$-HI0wbh|t^8{!3&my|Bb5WpZ027cSz`f`3C@Xc`D#rt5nHDBY0$} zRro>DR0?oV&qI7**vssO76C94!_Dhn|M=}HoMp(FLx{V8;n4*F@&5_4RPfN1$^WbUfDR+i9aBhlf3SH?%yy!9ecOjLZ2eRom zE((-GCeF&?$(XEpNg}MsfgNOugn-tKTC9xG_==-jEq)`AJBF1Zaiwdg%-5$ILZdde z6>=0c0bn@NoyMn&P!A;?cNP;j8VNJC6?f^$w^t(0E3QI0L{Flk-379ZQcDBG%H= zXR^2~9$J#805I8|?H=RB;wtvu;{uXwy>2>ebf0HRz{Qn(@Da&XPY$R&hR55&Boc(2 z_*M9hl1(`92DGP@3mW-#RT9csp^V9cz=f$Ehxu`!=xV}aYjBb7nq7rmwJY}X?-*z> z{pYxM7iMkVpf%YnRFn&s*wF5LeOB6i(}~DXO;Jala(56(RyskVO#@R#`XOew@FJ5| zmUvsoW&RW$#Z~Akh@`bZElhQEkyc3&=Pz)y)T=0EQat1$nyFgUkgH12^cyxmXzn~l z3jp8aKctys3D+w`nrdk?%1db z8;UTE8iiObg4Yq9Oa7QBsbX*tVMTh-tAQCW4B%4BSmg$$1H5z*DaW{XYoFF;z5b_bW4g5I_KcI4pl_6VpBh zx|?xsJRJF*xxM=qyK(1oo1=Vf{iU=p8&9ya`3={G{vS4KO;}MFK5EgGeHv0yKf-s(vH#1m}q9 zsKO%UcZlS)@Sk^hm6GU+=UlyrXr@Ej)QFCGg%GMU;W(No5yP6GLh5A zIZwEg6;V;b$8fDn7-1XB1aG8}D0?*%+!jHr9!EI?C#PkcpfRCu3Ft<(s}MM9Uf=Uq zhh0mtsVXTqBy<=I)+RhfB`e{xI4qVg2U)tS@l@jzfp`?T(zErnvq3Wkd)Sz%`3i|ZSax3aU$57%8NFHPmI1}Uv!1C*s z=iRxjxmUF4cTEpm?(Eh+yCGj!GDkzW=rD;KA}mU7D0WnKr=h{sQwR1 zpux+S$LzSa@9_QAwrO|e6c{bP2J4QrcRq6oRg22vrNeJZrc4|)6T<~FWQ+>X$niKY z2wf>6p$tGZWz$9S0f7}Q&G^0rB;3FugI=@rpr6{YM0am5=0OHI*^(UnAYhq-cLqYu|6!f8eK>7s&zr)kk(8OmAe(b>Fc7{5? z4M(td1Xb8fCg z+*_GzcNWau9dnz&ncCPr!-l4suPL?ZUXHegkJj+4li%N# zlq6}AFx}d!yf_+gX8BZ#;=MWnQ5>wg9=N7K9(42`hMD8Tr54!gUD03H8;h_XAJ_Y5 zZBgO`eSeDD-Nn}Xc7r#*a}`yS;-k&%IqG*d@$Bu*1Z^Z3Y!BIe%u%|Pnh|Y&GAChc z_*!uKRSvCUyh0>s)MM(*5P6z)rAL>>1}O|-YFkRvAI8O$P<(-6cn+Y$QNL+K9Y>zb zrrCq5wtZ#~ZcDs29e&5l^giX?5aa8&fZTamV#04cZ7`wAusHNG{{SAR+52~VbWYmu zOg3(dY3nEE}FmB`anW%}A2UUy<`4d>jOk1JPSRZ>?YUrmHsT9}>n zpaj+YHy{He+7E=tw+I7yg-}dtKcy(Aps!EDWsXBgqmEjB0~D3@FCp%)$~qsNIt4cd zO94lk6&Qj_e+^**mjuZTx=f>{iKD9gDiRPJgv}{iv}xe!1GU^rDt3 zD$0e%7~BY>X;9AElSI_|tAEfr(c&zzs0ZR;K%<{sHKz=9?-0c%xSF$!GpJ;9=%7^N z>~ERrpE1{1M%r7aKf1cTDL%_@;isss+P#H{gKjVPi+9w}ZBE&mn=Lj_cIvdkzPlU)}@!iWZ(sKntZA8F!Uf$d34Dj25;34Pn{Zv(A0LR@@lnB zbJB-#Zal{7eD+266@O|z-^lFEp8Mk_uxuWa%k5D~FWX^q*ts!Vb8|f>@p#gnmUQx2 zU=vi0Eei&kFsH=eZ#&J88=z%-Nv;MyGI>#36ZISK*)+h67t5< zD>P7rRG~fir_7o@en8XDt;Uc5H9aP$5IB!ex#9MXpEh3SIoh47F!*k{>zu6}K3+O{ zJOSLDaY@{`JS;~QSCh$hflbl8dtbCDH+4J`9lwu(aWVaa$1jN6+ejsp_-@r)=nEB9 zc;JW>NJ$^)tk~jBI&wm>!z}TwBya=PO-)LQF!4!12klPR!bPyrp(pvu$?Pq6(?PKbZ6ANZXskeeX`Y**zVA-#P3S^^k7O z(3`t|c81dGzO}5|H1(Ac&z{Xop4&KFm3r=ko;k6(e1=~slhD2jREQrKt0Zt2`lbs3 zZpJ2XK13kYl=T`-56`DjQKQpoLvdQNs>X5$@nM4xT7X9Z(SL%v3~KFIavQd$id+DT z?&-EZZz;6%)i`a{pO%v`wl+@Z$Wxpt&F>XSGS8p#B^1;vZ`>C{Sx6DEA~$T2P)ZYA zF(W!i`2s%Ps{=8V(^qJvYep5#K*mS#)`y|XAC$%KivG5bVAXBDrRz!zhW4K|v%Wz5 zjNkL@?ay7b#y(8VR{7n@QHHC`%f4~-@lw-cF%)SesT)Nc_IoWQTX%_4crD>%aYk60 zKs9As!zM$H8iIgp)3D1jYj`J`UeeSqsK>~FR4qP0lHR>K+p`~<5`#RKMv5`_Du~M!WNWdC#)JbK0<&z(mQ1<5B#MX4~ z<;`|hE3Gze&g?qe{(GfzS$^%M+BocV)vhRK%HaAJXi#qb_qgh_6JwGnDR(7h1{)k1 zBP7G*bGYU*J=CDZBn${{$qS(vFQOeNq*o-=d5)W82$7&Oq~n8j1#d75zjFhSG}q=w zP&a30{{W;(_V(Gs?>v{2ZdK-;Q@3U6Jf7bhS8-&qyL&gX_Pt)u+jw~U18~n(NNXj^ zSJzSF;iZegMDe2eouI)Z@KWML3zcy*$hB3aS6ZDqhA2T$X;F^6@KuWlyhi+0P>o8| zYNJ)Ce3aCVm^Wu)(r*~{=Ih?LUAdd4gD;lps(!HRp0U|IPm63uKQ&L5!C^K=>)Mjl z<#BtXIL0Yv&QC{CBvHAfg0agNTQ$YY$0D@O{t>};LZt}eR0UyD2*p>-Q>KJ)J0ln< z(h8jc>I$F2#F0_xa(EHb4F+Eiv^y^qzYRBD;tpEAEy9!=HhhNc+Wl)b-=?jm-g`fA zZ7u7F-7#)1!^of%@=cH#7^yN2YVLT_+Xj|6-Z7#|(+cQgWg?6zK;VxsNFdjbR{}Er z8!ou%=2f)==uZMXfu%Tf{{SAs-T3^b&7Wv*?c+DdPRHAAklOhDjktFH?KmB`y2Vvh zMmKcty|kA1 zc=X|Ek=FHokSYUd!LB4)EF4TW>QDV$g40 z%eRIjZ+5nSdFA|Fg_GRdgC9vev{+#Tw3xa`zV3KXI+jo%x{t)PcXHH11wj%ePMsrB zB!hrZ)b&sxqRy(G5G*zDDorX5G>~b)`Sh2h$wfy~xU2f=eg6QscdjmtFujr58!I`Q z#O+Osh0A54f}<<7pJg0QMoeCRZHLBXlX4h7;$?S@5lzKf2a$^XFnNVa>QkuD3KFJ{ zvPRX)mIQfp+DfQtB*rw5(11k^ekD9rk%b80Ytr+u@{!kgD)w((;dX}ATwOK~Y-6al zJRNh}J*9=lQ)6oDx1VcmZIzL)rrce9fR-f7Qq*Mx8I9gyT2mMcm(UTQ*F%wQpGk*`6a8g(PH1#ghkP-?j8Nmr5HJ%tr!?;A6J z_8(eicP`hd>@D$F`$s3acRyxg#Z4a0+qf#P;gp+mYiu08ZRwhuXHmscl2FGhvXDcg z5rN^l$098d2?21RpdySl3agKYSUtv->E@Yr5Ebgj^zhtil_VN6S2R2a4E4%d{pr2& zS&hfOLG2p)ZKYq3?W~%0M(fuOYx!UqU+(M3Mc}pk^z4}R1zvU>kPF5y)NH; zb~nfj4IaSTH9KdyH@428*c>9>Y6^;aj-h5YM%ky^RakDZ%f5dk^@ zqQ&9l!0xITrP2VEo2 z%Dp?JIV6Fs@D1A4tu)Zryb6$WTmhPNCS`GHz45z4X>9(x+f;k*j}Ml?or(zyYYF;Vh ziDtL7xm{|o%vM0i4y^cXK!r&INHt=^1oc?uw|M~Z;E~f)sAVZoe~l_wV9>V#UoM?D zW`A8)CTja^*B6m#oX9^O(! zZ=+Gr$2=u19Fe+yED9byA?Ta#=FM$>w#w$00=Z4)w)S^i=i)!#J;##B(fH2$+!^he zQMY!Uce5(;aJhyGsf`shFf~buk#sc)foIn&L^2d+b|PeVr3z|bq%BYBlB&dz3j!r?hg!a*2)P9vbhLV^2uT40&!(&&TYa}x z?S9h4ZEOZFd)8LwcAXDXHYGAuUF}s_U6Y$5QMhrtf3RPCQSH5{j*c2?Dk|Je11Tga z6oJrCLVDGkIe-Y@cyZI@4loZT(D` z%x36=Hs5bsPLy7#A$LgJD7zB))`jlAo;dCuX)4OT5I|akyaFmllN(e58&4jdjK<

    g>BlO);#Lr^OjlrPjVxsPyXctnMCFfnq^gf=aTQ@O7>m zlWp#uzqUH}Z&7Z2tAfYx%84*t5f&(9<)p=l40)aLmffvS66Ci=;wth%8avacHvYcq zVuW}FZecMfAU2RD0OpNM(!YfDxr~U8uNe{q2USmo&FlGk@#=gzUC*?#`y+Mj9LI3v zF_?X^DeAh+)=LdNX3fLWRlP3pqNKskB~1=81;?pMd72?JNp37Xs!O?*nQs|o3ZN-y z28KiOKNUZVq{Sm>-ZX+Z+f`f!VoPx!Vfkb1&rhqlaq)Jx=A${tnh)U}hmh=Tr;n-J8Te#Z zdGb9&h?bTb3RII4sU0-65v-0#Am7_&);qJ;J?&Ps~NeG96q~y(wHBda zhj(PMGOW_Ff|>=0wf(yb+6a;fWHQ?+AgJvcxOSRq3P<5RYLm)*eMMw$E~ciwmGcz& zSEpQV%&d5~PiA)BGjG;aX1gbD9>AXuhQ(xh+Zng=RIfcQI}Iilp>hddB-6&T(^8`Z zWm})Gw1PMk!E7Qi!&16Vp{BeEkb^5vXp^)H_ z`IFY!ge+O_Zgi7?si|MirlV4iFSn!}M*ZGzUAWU~_H2D~Hfw5NHp5Z%b7!!)&dXBK z(Wcm{r;c~2dZDbm(gsvwNKwzTD6a2eON4=_jsR~FyhEq@1%qk%fJQn_@mkzE3z(Um zNh@3xKRy))=hC-l()GT=-+A0F>#Cn|ZJZX^rrNTNy^pENRpmF<;)NKsE)yj+H6=Dv zZ&XR+lCAH^Cj1|0SQ#U0d1nYUR2r6E7$Z*_`gLUtsv6#{H<&b12LnSx{{R)z$E@<0 zU5B&#Hx(}OsF$=iaDfw*z9 z?o2M=$>DQ*H!r#KTLvnO7H*|k4PG-7ky`01;mFigj|4ShIFjESN*Ua()GSJZ zBmG4ppTge>KOx5*R+5 zU9mr7QRcR`QwY>yBHOC>t=!d72DQyOT6EM!tO@q6Tc?;L5r!1*mJ z(<0h5c%6(sFha^uwSLBo0F)l2SpSAI{Sxj|5LGHcFlE6=i!op>X1z*20c&d6_ zd{j^phEXAqyq{8jp4UZpy-Nv#!o?cR)`gVE8FT1WyYo&p>8AP!r#>i=Z!l^U$wGMP zB=GwOL9P#NY>lD3Hnny;GmWFI*g2s^m&vZ|$mBL2R&2#Il;^n9B-GN-Q(`b4UjkFC zF7hY}eWP1@fK~~En%1$gLPL2VJT%uN*Qcor#z!&sG3{WqAx9inQDfy?XQ7W5@f&PC zR%bJ~caC#=^=3U&acph(lcU1yybkW{ti@YYRb!|>j#Wn0dk#8}-I8dbQ&5D3zqHZE zxZK=}c%wse9#}$*$_MZUzz#SQS_9UllHL+7f>I~#0Ka}e5ml`*!n}HJ+xt^(Z2Z3G zgE_Qm`?Dvs=96|eVRWA6sKRw$Lsn-e(Nmbn?a0a4aJo-rgT13!`0_OZXUg;qB| zye}?nu89UX(vqy7DWnzBfc!y$>dN(JHj>8hXcaQ89FIf?2D|~s<$)U@NFP z)3|qd>;0**60fqW>pWd^zWa|ckch4?Atgmj`5cDo$51abz{Vi457W=LjF%9!teynm-VCFNCb90sIVV zd%WpRpU@1?B1de*;YkHqN1q-b{(TFT8%J|gbgoZ%ZhhIYdZ!=1vJ|*#t@Ts9k{;&F z(ozrMY1bdzd?$`5_RKX=_}*%OBmfs-&Heh`8@4jdYq#ArO269GR^FfKTBV%)xE>u< z*4DpF*8$`Q`!J=bc&!OmdkT5iJ4cl88#99}@t z0e!Vkjf|`nera`>B`fQ?UjEoSdueGUy4=mc$cvt}5F}Smxb+Ib3i&!DVtj%U9H>^EEvun56GTu}8IxQ&)^rQ*o&nA7CJ!lbs>FF;rM=_9Nq# z1847D_ zeHNie)#P1G{ACaU6A$e0YNdY(AXAS@p620Q0M%+8Xj@PMo?tyS5%yCZD)yey$9C^g z%l+Wb?+=jOm5|*Z#&cVDZ1t(YDa%m2u{U1jdsa&7Oil}DVHuh;6+CW>5|A(SI+5fO zGhWYWYJ>`+2rI}$pq3PUV$qm@u=B<~-BO+GRYdr)CVua`w1JGgev zPL7ua*&8ZIVCvn=ki=0&x#@D4&64p<;~&+VZl@g7=1spPLjzNhF48Tp?e&TxvFLf? zAXRk_4oY#=B@KK-=qLwGER4!#0yYok6tcIGVW?>o@=!C>uCUvA?cn%stcwLxncnr; zT*Y@*ZCr(JDf%mE?F^K1MV;N5d8=L)$Y$X37~qydWCR2KeeQRGqnpGsJOq!?P{wKG z@-HYg3OJgYe7b%Rs@m4-ILK43Qb1*2B~>HO%y8*ZzxLi6167%(-II0Z<=?$w*HPeh z!gO{9pDDEPRrwm%qpM!WsHkZmtK2b2Lqjwq1ik(FZDoW(_4{(zrdUMoWs*v8Bmz7& z`5rwsWiHP(qnm_g16vINMKTp=HCLsm`9HFDCs}Q6y<3OaISsKcBw;tM%ExTnjz6*Y z&Qhup*(#RZTaG!g^cZ=nq6u9+3i&h}1ABYiTYlRlUL=-q>oqScN@aEQ5kW;&apc8~ z25HlB%Y3As`T^Rk0;UafPU635>yP()t82bE*LD?N#p*tr#O}QHMpm1ylPS5T-@EFH zg0?^4+aF}i^wGgnM_V#4on~nkKuH3|{@b&)NloKzQCtgX#U6QXQA#Z{+giIHAP1c( z(wSzt2Gv?cd5^-23hC6`3$<_*d2z=;jSgosw=;D)*sK2l(Tp!wiR>)jMQp51MAY>a z8-A`B>305TSEEsys#+V)e43+YJgtYig^b0f+9=j0QZ>kR%150ID!RDP5D!U8N#Y^6 znn|t_pbnc6lvvXVS3?Eb0WcNzryO$wfD`E1pO3)=2*ot^| zTw$2`acmqq4_5$tQnTEu+q+%d#i^S~jS)hq!4cEAk5*$-<&K$nlU2rqw<%FTP?8(b z^>IF9PY#$dm<^3BIH;PYSrcw9D?5|iyS1{|Zo{dfs#m2wao2D&MHXurMFi{Qsk(_* zQ2dkaFnOkR5MDHrlTcD$(}6+bB783)8OA~3(uPoo1;QBJu#xGglhv7s8dP}>hkD(a zHpZaZTO)JylVp0^C4;Zsna$IX-FUn&VD3Grv;FLQe`rfpQ8hjeJW5EV;zQ)A7gO!H zMYPUjhwA0r+CmmpMlr^`ScN)uvvJf-2M#@YTbUzo5u~>f=^v)1y4!$fWg4;N(k6LP?@ti1%|HXE(P;!hGz&bkhoUoA_4QRq5P?p@WgD5!BSwstRG zj^Epxw<*{ATNSpptQ)rhx$v^7Y}aD$P0c)^Gj$Y=E3$zHhy~#Lyt`$cp}1T7T_QR& zq>?dtBs>rz_9CeKHLvH=cADmM8pkV`nMo`FK!`X{5vb}tKJ{l-VILiWiw)M;eE#&P zpxiZ!yEY#9uai4gxGKX_U!BYC$`}%}Yl$IdhaWU$RV82W9_Ugi6|Syc=@sOpVCe9J z(xGBpu?jf;&Ykg^ddCro;RvO{S``(ia}z^T#eF)NgWH?pZQ;Il&coT2{oArvHG&%D9zzTUoX>ax}Q*K($}!J4^`(eTh@;|)n6ojJ4uqj ztzP8Xn2pJh-Mg!|v#~O!(#>yto?T!_w%#V879rq&BQW|{TiUxRY`l19+xdd!m@bJY zxP@e7jYsx2(ISrwvB_$HICS08&l!kMVP_*oL5(7B3KU{;@-<0vM*wS{gRPgmvz2(+ zwpCo1-K*2t>;?-5yLLx>)U>K?MVMR+xwyh*4jdT@6ngVWL^j*?tl5{O=*S5}r_JA6uHs5})w1P-72<8|e> zZq(d6d#CqK#`xp3GMkStgx*84&e`m2EnQYxLrY6b)is$4N6eg7Hh}4>l|S8t9U%L> z5SZ>~y0+Q|=YI%RA5@}{pul&OI9+bvgn4@Pr@L#B8g4g_8WBK{1`jK7VpIw$`gxv< z&I(?wIL-0W_*xC$zLP7O#LJA_*o^i!Wn%Jsj}KEMxq8VSwwfyGF*VQ>&$NLv)EJay^FLlR8wvY-ao9i9Cgb?Aw;If zZDfL;y=TPijM-#r_$kR*CVRKj-6Ij%$z^G_OK)un8U(UxEQmfS6i}ZPg?or4K{TgZ zDrL9&#!sng;0FpCL%=bmD2L&$E7OKgZ(|13$x!$84`+2tWHHpa&8HdL*v!5u_I5Ga z4Y87|sHtVD#$xf_WkF2=X*9Lk_V?%v6H3Epo+h!YBD==gobhcK6t5CnJyvKQ)k@t& z&3GHTOrV8!@?o84`429k&AGc*t@g&xq22X#y}!^0AybOjm_5CeO{XUFdFhelJBDfq z;oX$`LY-%3wD*FdMEr|;wXBBPJHc$LZwO^GTtO0!NP)6aq6zH3xM-T z8t^I89HhD;@Demt(g@;}HS?h9<7)0*&(S+0aQ0Tw%kM}jGuZs5(b+AZ>*`JK)pE;` zt8co*>}YcJO%~fYs3v&luV{RdvT#ZFYiTSezKE;9+jXRdV{GPERg#^8eIYz~jwz_o zD_nJAvc+n)h$UI)05qN=tg0}xhb`)xsHg~(;M)7?CKt=DIUDX*653GbRoAc_-d zYK2;;x~o~pKNFtZaj#o2taD!rdq|^{pi0L6EX4*GyAgtagc|zvnCi-Y%c;q3zR95L zuC(42d;b7-RpTqkYFtN>r>k_~U6|sFC!vfCl#7;Vd_MmBhEZ zdrfa{7BLx>(%8t@Kv-s9T>xZb=hu~9D_CrX;LwHzo`4B7jM1FoHGCjezGIFmvAzP4fYH_KMX^wM@rAs-VmZj!w%Jy3rtvftX@sg~buwu$%opL2>9pk(Qt&00;)1Cr=V7CkQV>M(v+-ZRuVrj8qxNVM~woPFVpX=zXC}U(&al z<9I#-s520z7H0;n1S;C9h@TwCPae>EbX-jGyf*gn3CSUJw}`O}XgLF1jmJ#@QRmdX z=h%7r?VYsxqjYC?meH*1d_mo{5O#)ZCAqd{`p!WD#kcUAdm3@6k-^NA69k7$<`oE4 z`S#}D;fo3FEu}_^@@j*kDAEgct15Vu)^Y*Wg2%|$rtXv*i7z|`1~dp26qjdgJd8DI zA2Uyfhh5?Kt_wM~_TOvn{fkkEqS-N2Y$|TK>dFf2JuYbGXmkcgi=06UM zL~%rmN>@n^^=|3_DtM4OMpJKHxtZJ83}$v3O{cJM8F=5TPRrPsX3L$;OHe8&uk5VC zLndz{M?*sXFTO=7GcLV6d$hK80Pb+vT12*!F>8tE*Db^9_#%(EBw(DffE7kM+uY8w eTT63wEZdqW(3*#5*5iXM9En|vIGMXhRh5wLl7h@DvAgw5+r9y5{Dolf*^`y zP|1o)lAt8XuV*lwbI#b)kx_j5IT~)hwh3+1Hz3br3!8^flO@9|h0MOMH z1V{h?pauX4J^%qJ6$X&}PKQzg03Jx=gZxk6LG+!E2hw!kX>1ORXlh(KwxL+L6W{acfvv-q;|=n#SAYpf4nMRdHyBO*P78uGB$gNen+`y*c8Mdy z*~1#-yT zPJ_h&M8ENY+{1E`u?+1M4RLuEWnEAOjVbln4LB#C{En-*~`9 z(5N`AiN9YDV}##hu0OdT@h5-_haqqSYqG~ufGIe>m_QP1cW{J&R>Z@NcM~y5koq+? zamnC{f&YDN!A_|k>kl1h=pXA3D@gyo{y^{!$1yj^$NNrO@*S3@175IW?Z@@t&B1#L zOI>w!8zU1#EnR(0aCHO#3LSkH1QL%106Y+AZxd}bsHK%Pl(-vIj}%l$8~|+XQJw~- zT4vZ%bv4zYC{PGX{|Xz!xQc)QVI3nV^cVj>qG;_sz0shiMxeB$0~}=!(pNy*-4E@F z<*$G=gPj|e1{(;{-k^dY&5Wg;4rw8r%pt9Ur5!vF4xkKHXHN$Y2Q1wN(${@`;2@2! z57LpoE^t4P9t3G#cOMTIkp2eJ3?6V>6u9b8VEJgcy)#IQfi#7;nTa|`p9BCB3a8&_ zyWeOu+#l2vyaymXFL}E-IisP+?2kjm<>X|cI&eRCI2tW%WNYtc>+JwlM|ybLA})bT zC$7!dTmT)`wouT>(&BQ`(!vrVp!t7>|2FZb)PGN4`}R;`)fm@j5T>qQykB{L@sL>n zAiECQ=FTskT@nCbt^xq_$S)pm2DnOI0f3sG-`c~39WTykw5PnNsGpyohzs0a1Z&Wr z;ol1Ul>D!W-|7>=*7wtPPz|`Ft&ckziZ!Y|(jDpJ4Mlm{+QXs3e;>sE%Nc)D>o+}w zOyG`iZ#V+1>I^u_To6uRcOx8J&@M;>)CKWh_3-~HXl856OB64xTurtqsYvyp=gEW|qJOAZ`7XwD|P%chTEL+{g3~KM= z?Te+sIe|S9f{PqA_%Or*Z~{EQF+doQ0Av6KKn2hQP63918DIrm0PF#0zyo|T@B=Ob zVL&8s6SxE11CoJsAO|P}N`VRh13U&=fOg;|&=0)Y@iC?WI^ z76=!F4{`z`0g;6$K{O%y5EF=s2^0u)2+RrW3A_k`32qT26BH2C5VR2t5WFK;A=oFRBxEN%K`2kCOK3^x zMCeBtNti&GM_5hxjBtqXBjE-S5fKxS0Fexl4v`g+D^VcPEuvJSGNLC$eMHkl>%_#w zEW{^>6^RXrZHdvuk;F;F#l+3T{lp)MzmbrWaFIxmXpvZxAV|VV5=b7BG?Da^%#iGm z(vb3z%99$BI*?u>jUmk;ttagv{Ybh)MoT6@rbuQ+=1LYumPl4g_Ka+dY?YjxoSR&Z z+?d>jJd`|<{1N$c@^|E06m%4V6zUY`D10bxQ{+=Tp?FKNN=Zq{PpLv_O^K$wO<73U zN;yIKjf$R1gi4pnfhvS5g{p?CpK6Jkl$wuPmHGm80CfU&C3O$=XBtu(ej0TeTbf{+ z6q-7k*EH+2^t9r%hO{2Ew`d>IcGAw$5!3P0Y0^2+U7^dSYo(i}$EW9^SEsk9kD$+? ze@6e2frvqXL6^am;U+@~LpQ?;BORj@;~7SO#uUaz#wjLzCVnPeCU>S7rV6HErtKpf zM^ul%kK8y?dZhozCNmqe3NxHJin)w=h%>fz6&RimifegdLAvkllnmkUg8di+!DglS7-slOu_vmE$uf6Q>HNE9YI#CeAr7 zdM+g{7p}Wp&0O00^H`@;oN21<2+j>QwXaH z`wABczY}2+(H999!H6u0@`_rE#)@``?u)_1+{JRlM#bsGPl<<%*NcCZ5R|Z&NRb$n zq?FW>43Vsr{33Ni3NDo<^#(={Gk{%#J%#N_%Sd}mmrBpc@XB12c_8yzmO<7?_Ll5( zIYK!#xe&R>a$EA!@@V-A`DF!R1viC<3bQ8#PQp*-oSatVRjRGdpavFehVn3}g*wc4h-yn2xO6AgR~ZH*|6ZcRE(bIoMU z2`z3dC#@o_6>XSyp!O3TLLEJwSe@6p9J=t{93-aGs8 z9PC`=x#9By=l#!jUSPf8excEZ+Q!zV@*?3yi;E90?%EpKX4$UW>DoQ8Td`NSzi+?b zpyF`XVGgbckAu%RDmunF&N?YN#XHS8D?2ARe|AxKNp|_-s^gmOy6I-@IqYgoba6_~qIg$RzKF<@Lk)Bgt@?Q76R=oAR^H31fc~mW$0eqP1@;T;n)#shB zl5dLdH@`D}mHxE;2>-52f|qVwnhDSf$PFY2v=4lG`RL`a%kP3zgEE65!FIt8sjTiz2Bay(3>=Q@ECXo#495_3j&z zH#~jxG8os;pXlw`&%!f#iJ9W4{kf&?v9a;NxMUI2XSXORynpHjy5hJZaUr| zzUD6UZq(hidp7qv6QmN-?~~p4xj&VtpIDp3n{+2>H`zIPC`B!$>;e0O8xJ;99a8(# zRMJY*Inr;YZ)dn=mFsGmSDFr*1De;Lcs}{u z;?y$z)aL1Et7Yq8n{iwBGrece+qK$TJ5)QGpDR9p+$rB#_d@ms=B4z@nl4yZ^()w` z>Tc=onjV>++FrTd`o5EWP5sLKEdv?@?Ss05FNaPK^$nX3zj=M`_0$`OH?wcu-+meK z9oZQT9U~lz8mAdgm|&mCnmj&PHYGjP_)g1FL`^&-CTdORq`D;>ZPuGps zCpJ7bb~dBFv3x7olHKaqw%DH8@!KWdP24-aSHG{fKX%}8aB#2)P~d)Wuu(SvAO}kT z6)pxign~~7kb_a+3P3?ZLPAPHK}t$NOHM{k%ScT@LCwfaPtQnC&rC~!3*Rq?k-wiI zl;q@;RFpJSR5T1!R8$Pu6BWZ@7TW)$fP*IhEeYTTWZ*-%0X$j=J}u;69DH^mJ7|L_ zgIW@Tj~8G76~+eey&jK%kcgOsl#Cqm_eAhD4*y3Y4FDm4;NubC5fT%T5aLrvf{C>F z1V`z_2~~}4>AAhaB#0PdGt1R@co|Jv>?EbU!~4{U`Ql7h-hHu0!I-itBKS4p%^WnJ zW}~H#^qaqjf33XII^Z+CswHqY=W5lxw!sf;xz*2xKCYi}^o>l&t7#wpv>~Hy;pBJi zemAxne8YV`rk3cW%*?b5&D&RptLmm+d)r#|Z zTefamp=TehUvV*b=h{ZUDVJxQ#zISPY7^T5P_h$s_B|p{6Bxju)1XjEwdSblSU+`h-Tkdr_aBH}2imz;4bCd}2n$^W&4-6DdJ` z4F`bcXI(v_BTUuZ03FYho+n%rI!^}Th@W+=X0OJFEwPX*2FY#26cMV z(Q?h&JEVbV?q>H?r8|k+!n%eBz3)ffF3vD^CwP%9lxkU z%NBf{7CNutzd!HU|MqnvJd}n4f01h6u$)gANb?~`be9&;idhZ6KFQg#%t|wXR!A3C z)*i2>cVB$hQn@HR%CmW^VeSC1*}n0RSMk~-bUJr%%pTYJn>gd=sN3a_=eUADEo?Pw z()PkXxMWKW-cg*?UVX6KrG2rnq_kxL(y+&%(2YvO9wzt zq54#9y8aU=-NlX>!-mZ`VJ`tSDDwbXyWelCkf|{`vAD2OBSdU zuY$V$hBy48VO3y=%xchFj4*OFl2q9JId4zeveV3Qk922fwDmZ#z^d=Q(^utpbP9SA zdRGGd@CbCaLxwhkr0$kb5OL~Ko_u+Wvh+2w?|5?1&RM=OI(|9fjhJq`2X~~zW@y;Y zzwLXOf335ih8v8}G>*uKIUHHT#aA4uFoOGebvuFb2@HMWf3#5x4gc`9iON&F7Z0u#XXdRD|vHi6yvQS_PFlLvKKoo zEhLY+uJiZ}Cc}uZ>*DXK8}e5%OA|?%r9gXz;W7#5V*UQ+KGC{xzQKE4A_r&tkr_R` z=J++!)GjK*5fvJkI9oOf69^i{^q_AVHm38jo)`%1;__S0>40UcDqN|Z|1?*+81g91 z$%JY+o>%`!s=v~3?qc-#wZ3SL13+MTukCKR7y5{-4r}ep8!q(Qy1UEW8XXMHBFT%5 zRb~rB3mf%MhEpdFfK$!=A+}LWEQo%XbLuOD$`mM`z|r6~7{>&CDo zWw?g-pKg7qlz+D9RmIsF9j^(E&h(twu^IQx2IO9CC@cD+IPtYuIta>t6f;|A^{RCD z*3JVJYPT9Xs$PTBfvhW&U6Z@-W8O%R-*CR@cBMMEmuE95{e|(6%c#ba=WQ&zZ2`@V z+XhZm0q}06UhUc>bh=-8^Fs3hpji3tL+iz=7Rq?m#hESFH*=UJ7f7-*d~&TZ{lT3% zq&(8aO&<~ej=n}YF3vjR%^a()*f|Ao!VXWwQUO(gn~=7I1vYEqZLL#}mr~Fi!xDCS z@KJ}kDwo~K4f_4A;9@38BaXZ|F1^`?)u2*c1Mb&>9}v*U+V0S3#gc(>r=>iay#}kU z2+K|Uvhq;;dC9$ymZH|2H=CHCA8tc=3kI2bA@K7dwx4 zk8HWqa8!NveD~^ItJZ#ey5D}FPPpnN!oE)5Y~4-R0iZpw(Y(E&)vqKbjmVQYmMHewQ!d28BY1rq7nO$}ZjK%t4Vt@{%K zsU%(!F74e#rO3${a0>KK+mCT`Vbb(n6-!6=k>&hJ;%qVgV!>?9mzq`e+xwxE*%1OZ zIkTu4M5jKppQ=FU^oaJdjMLZVyKxqjgiknh=!k=43@(Q_9RRwSuu>L^M+w!rr9A#@ z_Q=}S;8f?(`>y)3x>QQMK>~8!oXcGY04AiRV32rZWR7um&Wq04&hIl@+VcG8$~Bjx zsWoSqNoumBEv*T~Yl-5PD|=RzCUfi1i_K&WZr#r=HRMkR_?kRjonw-ctGZTRy*-iZ zceZ(==R7JuDD$%q23Ax4?!)lWwyMP)?Y=elz4mHt{P_j#%!@vifj;)kI+w;+%5TRu zrmr_B>+X}v>bJQBNuLz5l4xgJ(n_vpu1&bbRqc*^OW1K_k??8FcIo9Io19PELqi)T zUFkM!x8P*25?KaiU>ioP0Y(>JU96IO()Q*c=O@?t5#K@7+K5#C#w}GAxH?_bGsIJNMub*(_ z2~sw+_x*eT^d}taie7qh>3JB9%6lHSg##daMebUz<6hPa>Kp^+No4sV#wWxPTw`7m zURVecJ+)j>SFH>m+K-hMHRyUCVwjg{SU6M^^kyP^VmL;h+BivsA-&RSkGlq(j7=|; zA6NvWn-}HResX*p2jtj^r==)r!zS`)gQPJW#fbK|3k|!J6D3MD7OOYq(rwD!d==&# zoqc)q#Lri!wWo5nNH>RIMz?K@PbdkM_Z+vOQUHdh_qX_%ljIoeKN!y?IDKG0>HFA{ zQ;6^Y$mw*-uTCu8vst^>)H8Dcq-JlwQVsJMXcVmi^qr9_xoM!zim#yX%@Z8wST_6b=9d{R5zMs1akf z>we!fa8Ez-2uaYjF=7Ao{6+BY8nWWz_Pz`S3z3pu-nN+zUJagzPmgwl8~U7X&g&N~ zACh=&;rpp+*dok5M1Ha_APrM!vw8q*vJR^DRZ@QYw%kR$$rnPy*6^C`iaE^tLQu6 zL!0^JeDvpn9qIlcY307x$h=X@gr?)0-UmSPu07`4WPR&=hiQB3g3S7bB6aT|nLXmv zQIFs+XXo5M*UU?MbnI(^k7arbAr?=2<}LTs^Nc(@{qjAjuE~$=l~oMOAafBf6_0>V z2Q_6g^m``rT$S>#w(dy(Tm%{`=}i<;i!GZA$Y*k5#_;-8~bhd>K z0B|1ZdN*tJaxC#Z@b;}xirKRc38^auta>Ea`&vWFmL_5;DBMW;!g{TBP>$4TlM|;m zLTB(H*`98B4qTr`F>{CmAanTu(27ex82I3OL}h4Vk%Ugc`;BgH%F96JO=+DmDHpEI z17Q2TiTYVOL*ClCN%uvC=AdKcZ8HA6Qlz691VoEUlM}wmF=DHJ_~{Ti*lfz7XXS$n$O zt9L$j_sW>q5p8lU!uaGHc5bG1z&@z!ZVv6Uf^!u8?M;bq zPc@1QE~z#JlhGIOD_NCZ%mfI#Efhb3RJ!dc*4bn`ehNs>a?0Hu!ia?M%vaaUjBJZO z+kq|do*Wx_iQja;@b;$Cav%5{xRv3EgE`{dLyGyz z%2*Z&OX^yN5dQVVb4hHkFng3`S(E(-fDZiiw$yf0c$;u^DN5g&xmRC>ip{!JSu12M zYh+=#qP>^Z?^$>`##2NY`H*azZ_3~FBRlW6-O=fLO0ZCyo^=3Z zq)Ed+>cjEu+*vx=441Bl%EmcxOuXKA!vxRd9sou;tyNVd1hZdNzHv;>(fNlJh4E#U zL+3f>+TZP__nfvVpJECj{jNmuLgU`jt#wZ)hrpokU zmU|A(?Dl6Z-B|H&HkR-XP8v_<1dc2SZPqz_u>E8a3-`4jd0oAfkRVH2wr<82b16_Y zciLE~!=dWjyYI)FQhY1-$jq4Z*!do-u9Bpr zucr>vbVaq+_9r(NVNN|b0NffM+7|@5EIxSR!!KA?KH{6M=XN(Va?yoKK^LVnMNPc8 zC-8NENH&l^NV=s!@4RHgKupg3`l)O1K%>3qdtrQ+&RYnq1sU>wsBz4Lh27D8TU!r~ z#o^_*b*f#?#R(kCd()f>XSq62DO*wM6XZS$VM55G_17BSw62B7r8K7XY>(V2866u> zc}uVpb4zB9=?JnCG3)`}NE_%fq|XtO;l+9sw8?e5YydKD1;|G)*%s}S_Az{q9@T|L zhWfDIV69bf4-#(v#u4(x<(1Ss5Q+7I#&uO^%5Y z^J9$@{m;j1_hjyHlvPD{td8v63i$?uo|BI2eWR3nnleJ1RsZwYa?jh{DzkF8Ly$d&!T{ZWHQEsovl>Xz_QkqvkDz{GZUKk!E!st_wjy<=;@{J(hnI7 zna#PI)jJc;OG_9U-9!oZpnDy>yldw~?M0&)-5cB1Ff#t^)#!^9Kb7s1spS~IJ~m9q zyv<7R{k-IutZqk+-AUS|{qD(KT0WsqJ7Fk?AZ{t;=SWIKPww)YwH?2z3hh294XLx_ znqtLxL*oHZn|c7K>~ZDEAhyNxmBIP0Iv2QcjC5@4#)j8gQ~G_(5cn8$08m85DR!YY zBC2mwy0xY(CT_Z{VXP=8!R7Uq@j4|ExW7d0H9}lV%T^O&o?e@fQanmO&&9>nJ-N7T z(|rJpr+?#}ST=reDTrfip_)*VK*|10dX^4X@_Bo%@+$!;=jUN*=}RG_UZZEn6dQQ! zzLJPUtXaManoQlAd}EAUrAj~T$1=I*$g(>Y7-TcQqnvaAL>M|OD5b9k8?T|am3PE< zWAftSND7t+j;Q;_<}6Z*jEZh559}QPrfd3p+!x=V9#H4ZLGJKY#n&}AEN-~3U+CHX zD*R>Xy^LGEFXFz(+5vF?0Pt2`l-briUtX7zA2sd1G`;E@?6fVqJ)*0p^p55U$xvoL zf%~=rXG+Zu<^Xt22fue)A69aQxL<_W9b8N{mDjAJV;A18**kw3?U@PoeMT81efsTv z{Wkr;rkK6eHJjOfb?*05y{xRm?K#h9P#xg(K{Xe|Qf&*%%heltv@6BT1O`XYEBKZ8 z?!|Isqru;+!Z)|iHm_NHlX@>hWe2-44&I>_gG9H%ly6dI*=H@`*{CbsQ>^N&_^lWj zzs4r;_LyJ22)u>XBB{TRWY=0VxDFj9R6cln zuqgWN7tB&pL=2Es(={N#fg%7Qc8E2A&&H?Cjt9agfOy1O?vPL0cJ>f(=;P;)_J^I($?%Y=KMw)KFUXqfHAdLdxAfUqqJfpyv5spRxXdD*`SOBKj62Dhvr5n zata&81#NG{zwp%D|5Z-S+ri8nf!5+NamNADe&knkcYyvA-vs53#_^5(-BnC}NCRZP zaCU*W&ML872$6@C?C60%k^_;jk%U|R8 ztGGBR?hKwFxLg9*v5AF;e(!z&52pc$w*!L?AnND{rnrM=EFct{>5!9|l>Cz;f#ZXS z$e$c6?im8&uYPiHWn!_7AQ}Ok`@h|Od>?Q3?>Cv> zjQ>}T0m|vejp$H@$krWgX6y79DJpxoySo{Pzy;rN%nbB@ELbEz*nbfwbw+vzsJgp2 z{je1EVdHgvut5V5I~)Q?L6X!L?v4Hj@iRZze-$UUb5aKZr{2FAm-euHHSM1XU>4vs z5`ncfDH`bs-ojDv-&ZIycW^2D7cPYzZt43MJ~<9={5LjkMjgXe1m0=E;jFxZqYqas z1{{qY!VsJsRs!I|-Y&2<&HxWLkemX5=OE2z2{405jz1XkKN#{q81g?Da&TezgCYNe zA^(FR|AQg_gCYNeA^(FR|AQg_gCYMrO#Baq90z0ngCYNeA^(FR|AQg_gCYNeA^(FR z|AQg_gCYNeA^(FR|AQg_gCYNeA^(FR|AQg_gCYNeA^(FR|AQg_gCYNeA^-m=h8%~# zItn7L0KgnPa9(Jr0aehgE)uWpHeE$`pKzkn7>%ln5uSa{@* z8uir?zv+#&fe8`^>^wxIf-2zbl8MuW-NVrv^a6?leg0;LLr5sDhYk^`psQg}3hbkU zcT^+ay;~wsBDPqE%Odtj4^e+xPf>9ZF;U>8vOnl=(hZJ=+QC6grXu%pLo+wj#X*tV z0%jm);HeIGcF_s&hMNYQHnR_KvzK$=R#u`UJLxa)@8RhIN83XEJ=_r}d4EN2TvL1>p6hw{tpcT16b#d*m^#NP*PZooNKD==z10}GH zJ8ZRw=RZsTuo-iqAf;*yduaY->LnZs0lI0B`Ma72PBvZCUk-)0zi784c29={|Mxiz(fO~qw} z!E_G~sH3Q)2uv6zA`R6w{UxNUp~wvrKaA^o*gC;~)cL(2RZsAP3V#<55GSmKwD&=2 zxS-Isphr_hZfUSmvF}n^?zSjrtSehkFcf zc>|<_i{mBmg94C^^*}8wE-ox4Yxctl`3W)5CplO)P81yJ4&avu|5o^C2g_qc)xF_Z zZ1Zo$%b5Lea4iDX$PN7^kHg}EDuK#K{>}%zB!l0TIJ&rl35OF5>qGV!){*aVoN@*R z@*1F3u)T*hq?)>hrYuZdRa#R^PE}n_R$N_8N={W)R!dz=6{e~I_8xAy$?GBxjfl+y zaztEQ9ON~%WHdC?Rb|CwWu-M?;^J~rY7&}qTAFHVnxJz8=f?*FrT9qi>D zk=|f0DsqE;=>!*b^@KYe&REiuhf3*yJ&W|dgk1^1fLjbq;a=aPhjDioC~gMG+u9#? zGRoE$?!f(>>GDsl()@R=IxNr+{L16EuKL%Ja43dCI-;>-N!1Co_>Vp@`Z4eS>fHW^ zTK3Mi2q)}75akyA-)+sm?W6xUT60nqyT<0ja3 zULn}Be)0b!itKQ&5MURSmN?vR0U`#{Zr}F`c>vPi_X>eL!qSI(c0k%dn(A=R4#*&u zKHRed@&QX9?k56S!^(f(PXzmZ&tM0B-~#>_z>cN=bzcwc+c5O-)xh);3Jv!_L3I)K zNN-Q%k1s2K+Yf^F@9z*`ng2(_&u?*n|9)SOUwbxy?v253Xa8ONSGftzFCIVmSuBkx05m=L%?q>&*w{la(1$*j|D!YBuYmtE{FW2z^BC`E z!hcHOyg)2#<)=2i(z$fR>Ps=qNEgH$WoJpen(`NNTLcWXmgg z#KbF%*)En(J+pj;U&@<|rKJxh@Xk~^{7YPxh8YTcAJn!#W`4$kwc=_2`>zfW==dw} z?8?@G>Ep7Ft3HBq@;bVwK!ZCuySV!L`CkgS8hP#dji|f#67DA^CFkVkwAYDtdD71ILiKXV*Sg5wT`8;|MkRz z+UIX(zsc!Zxm>!DR9M&fc5X{h{*<+AKveR>`WGYf+kbU5J+v&m0kaZknv4q9IbKlS zXJPC6kxy&la?S;d0)O!@!#C!O9NJ6sTyks$IkhrW7@fZGdR*XvO0kBXqmFy0{X8x> zNP(H=p_c`Wzoa;(DmE_Il3o6kR#ngWn=cK87^S=nPY=dA2nu@X#bp*HSQ`qPtpu-C zGqb*@)R@*|R+0BucBIMImABk_#7nkyNBO?B$kH=5b0SSDw^`+((^rf4sgGP8Q3!NL zEDjl_<#Z0sRI>4iS5-t?T+8fgyc(?R@F?C6__)XNv9@~_|G;9Y}39$IG~<#pF5`&ul2Q+79S|4s9Lwo#H0>(I=0dc6GI$31c1{Dxg}@zm*eAGRW$Mczl^<#%ucF zRmLS>a0{(GDHC$~Qj(-fs68v;R;?ms5tkT4x0ShC0L8h!2#7jL*0_vF8W}hr6giJCX zsS)mBT=0d8h3{6k$S0PI=uVM>j)H=!<_B~LNccR?7W-f_Aq15b`*XKgNbYHg(`ErgdS}&|aH!sVdIt?{&Ra!w*FDV9T?>6fV3rsFz zJbOLkrCE#gXphNY+oI}*(Z_`N4rv8`4!)$^>&|4%HL**DqdWw6p^QbaBQI|dWn3=W zLQg+mrV%0u*gX-yTVeRzhwA1Lb0!{^xE>Fbh>RC}mHA=koS%aI08d=@EmKqb6LZcV zQ&*(?yTWf2o)Dz9OEW)S5V5R7$Z##J^Sl{HS4J|C=kXk_R#Vftp>R5moT!UK_*WUW z`gGriMBU3bnq+K11=^ES7{N_F-U*_7T<-6GerbARpHGjz#nAf1v6J_FhVEVQcl0|- z`}B_R;`7Ci0_}XaY>!FgeOP=rB24KJy4wKb&CG<1zazof9ufv07*@Bs64X5W|Y_ zMg_aCYpZ7#KSwJ{E8RR&@rBtu&!9n@NXGjE%Ij3$>yK2@85WwglKxwa(du1H%5)38 z!pqO{zOYPaiH1HTx|2aI%)=!O6Ugg7cKvAo&A2XCl#P5Er?n>Wc_Z7(vv+ipv*Vpj zb#S>cmP1!oTg>gzw z`RJ^+Mg6>ih)XrzX>k@2M`H`xI~mXDFK%z=B!{+Y-buKu$f*9UFPnARKa2P|zNoY? zg@h~34QEO)N<5A3+-TqA%CV-GHk1l!x1cofiZvTU9mnsY?8xCT6?uw3m0lIVxz+3t6i@ zYYx3?O?}kn=8gQb+4|O+es_06RjQ^R<_zu@#iXmQOHbzIwX+&@+|BB6s<0Y<`g&16 zTEvjHQ976(+{VSt8^#z*A#~SDT!O_u$mIHfQMuA*wP!jnI^UP*4Jqpf1ZM~c^rxpA zM1oHM1;TTxW90D%fYgf1tZt9VCKWOOVbB~pmUJrUN$q%}wsCclUl+-G;-&Jw=WhzQ zX^Ky%>+(8^6Np5WWW0$p*z2?7Wx*r575nXmYr1v0YXF(iC7*Jrmd<+~qp#$u3&~^_ z-PHp59x*m`O+CI2D?6(vFq^?2M*EHX7B4%Fby^HBN7r4=r!_MZnMu>mZF`qP3N1iw zpL(;cW1NS%I@tE!`n5U3Rn`3m^A|X;u3wSwm?b>t=La)f$xG`qNVk#2+(n*eRibEg!P`2-}NopD^%KHQMZM7%eVOdvCTPTB6xkeXpzt zc92JF#EeZ30J`iVm`Jp+xvX=3bkcPHea;0l@!4Ai$@j>}6Oge_tf|+Al!6fICzAs1 zvNJ>b@3IsQoly!;oGbHoEX>QWcE4;{XM@j3CA^?1e1TZz$_s}=N=1Ei1A@r0v|#k* z>Gx&)IWJFMQ3%Zeh6^2ikn~W(Oe0-(&(`p5DxRK)f>5K82FUv+hwaxeC3MH>$rkbQ z_hKm+>e@$a_x;%O_(^@6MCs!?JFe$OCUwDJT50#h%Qnl~;KezR@wG@|la$A)T|75( z0-IocD#t%CKZu=YN>{3Bd&U*j!xi?4rA0Y8MzkuXvT(<(LQ+8dZoFg9_2P$PwI_Xu zR-bt+mZ;tyO>`$SJIU5?#KJJ)c3r!ptL)>MqcJB=G|1#lQ3t4^q!3*L8AOq%W(laD zqWi22$>>P;gU)Lh_bOH)^6EA9;%(XmRjr*muk{ov>< z8z(tbA*0`-XQH1B>S{^1zs(Dq38RgLo2x4XKE`|ZW{UC8&oMtssdGakrcGM$IbY3SE2LVS=kw1^KO@U7>4#tqXJKG#bu|n)jK;+9Zwu} zG8g|3F#X zcF}}VRZIEW^Vstmm*?dz)DsF`e30JIy1A2@Qe2eoHzfl*=Mz&^o{}#?KCEY4_aP^a zux#Y!jT=1e+Q;%lk4b&LDz|A8&BrlTal-b40a}1Bajr!7tD~LlEuS;w)UHLxGg$3x zjXy97y2MDFtW93a9!osON$sY4WkI;lJg(LB;(dQ4Womf0X6?$|Eoy;lqW5|b?$J!F z5GntUrrOuD8I8AWdy#=VgZ&<>5_b#kT%@Z|=LpH-6L{wP&WzkpB$d>ME!wNJg3>MX z0C^Ztc_P#u)FPc`cBbw&BL^}g6!177xAiB zO-HJ>);OoVWdrm}x$qy9zI`hsYGdIbAxoinfvlo|wy83yH}9GYB4EVv8N33m$8$ZM z$5aU2+aC3z-Vno^;GDy)ol185m2uQj<(Sqxko>OsLY|i;LKpY5xoKx|yR({-hZ`sE z;+IxzZC`GmeZC|=UKsxNQyJ|pQ3_Xu$xXLK3VsWGf{LYc9*!IzI+fmMr`>pV(#O&A zs!TB>p$Grx7duqf2&vIz>pJ+LIyXBcsRjh;aTbB>TeTwRpE^4eZ zW*GS<+* zyW1ba281|xjXqwvTR;#MyNX}6Z#EZHw;_7*^DX{?j!zYGtnQ*qOCHq`&xb_R5$pSo zCY|O9UHt=wu`5016vujpQb}igqQm-w9w*eq@r;j-Y4RA6vPx6u_t)#@=Q*n`bb1}@ zqj(qVW@f>v$Lg3ITK4t<`W2ClWRv%s&zl$Fn5#OYf%Z@;KaLpvVMo`*6Ia$e&y;9A zK(K}}Gtt!(>}U!xE{AxuxUB`;^Kd}FG?I>wHF6!2TJ7L0D^4(Rx-Bishfl(M3t@0r-h`io%K#C!RT4l zeDR(V>%98Rexb(ag0RG3)ryITU96ouZAq!c!+22znN+P%p@}`CTlRjb!&ixU`-8;|r*xH`?31n9nit@r$0o zJgO~7bKkJO#&|v8vft*Z%i%&=R&N&^d1cRXA++9~8r4&1Y?M)~}#8Q{i)M%`Oc-5s>*Q8nNg{FIw+Fwz! z4Gr-t@t3tvy&=wz&gVQ8nrnYi#Pvp@jsEJ5d(9Ps?ULut)JH|kO3l1TbuNwFE+R3} z875o!Dz|I44(mwQz5J2M5c%4q<*}Ff7f0{A%=(KblbGMJ%s-Z*%?Z@H&pEjCWxCLt zA(m8-2`;q2Y*MuBkpnewelqC$h?h%j@Wmq~tt*#q7u?krA|z3|7?Y|ZRiN~k`o0?H zYnO%-K2yBoTc5)<4?l{27mpOEgvkx;%0K z;u?*Y+j>$xJV$rE0k!RgxQt`_!RqY&jWKZyR0mjtCs_Z z$sV#^rkYK-DO~a84s$tMpvN<#$@XIfSLC<|dZYlE5#w&F2TXqD#G{oeefQIjnYUyT zqVI*MSZT%SJUcCq;NgvJkJF!EW`GG71Z&r6ryd{Hm9RW%U`86z4L{*|m(i!vBYIko z!%-&WbJvN%r$b4XBU#ffm48jh3c=*5AJfS^BE-@-J|bPHXRS8=iX5;s?bmEqdJ(Yp zmBn7XxW8avrP{TmgOJ+qo3c{2ksXR7;AYMB6IrdRiAU- zoiHCVlZ9p(Za8D?G?h!+DRSo zuUq$9FCBlBM3Jlfg|%_0mQ5ic3ueXfCE^rchsnV3w1X$OLC4Lb`2|oWPwM*FTN*{Y z?v4ZJk1{V9x#Ygwr8Jah-6f{bInSS_>TQ;;KR|%4ep~+0uNr=4u<-5B z*#;+#s)lR+pB^n@<`nRnt}XH2r%if=Jh$i8H|0$)XH$Runojm${iWu5KI3~w>u$^H zNJZ%qI6v_^uj=E99~lAuWMV<^;>CL=`p_fRJi4Y|O;iL!at)K_#NV0?Np6T-IOXoB zMiJyAB3K&XF|2NQ=jjrKqm)jaP=bwQWbQNjnd}yk8%^)i@F{L#2t(_vPI^0sYcXU| z^2+@`08K!$zmOl0X(-MJ;av5o%xe^=l4@G__Jm+hl^0M_50!r2ns%mN7q_)h=Jtj= zbbokg+cjCe^Y2%!_GI?oo8=Gk0arp`eD;AP9N2hAf-0~{00ez?OW{9b`ScqXl ztct~lpfCNIBLDMt#yPI+CW02gq7RFa?s`^T9 z$KM$`>1Cv%tf-bu9)EiMhu%q!-O1pb!0- z_O4EzIAo@oHuhT~_SK^&SjI|`6rm!9GNM8mZ|`N}MY?FzXi&OeSy7+&R}p6I~T*J3d_Dn7T8w-<}qa&2r~E=H>b zL5iDR?#|?CCx;W6N<4%K;#p;t=H;U#TK0F5B1>htk)lRcP|mL&el=M%)C0s-NcE>q zh~tp>jv`RisZi=c9}Q#GTKN(PAoPT`E~dJwlWOO3!nZ4?nvBmG+b_9lD;csC83cxU zpB~S_V-`acYvgfOEXLQjx=AE5x|v|`)s1_oXi2~%4J3K$0Aq;iin9!fi|MGqAmh*; z>Yp%rhbA^;!C|*D(6%=jPgs%Banp};3@O{HcK_s>KNKtoJV)@3} z!PN@731gyqt*J7ICakAdss8{Y$H9Li5v>Th8xzb~A{QZUSZQC~{dk4E(7S zf;^lXb|=GQVSIGLRGLOIt*%0W?bWrK@dWm}ISdxB;mU3nl&E0(R)GHi3E}J3#PLS@ zCfs9SPh~-hxuF_ajz`NKIApezt3k3S%IB!5Hg01nO@PP8<)F_cEI8_gtDdVh2Hc)3 zj%GT{i#jSyi8Pw79>9A|<3!f-G*jx8IL5M7!EPm0!iDwXSIess>p2f@QJrg2r9)8A z5_9`_{JKtLDrXz3bKYQ;?y_)z?vCYB6%lg`vsA1S1QD$W=*{YFes<4NH%X zQ!#LTUs5e|QQ?)Jig1u3YBbKGwNQMC;Cgx*uvL*-fYzXw(sM#h0jKjFI#DM>GHgw_#x_ z{7A8~p{Ei-%GVVJqm4YeOkOEsV;NI*5%2C`Y5fpD27}1bqt3lelYefv!|iQ>RoD}5 zy^|$9HEv_Cw)RdeR^3{9OST_sR8`XBVyK&SME7cnhVm(I?Hd#9xgmu?y0(&3ydDZO}voaI2Q5#i$Kf^BB)b+-)}E&Sq%;0K2$q_@t_+s{$%b z#XKvXp{cD(d2m&A3e;fAi0cH=(-S1o{;)6Y`Pw!~8sI@3T85S)ii`&U%uRhjCmy|4 z6_PDc$E~WM8Vt33z+M3QaOr8hHhpf;$I$GJ$+B`dJ=M6Rkv8Qo_n&UQ$CawGMy{%A zsOes^zY~tf!=+Ikq)X&W$aIZ9+-bg^Hn=j{TwBYHaLmP{Gy_bLEmYTus2Ip5oh6CM ze+VqgA`FK@2?DzA01xWq44cWN_^!+Q(*HFOH$O?Dp;|x zRKu6tc;%T)jFjo7LR2$Y`>0W=gm(zCMcq|ls_Ngn2gY_206j-<-c=BRPmd@WS@eaTrf{hSziXycV=HtstVC3#F$EN!7h z?k(-frmftvNgJa&)PRD4hG|S`4e9|NqpBjvV^0Z{yQn*jNI#0Fi5RZ~UL8)v?ab8s zYc(ZZRv#rtNs{}hF%?^lX|i)}3Mr!>eS^W6X3Xx!pA#w2g=3?QNpDrXwvTML%&Bo2 zO7W4U!+_w5s9FsnwQxU|TddKAl)~I-T8cm%7&T34{{R=)|IpShm-uBa-LAq`VQ{%T z?n;uEEw}ehD9@11K-8tFt9JEahPEZ3X<}uR#$l3YU=8&9^O*{)P=H7|qKxYGVk&9q zrhxJ4;wZssBqS*m9oQc*zsphmoks&7mY#}-AyJcoFI6^qXihXV^_co}ii)O&rnyB7 zjU-aE9u!oURh6|jx&{RIp~nv6ll=bx&Ez`Ug1U5&Gn`i+m-tUovAB4S+os4?j@p9whD?0PR0Na20Yx5NdqNKhWNl6d z#Hpf$;{}ToLFdQhI&9eRR_3aAW;17O8cd#JH;$1p*tN#Nn`{jXYSC5r-l$7gPfn%O z2?0QkRg2tm>~UO4Z#qXgLPcEaQ~^Z~6T|W#^;uHhCW=Q>p>P4z+KKa`{73RVHtq~n zUMi0bm#o9)Hq7v2@;h%KkX_#$c58dW(*tuEEpMWhTkj<3XP*MUPLn zs;Qp~kfeq=@|jAn1hlCpN)sTSiK5ngFKHJ3-Dsc+6rtARh^0UWAQPPMB!7piBQl92 zC-i}?P6_g={{WxTy=JSU&1|QZjkhG=1`ZM#)0lF;UN0^X+^laDgh z3pA`=7pE82pposVqm9UooIi#}19qzcg{qnwVzsS4-m1PTgu7APY5`@<4-x|o2Y@1& z>Lv#&Q5d7{*vrg-06HsWd0bhM;sO)!_C)sl#Sq&u*MG6>I0R zI1F~-q0d%qdWe#aTAcRM+nct9(>s>P?pnfp)hP;6t1}Wlp5JDQFpcy?Oi<~rmJQ^A zVGrUeDK)H*Qb57$&k>PWrOgdMApA;y6SSIqJdO&Wk?Yqkh^m60cUA7(l|Bxea8F57 ziP_s*B~-XPm41E#hKiYK8j4~i`)EWFO(Me5K9(leKI~e1aA7iqy=*mAss%fVr)mTJ zBSD_Mr6nW*OF(MJP^LI(B-Otle1$qiW#`Awy)$`y^-lEKJC?UKk)f@upvci~*l%U$jMlmsc(o&dawr^}R0=QU(-X%zFIH(OPUY<5LQ00I z6!jqErS9m(Nr`;*M%>!i&AmsFSn;*HZw;KE5$gMRGW%sA+WD#La+#`(4Mb}*)ES-{ zxh6qvLzYyt%+B&cZV5P5(~-uB8x&ADElJOpTM-PjCP4sSiK^H?#LNas&Hw;(ldjy= zP5f2~o_O~@TDl1aR)Q?(sM~NF7%FRKfKfdq58P7ZR!6UfYEvXg#Dk;{b{78t2oVN3 zEWrULoG8Yu0QnkqSml-_CEkcd6lxSF_=u$qe6!P%WAV6rrW-S`bD3PQ-W2m;r~VTW zuHKt-AyFGt<}x@c3U@KbOPBDv#T7%mrWSo_F24LUOIV_X*Z7v88hKUlx${tH2NHUC zoiUjub*SLP;-}9}Ndwk^SBG3;!R}lDqTE@mFYx?rYS&X?%VX*>`09+tG}Ggz_=;H!(?|ldHl`xt-rZzy2Dc3<9!#!6@W@)w4_asK>6Ueq^uhf#p~X}Zayy90 zKW|Q%=fzD?2K_XciX43enao9e-CtctNn24@O8}?B?z!mes-~J{tc%ENWR4hhe?Skm z9!Cl#dxemm0=fwF#Vb$r**<-2C}67+G8_|v;GZxFG_ToOblFRZ#O@8HfTyOHWYg{$ zq!4ZWkF~HFT;}E6TavHIjir-wR!b?R#Wh_#!bMmll@?V6V+;u@nZQ&=mVXosD2PWA z)Mbo~@tScX`E^eX737(46dJR+EkTf~i@;aZ54Wf-6*j`krauk1VcryVm{ym6e;L~| zP-0TM5hl5Ii(_(CNj_9iD98 zWwj$n6v#zL6(v{DnhGD7$4R=pgjq~&HX0c5@K-Ho@cFRMc6lMlR6{CcVB9j4q|(3S0q9tpmc@ClA^$$bwJFsI=E=+J3tFl=seh;Q~Ns7 z)Cj;v6g8=-$@8Eczh@qlb+J%kDk-X|H$`=R-`~{u40hwCIdrV9lMt$5+!)-}@ySq% zYz}wsnFxtvsQXyt7m(YZ18}E6Td*O16h#=t6^m z>8OHwM^IGdDmOMNpJ(IpQB+ia5{Ch{adIVkHBK-e;Z->rN|{#?lzN0uB=R5{Wr}v|a|t{$YhRN80F$iSe>`FSA&Occ@mE#g_WStd zqmH$+R5=NmygYtI7$N z`w|TXoR8Rb4M)$22ZcJT#s;6%E@_iqAo0kiKRTYB^0_9*uiXiBW^b)5AfB zoMCbi)xjbhwSHGKEmXT_aUiLX8dgQ8@hKqyLGRBTr7JqI%>h~>k5IvK&HW&2>N>8t zq&h^Qu}}|lf3@<`KR>solLy;Z%G-LE5kV#{qbs-L$Ybi?Be|j&!{`3_=BJKfOh1gR zK%<(ubkfTKI%6DNrFCsoAPQGV6rlACMo-J)`#N?wfTIO+YhLEyY2>4a*^%?<{{RQG zvKY#h%i^l3@i82YKGuVN<1$(77R7?6H$^$9+)KLNkthVzbC;!9S(RjwG^!9u_jwX2 zqH@3+Gx(WKs(H}?*I!Bl>(zBIV;WG-JG3h)C+s{39)6y^EHj;(xM_A?D`##h0a3Rw zSxW47OC5{{XGp%-Nfyj zt$haN+%(ljR>fm6Icj4?kHls-T+lsbL|c7mqmC_ZN0E?n+Rwii4;@-v5duz?Q>Lem zlmwb^#%cC-vm|s_))V3pKy?jYDx3lHAP$=1-4yd|IB}S|rrY^iS{$xFCAlant7&r? zcyY}YHXfdO_N|VZJauFh#yZM4qEs}ohXsfu-58{ZvCb8u!BM4n`4ZGDY4(nr3PDhW ziE=of&VWz~`sDO6P~;)p8!K>PbL+NuOJZ=Ck%8EBbs1AO)2YW|#2H=vk4>jfL${@+ zq=lNP>g!%vSNz)o#Gh|0tW1ozB1?iP`itTyQRI%!p$#w;DL$3!QU)=sUK1jdQ=yhN zC;DScJA?k2M@U&Ja~Q3go5WG$Fm1QCw(7$^>&+|IZMZjXGjTx{I}2Z1fy>JkYhxs6 zR(~};IGD!mB#or6x=S0Zz)tF_MNwF3kowYxxB;CffX#Yo0@O5UT@DEcS}Ea{r4-i{ zugaZH#_!mvDDb;)OeL}SoX!%XHN7e5Hy+5Q#{nwjszVvZ@L`-2o^ zNMtuY?2^qGc8T6GPl;HuBg|=FLWAa4NvBV)llo4JUr&I2rPPA-^3+e+(swOQNsrq# z80O5dG($zxx_pqxD!FcO$Ts1PI1;Oe(20nVs?AbO_lx!v>y{b zCR$v--NTP;ZF5uRX(GkJO*I}rCAqRw{{WDh=p<#4L5#5D--Ih5EcB@I71Tb%P*fi> zwCd_aXhBoqkxYTzPx$a0Xx(zIt*G3)k}cD`q{(F3uQ8Cw)CS68>bGulY~YpZDDl$O z%@kOQbA<6jPcqK{o^r&ZFyMFr5h)uh8q@}NG$imY#hRX-R}(QoRRj7Whti6)A8j$# zcc`G;kYJ$6w%FUTZ>pNgx7-_VXXi3o#~+TMm9go!jy{p$rQ9^RQf)MJ2*=H0Kru4X{+oc0oR%Wt0tcfB%sSV(N9vj(n#|?JNx3CG zeMOd|lQoasTf=8=T0DIoDzi>6C4j8LWGN~#*$610keKI zq-XdQS%!R-7}w@C4ygi1IX(-;DX0|JML+GRKf%&d_+~m>qtWfUy`b3aRzkK2sVVZ+ zxV#j?j(BPI{`btsn~;o@6Aeoe znd5>RKW;Je6zdEdk0ZBn**r}uWfu>c+w)~NF5k*lQ%$yazF5{&<6_NG($l>qM3{&n zd(l(tXY!zxmfU-M97~>7}xNFhKG>POROz zYMC)Oi8FK}7u)oa<~Ia1xwxdOk}@ z7&RJ_nopjSQcuX%hsX}Mtf_IK0VBwQ3H6{9Q|ssR>0N=_n4IQUZ(ziLHl1l zZirg1AZ06x0vsPc>Kcz)A)x8&J+>(}Z(*aHE=_O~)JxdOQG~`*;Bu7|*i?#>9}WVW zepFXgPlt}Kr9g(ZIi;+Y?Gn0??Z=R~jzkgBhF4m~56l?L=wanX&!1Haf;l1x#eq2$ zlB4DbK)`S~6zQhAdaQ3?X0kh;zMg#AQ|-*vW=B7?=fu9sk0BwceD-H&QHp9E)h-OI zbZt)X6r9LqSioO;m84ffUCfHUZnCof0L?iA9^u7FHT46g(j{dTRYa&AwNyNC;)I1f z2*nQr(|#)T`5e5LB#n7+l>+N(yRP!L42@Y9@*i zeI zJF2pSFEdt6SChtKvRQhqzgHbc`}WhzOEXKkw?zPmQo>5ZPNXldPNw$6uC)DF-Mfux zKma^Kv7zJU#{;K>GAmH3wmkTsGfEIXz%$g%*S4|ydvxZSNVn!b95zCpi#MCx;}czz zi!WV@dYLft#f_4y8~2-nqII4nNuF9r9f7=q+uC7L1TiY64LntPgTU2kQhdcQa8FGZ zt00m>&E!flR1Y8o)}JF$ zmaIygv@c4ANhOh@j!ETHf9(5lzPSf}v_yQ#Drbbur?;TWn|M~yVMZwK z>d7$3YI3yLN;*ntPH<2hL55;J$2 zkPT~G4h>xJAD2o_uu+x;Bq*gx|MW~Zl4$F<1s+#aS_8b+M{LSJ_02N z`YcHDua{MS)ngpq361y!O1jgD(%qk!`B$b|jP4ePBfarE17hLu`*(3wQ|-JqFL>m! zJHID|rmKKeWoqW!l24DPe4JEJmV&A{{76rX*xK$S_l&~g8b;K}kGTzfd_;E7o8;?$@VJweF&mAqS z8hL?5BBO{k_XQ5!!))AbM%KYmQtoKGTYKX(boq?s5vZ1Wt)BP@Bc+!d zU^;~qPGDlH9z%P3R}_p|HSrJ}(c(#GMjl1zge5o@pi$Fuew<aDzSGK_RAMi(z;hp1FG@)6HX)ePHEG^ zVA3QA&8C$qTS*!I8q|NL;apdxoVc3WT&6OQW@E5>f_ggX;Fo4&UTwvW%*T$EGC2DE z!MIUUmv^jDNh>xslty5sLL6xx?wY4i65t7HD8Ok_NUo4r3N?R=A3mED)Jv#Tr4FJz zv5+_lab-MuXsp9jZe8V)pKa%`+ru`MFw0FzG2mF>8CYvWXmcuIn*S3qF{_zwnw=f3_Gtoq4}V5j8Ysp$T$V$$=Rl`T33~sj%Xq zS~l#;^rMRfQ3hWf6XF$JoN7R;?s?fWQC<^7HBY4U4MBWGL~NCZW#ch6fKO z=i7US2~AZ`kEUmrCy3bCI;s|~%I1qdkI5xCj;5mJWGH}-dyEEE5X{lYuac0ee~uNr}n83;ag2Te%+E(fO*xOd(o7rwCB9l^MEJ~wzoD>p9O+qt;0 z6uWV&>VJj`UE746KIRcUL}~s_7OI4$we5d)mIOuD=^F~c0%t=XzIAdUl_!k{4uiUkJ_4GFYd34bjE=5~lA9lk#?2mYbL6Tv z+^ZCjEKo@t+a8}GPj@vHQNE-gB9IC9ZA%znTV9%q0Yi~hBru~dl~uUl=ck-1%BDi* zv})3o%_taDYG0TiK9^F{?VZAvxn8)~RaN*b3)0nYdYsWfD|J`UsX{|4yw@(M#)?e? z1M+klK{%mdPoGVjzFNFR7V3*__6{PS3!dBfdbw~j?$7j#nA|W@#;r8i?a=u6=f%xF zMcPPcM}kCBRF(_Q8LU0FT3Enkc|w6gD7*=)5*nWeA1rl6?nxEGi3?O3kV*7XDk$G!74jWDVDdRl zxQ2$C6HJp$OSot<&A91e&z-r2sH%)+DK=goCnQOQ+}ManMyW=5>Lic_Hw63HGQ}a5 z3y%(J)KH2zD@`t~sS3A|pd;6oh&7cAs?Jzj-@H+!2nwhxRdIlP zz-7~lzR9lQp&}v$K_0=ki14k=jG33ww4;d$_)$P_smaFd0g)jH7U33h8gR zReEh+2YYzbER%-RhgDjMrc@_J5#hW-6KPbJp;+uJkAGQp}RkH^xqs6G<_IFO{Wk}yC&=IQHrt;tZ* zI>bTl02vh2;)De>`#58vFK+CKvwNE}MX_;MII!>bNncU8H?|`W+52}6M3uEvux@Pq zMm~-llTe_7y1tqNO0cq|YERcw&k&M2O$DrslxXE*(UN@Ch%DI}l7(4o)r3=si<@a@ zj5qeNC}V;6kddWYy~;rZj8m`w(bn>-6^q+AtOiz_BVCx=o5GeVSwDv4a2RaNc~+@Z z6*1ywY>j>=9+PNBp11Aix{^+le|NZ>^?sRIY5*WJ5>~uSx<-`wE~Yf&p1iTh(LC)y ziqteyLVSXjAi4D_H1wRTz(qk_R&u(s zo}d_7joBlSLvdn#u?+D@>H4*`2T365EPW8L_46Z!db=dVrD6R>$X4#*kXui}2cags zI#FhK1x8y7Rkf+IRe3F`x2x$Rp{bIKZc$d#!IG$kmkUq4Xz7+Zti43JPG+7t=8h=X zG18*`>|5%dGR(!%sEX2Ic>E&@XgHd6b@1b71|TIPBq^;A8q|^ncmYnCDl?m#XJKH* z(?^Gjy9<+C-ad~LkH<@0LzhRXk0n)AEHKs0T}K5X7L54}5pY1iKI$ZvQlTznC;{MT zqN5~G3KPJS)c{oS2)ADs8jB2{L7o75Qzws5XzA)}a-U_Brrp(ftl+K9(!SfK%HuZ{ z_@~WNB=qpoB??N^)UYvUEYTR{R3Lx|A>XBT{{RRPa>eDeGg-1kJ&cNOYot8GJ*&)UM5$v2-}yvxB9=*25dc zw)a+BEs&ZznK5~tyOOD&A-XV_`g(+ED`Qxl;bdheNcQZe)Uh&xWWu5vV2&0O=P2mZn)Y>*Z;vaMR`>`@DrdoVe1o0!bwC z(^IZ*CyACA(IY^lMt4Y#v-DCuKF$DOA&bv*TZdmRo%<18tRQ_9h>lZN+1q7gZ}t_2-DW@ZFRE4p+P_c$E!B40sY(?CIAtw(}d-s=It`I!xB% z$5hp1F_|pB@uh|u)yY%Ri4F#qCax8=b-2W&VfU~WcwtfGw z$5To7RCzji6)AENWJZG=q1A_u{{T{b>@visfgXHo@)RHD>p|UEh6KBC{P^+V`+62L zJ#UTc&+au>VfF4Vj|sUdaI@s{xm?A5;LUxRrG~C*RomEnvS%?AlE*Kp`89V@6OA@5 zN!c*B6F~Byt0Y<_a1X*9f>B%1bpv0Fd33^unhzX_bdpA<42#D!V!hb&p`hVjl6krw zr>4wFCI>COw+Pu zcw~(rJCfD&Bt!!0^9x-*M4pv|W-&k3q0L)LmIQe!__?7RSg-m~)Oz^#)-OATTy1{f z%urI(Pf@t*>oO;5ZVcvbN_gvYQzbK0WTT<4$zp1L&Xt^)>jLU=a!0ohdNW0BqSZ!} z4Vu&VnFgA%%?3d0L1ok3I5Lx3s^Lcf7gY`i6T-YY_A@1q*?D|alsGI-TCW(j*{W^7 zyC|zLl~}lPsda-hH8o`oZho&91IG040aza8lodAjzaCg<6@ZW>4x~p>UL{o2eTAw= zr%agKW{u$!#2PmoRE`z%r`cYnQ}6uM3Qb3ff|{2lzeR0k3p+#h)mf)}{Ed!_Z6T|w zn;VG3)=Wy&gpL}nL3X!3(#H!(79@2G_^=SS{M2v((m3hDj+}X_M6xS*YIP_&hy-G) zhM>2QBopb@2sXaq+dGl+HT!CYAMWqi$&$q8FxcvxMoeU+Y+gbvEi6?}Nx5RDtbn8+ zZ1cus<%;v|baKlJ8DhE8;{^6GZ@ z>>bU$mkURl-Eqez6=~N8OIw7a+V6#v?^=jb88BGdN1N^Oj$~;WzhuNhvp5$R(pUNi)dqvQY{Ky>P&#Q+xeu|@~*0Hpbfw-RgWerKjF(M6cYQBlviw&vi+ z((WzS3Sy+9!o4QQ&*5N-nktRS*V%lu3ncrWB~b#rl|HB>qhii3Pqh-;O9I=;BwP#?8B_@$FeClN}E0&h1F%Y^RB2L^SO1EJop24t?$^)=1t{F`CgR09pa6zkoi1 zN%d-v%da?7ONem`(dL-Pn5>!dGaTU>SBTq|@!_S_J9a&!+ zEpEzMEV+N+l-c!wRZCv!B}58}1ARxd^codepCcg%L+Uje)Tr}SCci$cR52Au+codV zs6Q70-RW9%jEG~ug241N!}#?{Yy`VfC9b2Uk|-&}*sae;k~PaB=N_rcB{Qx)(pE`Jgr2P+NitB@MrCDfY695%Y!WjYRT`C`R$d0+Lp5JkEB8(xl#@NpPsjOM9#-90Yip0O9e2 zB{-iAHDFibVkl3aUIpeRst=#ThCW){Ek!(qe=d<#ILd^@(Tr9ij)YT1H4aO6N06we zk9XoLGaei+Uo(lQo6C&#D2@XVFh~WSGBxY`RBO(op_g8x~sH}k5#DR z7Jwcezi&?~kgePJo#T(d&Aa~qxguITHb#$h)ME1Z%q=ZxS~{xy<^~_wq|3#WX=KMw z3~I|822-x*+iHs>z9>YBVdfjYhsab0U_i(N9X6*_dP@UeA_!7OMMyZOl}!(!;nJR} z4Tt^VsG!1j3`>ZEYS!*8y;DiB_ZE6r+_co`SCZQ~no7x=D?To^NU{b|%~w&D8Li+t z=O#A&UaAUcsH&S3w4DGeZ_KFSpB5O9T>5n5hFou*;z?HUT&_~XRm@NJ;N>rLg6mOVO@pLP?(?#&I~iz$-rk!}ZR9qlA3eD1 zsoJ9t9^jwp2p0ymG$C~P(U_3RTjg5tJ$Z)%r1*Z6!TE&)x}R@QtFjw@ zkxoyoYWE&H2QC7qX;e1!tHQQwifOUSOO{HgF_gb&4&JG(@y7$YiCOGjuB7{~h_Wjd zg<_%jL$l-5wFeW$X+hGD)ulCS2l^p?+!AwvGz?id4hk3*I!BhF zPw90+6)8susw+&6K4cou{hWO|VXoTJVP?x?vr^`8d5ybQE+aWplf~pV-5x4xI_1r6 zaU4)V@zk}WKCVv->RJn;1g_;eFW9ww|hYg4m!uwZja(zN4H zY4+o%ihZ39H)8IM;aK@P-0S5a+?ZNgDy^|yUAJ(Q(>)ay;Ou;8icFRso}|@?QkhDM zs;QN(}7 zn{Yu-Ek#b=&TVQK;HsdGqKj@#m7G@O=rO;2UqhF|USP#Ag;LDUDRBA$51PN4*&kR1mK>&ND}AML*^^!vCsJ})D=>Fcn0&BIlLqRr-^ z#%23ABR*4ey+MK+(?MH^qn{;+r^C`^;qhakO>HFXjVW-q_e730P*Tw#H64jYKQpKW zt$ipd*O~4dcyc<(zDMBzdH}?c=uLCeJqF{iiyKw9sZ5pl-Nm>nw-@&#&*b-H zvu-59(P42rZv#;zSs3H2t7@3?(s>;ul1QuOm9)Wt5s1l1RKV ze!v$=JV0W4aeR17F_tiB3aTuc$n(or0Airz@#(5~X=mJmqiF4VSu6IgUMhFl-Hnw^ z-;&JDLSx0|vXkUmriOw{WgcDPj*k~jsl&50C6P;e^loEQ5;Rt`kAxE3c*An~xX^lAB>eyF^xivSqBP+3Vk}O5E)y>C9y>sn^&y} zr*GN`UzbQ4O{KW2Yb&vk(95+U6w+@j%}#D9c070-I#1`XJ1z|Dlu_qp%V6DPrKZ$o zeIZj%ENeVOcw*^NFypn{)nxewK*34jkTb`v+sYok1z4%hp6x!mfuYCC@~P=}k)YWd znx!!vQ-|O4ncjT=tIZsr!Bc4Tll7-p7}e(s74(%~p5Dl=GxlQD(H;p!xH^Hj|ga_Bli3=h4a zXynq7k^wkVsAD5iY840NQ|LNyt3Py)N1(}~occ2Z`#29i9b%qJTyEkUUaFRhbl1|? z)L`VLT!gec5`zIDsj12J(_}_Gh^V^+!?R>8dC+ zJQUK;1Id_m$R2w~T5E z8Yw?(1_U>qYeUeFv%70_(_}E2jkgxk>nyg}+nJB=MoO7lJ;|2Zc&aGir!;wv%&X1f zw-rX|s{&eDYFdA#{8n24$I{6eOM9DzjF;4mkqdCfgn}f6JW8C3w`n;hy*wsq5@v|J zpn@M$w4fdYXk(-S=cgc6qoVljy55g%*JtRm_`SJZlgw{wEd3@jmPdMHQ6glshKO;c zYw8v<)d5f`v_OCdwFWt-@uXQAVfcV;Otj;wnFgPT(x;^6MOl^&VmDO9a0sR}*9<;O zT6y%VGGs9+m7w1gn3VqbU=CkzQsyP7mkCXjsFFNZFLkyX6_JTC*_ETejMc{S!j>x) zo7#00n%-z!JpofiSs1VI(2h0!9_sn^wi<_qY8((oSwKFu^B%RwOOCmZu<`Yqqhxgk z>%!;d#U(yMO|yZ+(QimMR5Y}-ljbMJ)n&H))t_-$RXA8uUj!mR>c+}0>J<8giqh(6 zreT9ugc1kiS7oI*9be$<&h8`eZtYS?m8ff_*b4Ddyg}kAnsqCGVYc?=%2DNTIQZq< zImmH1z01|OJe>90yJ}Ny+2osWu5Ud)FBy%(Rpe>dLmd`0OWmlu8Z`iLK}5=d<*XX{^x=?)dv*3la_uvM z+?`*6>#KgjyYd}Yya#!V=k6xWJ7|d2ugK}Z1_eN7IO|XR7>=r8# zgRiFAty`I?QIO3gCVr}leWkZzhIr|`QKdyp>WbiLKGnzI8A-SfXP6UFqB^k7RFbF6 z_E7l_n<8Nv5faf(njYc>e~m_K$GGFJ@zUV2d3dSw)zz6y99555{5NmqYC7tr>0-o* zG8LGZs;Om@7Wqn-SfQ51>SIG?(D(M#it?3_EyFbhM2gI`90O?b`SJPn<@`g%qUR~3 zu=_PqwDSk0d{}LPna6HQd~V*WpqC*YFCDfq_>JcE)U}&}sy`>(?n*qSDe_q?g(Non z=_nSS8hFDHbe?>ZF_A-Bz*d>kCP@H3OO{zF<*uJ^T2RrUluGptUhNDB^&}8dzJj#r zX%-Kyv0HA7H@aZ0-5rgR!e`>eZM+WM!$sD6lP8R;T6)GIZfugEo3h^{$*-xIoJ_oNz1HxOyqEShRiASFmln{XN;i!6! zk)}Vm$5r-49zL6^ayTg|u}2Sql9vkwB+Xc~mE#qFYT>>zwUjvNgG}}kOFi{CUOm;8 zQqsqGBQq$fiUcfpfut^+`q%C2N_;Sl31bs^j^IDr*Vl=sQ8D-`{8|3^ZY;e;4%w;5 zP;O1XTanwj3aZ}K$YUgVsqq+WwDfg2%sq4zmy)6CUU|ffnE%?I?(W-AdfDQxT@T$=kxpam1Amrb!InnX5rdY z^w^!9hLlvt9*MTSL2Oo9KPz~kr;#Or3D#7oKIuGPyd*&_B)SXn8Y}jU5X(;L43)|G zp1m6jc)TcEOia`X-0Exib5p0&Q8eMyO~p?&X7tEzEy0+0qs!#-yJ7H|L5}__ z6qQ(-N~Fd`ONfg%_c6kk;&$86?v*%yR*`u$5^`c)h2 z?$WS}#fst$HWFnENB|he!ZhIEiqMRT9;muzSmcTITqy3)j@aPT&1=Ap+K)b_?EH2! z5xuB};Dc?)wJ5hLw6(jnD})tQSdSdpNb%KTt!q|%enHrzbn+w>lD4lVk#L^kIU<3R z#?ndx)CnSxb5F#iFyP;|om$#Brjb~q768zODo2n$Tn`XMM@k;j-iIqLT{GM3d2U(; z&+Zz^Y);y!$5!>Q$-x{=w*?k*x@x?pT+l@#J$aetFcac|?g{p^n_{mev?RiGcPkW7 zns_u>(87b^^iicvI)pzMo?Tfsvpz<20}O=i`UPjPC9~2P6r1jL--84KQobr zqMs{)6!jUs-?=fBDB@h#-aTf2Y-6#LPS8_2LXgxHzK0&KXp!CFnc%om18H>OBGgym z<01-iQ&3F@PL-?1l3VDMnyDtLc#5kY(0x&{=hB-cvh%n(BHH`n3_jw+?+PmY*HxU^ z(d~`%yYO;DQq|Ro23r+XGGMXQQ^yiiJ!>R_l_c@T2mrkV>nurkVSFaCkoa;$38*9r zcFKxUN(v)Zg|So9at#IInihuYFbcb?C~V*zEJH_9Yd~p(*Z{=buQ`&Z#MHJjwm-DRQZm<8 zEoD_59C)0jHy|bl?h;36qa*aI4|edTjKJ~^InNAm;(mDqXMyWtNcB$|61k=btxx$! z%k3R1QmQ?|4*cGDitV3_$2)EM4b9ejc7mG=Qd6muEdf> zgVL;;8s_Di;z^5X?nw1DK=Ks`qZCvF9C-B9NfI=6_GJ-}0@}66z*f4ANvj_!wLV>A z&d}mke+-9>)5P~B_8al$Kh$~sOcLu zn4ykY@X%!C!fhPlnX}o9y-qeN>glGV1JdMFK@~Y`64&=zQ7p0PbY->)NebmvLBOB` ziQ`Qq@Ls7XG0O8O3`qo3olM+65jga%Tg|i6j%O)N*11foY@Nfgw;tWgZMrAR=c=}R z_5T2GO)OP35zmB8Y!9ANN|b}d-KatI@+0_h>$6zV=g{HOAx2#+K-=B zWhi5oRE|gT8ri_}?juO3^q~WXNXfF8$tS3-sKhO0enW1E`?)K!~k=|01ZBMIXyN^Y|(;1TK*cJ=6HTs>Hh#X zgUVxZ6;tAKv)5s8(cp6N?pm$6_ET48%|Gz^ZNH6{jL(t#BE!Ir&ZxxthP!*)>8K&( z@PpAq6)eR5BC2UjaLEI$jYO zBPW-mnwZh9M{&|3#PiTf>XV_oj0yJJcCb$km9(iOs?wCgh94295(1Ag)sJkO0Q?he)!?zzRoPrN8Z7k9S&4B~iF%gD%XU`DHt2S z9c+XQrnFE<9!lPZl&BxVxIVb)_ioJ;eSNw1mhj#XVK9`NvaO}YOOL0o+_;Llp^xvg zm~0&l6nT8!YK}rwB=u2Jttn#~h6CG-Vp9^9o$z~O4F3RTl_W&9{7%(sV076mhFUq>0yK9?2OLmpNQSi09cxO8lfr-sgZ(0Ud{vDDR+!*;pXL^W80kT{u$a7cRV4j+ zQIX43=dks-eani-;xTkWp1L9Do}Q6msjR1ljyifm$s@}hT~3`zaesCuDT9@QNYHw) zHT={8{?|V~v{BG7o?adZ)n;(jbn+cN5U<7&inWRS5pUKfzRKZ5&m zHCtS_y&zOwZ62}x5){+(s3+&vm`mY}GEw+vBD{ROzscv){{Sz&@Y3y!*3H}5n%%>+ zt1|m;JXU9aV3G6tI~R_;IjONVbeSxZZ45doRw9x!<}xz9fD7%FD$_BA8U<$5;*qg> z3~OM4*p2`O1J=DbsU$@jNd$}|AO$i61pfdEvD07aFf{U~P%~d?hN#41u(>>ScG=I< zEO~53&Hg{PadotmkX0Hic3U-)j~e-`tl~mznc|cXBMMFJ?M2)uUM9MM*@wbpgv7rs z0fwVb;;v7b>(L0>CJ_Z$e-ILDC-{qLG+&VN^y$90Ztv+ZIZUlq7k6Q?yJrWAuHGAh zNb)ewHr{G>r;4v}$CsX-wAWLpf*N{Cbdn&JaDiJMzd^81f97SqRNGEwa;ynA+o z0X!Np)ful0!z&)+sF@{(e2kJjAGqwkG6DAAh=E(dw~g3RrdDMGY6KE=T5Q|y{;rykC#%V%~LVOr-~FiSJY_+l|5PGkyV;|R*W*5 z25<{{F)CX?9<>CH1FYN9Oy*a!^FkcnR<^2IN=i(QZx9z}<+D3GAx#0r&{OS-D!P$H zM@IV1Z4*3`8aUmhQ6gL00xNml)T1&NIGCe8uRU4^hug-AC^&V$7HB*<43uyObYX~4 zeAS=zGyF#Tvar*Sc?6fiowwBOcvk7R8-?K+ky7YJU%Sp zu7+mP)kxKo#KFO9*>1B*DUs&f9$APPV@3mj2mnx`mb zJ$g-2)#Nc44DQX!?ReqBHr5-@v9q~6R>@uUhJ!0xs{q>%C0|x*u^6~(L`-ogrnZ+< z%41#+yEOAco*&dGhO{w>09SuHu#Ax7%qgZg^q8z{t1r{DN%&a!orBha!jb63PfZA9 z#Z_VJcRXoRlr)u{r?@h>Z06m{ZfIbqYIyJ%>dNZKrj0iP*21$(imOV4B|ECeZhf@# z1kka~8xt+dFuIRu%0HC1*iO>iIe1$;ur%n}%xNCEn5xFtj zQn!7{U5(xuuEyG%mmMbN$!+2(;i=kNTLp`jpJ&zPYUo{Q>S%>KG_?)mlhb>+tgIFT zaU9W>ty@udeX3s8B0 z(Jrzpijkf@H>82!TS+NGcrTx!(Cig|B4|2;n*IetCUTPmC?v+z?i?;Y3{@PWt1X(@ z^i>O<#%>DXS&c@onQOtOnz~kk86L~y@sNGld_ttEu|t!fK7r{{e%x!%RMKM}87GcS zR;2mhAMj(!y*krWsba?2!ypx@O>>>ch5 zz=|PJ60%c>4W=+D>dM6VROhC}vZ^vL(;;r)&c}}m<(LEL2>iMTGC1s2bzT~Z4Au*7 zR~@ram6oQPbZ$IUdn0jUt7>ZZ0Lf!si6W15Zd`PN8f<+Kjs!-GEP=1>vbM5GBHRV3 z6mnuUG{_jPvQHL0qtJ2ba`@_~BM;&Xj^(HOT#XbTX+J)ku-Q$kO`V5x(br}-J`y~K zknH~e?`BMH&D9MCHfMeR05x`gk0(PpX(~tT3+PEl#h$PVb#tlAxwXajL3xlVi z$w@vw9M(>=AB5c)++_t(r^-@CPfSBoJ}Ssgw#u_85=IHiVp>KaXUT{ri*=oo|n zstt8%08`YG4M^dpzdpB8%#1^bf#Lz;en1dM%+j1XX~kw}p|7LdSsk|?;EyLZT5Y>X zGgZ*nL%X7@ihMSIa8tz;uT?EPu1z&OmWI7k_b#B1e$}T*jZn7=GMZ5NgHd0V38$Z4 zkwf;RthvQB=jB2UJ#o_W50|2f9n-uwW;wTx_*&_x=iB)Sax@W9<+8BM*$w{yMO}oY zlMPi(fq~anGGI`|#$6#4d)i3q@+vSa1_>I}k4owUKcS%=IPtR}@dyKj0Ra7!p{TDM zj=A77v^ZVkLt2$MndoX`rN9}m@Yd7pjoFx|h3o5UHw_Ibj-xq49DlbRKA7TXc-i96 ztPNR=s>Zl5eQ{InThFatm z@2+wPU>2j!pi{`6u0)DFCRagB2O0?UHSTI3FJI53uGibgCnwu$hZ-ql%v51(vdv9X z4r_7Xnh0x?BGO9(;jz@1xotf`B^E^u61%V-?1nS1SN2t=2<`N!CX_y&oI2GdsnVgE zmGc<$p&oy4TsJKRJwAS>Oob}q>uEO*Jt}Fi^H+H>G&0o6pJTVEGLfY9%v7yZGEC^o zk|^y5(9x7YINeT-Tf%nt0>dCB)S&BARh#f;A8 zc74S1)cV0n^4MmQD$|5r8JAMOatPwFD?WN369pknTO9OP7~DUz8XP;?wo6A2E}IKfU*? zIJsk7-7ZILM)|y?b@1b0M8s){anX?F%OLk#Xzdiw1PYOtI6+X#-bJ*i1sj1nfm51w zcNZ~;rIB?*UgpIq-pBbH{rjny?V6oJ*Z=9a$pv;EP zWTxKv{iRa)d^Tel2l+Ec9Xt`zFR9TApKe?DHv~rNtVMK~v^b513crh@R-qLHhGFVQ zO}Kk-U8U0&F#3|K#1y8bq5FP)BX;z3xZ0h!zG&plZM<|FgDqc~!tA}rf~(JB@mQD= zc=8)}8<~0K@#E?w1*fm_#P9xXOAGr?DDfDpq)j5z1)4J6rvi$73X*H()0(6}8Y12Y zlQMe>>FMLpKK5ow zMvD(>t?lHUo5Qweg_N48CqsWofCt)5F_F_!%NzlGT42!DidYXd40wLg<=0*v<=FoK z-o3!vlWos5v{e;3-LJZ{bPJoq;5MYevBI&k(8EtHOjA@z20Iy#Z@PJ7yF{sPY(~(- zKZiBYf^4V^Tq&r^1{#5>92*{or`cWO6D$Sd0<}e5L*`Ucf}Vfj>AJ5yM}x>VHwhMZ z4YhMrn^O_HHjZOIQ(2kcI60?Wq>|<8v5>N0@leI2OG!)wwB+4Xxc1Dkx9HBc;yaZG zNl^4-z}C8T{M6!~x33{aS50N$V}NvmzhR?O*HAxgdXHU{p~UYU&AN6bF>qBhH5GN+ zL2%VF=eGV6ZN#fZkd~68cC6W&$(iH=8i|3ag~>X2xPC&fNAS@b6fuT~Y6B!7VnukB z)yIckjwg+OQQ3$*9*k&xNT5HEq4Vj=j|Ta={Dj?CLA&x(Qeq>-96WVZlJ0?!%hmnm zMs^y_l}id`u(TB{?$2CNb;uEQ730YP+zQ1tylp7%(#@?%^I&AsRQZr=*Nc59ZBwvP za8PI?SF|L zQY3fRr}bOjo|A%}p2pe5srdBDDZ~x~j?;nPEy6;?*ku04$SFw!J9nGMjo@ zEZz%wZ9JA+chu|3VE4CXZ$0BSH)+Tzk?3&J;VGh?Otx~Q{{Wj>i3B>FYmbZj)ua+w zJ1SV)rL2GkCN^TH$$$(6Jn{+j$5xV;5s3}drey|$Qi_jCkWb}M4@n6ra+FwV{FY-Y zirYCfSuo3k%hC9ERdeO45ajX|*cPBN(cx(+r1HfzM~+!kj}`6jZj!|96s6WcDlkAb z;X~#K{Jf7|LJElzD#T4YSP&`lt$6Y2Z$rLwTV5JWeNGPtnW2i7EUi8_dEha7i!GI- z&%oG~&D7WHT9&S)qrdRCsbG|Zp)lP+EynV~qFZ~t0B5u-COCqurw7b&^rux%2$>b* z*Iv^?$VGg`2+yTzwd2yy6+UBc?q1Y}qxkmO+YgJPmpQa)a{D8DZiv9Aq^H4Sb9;F z8fQ%c)A)uPk3p6`n=wT$S|rS7c8=(tik_Cg17Am8o2N5{s0osubZFy%U??!y+DO@? zZxr>Qe?#p#N@NmvDK#8NpYrL|b`b}S)zqBR`LMyI4k=O4iM40VVK#0X zBZ|mvOl&#a)qMpWW*u?WJ(asMRkM_AChw}OkutkuWz^GCsfE^BdWe~w^%eDdPFN_p zSGyq*!6-piM&Kk2QjETRcEcRCQQb=&Lg{n`>~_)b0A7#h*DxkHD@u zG*oUH%1ANPlVm@;HKBsM^_1Q%L?VWBZ+7vZ5SgNdCt*SYYc3DT4IfYy2Axt3ddymY zEDbdUQH}tyI(Yf@Jk-!^J<&~7jj!9Ci9xcePU4???I>$ni!|mmpvG;=tak07q{h7t z705|tiiStk>(YJhSmI<~qnXCK8Z>Pbv5}IYi7lQ!N79{XT0`4&8l=ax(Zq<=^BQ|` z{=w@$7a6uUR&JKMt4(B?$EnWZA<9ibu+DQOTGLc+ER6e)V?vToEVT4>m z=T^CmO6X)G{VAwWjp|C8)7Pg$%G2v;8Dev&FknFkKg3uQm!>!4u4mkuWsTrQ;z@B4 zI(S9~y)NKB0@Ym@SNlZ-00H1f5$RFVj~}@%71Rz&$jm7l^C4( zsfDTPDyVw!wl#ND*xO3AQ!|QvXZC?ne`%q4+gXlyB$4AZCIjN?2D$@kXv+hUsVGO! zrz8QAIGQ;^D-nqS6k)^~2@o7`JV#&u)7Hi+oQ6j$QAl>4(96=&iMH(qCpjE6JF9KQ zN#KS`s@i!54x=GepOutSJz;r@mO>QrYQIp=E49j`kHjzsNCtrvH9#Zr0iRMjbs~h6 z_}V&DGVo$WOH>kQ2iUnBdV`3IapLFQ7-L(L+}PX%HFUY0PA0c6S5t}FGf^i6?xu0NHEMm70x^IC{L2q_30R^+lDlE6;!Qr_5)JE zbL2g9j-b%waCnTA(d~KinT!VBmOQ;ZT(xo3(^9Q{JQR`StMT(vNw((4(_|m+CLRGI zDK=wa?_q&yE+T@Ys0N!V@MUr)x-}!J^=n)O*)yj(w`xmr>IJ1 zr;{lOk9y@X_&B#))l^hvq@JH8v^L(HT-fHH?DQ6*e;9`3vIZmD(Zxv-B#uEB8UQu9 zQL8>R7fIs4<4>;+nqq{R5F^N^6(>RpQ#vbBD~(mp0q4|-Q*77Ay6YaMmV+mU%$&B& zmZplHi)iI3nW_Z4eQD%1pKi|?@+}l{{@qJinEidUvNFV`KuqP0Ny#egHMi`O6NR0{g_UkWzy7H2Hls-S_SQ_7rM)~``t zE|qofQ@U~Zd|gc~9bVcZA5GdQ4CPz$`Tt(Yo`02CGq8|Jkq9eYx&ZVJ$fX+;V(Gadw*RQYzAdGw8{n;Tn_ zrNq-UeI{PMzG|$sUf-S^wj!hWTvEKvg}~#yb$GgCEJ9=m?24*fas``>qL;lQs)eXE z?y2?FKtIFf(~Yj&Gsz%RfuxKI`BW2A<hXX)CD2*s#!nGAN{kt2L4 zz=^!tYMoM=OAw7??Wp8-M(|-kgweGiX9Lt4lvBV|1|qoYT3R^=iz5}Npi@O-_K~QM zGB6D@*SAe=Ek!<4YHgV+^IK|$Pr0gxa#!M;cTr~W?;R`>QBO*#jeI?IeL~Mq6*9*? zR9eip1KV{hOL%Du*9r;w0jRR6EyRIJFCLU>q#=AwbDk!Z3OJAjNUxD`^l5}%cCUYe0x$x&0dVx`7NV~(6lBE2h?EF1;*Wx#dTDsWsMA;cgAElgQg`5sxZ|G zN5a|ENbRX0kOvylwdOB=cMwXt2hLa4N-xC!UdZIc-%e@ZVtj$wtl6}KNSx9KB@^t%FnspU0*7$^S zzJT*>saZRG=Y`^mzGJol!L_XpTk<*dbIgKb>$rO)2Nnk7{B%{{U+_soy)RYh-CF zF*P!#(AhYO?c-Zh23DG)qL!Ft-lq?S$IZ9uXGtc8qGx((V~nVBys9!ny2ZN9Jj?tM zg+OVN%^;`)g;g?m9;}f_$i60+fj^0fVk_i`Nj3SE`Sg^+(baz$$5l{aYByh=ohkQv zZj3cFLWdz!MNtK8SqeyNXwpn{8265|807jMV6GxXcH%d%?rsWdVi#%BjpmFwNXS2{|QWAbT_N?*OsVB)B0a&g9~ zM^Rc7Q@ef?uj#8z9Qoi0Rn_UJB!Z-3fy&X2dQ4E2WMl!`Bx)-_Pw_4n{U|j96zNIV zn0~3r)j} zcJ6y|;UvQzmZ#nRFwdZG_6pp`a}rGvwU<8Y2CtJxcPI(=}U z8Cm{rLa6!mNMniJ^jpZ(UgrhKrGMuTT6wKl^v}6*m6!@_RbKDiTU&8Ok%pF+H73yT z=i%5DvBfoPTVrzJ@X3tZYIn4-psR5-wR$0NTIw%WmJ(|P>7GGKkPa9Rg<4Pp0mSK2 zwDUb(>Rc0P;6_JnY1}+PN0U zXR6w+Iivm&tZ(8_cIhg>6Xm7!4OIR!LFjtZDpR?D`%4O+Dv%8q z=AfTWnX*;*D$LH|mt^4Rs`hT--7-<_oMkL{owZjEOCLty3aa2`h_LeRftXZb)b#@Mp8r&9KuqUrc&et0@d0P%H-)Q$j!E-?#G}2s;;a;_)>z?F_c?j-O-h1>9A+ zJ)Ml%RXO~^SC^Wb6}C4uO4Jfmy&L1_i&{4C$|-Y>$^pEHv1?)3_)$-ZveDsod2EF^r(X#YI;J z#=$-gDs_V+wXyhT%+_Xe8MN|`1dv5QYII8=B(WMtGRo2-{-Xd3gi>43Py{MRt8g3# zO+3vUU^s6DPryw$;N+4I*fMEK^!Hbi!sM|XX}30R*2!*IM()m0WVX)f$L*;1ep_&} zRW4GBpEbAKWpOx1mU7U+Br6)v7neoX-AwN7D$pw_u9D%SZ<(qo)&BrD4my5_fJj&p zMFZ(7N6A-H0zPGbZ$Z2Lt}}g5Wp^y}`NYC!Bf|dx1jo{(HQ9nIW1cFk%}#cnJYM6+ zW2Kku>WyTcNo5J;(-z#^6TQ{~kC z`ujGIu{Tvs4INDm$jZ>vnoLa7V;ZViB}b-wT|HjZiX2ToI)^aI;z$)CbVC>}rsrNa zjiOeF50G;p`*kovYvolG^y#k%#iBTwf&ogALIZ#&NIYm@+Q%MT3jK<#RWQR}@OhmxsQNRPp z6NGC2014IVI=e+FXx;74f-((P0qRHubP=s1WVaFzy2w`GA*HR%;Bqn0#ftl!7CsrWl$A|~si}lVx2dXH zrU-;`nfyv)itl0Vxdy7U)OqEAIrODhkC34II?zbffWoNssj2e$=Yc<&>1&YOIGlwp zJ0(L$jo90Uj-InCHqpXk88$vwXVl{5N-fVNO?FDUw=2B21k(z5>78PT(*T6)0e$VK zc@ss=3kqpbl|`+8q)*D7ZKBZHQlV*;EbQNIrl1S*8T9F{41V0z*4u(w%qvS& z%DH`$w4<9nyLQb^*@mL7r$4)}xtdxm4AonQLa*DIW)@ z1M<~cuh>6tOHJFH#cy0D-q^cW4M!&2+Z7GEHw(+OcFxP8#?Zz-*B_V7?u>HP=jo~{ zY7$T&%T##HWRR+<)$h-9bm(HZmO&rzvjU$Y5m9J;NYrR+)z60#tBC6(5Gty5ACO|i z9C=U-bjOXW+Wm!*mZNHJEzWxTK)T#pYHQ}gitGa zsj4A_w9W)Ngk#%jJTdmm5QP^WA(5Ioe9={$A48Gy9VqZiF=UaZH24t!l%KY$l=ad< z`+A)DZN=6G9l2FJ&HR32y7uJp=C+pct;E;ov46pra_91sQe`N7azRfzKpI$QqDB%j zp|L(m{66a)#ai94-VBli8ct0py~EC{P&gi%lA4c;8y6fk#wu$}9Mq3WH7n)QHC}SJ zuBFfIIWdtQz|P@t80tOG)mwuLnhzt)`Jp7adKjjvUBzB%{8fh+JPfg_)4s8&d)$ku z);Q&k<_A(L42ki15XzzH{V{`(deTBsyh#z@n0YV<%ZkyCflnb&e84?3H5T*xU9W`O zb7J7d~z{-mZL(a$zIQ0)5p(M5D}90;0(b*C->b zjG?lIJz7XK20GBaJrIyQ`mfbRY-VAiH_(3&&+TFqk?Txw>I8V&&C5kw1_uvCk;To2 z)0<7tRf)&uvAG?ik9glH9bGzO=cU`Y@lbxskV*Gh2U|-Vj=Wqf+76;4(%MLUWm}G% zve8)o00}i#z%)HoB~41;R;y4z95@^TYCT94BQ@!Nxw15qU^XP%aviI=FmU2OyH)#R zBeM3M6EZQB4;^ktDM^dLNOI8PD^e#CSLCM|ISsGh#5??{n>}R&Oyi679{WOC}OM z(UCPUNr%QU!c9$CoynYiO0-Q>2#N$$Mq+)nGQ)Dq^$k@Av=iDs#jODQYCSsN)J+?d z1yoaj8K!bcAK)PRj+}P>-o|gu^^Dukg`~{YQtj!pAHnfkk{-0j>>P$3Y39yTZr#VZ zSH)A3YU*_IOwTKMrqKx``gYDE@RnwYU=5|bQp%J(4yfvBOw>+PrniyF0;}Qa za&cUSpcKwHmGwxpG!V;wZH@YPp2@4#Sv zC>Umy=>)W!HnRtms*p7Q0KyYHHWOpxYAeQX3k0u9-`*USd-!~dxNy|RIFPwMbU9I<%Z|QVmsy8WBV0dZ1p^c9hWIH)%Dl0|QJEij4fam5a$w*BI<( z~~N4vkb31G=9!y6?jrh!s`QvpcQ z2=WIVF{Y~3nn1wuBrzmrrlUTD)2HybOwP=u+zHsyVDq^8ir32QD(LqP>)gAOds)_# zKNWY_e*nc#kdI7M^sO|NBf`#D8xM6^?HwKlvy~?V1t<$d%6Mue`*fUPO?pt_h-tiN z-3bI$g1Y+l)4S9X!|dt~O}8$0BZ|paQe?7QvRYb7jk}nx$9?W&b3;u8qapq9%j9Gb zMickPSUNsl%q;Sl&qvpwbcDr-`VgXbH*x z01r>mZCp)TK|!{uDzj;m!&BwH&Wjs1Ub}4J@)VH4xVHvsw>wXQHSkbZMjDQ`IV8tZ zU87fGxAyvLq$RECI|GB*ucVM!3)DV1(1H&E)~d8BWQ~wwqNRm?6=0tW1LQ_WNs)r1 zr>)24=;%^tV~;COfZJ4<-Qe|8$B3tr6WH~+ItogsG&wA~S|J3lPSaacEI{6h48>A7 znbN-qK-$Np6}yW0)5uq*+H(~^lqtvJ6+`Gl3|Gp&U1q1C$L6znEY9@aIVkb1xNtOe z+1zW#0I(hB|#^rZS6dNv|2aVgEg;>-rkbp)nQqXFX=9Zky1gaFjSN+ zBhgKMVAmAsG;qI(Bw6&SAD&Ja6%o?!9407Myz89FQNq=gHUL86G>t9Ky$Pqc zk)^h|E25&3MG+1d&?}M(h85Bdp;3@eO*)B#2_n-KH5U>+BcRC?q0{G0C#aLq3XFYz zR~wqd<*4@kN^JM0eYcXvWGnEs>h(Dd&okBv%6RvdZ$yx(^;YSOx1~V$akRNV6YaX%hn8*4Q%ze`YFj%9y3(4Oc*LUmRY(N18D&OsJqmvT0Eq?) z(W*eMYg(zt4!ozrER#o8H3YCAkbXc@ho_cDN}ui~D!wB7UJN$(*wN+W$x!FAbv3&m z6Ir|_r;YQQBPUt8sv^kL;wfpOlB%!l2DWkOJOwvfh^2~2R#!sBM7}bnpx=P6hFl$I z2A~66fyb>N@MSTJc9f_(d@^WLi6osRbbRW3=z77oww*ty zaMa+o+hQtcRMBE~xvG3dBC_5)BP}hfZp_@JU#k!7W2Vtib*kBpieIh!r1iO;nqAY}ezYqZxda6-M7di_BoZ zxzS-_$l>vM2&(XuRMpZYbQS%lz7d(_hNtammNEaunu;3P3)DkXxpO(GtK^G6p24daC!(RGgAmJb&82Q>1kpwz>;Kf&f}%Pd;hWr* zQEqLakEGml*HB5gw~k(F%7{~LNgZV#dva&0v2Bp3t<4Lf%S@?NR1_?cs;|04Ry%ZQ z5JwuFVFEEy)u2GV+KH`L6HhihDPto`7)r|KiU}&TuM@>pRefoJz#f#_wKwEg{{Xki zQf>XYjHa6zxM{IiUB!pT)xn5(g);vD2gAcO(N|Jt+zPn^Jj~HG{cI4q1shi99Mu1aKWC_B|#_4a-ecw`eEa z7`Dn&(^TWK*jh*08BDcYZyrJnh^v+?Rv=?2stmB2wlH}BbLg=4rrj7;RUs22#AZ>W zwAF!NXx@Y=Bg;KCC`L^>&x`1xwH)CfJO0E+Y@W4EmaS1W<4sNES1KKjOg6va?> zUjG27!`1Ap7AAuvDeLyu-rCr_bl=3KhUl@#C5_q1&^$~}wqkhMfQ8*6WF91iq?&1c z0;6^)u15n(l6<;$NX%u^1nQ@P6=Fp{#Ut?~d5qJ_r=(4N9zuC4w$|XF!ec4%yR$2k ztIyWf)nV{Em^DO`)n_s|;UmPj8CF$VNpXnJ1g)X90M_zqNa1H86d|BFZYLy)>vr-a z(2ujL7IWeSi&TVwLVO~gmH1R~BQIlk8GuM??JX{k|Cl9sbg5`qEgcHYfwa9RF){AN&%>>U`XbiWtS|&`ZWrpfa}At zWL->S^ws)no+^TZr_GH?`E?r|J|8c)w`Ddj?r}NDGg$4_f!mWddpVM%8-AWRbCvZ_ zYF?T}|6z*UN zYSan^B>aUy_2@{Z-W$TB9l1LD6TI>HgOu3QNtLA98&;xRenoN;!2-NhIIK=5D}{Up zH3-VdP$r{ua-oYKerV*lGol&gg-ViGvMB)6xmRVP3{wQPFgo(IG5B{Zk!$kcSwEv* z{^D~$7J`*MAoI~Ib$DtxvfXn>kDi`9#y+By(o#}Y)nPGmVk$8khj3tM=(0H4{J5qD zj*up)(qQtiW@h*46SY1TgwVpMAP zrEpqTkpe^o08^;Y;{=0O^Wj1Hb$uLAHXDr*-dUIQz_2?Dg(1t;5j8d7DJPysc<&=Kf>aUO(LyAmFh1UrTUgpg`eX%05j;s*iTHd+Wk`^EfvEXstp&O4(IaSMO;kjU zX~eBrq;EmmGoF*u)gHv$G*onuW9sR1_;_hH_A6*&W7@Q|HCWtS?MtxagEA;_G<9*p zqI!zsGqpnVcVa!T>p6K|<=nAdOlG7&8VXYwjRq7djb2=9)q+P5O&S2<+gD?rCnT3X zb-?qbI&#E?AKc88`5d<7+Pimj!?t9s%uf$o=dqi@yA=o6oyoltY}VkY+xRIKNFy-9 z&_hX1jUJtPecC+@Br(KER#wuCODO&+1aQ&Vo+R<$3F@RV4?=Y)1+%7*xbvr5XzN8XuZdpR)Jd%R>R>djJh=U}=_O5+!))j(F*wcZ zRg%K)>^@O5)Yv&1h9$-M+NNEnm8r<%>mT_2TBS9`FYMD#8Hz`7>i1T4ld)D(f`s=p zV3EOSqidUqDEUH1D^S18FVRIES ze;M02>|BxGU` zmU1XCNTKq;CWnb5fa%^^nm8~J;smy>Ubr~YAat& zK_%g;h2f@Znu`$Zpp^{zm3$Loovd zjTCSd>lF$`xOR((=EPBBHkK{-w79{MY$(j3nN$xfuod+n6VfJ3 zFc^H!YNASP#M`c>vMsM&h0jn^)>A$%o;>E^YW<$jMNn~1QbcP}{!S7|nPS$b+h$lQ z7Aa7-7GCXOc@_t>2I4A7K7*?1D$2kzMg<2AB>HOjsy<(t>0w8dqcnM(q&q(ayl}ZZ z%@q#J&Sfyo<;7%cXrQdmQepAf3F4u~Zt5C3agg#Vz&wTbwuRww8H_- zSH$T>kDiml^(D`ck{8{9qaV;>Mru?V4@wT@uaT$&(!EuP0ZmGio;m!gbdlzK{{SwR z*i5|3Sy#F?y+`+BWaDbL7@uZV?uy*0ZMl)Gp@%VxY;t5V`Hk_n^4PM|By_0+^|cT* zEDAQ!q>Q#~i^ zF!(LOU6QWbyOh&yP0^Ui)5P0Xtn$?KRF%|mMsYZLO^qE@O;i;*jAbiUea$4&{j$Vk zl$LAzedUC(sG3O_nuFmZ{y;EV0q6i8RqBLzK#O)*NIBgk~a zcv+5AQkC+kZ?%H_{&e-~JuXiycEvV6mjQ{(#QR@4Q@69*{wfxz#O+#qrDRzxuh%rP zG*oj}Xq(GfQ#@v`?qVhu3IO-wCqU6gL~LkSQ(TA80>GHooK-;8#GaoTYGVnlJp7aj zabb-_c^aB}bvCxE9hP3V+6?pm>h)$nMD{G(X3std1p~o#~!Q zBPEoFVg(O`N|^xhKZ(H5qtF$rf_*@zm3p``=_;gv*Z>VpU(Xc#NcHLBzj0;LYwd{Q zsmtxEO|=z0enPtygT-x3)m)jHr=hCcyIU=ec=OxhZ0yj=lT}LXPO22R0Fo~v89-Te zJY_%#&8b*_LOnG3l4^ZVR*0+tj07y)8P=eK{U#)UK1u-T!W^a^Tt#ekxa=+qc~oUG zn~t}5?j6fjNw(|u{eCiEE_Z5dT6}DDhc`V6h$!o6>fFnbLKpJGMEDho<}~o>$3ysp z9s-B-!ufmy?dqNzGl_fJP-{R`DfI8Iym6&ycvGy~n{Vv=dr@F3v)zlHz|d`W%vNP` z`yQ4$?X{82%}`Dw>Vx^1bK$7DA&HTeFyq)KF{##Cna6-_d1ylz)D zhW;Z>grls-%~g(*aK*R4nv#u}{hebU_iEU0QWjT^?Nuwrnu+xkrG7+(rF{JQZlJD% z3$e`s?IaH~Q<3Hce{WBC9qmt1Hd?Z5FJD&D_GU8)vcHM;4&0Y`Hr1wvfnyo$W=9^h zwRkSTfKf+4V2+k&l_pjMx2xSFnrPW%7fzy-YAVT9{sOX9zQ$4r9(`S74yHDQFe0Gp zG3jq6?d>?IA*u=T>5``jkQ<&|g_3&xuU!u0r_APL>;%DJA%$^RNRtA&O6tg38eG)z zNOe+5{u-)w2Trwbb&w=<5=bM5hFr3bw@7UK@<#*JNPLJ9ovGv~)I4~V!Su(d_{>gTHGc>1GqDInx7R`BQHxyn*Ir0vjtqG=@Fs+AW8HfTaS8X zft^Hh#VT;BurxkI6Br<$;WYbtx=B1PQ5EBq4C)LuEiy23PvWWcJv8n3@YNVC@k?Jv zxbnh-6Gv5w%2H)$w$3LRPmrlt#^ey?>7~nOHslqx3{w+Epv4+VHnJ`4!6Av57-MkD zg6_&e{(xVJzD-3vX;3&#Q#OETXaPSUPvHaCC#N0VD%4g{sL1SjDc=D!P)XHvwD`o# z;_#+g`h3o0R!2hxMPSP!9WzF+B_Pz7WghIz$_mKt=751B_-8&@P=3RjpFX{yfg-5W zoKd__=TbkI`#NEvrOU}#worKZP4{Cjc18(oc5 z2`G3+jDnzhv&A^@RO%Y?1p`!nL}I^XMtaaOHmwqcp`#FViuy6lKW9$cZ!v(To~ny- zQSI%+Pg9Jm+Vq=?A%)A;N}u5lX&VkYfvD=`Vi9U(tlnB&s0Y;09Yf{7^^+-&-LkxR>9UgLq}_G+yw}_c z)O>d1$kkFo4MiSfa8LHs`6b4nMoRqEhm)(iihM?!nTk{;VWA7s747<6oEh579N=$ ztzVsJ2T%L!ZT1yrDn0GF_XgRn*!8swJy&XDsTQ9UHy+%jsixce7MmlAqN1NGnudax z?NPB5{{X|GsFe97B{h3>*(62(03COa;iLDs6~z^sTcGna0C{y!0LJB3*#q$fO&2_B zK+>#u=_Hek*Qaf*lScJ>!;ZY|r_a_uZOU;Msrl;)NrM4W?7w-vLPT*;IegqUsyumoH6l0e^D5rDlW=)@4nt5qtl=*4M`ORI{C5OmazJv7pypm)-o0Mx2N`lujK z0(jf6n_G3>^8R+)r=cJ{k+Z#8pddqHZ z>OH}b+Bxmnn$7MV)s4gLiNk}G-ICH&&yfBtT%Ti1BBenykr4_O=E(Ap!D0&&wF<=% zeI(MS1j#|fl4?A$)t^mE8Dx1vf(yE+r;wrTAC?cu^uEl=j!wMWd7Ld;WAQb)OhrUg zWBa$YvbmhA;v}Nohk4|wvRNL%hK>xy8jN&uz_c^RcQM3t`%a}=Ij!00a-?cP)ghIr zA4Y&^%6N%2DZvM)omw_S6}V`a8aIY$K^6Ge=p-M)S3XCi#@O6>-LHYJ>`lA1PJWWB zDMdlQvU{^>?VO(1uC002T6_-J74-EL7@D~0wKLSi8_6S(_Ek$2L2u>M*7s7wa~juD zy$dgpC`Wn^m+k7Oz$}S6BZlEsAS(*jO9BA@07`$KNGjTS=Bj$Bs41v1^?CZa@q2Pf z=btf6Q}?vf!AFtE$qgKpdu~}|@x0;L;)x5Dj{e$Yx|LpY8Og~A`VKNw(2ulq(ywp= zRnixZp;PD?c!Ea*N*n26TymtZ8a5aT1EQb-8DyXNj|O@R;n{88g(eG2mlph{*-60N7*3jk7kM_@v*n($Qe%hNpK^)#M}JHTZg3S!-dY+naNI%Z}SyS8nKH zv%?vbR!0bzQFaUN=^f3TnljnOV3CCbgB?LRq}6fuFan^^j-IS+?#pn<>JG0AD~gXY ziWSH_NG79*J!9Ybx(>q3>?&@kq|WY#gKE_Z-J_j@7lW>wXzfT$uv2b)fZP(As3uBz zCz_4qr>79GSfabz-D6dIXlr;aP)+P{K8IZd*I1_&VhWlc z_N0yk^c~}3q^;Y(Yl^0!+Vy)w7naEGT;Af|4^-RhE4k--8W^_T&CEwWFy!i>XV5X} z=hJ6rQ)BJM3F6ALv?%4vETA&BIH7P^SXPt_1xFHkZ$`M+!!k5LC@YTAe;o}79<;4J zIuLQ0{nfGZ_?)iE*@tX(_EN4&JXRli(8ZN}u2UP06!lr<-8;h(TOK}+wxS;laYZ|Y zmNOJU0>|AHUPW%VkzBk5N{4tEl^v`2f-$2G1dTjv)fu5LEDn)R+DHrovX4M}O9RJ& z=r^ULhxkq_b?!|5CvZ?@cQ$rv?z!5TT8a(rRgtfe=_Q*ZLx{#k)EHUJdS;fESyxJk z^r$AzOC#OA%ZXX9H7P2}=cI^pn<6ZR(6#R6&u$vr7d%4LlVR*6IwT zfF9dA9W53_7P30A4X#FpN`C_t0T>JwKa0#Bs7#c0j!zaXKpiRpT5$}TiR1Wy6&_US zdkt>S%VRNZj;4cc_N5Lw90f%Rb=3|dsxVaVk&>G!lHWVGBb3Nxp*V<;$0ckrK};nA z5QJ*IQfAQb+*``ZfRuR5dVw^jh>C>Bl*!0(#1qvFa7X&F%!EBEj9iw%_#BWGkCM=- zH0v&NH;G&gM_y9zz0rZ#JBq6ZnU`)&hNIs#8;3TM%SR@DqjE)u!qm|wdRk>n1w3*+ zDn}@37)GZ4NdyS;E6l3#l#!y6PXb*hwc0nJC^8y?pp0jyQADna(ZcSm3TstakP%%0 zg-)SbP?{f~N=?C&80?-uuJU*t!Pi@BuQsmZqs~xgYc@XC+{ZDOicFR#C!OE8ifpAO zLw01CtvnONzI25?)&hf37lv205F+W4-c}MaiP~sPZYXF~HL4CYWo-wII`Ifr>F70u z(@_x;Yfe3m;1>QZEHwdI8gvcq?bVyw^)xVTOuaom<~u&G3pU_PeRke`qb}r%MyrZ? zv|69zn}aPBf{AOY(NGyeMWt@u)4ohOZ3`)24Ni|o4um*W<59zj9$h@A^yQ1Tt^mV) zc*=x++Mi4xL(;-3?Ykbx!eRD)$JqJK!K2GlS8olYgWCB`&7^V>c1L36?X$BNfO%Z0KvL z*f1nfN}BelIMRPCb&YrSMxPZ+hTgjeuWEu_*w>MEg4vU>%p=B^_B$Vmt*xNm zRg}^dhOSxNin^C9?SF3zjaJgR@MVd{0zAtkY#UH>7#bcNno+8`r72Ff6_P|TmP?V7 zt|SWTMJTRFqvI+DPo-77j>m60S5*fNoVS)chHnC4sY9z(yf=-2 z%^00P9s;TsxF(%{|JBxeAG2ny+H0P~ON&bS9Ig$ae716v6+UAl~JZw-bQLZVcTn)Xr}`h>f%$d3Ow5ku5$yX6($A*^j=KgJ)M_TDfz0oP^9;U$ar@ zc2!mS`>a!1M*ct65o(%FqKz?-iqs@(H8OmTjb6PyB3v>@0^3$Y!52yu1OOS`h)`+j zSdO9Zy^$u~+|>D8+}VgayKz>vG%>Z9F~cNa#z1nc(?*80p_M|1 zay*panjRf-+O*q7kZoGcwOyaU=V`Y#XAMP^n_^LBu1f`2C!2Cq zNDVwfg;oi801J@BZ5UU5Dk?ZevKDV3fC9`<^os#Zk~-MbRwxKHBpT5bYE5-8G*F|` zr}OEmw;x5a_e?eO*R(iI(M0sSvtU}YZDw#Z6@D41dj7L?RpRExQs#3so+_v^bZW79 zgC9sI+uD3T7ADmqu>p$)jvo@W&{!0UFO=6(&b~Fg&Hdg7#wKRC0yN7y&6J#hVmPsb2c`XXb zu5V4f)y1<*`pKyah0-!f;trw;s2*%^zCfO|T1f~N=Scy(jY5Dp*G&np;qz`CI^*&F z9oE|lIjX6!*?qxRkH%9&Q?xe~HF{$4s_O<8k1bamkjqn6wQ$qMs^UA5#qC^6 zMwp<81}s)uBGR-TBP|FNF|YJcmirVRn;x^(ecs;7)?<3^ zt07lIvual;G8M4xIcwHx=uS5?SxYrP-bJ|SD!$;;P%IMEyfLU{7XXc<-Y8iTLW%IA zmpX`SQ9uewYE<@&d4bmCh$FX)61=nps)w|wz#x-AzcWI3j-$zu+cS*RQ|;QU79djQ zvemnJD=BK=rLKyWmWrD(kF3r?CTS{W)bCeJ(+3iB5~vpUu=2ztLmCzpzy%ak`VCnF z)}@aUI@iag+>!_!bHEy$Pzw1900uMAhnBD2Re4+#dAT=CbLVIv!}X5g-8-(MZZ$s8 zprC-yPlU;1lw+yHP{z=sHklqrT|nOc^(=9goXHesR|TI@@d*RTs92AZk?Vogl=yb> z_z)8s9tet{G4#OIoR+OeuSu=vxi=nb2+;0|T$Vn!5l>B1u=e$K7J{BCKDx!%NcFjl zW>qM$&~Ca)=_QhQ=ZLhEOqXK9$KK?P{8(k5#Az4;YX1NVQ?XS~3~&?_^IodNyUHL$ z5dv#LmVd-tk54j5{JKnqrm34Zk;mrd%x%neHyUZ8+~$*K?#<(Y%1pvad@%n2E2Xc_ z;_JV0WW360)RV&7-DPDUNEoMe0<&sr`4UlR06AliPPQIKI#5)Fs}b;zmPo1e9(_&S z`@?kZ*{d-dmvvI^*fNxu+BV%e4XsZ3`fR>C7>Px-w%qu(2|W%u=;Ng`QIyn7m)*f1L-xy zaWY3Ffmo8-WRfjd?OMV$(!NWQ1w6^=uL>ij8YF2)!>L4+^=&LdwFjx=^63M+G7DXq zZQV_f$!;b7D_>t8L;ZEq*xSqpX4|N`_^jmRRef&CITX zuF0mZpb&}(x4kH;c&#!34-G?CA0@93OlPZ|Gak)n9)#!S+&?cN)_kQ-QnM*dmzE03 zdRX@b7EXgLzBbi1HxBvw%4ng<&yz}ONYgJz{7W8b(wIXkq7^c#mN&GEaS@JLM2S<{ z%u63ytwv9$r%j-M7l7$6K~SfF@~H;`pJjSmR_+XL6K&(S7U9~xJos#$HkV{(=r9@D z+Kua%wpLoo&F5Ewrpif2LAbHT^wd(-cxj@H#!{4pBwNSS@u|6rR>xq7YETE9g=ig* z7w&&b4wOX`XplyetSU*Vd^a2_@z6Zf4L+ok)15xs#mBkD2Jp*Z@w3siRG7S0^V}Jo zua&@4=jB|k-QOGgdF_l|V{Ya0P*C{%=+T6fphiMg!N?gBM;g@10R*g1aHt3Hlwi!m z)`X5Hrb3w-GvOLItwStj{IacuU$B8sx2&;8x+*vQG`OnVFK1`B9&#PCLsPjbaa*Gk zxOZL}ingwwc46_A^q6{j&c3aQT0AXnM~dhbw5_Jw%i={xI^9VdVu^wbnr=+DeDz|CLklS01f`e}D`rO`cExTq)dOVf~ z51ZSSXxKR^ceXA(#z!TDqOX`FPzH*Urg!k`bR@3QVo~%?8r^eLC6LyjFjdo9)3u4G zoiWzjg^`k2P+gJ&>J%ynsTsh>5CI^3`fkbNGB`N0S%@)^Z0a1Q9*TH(Otlq@MPHnm zsxvgdX3@(p_h&!6@UBEukSKt{408C?o7Iw~ykc8Pt(zuoEn9%l@6ftocRhV;(WT)L@*#4#R?uy({VW=6;VYOq&x04P`r~LulZ49VAtYLk(RG6E-@cqPkXU zxm+R?Z+Zx2O>JhcW`i;YBsu#6=~2RzB>DB`WR6t=M_I_IN(zDIX}A~j!bewz(PLqJ6-9826(=T&5K!F=2W74j#h zl2(>gND1+L^}P)^5)P1iypWUfrxKrP{nwSuZT`gB)cLA@!dfY7@{^=eZw=A9_Uw-x z1$SZNDJRCZ)5cI^1Sc5;FvKO9w6mdNSk*+X6;ZVLf{ay&uLhL9s`@T5jvYBRgca~> z5aV2^KO_T(nQV&j>8hW5S77$OZwE&~ji<%bXKFCJvX*_5ja>d)Y38aVnktRkyy)5L zXtVKUp2D zsnVnD8oHY2Y*Fq=HvF0Aq1pM7hQu!M-a9Iv0k^jlyHg`hGBjC#;SZ3jtK0ba;}22% zK54QQ6=hOZ8txk*^qHC|mI~vzNKHSYp+f=Wg#Q4xJ!?Q>=o&dB9$7#u{U)xK{+&2* z9Zb#TD5^8NcE4xk=-(v;WN$&ZcExF{!EB5*U0rN@V`ps*xt3|GHe9YmiBm~iEkOpM zHL?JG>%@yJriY1OJSIQweiWzlN%@|)reQ$KMOC7MM*^HqyqDGLzQ2Lv*^!aSo<(#Z~!M|ZEp zNOr4zy0WzY07R~MY3is^c!P!;*ytWVXAVJ zG3KeWxD1n4;q#lXF}Yrz4XL!YwNg|`B|A+|Q;~LN(>;QZcMjS~bahdH=~}A%$?wks zh$wwJ(<%KyMJZacA2Z}afl80!Em6`xGqnz~F?c7HdrXz~;o&C&N8h%Rtpu$9#{bOJhD95|WhtIE`F92E6F ze>4qHf}UR)I!Qk25mQfu(1#oWpgHmiv=lzL&ra(s<>oHLwZzlhF7 z!zxNeKmdXB09L;|ljeG9OVFx@G1O$xpOGhr?5A0hEvX(JNpkrtQrd31a(HW;#% z*{!{`HqAVF8Y*hMHA*%vovX8-vg_q};DwBWGQN{kDr%k)F5kn(zb3Ep3tvJHRxPAP z{wNXtAV~eE75QZSy*>7xOC`87b%(Jsblblvmc%yascaVI!Di`kc;&_#jkATO-Bg&m zIKKA`lQ-Yv0x4!5BBA;BaP?h2DP*ogG?cFmC&UH82j@@Arx(MBxsERn9|%7yk_ zx3SV>Dz@%lFS<6Y&y&SzT+YfQ(dnXEg&S%cZSu;Oh$fMHbwp>PX%01i0oNN0%CT)c8%$T)m5{f;x&puB`$;AmQhN= zRRB5HDKs1pkbNH|R;QV#S23otrQMo9DMY1P`w?ftP>(aR3urNqZcQ&P&-k0j^IG`(lr8oXgXMKeb)Io_RiIdb8el(RkCwUpKZ&!Dk*yR zD~a7XSWO<~+ZZf$GGu6|qQPZHny)J?&5)X&Bc&74zS@yQf8y^8gy2xQl+=F%A<`9x z0ZRF5>cv%MiItG)U&5gVO>yldv|N848W1O}8-ED!$d*`&TWp z`t~=htt~@e9!^$@vvSnKTM;Q=Q5#Q?m>C3ITsr5@9%`r?TGF)7 zcjeP_OwdeXj4CrypcX1m%+pSIpTbW8(+=-?sd3n5#7(=i8$)>GQY@BdbW(<Om7)?> zP%0=ikx`n^oPNssb?g;RA-84^a_>y05|bUZa)TFHMHE?%x5#8Mc&bNHot9mBo8 zjQy13j-Tpx7CSGwu$Z0Oi^ElQZc>15tWMe5o2PN-_U_Qg=V~OOq}{bx>}<9Bo~L-! znt0@@!8JqF%PfP)EJziR{54CPPYH`K4iY8+fN7-0&Z-<_hSibh(>@BlfxmK1OZ(ddHRonUet`fGTcAn(lQq;RqQ)a2@Gt`wE zjO6m9C13DLIAErtRB1{EOP3_^BA3CQZ5ou78BKJ^*Ws3|l{?3Z3UoRgcM2PrGrMj0adgakrjU31q6uwogA-_WO#5 z3xmk(iRxt{nWhfrJqO;E#aL&Nn8Yd63mKsLxC}3IK{YHR|F)3`g`? zaZ}_71Iwqldme)?xc>mW+k$-VItopJL$>AF+1<}IDBoCtO${Yx6BC@pVQJ#QVe7m` zp!nidju^a2I~KpX5cIS%5|+FXUX-`$EY|4gAtxY(1XG4G3n|TT z)br|A-t0Z+Q`gV4@YD9?RQrZZm+-89*Qmp88Vqk-CPU4;F%WIxi>}U8^Li zf;nSVE*UOEs<#o`OxEC!5aCjJV=C0h@T;Mblw!HY3F)i0iIq*kjY5D67*o2u3dzQx z@$&M=Q1&hZZQyIFHzsI%_(W5Vn7w1iqkA|h;C6yfRhv8%KF$ zXg|u$Wm47664&M%HTIAYt(1M+peQH?1#v^w9yW!1 zNP|unI+i*}gNp)@f^^q4KVj(?MTXAPVzOKJC)agVTSIKu?dl4e)W_s&`uA;T>FWOg zgJd?A`^i;Q(^u!9bOx#%UOu40^-XqgI23z(hVe9**`q_Mg%qxnhfqlp1{DnIICZCJ z+d~OYhbDNl60A5@fT;(7VNui;uBN4n7g<4##qG_JS-EQV?JT>ZlPi?NWir(u({E0~ z!%Xz^KHu#8LBbr%CHjSSG_cnAd>DC0#&E>Y5;FFR*bn&KqiEWFzWH7PUy0z zWu`T;1xLw%1gT+NM=E%O(xZ57Ox0xBEN%{ya&L`}xXdQy#$_>(?kYZ_+Ss!s)bdo; z<1!fxgjAH!#-e*w&jvy{+VVuK;1>m|vPFMoXq1r{I|T^Zl;jW%H39J{)m|g78<*GM zT}a*_e$^*c0pKe^k2Ph%81m{0$(F%Sg6&=5xwiPsB?3_3I`*0J`x|iOHr($f4;7h` zOeQ*>4Xd~6sod7Ivbsr;gq;Ph&FzOrFo@bmS3{``k(m|3_fSx&AeyLPO$edtpy-f@ zl}CsOIvfoo;Na?|Jk){4w5Lx!oq?%~CARU~V<~~&_zk_YvG`c=yJL3d`!{v}P6mE&irM=lkoP}*)A@TzdiCJa|WJOXXLx7kosu2*$#DRI!$WGJ?D0tcC8WJSir z6;?7^U$>!28pK<{IxWV!CZswU^;U_gRBF@lN8P>yk@|Brp`A(91=ynH6m( z(TWe4={1ts5^gMJ-pSx=`tNS--PbNpD;Hj1dt(DpQ?|BVE(4au(sp)xEeOa-nrywr zILN${P8dTP2Ks2-+ueroZXku$K$ddoRb{u%Si{;?87Q{a4m?FR(AgWCXyYHI@b%eoB{0kVwLSu!r^-dO z3i+$eMxVO@WKwJw+ipIlFQUA-H&I%Hsb$k6AvL0gQm>Ii8(L1+ z>|t3KOS1(!SkpO0q0b#^PwmG@#K<)qnOfsbwYHrm=4i7Nc&)zzS;);z5ZRW&6Z;IEHzh&N=kGt%d&Gx*w?<;3H>kX6-WG4M$B zJ5mS8&kE9tlTREpW7DeR+i|2$lS+#ej-i#6Ne-kCOEh{%VOr48g4w9)=ZM83!>&{( zD$Vea`99%jEjouirHjzT;Y ztG;SYDWyTxKr6riM@gCui=6C?hDIHmhul)G+QZ|d$m1&OXr`H|FpV5p7RhHD_>-YDRVf=Q4l1BDAY1)S3gfr-TjRSv+2(m-ToGyzF1 z>7`T?OyrsY=6YS=b0>Jkw{TS%EKHTz{Nz-0*^S3tl&H&O@fZrS;*T}EBZDVZvnz2) z1aVQpho$n)>Wsi@1K**JIbIcmP>xExqBvQ}6f|bgJbBytA(d2dr%l}4OB65S3h3=x zx~M{FT?$BwFlm=?Pa1U3TALSdQ|}0V>vV5@*A8AN6FDU5f!a9AxMr57nKS!)Axj4N z%1e%Eq**d1YCTc~cD1zoPG&~4NNugeXCTQd9cGyAgc7m*wX+a-j+B7LN0Lb?7JxvA zhR^h+I6v(cl;CD1o5dduB(f_u!g0ww0ej_%%z)35y6!>Gan<7N>e>2d7+bBhg(3Tf+<4H-5Z8esnb7Y>vM(mY*%66Eoz9|%%0MXwr>>7JET*{Lyk zItIYj;;QLl>$*H{N}{$J2{zWyk}7q}z87k4I@ii$u{j#(RniY9j;z-+M5u?KYhPc5 zeKaCrV$@cWm~sHBD+H}8jUehHi&LhMv&R$-;k4ByP}ZYY;$^6*9BaU0gP`9twQ4r< z(nq)x3nd;Rc(Au z)J=_?-9^NENaFDn7_3%WItC@8ma185CXzNf<11_Gd2cSS73PvwkqA@{?NZgtcturE zQ{h!YXa!GRiYr(mmLw5JB&${`y1PK&WY)~hUx?K}HR-Oq`}eYGGPswY5e_?fY25PW zF}r^oRYO-MCZd+BCc8=U6!bfjY}H^T&>or;fuxyP;8sD)g|1PW53H9$wx(TP8EpJc zr@tqFI!!Y{)}dJC@A`P!V47+w)D*x5x=E%_ADQVxPnp{EoA~a$T$P=>Cg;Reoy)aj z{_*WfjD}M-Vr<1GGbvL|S(M!GNldRLY|%qZu93Eey^p;|Sc{}q*z)m|lwp!vO3AB8 z{+yL3_H|>E8_79S<`+q7Qh*j^&kPflubl3-^w5#C88dUU+caDBBJL>aKo#X~zPh{5#>Tu=&B@D-*{TWK07 z$X5z$g=W^n{V*IVcw;_P>2tBO(QVz)TfZU5icEIb!{l*0YEA38;>7Mcy6lAlJ`S&M zW9xA_`g&1C0_$~x6{J}Wyosyb)?cQM;HVKzDAA=>Ld~m*ESgOzKuIh4j=T_E7-OAU zXi$RR4uMVsxYOeDp(D(6k=YcuY4=7a4cN3Bu3CDycLqkPijdIb^BC&9jW^xmYv?1% zL?gpzYicHvJ#!(9$1-S-k$XpNpqL}GGENsrKv)uSKxnLf+5*Sab*Gt}>Jvtwwi|E}k#Hc_Nh37>07?%Ka>vWA zdv|y3yv|0v_O354mdCd2sLSpg=FF?d?JmQYAvIKxRc|fhnx7Aqj~%w@>8nj7u+S_} zi3NhQ6+Y?=k)%qf9S~t%qzJXGUEMq7a(tP-Lyt~QDq2lNU8zE7nINJLBg%u?e37P3v$r$p? z%ETXjA5ieT_aLrv&>r*&*@$J`Wk zFhtYtN(^QSjMDYe7!=p?6-dfJ!+E`lT`>_E`8iD!`* zg}bM4ZA(QNp=JR_H~~UV1$uQPQ513r^+MboM`=HiB-7`QJPw20e)P|6`iOT9E%u%} zC5qV98!ro89@4_p(?vep$skJnfyzC^c=|zSj!{g{s?0842-Zb`oLiv;p9)n? zbf8~0kolad*N!^zieslzsWKW4spi$LGaiEpi-rNV4RY3LVv;5ObSro@mrRvfv7hfW)4bBbxaxT?}uXNFd3TXtJ_%| z2Fji2cV^*jtD&kA-db4QJd-0K7iy+0J{*xO`o1<&%zXPJAga^&ivqqto|+-90)kse zTF_~r@}ZC#{z^0J(qk;JW;1!poJ`pY%8ki0#Re{o6DN)}c@(Fg4Vk9P*DW-1Q`Tl_ zqy=GyIccL`8n^_HZnl8R#Q}EUejo7X?XEg^!(>EVW{R}?KW04f($wLq^ATn@+P+tH z(N%32B&w&&Z@dkD@5kfetft%hl8bX=B!*gsgD9SwAq;X?Qqd~NoTn{EMK9qbD%JQ) zxjcAQi>S8}6p>6PLeqnA&jHR901Hr@&-9PhU|}G+@gTv~eQ4Aln6vrJKUG7cRsB;P4)0Lci&O z!@8x8PI`1PAS1~!LGe-Pn(!p2eldV3I!ipb{H)tw{r>>b9?TVj*6cX z5yQt#7Dpq$s_JX$cO4v=6C#LAY-l4YPzju;v^=yTduztL4)dX9Ay#}xDG zk~6s@#|^**qiO@t)PY(vz}kyC!;b*?G7&M(xb*T8bv3?5(G_&x@|R{(-b@_N{+lHbWkIakf@*wkO$^!YsQtJJbF-7oK%}`IgTfF&Aaw~ z_NRtP^I6PQKH57&F<&lc3AOh&4k|hw)js8EXK8A(a>*Hd{N9t3pUfV!47RdJr$7C*#W*UFTqPIx`Qv~``0imj#0QBAn;dxHVDc22;p z!`5uNcq@FByOL^3&CHpanoYc)Y?T5`NlJ<3Q+d~qcG29^)G=X}3}O`j07?gScxhq> z+t$jagawF+e2VL8`B0K5YsIKY^6Ag9@cV`cw#6>@!$(J*#_eAf4n))KtbQtfy^;zl zeYgGY+M7%+PZN-yNl8iS=aQ;(BFOr5x4Rb%3N^r#DDC|~<~sfo2WSJyL8#z*ZaA7W zR}d6JNj-%_pE3zGC+0;d!>$;LT2|f|>a5;RAGJ3%6@E4hE>m$qwi9S!^Ej+}$(yb0 zx+o}eapW;nbaE=uNlOHxu28Er^!wA!6;b7uPYe%@H8Y?dXsEiM>=_+9Br7V_LX%4A zBS>oS49>tW&ba)#V9H~5(p2usxHg~h?Xgc%DX^QOgEL34j7t=W@!|pg4$Zq6&_bDjwe!;E`C4?VzsAND1erf8Ah5hC=>zq zhOIu_*X7gCU_R#Dn|ER4aXHLxcYQ%V>d(F}s5gy9<=Qx0bWn$^ST+qVK8lxPWF&^Y z+N!Qu>L!p!;?NO+_hpG>XMJKxjv30y6Jt6{K9o7~Ltj3u#o|Oh5l9>GRULE1hJwy3 zO80;VKz15z40F&!JuXXfVrq9|PTN|t88A~d4L&Y5p~}rwi%P8CJ!oV}q^X9Q##%J} zv#RVU<)M%}M@JOHWk~cZRn_tp72(rmbtPI((~NQZK{a2O1JrHBM_q-g#%^gVa@&%d zam!h_Fq^41_F*>S($T$LHe#j;_dO(ao4SUR8zc<1(31>5MCB0vJ8uI+27h@|pYL3I)`?8Lr z8r+LiR!LN})Nw^djZh(0^xxf@VpU|Bn1#a;8{(WWrOTReV@jVP*8CQVMiAR-W00Vs zsQC`SfO#!TQ`e;9Wb+$Gansdd^U&q1HcXplT1xy44IWEw3{EO|Dyg4xVscoxC^Pi1 zXDbM#p0){masjC%LabeMN```WBn?W{F|zsg>c}AZar38601)@8uCIwr95=|*`O=?0 zx#T3xWvDkM>!ioSg?e4xjgvFJ7QJZk^3=6ec2{oIW;VQJrEX^{nWqx9RXsb>!s@6a zg)Dv1o#iehkq?Zf8amt_XDcS%%k79M^3&w^ ztsQkJi!q$4q`eXAj0};9S0z=9S)l;O98A|f{HYYKh_M-)$c6ny9;;Ons6UBG;xW^P zQj4HyiFln&+I~z66fNWm;Pk_prdnERx+<#fw}QK_Dt^+X@b!6pvAuhLHJ{0@LbqN! zB?@G6Qqwz_l!&qNDA8nXL*1?dBTEI;@_MSt0aB;#F2Bp%>v z`VtCaH1N|+361Sc;4xVXW!;JWZL1&eOTl*`FtLzFrmA8YNbzTIdk z<22PQ6{hsN7eh7D$vy4NQfW;RBg~#ImBmbChdOFCRcJkF)luYxqJ%ZAR*|?uIGPd- zDmW0vzMUbqRdN3FEe~qo7j|r|u~AtD>CA44cN;#<+}Y~7iYLkCYc_p!d#`fjq_3hd zQ_`BErO9Sci*m|_vtYL3BO02R*%n13h8I$TK*%Aw+ca~xh)bzqMP*{A%+Rq`r=AGu zSvJF^+X|1fHgtBftLuZ2%Frg;rJgo;W2~r5g;b#o zkyzW_nd~lR{{R=2pe)z~RikinJV?P*2NYHYgBpqIi50*sBtY?{0bp=J;B=iVNb_XH ze7a`ZRohy9i=EtgxRSP+YjMwOb-qtlh2=UR- z(>jI{JAtR(mQx&;5y;8ll_7vE4x^B0s%jYKr%ew}ybqydR0eQG4v;|r5OT~vI)*)R zs?JG1%g*Na6tbsh=DTwt{qpS0MoN<%n1^CucFawZ+xuH{(dB5Muc^=09|)vOd8CpB zP$g+dPjpv|t<*CVc=X4hzL(N-Q{JXkBNTAjM+O`^($XOeiK!Ut)T*b31!?dfn4lw$ zdSR)+RqgD&Svsz}-Su=EBW}@dMZ)KH#ZE#j4&1GVs=I5@_9Zmw066+u2(E)0V_#@_SmJYh-r?ZkEYrYpOqqE@J~tKK@1A<3z71tTax3n!bue(nrOnlbp%io>J4l2>V6k( zQ)h4(4Wozax?HB<$mf$if^W6TLAZCGFBd9NZXLf>yXvx7ykGZCsw`mffB9a@rQc5 zt1$P|&jC;INTa+g$O;NogH?PfA6lq9D1^p%P#&rbYOd2=H`CynumXgBH9{Jyb5^6* zpwvVb(Kt0(E|RvL&osX9I?e8p?f zw}IWTRqgolUE4)blG%A|Zc0tJ7hq#I-Zx_Bx0N80j;Ct%me%U(%w8_75~d1yD=VtO zS!O~Q8xT^WJahQcLs(Kz4VjTHKxN>id_-kBajW(oyyQs>z$YQ8s04EW?&D2J;lMlx z4Ec0`+V~ymy4Is`?aZ#-%WkcSUyI7my7Rk&hKh>`O-(=q+h(D6o>b5-4`Nd?G%S>L zEi}#|jXf4OSmG@_I--Rb>s4>kWg&^Ad9Qa8qvf8dC3M9!w(THltI%o4ijFv9E{>C&NqD^4gV3CPZt z$MlC>aQNIkMRk7CZ0797SJPBhR&7iUKWgIlzEgj0X|WWz%+xsz=Z&8X@NIm(WK%|J zUFD&s#+M+O3qQXi=~!dAf?uJMhg3``7z3rzWE@5+6ySqV)AXvyVKMlky{?232^B}u zO+M4|r7PBG@%U^yR#5iV+J|A{b9I!J^6nk2MOPm3$5Bz%R8lU~>8wUyEW0;wY;0ai zpTk{{d1`5pw+vhlcWAE=c!t_Li*{O61)(cI-W>#B{MwAj2Yn*Qq;;ZFWau#f8mOF6*huS5J{{rrULB`%@K3)*E!jGP#Ik%l(c9 zw-cFVg;Jj#S2&h+mr^pak982)JT4S8TXRSfHkp7{l#0~K4}>I82!7N&8nmxl@h&xq zH7T7J^)%(Q@BpnmO+IQ{P}7Rnr#wP+zTtwV48G3U(eEv@4r3*g%4T6sy1?#CqB=^C zxl=P$RGY_f3~^@0;qmcfVWo6Q3pgYnePrt*+uydeXBu6VSb?UB43LKXFhwf*mB$tx zY{wI;U0SEY0Vu6pS1hXRrAXsdsT>NPkyM*&Ik~WOeTlswnRfQ-+;q_G{Ox{QZDuNS zmDH}(xQ)G4vtY~Pa=6@FlA#$I;T%bzC}XG9?y)_wH)UmjM-bA(#R60x(N|Nf0%`?t zygfS5jn~6X46fB=s<(#K$)hDgu^%dGK-LYRvBYtVib0s(uSdd)Kg4=&>Z>J zoo$#ihLRT!xjzn7g=@eXsU6hKe7yP)FxaSP=fcgt+j7l`&f@kq%ig=E7meAw zyB|o@u;jPA6?V53D}}a$#vsKkQpYM115^<4$`Oal z6f`|KVH&ftXq60$8!*z2q_}mU z0Y+<{;CS_*ZR3uyw`ys9Xu(8+nbd?8peDXvs%eg#Mo)7?9^lDV?Ti(59Zg`GT%Pxn zCl-FME1B}*@zhaQPgf4&+!>9ZAuvJ}p^lg@l6Z=c182myk=8)5_;`4n2SxDd`fM7y zLHL3i9y&;;REQas7ThtAu>i(&l3zOUj^T=cRPZM~fB)CkUn7Xm>>PgFuH8F%u++5_ zTY{eg%`G)$MsAlRsZeMaZdOM53JOX}spC|hXctog6Z-qqkKs)A!c{khFbb)wD6Ij0 zAxS(JwU4J>MianF5-oLx)l3up7RIlg2?MF4Z*DD=4r6@vW=AQCe5TlHjkA@b+&f~6 zb3RT7`wRrxoIQMXG$$(@o@nXHw30H5c<*B4B3n$WEO9*AnRLE~3fgkoRkafsA*c;2 zhBe1qGbHgJ4rh%5RI=1LK-A*GfEBwxo42lU~+q!vX%05^HNHyPSx;%Eb>IFBMwit^pLXaEhVEzq)8xXmTDY@NaPH| z`XK4fdaTZlV*({sEvQDNWpx|_F=40uu^zO~NX(@|=Blw9j*n~P_eEy=tI1R4w#8lt zJ(s4En-MWDNs8UL_nUEU9Gp(eE=r|9cGRG;7rw2bxFS1STVl(gy8w%%0g9>$vc`gd zmT!nuo}7@Q7I`khpdo6{-;wy3(JJ4CKr|dW>m84yz--;hX=*nl7(LS#88Q!#&TYX_ zjlxh>hTK&9mu=1`uBoq$;wg=VrKc>h`6WU@wTeK#ABhNLSwk^dO=t!NkOCJcC7W15 zfGgFBWO7g_?PUtdQKAQ z+?l+h$47&t-Z^|j*X=BRUbUT4kI7q4G%&dWCOSvD++h-V70b6|aYl-<0#0>ILI!^~ z!=FRd1gdn~BLdoWNhFVyQN$!QXV5l3>&nTT6&S8qngVD`Nx+QQQH#^vig zki<{F1Da}6nZoRJ`&{N{8&MN96&2|vMQg@Rg4Q12d1tt|7avh@*X4r5dt9IZRK~Sf z(10i?j6lgX>WK_c$KgaG2*I91@G+snyD%=nv05^y;nsX!>Br$_?Tx3G>Ws$jqsvss zmd|b6`(gGr;M*CxB#Nd?zU9r);OH_@VJmC@0Lw9Wx+!QSD136OF(9)fw~1)!0Y!=# z3onTyGDgg4S}QM)J#$B9Mem%5GPaV6@l({JPUw)a1y~Pshs2D@ zR??0Ea<$gNz11e9YxB{h(*cK9XyTF7GKW>*tVV(84Jlf2?!|b6)1LFhWwVgYyz%uL ze{o{>2J7+d-0fEB2YKX-*40^>z}Ms^-9rmYBu@)f)kKRNCi;!Xx`l}ZaiheQEJ6&h zT9OM=pj3GmEz^!=ll43|D5?gmX|JO22mPwkreymAPfd->ZxM;d(9_q~!;eViudl!w zNGFPx97Oo)%6F*Sxg4!ri4lTRRIyq~5tNbdTH%xu12Le-sXPIx$C;%u)nhDZSwiNR z^Bih^d^27>X3AGntW>zh+xv$FxSs<-MOq`tVxoHdo_?B|ivyO%?dT$>f($g&v6C#3 zk(73qOTCznY79>DXm1F21vw?EX71ZB2GD_heMtji@%(-=U|(Xrqq>fW*|~Gg;Vk5?pxJd1=JJGNKeJ z!jrYST|6;8d@w5BBFIaz$WakxS_*Muc-Eafo*}mnB594u00d;?uNqsF z#ZL+-v?ybPB})_LOkfe~Kyiwb(@{i1F1D z%q|yvib*>YDN7v&?%Xuyww|LAPStqa>@#O8a;+6S-*FT*9u!)He=2~sq;T87V}V+4 z1R8{hvJyztX?qvg_%vGO~2F_+o(nB27_ z8$oI5uz3pa;&Ms4pvR15k#}Yj10_V%IP{%T8We?`Lw1a_8C$GphjifRv2_`|4&=q|9Cp%*8L2lu z8ykwj=5}RXPD*@GhYIOSklpzDhL=~4Xyr0gsCHnggkDo2Vd9dGx_=U}2g-^n0UlnS zeN?hY6%-98Q0)zxajRGS81fxCRjTeiyOpWiwL4b{hT0S_Q%~1ha-Vup?mW(JF&-AD zc72spc}lEqTO&gkmcAKlBcv3{R3cn^(J3WfS(wRMA_(Y;53ZKb4goAdVsX~v>`w|b z0C6tP2`A8FRXmgc0O_w7l@f5<3z1ch3p0HvvJHu{CwX=9^d?l%%?2V!$eb=>(U3D7TcC3akO2k&=H@Y#2S}Mu< z$=yv-5S8JoI(SY;9EKp%%dN)p(rpnMnk{rKNb?HE^#`T^`+832a#Ld8d*gPcJo{T2 zlCInISu9p3C6J||hPqYzTFhNFMJ`r+21g5>iP`05Ge;`vDWoe8Zul=OYdnw^i(VX{ z3-$w~1@)kz^XcH?8pjl%$X29ksi&PsACU)#4xREidQH8#%{2J>xN|joS{Sy52NhX{ z?Cr%(mDe0`L7%U|w6I_?*r*~eBxxH|$&QqTU)AqO->T6<72dV|B3VbCOA56-z^|o8 zNs8zZw27fO{-WuxmH<9}MAO!XsM~@m>Zi@pQcsEAG#G48@f_~!*z}e8EwO^yOO%py z#=}WjL5s?4*P_UiNffmFNF`!#@6s^V%(~2E{7!~C`cYoB2g;poYK(-kh9uEJ41ePo z$DXda(hP&lcf6IDQ4G~MY?WR|Xyh@qP@34GHM=)&(c>s78#9XCxIBacTKVbXk}V+; zpf{1O_g&~@)z_QqFq zoKE%0RI=i67)%Z}qAkN;Uy-Yya_$Y|Uq`uXG8B^1(8(hi(-lqR)M8LHgYC68?I4Ro zwa}odw0c!|_kcW7PXG&7*Bw-e2$9QDJyigQ&-zkFh6(v&^XWahY38oW*ULq*HpbMz zQ)V!@IvUNtL%A_KC$D#WP(4!QF`~V)Gt*L6<5D{8sI7$0DFyU`yt|@SXKADi%xFkO zQ$ReCC{zLHGv;g7fNtbNlYkk zl&d~!ZK;}}$U`tcgLDBiwrqXs06CPEw zl2jj?M?fp+$2}-$asL3py3#F|Hsa6W8**pn+<6|n&*9%`?LF3Zyw3CQCEgjjT6~NR zxUp;Yxa>U{20Gm#*^3K1An?R&@yH71rK=rC!kE;tE_hUc0N{N3q(VkAJYq5qDWn-b zbYnoM26)u^beN;sk-pm8*^?DLF3zdX<94oLC@et!T z?hcZlIaSx2PZPEF4tpbo-I=H>V8~OoCgbqSSDmcdRC!Fc`ps3WYfTE~1sa5qGBAx+ z?nOEAg8QID>qeVeo*dTRRVsPUDZnb>=dzPi6^VrX+vM->h-o((k-+=&9dqp;>A@E&y# z5={%Ls{G0-8Cj1Uc8@XBiy4`m6=L`bR5LqMjTx9m7s!%p>CknE+nIOE<8jzJs-5MK z$WZ5YwhD@$5Y_VKE9vB1^;c*%5wN%o} zipVUv1B%OJjtIRut*I?GJ~)JNx1FwOqLPMn8iqA-T7O23N_z3Hk?HY65sU^2P&+ay1Kkc*_(7E8?IW=qfAb z#!y8*V)xK(3+dz;xcX z15B#me@?6Ul_P=m$4$7oDe?P%H%XDI%HuG7owjlmcxC&pk7_DPY1}L7M3GGc=wQWsOw;1-Uzt$AH~W9IRP~~i)T&2`q*9|4uagmi zJgHOUNa=I8=Ii94+jz>oi@Rxh`!`ERU%EDyBeSQit?fO=(SHt%{rxW9cy_gZ32CLs zPl+xbN-%+L_J3~!B88nTpf0CKKdq$ti93J|>7;?xgGRce637*XPMGypn9)&PHNhsd z9=#zj)Pk~$F;+78iW)pT(@U|cGx-^t?WuBkNdEweS7&K|hSarg9dQ#XCPO6g(o#x* zhB6SN$OD2*p%SG0EZTl+O3+sX_hZ!cq-mX2JeK@MqLlPCBR+Vc=}%L&DJRl#IN71B z%VRQ_-KSNU#IUKu?cK9O1zg>cxD#$wSI%mn7pR6nMs)Br|O+l{>KE8c3&|$0K!tEM3Xg5Z~q?)4@QB9Ek z9lA4ncXRICj$WcVe7oW&SZFJU@RTM8!PC~oK9DsAZ+>W*B97wb+|jG0l|qs$WUVA5m zn!jUqJ`?-)a#)&mlQEgV(#Y{PS7uja^hj$-ktVSSr1R}Ov0KcHhIEld2*il24+5{G zWDX*sy+>PF9VskvlqZIzQU!dODo@I^rFb5mlX>N_nL+mXJ*e%t@Y#HZU$nPY*vf87 zj>N33ppurSe9&VzOIKw^^`)+wd~FQ4_KAf|MxiXhNV+@498C@6k&XjM8i?Rg&v0>1 zHle4VUUXJ85vxc)h|nqZS_LD>&{TZ7W~!jtbu@br?x=T0*TZ7=*5k%*toCmaO}y#r z^EDwe6?o0Hx2Y-i{$CxqXsRogM>#p_KGobYlSP!;O-QlFaRn7#xN135>XKl5ij61M zy=Wvv7x8k#iNLSPlBK@GpCi~cKXlP)0E!g0yf>-3|Xa9nQj4e6 zuzd=)L8z_>h#E54tgr6H-&uQ)FVR#ACNp zyQZYJvgBs!Is@MjYJ0; zYeINy4T@*fdi3I(pEuM~Zx8f$;Mnz8!-b;EQ0=Yj9`D81?mD@hup6TtyXf)N)KX$_ z3#hdW)gqcn8HfzP*_Bvj@YS?oDhysKD-T8i)T@uMiurZnDU3H3Qb?qW9-w^dP}+g@ z90#9Kw)PhbmCmjvNGkD5Tpngm&iA)1BDD^OL(hSDhmi9c%^b!fat8WL$8II5{Dpp4Rm!m#@( z@*Oo({jOcGXK7*aF>a5z%5EvB@L8;d9ZftqnPaBg@Z>PL2&UV#ncDcGNof|C)K6C{ zgdjYDeeSAinv$BR3oeoesc=G&eoCZy z6RkZTx;48=>mzr>K0rNQ8-G zC{5pUcJ}4apwi5ts**=WAn15Y2TJCH;m!!_O0ZF*F`Utb3oC*J3slrUmv9vI9b(tz-O6=@qyDjk)B3S`x2Mm|bG@~1+?I~TF` zPhLq^M;}^kte)=1*6*#$x;Gy6`>pRokf*Fl{9YSu?H#YWvvs*mvw(^OijqCYjYz3# zByl*fQ|&x3S=_#pdu`*A!J`qYmBlKdQ6z1u(F*&2ne7I00~k}29Gc})K-Vn zr?sc5&C_9Vbu{>F^&eZ9Dq1|Y;;r0UmA1A?g<;#2_>6W!j-J00frgcywK0N>P{T1Z zO3vE7(PJqbkod6z^k6CG4w9(MC`)`=Uk070%d0SWnI(`CplPjW4-%x%>R(E)<~p5A zxwlSwlWo&&T#o#GvRXT00jf&1Y(o$4yeBR%h9Om4>;Ba&Lh7rXK}_)L z9TZz;TpXCZF7CubipF88v$b3Q0CsF`=^cL6+*K}w@ZzGil>MbhN?*5$ zOS9@`KK*X7y9bKabPhjSk;ft@qt-GVQ1I{kxOI6%u|9>BBy|AB45bSXF`@f)4^e~D z22JQQlv_U~y%MD<3b77 zVYM0}i6jnV@mnE|p-u#>qJ(f1Lq=0jLF-HwIVE_`nMhIv02vvhEpx<;LyiciPMEEa zn%o-~KfQM6_p3XF+RuucdhERR3{l5{>v$p*`2Fuyl*m-j;j=iQoUEFk8Ba?T?*yPo z_XLl3jwxBz85imA8YYqrY>OP>PwEJ@l`o?NpbSXB$gfqAqd+HP;=!*=x*=wbkHRFN zAxjE?NdmY%2-|ZVw&uaU=&IZJO#c90(oXSgx^3y-uwna?YHb)Xt4C9c8*6JmHayN6 zY1&GLf;i!psVx+GRFciZcCtIi47QQCXlN!AI<%Z!;E?GFsQEFVIL{uPo;T1MRk_w` z70@8Xdqj!cO)xbNx67o&`RvYGgDH&J_1GPcwelMtvmKq-)Y&SEQ$eVpdjKmSTm~vNZmns1?mK*Q9}* z6)Mui83<;ig;--siYtvgc#wRDmreWYF}L#A-Knr~l`#{v);xAg6P?Foa2vNDmBTXB z!I0d!-NByDVueOtl+;>-7aav8Zm}$}vsnA|N|0Jf24i_>TT;YT!(=dcz+$Rs0d*~; z*HtPy+>()S(~3zNfks0maZo`?4m_$9m9GE~QTG;4?;^wGt2PHxXJ_4bxW9qTv-bq> zR&9)ZGQBERZu~|MBG}EjyedS|n#$UONQ?;Vif!-KvzCij*2Or8lnU_=5kNJeWkm54 z_z0~sYhJ4H#*U$_rH#shNP5QA^Ib)VKB`Sg>8lTs$>UQim)qN8Y;OFWc0Pg(y4B#J zY%blwZP$j1gB7`U(o(h%HhV0FN@<#@X08$X�+*8^)PD37Ah5Wkm&97m0Ax(#b=o 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 literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/soldering/11.jpg b/lib/ESPiLight/pilight/docs/source/images/soldering/11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..076ca9965d07f42815a3d0f947e5c6a507d17897 GIT binary patch literal 400213 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

    Jy(dU#^&m3vDo*aizAfXd0N9& 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%0D{_^@2>L0u-8KDn?dax?{HSq=ni8{+NaZv%^gQ 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

    6( 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 MP$*{*{+59$_b^rhX literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/soldering/12.jpg b/lib/ESPiLight/pilight/docs/source/images/soldering/12.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5bd70f72ced751e89dd8a97c1e5551c00d4d1f9e GIT binary patch literal 369514 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%0AT5nL03~+fH-3` z>&niq(mHBIGzwF=f=yJEZ70h~tvz~X&1Wd7DmP|B7lX%agxoRW=cwuW?Xs(ls;tXn zJaKM~t53CMf}010z!J4s+;vS%o++ggI!aLcw}|q1O*(@rps7$AIjCtyO&|kIwhp7{ zdiKB5@a^Ly2RunvjS%Ed(g;-ulUnyDn`I)Qc62N1%v96HO^bo+Sau^BDzP)^&fG1x*S{$3P{)ci3DNTc*hg6u9q?RfI5{dJTiVFRg~w3 z2yZdg$|w$T;;Nl3s1ENwDnZ5wAc8$QWBw~c*cA$u^;pf@zxOsoy>9K>`);oxpUvPU zrTdhig9%Ldy`@i4j{Y92QuJstUTGM-?gL#+*A9$)PZh0)WJX1y3JF~cB!;C(HKUfM zJAvssv|~z&AyZSOs(|s;p+*S#VwI@reX*(O_jO)EP1Bhh$7|rQan@4ye(TI`I_SFR zAq<{*VcXkxCz_zl_C|kh*0gl-;juLl!x2*QMLcV7Y2ih*nkb;Qj71?}@W>W5W9Fsm z5HSL)-ldHIV0f%|S)-C^Wq%O}(Cb%GUIeWeg(r(?AaOkgwY#4l{yB8tZl&y^4xv$}KveHsg5Fw65MSWnOdNTOw3&w?R)#y-GBGeUEN7Tbh z5Kfa^gNh!sWALQ#CIji2Kn}yi2B#`jG_tV8SW>)4QRbtjhCCMbmm#*WyJvIfOU*-x zz~fSzB_FU211D>p?kletUSc(=E*QEIsSq*gjfyf!^bXWQ8$Hh$PJe!jNk=Yp8_6~9LQACvS!=g&LV6!U4W?ywzfo7M)C7@`OM(C{~ zH>D1wky9MCrQUn1 zJprW2_FOnhJ)Mxxc1B+u`zH}ugxd8`RMN{`)%dOFU$=1;6m|HzIO)XH?rUo_I;%Q> z3UAeEU|0lec`SrR8T=TW1H)Ma0<|>MN~s_UXQ!9KXy;j-jk+#dNsyxvoob{t7|@zf z(E0I+wv%L|+X{o)j=63Lg{w7HB#_-ee4URrk$ z(i*y2$l`#jkf%v*G@2{2ZWfM|{WexsJ|g^nDm4PFLWOl9tEo>`l2v#j5z0|X3>ax) z+G+(UTKUya$c%I`*JU_fx98hcHV0vQ;E-QT<+Gz z@1@=O+=YBp*-Fi=yD-_9@Y@Nov{dm#nJ0#6r)EE9008?~={2;mG}E+V73_3$l>&vN zXz{&ujU?0(RcI^S(`q9rr4d>JL7~=;4M}6Icz1AI5;%%=KEA(j^`<7L3spYK$?RIa z!%MibeQSowR>_gB+_18&I40eh?V~>J$K^J-hBnEpHRXgKQR*aWC7lh$<)o5ZJkbPx z#|Y{GA#{?--aC<$;P4{@rklc+SWN1Yv?Sx(1 zos`JSP#-|;NfeTjisZ2Yg-)K8G)W|IyE$PJlvW^WMKvU=fmN;slT{Ss)3$&8A?9{I z!EVH_s@r=OmWHGx<& z#8$UP0RI3+ZVMEn6x8cRm{j)!G*%I?VZ%Y=(=%vmrj^+mZw+##Llsd?4N47E?g4

    oOyx~jFdW-qTc?pJQj6G4^B?0vDf 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

    Ikr{n2!! z_RNwFB(P*OttqQgnyID^3ZG7^U2#aSK{+EhH3NdtwCB)+QNy6k+pVOR9kH_;sWO!{ z(9*@ad-JNJ-abtI9zF_Ka6LJM>+GxS{g0Ta!PcOPOw{ch23Grumy#f$D){Xe;GBLt{b#+o?aw?8ZNW%s=$@5?EWAo`rm&9&tH)&FR_WIe|>v+qH%H(mi zkm2^PdTrgQv0%kiy;Uy$#BAy}!%^>=STXUW)cC}jmWnr$qt2GUyD*LX6}OsC2(Sy0 ztw_Ptw4nfG07*2>deN$^g^;U(nu;rVjU<|ZUo%P`m0e@g+w-^Ntm)meP25>6+fyw! zY~VgDY|fK?%??X7kfgfq-PyTg$?dFvUv=(S)Q_`CC#*q@f3CJ3(e4+vdwR9j>o)PtAd-Q&hF~jSF77^E3!BfRzGG~TuHG~D zPfTw*{;=9un&0pKQ)Bh_QSRM=v{I^`8FqvXSzEQE-dOFQwWMl@axx`MvYF9EH1>?U zJ86GvF0AdLz8d91$q;a|I#cxmtLj#LR3r-ano_-L^4XRHb#ZQ0V{n?lB92XanNBJx zObqeIKxCT>Zb#NwUgq6dACP!FH4YuNx^K!nj@;~=cW*6Itu9+{Y^-)mJBQqTMYn0` z5YW?x#bxODX(|X!Ah~FQb@0L=5wUGZa+Kh{2`Why?qoI27plz_7`KdnQ;2cL=d4s8 zv8mCH=&y&FzRTKsZ+QHZ?kpcz{974k$nCl2$ly0t`p%hYkWelXUAENI#kg=-Xx5gf z*3=q$BO@eH3;Rgd4$F5Q*(_@c(^+Dg^Gh~DHMt))W72YB-; z#{nD6nw%c5B9Ej00O3B6bOlM-T{Yjm+my#(={C&0nV;C0m+i1^)V>^w^?kLCf9PbX&92sLQw||On^S6EPyenVfOIoi8E(`DwUnxY5NBoVfcWKw&P%aiZ(>_!4PeVHCR zgzr_T?s6OgtfbPQ=@~Qxbh-IUaIxDhw@BF^a`4HPHeCdONYPA&pcTLs^RHE5*^x_( z-+f(Oxc7V#Z(~Paw)d7ZZf^afo;zBumRYLj*wJkbskS!D^`x{}X(dNW$#RnFLRxlU z*B;7dHWB#6Op7mIt5hp+eJnGmQ0rG9`f%tXB#JwWwT?DbG3NjS`GRUQl`0QLL#cM3 zR8;NgcSUydrQ6$|AxV?M?l^0=9yXIGxT=fOBuRw=vUg4Bpbq=O@eKe0bbm;X{_n zKk)^UdWCn#MCIpFUUp~texOg)Z;t@9xKpGBLqcm_90&M1^lKtd1As!4Q|CeJPK$2o z$E`E(jrB#6>nJxa!``O95ro`1S!y?QGgK`kk|sxP<*?a2Zt2aV+f{ zvA49%3|EBOxbV}!N6l0kE<7m|9V|!1@Rn){DcBaYB?b$bW-o>s@DMv+y+Ekeh^H4r^YU2by(X==%q>U{4iJa+%{Oo33E_sT)Qy(Zvemtf`y4Lpw%!N zQLP&}1@gG1c=abYyLN_4Be`;~mEIU_!=BqTbp1uLc2`h!M0+*{-C%!tarApqhdDhj zUC`w+V2Wt)u-0V2d&m+;1KY8Q5Zg_5ik8TSTc(i0Wb6d1fUYU=yO6~Bb>nSOAhjCi zX#gR^5@X^!l$NNeqJU5g1JY|Rk8ZrC+!&h8o7Nj@i*aY6+uQSL?hThwQ@VC3$6@J; z?_6#VFwNRKV*->ltx;1XlSGv@UbtSwq4GQWM`B6wGkDp3yzqU3DQf0IB_~-5ojnz239vf`tcHcy{ z*xS4Nbmk|Lk8f;#=iB-1=eBo4<7%twEGD2e`8t47>af@f#*s+y+N{!xUk&D%g+Vj` zcRqsslEyJwu%e#Dt$Oj2V%{wAgEO#>H4McZ(t(D6bT}U>5<8DfxJ~n$*qf%Nwhg6? z9jyf4-MscEdSEt=;n-Vlr6-MWJ2z<2?rb)97q$*A0MW|XNxb41+MEy+vGmGJizLyA zRYthhElP_U3~El|H8lt|Dz&c@PPGhC%8n9!R?a(_=v|pla|Q%z0C^0t8R{pRA%$F>K*&?gN@?n9=~0~)D9;Yv z&2b{fb8snjGsnQ$R4l9<>@1q%M(iO;S!e)lQnd zC{$9qP>n$FsOcR=g&Ve9?lOmPROYvC^T++(4j!`EcuDqd=+DqqNtw)3?$+KldvhJt z1|pi3F-VcJA|D#Y!CTQgwDDeE&IBx_9HNgI8GuwqKm=_W6kiaXTu3B>dcKG7-Z*m6 z5Y&2+p=+tt>RO_tl_2_Yr(B_{qRegny~*ya#~n7|#l^bKc0aK2-`+mHn+u9}`znm4 z4;Q$rx0Zi=&n-|~d76_Ci!enPjz(10YOyk<#jV6aQErljbe>OA!7S1# zW>Ic?kO;>ZWC04)D^%msvY@xSWQ|N@tGoBAqYxA^6m=!O83jdhz;%mx=CJuq;Zlv3 z>-ODgUxHnwpXhzFkJ-HgLAM!_TB&PkDQIxp&ur4iJkqXDArhH|D!gy3S-rnA#MZH; z)J-H!1yv$ImkBB2vLgbn>r7FOmhMtUI%3)*6UgDp+<3Ha5w)WLC^Wb~3G^b3ihz1@ zdOVi)-+7I-u(4f1U75z?zUF9l1qKss^xo=mZ(L`#FD7nqP$wG$8&0=-y5WLersAHvSC%|=x; z1(uc2wF5v(F$CAori#tIxwinpKt8`+V{D$G>wMg)3110DZEXF1HuIGM&ZM z)Vry+q|>T zc3x|FZiIuHemV%c(Nrb1)VE0Z-Jq%(rhD@5pg?QC9YAVVd z5`}b(Mx?$A9I(v^0QQRi025Y}s2J+22$d!VS5-FLpbXiLL)*7&_Wj(8+9Vze?2-(BY}~c3&m8u-nsbJVr?4qk_99Js^fqV~1N2?Y0b2Bi8z2TAG?J zra7RX$v#G;d1I|1((Y=cmJ7qYfHFe@dw84xE7Bhy1sr>@=4x^KhY^9>i!x`baFv+O z-JY8$k^cY*r^v@yx+-a?vUr@{V3v=}Omy6RxnQgA$mj;AQV`dMD15WW*F1XkiZv?n zq4N~S$PZ6W9X>rpY{sv$Qj08bm^W=cuwCY`>6=f~66rrr}Ne;JUVDrwzNw9dW*6rfN~^txO2E_*Tk-92Z!cBb)z zKQ8OU=c}mewvN*3ysm40WNGKD+=Fsu_SQ2aSH5!a)MueI6UC6EhY5yV6*NlDJbrL1 z1TG$t5~EXgs2E@X;>D|}nV9ex>CvL5Xq9{h0O|meN8!o%R-6?;1m`^?_Hvr$h|M_Idf{^QKhQ`TloGRSHc8EG;z!!jhU;nYX(W=|2((7csg zmOuiI0DuWR1#3Z1TGy&HYGW*03qwHFWBh=pu5;2uCbbkhrmWO%4z#7)^xHP0517bw zjb`5e07v6!)x@9PEtj@xcYZuk&DgovA@e;8v{jN#B#x3sr$}x|LbJ$z5;zPGECK22 z2U{+ON&*2No_$aHk4=fU_I*~}$ZqUpyMrH5lgiMpMC|>!S%TXgFO6E`RY8yYI_jFK z_x|YIxN2cjK@KjWiX42=xq68MC=OFfMidg~Em{o!01Elj&sP93Pd>Csao9yi;XjI= zb^JN}&&#J=W??qXKI=?I(%4yC#(NvN_V!Y)hNlPF8`7$oFzJ!U?u;Ea^M0zADh4un|-C;B-vP zmzDv{kp+!W-I=bU-i>DLQsCPBpLR8>5J6t5%yp1ObJeQ+7V0gf-9J0N6Yajhj;5Ps z2=Xyb4V{hDpMQtC^Bpt3~73RDxq zgn9H?e)4z{1YXkM6TqsR5)Y{LJUZRSeDv_#we-89928Y~O}8CBKMj`JGq%#s?c7#A zC65z~!~Lv~(bQw{@Ss@X0S$mGOA~c5-gu2MnnD$_YmiU*5BNBAghdch6lcN5AHz|? zpc>ThuU%vJ{{H~k(c|lT7MCZyHl;KY#Jj@@jDfdi-;e^XH?G%*$1O}&7HYVLwgUY9 zefg|ln6HCGnE8|1erkW!PQ0>D7(O&~T5%sQL+SJWU29YP?mClaW4>o>uH@_O-PhZ- zH?PGCjP~%Y*;!<*)0VBwSK@GZ&Ek;8l{nqe2H&MVT4~fuh!8Qc2ihCR+81bLuC!WE ziWA4r%z4+-qqqY!B5*qyv0T&vl0H@IS9+=c0ClX36145co2drnPP<#Zw@9G?;*WEpZ5Z}AY zWcD^owYE=T?YwR|>oe<`+B-_KZ`XF@SXZnP*G%=0Q<}nQgOE(3r$PkMH2`r#{zFRr zq;%@ZMP&r3D~t;M+|%si(_TY!ZRjCf?$xTN&c{!b-5J~`VQ%fMgon2ByH7KYrP_5_ zZReAv%!0x$*Uj*2yexuq|yF+v2@%vl1Ljgq%;*6i({K}90s zVp>xUJ*P1@mDqdO5`t*eC*}SMXFY9{oFW!t53Z9>IYB)xZ#c+EU;Bue{yAGd>(6T?HMa}&t=qQuv>;b$Ag0bh|5MHq1u?0RtRZYWr(x;u_;cEp}QQoY-uZ z)D>8Kp618l^V|D+ZK{JuPmZTYqMvYMu-nfIS52c86tU16Y%02z*5EZ2Nm64irlOS3 z?eqTtFzVVQCqqi1M*~`aoAc?KuAy>r80jnK&F)NvPTIxS)MYdHJk)tz==3!-)tRa( zX2uHYEsIIFss$><)c{abqdV);x+nu95*NSE{a@kgjZ-BU{+Re^C;+bm_WF*NTRQ}p z94xfiUXI81^m1>^o&#?7PDgt0jmy)xjHVuro})MuueO{?j^Ef^E-o`ZM=L1stu~P4 zXhk~;YUPv=c;dPFQ~cd+LOQwe3V^w&7_ZFv`e&&%v=Qa8{{Y;IF3sDOyAN)Cw&SI* zrq1VgCsWaGER{U8jkq)0=A&stoZFbX%#9>C>~`6&r!E^_JDtABBGsC9S$^-r^r@}Psoa?6#jij zt=!uyD@&i>8`_&=HlmjWv^MrrwxpgMyiO$$z3fV z703;mV0^e5e7K&Qa?2{Bs0V;2D_%TBO@GuW(hC_L&rC+*%+q7A`!fJnY;D==X?n|N zF4U~*STaJ7C!5RdjD~V;)s*i{jFG`nk;h@`BCM7m?^7gDmA$)^yQ8*+1XPhyJi`ic z^y;yziVnK2eV4Y|c&+&d?!X(7#Hu)E5Wt8wu5Cgt3ebrhLr z+xw0^zrB}kSJO)+QW@U1vnVKWjF7~la!aU$?Jil|gSzW}ly* z^6RbjF5}x9R}Y9ALpijz&2}ei?SFTl>Tvq=8>g+{MDlFdC*-=kf z<)0snoa1AteH9bVS;FlEh^3U$py$bje1>U5O46NINGd^$YSoqlhBzNS90?su-ThlM zSQ`A^(CVx%L#gpF;b?N3w`lI%p5{1?(A`EV99}=MJ88E58*bKbZKYDoDljzv0Bw$f zmSt&PM@E#@f$+mC0Lm)jl^}5Q;a(z@>eP8x1&dP^Ij8zx<&VmpI(@ERWNj|c>+Du` zk_X&$oqLb$Zp7GIqY=FNqdka~CCFwebJg|RDYrFVe-{#>&yT?5XlUsK4K#mvTUWZo zOht@Zn^N%_hMM^>;BoeP^=&<>)mqfxfmSs9CcVEpgXz}}t=>5ewU6KV2qWwoI&6$N zT!j{6ue-l|{Cw+tVp2gHi8 zDm5v`9_7w{%8s-dL`;-nC!GSde$ahBN3MB{rAF54&8@d;{{Y!`?i>yxmRhdF%5}a! za#C+9>_r_!c~Q3V-yt#)Q3uP@<})Mja9c_tJtEy^GDjmfyXpw0Rd>|H;en|0BBzJ1 zspDR}+6<~F+71A&JpmklY5OVCew(hlPJ?jO>?}83c4iv4aZ+t9?YK6Ujop>bZT*~x zwRk+8Zd+isLV8>#?F_W&^>h+dLOd!}Tk6RL%u@gkrR^YB70FXt)5wp{tqE0pLmZ4^ zQ%ZdO8lr^xk0a7*yBC_IX*cdxw{5Rs;PdtM+n;D}y3N^N+jvQ-=ca5v=FaU5=H7~e zuB&LpPLk7o#QsW>s%M1zQldg#ABxg}gJe^HIr~SSr&f%|sy_N5;#3YkbpwI*r&IT1 z?7SZ2&y2HnZs3b{ZOC_a*v(|Im>#mtZk*k5drP z?;8(xaU*zBGPIB~onAzq6jA}e^VBO|x8WpfBF4i|J-9d?v^lTs1BmJJpSAJ(N`oP| zvRi|4Z(hjU`*RzB+%LGd4(qL?&f}rHo=oFZ<*K8~l^PW&=kiiQv8IT@7xtY|7eV}L z2w#Z6__z%c+4H40#X z=4e4Q7{+}%^Q7T)>IKz6S`ky_rleE$_JiZsyC^8PhQXoi zTFg@826f;oJ(PWa6D;IZSV+<=hgB`h3KM|k5mp7+V&GB#K)_ZKO-rL>9l&Gr0*5s+; zN-f_$!o%(9q1g1hmoU>?E4al2i856*>rYKRXDJee1KbkoA$+juB zyttM4rLbr_5#oY|Y<6a9`dG~P-N{FwQ{{5c{#a_>VDdUt0K|(~e>6yt^7kM{h|zBF znWQdi8EUZxp(eCxgE9|HsG%Jr+QQ3!&AO=8jdBzwH2yjeDN5)n3G=`?9en$~N^Be- z$A6F;w>QxleZ{b6&TsAGN7ecMzS=p+Hs)igGW)KrH)Rg*>@C9uJTCimh_Q6AVCkx{ zYfWh6s?-4YEXOe1Hkda#1N}oKL#Wd0Fi;zY7tOGB1~~w91tJ@J-=wIL7|7PA;nFfH zr;8p9S`1^Q-$ZPmk^cZSduuVYde5Qu?`-FHNy<_6&e^Ki*)7r67~RK%c{{I2-51hAF`$x1aw?>#qr8T`MwC6rtE?jV z43Q$nu4)T0MF~^EvK3c=3*A}|KCdI;cf?Ka{I{!fy>tA~&QLQ00PxsScd*m;I4`1!ih-6rMPAQ4I;6_Obj zIggHp3=LAExE1P3(r}d(5g`;vP%nd^+p`{NRfoXpxf0&2z z^7zTtc&z>#d+mB0{WcnBs@q#zF+sYsTh}zu#`vmTzl+0FRv6@{l}u_%!5nDgQ1q5y zhTU&ty4l!AX}7v=3iXm=e@)V!YmFx#2o=UjuSZ|Gxq>Qsl_ZRo~vU4<8wa;(t)n+SfZaIGCwl>?`xr~N-mj#Q4mmbd)ZffIj zW09CUwyP=PeOXIcK(R9mbXC$brvM7jo+gDOuy}pVmRE8`L1x+j4T6rEH;pu~Z z_5T2PXZHp=yQXPsmmiR>r@`en1ixuZgr#Vjc$Mqqc&a6e2o}aiNZU%0!S-`->)?2? zqdd!ys(Z8ODnHd;gXtQH7C8+Dn$V1Vv;M5~(}L@c?%L^-%=Wf7Ax~RVQ4ThnEmu{J zucE40rgf&Hih2+uiDpt>JF2l?)y@6wR^{1VKw1?XO)>sntezMY3Im@^f3aWBrL8|z zb~j_xV&d4e^BL%JFyXRO)8%O~vSQ-PR78;EtK_Rk`;1K!#`4sNl(2~`Eq`px;wUFE z#ATEzAq4?q1{F!bCxuQr+;OX1N8{WqcJ4yzU`St5Kezc>8RkrvamTkd7(v~IF!dF%MWdt15NsoQ6p7ULUm|GCV^PwFu+$e zsI5hM*ioi5T|tg{Ovv~>8)ZUd*by?)c&wN<<0 zH-L&tY-SdLF&Ug~e^*oN+PtMixSWM`Ty%AFA##kQ4{afU2)sryS*=Ugy;Yp+Xv}r* zNmvbXB`9->bn8Y#NLnIpOJhqFeKe>~7@Pdpogu=RaM! zCa2o{hrT;EWY_FX$(-A9_%pSbSvOTg^H-`uNAg+sFt0VL@_%as~1tQSzI2Z`ymj)-D~3{d5O0*$3jXrvHmPHJda zR=heDwr5xN9tN*o!V&Qr7m>)btAim>exg8ziP5ZKxCE*=^|K(4p+pf8j7m0SK>O|!Huow zVJS;BAOljaB?D6c)FOmX6+la-E6`t!T!!Px&y3kSOk-xt;Qs)LZLNTJ=1X|j&oy9+ z3y;WcPaQ>Oa0W`=*gv&){ zr8RlgW0lzI8lM)G5#AG)|UPY1HdE9&C^OX@thcV}Q)l~=9?rBXa*6$D8V zit478CWBIw)m4kfCxt4RPM|1%9Xk{-_#cHy3>1D7)0W=a^;?i`d>3QO+__D+wQ6f7 z?7TN!SM5E~m;OAjO-+KXO{JEtrQ0;Sb?Qwm1$}%q6VD{FDnzdK19ufmfeoCC<46I? z@XJ~NPhcg3JZat%Lq%LMuTKCH2&WQ_WYH=PktsdGMgTAlL7`DrAdya_RAhEmLn*o{ zj@6^y-GeN?Y+fUxHi^4o{t!mnSG7e`0dw64)@-TwkdJ#{8JN4T}@3ub zlLZw72BnQAl@48)d-Q4b4J5I^$sMd>T@exCMr1T`GBtllH}-4}TBLvo>%+1$6N1lh z>4H!cSiE_#@y9y7A=mHF(1bQ`a1 z;5MECsqpyg8(QH0sLD2%1eO%iX;KNNTxxP#gBLdJ*qe_LipA_2EcQQd zWar#nK}onbF4$K?TZ4lEf?-!S&#ug5Vo_TaHcmO@nqt~yP*8f87KIuOY{CFsH8kjY z2_$78t1zurMhj4@LZtMbDN+0*K7!%cs|u3LmC}W!D?y<&r+qvZq5Gyg{j>% zSni>s0h=F;+8ZA$KHJ@U4qRN)QRD=DQMYKTHw{g8{{ZokGC>_gbuK*8tSS$>TclDk zv5A3Ldk2oX8d5+ha9I3r80{ravO9FOE7OxKcIvVXZnIH~qiawNe?%S%7bFJlU*gR= zPYNxSj9BRKSj?qPD;c%p-BE394&zWJDOFqsj0PBT zO;%QF=yVib1X7v*)Yiv(*Ka+?RTkv#KF-@c#TFi}Iz?@b+jy+5>x&Uco?IpuW?~`3 zK}$o|c-*J?eoDU|j%t=LF^HWUdr~X-=lgR~SeDdUfGKin+7woRQnl$(GWbsfWP}Ex zXed2KKM@$o`+7}n{ehm|cx;KyQ{E!E~cWMI;=&0-KWFg z<;(3py@wA_TDvKosuV(L6qrMkYvrPil=BtH>zOv8I(2aS)j3ZBVTM(m{47iJ+>52Md$xdT_xefJzWp8iR#U z4M98(qvwha9V}XEZHu%ww%EqfcDBsQVCuHMUu*P_ZtZ&g_mGFNst!Fcz2Um|EhSFg z+529-Vw*-g9W^#?o`Mw;H8~`>bV(yB_*5<=qE>`LJlL@`F5YAz(l7|=gaD!O*ccu> zu&pED(K``}3dPo4p`)7RZrpU+HIR5~*uKxR) zoOUrNH!RCnU}-k}4J3QUzc1f?lY{GOOwMmJhnAkNvfFr5(a~qC+b5J} zn-{lnw7D8#qg1Npi+i_*B93iERu#goOHl9ua$Ub*96GMIl#n&F?eS8Xp{X8&%BPP^ z*v*sE*huo*hj3&v{po?p!XFNsGqNzfD?F0KsZF?Qx1QC^<2MHX0HejzWois~%BUlU z_>>W};v|iL8(L9+* zd*5Vj>Wn7Z+)rD+X|rv%tL2BYDMr)EQLZ}?w{kfwCR1)_ca0W0lAY=&$2D#+O2JDk zPV9Z{B$HZ>)^!H77_Y4k4L)_D{he%)rKB2_2m>aDgNfma{D)4pG^2iJHx&jKYG?OW z>Bm>cxwno(ZGQvW+d8YSHoTI+m6Pn;Rx%8h$)1h{q@{*BI{JwM24m)#_4}$y?3(B( z2rgLE8sKoHDt$h{I&ic-$Oe&0C>(3+n%5q`o;v4=q{eQn9`LN&{bkr&&nt_s$!;2q zPR7n}e74B={k2|5pDkN3q@l}J(eDUoV3lj1aMk^jQ%f5#l2tzL$w+mGdqW*eaG-fA za0B{PENe;*x8lU6i%`aaR-?J8l55A*00->qU-7N2j$O;1>x>r0+=YK_yn=z6auy0@R)Rejxbc*?AVVhG}eqz|Qa;yMK}gByYIcIp+y z7NFvk$Q386fD%IPx`8yNNUst|QRTo@sh+d$i1xhweY5)~ch~?A)LlblBuDi%Wd2yQQok6NBbD@ z&qa*56GXa+)MC5eP%hm1>~xEP{kOq<-iNOD4i36(Ug6sH zSWV4>%u&12RAF}pF~wd#B~LK_05vi)+T-;j6(ED{$mDp~80tDs%8%kCmGIjX`G3Xr zvbV>t=TX)*xXexyyF7XGZ- ziS-&r2ikg2wswLxXS%GON{Vy#mf`sWULQWSr0zZOxjPPvwRgt%txS&Y&eB(B^EFiQ z)6vt*QB>heMFlR1sk9}OK!ZZZYkh81Nh30nYDGAbPxC%qQi_@uHPXFPjZf|ik_&1r z!kZLUHq?WVLZ8pJDN+Lr4z;PZGjyrhEqvWQI%BGG#!vvGrJ3ofD|D=rOGvXSNIX>n zKUgY#ApSk+%h%wj>cWPko{mO4YGZ1*MFmbCF15%{mcm24p{(q>Svs#_X5`4>W~Qpy z+hc3iv^5*5mjRrO;HLX2nk=f@s!&evlX~oG-BGgZNq}0s)C#@Hy1mW zeKDZYSl37z7g)y=LJ9d)pV^MC1Z}Ms;>n;Ok6O@qeZ6tVVJfldwej_sS`5tFGkI2Q zicY$%-Wz{p_P$@Wa`nJtYqn{{(M`HCn>%k9X$k%_Ag7A0j8+KcLxQZSq*RY8(Ei`{ zdeYT_C`hOTk-~%R^ZN(w>n2XFvuR=XHW4YZ8SEWhMqWY_1xPIr35c-Am#ipr?7jiRYBLRj2ALSQ1n5aWwf?)92OX;&mwz;)LLzoj=Rz z);vB>7fnZ*-8=GJT~70>#qIny2Lr#lyD7VNMrv$6QyT^gZ*6|b!|oh)A79bpwzToj zl&E%d<5Z$Cg)%tSf-3q6C*@K6_;plwB&1~M^#+Ih9Z$+8PipV&xk<5i?$z5H>YlfH z;$N|Lc55B6_Ksnrs`JqAnR|+odd-W!Y4FrlGDBM~CW?|QY%nb$NhLas84*}Eqf^5_ z;3Ap%b!F1!z)tq^!6W8Jm4Ba6^7F@<-J5T0X0~rx_Y~V3YvpAaevYQEhYQ)Y)p7YG z$YVE;Sz(uT@9c#XNBE9XYR?4XXygqfP?DzO#$u{u)ezt*U)z9xZ(eGl3nG1(;NyEhEq-b`NLlB*UdHue*G?*7f%_?(L(tx7|kJ$L6UhcNH#SHzwW7#|B3sirl+{a$qT{H)CYC6)IF$ z)o6yi(x0=1Rf3aNW}+11>IoS0{Li7smsR*!1|!QPe$E^}F1n`6Z4;f|f8Bk7)w|a* zk;%}u7eBN1w`A=(I;xu$PfBI%-IK6!IZ0u{VIs-8qgG{&ONo?P7{r6$h>?R8Wg?WO zpO>KX`Hr+%fvkFK0`D4r@%%Ga;zE=q%sLsRzol0JT2ZD_)Je0s!qU_pPy2p+PzPXq(Qp(Q*JNdxuLZ7=H==`TSu@vhOMKgY2t@=Zpum=FIeL?8LN$J zGK+?+s>??0Ap=Ucy#}e$MyTnA15SU0gPeNw=|d$Pr4D$XKT+%DiuJ;lJl@xfD~H+p zhjR7?!QZ%}ws&S*8M8AOx7>A@DmskLTW9Sm`l=1Xk*?VLGc2i4a`=fU5~w3hG*LwQ zL#U%(n2T3|09TLU2haI+R?|>r0Mj69$n+=E^YrVKRaT%#hQ_zFQ z*XQfil)r|2M{ha`f%^~7=fk8`YP=Xt!!#`}3Zo&O#|)(|A8{N$#LM6}ZADzT%9QJP z>Z&T5hMO9S)S@EILl8(OO+`n)Eg77t2A*TL`G2VN);<@g2g{8q$3Nxs=xU?tE&bYi zODTux%m-_CtrpmNJ*i8w^E)4R&%An4gh1Imj^$Z!l~mgcW=Xl~X2BIM{=r={{X^932!iQpYYeG8sd<~A4i@?ACNey2Z{3O3BB^Uox_b>M)S|%^4aWv zi)`b!CQiE#lGr;R6S47BmAFl}*E8*^8cc>Ode!P|eqy3}FC9n=0h!qzUvvg^0y!(; zicwFMc7bmwHlU@H_h*k>0zO zgR^@&nzoQ+aJ%nt;PaUDYRW>o(nDS7f65I84Hpio8Iy)nR3YWraocN75Y}tYqYa@l(2lSA~3tq3O1I zjVvkw^x;uVAG6FHbR0=PS7a%Lbofo{K0>LUvP!1hlnGAlJdG@?piqr62}uLS03+}{ z>`2VbP&It8I&gTDK%^A|hIn01fiyf`az1Qj*D7+0TQpBx(FD}r0*A)ZGy;Z~onx(P; zsXPebN_zSF^pV^9f`mRtn3f$d$zoa&zPj zae+>iJ6E=9dg7**9-Q2HEG1oD+{Olv$^Ugqr}$YmDZg7 zgmFVEtGesBZ((j_u(RCFzt%w+ybf6;I)foRP!MQ9;t2ETO|e{GTU*Z7CB>}(c+`d% z9j%d%vxwo?vd zu2xeZ*L4JsWE+$_e75^c+k@)7x2mqAl9k0r1|;Y9biZkna38!Z_Vgholf)-YG@4|2 z{{TNKbx`!VDu2GJshf9hc(e31Xe6kv-%uT>`(5%7QPpGily&b@QM~H&^3EzHpowXt zrAS%rAty-bEzxb7H67j=E95n4sVsb(%Abh&^b(Sn7bUJWFljrh$0UmVgN<`fPOb}P z{Pf&k7O;C8roJjv%hXxC##0>z=-!(Wj~j~Kd&4!Bh6(e#inn*>q-gaHTrark+C|aMkBF?%SJOL$=>c)>mPdOR*tU%@I_L>R-Y~6P~4%+xFe1 zt*#msj^^9Ax(y=(yB>#$2cQ@E=X?a|{;TL|zC!gL&)7W`-x$r|hS}TiDU8BXs4su+4vFF^buFfxg*JAVcfYo z>V(fxN&HT>N2QMwl%%N1O%-cnD(H}!>VLI*(=R9y0clF!WSedmB#mtB2*p$>ryd7a z#4%CBJw|tMyc?9(VHsK=C_$(-8iC^U+>94apdt-JEK8tMa zxH6BLnd7UgsC~nV%VMI791FaY#Xz<-kE{f-T|ZuZt22d1uf)Qbr>$$#Zy8niy9diB zrXIBI3^!HHk;v{kY=p2^#|qO_Qe@%8M@KC?IeDrjs7X~ku`oqrZbv^~X-IuyQo}&< zK7XH1wD5$D15xW-ir4JvU)Vn@c24-l*6n?_Nw{XN%}{-WG7a5`%Oy1PC?9cAPfG!5 zX&5KaS(^6$01s-Sz7Um{MM$nHJn{MUp%YBxY8rg&>BRI^w_Pq~9Fo=Gr=qByTwWt^ zRbrr`s>n??A8XUcE>fd(QbG3gGHr}gL}r$ne<$1^I)UTbX%%LQIMmUbuz5D4Q`mTd zN1qYHr=Xa^?pXekwM{^#a5(WkROrCgC4FvB1KL~nXmox9Wy`d2^KEU(zWT>yEiE24 zrg?>4>)O8@x~n&hJ&6?gwT>9;v#(7yKAKc#icUddDIVr4c%wSwk5FLDs0#uEQc8G| zGNwdyqZ*LiI>94rlnY5+ffNk>Ra87y9a*f4T+k8FCkEB8j%v=y#L-Q;HoVyV)-#dN z{{W(j{ES(dXlMREp4%N_)w4m5>q=_6h!T?_QB5695|>D?Dk}vn-%&dKJc!pZOuDH^ z)t5R%YS?DbD(GsVxYQn+2f&NKl^8267gnYqnqk};gIehz>@=-c%Vrz}^dm+t^H920EJynys$t5cE6Cc5d(DbxSq|k+ShaTD0uxM>J)Rw6Lj> z#K2J`T?J3+ccEwQm$`fbouz<4Sm_N>PL!4=k-TmMPEBz5dITsjMg&#E2B1B_ap_OG zFnL{#yC>W`tFLk~4bzaK-_Yl~5306KA3p}fr^WvO2G7;e>|Le2Fp%IVYbL9Prjrlg zrE0U|mR7nw?Ih1Vv{$f|cp5cGzyn68&aTr!#YzGUj0?CLNyt4{M};A^)T;g3h%8tM zFq9`6gICW?b*L1_K`z^Ux7Yignu9lt#s2^c+gYs5eorM|w!cG%q; z7Z18a}c8@{b&`E%hsVOtY<|pLFGN((j+U-8n9) zz-H^~C4(DFi{063?S+ThlsOue$YyubZwy}L&+d#?R)%3N)yib5D=H<6MMXL>(7xZe zWjai8#*xM-f(>S_LXhf7I_<#)XHZ09KvdIDNZ@A4@fhk_v2Zbl8fYjIehpe`(m^JN z3LFl@sMvdN6Ww_prr!I9uQ8%_!)EfhZMgDHxGPxV@cYLzTe`N5KGxm+C0QeB#L&!w zwd(IQl0?8+fv0kNm5s#Kkx8y^396DTc|T0l)e(%ETn7X;6e$_%&mgvBUl1hnjVM@U zNvCY9T*!FF$VQd(sp*S3**%XfcGphQ%;5XVEK_7K*lvp59dVWZ^jHl6X z9*#A-kr`kT$tnd|7OKh#?TuMjmf%knHP6iqK2NnhIll2CS5FESig8C<9qb+#84oX1VRKl z{{R$~W&vLSL`x|IGPjpacfmEStamKUq_R0+T0jj8r6^PnHym;bj*;@@5LvI0hCtC}^U zRhCoX3?jn7~u;ww))YVwKu@ETHKHqc~%s!2qZuv0Ey5 zlC`5(rp#4N`k>G4y#C0iuETeZ#N|c-C1f` zswgTcMI}1H1D7x&1U~O}_V=N#?}(P)#|9%HR(WLv1zybtGXn*9s3_zRrGf((mKy^haW2?rJINm+db`vz9ypC8+E0*om zC&hw5000V|ErVXE9ZJhRtSahbISW|QFgt>Q$HCB|Qt!PU!0tnzZ|U!p|>? z?5F}$NC8j}mlEte%}$bdb!ha$L5C-8QV!M&@LaWuulO6F-S=&FSW}mU$*5JqQ z%pG?Az-)YN2}P)=!O*Q;T`VeLnS7;vyo!j=6Rk$74O)VNJlHRN2k_KahgT8;Rz@Af zABVWp(MjyDp*5#MEA2X+m9}$Ph;~IbLuBUner9~e;>GNopI=Q=)KFufk}N+@_Gf6- z*7hDJWo7bJF)Bw-ffZFH5rtfu+91Qo8DdHt7Azo11!9?L2lTXJB#TFS;?CVJbG>COSMnhKm!nCe1-X zl>QI8Hz6pGJy@lx$j#??mNx(gfk0X1TJXgP1&@%Y4_X6SdGyP=7SRi7egn*b=5xpV z9V~Xv;KyZa_U<2liVSa7;iFvb4^L&PYNwZRZCt+ScZ&(KcRm*q`=e{q(K}wEvpJHZ z6)PFnQyR!EupONR!3+=z0qAQ=5hh)|JEKPsLW6ds*9ZrpCc ztc@^~8*eR+%VM{dV;zFo8$&xL?5WT0?Ee7W{kGreY)(3hHHpmiHa@THXP+UFugK@> ztAvnKHkL*V3b2V%GSUJ?1xQ*?cLkI zw&rteb*|{_oHuA}or^?v&3{GD)_eOUxv{grvsKk>?3Yerm#wn9sj73i8JehPD=K8C zf-fypz7$k9nbv#>b%3;7Y5BoTRBi%Vo z&$&{A37zYWm9c+;KH%Nin$5Mga{DKEZVjzXP}G}uuXhDbBlz$48v!OQjSkz#$xlyB z5;ILK^OLQssz%TyVpUd$)z9>p46z(I0HcL^xd5@!0;4y?cmN0C2g8IM+&9lC8{(N>8Ez#opIt*1+RaI0m)39_U z@9wdODjWvy;(b04_$mVM@Ib&b7H#Y3t zoqs0OPO_ts?>oP0?z*b(tH9*D3|Cb(eLgO&XJ~>#bjalceX8FZ2w3L5wWr~);>KtV z4-YQ3va3-Msz!8<>QHf@$)~9p=sWG~#uld?o0koOlLxf$RXF{Pu%yCd^6~6kZg!s> zmA!`=?Je7w-5Z9haPHcWwQ^)>>Y>KRB9efTkt597q-F#GTyf#)N}7Dh>VT~j={_eG z#dGs)aP%D%6)F5ekP=8~V;-BZ3S29eQaMn~^!y)g^+^L7H&!!2xiNbeV$fG^8md_7 z=%`|;q%rAQs^x;5w24fOZ!ijYQ^u|bx-szk{6VM=n{%qH4RcJMg4`c`cAsfu^AtS` z@uRW(KBfxA6?>}*x3@;@ijIOf$exa(i)~`+vGkM7Sy($v9Y-Adwu$77$>9=&@c`58 zulYKu@MC|}xhj1sDe~iKtuNb0JG`U)UbLo_lyp!e?f|(G?8q`y1{7~ug|4| z@)?%){NLLZp{VMm9Y`mM>2tOqWz115H8Ik?bwxcK6SMfyUZ!Z_oeA3 zG0;6*tW;}461ioOTA7QuKHUrj6t{m5^&YOF=ygPNain|rrf*ZYjqwTuMjEW1w~p1^Fp6!^X8lG`+`lcLRRt+BFqH8vM= z(Lqy)K^{wSK}9A$rbUIt;kw512^6Bqt zZf)nYcJA+oX~)@kZKJvHQDAa(7+&S5+7NaxYE53ot8wg1-rK@b$-41LT~#F0;HjmD z8>3QGRLDS&+iZ+Nl}d)e6(Yav{Ej+p>x41}RX%DkKb=0`<VLRNk>6QUU!L|^?3syI*b-$ta_j2 z)pfW)p-+YlO-VoMA8E%=d$M{B=e^%8OuNf=)@5=Ody6F7{{XMvpCi~Z($~HteN^r4 zrs|A!IH%iK=xHLFs~${MFh@@;W?=sSM+uRry2*O+_4LOY(~n-1r9&vApF`VEA_+Jh zP1qR?*RiVW6RK-#V9sZ$Xy(gLv2l%@ucXKBUCBN(Z9|8^ONHGKEZCfVN0F#&>ZlDo zt|F+D%$N767=l$B6t9@!$A=EKS#hnX2+c?MPx(h!clOrY8!Cdg9l5Ea*zZTUqwDRX zjobp4Efy+C)A;7~+?5#`ZP}Us07tv)H8gR}mY_%~5lr$&9FdjN?vGlQ)j^8z^Yf*D znCi6@Q0NFgr2haRK~d0!mEZpWX}z#muE54%F+y7-cUCi1-b#o{T@`IKj>?LqN(y-p50yrI{Q7ngnOSS%4?m9p z*A@Q&HaZD=60x_I?(914oxHLAue9i7z|~P!XXH#x4&dz>zg5$qsP)r%i*P_p{S&#iDC@$yT7_E zRN-|{R)aOC8vMRqT{!B-x~0;G%;P^H!}Ig=>z+R&E)y?{#MRaA{o#SzJA*m4y8CZY zZa&1>^&5_(DUhM5q>rz$*!tS0+1dX9;Q0{~z#{U=Pf@C*Pbok=+Dq0mNXe}{g>z0d z`B#r#EkhVxW?(qr)BRsAo+sQL#Prz=-bSN!?uq-4E1JM%_BIQ$vKzCrYiM?ab#zeU z`zvW!$eDk#Gu zxMZ+8GJ_mzaTo7bVEdF;&H7WUdS^L8fR+j;%3vT-@> zmf0_neMh)3y>+%|gjE^*ZvO4fn~29&;j>jOG&NY78Z(j0!=^}`Z(;9e!;(8dvUX%s zIAiCfvZ_a^!Qs{X6H?+rT?q1}LEsnoi1X=}`-|S4>9^+WdKhSXHTKqbBZb;s+m5NN z-5b-lcV64c(@iBl;K**R#FdmAYabNxwJezm2w{pCk{IdEruM}5mUis%&v-mEZ!$?0 z6#+*bC-!;tMY{7xF6@&<4)wc3Yjn$~BbqT<(^i!Y`FixX#Qaa+_~pgqH+Iv5At#9v$MIH?WRsHf`Wpgh75*!3VPhF z9rBVTHfFM!WvzxPsVQhGbjAxs6FhOTAz6n$%tbs&G@sMe=|lEop?o*LR~%Br-KA85 zDk=!5KbX%+`klqT%hS-qk4h<|gw<0-v=q?IQAWdAm0n#=(E-o()6c&Ww0$p*wgU>E zGuHu|?3(nYSaNlLZIbiBO${qhr5lBd<6Vhs; zw{m0iYmdm~YvYkB@#eaUYWjtSWNL_Hj+U_@l@eNV2-b$+sXyR-xgpgPkWF-)jw2pl zKCcO z@*Ase<0=hw)6Y&alG4jrGf5iaxl(-Y6%1bQB@vQ2OR+&zt_vLS}fMZ+L>I|%ZVe!?-~q#TDy1Vc6Mk1 zHal=s*1j(nk&gkCp<)$AiqbBIg{{VZpR_@Bwta!Xu0-Fxsa3rdg6G+qQW&_z5GDBqs)R#MxuhqsRSfg5* zC1z^G5k^U_7}AT9PC6d)*5iM5eAZSnFtU}E=ai@k5(T5`KAdSoR;>W&P~2S~vGE;~ z+FRGG`*uyK))|WJ(=n~YZ9H{U)R;PnC5iC33Y@dc6+Y9=%}*q=q*1LyBd3UfJ&7!L zONO@FBDu9+-b)N?EgQF9p6xz{xFpmXbpUT(<)ya$y6n4uE_k9lr;aMiq!1spkwQVG z53jF9pQJjy`XqB($!`wr;#!kxiK{nM>Iws z+nU;2@IAXV>cqDS_QqJ6Hc|lswZU2(5LEH<>Or)*-Wu;{lWn$%-^B&los`5t1TxSa zKpYTrN>i=Vz8n7lGjE7LA8~`J{!e#?_UsPh>zXWP3j-~g#D|qZ~yg41xI)`zM zxwi5#n)4ho#+74 z4k(os1-Nh|o|W?L*5Yip3p2L8mGeZ9mxTER097Dd-y zHLnU0f+^^Fj&~i&f2=3MDsA-qUS#mk3L4i3qf>(EI)3-eVYf!(%FmM77%k0-P2qu{ z7{RzJ_T1GlO_s-F7QMVw6>`zLBr_CfB6cRi!`bYTUR>>yTkWoqZYCc^DqKr82-h3#oU7vztA@u{xdgQ=8-Z{a>ho_}Xs(5lHZE~vrE)|DS`5%!K93pIZW`j>5G zH_ras+ls$zSJTMZ%pNj=I%>>9QB&gKr+v0zhB$uCrl%zwm2FmqkyZR^g4g$}OF7wK zg8Jx9a1<`Ex@y3hwFmJE3VBkatxZ1>ZEh79wM9uF6IG!(?cx0{Jr+IXys;4;wW`go zdY&zy5fdi_iJhay;p*$e35p_o`U81Tov+$; zy>A}J>Mq6Y-K7>+_^R$++1y=&G3)-u#nDMlzi&%M&{M}yJapx(i|(Ev@olaG_^>?1 zd{zNpTP~N1DUfN6IMoB=d$+h#HX60b#{$TOJ{A|y&7))omIRg-raDU*Lx;LaMc}Sp2Y0U-HOR#aLTa6 zvSpfj3Q`Jr4<73~wbj!)qOFXq>g=)7AO$HMBQ-}WlBrM)Nfha|e+E9+V|y3`E}`NI zkBI6371ig0!=(o5?Y;N8_J#_JxAUEiy>}jWAw=CziKcy#9v3;cV#!Y)7P7Z`VV<8e zhst8JjIB)tEe$0_Lk)E@_*@`)SuK|8Qz;t|R!}RhtfXs34gm^Mm6Cd!wjHywQ757Ph9lO`=7M>*LY`^TC6?>Tn$vMzWTzeA-r(AJ9Osfz|zyZ z?x)+?vp(&8nkp2jh8kr3*ui1#!6%C+)=L{&v5mnolB%&_$>B&2 zkcZ6))WrGJ^|EE{w}d3CsA&f!o`eGG1yzFQQOEF{blKILZ*pb3FKw)OuBzJGvt#En z*sbY--n;v44b+fS)=2X{7pS|R&DB^bvB^K%V`vLSMnaZk)&mxIAY(GX(1@pL1gKeB z6e>Ulw!ktL0%Vpl9xAtW(VQx6K z)eQN({(r7^HuTxJh+vi+s2L3YD`w&`vh5t!@26-MYP@a%DJgOEtM>_2q-pkHFe$x8 z@H(x`@r5ixr;LI;qqIZ9sRW3FD>TOp6{>nnJVx80B4W_OQ%)KDHmS&|5(Ee0a(fBQ zYB~rpczgUJD06+4y0aL(Wczo1Q{d~5~M?@8H98qH_LKz&DECmSodU52I25W^Zf+&S)fU-HD z1u3Z3qrEt(%8orf<@Zlw=Iij3o4<18cXsv1;9#qw-4X9ixl4)1bz)ITnayqCS&fSh zpWYT_^VH0836=AygV!Tmc$wZ9A&zD?&d0!4$w`@tvp8*3)+(Sq6-RI(Y1f>_R(5pK z%l)ke2v9WXRRW<&sL}{;F@kzlVKEup9?;qOES}BUx$e8nZ#XdZHQ0%(@_XZT9Ll!i z+7#Ix%Ye^s4coUe6xlU|$A-h>DeF9dnz|7KqZwb8 zqpjLmJ)yrbn~dcgM?#n>dqV~>(QWc7F^rAG7 zNdi*bWa>FI8R0+)@}*5FPVTB(!$%hY{YX3$AOnF=b5Z9?3jDf6WjCERLbv$t7Lt<- zPlBQtjg7ZD{{S3|fS}3eGEElc+uf16DrzXVCg#QFs$`y>vNBc6HcDqPriyY9c)Q70 zHDdJAG=RDfkzO?eg=$F^Zkz6B0)b;(lf={xImhgv9$DyF+qGEj(SylsT7Hk%Sz4W$ zw~4FX{khzgTVrDN-G1Pz`)cgwCuikqHnsu^s4JYqNl21pd=7$AlNAl^$6ZMB2UwM8 z12$NB(Rk$3h*M84oIne$RKB1{3MdXd$R0yEBD^|7)nc;s)jOjIH`X(}n`+C8%GT}- zKI@8nWV@>)Ne&YkpWFNMc2Z&U+m!7}3PDLOK0ze~RD?Y`h|yfOA6odztW-Gxh$AN@ zsAx{Aaba9n9XJ%|MP>k%$Qi)=CYTt>^x@NPPjgaJ?k~6QI!cO7{{V`^RZTwl&u(qS zlk6NG=M|7-w*KI(rJk;)n?CcXjtn*?28S1pjz^j9zz=j+p=N?WldUO^Ccb=fe~rEo z!#z=?V3Yu~75HcXr8s?`m0Q=P9UeNf71!O1lgaM=o0!M%=pfaZ%x>M`nW*e-`-iM) z^0d2CYwT==JvDUHRTZmI21|HQQ^1lI6vdkMb<}ujx`7q0o;4!{f#AO)d%E0m7A#Vg zr722K9srU!;~)|`U2OvnLucf=`kJpf(Ue`2w$`B1=tu`N`1W1*KHi1R_*NO8ds^wR`w>r+}qbTA7Rnu zv&S3uskkxN%sE;cA{eA#8IaXu;0GjpN_$A4t^g%~e=|{0*Od=~!IK8GBTHx3J*2OY zp%ooM$?m42pvQIuc4rB&7{92b$>^p+31hdaP>2gExMI-KdV^>PFT7V zpvKAJf|?*pFTJw4jDRWJDhCc6Nb&&r@u{F4ds5X_hM;jH2D~yqU=+yDStr_C_8s1K zZtClv$xL=DAGNm*XJ>6%JRT!ETd>nYY>d7}gA*loA`Ir}S>jo0>cvBbm6_pp3+~9I zY7deKttmiH4nBQpl!6R3Rz9_@IJeH8olc*4)pj3Y=IV0w6>?zrrFZcB#Rf{Mi#oIB z1uEh;-XZZ6QtVxYxH}JORT$SFSvt}+6iFoZZ3kDQt9X@{RclHRYJOG4N1veU#Dk;) z00Zn4`O>HI>4vX=?(BZw*_#>)?B*W7ueSzQ8$%9Tu=6=hoh3|bRgRDygSZ~Au6Eq- zSywE-#G{I2QcEm@(%$?YDSS3GW-Cnm@N?uo${wvAq!T1^cDJAd`HY{>px1ZJg2rHE z#L-EZqs>xcF}RsF#^Asx{?8U4wy=a5-+u@#5;9qn1zs2bCTcVo_wXt}u*ELr7$Hhf0JwEKGe3saY z9+a{?(!wzh98ENVS=?NXeU@^m)h8k!@M_@G?|^JxT*1cIbwaUYoJ5gy~+m5C)5 zTeannCy#@1OO>ys+>v4`{P|p))NYNpp5GK$!Cyl7&sy{ z4>AULq<1IXh#*v`3Vy@<>&NBQYK$B!=NvqRcu?SaSD@m%anz+|+}oJm$K87}r)Aev z;C8)Ma+@o(sHvjP8tU!izn+U51qO3wQ|3PC1jfk?WnD~Curg_7Pi>PxD_%dAeCgMy zqDDHfeqy-bE5Ot3`E@61WGY`5A=#8TO`})0@ZZ5}`$meFJJ$4}YqJszhQa>z;{`?+ zKe#(H4LFL~f3%!X#UO|%MlIxL9|oF_w129-c+fjL7B%wnKbOnp);#V8pDT#Sm?-n~ z^}9|?_?HTsn`~BX&4r19o_(W_>iouIFxkD=vZIJkCRSMK{{V8U#?cZJSCUJpc?|9J}5|~Gf(I1)dY(}5yAT_Uzk73Jxapk zH}=HO?LF&9jn40Cz5f7;+}j(k_q4m4baj5!+=8neO$}BXJb$XGz!$2DMtCKk;M!E3HvOniIfO9wYpj^c^-}!P>i*D`t-RdHE}_ z`-?Hr(aTeX-Wy+S(L7s)aM@h-X4%H}Ms#K>RtXvAXeF8Dnnl&5HCSryq4dY|sq5Z0 zuF=F~*NFQ)2T$-+(e2H%UyAB%1$HB@t7gLO?fqMys(h_?eN$(urp!@dcYgY(!q2mM zZzF`m!jR-}n0%EpnH$OsvVumG08XW#1Bb8682s_o!7oQ_us(jHfdh%@y0alJD`(Hw za&_hb_kQA}FIBpCe#qUsG7 z>_TQUnU|z`{j;!gao})OIsDE_mXah|dg}M2qlp{_iCC+66QrZD@cn-X`zgch>tL4^ zRt-Z+R0I6{x|dhC_huI-wy~YXus0?r8!pGqZwR)}UDHj~*?rAHfUFQy)#b9=R~fmn z+5Dl!uZAkxig;*g46L;-7!uwoBxMk=Rr2yD%w%V)GRDHKAp`;YPmt6=&&!WN-DMoK z_)KnRBZ%BvLukoQlcU)it1*S2D~#M*Zicoj&Ie$1rtQVzaSfZ_bk!A7L7L2^Osuh% zOQ}I0x)!08l}?g)(x77?pIYbT)l|B+lDdiFIDUShbh_NQ*|r8JC%mwokMZxTvbA#2 z&0W|1S=@W3KHkdWv*LGl6}t=WdvoKxuvRtMDt9H^J)q2NT}epr49z5Njil+ zF~s?N`miV!LMxI^I1&46>4VafeNk>rjgF;+;73ztau^8f@x5QQcGMduts-hVDokYu zXZSLC&GQFm?%Lc=T6M~5ik7C8S*oLWwCNTJ+Z(zaJOT4+=B(bnLmBJDq@c&EyXHwE zryx^Kk@FoQc9v@$w&B2SY;RLxdjoCm3Ot@G0odEatFg21N8feW^ZaVRu6Mn5UlU1` z#BFDUPmNhBUV2*=kyd6F*b5UYq6Z&{5D2dT1#A5L`q?8`jlkA85J+l#^PZV-n`3fR z?tQOSOSK1QV&SD-(6Hn(87z!j$7)hNWRvAPY4AD6%U~*S7Kfi3VdQOGTHcr&uwMI%Ff)8~K^>uDnvMA@qQ_H+^aqP@KQoFBf z^H_`wczjIs*y`yzz6wpLT~?1Nc_&zsrdDI+0rd}IE@4?-=|2UzQRiB=brN`wEFK&> z#qW5M7UvrX!s(pYsVznTfb2Z-Jt_H)m~(mcTIyO_W{P?0Y9or85i}v@m7FSB+0|p@ z*p{##n|mNs(^nzb3V9lTgP;|j)p2&lC@p0&91g~#6T+D5Uf$7%a8TxQ^c7eP_!L{0 zb-c1gh_0!p3;p2924}2_o>&Yjrr_!*$~6OSeaVn1DX1wRfOvd|`oGE6U~IbM+iatd z0P6%`gTxSk5&LV?BGuyOtH9*4*?8cYXzC-XmML6_?+U|DEX<%fyQR^S@IbZ4y6JGe zso$!-9EVWafCXvx^xpfAYtX}mrSjL+QR8bSX{n)@LoeGB;nq1-K+!4{Vf1TUAIH5I zo%OXqC#{J{E1>Z6=s(HVP~>w7ED}|`bs0KEgh<+@`*|wjNTMvoipnExDp-&j*ESyS zJBaP3zzPwM>{I-@Z@HvGb5oz6TawH1-)F;Iu4=)B zKr|0e!o>L=1pa+2w_iYfr0Q&6bLX}e%XCQ<=D%RJ@ZETdotKFI8;!)`aTGNEp)2mFmU-L{@! zk8s@}Ww}`lq>>G5T4Z38!k^&i6s+Enb!?d#Hs(hwfbPxfxN=zO>M0#*;o6;PTS)}b zRMJ9WGA>6iS{YJHXh@Wm7dQ5?;aMSfxwq{^O$NQCvLEgFbvf;Oy1}uV+iA&V*H-dc zQj{n0WP@Cej^Fb9!Sq*m{O{U1{q?gpcUw!1>IB-fpWV!sY8np4-PqR@***1@i*RHr z>Qi}VD5bqnr*Q?;v`Dx29&`5PeHO*A*xSQV9nlg>FzykQXjL+ zZGODXb15eMm0lzaND6TwTHu^igIZ*Y4!1Aq{{W636}oR~?!ED{X|{&X-qo_=<7!Ge z7~e6v>0?n7O!-H7Bv0Y+Pa_4tjA?87m>*$#SRvglZl>LLFt;!#=mr9kY9z8$9^D`e zkya!g0Q5V$ntNNA;kJOiyo8w>%}4@hFBQsLNUyvWwOyL00&h*fx<9#|DL2LRx4 z>LlimrW^d%5zv-JEIwn84mhPq^XRlvcD8GwvH47-Vvb4-oKz2AJX92!8ue&s;xx?) zO5Q0UnItzyH)r_=NGJ5Ihpq&g6$t!@dyAQxV{1Ih3-97+Mrr0{NCuZ5>M_Y3(2Lmn-_!_# zJVXWu1Q2LP`n>wPM;n71Lqy}mfS=ODx}z_T$N1O zR z$-f|}rmKpgk#I8NDMLr(WS5sWk{4Y`G>1#njXkvh0vN~!hOSlDPNHfxaOvi`GOvjb zV$?4HNT?uz#gv1B?1*kn68mc5vLKQBstfbv=}EE*ki5F ztRxb6;B}KRLRAYZ<@K~LdnAy~_ zoNQPvzn|XJbMGz3x%1G@Qko1yQQ)Z~jFBdku%)_|c_Nxnu!!AZei5TCPO^IfgHRO# zc4I^eW;Rv}3%IH1H-E?ajl+V^X4hT70Bsw`^elC>y&LGYyrT9SG&GEE$hBt>L2Py=?5x;U^k zK+Jdn#{}o6P1ls{4daTa?cMXex2{)z)8aESVCpyK1#|mXEw^(yVMj%T>lDY*=U-v( zIMF7rl9ws`CMp=0{FJfvds`fzydS_b>f51^_-q$UDq~6!EF&Pf(y@@NjY_*zbc$FW z6{`=_kRV}EuhcMcK+1q;I>l*9SEq=#c5ak)%{KnR^`FTNu|>7=`0c;f!k=(sGOxL^ ze{Efuq^=!Nh1uPmU%O(7L@QBUK2nU#k~}Qo546xEpGZ6lwzh-nHOj0Niy9SB!cX)% zXG~58R2m#~aT*TSsJeS6A#x$nv>emxrvzZI0R4IbF>)RyP5)Gu@ZGBip@$*mTidYT%C=we)n< z+C-uOsQaa{0N-uaQ!j}l866~2d`RISw9vbaF)YTkiZ&9~y^W5ZoJ{R*^2SS*@Z*(e z6tNXLl}QA|Fj_zq)8eK&4|g=!U6mFGYfHE3Hg96>EY&qGcLTPo>2iBRGnU53C2lW& zZ!Py-ncTSCw*A1>)T75mkEcv4Qm2kW(%;_xoUN_G-mOHc9x@GNk~s)I1dOD3aRnWe z25{r`DZ{3tolV4Z!!vkfGURr~z-cWSkyh88T8I=NrDtM*jI~sm9ESSHQ0@xaJjUXp-cr;~%N8Q3@-+_aJuzBeN@rXTh zxi~}GJV3lu9>P0|bQ;3g)Z4YWC9X_vN_kTcw|4Dz-ph(D@kcIAW|p(fiJ34PZT5{* z_{Z^voK`HJmQtSRLGkXEKqE-QlIki05km-Hk4yYY#lyVh6-q6#|qxLGq#L?(qkQAO=MM z;y>>%4*$~Z5fEauRKN%yXJ}U{4te!mH z4wx#*SCDfv$5RU~ggQBWLJ=CJJUHm=#|Ky2#G?8UU0qdJgDdAy?En)}JnQ61;5|Ka z(2)gJ@7JBpY)!+|d+H9t!$q|>F8tq{TWj^s-=v#r;u-QAU#n<0jI^-SrY8*miSzN| zqN|pyp`{{c4%L;9>ZnanJ8RWiGt=TAd`P6=QiSJ+R#s4vt46|A6w_LT2Z3r~zcN6j zPfdG&F}A4lG&{17`-|5ZTD%2DYiDmbaJ%j3dV3?b-Z*nxV{Tw;;@y#N{olDU)d@!) zYcUGqXliPFfz_0_aJr+Hjz+BmcG9e*_e6lyB{*wr;~jZ?5>N@SDj5hQSMakip(BaX z2ixV-mJhLW8SclEduJ&3R_VZP9k-lak4xGaZHrWT=NrC4V!ytd(s_1nMw4*kDC?wZ znFco%EcXb|ylT43LcSc~@iVDV#Gb%SMMg<9$CghTb!U(}V(rtNdpeKb|l>dZPj-GsLP~pNQ0jrw-hyBZdbY zo{@Q~4abJ+3AeY7;#JXAj!-3}kq|;d0DZSsUMzb}e?O7`05?<>EK4b-MgYO#U(1g|4j!Wq zPrateZ`pRuUPpb>jsE}+@7%F(j`H0dS&pNpYRp7g*f#!FBe*hIpi(OFnKPPbV?$Wc zgQU7e7FBXV>`&?1H!j~s?-njcS#_H~~Jjo;a<7i@M?WWRyF&&fwgo34Xs;eWZ6H9Prb zpwDFUc{&Q(J-xQ4n;m%Q7afeNnp$@S1Pgce>$pf&fuXGj00=xyeRyJ>G|ulKa+RpB zX#BW+o~Mt`rI%SyRqV`XU3Rbf7VaJ5)jw^vc5X_R3`W%3@?|O_s)e@}&#K$lt;@al z!ckV41q2O>(IqTQe&j#t*ixDZ6lYu$#A74@#-BPGbkQj6M6v?DVwLm2HQ;@Cn)!5J zJGZcxa#2-dDEk7xu_$V?apkkyqjPO3aC_5pZ%87ZhNiP{WOF$@?&7F}0Y_>Ia4O=Y z@x}+*#_Pw1j@3pU7~xD*`IF~U^CzVmSQ@AcV@^Xp-M<%8dNZ;an4D!0z($y8zX4|Qz(FI;ve zW}Hh9+x6I4)@`@CrH-D`wjLRzXe$(hrZ-tEN}p@3WC;|pG>1!&K^{y$$b9-iaT`hD z$S8EyfQpJ9H2(k(TfX%_d~eOYkD{yEJIWpHwks(XTuk)&nhnLbYN^T@BdCg5swNSq zj13`NeLd>or;4Iz%e6QYkU!H5^oDq2?Q~G4wc*5hW6$#x=^5QW%p2qO(%U)B!}1#s z)6{TaDI}0jgU(4wzH&K16Fn{?5le)qpDiXUN#MJ4ML~erh=b3P=7A8SN>!D{{TVqFLd`$ap88pLvHQe={_GDj-%X} z*WBBtn-7SEX|XZpv-J{7EmdfaKifb|ajlc_e`#;7KB8$R@WPKFOpmslPtT?HkbN|1 z4~SlX{{Xy^(cbUz zx9a;>c*9*!w&?3{)Yy&DjL7CFv(;Ih`(Ig!#n4lA)iktIOOK+&!5mLf{!!qDQjM-_ z=wEHX%+R4QiiSRUKezlH5^_11a<1oYqSXpXn~N7>Vh&B6Xi#E{=gU%26h@lq0$baGmr(|Q`gx!5{{V-pY6}vvMg)11G4|G&A7SV` z+?{Qh+q-_VdciDPiw6yP#_t-9mx0SSS8Yw;wQw38n_0f)Xm+M!aAe?FKJqL()IAK# z<0X%%G|Pr#QTY$`9<5CSEI~eAeS`mof|=?>cJat$>8XV-=WdP&KZz#0fBwm_>i zc-U!io3F9*(zZW;SL}`DS@zW(T$_38^Lrl)v~U74B9@V9q=F}Dorqlqm0=wywIAxI z+0|H+hESk+0!Xi}b5rN*)Tp-&9^BYfy>vEiM+cdYaPDo_w70%Xv$x!9L$$Io3M!li z&Dj3{Wlym86-MaCp{5z7f$H+Z(y~U1tM1BKTBKAF$3N;lUrP`IoE|v;01a|FN@X`5 zI+A_1^cx##Vqi_5Pm8R?<*M>~)A;o(PVWw1B}tL5sa>hMvQk0fo(d1OT37(IXh|n$ zK?b!S>f_bOoDi}(KQaEUAK~eDw6Xb(^N_?~cBT&JSMBQTeF`l$HziYp%O0tPvQIoCC7+s_p~;9t8%E3* z-58TA2`fr)1N~p@b*E*}Tncx6gZ%aM=?%3qyU%ZKjh$bO%;b8jbgnk6&~N;zWOkl% zqK7R7OqG@IxU1tC9E43k?M02MP*XvU6gn;M#OXyPim3DItko@{HCM}z{897u>2NFi z4fQeUpUGio&n7;5LrH|jc$o>7 zdy%i+kP;}M)|!u%f5?Bs*Qm^@$MJs5dU^i>UndECY}LuNt5A ze5vcz+%Z&LL?U^SQI9Z5uSgtbUQE_6@3;2htF4P@=XVy|q1t=zdPk6_%#l8InPbEwx-2bv#*o)xB=`RX2KoDY{yMW&&oTC)!< zap1@0^5{j#WqY?^b(IF^p~KCyI%BgUufnAkdkeE`Ul}&!te%R!_jY@HQf50hdevm` z6o|ufR?8q4-v!H0~F{7#qF$a zD{*Dw&2JsC(^NE+AI9jSrl-%=?oGkAGx9b)u)7mvgs7|g{GAfK%??_62$Gsm)eWVE z+tlRKT8}!K(xdjA`BSTWB}9x_PaJ}1f5A?cRn`4v9yfdKjMnAuoW8``v0-OGTVz|vJ$ zQ&H0?;8}{_*h82miVKLI;(-@NIO?lVWB>^#6v;hf$GXP`U)(u(qVDjR-P{5R4cf+v$jV4yc!H#c83(OG zH_!6%u9ItQy~Wm@pHH05?ie0yrrX@qkkQ45dYMAgW2vX4jh?1Y4xX{Elom^ku%q~3C^`SBsWI#yiQ;Ggw&{M%tnB863ilxEhqI%k~w|3QD zLo+-u2Jj4ZJ#9riOw|$~8kw{$$+@?>$!9c)*y~Dp*Yp1Xiu3BrF%4Ey7yV!AuU3JX z`9tydIoA+vw&-eYp}H123`HhO4Zk}Ra%N3E1qD4KZW&H@CUAm!si5*rM1bfGrZ%^* z&8II*Yp2EC=aPVNB9HPa097An>>UFyIWKO#mT4Y$Nad4J(psZ6(kguYb54!7@;}+V zP1;{Hw`L!->2bLTC?2~x)LUzFQvL2HbMA^|$ApZH#Ft;ZvlQQbt0v&>B*>9(@lvZ)}3cZ2D^w=4e!fsRhEb_czR_JVt11 z*3rB7`JQ}n?SGJ&kARzdWBh~M{l%~__4`|J)9&t(ojPN4Nkas1Zfq@N5>p&?H8v&y zvC-sWq=y|)LqsK&RU85*=ALHd+l`9eU8Y|Gb{SJ1p{pn(iAiG`4&7mx&;sa$mFQ{x zRNMC(4a;`@>1@I}_6Bf36r&j!Y1GE0kdW2N)Ns@1<^CUT;eJW?r&skgQm0m7`v6q! z{lAH>^KH6Hib@$9BS%RrOhryFZR8C^5HV*+QCK1R6DadK2A^xWk|j&yYy^}55afcx z9}RFyk1~42&Ucz=w>_rHHa-#8r135_fTa20V0^RZ(q^yuQ~bN$*_@xqKETH9orSP| z&umcPr_W}7?{jCi^ccvRvn7MX(Lpm9Xz6Cx2i!Uth$=mSE;*jk@UGXl{-ny3*TN-o zaHY7n8Zlpl@jjCt*~lA}r!6I&{K$;*7m+|?CX-BsI2gqVub&RATdjA;@+J81)NtWD ztK%ogj>PQ8t|EuKX)E*ie5N})Ot8Z}cG=70cXk#HrBO#w`_V-$6-Kop=*S2z*{;;4 z_8rL=0J=a$zjP|2#f+#iD5n6bR*PEq>a9SfGf`ch)pfMVwOj1cJ%!Yt*)TPc&z)R? zrlX2dfD`A!w*FH5qV1@2HCXP8`8V5-(EFJQ*pw5)fU4|yY28Sd16{cwa*@djHlH(v zn2%9kXj^6E`5X6#FIy^GqMs2aEKE)EsLJ{p{{Ww(*mr(l`hm3XNYA)x(xxQ}WFA7C zYwJuOPN@rgS7zy9+!)-2Wpt7@{ZOjR-&td!;E$mV2$o5?9+w`&2w z_AuJo-fK@9+^Y%&)&LkDL(o_J{YSjZZFOnBq<4_%o5QY__>dD?A4=fUs{-k5jj_9C zii-!n@G@>(B~AwyQYqrBsiJ6fQ>0VM&r0FMF_a5%f8NitJ2{AeD%1l|M@_QS#MBzb zbLIa47txj8pB_3#7mD0lw;8Y(`{6^k7Cd!UGO_4kf;?>^!-{XPhG=P~5X6Jb!8OX< zwa>E)D_dQ5(3PZBpvkU&W~P75sZ{;&-<+L*1&Mm1)z$5E!(At^qY8`SgD` zFIjc2c1#X)A=Q|i&TAEf$6#=w){YE@HxG=bXtCJXWsZ14!%rNJ93NEI)WDPOn|+0? zv?AKt5Rq$Up*8MfRy8KMJUuvdYpaWy9yX91E-o6#N%0FXwGu|V zw7oK!{Xwru=Y6#j}iRso~3g|=?Di9Xpy0eJ{bfGM8-PNG4L6o`u z!MZTDxV--C##i-y7VN{)Q*1q*E`6+w)XnU($>@CDwdaY?k?)b_B@+-?kse*w79N~>D|rJnC;n>%x%hu zrAmotC~0ZssHj%(goyIh!7xKIMoc_l*36+ z9{0m`uG-ysQ``p$f_OxJXOSnRm={kBC4gTvR7kBBMM#Aaoe=n|Eh>?(i-`j*3sFX; zHBqX)H{!(JEU|$t2x>bG9vL}vpwSI#6rZq?Db!@gY`pFgv#U0CTdcF0-oo72jp?;2 zc8&`dw(%PuAuJD7lGquJ+3lK2E$>T1hNp#+C@HH(G`*eXm6#7~r11v0ypHjBw|C{%^B1xLlpz7J+nK-3@l_e<)2w0b*U9>DP3ho6gd9?N(s+OexBMp zjMPoN^ZjkUD*D!rroSaYn8w!aoG#6w$nA%QgwW+T=VwPziQc;jV`r$V!eeBpd1fJ& zBcxfGt)y#@rG%?dyg3AIR;a6XI65M7)zrj*%TNifY|R`orNgl^I)0v|!PUo7d`>{1 zQ}|A5DbQIhZdywH6A$tsA&LbmR2-jZlHH4!B(232`7l4P#i~f z3!@eA!|DnABD#EFa#@EIL#4Fj4hAmp!fsvtx+!;F?c4bMvw`g#4s7+-=Iq_cJ8fE> zwT?$+so6O$!`?fRza6{tnK%#H(NtDO7NSW_IlpF7ZjbNhsoZ%yuKJ{(W$tYJ5R+WE)vgX?WmPhrKHg_W z++bU_ce0i`M=Gj`q zbuHje6)&WrRq!D2BTXeFCDdj)XenA&u)DW&_&_I`g4I1aBm~{CV%{_90r9Ctcp8l@ zKy<4%Y4IF%KVmXF8>)AvOL+Ch6XY*s*5a_3?Vpp9zjW zZk&$l#?nv+4^AlQ&XCd6&ZM&Y(2faX+T?gt%z#et5)4ffH54R{M6tMkBCQ}aV55&$ z)a;vuq3zaPLx4%`!}yDoWg?jbAsj2vS&o+-nW)C~_Sf1U-Fofpv^kCUxi>#@Lq!(t z#lz>Use?aTn3El|cBB-!AS=xUU^TE-9~|;c!osOXzE1+ zkn7m;NrzA!Xmi$*6~r-=5JCfK{2_oE7%{G*l{!Ltl_MR0|IpRz``nb6{GM}Vb<}wM z(U7a$)H!T^GBn*?S+p>cB|R-J)TP)vlMkH7;PW4AM)egrnp}lNWWsGq(Q*#-h~v|s zvM@CyVzsRjl+dffpJsYc%nXf60<-{XI)MW$$MKf*AOYk$Zp&h}EhfRhX7C%+Yu4^O zr`%z2onuyVyNj}S23v8}QpHPg%QrJ9ALr z_Du?n45DAxt!fs#hm zlB5K6T$U_*iCR%W10dGDID%VKT;Ocikvk}{Y%)mnKv#E zbwR(eTT2_gY4Y8O`13y4>8#fD$W(3i#caf+E}1G?HW+7Ut*&JP*43s(2TMqV(D7Gl zW~AhRDn)$w1J==4AykmAxb&6PLZZAt&v8C{X~(1nUvfvdp{dT(?PEc^q|9b_R#QI( zTJ7D3LnaEb6Z^Z@J2M|6?dlw6CUS&85$6>_QUD_0wG%W_DMHm1Vo$_se7yqx8fVw9 z7jEbsdsJxy%k4aK>UeqQq1$;??|Pgz{{Y<;n~Sver^hY*nZ;AmWV;flF}UcrXJ|o5 zh?6F{O|^~Pw3%G2H7sX#$kkHUQBl+BhBaA;3uzfm5>}!#nvfA(S0v{KnIz=!2dy|D zJF5>AAPg3O)5|pB>HB(2O^e-KeY3E*sPlbonb`H4#*V(5t~U@VEsyOmF#VRXLF;C}SJ$X!qGQxmrBl7w1&+_y=IpZhG(c?E}D`{e= zWXI z_>Y(K!9TMdDa>k`Q&fY_zq9sw{Q6R7cP>MJ&{pIA*KFY_a9FwK*&T7Uy4P-F^EZ-hk$J%&VvrHhx zS31)}Ssl{FhrNX%gE;|wsmDAkTG0HueNoY9SQ14^@*igd)=l?RXtyp>yBC44+O&8r zskA9Da&PDpXm&){ib)noqr}g!Yt0=de|7%<0Ni9L8W`#^$jHo&d7xPoyGll_Lln(C zhvqo?j;vfNL{?K%T=^5`K>2xBJq5kJyMMmazsKkP35A-LN<4b)JSG z*V|(oMFm8=UGdNZlC7ze&ry_ik&K1Qd+;@pg(*@`+4g!46dhMU5u%pu95YkL%#%`U z>*dfVvY=|6*NKcHzPgyeL}IONYpCk_DX}*nLw|ORc^_Xsnsa~%sp{6Ttn*P)tHNoi zl_T?*{W`yE#->SJgb8K+M~i!OP?1&b>W38o^?>*F7hKWHhotUW{i{Zd@zr868`CFG z8%ZvuDkyPP;+`WIZfv60HvId!lnOF9;r^l4s?@5Ao*$Rz*DOb2ZSCPCHG6w;VmC#6 z(90c7M42bZWEweG8K%=aHBppU-r$zGzrEB0;saI#%ZFR5(SX6}6W@9&Iwpci%Jn(DJ{j7gA4sxK?6$j z&*$4rb)lzQR>pXAIdmCFyJuv{ET_c|ex0RzGLRNIPKen9IvEXer%$5Ege zV~U#7pvcRc+ZFO{l+VS~wVPjNZd}aNvu>;6rL4;5-m?+4vzXj|Cm~rwn5QzftX^sA zq@bL6B$fg~`&__)Mz8=Lzv|=j=vEh9SzPvzE5^9Z51-lwdQWZcvEJK@Z^ya%?*+c% zS{!9&*V@BoZB5Hly0_I-(3x`*n(eJg9UU&x6m?V6)@Em|@P$=^L;#&F_A_fW2A{Y6 zj;TV~Ia=iUe&6Ic^%FKLQl}R-=-gF1=V{|8u^Ecm9g`MU8?!KV^HCgrFAJB#R$%D1 z{trAdILPTL>Y<~NGD?ytsFp`8JnR~kJ>FmD>)s;w1+I8k&+@PQS3-`_$9CJ&?~K;f z!BF*%duQy5%j7S24A>7DsgF@mq@-h_BnwtngCdpsMquEOEpd zMq{?CRL~=lPzUpm>&~^73}*R`_ylQ{d$E61Ht&?$X`Et1(>$o?R6qP$uZS~In z$nRX;9uIBp_%bx{V{n^VZp6h??hK|6X+s?JpKy`G4lF+D3{GgbEK&vpjnC zv|1q^XOEqIX^j5>vC@}k?0w&yr`(&*sA&67a^m(b;on=2aZZ%GYY;Xi4NVH;skfy^ zXV%qF?ak|)%SMy^<~JWqWq4H>0A}L4WOYPRd`j2QeYNY=Rv>saBvPO3WYg!=n6|G` z?${lA*E{l8FS7Q>T}hwpy6x4mI@29d9@(XtB*J2_6c`=X3QdX2W~yh4@A5L#JU3Sq zvX#;=gH@^VeE522`Si}MHGBbDdE@yX^?CFfV6eL%C09p{+BjXwTbkaRvI-rivs*nL zO9z75IEskp$YA>;8!j&aF8X||F+A}KTAD<7pm^C5Mn?A0MJuQ=)xZz(*U-50s#-|bRr{JVM5w44u95TO#PI6T>W#y2CnkUrYsR2)^{M>& zN$t+Jr|!+qyD2)us(1eYU}tN#Rc23h{uT^oxFyZ-UKA*R$0U-b`lk*Ksdgnc1UA>yDk)zn#w{X^`;@Q|ugS#raw{2y2 zUJDJhp-fz_j>vAExwdI=yS||*#IocloX|8C2(V94GbXdL2AJIjsXYcxeLTm^9-UZL zG6*J~dawx}Dw9t`{JQT6QPTUKyj1p1H+0kFD*nT3V$-20cGd+k*jyDmPUBq_|YjkbRlZ#FN0E}uljyjJO zkd-3G$|MUEu>k(`$f(W_dNP9D-w8YcBjKl-@UCmqV0R$^Fkom08UsU6b5q10PL&ug zzS&Y?Ht%ijjKIiKG=Im^bWp1aUlC0!+K05^-#oAbng^HD0vN49K zj*k^i>GwWw(l&(5Xh9@6siz!aXt*Q!(>3c_qO6M<^1uu+^Qp~!EBOwBy|LMNt+`1h z4&KdTHhi0xXXT~s-R;~vV`}$K9EiF~W# z1K!Zl)mtpk(0As3}J5T~Zralr+o<|z`(!DcwcI*EDaF`UA6DHW}jg^Oo z4YPI@+RxT+eVMlRbvzPQEq!p`IlSCCI&AXQHC|Gy8w60zJBXE)kgvS~L|Ez#GQ?N9 zzGPN_{Jgr^Vka#{@sG-s0~D{9%D-<$Z~1v<=|6(i;$UWys;57?&)sXMN>z_F*ZD6l zIs;9m2x4$1Ge#!%x!6l=BsC zHTev6XCD$fAG~+g&Z79Kwt53@{LbsloK(4bj*r~CPa(Rnc<8BQNs_*YD?sp6ZMfF8 zJc{0U$ds{5T--sp?Uol}E151{8JJR|I;t~OAo+QY9C-CH*k5ij#)ddG+eDyew;qL# z2>BYg0by|B@b#AdofLu-=Cz+`@e0?l2Ss|AL zQAd4gHk0IH0_pc?Lg^wwS!i%L4@36Xk6V{di5OA}tv=K1P&xrBBJJ#q5&8Z;?rL1a z(HJTwT>TAB*`=rhLCHrAERtlt&Ng!XCOmyFZ)vp36h|`ZYWZ>h0E_C{Mo)+W`2)xH z{{WYxP4PD!+#8>;=Gq%mHJjg^p^x0VD+#cU(V-ZP%^p|RJZZ4AkdN@vt%RdMFC5ilpaS*7Ar~vQZPU~KlMuEsB$4M)RUjWz zTn4UuxO}?TCll5k%ZlGyw<`x#Zu*%zZ!=9z+0=D7lHc8Vv6IU_Uk$k6k-$?fJtUSx zcN53!Qow>sdA+3YO2~`>NMT#mgkzeLv$AU_T;!-ZGfRf zi%@Ij>Im|o>vL|0>~4qej=b3qQ=7unZ7Q4|CMuXIg*8gjLmeD3_-N@*q5M{`01FO3 z9`U1Rd2Q|Dg6L_T4u=4d=SDtUaz$xUI?L_WCrPg4F>7koNy?mJtT-MW5O3x;@EafU zx2iWkT6|3EC_5Lspsb|L?JRcR$YD07EgKnJkPL?A+!;EoX5GV6q!WeLRXSbdRkrOpUfkuC)O7R8$rNhy;3&GhTtb!6QpyZe+Mv?xS^esiu+*PLsqQG@#E~ zWcJFsvVNp;Is-6UNLAdjj+qUJlUqy01dRdk33#EY> zLU1a4!&5crt!}-Gxau|)H)`)pWoFc;-}}8=Y3=&e`+TNPW#Z{0T)yyHNr0*t*2+wf z#N|Mi<(A-I+j~XDyl;87S(R%`Sb~=n)8dkUOj8DnmLmY-y%h5l7Z;m_p5wVr{{Xx$ zr6qyM&_*4-3C@w`Gtm6i^&3YCwz4~Bc|OjY4^HtITBsz{pT7u7pSAtxic4NVKQ{dP z5N*Ndu#QJUBrIwN5kvm3%c7maC5Gwk;$lFhKEeSX%b>UYCU-V#J-0F2k7MRG{wF^K zIlMMno}WIkW$=*IJSIqGnpq=CDVuqe& zHiX|2>6Hsw8%8+=~hN8ux0cBlF8iV zR8fIJKua2cPuYXiJWlSPEtT4PqjuEpUH6Np!DTiNU2Uo!tLSato!$H0Y2={YiB+=V zTs)ZFjFZkPvDsYR6;*WZT2Oqqb$&@CiY+g6t8E3&xk{31= z*}ZZbraGO=jmx%1lPA+VZxNHB#q}b^OH$C**W*&Qc@Pw7fol(2f-P?47GbTXxRHq} zs|_R-MRN+$~Ikq@^uQxbAi^Qsv@IA7R9UM6;MI1_IiP$f@mtN2tHXIbzii) z?z=Oe*|}8tH8NTRkBsB z3jmbrx?9?f5<@ktMJ6k7SH=Z&y1P^%h?#7Vs-gEZ*duQ#g)~2oA zJ8Fv;y5lm(LnS^MmbR9qoSL^H;Xi{Jj{3!hl(=O?W{gU)i0E2&3P3^_0V24N79g&i z4wkC4CMksa)-)eHWH$FnQaL3i# zw{rLPA1{T)RaMm0?m4l!dKmKge3m*VNU(KNRSb1UiQZ!y6YX`}fZSZOO$$uGEG&{S zC7Vy_u_CP(63U7gIRJtONMaDEgfxz@qSduV7fWd)Qqa*^kHilI_(|c=dxU(N9=fEbtcQC-J7!?M@5;RcWxZ!%-AvJD0Z3HTYG6`jXW7G%e%Vk zcF}I0#>3iy+w5{w^OKLMUo0|8%g&F4n~}S>GRbXdh|0P|a!ENumsch!V%PnoV+=Tz zGyydv5L;VZs1i(nP?AcdVX6Yj9U3UwQHIrr^!@fv6PcSt>po3-u-dlNohQnFC890Wnx&1 zX3<{>SwN!6mI#XFNdPeer`6{Av8qBONY#KLXz|p6K7wcu5J6%{7!^GU{h_)yPVvv+ zv3u{dx8Cz?1wQRzp1}3PP-HMWyBms*EYDYBdgJ@SNwsP5nDvd?ZN)~5PoR>5V4wxI z=Hk-A3mbruvr7EaDVnAPD6 zkOAY2dGwCilsl)cGh1u7HWm*JyY{}(z~*%Y*({>o6)ml`3#PcMAp`1J;Rdq(ISx`cr2{4h;igYYM6%jR zGl;=gK_0W)6Dyo3dWCjSXjF{xHLp`f&&F2gH+C<2ZH|-b-O;(|==&D~mfjuppV@f) zZ7%J#Y`9IPh4=nDf7a)*vAQU$b5Tsy1?8AJ=?iAPp6=$ycf5$Tt>h#jI`nIc^!#^_ zv5^~H7{tp*D?qBeX&t<29M<7#ZKUws6jj^t7{bs1pil==0N@F)U;ok8I*S>I%5J#! z^*;FO5n8+N7l_Gcv76&^^@S$rq?;dAS-9FQ!8R!3lWf$?1uWUtq7@Yq2;!rpW%|2p zd_fx^J`(EfB&|RkDUu5xgbK4BIHy}^89YKoNu>z^=t-tN!NeQ^n)Ilpuc+8Nn!f{( zq{i$_25)I*zrEOMOwP#PorkqH4Guy|nq8}~v%CKQ4lDL2VCCmNdS5J&WoM<8Wga#@ zKXr{Nk_lPrG%=t7st;<083j%qSAh7d!>9Z|42dJ8l7d%N2|@_VQ-L4C)TMZO^c!v} zEN6=?UyRwi+KUTOxGC}#yMuSYH(zmW+89DpPer+Nl+^V2eZLlADvd-ZBS#R)PF0oJ z5Z`qHV-kb|StCY1T1|1NWYY)FssLmx(8vkXN>?8y1Nl@EDUOy@G+A6W_o>=FU$e6~ zSo51on!gj)Cw1*!&#uc+tW^2A^ZUasm7_Rauq!F?i;&5~MzGII3?i99jfypvmAP8r zWbmSZYCE`)IGn`D{Mr>^<|8667V{lv`^vw{%eKjfquMX)2|Hl8TA+1c)}G<3~!6@rDTFN{W-f zcSzO9SFZ!-z;wigC143)yjW=z1O4_5a&ccjx26@_b=jO|@ZOn>rB?F9ZQa9#+Mnq! zX5eI>tTFj)j7F*&?4D*e#Wb0E1zXV2)6ulmv))-*V?bL=AA+jHaWn_Wf$8c-Kg-ve zRWwjWy)`OnT6qcq`*Ti|ba8*Bec!vNr`uhrxN{lJl}m%$+j5eV7rFZuT!sh9S%;p# zd-epBBN2(GYEQe#$%&_oy&zgtQ~BRk=Ur>#rEucrh zka3?y9)3cn9W&zTx1K{6ySHXfBiwOP?;08npElyaWhUM5!AG~6owv$wtQCCu4fnWq z7S*K%)gm<5^_^BfDGG`!AaaqFk-M6{pn>c2uL6IcO_wU@LW7_h4ivAD@&xfc2bDN& zzl^MUjCS3nt)C*8Y77QCrl&oR$VC)+NGY*O2?T!920`e(%KXIj6+Y?s@CtUp)%t8R#Pm6p3zqxLHL944xvYPZ}xz0E-=K zP+%g#1wqXLr>XOy9;2jm*t{^^nEI{BEaDxJw^robIb2>Mnt5?`7>qtoBZ$Vqz2Mqd(P-nYsKF%whuZZob$;qWnKF^n}db=lwO5?QCJUu^Y`E;D2n{3ey!B-}VEd}d>C?^z|;`Al_P2I%YT&cUIl%H#2|)lt!4{{Vw$vKhSV zD>S|;s{a7BrV)jbRVu+ovR$xAr}#cyKT|5BJp%b>{ww)(TX(GaIsVoh%oS$09Yafv zj!c~Oual#qgfh|5{gq(`ikYcoQyfStXwn4f6w9*X$y4PG-D zvs#>Qt=&=g6#IW};*8AOga6&YbIV;O^?6^**phiV8$3N!jrn#D<^;Wg=uLJ9xAG41{ujU{8 zC;M=9uG`$b&G1)$?wsrFidwAxPpWr?TnW1tgBKfBRGp)_XqK5XHLz2{%(Rolrf@8* zNw>SJ%5fH=w5jzSC^7)6tw>^Vr#1UQ{{RnFWs&Smw)gnmiOXhbp^I`hW?jFRXOHdb z6DdG6Nm5XSYFV8D5-SUd0}pEM9b6+MAzGBj^Xp58ky?}#r$p7zw7_YM$hwJW&jFN$ zatX24SY5r-r)WvxPKW;hjTEp;+xtLG_L3x3^)(egd|4^jr5xG@sP4vJBMm?8cJ_{X zi)nmDpr;YhPX2W4d$STj5V!ab?8iqJW4Fg;R#a8?rXzpkYP!#C?nT=B&u(CL z%o`r76-!Ys@a?BeV%^*Rrdm2n%C&PriJ`4@chzt`wYHUOG$Nv`PaJu4TgX73Q`&qu z!HSQ>5=~h7@E@~>LH^^$)zeny_YTC^+uJ3#Hm2mFUBkcgG}tb~-pM`-2$SI>pLt<$ za&;{>-&v-N%K}R+ZG5N2DSapk)+O~R`26dWkL6B^{=re8mjNZFn8HdX5iR&t9GcoO$X3m}E zlFsc-frPpjh#rl!8WA^Hauqkog zOgm9wp>s!0qNWOJKmbUFn>iaf6eV<@ELZk*tw;%0;r3_pKk;8Kl~{_MrCG82D?KzB zeEd6i61{)4b{AZ344f6%DjJ#zYBL?JoZEZDY;P*O7T4Tagi4H@w0SIMikFfk^tH#e z9aX3lUI*v${{Syu$xTB5n(+QrsNv<(Dh<&?wO;{EvMT7eZ7m!)_maCmx3by2ht&Bk z)Pg*w%fRgo`6Sp%{MJV!2x+$if%iAjPEk;|wn7pKcKt)-3CEY%dT|=DvXjJm>1G4w zxuEp?`kArm6SH?F&f3y!&8LgP;&NFWX6xM;F0 z1v^DVxR@h{6$vjHu)nv7Mhp!FKP>+Mm+b1VrGphGh5%{|eYpE;$E%o?&{vib}>cLaj<)X=9 za_~y>W5Z@@Cf2fZpsKEd5>By4(^>&QE9X&P@co@9N2G~IrAgvyYCSLq^7H8l+1vjB zH<^+g4MjW{+)mV`lpUAXJ9i7Qc239M@hntWjpL^SQ=Ff18E7Sl)YfF`q^X{!X(H62 zY+TexR3HFz^FK4@Pxv}=QLT%KS-;Z^k5P(ap)P{EvGE-XmfgE#{EymQ2}cCmb9vD1 z{p-25{{T>LZRfeFKF*^%wPp8f zP+@7>wHu`@%kc5hznJ%N+!uFZ~mm>VTm zx-tle9qU~bLhN!fW$+}u?=QVG7|9iOr`vB}c^02imk zV&d?%V=~ZXn0;=RqpMpovh95p^Cy~Y2~z&Ov5`E^(E0Z||tfZz^4Zyq1!>xT2k?VsZq8q8)w zN9=5FZF1e8yfe7mCKInVp6AcY7HWpSCBL?fPUhO}x1+3OS}JKV^ru_8m{@|N&cTt4 z!m<(#02HD1p{VsZ>%yo?K$J>SnI@x%P!K&4KK0yXl?t-(9)2up6SYvAS=hMF;v* z-#vwu%FPxTvs2GkNm)y`qroyPYCP)TSUq7iQA0BNl3qM0zP6f&*z# z-xiURii4h}OGxau2;kE{hX{r+Dk`DyWbG^gB+#iiraoXX`G4J8d*pY(-pK8*l3yM- zSH^t)``Q_3`unE)I=+`HzOX%uj>xV%Z{+qpVTK&F6+KJ9S)-l^Ci`D0bG|6bh6$!SqP}shs-{b zP*7H(NyRZ-b)&X-xqEjklv@jL?p)>%1wjjAmkYDys-?*0Wr|saMMg?oSUF6MM6wg6 zH98|pdU^IYl1~Ywh&OVv2h^I=po@~yFK=xI27klS0k-#bd`u>HK*m3T~L1j=#KO;`OJXQpTIQjIR&vnmn?233Z`Hi31 zn@XF|%bcpm?i^)3I2@$YR{?5hh+YhZRjtMS?@4fI2>^M2hZ+5yS6NakB>~1y^7~I$ z6a11sLSnjK5auvb;%WC9M@|FDQAiK(N|%tt%tg)p zkZ%^37vD}|c4=W{kT3CtBxyDI8t2S(f400zlEXZu42o15U~s|o27^Dh9c}Ttetmq( z%83lH+{b>f1yT;Ntv~}x z0Ya@!OiOVjk509c{$al$HZOR5y5C#dtFzh49jlbW;Wou?VwS424}jj#?A&y?**Bd| zG8tf&rfjUCqc2ezX(>`apf>j{U#Eq&?KYA~8tNFzv#*h3sGx5(L%{H=w#nPaO;X{E4uwQxm7TaS?A)=xX`+fAjN zn==m{C0N|#5EN9XJbxp{s~z~+^PlH0Y<9l(!Tf6ZBTMnNyv4T0HxHM?KIF}BdTQK| zr>@6g@zBuLV&clsQo?FVRXRlAC@xPv-n!-s3n+@M%17Zs#RvsaqymW<(koZ3Dltwy z2c+3IZ{B-+J`Gyo$RbL+7}RQ!z-j;xc?x9XqutwI%bUDDY<3pk%>1R@osHYQc}I_u zpL4eL&&5xj+%+vr90``9sl-5&?1*V9!!pxTYJ|j9Pt(|G{l?~I+FH`pjJtp%x{Kk3 z{smt_{CPC;=vbVe%jP#z5Ia+^Gg#gGx;OVz zZ;hh{A7#Gpu1d|zvuiff)6-RK+S-U#D64VNW5h2#AgLL^fBkmo;uI&$r9aX_9^(2x%3s-|sR8z~KFQ9i0BX3}KrB>p} zQ(~**qN<=ZIf{8IX%?9(HPgXU0!JznCaXmJokQ{LUuYY`C{)xj;r_4N(M-+bFmjY6 z59QI#tnRIsL5-RR+`Dd@9MCFMR@H5~`JwPsr;X{Lb5EuS$^4Bco(Hoq#SWxFjGvdx z`u=?+kpnLl^rc3BE{dMt-5U!Fx@mKC$sG+QDD$++2 zYIOxx{M+935Q&N}%lx$e01s7`HFVI#{@#jy+1(Ol_Xlh4ybd~tKTD6G%Q?;B`#)@S z^+>|x=%=R4#fN{_pwfAjq&)OL!>J9PO+eaC>1x-h0<}rJ>K0709 z^{UPxO}V`K@@Vk;S8`Eh>t|ZHDsfWJQ6V79plTlJ8~(iaQ35wGX&Ei>P*zzZbrg|U zcG0LsJ4Sk4B6w*GG8)?PGyth@!lt!lVe3sftxr!`7^wR18I0^0`X--qbzJq})9+s7 z+!#zQ>Z#q?`ba1qdH3H_=doLpdF&b?d1t@~ktrTVf~G+2b3;qWq`HoIt|dw|%xOcW zv=J8Xgtb8;rOpow^<^5Fl30>GM?z^WQCyvCO)Nzyu4pM;KAkt_@*Ddb(it7EK1*s* z^=@B!%>7+Sw7TzR)op&r$YOFYTb+X&y0X50(U2Nw#LlTT&`6PTp&6__V%`Xn>um_mq=Pn zmtfQ8H*Hl`%-nPtY?9)3HFg4?k9+KW;T}qkgjCbxcE|TrW2@z=S#3_h8~bTxq<3wv zNuSveZ@4zz@!i{s3O~E2$I6RB{%4h)7!~%+Z9RlnLJM(mBpSRya7s9cww9IMGO8HU z6)el7if5-vM{_i3B<3rb2r;U6D>xM~s5qz?FIuXaf_iV0XJUG%va`DbbMKze=z4l= z))qXp)pQ%59oak6WaT5H$!!cl>D&(Dj)EEMW?@pwnft0tq*#Tvu3-W@Yug|m8Q@on zXZ>9npoXO?7yKwIQmiY>uyOqY(WPbjtk3C(C#O@8TEp0SPt1TSum8!?nD3H$NlkNB= zi(TE)mzu%ox}~VoCXm0UMq;3vl@9*^s7X3T0IY2>@Znccbc!{EC=`sEl0el;_pnp| zigXL^ZM{*scLfz@4{i0H>w=$gLAEg4;~Tv4_`RvUva5=5n%p(m-Qi!ha&*{?;boSu zDrvFwaLWjaFaRLZR$F^#g{4^x5utZYVS#4tT50ZN1H)xNbgoIRdc1IkWsW#}7hwIQ ziYkh5$qQ3fTDN&TDUO8Nj=k({p}T6f?iBYH3wmcZV{PmwW#h9uBeJkL9g~vVbHu$z zS(5AQjN20njog)xO&k@o<{+)6q|&lexxL&BB0D|h#HgyStsjPU3t4|aj=spyWsKk5`Kj`oVuGH&qcK*ph@MQN)Kpc*+Q|qwPvSMM+jTVI z=7lDASx{5(7TUpR=awi-$kL*gjHg)~7?Bp9-sCfP9(8Xb@j$5L0TEQ9H!xrI9-HF-Y;YoViO zI9Ey%2vP$9MkA$O&)=OpL6huip6BdpEPhvU(9=_9b{^~NPQdM2eV4g#w6RdW>aT8` z-5p!8Dl${msahHd=&~`=tZNNXHZ04$E4zKh$M=Pog!b|Haz#-XloC#mvHq+`gS3M$ ziClm|6m4g;lE!GQUs}ArBytWbQ;-YQUE7I$ArF-}bl0(QTgM5Ct7>XZ+mz|<^xo4Q zzb5nPDtaEO?|3kfJyO!P6K2a-zUcQXHIWvF2Z*Yo$GmZ})KsWG(mTNSxBHISeBwCK zAbI1e2(=w848A742|^G^s`D|S#YyS#v`c$SxQEm#Jn0iLXVSS6Ap{4YHDKf_uK;*; z|I*dkEyEUAS0x73t*OXW!Z5ggoWz%9DJHCr;_LlLXu8tZVgS4}C2P?R0avN#pX=`(JaTx0I zLPd@uBnRHqyX%EVh`Pfd99W(%qwuQv1D4G?YgVO>NeEXJ1cD70=ff?)frS)3WZe{d z%VaiVud~?P=G)v+;V7!NB~4y)abdUC^3QHLDIaf8Zta~*kfk1H1iH1{c>1BR|8i2ftMn(*t&t^!GcuZ9O|k3uO$Jbq`T23Kn5GCM=~E=reg z?c9dWsDh7a^`2j|cBN)6vj>yK!(F}WHm){mdX3LpzcLx~9JO9tgmL1gXQqw@m<3-< zRdh??)$68<+;rlaK+P*&?AObuAz)dQvjx+rwthb?UPA-n1Lt0obx`8=J{J+3u4+nM z;X#tl;x}I1#Lc~N`^RfbkVKnrV>fN(iY^ zq*sUyTK6kZk_IR-=f|ql1a)Prk_aavfKch7;C+0LpGwZe-dl_8c79&~zCc00v9q~M zj{6%5uXIvk#xv|8rm4te*1K)Vy*Ac+ZQypi*!s+2o<&?OJkrgrR%(U-DBCbue@u-? ztAmga5(wfAJiZ^FUWtoDBc)>`(;R%TM;!X~&-;nKV)rgxLS(JtWADyx|!ppFk_@OH2@i!C=?c~^-T|;>H~(Vm-C?XH1as} z>9Hh#s1v$c(t&BFm?ZlA^TUAa1bBhEw&a_qtv2R6Y-F1+li9l~sxh10a$U2%@tK+^ z6E~KriyC0;uF%L*XCw1{yHml1riC3uY^Xu?3x29bLb0I(I#=-hx#Glh@G-ulpn`xB zM+*LU74#i&&+W`M)5T*lZMHjas&_^g5uCx*?r#48#?o&Z9>&f`M@dPR*_$V4(O~K5 zy6!9ysGZ*@Q&C+FJT{0J=VAt$Qb`dC)NpPjR)p00dU^02Q&SK%(A3wrv?%%U)KBG3 zJq|lJJwcSB>w1mNusUXwcJE3x8($Te+ZlbwN4at|kk?Y}^VfeJ>*_k!q_%#}llWRo zo82>3WS!(jnpq@wF^5$cyDWM`5l|Z-8dRLnM!tBh4Jlr(jrwvOM2h5`061lUW_LUQ zG!*owMaLC@%3|{v%zhRfi@p1oKf3F-xNYCex<3c z**Q&_MJH+3Qeko#*}Gd0_dC08Rql!8t&?u-UA>pDti}o~oGGs-S2Qm*VkmSGa81Kh zEKz5G;Zt8R{;Zngtx8czncb9WzyxVEKM?~s^3O{>!Pf^dkjLP+6q{_ z>>kAa;$pGewwfAhiZ|bM`TeDghX=PR@y`NdcJwV*ke^G)jD^7W<%lSeYP26d2h1Ot zK3-jTWi@N7A1V*zYHRZ}`E(pmrc%3Y*QVjd(`9xx)2+|YZa&-Hl>3{sI^gBjqMo-G zLD%?fFvDlIxzDUIP(6Q=Xy&DLE+PWn>RdEwC`@UmcOE{zUuJsM9pACkIPwGnKHC2P zDs)_zYG<*uVq zo|w`qYHB*%qy7_RH^*M4>OYk2zxIxEBivcu=cuUOH53^r#F)*MJve=hQGmzFh*F4C z$v2*%7?+oZ{Ug|>#_rzRXSYaYb(h6+Emu-h&@Y&$Zt>t*boALDNIqXTF6M(5j7!w;6O48#LDj7ds|(9usEaw&v1k`>7JsP_mZuhho_ z!lxJ@{{Vo0hpL2;bQWCx&+u3L9VPbv07HGHbbFg;Z|;}u+B|&mOP9cI8EUXFRAVG& zT7j6+FOHgspu00zUyJ@dzGK*?*QV6QNIl5Pe~>5kQ>Px{;yomm3JAd!ugH2=)OGWv z{$kr3Y4yKp_nz9>M+n<)yS?|WW|ZxDqnmC~Pm;*VTRjdAXr5H5!_m~VkwnPFNe7={ zTeL`7poNP7*d$P&I@A4Ly&uJ?)+uC+B*jHQu0L;|pH*P03g`*}Ss1LE33oDBF!}@I z1OsnrdUMYp^l3gPM3ud{feB1q>1nePy3)t{@+CbZUZO{0=p%@m*bmP>*t=3;at?ph z{;c#L=HkPbH*&0Xh)pPHYl?CI053z=%E~>}xBDw|ZyIb?WBZ{6S6)_E?m00T6~W;% z^_z3}ZVskh)Re736@2k5i3Kyv49y#=At2iJO(I*XH7i~;$N9Q1o0xbcV-n8fqF$lv@uGxhnQNSUK`|?!4apm6xi*WHb1ADeHHCYUBR^gXDI8BWrF- z8DNg19~DIBws0SP zl8-61E3x^S4bjt~ECd z8vb?RUrwN5t766M%r{(S`a5i9_kU_;j2laOZ>@#dn}>8~wx)WjNh-T9rZJfv#ev%x znK4yrQVM!13FgR7?=+Ju8wv`YRbKBSo*uvPeR*0$CXGM^Yf+Dp<68Ru&YB}_zt_1s zYM_IZ>Em|qZp*{(e&O2q4F3T7DW%+$^m~7J z<0^KJ*67^6M?a6m!wp8ymj{QUt&;&k8P_9FB~2-*gVj{+Hl_D=W&{wO{{Z0hr{&YZ z*rHI>9tVy+N#XhDq%9KXHXh!@QsXN3#s?YNV-b*tGrT3<8#@uXb}lkEi#VAKPS&az zefQRt8-Ps-apkMi5oHP)z0k3)qH=LxPoG*=C0H2408a{5zvMkD*A2O-EB5sdQ|#%b z+<6VVyBiU-Gn)?;xcAn31CYeYTf4Vz;-gbni=o>aew$P6Su5$|$`PhJXD*%CTps{iEaE|{Fe*7woc{h=(3MN zQhOs4lh`@%=$cvB?&fIpUh zXG@*Cwz~r%)SJ0_vvKy0;R!8@&{VfnTBQWESk7`qK^!sX=fa<7On5AI#*c0$(XQKa z((^x17Cq zwf5%T`?`#-K2bq6ZXaaFHe#6_KKnH-N|>BMNEe1R@hGiTB@YUDeCRX&LDuA4AX0S$ zntA-QU*%7qP856da_%}Pt6`(-jK^Rm_o~|)a+_>mQ*Up&=#y?5Di-^!O)Bgx*I3}< zrkCvKC5P_hu9VanBpO&cRf86CxC0)4k@WTJVuB*-#;u0=XEg`Za3hDON}OdkUgkF5 z(%Cz1s)rriSP1IchirE~+Q@9(vnDGd(>+y2^WXWM;F}{WJQTGJJ~}4D(U};=vAeqY z3p$n(PDNUvWP*Pq!|ktDV5)*cQnVE-_G>C2V6?<2{{U(}z<8+hGzPpY(o?Odt9t2^clEz$Wj2QA?3waAKd<(N(vEum>&qrW zx;b#$7jV_o(P1#Ve-F7Ki^Wlu#nj1AlPC!YOM!M(Rx`%BA`OCmAzl;|rZ`fgrW7?w z1uo6xDML@Tr-pugK&IQ2S)AT)a>LfJZ2q#Q+^|+}d}imV-5cg?c57``E;lDhoZXn3 zIvv`Wt=FHeY8uL%b^H^^7fsPv+Cd>%QY3F2{AAFzMp%y_LBw_F*%oB28&|>zprODY z<@~x_O-a2w2X)bOolfY*?{2o+dtRq0h}m6Zy|&)K*|<7foQ++F!>;G;dTp^wRaLiZ zdP#8j-0mlEB12J+$kEcvE^BYeQ-{jeQpX2|qG*3qmUC@m*%va# z(b~%jKF67a54hkwr%{r28ZRU>N8Kh#7I)DJnI2a@-{2=}#LD1X$z&-_h z#p~J~$=ZE^+!_A>k{Hd2M?8Cvbk|hoq}*6s1u{nx?kIM)VmN1m3VN*OSc5$Zu z&+M)eXyJ<6Mv^KOO%(Z^AaOr$Me_cTe%91Y4Mqp2cl#Y{%eQwj^*#q|$FVlEe|K2sq_joXw}i%&b_aM9DmW|ULulBPzx5C9&^F78Y+$sjCcW?_nA zhmYEP`Uh{E#@k$i%}`VzYSd8I%>A4x(gP_|@*{KCzDqON{gG2sRJ8!dChyHG5!2Rx zz^W+VN~q#`NmUdSWg)G9ud;dXui4qWNAT-WL&NrQ>OOvMC8cSnCccD``#m~gtl7P@ zG(~E+j{BJ+K@dmXdG<)*OZcKx`~52dmNozd`u_l5X_8lzk*%rro|_!i8!cnFHS`4k z06vm=YHs1$%`J5<_uddaOc6m+wVB+WLYle=BO)3){C#xQGRzDPi%mniJ36CpH4@aS z$BV`Ql@o59y+Djcu+d^6j#<2EVn?AszYCl{@bj;RXpY6>aA&qg=a zYy@%JL{W5t6`Yn8;9LL|4l7Sg`gN;s$xn+^{SESOcl>Yc-Sv-;b?*(0S&!%*#8q5o z%iK9VU>8&fOoxBZvk5wlGy~ne6OdU1Z{dK!= z+lOK04p((-nk;2(xeS!la5W7sa3nCz6!`kJvr<+mYIakt9D~7IL$@0%nXRrO`g_#? zNC=~-%@mBb38)$M&qHOt-Nn>S%PUD|N+}w=BT?&x75uu}1Nlb$NBE!d>l<70!{<-S z4UN_ek>WE{eRoB;;G>@tE{Ub1qse3`AjoAhbrkSbD6Cp|Z{#90vj%VvUQYh78+Eyf zt+pj3s00ZlAc6xH_$o%A04Gj3nuQnq&TTg+cS-KV`^Z*_9mo)YAnpn(H6KiXPI3he zo_vS?c|Xhl0Ie~343ER!^1$}3U3D#14?BR%P-fR{WbuQ# zBXnjL7aaQ(+wylUTIX!NYhBqC=wn$TH54l%u=B{OoMN9e6K|WgsGoGS6K(o~b`Y{D z2L*JJ2>y$4{hexg{Lwyf?T?>3i*Dj+r^szhv)4O&_|6Vm%3r&WCA#x<5z)&?l@K+* zhGOWEywicHq+kI0`=>AMcl^0*)?s6r=95%~O#oHlq#wk65AEoSo;RC)!b=lpBdG+_ zP@^9+QRPuUGtn{GonN@Ok5nDEgr6Up+?4Uuwlb=Qx+PbdIhEw3lB!}HBtfsLz+T_u z>{+u;%_ZlEgefEd!h~b|{(TZ#8Kt&?q%?YFxUbvLeJ{kHmGM(;n)=*|SC^@*gEh00 zIV(krqN9`j#^oz(rFX_;O+9hxG(uWl&4l1r2j2;o|3ZDaK-@c^`{(}sBYbZi>k zRSPnKr_+O1htKUFWjY+^=`Hs7sWDO0(9c-VBDES+#`1~0X3ra`U2CXc{B7-I0L377 zK~F!krW%Y%12z8uRysjsei!zxf3CKcXA8UDUc#4rWGJ^L&N+D~aM=Be0->O+Nr zkM{wLn;9*;crj|svo4UlbsGNwW>3uVrhPNgUlQG<4#)IkZ;Q=8q&N!G*BR-jvO7y3 zy0)$hET1AfN3trmkV+kyviI)Ai*M%e*(|LLbi0#q(e8|F`OUMC#bfCx(u!DSlAfYv zks27|L||ICLlv*nGngVk3q%D_$hA~NJXb&@>SYT`tu-3-^Y_i-1L8ZHY9L}d>h2h+ zW9eEPo~Bi7y6&#TV*7%st0&bPpMK(+kEOQW_36wm=Aqp0_Hq9J6`N;eak&cI7Tv1L zB;iu7s}NdWD?4dEuXVMJFKzAbXF6=5Y8ikmjVLCSK}LF0B-WfLKBIo~PWIeD3i~O-AMJXeWzhZ`{7e%k`G%>z$X{d%l%S z(#c)f`_FsiqNA+HJuNSeK(oGKphc#m1#Anx8b!ES+XC%jCD;YsKUgpT1&BG(8mX?3 z6ym z_ue~;YtePBZ9J6|)>75MfQF{Fw=b6zz9W&DC8Se6lNf8awxkpNZN!dbbXR2vXiZ7d zCXvU*rnM@jwH3&q>e@9&rVs|V9Q)x$0;R?({Le9l8;Vzy@Ojt5$Njt|QW(?29e zS$*!qS+%`_2+~F>3WupeP=an1QjxTZPwJMVso(+6RGzPRlSuA7RbWLGb?Oxn$*5}- z9|{~1>(B>|eV=M<{Z2P6E+=PaAjj^^j$?3j{_)-!DW#gKr)5%X?VFIJrh>l#OG>fF zxR6IzPT=c4E2{hSvAxl_hB;i!PPS%k0b#0#3f^}ms$RFqX6&705e zz1i5?efO130jS2|qru>)D=}Cvyom&~6^JHAjzbKS2-Kf#Tgjpnws`~Y60WdN=!{#I zqCbSSB@JlVETmK@CW5jC6Pth!&?`_10_^zKbsxl{qMR6aRP-Wmedn<%pz6){gNBED zWiT*Fjn8#wW$jM3f}WcZ3jLK{PkH|UpvBpF>dagusjyel@Q@Xqe+rZzm|#P^QAvZbn> zLGVHd_UyV|#@LtFUBI{OplA)HRyZk2XE`l{aL5E2UQ^#>MX!W^VGL{4+Y)Jy4 zK&es~D5(|8RCLRa#q4~IB?D(O^Xv(!w$@I)w_;TGX~6bvC1XrlvXYjM8<(Q%w%eJd zS`w7>(bHt)b9tfwF={EK)*f29mVfORN{H$4z{mg$LZ1-K12PH#ho__=Qerflh>$AA zMO({6p^49lkg+jb3fIf8|I^kYi+OfE1bLkH>Bn`>^pb+JH6B`i(riv!cGB+b{z{sY zBe-khiz$oTxm=x3+9f}n%T$!~h}J|>%w1BYM2fNKVWy&ki6r@hlafgC9XK^fCw8h( z5IBMWz!ks)$O>fn^rq^}m0sJ!?tBK(+*_9k+B=dO+y>p>dow+o+}lrZW$QlLwvVZL z+4iLcMk1R(oQ}1pudS)bQT?G^En(_4tc?h@wXUsMTG6Bf1Oj*k6*aGSTA~L@WC|l0 zAb<>fd!D56-~b=Dr2h2790gSaij1KQ{?`1$rIx@%&7U5={D7LsIPs-&)(4AGB~ z2Zesj^v09`ODg_~-~b3Y#Z(V3EOe5WYT!1u<Fx+*8G zqTk&~lgrRWwd-&c&q^T~$5BBQ6o>7ioU)Z>nwCd+*;{}>D9T1baC4=+&k`v>IP|Jv zrJ{)*sm7+H0f1Kqx`4x+PqK1!82!(Q>z%%_WGbfF zb(x2xsHdx`<~ijPkKz)O3^BT$Cu=1t&InC4Z6nWxDO%FLUSq9Is=caIR8qVv^CRWM zp;vY7^Mc(;SK56KyJFgT-LF}?_6FDAJ-hyh_ZB;^v8dAIsD%ubS^7+Fb9B`>s+I#4 zJ!Mp-j1=bNhURSsM7Xbx2CP(3PYMjz)`0ck#$XFbG!g;9H8kT<^7G--c6m1LF1Hc6 z_l`>yTh;rMVN&I`eh)K&%;Yw<{=#6Mnruf{Ve#*{r{8^VwoZ9W6w#>U|*4ifgY5e+cvbT`~uV6h@4yq}GILUzs%0#QmOry+f<)`7)2UHy+*E z{b#spwpP>5VwbFFdbW#eb^icU)b4N=f^0Td4W7mBPRPkp&_g7HFJC;y2aLN1C)KkV zEL+H?nv4*9^wZ3FH&&LR5em>&xHTr8X0^|#_30Y$wHC#u!O^bG%jEO5Sv`TA&u*XY zo=-8hbCosGZY9ojmTID^48<MC0x0${`@tl*QqMHBtbsH3B%)`Vr^E zp1iIbSvAxT50UwQlDO$d*xOfcQ{Z+k?K_tpPqnKnUmshZ>fE02-#FTS)W%WLt_~cO zy@6W=KH%LoG;#j`5wDvS6PjpQDT4+mp4?-EDp^&DD_#{GN9EIz#x&7bG=n5H0n_<# z2g<&6=?$IQcxs#mbADjxH!T*_$5W=xmwHz2Y*kf%VRns0cimNPcG#Pirysla&Jr~Y zYNDW{t6Y5O15IXceqfqajw?!fRB=CNr&cu73hAnv`X8`y2A*dX^ysbR%Mg7%lQ$feis-1EJsX!jR3f&Ua@o#)w zvdc?L3~zRxvZ5Fvjaf)#XPuHYK(-%HE`7Zkok5$+rX3bBQrJCPCr*5g&-`-U)cu*) z8=D13T`fQGEY3csCr?#_-S|^F&sB)ZLXwXyG;)p|2$mM*4ZXawXf;&~l;C(**ND%d z={(3Jj*SsMgmE8dS246do6g4HS>3y}HiyPd(YQM|D~_6ZHm6r_S}nraC&$rAQ(2J2 z;Z~M>q;#;PO)W=~{un_lebP{_tm@hjFXG4_X&yt@raqo0P!;Ik(!j6JqIuu{0L_25 zI~Qs0j<>?+c3)NO&CX__-Z5zgSxTjrf`=moO>G1V z9gx()8<`S5KT-W(*WKhS>?_CD{GEAO+jUkG}fo9`U>{+ZGIlckoN{2SB^M_BB|6qg8Uz4_v6F1 zk%J8Iuc_!K&l7lDvAVT#V*~y)Iy8Ozxc7$9?<}oXUG7{c&(-VORJ^4g?v9^{zuNMp8a8$KTg~9e7%FE!fnY_N>tjK7on!c8< zdPhlCM~&DGI~5_AKWEE_`v$#vS*uXmsfv-GLr)+nF&Syta9ZjYbEWhwQfsq;&w*UtlpSc$xVygG!^tYP0NVe^cjgJ&Fq{$BNe6S zqR04ad}>6a#^igT1UT_4sPOr9W@zdJN;vxYc@lihddGyrQ&Lkl;;G%WRT#V$>{w`O zc0cjD9?)&SkceX{x7N_XXQ-gTP;A<)yGIPwRTVH)t#b&&axJx55Z+uqe{b3I>%k># ztu=X9g?&EXuyqOZSgo^%?5?uj*!tP`W>+%^rp4qjyDEIp+_?GPb2j1M`8l##tX2WA zEM8h{ZBdq^BG-|OYCYLZVD}-fr8EBk71M0MA{F=t+x)z^^!2wgn>K@P)aEj|zQo*p zrzRqSa8>wy+fTD;y6%rZB)Cc}MGhZuVscq-%!W!94O*C$q@<3ShmXk2TipT6>W~BY zSBU({{{ScF(y*Y#Nl+L`;X>8*$TT0HS$8%I8-vI~yGJMfldxFWHtx`@-urhIzwtXd zyLoOHrN?Ecvu)WD<1*NO!W3&5qliluHaDjXWAK7K_#o7s^g zsl@;w4@z+!y+2@goo7*1WA_%<>>S?8uE$|BTYql~7;#zN#>j0~%T)^eb!J`_&+R>} zxZuoEwHi{x6(o|uDXfX~l`iQn7!!g#$i{g6pKo6ARGCAibyA}=A7=x{=kn?XW=*pW z@)euwA-?wZGckb8?pm#v&^?Wd-AlLQ+%%B29v2~>%H-uZT!nRP@>Fhk@?qLBF;EVx zEdV8|Y6U;rAD$^n`FT^Ss1fQ4fSdr#xZ}p2o|Nkz-0KRx(YkPbeX{Tv-Sd{Oq^I3c z?(VW$ZNHtKnyVQt3_DA2jq{P)`&%!yF?otb8A{0G5lJ%6@k+=-oe`uVM4@9r#Qs8_ zXV0ftR=PV#2LzfQnF6E_Pd17~S*o9(sv3bym&8cE;JN zpC0(EE)#9jRiwK^U_(h9w6$$hJq1^kig;8b-O(KE9Re|&;D9lta2WOT;nOSxZyj*7 z#&e%e6tC^4LG=|LH@IG+k74z`3vq8c8o|DIKXC8P%o__Gz45eFVqD5*_C;-W7q7OK zBC<#OXhjssQ7mhC0cRmu4I4j(WOk9ffc?1i9<}Rgj~8<$lDX1zkGJ9^`VO0S*3sSc zxNMb2XlFJyBWYy!6m{#?`&)iuH(vG+S&uPo%)Tm_Dz_Z@je)f(38#!cM({?yBC5w% zyS!K|LM%8Ob5B8>^-W#NDzA9+0R5yIPzw5b$8*OX2N$r_Hu&v5%bM8u zyha{8Y!ukcMLT2YD)$EB!PiPW(Bo+pAgN~7U1E*NY(+r~QQ|uA-~jt^LGu+Sfa>~c zjUpgfLsXGNT>YQ|I%>nz$&h`;S=Z5SoEzabc4jP2;o2B%g-&}DfWTEzi1PJW&c7H% z7;LRn)6?WL)gN~k+mwys*X_j8k|G8|#GHzfPa2P3m!RsVQ$pIQ!xiJ2X1L+$=g^^t z?R=JaN7vMw7h>(5k(ZBYZGF$Sy7#U&mJ_hIe%;SPpL3s|y?1B#y9?Hm)MVm8CQhQN zhH|w8qN|2MK_sw+(!t$wS-Y95TH}GBI3!SYWmTAwBGowhP>lId=g@SL-dk#)Z0-!E z=h~an9j~-H_L`QmjP;)7%l2;2>3!Xmt$b}J+RyJ@$k_PzR!=%9-lDH1gr}>d6>Ov( zDhPPTsR{);=t)vTFw^+huV#FJKW|l9*0O@YoDu@+^#E}c^3_W8#n=h9@Ysx<1aw(U zs7jrmytWS2Oq?0aW*2+sq5EvLW_<6BvyR?(zKu_O+8zWmr?pZB)MJ5y7Jjt-{QNXuXJt7 z%;i=q7mmi@A)Z*KiRozR@bvUFkWWnnXp_PA(1<5ewqfe_Nxmz+w9)Dn@W|8h{{TPp z=n>7OzOQ1C{{Uy=JwYb5!Kkm7pQSq5d--8}`ObCc!;R1Jqh$8R#^{dm#N~I6d!e`2 zW70)Yu$w!(Dk~wY{xjuIv4bX)0Eg}YM~H*S1$~x&?YJ-rRh-(&5<{TTmC-_vI{6JJ z$W$IZNcNX-$!%jRAYzdOU`G@=1bY3PabASV-<|#2)gKl+Lu`E1?#__;AM#Ig?fu`^ zdnPWOo(#MhN*wJqPC0iMW##eFMT2kPkyg9IBr(R)#HkrpZ&24K?3=dRzT9qmjm!Sz zM_Cd#aAYsUflO$xml2wrj*K~%aoVr8`+Hrs)55qTOpF0krD!y(5^GP2hJ~|1*1TOI z*IR!#huVo-0Fp{fg}3g*@p2xtILwaE14O994N-1 z50I?~^XnG9!ISCtw*p!rg(x_hQ;GX}G}83`*np?n#p8!ULXv2YP&(PJ3kGQQo(~)k z>Foe`v?$eCeF-%Dyt<1eky)L!V0_5@@z(*=SSBovqA<2*)RCVnTwJrM*M0_(Vo%fC zPQeIGA-zb)Ov1|YDe+BzG0|}Dj=RKT@y#?5Lf2wgXi%UaYa89948&gC5`C>{ArZEg zOmG<|=g@<1c8XINlRs{M&C+AxM`LIHJ$KG0x%OHmc6YAe#bi?%m69lFD&d}@u8$#x zZ?!8p$5&8Px&}9sQ|kPCb{jbND1=UQoHCv|Sy&Ze_8%`yb(5TndEi)yWQSB`G%)o9 zP>_F!aUU=%)${J3mY)_oTeR?hEVoz8znk4zyS5$*JT4RBP8O28JF+ruH4Q{rO|yX9 z)HynA4i{+Uq>!aps)6K@TUjF3_EEU|eQUkCTTXt8+r$!?5~QQntnmOr4%}*eNa|9x z=L?Ot+Gs6O8>VnplC3*HqWGeOI0BkzY6#=jzaPx!y|-7&j?}_-G`P?1@oap1CuQxl ztNYd3dslDI9M~#pDB%-)gfh^ftkO4VHaEuFdmv z<)0y5qf4u)?Dsos`6OSdd37`J72p6KK}H9kS5NVed3A?Fd@A0!{=>-ZEYERI(^Wam z%fGAYzrB0Qu(s@UCJa6{gL1_6m0NQVuTm*7l&>Urb#tWi?I$C95hneJ-vUeKD?Ln=cm11~+Y7}{ORs9** z^nHU{7fEC~?_y_gU5T2criP=icWzg2rXFglzuOf%vKEc8bWHA^L47`-$GN+G_FG}J zVZB`Lccxer_Qtx!51OF!`O^cUIb^rotnK#8xFd8&4wX;{bsk5L^Up^seg6O>{{ZeL z@}i%4;kuVMjokQ3tMS(a$YK9p6FFrHgZWdo0_z2bDJq zSm#Oa7CmA*I?<$%)PSU58fJ&27n{pjBSP~s>87n|g#^$KEc$Wizjhb$#p<1*O@Pi* zPn#Pja8DgBe?7K0^c$+T4UILc17~P(_4E|-)YDK_%8O7G*_Y|hvl+d&*xJtQ*}c%* zp~yy{ECx!7<5rrm_2JP4%Z#PvhKezjEvBH>nz2>xN_wgws}& z^CyUjnhZSqz68h;t6@hF zikL@HQV8XLNk7xsSfTB50}to^Zk3X72sQgZ!_aR(cV%j&qRipwC8eg37NsLKGJVZB zlhq^*P>FVtmw-U@-;aJW20}vT_WuBbr-=iJJUqHvQ~bHv)YQhZSaG{$sMx^Cl-$7N znqmi$T?7I-Bw|jR3#dH%q7h7*Q;mPv>Z3W+R6j0~c}??2-1Pg+vGrK(pIw{AW2M`B z$8zp`o*N5#O0vN z&hXTB1XY#TOg7-#HL#UMqLPl1riE!)nsj*x9?&|K1efuGmSFLUth6)$13<|_PM~#` zrD(k^Rtoe+2^(OB6)8;6Qn@D#8iJTw9+jEh-MhCgH*9SM>+Y}HJ#)IMl8Xn8>7A>$ zA3fR`9id+Mx(RA`7DBfpzw+4%`u7n}P_tsqTDh5EDh00_#c2h@z!XDLl1j{EV68?g zR{?6c(p4Aub#(lJ?q!LeTe_~X5E@Vt2n4FoD4;kj)agC7vUuz!J)@-T=qWcQCpA|| zi}=T%!uA-$Z7l9jG4_(2M(>Y1O|~}H>4uRTMtHmxkx1q?F3ealEMgmrsO52O5UUkn z%qA+mo+M(r$tO@(sEmMXfI4m(%CIznt|D+0upwx_h$-}@G_S-79XI4@I;U{6=p>vMZs_(~w2s){j=1;ICv>o#E= znxnL5F{CO>KAi+BoJ8WGh+<6?m#4*niYuSf`h{I=U39H! z?JcFYQ?>g40IgSS?<{uX+`B7&_x{N4yxuEoEE2scZSJGnTQ_!NFx!c<5*X^%z8XlD z3Y#>N$)ibX*t@e_rm3u&;Zj9orrih?GRRZ{>_t_h1)QkCTJ)-2YE~Z!QsEFVD?u}Z z@U2aBg*4LG8R5`f7B4%Wi+Jxxk7D7a#nd%s>c{Rq>shgPhUTQJg=wejTplAJ6LjxJ z+!To&OTiomi8L7$*?p*FYuoc}XCg*4p9*StaK?*WGOUskBh_8K^Np|QgMy)i;xSua za#rLkO6_E(f8sN3^esr098~~79@>sYMYPa>K`eZ$I~kD~ElZwyG=kodojDR|QoQO(01Y4pzI%hU$WnvRuYWJ-(Al{=i#L>_+Z8)AHJa!R zhqfS(H$ZmY&DlG4J-^u53~beM84x2qeo@WPZ_Z(-3_=>jaT~AJY9i zLRm;REQ(olBT_k6Su!+&gT+*3)b$~B^>$}#iA;0qrB)D224ytVk}>@uLP=9fX`roo zP4>RQ$!s0B*R`9E4@X_Sca}c4BbeMfXRx}*eqnQv)m5CuFvUM!WGgpbJ2h30sbP~D zty0Xyh^!Q^wGeohRu?<0_a;#H9g;HubdgF(l76UiM{NK_7$a9yl_QGx=_49eBpQ$d zO+e7;Dl{1W&h1&@*JC4|s_N~@U5xCmuGt$8f29>3f2%tG0B=J+PE7XNCJZw6l@ei& zXJu35sKZJ#kk`FEOv(jBYVJMLZ!9O4Sl{X9iZctzAPqFJxh<+RHSw2MV={$!hXJH@ zd9@INW@l3VA}BOPV?aP`X>J5YYNV4xUYa&aQRQ+o*G%=h7blvF0ZFrWHWx3oDh)T5 z6N9bCzR{?T72ZF_r57|UEeNMA_fxT82}`I%A#ENdoG~zCQZ%}qLQQmIfN7^mX|RE* z!p#GnXagBpi7I~*FsMf06bgT7QX>@sbJzdW)u$I#il!Mnpu=swzrQNR+gu(~13^oY z*w}nNb_gir!{o72y=EhBSLWq}8v5$mlPnDKC_$KKT z9+aeupe(g?3&i|Y70KXO=AK;-yZ-3`zs68Mz;mH>+su)9UgZhS=wFQk=qcpQ|2=L zH(4B1+dr(fWE6sbd3N#reU$yG4iAp$BM&~*V$F2~E|UKJQUIjU__L;+cn zf~+Zq7)3l7pE5J$QPUkx;lSqh&3@?0VmEHi-MRX6w>Ou0Ww#RU$u~>a;TtD~*m%yR zH28S&8+&l15V~d6q)G^3P>ye*w=Eq@B!yM@f;DSlLzDPFioSe0YBDtlq=|JXs?)c_ zTF|gHqh_N`Yx_FOvvFVPE_b8Ab2wx4gug=iaU?(dV`+nmkymNR5wX+~w?CczL@mEyDv7|JYkicYC zC(%k-BY8t>EHXPtBkl4&e0p+CD1*aO;pEVrKvxuDf@*W0+tA~;Alj3*?CvhHIlX}g zSJdRcyp)@Ai*Wp?-kbY50!tP@u=^W(_C5-mtF}%OdE6q&I9aBFnn)>_fPL83G}d4A z+|rZ`0sfIA74qqpK*BZ4Fgd4aK42&rpz|NMpj#_dxp4W1Tn}sPJN8` z3LJiXP5sYQpqEsbhp&SfAdwVCuB^-8iz_C8b%8}tD@P6Y=A zBl*{lSvJ>OW~=v2ZYOVU9iN=bKecJ5+><6MvPo)pPVwFKat@hHPAPz% zXeFeLEtE$qvC&$*Y6siW>a7Ol~}G>+9U#W8gA) z-Kuk#8XdKf-I(o(S+F<1Sk@d}Q&qs(Jgp^b#FdqK>e$5bV5%%6y0~zlE|o4S(X#9Ct-s3(`Cg75fdda z519V|0O$_gbeLLvg-hcyk!7e6?s9TrYBt1^OAKgdr)&*mk5fk!EG-*2N0c2!K{oeg z)JMo3HU9uNRq-213@P&CPnSVOU3*r{OEX0h7ZIW}4N4E{(hA&>Vf{VX$TT4Jr{JV; z>1{(K^5bC$OG5&(#G2TE!us1ub8qoJ*kXm$gO0q0swz)Yy8i&PyBnu>t}n5ApM36q zy6hY&$is%-8%rTBGd+!qFG)5xBMmiVVXXyy4DST7vXpctrivsWF3`sHZU>I@-*WGGsTIa1$f=)>2`g|S1HE#ReKt^hQ!>%&f zrI0$RM6u+tXwm~~%;WAflu{U9{13F7f@-t4VU|!0EByKd`+;$zmM@B-XR3;Rf8^*~ z`42@lbG6qlsV2XcKf%_$wk+JAXCt2TB!CS0KbZM+lk5%cUAkzt&i?@Ip6aCBEqJ<-;pCI)+jslEffdh|bO(XV$ zpc+z?86Kby^7K2XL8di23GVwx%-26=J$ilG18U^AHs9JYV*7WnbM>|HZ5)RD-nook z3$-yh)uxjnPY=i3S7K)|QFY!PG>^lR$?h2{R+@;b_@a3NduoJ$!JO&Fp~K}t#PsUO zJ^}}TL7=A-<*a~zl{3;Gd2Y_u-nAdxJhn%4Z_SOdXWTn8Y3)i3zRzl%n-&?LKb5S= z)b-^p9yhS_c&sfu&N9r^6pZHLR@0;2^|e{EgXjUz+2_+Li5+w>2Q{rv>?eo%vC?;| z_C_mx*T~zObMCay=P5q-tSF(w=c+1q$MBY^sIJdec0S_VJ9B1j{8l~~20t^Ate#6# znHClDg;L;;SYTwM4=NH*%g}yj9axe=1pp0HKMg;@Uzn#^u>EJ)JCc3PNr%{yzV^dL zH&lB^XjJXVc5Vx;^7Qo;xhU&0JCAfr7DEU2ki7UhYDJJkP~UMi*r4}NSONrX;tm6k z+ry_Cs-?VMCYkwpj8q?=Nh&eA>2_{wVAFOM!oX|{jdEaxCVHMd+mgUxHxoy>=Bdfm zV>aaZTvj?HLq&JuT}e zrOssXRWvx?kd!+caMEo4y~}n60&Fj1Vml9f?8>yr`F8&0+_)XH9xn?=ji#1tRx24K zQ_;&B3Wg{dPQOjnf;$(cO#^1U1t~%N{d#gSq^2~SnjBN|>J=_itg)NRAyu^MdnY5; z^t3y=lO3{Z>h|Ym_AckmRACl*cgFL>O^lDP@Hon+t#~SHap^T}B2&rYD>v?Yu%vn# zGI8-10Fr)6JcrNi>5{%Bbw&f%h^qa7HEMsAdT*r6ygRQGS51c6dmb8Ux~b?k?ssDU z0DbzSFS~MB_|tIWw)Wk{Nsx}BF-nwBQPU$;SAE3)0J`W_{`^A_U1$(-{{UC{`t?{X z8n_w$FPEpE<>}WX$K#YfPP$f8lUiggRMI~V`28vmDC5J@~6wG5@FYV>`Zp; z+<0!Z**#Alc8eVj+Usrgwx#S0PT`*|2HwtYTz6M)4CP++%M6V-?LmwCihNj*`M^P` zjdaKhvMm#VHT3@gSCAF;>G;TvmP0dmtfW$e)p&tXfuA#)W3CuIorKQC4%jo{+C8(o zYq1rZDK>89+nuLVh_1;DF4)Fqx0ciy8dF`lDykY&ij7=EX&D5ES_7iYh{_2I_Ryd6 zdRL}bQIk%Vt9jS6`TBbFtj6v>%-Wr&xfic{KP$fbD{9r?IMwFr$(j}D@JBD z8iD-IbMxzl(Ac>g?)u%Cn!J8HYUL;!aP98HfqOe1UHm}4(dtztydSb57obE)yTOAc+ca1_R%aQfY3^S-jD$2$&n-;K@*n`nKsUcuQhm81YIjJKDuGIH zBkcM5p0w)t%9NGy`hEN zm1~mO`%@7<)~(HDvJlZ^XLCz7<*btA+*<)GF!n{ZqU#+mc=5hstMq_dQY9tam?F)aSB0D{HUq3#R-5XQ1 z<=mUzU6Vdy3`=Kr*rlM{%}rCh;G+AfLghCmQxgO`cD8EyDj5l<0z&F;EoSybywPp- z3i!GXe2L@3?cvY|oTDMOM|$E`6dw+0fn3&~l{(rJ`8@vsE1ie)FK*>~Ke%%h)tdtc zy)wHyZS{WNnmP>D@yg?;sIJUqvstOuRK#tZTyCnN7tJ)61A)n6ZnLBi!wZz~)iqEC zX&LxNi{yP+`p^zNNfwsMn|+MZqO;2urOg!;dr4p@Nv;C<@$&w=vt;@13ikTmnljO9@Q`TF#h_RnyFKdGADmV{MFQo5HFD_mpq1Y*5wnemfuZ|&Dw zFgsfn{6b2smU2o;87iZsY;wVokkv&sO+yGN>E(0kF2O^6IrjGFwEaY^+KSwvAcMlA zAIqrMn|T%ak>kF!yGVBhO($J+I)hc=!GPi9cpi@@v^vQkSYiR4r|ZUDIY`y>9VZnEo@N`Sc}lR!T&@O2o??Ee1%a^#)T)p3ez zHTCix0M)(kOe2Ox+ja1xDQM-FAxvI0P;6$7%_5l!{duwehuxQ#FX|ZHAV2N8yk5@l z7+>GE`p1@u2>rbj&D-3&=BGJb{73wQOp+RG38sL(COzYDTA}JvNh)37lKxICK9;w$ zs5YBKiB?$kH}PjD{DbAxqqci{u86Cj&N_=q8<%4A&Jxme_>R@lTfVb(AKza6>_w%z zm8*~{X_^m+f$7ly0GIabTSZF(fJ6as0m%RpO8)>#l4~>0G z*&Dm~yghfQWr#>)LaM3{1ymGfUx|b+ZJch~*`4XKGWjZvtyCt=Qfx}dax0G9FR_Jt%Tq&+ z+$zDL5;L_p)*~Tp?n0HVxBgn&H@Kr9Ea%~4qDE1v8GymT?i>lB>LTWN#8=CTf2Ex^?nwoZf>03NV(ywKmbz&t4=S8jr+0@k z+CdT_uAqgo6&#RNsxgXr@am?vhC+IJ4Z}{3k4Y^QQpq2S%dTYv!XtMNBE;nIK?I9m z-0(aZuOf9)A6Xz*f|JAT1EseiTxAgD6Yig+L^#K5T^>w6AK8(YJ=TgA(w@)LT^N|iCt3N{Ei z`DdoLQz3VdrnZtbQX4n|mE%xHk?DQiIA7s$O_-wXJ^kNN)z5*%)Moa+=-HUPqlm+d z?Ht}}-Mx; zvx1S8Rj^;=4jImvgH_hZ2K9KF56%`E2VcuWNsNWt@J z@z1B1LJ22CjXy;8iWBC?<>f*A{Q6(gbtc=y;pu39ys20GJP1VQIO%3^BPh6=XQP3&fIN$G_?u>th$M5*@ttMS}0S6 zrAJ0@d1^MRO9ZeY;yIn(_za+^Mz3ng|& zw`tX4X!ppdg7VQm+NsP#HXfR4dg!B(WSK~f0V2<1?CEUU8+hdsBLZl_mZMLfXd=Si+^tTYp_t)?0t^Cmz3^# zD>tQGG*Q*=8r;U>hMzl*l+dKL6XTpm9W_P7O3^59be44R?AcmTYRqa}uD2Noz8cjd z&X84b!-20#Z!AGf<2r$0?k2I;|f zHpiu+hh@_yMxP%;G~nOQ39V8jjy%TlC7

    qPJ!+FyPtYx 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 Yg!oa$=(=1QQdEsWz^7|Bk*{C>*#Y={nE(I) literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/soldering/13.jpg b/lib/ESPiLight/pilight/docs/source/images/soldering/13.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf3b5d4c04272b8639fc6a6943348519bb586ea4 GIT binary patch literal 412842 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 z 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

    Kb!HVM)i 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�eqr!Yq8vfmjb1&;K>px5C=rtk>Uy9@LA_6}8W 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

  • t3E}srMG~!tQ;iwwti&y6>ehSQ>2aMDO0@ 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 literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/soldering/14.jpg b/lib/ESPiLight/pilight/docs/source/images/soldering/14.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0d9e973be5f544d90d30640490a018832dfb3cd5 GIT binary patch literal 399551 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%0Aighx<_$m^8<6PQ)<%CWMJ$~ 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�h3cs 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

    {eT`-+a*=c0Xh6>;}(DkwHbas1xq;LaFK6N|S1r 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
    @C8#|Y~^BH;i`>UyT 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

    m|51o^nim47A%bWa4)A)~D)y)j_tX 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%0D(a@6#Y%NrhJ)&2 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 z�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

    D6@}lo;MFG{C~~0wT{{ZNAXbLk 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 literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/soldering/3.jpg b/lib/ESPiLight/pilight/docs/source/images/soldering/3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..edcd6295c429f06a474835ce66d3d508184afd9c GIT binary patch literal 381731 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

    ;e{h&avq|rU2qftLGuTs6)xq==IC;m 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�MUr_M(ihOUaCucI5d=m2)bn^74>$Y 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≦YELdunIA)d1C9mR;fAmfd2px9=rt)ok;0Zio|EL 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 z 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

    8ho_0U`H7N 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 Q3EbGyGTd8_4=nZn*)ZHA2><{9 literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/soldering/4.jpg b/lib/ESPiLight/pilight/docs/source/images/soldering/4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8e4292bcf5140b2e19f8dca76651d3297319b0d3 GIT binary patch literal 379501 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 z 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

      dWmb<=ANmg^_mhJ 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­sx31Lx=lt&3rYRa=b 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

        MD_dbT$#(=&`W& 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
        s@NV1<} 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

        & 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ⅅ_KGNGgb6zs7 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 VfF`7fi#GP06-v) z0Ym@*Pyzr120%chOb5b496}BNP!PjF`6uv0a43g@nC1}U%FrKToE{Sdf4?3Gn8AFA zi9yW&TUjv(6abq6gh9C?sDrCd6~sy)CIGQ9h^e9Y`|XB-m==0q8%_@ufwy1(T~OYP z2mD()L|`9@096~bJNjS`S2r+*OG=8U0U_HY02Lqb^QdCyZfg%WbaKbIdpo&%z*UW< z;QZz&w4J-3w*Vj}A}T2-Dk>);0~ZyO6Ooh?69Z&HLuSC9BMy(sppkaqhvV=_e|Xe9 zJc6#?&&PEXr+56YoDSGKTs>Z(40i+=fYi_fUvh%U^h10M#E^JG0PH#d!TBYDWZxf_ zpd6ZTpl=IeyhFJ&i182QULYnp!~q}D z-|y{#^=BRU-U2igc8KG^^7w~17c`0@`@n|lAf`OT2_UA*{xyb>+ye}@1V9flSPek% zn;ghHs3#TIQE~L+tol-y69~#inKh_^65dXgZK%fWnm=lyk5AibhL2X*#0XNrv9QOwI-ji7%R8`L# z8X0IHbk)Jt5dg@vbWvz`C=~#>p)p=Yny26vXDs1_?Vx$Yph2PlV1xAb&@iGK9l_$^R`xjr8!sfR-A9+TwQh-bfH%1+l9i#seq+0%AH_ z7aRsV2x2eLKoB$Hu;T$fv9EK0m2ue44Q&VN;B5A=bF;(YW)MgE`q+aQrVHY5UzEKc zh>I61jJ-sCPu0tJ_!IsWRAaK+utz8-XF9R z{0?yUxafs)bi%;-kpgg0Sy>slmc5^=Jq9CaXoGaI@v?)fy1RMUpf7?;=YF4Yr2rb7 zZ{eVmr9@?=qy)u;K==RL{@cu-TK_%3jqQQP^6C9CgD|}LCHqzOm&`pI0AyA{-^Bfr z+1>#F>@@&j9R4Na&H`7-s{l~b@mqfwaP!3pgYl3P7WVV=6GGV|g>Vl2x&2FppPK(Q z_^mx5Tzfx#2UoLqu<>!lz;RARy1Tmjc)`6rY>@VF!GD~@|I-D3GwU}yP8iuc*n8Qd z!KTc>S%yM8g2RorLt#+vXgCV}UybnpWU=3Dz`=ug4FcNSU4ZVq5J1&I2f!BI0C=>d z0L&@_%z^wIH(g>g0C(n@vriw)dk};9`}@D_ps`>Q>Wy-Q{Ts z7(@o52vLXVLX041AQvEx5H!RGav2f^xdBOlq(bgNiXi2XI>S|CteWVO}tdRLcAKhX1pG}cX(g$cJayaS@4hJ%i$yNE$|)j{qV!_lkxNMtMOmp z_u+rUUn3wOU?AWlkS5R~I78q}aEah1K{~+$f~N#s1XBd7goK1g36B#h5E>BL5Ml_! z3GWczCu}6_Cj3bForsi(ok)yGgUFHyO%zI$OjJztgs7WnnrMrdikOF3j@W?Mj`$*R zEO9PzJ#h!|N8&9KY7#yY1rieyXOb%=p#4ZkK*vXipmV0X zL03xGPWOeLhF*f+jNYFX7XdoV0yvynVF7Ro*Bt}ow4 z>?JZJ1|?}F^&}%CpG)pYNlST2l}XJ?b4y>4zAHT-LnmV>b5rJ}EWYe1*o}5zPRIpLFr!c7qSG=H@r8ud?p=6_!t@K`*OW962 zUwK+ZK*d?*zRKb$kyBo$s!y$}%BcpbK2?LMX{udUYgeaHH&stnAJ^d2aMUQ#_@XJP zc}erB7QU8_R=m~#f)#;86d}H7OKS&eH|vn;80)0!yw^RZ>!n+-2i4QoOVk_H=g~*& zV+{ZUgh8Ugm?58`r(wfsg42el(@uXf5;eMP)M`v?eBQX&c+KRLNvz3;DZi2otm zGb^(qvvqSd^91ur3t@{ui?%aNXHaKqEeS2nEb}c_&#IqII{VQ|(kk4l-}UHiF%1Ox8S#~-&#pJpY$qO zA~`dKB*iCX^0w~n+B@8L;_hsxI;Hldol1Lfm*sBM-Su?4^zIDhjIvDD%o~}TS*WbR zdz$xZvU#(Ua|m*Lb3Wyo<+kR@$6LmR0do-L0mrzFq^VxmfcB>x7-G zJyY9Nr(O5FUcSD%L8zhN5yzvn$Mlb5pO8Gc`ed&$pmFu7$J5Wx9G^`+KmUBB$)c&Z z`E+yp3!N7)TQpjlT2)#bUn;zO^h)kk-D{cG*fy!Qnm3Yfs^3b!t!|fUuj!EPsO^;P ztnWJ6^`u*=`&o}#PfIVNx2;dVudCm*e{jHRU~JQO^WOOV$P{vF{)6|2?T=SKk$*~_W}hya5u155t1;U-cXsaM zyvO|3=kNvUg}aOVi&aa?OK-kdeEIm*>+9aPo6AR+3sxjnp066Nj<30`ZLMGbe)N0c zhRjCmrupXdmftqv_U#>ko%&s!-O)X_y}i8!fNcK0Az0wpx93Vb|K)E0c39k zxC)RF5fKp+kr5M^c_0;7iPje*xLBzw&eCD2NI@bUuOK!b4` zcwZ02!zUmlA|@e){9`6~8wdN5Nd-XgATTH%6rYfQ2p>i!4rWrr@Hl8h@l{US&~kcS z5hI|BzgK>Wi<{o)nXR~lS7?_iAy0zwmv>*0-jWR26=A$;i6(aH&vP(RN4ibl+kdOP z+SKDSwXDH+EB9JeQgiQzmAvW~eIHlN9DKu*^J`lAKdnh?nmhVMq!eIV2d3Al!FxZ@ zTD*Om2np~d_f6msrNIL&@Z_Y$7rPQqhqK_BQP&r7ZrgWWp$V$S^hj@suRH`e0|8^JR3fOo;W0C6!gBN&<^iBzILuCW&Rb?;;!_ zx4ipgWlQx!sE&pH>>eOx-CF5oDbrSUWwF~1JF>7d9sFQ9O28pZ42Um#m)qJfv|UOQ z&19$94fPo~H!=5uKaOv#mWVGwE%@rDQp1uytA(e>#b_-LwrP!0_VmgPVu348^ohK@ zzyi}2R%to-ey&S|TiiFYMfWb>#@8d2?p?Yp7bN2PuiT?1-&xAp=-6HfqlAo{WkHR8 z_U$w>ili>j)=eN537kmV^$LX9XLBDBS^xZed{GMsis7Gf6au?~x`W3yy11)9F>b`EYK4$; z8|~CZv(|(chV;)7LFyw|DQQ>s0NK**-UUL}MQ$&RY$a(GrOfTdH|pBAnZqA))H{(a z23O83Xf-FU*oCUZX}WI`hus@lYf818{Sql3d@G(?CW5saR;}=AbZMSDUp=Gq8?n6Z zd~P6XKCre2^qhvYoSnXhqRy|^tZw)Fw1}9D3!E}rW{Fc|Z&=s^I-*`tX>>XeXKrRL z1PiZ330$zWLp_Z{MD2`~t?&A6mh&>gXKPzRP#fc)f=_eQCLlPbE#B* zsPEb2pZ$u+DNvnmPz1B%ps%$1_K{`O4aT8i;$gM&Cap+vgsv4gI+}3;1rJ@gfZbyI zFztO6#vP|~b5>5`Y37GY_eI_iT~#dOun)JU!uDD~=44OerWg?$p|wWFOzik*LW=19 zNDQ@@{?yi+(TNXvg3-!O%X~9y$l!}*W1GS|$FlvPzPGsyrCM@bXg7+Kxm`Flt7gSV zwm;me^^AiIPufz-#eRr&Il2eLAv%fKX5S1gIsRnHdgw)Si{zneDu#$~PfDb~H4Ehi|p zOCR?B0@{<@HPdg~A=Og*|}hS;m55#3#;tF)OQS){7!)ZNaw! zU%ld5$s&kbLQl{#*BET>#_M=`<8Ar*qB!ceZ0>HQFRleocXSmliRqUT4qFj~l0C7| z!R}6Xufg->^~c`!0~AU}(Gz1Mdq5(hoo$^xuOacCh;*>Tl3&9X(fyzS$$B%&2Hy@t zf>)cSLB116DM|H*$AcS#Yp>A7k!tM$2=;q>z;&- zI{~rQV0LM2(YHVNs(w#y0?WW9tNuBHMnuf6`BDKnUWgUKuM0jGl-$Y8Ht~TwFHHa1 zvyt!+88j5Hsd{@l$ktYpiTFwtQFJh3rL_Uw$7fz%DqdDU-=3``KeN@Sl|ul03W{R$ z()n%E+@vMzY)X{9Bq0I$BxFt|kZG-9 zJG56COa>?uAIJ<=)W`%O$V z%fHR*EZfAm9!NIf7(jDC=qO59{YXZ1G-ii`3lqgRD?hvx)Q@#}9AkjBu72fl zn8aSoU5bPsyvR1OizPU{odbtL4l<^oo!4tscYPx-D zc>D_CB6d9}vs@eC$c0+^xw57bp(pev(i^tfrwc=LC5VN@#w2>4m8~_PU+^oXP2$NL zsu?s`zYY2nNDw^NoX1e*JWUA2K-HdZ>e-BJN(B;}acu0hq{GMy^Q?|p>$)&b*X_1c zX}o^CSYA4@a%XlSxM;4kDo2aV*<;SPGz#zT6j`nNZ;hf)nfF;>Yi$3RIJX?AN zD{pV}ET;IOpXGGTC+oSM`SUx>n~IX(#|vh6=z0Q~wwv?GWE`LQ1@o1x2jBHv*sPhG zJJP^g!teLpas^^}$y%v3?udzEsHKMS)KSkklNsnLY zocY}OnGu7TqmCt}%-FH+rN`e_8jn4@49}Jt#f%yJK%P zbZ6leH(A1zYE;lb^&**H;d;2+?#&KggUw@)Z%??aH0l}Rt-EY3Cw;Md-(M54(}CSF zPka5Mwe?9vPrQAl&>GgJXJqrCU-$Mx#>BMCuKNzRW+8d*%{wl`>x2scTgRKyvvW(U zZ_OS~cuUtZ--ndSM_`e68po>dkM99hcHnH8uq<{8nuoOdi?C8Wq8U`upYWSa+m0xp zWEek6%c_^I#C_II0?M3)pUtT<&N4P)F}4SM=i4R7?q(q!$`wfHI-S2#oT z)3~!+6MYjazMpkpw~b_tay#p1)mAqc>}Zzk0ay5ZVv-v#!^n8G;ySsaN309J^)z^g zaPLsQjf$2!i5}Qc(gV-$?sv_S-5jkh_nun~DGumFuJ3Sv%{qBS9yyA@&w0zSQWgF7 ztNfK7mnR|ePZDm20&&cEUKf_DGe;aZckqsI#t*tutkt!Ka-E~x*!_saf9i8WY=P)i zw&m1fB2qEsQ*|G9H}rwrQxCjAp}>ch)3SZ_3YqD37A;a_j~pc%qNOUH%d)kS1}AQh zoN07EE_NO-7X%D~j2ATy}hyJT6;yFB^Ydf49{7s-(ZV z>O)YhuUh!i+B0tYo43& zvP4>KSFcmA?nbOT$V>9@}c1w;V>kw(2-bnN^r&};%Y0lTh|bylu&M8T8=M*u z;8zA?`U*y&X%`*5th6*LmBQ5I;`<(c1ptC#7P|WbGTWRp5?I~?esY&WSmYhId6(Xv zHE5ZotiAql+y!2pKOZ=Lk8R1g(=TsEcH(wN_h&T+X}z-76I%)o=sU{DAEd}9*GI@E zZ<4z-c2^1rXZwHLikP$611?XBS#`5%0gNFM-dS$GrEB0t&Z|A(eDP-exy6LeKqJKt zZ-r8}kO{=-h~Utsu<7^J`iY*N*-ggaoQD1#az5k~13}>RFo*ZkR;qVNwRRml{W|x6 z=+)qPt-iB?;xmtXk5E~-c&8qZbv5ayn#k@S*inl-afU0wF2MQ9j_^1U{u}g&<)kk| zZPhn;#HGf>?L3!~p1Ahh&9BA0(`ST(zAFmCrnLcS5nvw4xaS7Hl_`DVTj>gYy z&Xqz5Ro6Kd%~qO&3YoCPip`D9p&F2T063ZZ2 zHRyUr&#vRF(mR?~8gBAcG8tKfE#K)P!fkWadHe^gq&e|6Zf2NNON&pDy!V`vts8^Z zcBGAGl?LmYZgy&|h+eI#l^Ef~fM0rsyMEXiLB+f@w+S3lnwN3kDenhbohc;RK$4`fqWXnqX7T0$J z0!D}1Cv7&-L0M?#%oUD3AiZ(|yvcB%9lU4tA~#`d@(I(lM#vTL%2~-n z3ZsOoa3XgT17{^f!Xu!&Teb#RbFB5-_1!7Dn4R`v7}=d@%`4!|$;uFR4-lD{1DA}R z_bPBmeoK6fB9jE=c%PPTRpaP{rw5P@M>wmoPSO^_l{~q&6dFqwbb7eml(f=SfLXcS zttTm;q-S&M0(1LcdbropHfX^a#ACgE8~kRO_W-m8|wTDwi>7nS|`10sh<-5MIwqDI*JiX4Y}ifBGXPy<&+5z%G(az65R2b?VV5MoLf zOO+6f^V?PNC4Re@XF?8=NZ+eR9<6N#Nbonzn`xvSFLdo>zc}{2+H5B?hAeL3+K3uV zglM9qX3=k_Dr!rK4w!s?;fM^meb$0dY2MpS`4b3jzkb)s{Na#Ks;nK0^NwA5;O)xt zd!7*aS%}59w1T)txh3pA5RHr@2B>Ry-O%7g-;%M6|3knI%{J(Pr^UB^zF}r7!H6%= zZVsI|7qW$IWYNHxTryFL^+EFh8)fJk7$JeqkqwP8Iy`uAln*&dt9=D%7W1QXu zo4sV!fnFLjV>ZPTsm|I8A>fW9NEjMvTtE9*`?}NCxswdym&?~_-uJiZ4k6PTW_F}E zeKw;khY}gJ&({-g9d&f{IX2Uf`{Bcpo=~^e>~N~NLFx1@SNG*73%h$j!0k8KA?Z%m z1;1tGx(dal_U%0YwN`BH$9$aqzT?CCfvxC{OU*JhZ_8HCFJfoqI#$3-q!tBJ^tp4- zj!+$U@r?qWhKIbR7UT0W$S8{HJc78lC@9GJwpEkT#hP8my>sOJHq)J5FUop&8(b^8 zG?@KPp;VITI~(P`B)+l_ko zZ^CSzz4g5s(#CR9D|}&7&$l&@GT?^gfRu0eNrGzx3>QiOE)7rW^8 z%zOof2}f_m%xVqQb2>5IGMDEIutO`p!956FmL77BZg>jqP`hGgEp~Kib(OZf%;rLR zjL;{U$aNP%-VHNW)*fL^_~2=FB%iR4UbDlR+Od`GTV77vK=`_Zq`0wQmr0c zn!7aZ6P%H7TedV(jIFEgxfYeK413;2=KR*Tps{!NE4?lJMBnfw5G>pb{%&CGSGm3N zF-@bCe3ghZi<|YyC+rBer^It)Yfi6d>k6J^Uu_^4jlq&^+4|?;#bAkqc!rcg-$?J3 zEB6Lw34{68CpIPdplelB8vTv#H40y(s-rWr_kc}o5w+o{i>FH(C8X&&tJ13bj_|HS z4t<>JRWyqPdQhiPwqWD!%{_o{D@q{DkD5GWxvm{QE1F>F-B$4A_=odaA`*|#Js#!5 zPMV!NeBJB8!n-x;895li6e%K#lk=Y&GJRh#gwI%7_S~0=w#yvfytD_TY$|~_{(h1T z*4B9qQ*IG0fgLN&TThagI#i#m8=)RAP_Epk6r{kb%WClL-x?kpX?(s1$lN!ZCTxou z9niU|!po5{G*sU)f3Ny23JHw9AItqF)vz3t7%a<8MFjth(aT)T|D59%Tf))OFIABK zRQiICpJX-KW#atoOn$3E?5@uZSP);gOn+_SN^}-w=1hP4at(Kgr37E*Tcw=Lyv3b~ z9qomDECcZNMW^p_mONHfb6R{jNs#gB@ak8d(wNTIVbTE(q#P573ep=vv2`~mc7q#t zSPLJN+1)OL8U!jwkES<*?mhoTUFZSwE=RSLC3AiVWUFJ7T|J{eD0rKMYHfidm%0$+ zD&(|=_5G%FYsr-7vnpvxcn!svB=B?(AbLBIw$Zp+b+;vMmiz)-CPpLerkOQ%d}+&* zuBuk_Vb{iF6!*(bw2O859`JJ4I#^GX+$JSFsw@8$RE29KXS|KZc&~5DrHmcYhqrqLtY(>r)!Oj_O)Z?jTl^w*kd7W@_mmv#is zH*Qo-Z6q&#u|t0yRE+6(GqNHbJpDrSWqPAZrBVao?80`(3Ujap_~VIGip(6d5Fi5` z@)I0sn5bOG?#R;>v!xABYK2MG8`M*@F1jz(JsHcK=`IUY!D41tc2jng9F}%iQrq$T zalhj!2Z1wq^IWR-IZKPRDgv4=!NeNkb#d>Qw-2ft^(Y2p24Oc;t;p5DQw4+3Fx)guxv$~4l_#w$UYCFSeEVU@cA;#}R8o2kp#t>D)?y^EXlZeul+ zJ>Tnn-PafQ0Ih@+xQvWwX}{GhOqsYeS+T>VQGN`&TMORA_(oogvp##Fo(cS6R5CAS zXQgk406oNfb9Y_o3)r*qP4-O$Emwp=OvA>f+Lfto_FeGT4Z^wH{1fZ$h)ofRXBBj{NinF6(Dcds{BMW_W`UdpiBk=->|47#yfo9Mfl6e!p| z?hq8UsdNYYEn%kl)~iyy>P6&8943|?*YDnYK{htvziUhxzJBCrvoNdx{dg$U>Vcy z2`=bPyrXNeZ+9Q`tkM!ZWNi;C^!AM-p4u3=R1=`*zPZ(Fy*WcFz%@8 z>V->F?w2)2`QtQBp)j~Ixa@;E?Y;DE-0V%%EpQAcHb51y0nmUu_<;j@fCV4}GA~3x z>io_k0Ed~vV+6z+l?7_hW=QhY}`r$qbT!s;7(e@(-d_tV7t zdvFKYFU5zOn>gm?;qU{{eG5P;9Jpx#!VV5#jw`swaW!#;4kY*Pr2dqM?aM*3;!la> zz63Y(4@>RWiK88YL`47q|B?DP8*B!b{Wlq)=zk?|-xox&EIa3eJ zF#0(W_q#;k?TSL$dz-oH;!Y*VU)sUn&jZCY;D>NOfl&LcEkZ{xcOQ?xhzQ(4PAKZ< zDyeRatKDE<2G&7tspVIu9 z0Tu!D-O)H-6Jy*xz^`y```=e65?633`zI-x?f%mDPjb?ID)2vu_s=MPTtnbDEjXQ( zzU8kcnc+<0!E{C2W&yYGLG}?1Y!*M@!m%spc?JJ(13${YGaVZ zh$CC=v#$==j$nk@gEscwQH&i1HAH(0+2G>r3L)Lyg#B$ighho!gn^Sv{$Q9v7kdoc z)*j^hDR3?|G;+dGb_$&4l6oR~9;)_ED6If5d*c9o6J&r3Qr3=BNs*l7q`#cMn}?e{ z#s=>1=8E=~^H<>9uU!trII%D%d|w6QqQJQyUk7fXX9z|X^sBfLAeL5%5n+P*g%rQc6xt8h*HOg3S@1^s;l1Gg8wyYz<5)aQ+so(NA2+ z-OEuJ3|=XVt3^yq5Y!O#zKF)y_zR-Fx%TTgs6-76Vd;h1XKllAm4b|9AB+MgXzqSL zY<$3;{GG?_!O+e7E(0}iojd5Yo5$a4|M2e*MUNk`jsIT#XZC&zKMH{!*3Gk zfok5MVWMDDVCUtG?Y&SouKGT1w)S2MoT8%Q;*z4`A`;RExw`gfZv@)G9n6st76rrg zN`iY4VG-QtmxcnTx`v>!sEi<(@8$+~5Ed7b6qFQ_f+LK7DIwGpI3-07(g-&jNBbXb z9#*8{0h0CoQEngyRl^rCn?T~T~?q1+1DsX~h>1Z$P>|yVCaK;j!+&>58w7`*d_qvE%3BYZC zF)+6GJWL*>T~YA;GeFJ;c`(S{Hoo?DoQFcx-}OrJU-jysLO<{cg5QSfpJ&2>nzy?H z1~->f96^u&7!$)E=lx$}n*T5h>12a;#7zWYPT~L6-u%lk`oGbelft+)_UBlg6#nP& zJW%;9jo_sf9`K9~Rt{rIv0Q$M~I{!bqNH1Z#L_m8{&xa&Xiz<;FtXLkK@*MH=J z|48}I?E3%4UB7Ns?a_7$e13dNihJ*&%K!M52&jmP+9`D?_!Qn>-V)IPJ_xw~JnX?+ zB2)|wb-`O?0DL>m{!?l={A>I5mIz#3zvTZGA~|?V1h5TiiycJThlqgKfb`<VWZovq3WnpkNH! zpBo_&0X`lvj06e+NI@|H>{n=DFoll?BZLw`hyfB(D%^{uzzD!FoJCLqVju8bMtIct zGz1)kw44BuD4mKJ7d`RmQw%oT;zx`;uQ1xi^Qhh{|H3QbMRN36mn7diW2w-u3E65U z-s&3Cnn-?AGjpbj=iTqW*@a;euiEESHuX#i$T%$f9FvvPLTG~ycXUEI`}+A`47e5^ z5gB#;R#I}x?K`QtdHDr}Ma5OsHQ3s^`sNoctuJ4_?(ORz7#te@@bT01%e~AE zjZLuoxQNAgFnl~bJOToIH_&8iFk&&jC;`Apt8$u9%!baB=+qUiczUCIwhZFL<=oG@ zRK30&c^4`H1}=s`dV)5v>$~cR{HchZ${vV>FLm>kITHW zYV*k%Of4b0wh~!a?AnpH7;aU+cug*#k?Ry>d83np%+Npf?#dJCI9Y~oxu-=IZIgW2 zZkd|pu#s56mkG0uf95Zm)lDLgjuvCojpngD-Ki<*Fk0Nw&Rrnu{JN+J9^q;Ff?3dg zBupsYDXE%Dh$MlEh7s@#2{MHzDA_1nq<@OXN9A;K4{%J`kn?->-o@kg@HRcVgK=~2 zrN`MQW=V~WqhCe>0+JHRr8?W%l41pKHlg{$B%Ss2#9ux-Bg5A`=S*)|()F^d<+ibQ zDkNQUsAe)OX%KfLcSFde(cxcdPY{Q_O*{C^Xtvt6_Yb$Zroy1$IHb} zs|xAR8dR@yWXdy`+B+1qn(A??)w`E$IxBVa*ALR@IbjkANsM9U87>Awj{p??^Jq&? ztFi}~ceW$gl2$LdP@c&cT^R|utg7w7IGU%ZS|QClnEmo|{c9~Vt71p7axyg&<~GJ# zPE~ZhqJ5gh2F#CQo?RP_Kzxi&0%T9Tak*KXkYpS5RDm+{EOo;xrdz@s>?9=YNy-wZ zKdI7Op6%V{%%xM`RiCSuoqge8+NTepj#N^7)TQ5@c@(2j zhkSo}I1J!7bK`zrZMhwxbvGzb#K=)vP?xTu=VGS`NkDPnK=dp3=*onW!Whd(`78HE zB{ojTO?iKpqoy&=o$%;^afRl&Erzs|M^2t1_m7rgN1Cj&m{4{oNFKePTBgHd9`)+m zyN^9F-j~eKrF9if6=QLJ>O8s|QR1~n>o@t~b0}{gqG;2YHxj)*XZHX>b4`7E>s-;( zY77#IrX7v4J8IE9cj7d)E6L%BMv+%j9dC5`m@~4vav7awIbGyesw@|c5An@vjWaYT zn!UlE@M^(no;x>fLFu|tpWEBkjIsdTc2&v9WEDll*rNt<1;sBH1o*Ogh?7%#=_3{c zB+`JF57=*>woJWcLaVz@otRm3-AozKO(Z46AjVMtO&gysMV@pbtCdckGo)Xqi@jEgVK>|Q|foL;)6yD8RbJZ{L=|`FA-RQ z3X7eN!J(@V&n~86Cq5@#_YZipIXqmOw~JJw=)*6rOdW+W#zwsh zvu3o+eDC~$IGO<~UmH_ONUVK2G`a*=Gx0UjNnVI|^~t%V57i$K z$E>C%FtQ*+)uQ$ZH~GA?)ki`zY@eJ7w2T?jJCkSkH7f6DLllb>z8)dTmj_7!>(@!{ zU5SePfGXjCaOWgsHib1*_tQshGENx+~2KBjHBoqay9XbJvu+lDXdf=Enr<#A|k=iP*0ID&6&W%dk<{5ki@ ztr7S4MOb`hmeFrWuUg&5ZsY~4T_Yvy&b@pV z;lsC}?#4~~0igt!yYIs@jnRm|0y9h81DIq9JD_0$xn^Qz374zY8HTf8oT!$qd9iR= z!zjZlX2$tZ6+-oV-51%jw&m9cuRHrD$D}@ryj;yD%DOlea3?&!8S_q;G99tter)CI zc`{l4Jfc^GYfwV!^D5mB1V6ejMeFyxeeH|soEj0e7MjQ%mc)F2T#!S)_g0o{0qkYHvEdiS53_{O;s4oYGl|HuvO*EO|++GRgKNnEnN5{kF$7{ z%8S>k6rSPldURFfCX>erV#VyN5CWH{0Y0-NvgF!K=AB^Z!$DS=CD*lSf9FDJH(zmY z#~M8cW?L}!>kA{d`{C@ahRB;qx3vWy)cIci^4>e~BeX($f!^+Bxu*=*c>1t2e%xz; zFr(*T-;Y5^6i=m_gr;}5P5Rf956HwN3MG z+0fVCev_%1pz#-{nZ8$w)qHqRB*0S0?R+L*oF@J_JBD+de*$rQccd1RCrb~?SG!J9Ws>4|5T z;Z)6&H)U__mYD-em{pY>#0)5y-K))%PI&e`SJ6{B%gG%dD>&RvSZ+kCUH7dqF5Yw!BsE4(4Cz{=q5@vdf@XRgY^p zAnH@7EdynN5XErSgLh${Eup+<*5>oR z{9CVj1AqCgYI*e;l#yok^98qtpb2evRw2Ge z6|-Xvyke`S+w$8&%}tt3Qm-{p-YFxV6LJ%!uanbumV1T8laC>Dl__nko+>GNX>R;P zB_YjydO4}Q+tdUdFzU~lpP$ZskNjD;>r2B2WC8H6}dzo&?W>01dWNTZ+b}bo4&EI>OvQARyxD%V)o2T~{?DaI9v`aEttLdAasTP$pqrO+Qnr%*O<0 z-6S*hFn-aOXutQ04=8jZpE3e-ej7$tBH3=W7O`69-D;)N6-ZQu#s#`)Z>DCpE16j0yz4pAr_&hgn>39d#h3}7Y{^R&KwUkxRCslL zvY=MJyRp?&wgr+W-tyQjCy40&;5KJTESJjcCpqLRhdh~AUi7kLEhA+K#J0nxE8TrN zk9`NriVE}JUQkPXd{Q80EB0jdQNSUiIP10reed|3`SYR_euD>4C8ZB?*$mXlhN7{@ zj6WA>TP;e<4C*Dt7q)&*b+$^^YIa*|TCzBfau8HUKvF#2io|_XU2;8j*2O=7m+=K9 zj^z~=Zl(k^W+5*Ll<5L4GRUbbZ@-+!q!=aB9Q#V|{GdatOwOp^wX|AFU^)G~aYh?& zPii{Wfy?KudfoO0(L9Bi^;^@(p_M-7VEmfw2d28369&d-?tBY3?aT}OjJk^_I(wUf z-zO}CBhm=`Jz@2tX%3O~BdxU9B+7gAd=a$M{ce@jzBxk9l@Hg?T@+2T&9d{l$a-bK zc*!zgbF`Vt01-MW-yJJ|mDww%-ryVOlyWOJ$yBHG@kYOjHI;k|fz#K}f@|8ZPI)&| zJTkRsc{ozMOgQ+VscCZMFi#Da1F% z2j6zYmFBxI`>9l}wo9>g=>qi~#zjmuX8JGPU zeIj<0Z$shOc(PO672fh-XKIP;xtQxi zo=UjV?!=5(CJ3Q6;A-kAt(r+VAzDZeR68GEBPf();rAcN%V)^Muj3o>4}4I0eEDd= zUAyDhHO0wx*Qv^73y}(5+lD~*dfkkH*Xn0=60YU7@|;#B)xMXhf8%?5!Skqe`raO6 z#a!dvq#nqlnHAPEj}SWFNj@vkYgeC)Hc66L?J@4rXfJxbFj_F!YdrlBv+<^RWu$}^ zTkPa4&9L~at544=&7D4Wl=_2I3lg<3w+Rs~EYS>aFqlhHRvfu=)ZvUINm%p=;~0uN z47som{F)|Ti3k+zm^?2q205dQKRBt(o$zi-${pRf&&Jl^ZRUPC<~(X@Ek@S6w*HYl zT1zLTV4N1YR?_3TIren0(AxfaE~z?#%)#eoSzLo-%-I63ynI5Y=U5i|2K_95N&J9p zLM&92gWsIzXlU5^NqC>uw_enIcO%L*I$!+FR%^MhkakQ7N`>y?}Toa=^cu&l7PDFkt{e06(gU0wcMYt4jIFQb4trqQLi1hoPdM?_6)2g4 z)K;bvirbBhrumnvNBoo$+g@O$V~`#L=vu7V$L#!qZV!25+1RE5DPG46!~33Z65CW* zia#SEi6hQkhK<*skP29Zou1E&CgQttv~X^b+upXTJkhWN2R9=B|G>!FS3P?R3a0E-(6?RQr{ndUimpq?LXY{RSwsowb@QdMo<0j1nrR zy;zqUA)s3|_}$lxA)_MG$98jyBhmHCQ$>e#(W*0Am9qBjiznBFWH=GWQ%-zM#R#x? z7S}2c(?mp*%JmjO9*e!6H!RV9rLpkT(6Oe80I7!M(rj_)Zb{!S# z*c_41+j{4;nO4S$8>JSd63aZlzjmb6iOWgND?Y|uT(V`JpWrAwLo`F0EX&S$Cyf++uR<_)OjPBFVVzKC% zfVX!Np7BT;o2tCOKf2-S+c#)>Q7yfgCX^&~!^P^H8Q&GtWQlk%!guKL1m_c!S~+0oePjxzXCZyT^kz$5%eLCujehjWtD>4gH8xeD?&gaw?LI2u(NmluWd3YgQKn|=s57}=s#?snuNV$D z)FKU+C(R{i^ZcyUKNvHzXdR!nOl2auNUfjJVSHoM;O{!*Wi%;2jVeA&)BHZKd3<0bXQ86KbG?`DIkXN(`eeJO-VEsjYuKdV~} zUm|vP=A{44)sH(GkrlCwp=OriE+v;wn0(j+$kkEPJ&Uu$L+FM#W_^o_kBgs|8L1aE zP5L=(wk+uPv?;#7R#;eE-XLC9;>T^VThrPnkjW7pd15slPcv?GVl0m{{v_ck`YRF+ z7ev+U^6!wV6Tj8aG$)nD7`3!%z?12qb@)m1!{YHxS+?<9yWa+SUffJ>q>QkfU3Wdp z=6s+22H^P3Pq~4ICk4ooiCOS?k<=uV^~s zG37OeqH0>I7b*nRlPaa;m!DY6F9trlVnrcM=W8~RT2aD-NQw}z7L%A2bJL{ez686} zcB7@ajcWJr*VCw$|cIGwqG9xFTev*|@#Qx^trgONps8 zJCNk^TZ)1@rOQ`j2&y!cMU_p^g(LyF9!G(UaVpCh(%rgCwg_S>MpV9Ulpi%}_#D##7gGB~%kVlymaLsQNbqa$qyqRo??UoU6!gNv7Kn<9B8z4Vi(JQw8^%Z*IjlN-1&Gl)vSt zH563xDy+gQYGU(44dikx7NLf{2#D;`t~->11DqPGsTIg4(Vx_|qCB*XmaVJ>MkL{Z zuAL_}2jM(Af3Dj&JOzH=sLu8;S#}8DlvUY%$Bo*Zua}|6VYg)dO6okW@vp*dEO?}+ zq>^78SjtqXcd6GHk|iMfX(o>5KdqVNTcnbVvO?Oy_oygfoppVi$2>{Sv%B9SssF*Mo=WnB`D&c_Tsha?-E;C zmPER!kp`2XDWS*eEQOMdm8zUK3UtAosND4Rt-JI4hZRkq&SbI~stnNEboVT9seL(>~nHY-OaIZs)L&V0T4cPXaL;=kKyKJ6jz^ zh=OS{(e8biw0RBVxw2VWnG7?>Ls?1dRUR+(Er8HXBV5O>-IGaBG|3!{-x;rCstyQM zSn#h7yo%B+Z*4IbL5ZzsjGAerFglc;I*z3W%dQ!$M3ga8;WLR#irs(2DPo}Bl^gPW z_R+-cywQ5PTy-`F9gfaZQP5#1X(G>I@Vn4sYhKh-OxQQ@2;tdjAX^JWLuDET&SW z0gzFIPQcY9O6djAcz!l`I*RP6<`wR=LzF6w@^6Iax)9$mc3#^X{5_ zW_K4&k=wN!?!Ez#k)b;3W!w*s#tCYu>J}Lzq*_&3ro3g`bMI4v$!&0L*&-lR_6!o7Py1gD`DAW7?*e6!NZww0^!kT%oZd#a1B_D_W*tKKzR zPXkr6^V_I2+nS>Tv@zA09l@U3&rBFB(RnL9N+mI|05cDS%OWCD@UMvR_=GH_2vlf^ z0d>=gws_K`r81}!BN+q4z(%eUA!$;wfl@MiNUEPAIupOU4YantNjpauouH$v#ZcjT ze{#3SSn?HFEw5fa=Mk9M`--!3?YXvoVr?IlauZ1b1ImwZFSu2WV4np z6GkO&*H?y3PenKd7${+d>6Qo-nKVVY6GlKK3_=dtFak0N_{N=7%}-zd(A2`7t@f1; zXAhd$DN`QgN{So~7crH};qg@U7^zKsJChk-E;^Q7&5y&*Z2~n!23eU}O>5~X?h;6X z!0X{pf^{j>2l_%q3E&F@P9S;oxU4Kpw5%(_gc_1KYtIilXUe@{#A8Mq4T#<_ZF<~{ ziJD9XLmigG!Ci{UWrIg1Dtt`^PDQ8On~t&SG*;97pW8tIjElS9+p6shk*r}raX~_* z>+)Q%9<0KI;B`fzji!-LhNJ_Q01xRAN_tRvaq4bY0lIKb>ANwxO_NQ!WvBDt&eO)G zYNBYVCi~jV9u}rg;<$=nkci-v_@a44nusIaSVt51J|QhlL@OabnOcEU>zZ*LINGKr zK$TixomBe)JZbXjJq{r&-LVi19X4AdH8ut;#T{h%njGhz87k`XH2HdoqQPP(h6v;P zpjtU~6QF>nR+zt>fF){iZ&U4!)l;`6mRPdgs}^@DlZrjY?M7aZ*F7~obV^BygDv#3I@~0p_u=kZ0ILxr z@QpfkA4b%A+Z{17HM264q_b4BpSHS+jt5SkN}ix)cP8V27*F99%Jr1lJk}#^{ifc`W@cLVdL2?rQXB*T1PC_fXLo13W_oE3SQb(J5>$YF zaqC{KR4*D!3ant%fCvQt082G1=~4$!Hw_-chYyFw;xn~4{m(%|{9e9n)VM50*vh6_ zIO-|3?%exHvN;^q4a544>8f{Jme>lPPvjC)|I>#6a%999!2Pg9x2;IKGRxT@0|O6wTNW->VH>UiUZ zN|6M@Sl&B6yEzC(l*nl5JL0-PZ6F#@8i8Nu_EV;a(hupbrsJxo9$*TNH1fyg*DR(} z8Jniuxt-NdCgJRS?QI-TX7gLiCr6msc=~x(l7|nGz&#B%KXu5IwDG6iJibl~6ul41h2OJxzMUPrY}&6cpPx z5xLF_YEjosxklPB(${UwK4!X>qMD+=I|0VkNn2SkW=PFP+@uRK_=?=H(zhjB)~zV5!_)g$4s_Ph2XuB}8o&*oLB}ri{hpPXe*m?ZY5#5xcOA1Nd2hu4saw z7C(rML=QpL)Vn^j5)#6SL#nnsj}{6%hiE6v^cm8vG(xj$h@^d~otl~t;RAAKF}o^C z+HV{X@4AZCrWAQnwmW5`#&f9fCZdDZm9O}IT{hBa43wzz0E*Yj zr{r=!!_eU#;_TcfVWk@O-cNRRZs&%hZ*DA(#IMTN<}p-LV(2l{Tb~KJGiisx?`rCu zp-c7Z*Q5UD;Zd!M5pj8G5cJantmDqL!Pgq+L8v1+HicBqK}bP z88zZb`D3ZL`rL-h+qpf#)jg9A(8}fZ?RE>Yv2{C(ZByrWB-q->JYU=#e0X}ShxcbN zvnimM)xnXioh6Y(Xn=cWa~!md<9!&QtK^(jiiKaXdw^eyJur0=l0-qltwPWd=~8%) zIs;xEA|$Aumn%V6hs}Q%-p^lv$u?G6oQ)1o54rx`>T7U$Tz2j9RAsU>m2soVmX=Sp zntw_m7b437DDco|QH*xuiZ8K<5;&YJdy;>hgUnoWsGJQ&Po{=|xYz^2&LyLPvD zSK@MT)=b!}be)@sr=;3>Dr$E`nJMOmno4aC=5}Cx-G&NFJfBU1$SV*mGAd434_Z^u z9-1rzYSN9XhBax=kX(cL*VOdmh{n{-gUnKCeY1(p?mRw2ZSDQbw6k^i+>YO;j%;>+ zd}MK0d{tFGLl?HFCWX>yD_J3})U@$CxIXHt3r5CGJa~6depCecQk6bb>E>m58$}5O z3X`YuJV>wnUr`c$v4^k9?dptubdpM((S6s$RX^8+xaLJ9-^blG4zuW z8hVAOb=7L@eE<~;>zWXw?dh=PiH?OqK3;x-f#NH$hoh98> z`5GO5<6QvKSrp){bNY@e7l{kUF~ zGo*2Xigl5lRL8FXKOvLQiATF|dlM~%+2~oG#~J=Xng%Tq)_;Z z8^l&XcxWHUF|Ye$k>olKa+`B6hNhOLyKY6aV#jUyH)hU!#F)t<{_1X7U274t??G24 z=-heKX$Ce5&$X(KIAnN~1-H7ED6UMkTnYoI1L=zCubp%2(?&EELm3b1L0XSokzbW7 z($5ptaK(qL+*|I3yJ%oinkxFNN^c#vhTNNumRdNa+SqNCh04|EvfHI*mT_BCJQT)i zIBy;G9y}(EH0zQw$AX5bKR&>8f#<7F%d4VKFeW&NP%_lO&N69Q`2bJZ(teL_WcM!G z!&c^ZifmjnZ2bN|Y$o`UzNQ`X0L#pk7*4CiZTvQFtkNw_G*Q)>q@)j6Op4@OjRaM1 z5=SFf0HCoy>3}0Z`L|9<8!2Z(plSS6T94@JsAFGFgZQgx^UEa3k;vn+^ZkeL+;uKB zDk(Q6>!|xoLBz?B6{#jAmYmBZ(@i5pSZP?&>{jNBh8Q@mG4nO@`#NAd$fl080~7~8 zAx?&zofZ>rVKBH|_q1TlZXJ}BTVAgl2JfG5SHn-0sd}7U7FP+g@wpmJ*MY)FTBf#C z$h}osNgO^@Br5u^P^&C*5IblKQ~k2FKPqwK*1%Aw#8(ycAQSmAk_h2k{hdJFSiHVh zJBW0z+!-kG6x)7|TFvFP@f%|(*@>31u-J$&D-8=`a1?Q4BWh?fHD7%VDH6GpUY~nD zG-9qK4gjX6Cy$*-qK`l^Pd>Eqi6a!!>UeOe`C#``g=jv`q2h8|TAu@yp~+Hq%)5@J zv-s{u3x&yTst%yW<`*E1h{*0dK1QD-lF!iNatyQ0ABHa~u?PUM_fXO+vl!Rr#mGOB zh0o?s+1A%e!~#pEpMI<4#SVGR|A3vx9YX1ODTG4;g5nh=x2Um50 zO8IFu1Li48AF{OR?{4NL+d0PF`1(z^urm~ho06}zaP%2UJhmeORPEi*)>~6==Bc-K z)}qNnRXmWkRs&e@0-+Lwc)< z5x%Jkh8}kqT+}ZH2%Owe5v{M4g_pA za;I@^ZI^_#x4SDy zjI6TwY&??{JPkE!B~J|Jts)d8kQx(Tk3TR?G|-RP(t~l}>mO}b*Y16rgu~)<&z7R6 z?`i2beLZ&Lnv)|9Zbqh#u1F{`Tm9Xm{v8DZQpZh;1=xUne(qVuu&#{_GNl7DpOv3o0c&tC;j+3ZRz&h#6<4<0VH zDk=8_*vg8^J+HSmwM*2qwq4<^DpisujX`g1h1RT(q2uBQghLOQkTyPa73#r|E3^*6 zZ!xIp`!v%e@fGS`Q(#m@i>1%!w*0$WZshTERoBr+*l=NLH^(H=!J$;8E zM_Ea@u(<8r{*kJ?7YU2pFIlzm9c|X{w>L&pXl?9eQb!#IJme#mutnyZ_QsQYVH3#V zScyLlgphcip@JPN!o9$B+>yFeJYzrtz9Caj^rYneT?Tpj4dGE)KIhyt75QD+o5^Ho zYH2Fz>oGmQE@G;MGC2+NxOOESJLTrv)YS64OI*;$OEhbtbcNy95*7i8GMW&i62u-F zO)>>MjYp?V4+N-WjH*=R5CEqdk0JR1((7vPiVeH5>Gl>GHx@4&xw7!&>o$&8Beyp$ z!R{J5Mx&%`RZi1fZ4T$gR&G7P0g>wE$Ds3RlfsX1^|x`TeQ9scWdQ)q5W`iLa}IO!Yi;7zi_&{lyM` zrhGOTX>s_c%TvA{RfJJcK>|9di%{1g4qOMsdTU2g*eJ_DN0mYTSnI`AK@3=Ms33~@ zf&l>jetk-k9EVlzEwxFwI^G)G-U|^82Ibp5{nzz_353XQcV)%X=csCO^wl{EY;6jx zxJIe_Z46mOGuSDk#X5!oN=O)xRHM{-(v3l0D!`icxaUWZi9$M&Kn|tP%vDWCs5B#| zJkI5Za&O!oUuEpwy}9yRKN*>+&S3V(S>yJXU4IUsn1Pt6*%*qtEYz4BWh}-zy1d-c zyEU#vBq4H1E-n%{Zl`}39@5?zKD1C#K{%}ruaN7()fuS@g{DI4r=>~MPy1|i(SX`i z({3!s_cJlq`8<{}1x8;XxN~?MX34?PQaLhP9mtRrkPBL z3~D76cUd$BxCqD0f}o!;!iIo(&{NZ<))!MxrzI){0o23Lf>;CgllJw)FO9~7>Rp~?$s(-5y} zp4zKw956Uz)EZKh;Ciw-SroF8Mrc-^estsW^yyoO-EW`7Zj6mqN2#&7OcvP7)nNLm zHipLAyH94pp2|~VHv~HyZf+=ItCz8|P)8L-5X3%4u|ab3M}K-*S!Rm2*8)*c2r2<8 zFeIunGO)p*Ls7@88c34K;Gs|y91_Z;)~I!c1zRS%g*bG>nc3Ls_`^N*D>uuGF-dR?k9sE9ruXmJFWcS`P?V$5lWa-@~Y2%SpF9!Z5SmJ4AQwuU> zTw#Dctd6HaCb&{7>(-(nZP>O5MfZAl8$4djnf zG?wz>2hXP(C4`e3J2^NVwWpZ`R510SIP~fk4{pb^_a$CqdTh8iW@ZZN$YI&-M0bAF z+&!P1mN_xoBYxKH+@>0yp1z`ztk-?LE=HoE)W)ouOQ6%nkeNrMG%2wtNsy7G;mS!Y6y+byQa5OI;KeqGXHJws!OR_c@|{@90|`z>>fs$Dbuhvj%N#ir|aC-E|+Ef-(gbkC^DPQ zBUd&?zhrC;%eL}4JhmSzO(bw>o&?6?g{GC|b~iYXzMu20g)jPxI z`5qvQW2T(FCQb^fU9G#Yn}-velNn#Qb2ZzaYDL!j*L~1a!TdsxGn}g5kB`Z2m7uA4 zQk*PMzlsnd5;Fnq(+-miObVl)(=s&^g$jqE(zwQ=R=%A!9VP^#u7$&C?f{MkfbsRE z2p&hLotC>l54ZPZnR>is2Fx^cSv{|~H$xvJzc>OW>N8BgA#sKT7p#h`gx9n=r;{) zIQmV^NspI&U@%!>EnOB~j(XjRS0-(mYHTL&Y)eu;R>jdyY^Zzz!P)s?Htmy z$rDJjj_x|0K)@src#JUuho+!0$09AuC|AH7H4&T;M-Dj8OV96y3mdrVGaCmZl&Gh! z!Q&y!({<+F{{Tlddui)row6GnV(mQP+#`D87VKZlPgK%qX5$L?5ZF_b-v7Tp_LA)nll z<9Cevk-Gl?Xi!Zdl7}sU%3!Ip8;Y|xUe1%U8d_NClS|Z1uIuk~N4cClFQ!)qRBNmp zcNT;ijUxh;G^i8(!j;EUk2G+`N%-$z{CSI#Q zU!TKu#$R~kGEWN3=}WdZ6K)z=DsffONcA-`NsWR5BJ0-8e|rp&J=m5Pkhuzu3IJD* zqOJsr^}rQ4s6Jh8KqiJE4C<_-yfA8m=A??F0r*Iu2R?ms!fdU}xpCRt?^tcl#ir|e zdWbRGuW;hF`_Dm=z+zQ$71jGI#}%)JsfQP{ zHvV5~Z0atc*g18}(9|Mg_s-G8yg6)Z^fy4V8=|K_G&PsgftB)#Qz?ZYml>G!vPq-XLJgMmW&Y zxdypYP<+QtYKX*P(AfYol^~q)1b|eJP;2Gq(x+%`IE4GlJ-+F8J|nO8?jsKmVQo2k zXBDx#H+pUil>*h`qri>DiONNqf_9y1zlJ;|d?LZ`avB9@meMFhJ|R-<@8SsBDxMNX z7(~XJR=BT_uSygElCud~Hhn4-BQSh?al0vG99e*<{JMqw3vh3myzErFW}82ks;n4_ zDqK}crsvxmUWY|QxxDLbh-h{$OUp=OqmrtsXi&^Fpa-97OC*dmTv7!Bi!mLeZfF3E(d;MP2V8;H~CUYTLsm`r}pt;FEA<^wl2UZx0h`@1JW zn!r@;T!z@Lh3Iy!-K@vv-v_!gzi7T^aZG0t%0zcyvU^~7_VU~p%(Q6q5RNpk`1L8O z)Q$`pap%LWF$mEhN=4fsV9W~;d#I#-8q-pcXnc=C)_z!bT~F~XwbeT_uWM@$@cajO z?k>XYO_1_uF`_4~%1>3icV^@gZa5OlDo-JjCAW!nn+?Zv{w5=u8+onN1bV_XBRK60 zVtUY0sKo;Mk1njk^(1>~CRrHj0Llm|4Gxg%2?xw-EIL8$ypGz#<7C8QDmMj2@7~pz zylz(mn}=*?dfRx?&{xSVUPo}}GF0??oTX-8_aLIiJWBDO->N#SEPO~jNoJ9?BC@Q} zIiqT(puyCFx@ZXml6;q~${~?rwzhxLW>zuClw=@wkjQ+ENE9FKx=>bRbNz2mipA6J z8cpf7qk7Ed3uEOrPWQxYcv7d!Pm|xUZThKcAfA&ETP&2Z>73KmHJH4K!SRTaZ*A)o zk{UQrx>&A!GF91INCBz_1_da3aVFALBtXoHLg!N|o(u_9J^8Ah9%Cb**DJX)848n% zOa?+)yj>H}Vlee|)pZm@8Cvt!<*SYYu6f|XX97sRCCA523^eF389t+?M-mAN1!BeO z6fIbRK-dA&nOgS>*HIlN0LUG~mU3yvx&ZP|FiH4^SL8ZWZ)z>oi-T&--Fdy&6+Lze zhOUa6Dznz^l%~g{Ee_V8nzp^`u{a8xL#(h=Q_~!DGBS@-E01-HQ`o?5iv2dHPyq!L z6Hy|de(JqLs_1YkPHEHgOujs#dYN#?6lbk90!q*_jDp~X@-*uePAYt5Zqm(dt+}{1 zHbSfIvpq#ixH9`LwoJ}4nxW;BIlVLVto04JrLSny9~6{O#VP=$baU;O`b&#hlHdVi z;HwcSYDG+6lng_=Ec&$~6F;z-bIBbSgSt<_-3Q@jC zum922qj%;rkkmdmJGgegVpU}!i$9UcRqpD3#;D!HF~y{IvvO2EbHP-e6<$P0HThJWmzh(Fcm6vmLM`Kd_W?S zh#S<6XV0Mh@l*`c<<@yIyMmTlcB8~pRpheiS5c8=td@gdWU-RTMMq7yG5RVznHt5e z)p&hO0TyO4fXf(fBGltfH70-$AO(7&46kAEhX7CV^(67~>SiNqXZM9(M*#-c%UAB~ zl^h$78Ih&W$4^U+z|Snz6vHnaZcQm5pv=WCkzZ9-lH(Cg(X}6UNJLSUNa9Kwxh$#$ zMRIBsdf*l~9eP`Ul$J@HjtVHuPuYTgKwuuB=R|dLRl%kS_eM2oF?k9m$vTJv?Hv)hmzPxv8nPrc<&qF2^mkHy2h_K}oS`s2oz&ZW;%ztH$kGUC=3H z(G417r>Tf)0TA5#am0%m@O)h)oo+NxXDh7gYPX({v=}F*;|m)P5;dm)tXsH|f>clt zIOVCp(Dc)e*TX7XrmDnI;%akwJVI@JPBtN3wbF-h z$&P}aYV55-V6Yx~te)M+*EEQ=vdJW`6nCg9MwQcn<4A!SK;f!{fCdSmqUN+7LY1#h zx`P~KmDWv370L4%$^QTcpy`VqaW44!X=)d7R!aRC?x6ci zHn|WjI1JiJQGMctK%&#)K40qL^XtI{NK=nWXQ$XH>LISeZK^b=+!c}TcgF47+&*3r zg~~};Qv%iFaarn$dIhYcs;<%gS5Y#pKhsJtKI((SD%BJN702dAC_2$X6!>GmjwpW5 z_6I^{a~1Y7(CiKKyr7MRZsS}w(Ak}bu=4nAvyrdy<|3uvdx~mhprwLrsyj_7tgdG% z;e zWO=Q(M_VN(YOgbopWKFxG%#j5{{UvkK}q}p z@>`1on(S?#Lr+jV&0Vx{GEio76Xz*qsCKA|l9`f>$E<+FdvY?dGwQf_)x`@U62_iX zrYbN3NykHMKBQ?d{D|L7Q3`sqJ01>1XVWKFY*p>K8SY@pcy9nyM^r@X1L8k;_Sx z`=qCDN02B!+!|Osk#_|&W)utdC~6bn5jE|DU#cd9J68e)U8JwV(8c8`q=wIieW{aq@}8qM^hwm2+2#Uj~uZ)Aek0d1g#QE5x}t2qP~KlgPI(5b_o*5 z0;N<9K(c}l5D#~6sTCOG(psuY{4FBkD{%Qbe24dfN`aWjW^(kIuDr=p($q^?uyNQ7 zwQUyJq{U>VG1XPg_N;~miX>%{D-^9BlE}enT9ZMlzix5%4nBP*A(g2qB}m{Z1rMD# zpO$!Zv+Mk3=QNxD05P>|cLob~P*QDrEyI|q%=P9ABa+)$>hn*ysWTWI^IJCT+&kMT zTUFwqI8Y;4QC_&J5<-QJGQuGsRAL5PqZ9liNTD8PqyRYdp#-eD;)JlKdjkr3=ZDIG zn)MeWhnudkd*2nhv#{dud5XyBs`~!`5s;y;gSR2TWzwFX9Z$OUl@8#=Y}&nU}=M^Nm56pRQ$bqPRi)7tZ9ET)CGMg7!yZA^Yd419_wLg3H=t5tr}L<82O^p3)2dixcT%SFALD^IiXTegP3 zD}>uSf@H{6Eo|F87UVWe?5JUsKfH zoj`nt7O$w!&!Z2pHpfnGjla0JCwBMk95{hXijxCDfa-k4W3YRtCx)Vn6Guz5_f0(v zBdWH>-LH~7E?T22PYcSiecVkvQlkWy7gE}NI>TXcaE{bvR#35zHk7j#0Dc`DM-G)* z*d^3+ytlUY!XOAQsI!y!VhSk7)Oj8~0o#_6o3FCi{6=cNi)2($WM`?M!EEZSxtiaU z*qr7(SKwjI?%X|XM%=HaSByZ^n*RO>i_TRfIs?h3RMf5t{{Tma&m;qnI*yY_9wu6m z;#1AR&t$Xh zxL}O7G)rC@1dc*%ETQB=7_?C#pve^kf2C1Ses%u0MJ%86dQ2==X5x zpqAIDk_ZUipTtIrdV!JCsR)p%I&@N_xM2DbU0-EIIuUUrEtjI-IZgFbn9b(4=Gmg6 z-5I*x!`fLnHzqGRRpy^!Z#;(i%2aL~ZeEHUQc_Uk_I)eX(7vNIiiLfrUji*DtpeAy z7GP`qGys<$B0wB#(~QDm$3b9&G+Kaof;a^u)`q+%OCmhzngK@;L|3HR+^q z)lw7>nH4{29DY=%S!gh|)H$qHPX|?k%x-EL*=jJE4Wo|p<+A(3aMILfXfiLfHx?>c zvs)VtrdV3Kj)1`wfl?(l4m_t&WG?1Ha1BF!qJa7T04|!iDvP0#p0qVl=niqz2sVa( z4Wka|%F}Iaxiu#2d8rdGk)Iph8SKrXk_=5g)LCHMxc!-ulV67<(7{5}n~95%1=^9B zB9>h*LD*E+{V*kHN3VC~)zUdM$0$-kz#xq{;yCgAtLf686;DsO_XpW-3Ov09R^ZRk z&~5FX)|o6P@U5#!Nnb5C>q)SkgI`lewW@MZ1{4OOvWk&vLr+l7x>VE+1Ukfw)T5dR z$n-8%bkpW~@T(A}M+Uf4-CvLd{>lpU&zG*-G_@79wDp_xZ5eS@l-QVZ`-d5a-UlQ&mG#n2TK% z6j3ucWQ@1B3{pEHKuu{-Lk(Y$HLuQ<>7*cl+G|t6fuXOJDnDg5hh@1&Gh&r^I$$7jEu) z9jRYjcLv(ec23ybb-R+I9Ud}^V(nem9X#8Yb7S!Iv&mCc4Ai*#3blo!5}0qQ>LFr- z!(yY!l&{%J9ZGBG!}j!@B$@*w5DQoEu&oahkwPi?kHD(AISbb2@In~Nug#8K|5=gYkL6~}IhO}&}kKi*vC zA{a9h?sdRNR@;V>Jan?v#X}pDt3$l@^~vJb_nK`PvM##j;L2p?$a$G0+NWLhq3s|-Ft zsA@dx!|drcv;#UOs2h_Vl&r%`Uk7CvcLY)Y0C;e?I=EhoH?$T=C_O(b150O4!m=)@(B+|W%VkaO_kVYy2;a{}$^C)=iuWKo%^o2!zMMZPgJ=u`l8OprgTQ9h# z-1!HcpkSYFCm$kPY&WiYL7DhW9BPfrAZ9gTr+ONyf#iA9I8)-gKXn* zyMl_3uPUlBmKmIF9^a-o9ifuViZM$`Aeu_dl(S0mBB^)x=!!cxb9l%A$_7%o0Fyut zpFc5!UawgrR97U%NnzYU2h0rl{{RmPbmc{gsjS)Z)NM_57y*W+#8B+aX78)4-*n$$ zUl`mQyCbqX^KaCVj1q|yRplON1)c^c5wPC@I^ z8Dms=Ex?43LG2VH^Qb;RiXT3ls34%;R5clD{lQ(;*p0JU_n55q@!nbVlOeM5u}dvx z+}jzdt-Y7rJKJ?-DkdQolB$*_Vs-lunh+;=$NIM>8YhsI`eS!|v>ZR|#7 zuP0hDt52|?f?E9k8zB`UK{YsvrD^8|S(`y$b!91X$tqz>WAOk86(k)xl<^8kVZ(=7 z4qZ}EYNQI|1kjoT|BNtA&`E* z$ZZb3%uSMAfYp);Y;|xnG_b+Rf}O=O$k*i`m%x=351q&uj`_v+j&_9WPg-%BeTmWH#n^ zJ(Z=a+Y44&lW+ahb#)ePPRCchnQY|{-2rbcv%MNBGJ-&;3@EIX;u|2gE7Pg)fmR;R1U98Fri7HKhgYHWrlZsTz&MO!5n zVvT}!4pxRm5%$71auo#_%iOADYQf%G* zCN`R8{wY;UjHakrSjMuYtXzyj4Zn(x5ons2>qHCO0!lSVrH|l{kxCz*OrGSEz>!HO zPyhf}wh1wuQl4o;{tlnAco;Ky>=q+$?s{r|(8uhkDti+l~t!vy&4VjX5QVb#kONd$lT%GAe7*i2#@C z+6c*D2aBYs1n~G-Rf8=k04-lWko|oPH6~>uk7@OuQ*6{!=1vb8@)tE)yJK!iO3*W}apbwR4*LZ!qCh**K6nk=pAHUoik1dbGb>7g&)5p19JYkBeqZPU_ zX!tx04_((RautMDEmcHX2?~I>zfMwO!bw$Ss;H$ANnwYHm}wdQDt>)Z-%uD|^duZzE;b|_yg+L+I04UAo#YnDbM_Z9? z-EHJahhu96MRgDLxt%`-ajZF@Qp7Rx7C4p^`A@!^APLGHXf#NO7w`^8%yN zx#`Irq5TIZO9MrHN~AVur3g~~nH@0YwtW`n%k8~e%9%1b>^(HKI82RX`^zPWsfw5Q zhGQ+1pzEwnPxp6c{hJTr7`Vk{Y*B*@-*0P+w7xtkG?K5>84A$>0m)(%qOef7_=X8= zs*rl8fJBc6ibANU4VnrHh9Q_1{*k3cDr?haPSDK9x$;{}6-!Bhrb;@Dh8lh6w{l%| zS)SYU(nVU;TXP@2v6AkD%H*pM{j_tI(-M_3tatYNLa>{9Gb%}d%#Ei}6l&8}0mh+G zQV0X2$|ad4bzsbcBU09bhZ3T+^1&n2j++e~E<0w^<97}}eAiF8qRsA#C#0J%iNsS3 zWWyhc&ee*z>#)1$0}IDDlD3vLmN^*2vuGaLhBZ?po*EeZLWBcKfGWXRNTY_OV|6$c z#d>jxa3gZ!;T2c{qJXjdL4aTxa2Z;M&xcCdp1l;?Z!5ZYoi^gdVC%#J;cLio%Y(HY>vXE4x)MF@5-D9S9mT%Le+YsoL7DZK-D8^e_hfv_ro`Y0u z2p}wo1E|9eo~gIe2z4&i(p9NY)Y7#SW#QhXf|EuaIOTGcyVH5$@q66V?fCE+I&2js z1};sj2JhILXBCBPk;h=Rvi|^e_O#Via7rB4SIPGix1n4$gE(8lf*W`as994$cdGZ1 z-X)_`RWc1#e8A(^lv~VZxst0bSe8Yp8gZqg6s0`$fLfK$Q0B&UUSg*ihUyHC`Q6p| zYCXpWUZ1x5_ixeEVsY?L%aNCMQ$>Q_HOXJN;4!puO)5YrqO$_+aqY%7kxH!(mtt;gjXu`L;IZnTXGNOETecMOQ<*^73tVWv$6}9^}ODS}aaeAqr{CXBxjP7oD=u#A2nW$K%?qkxJ+U zY9XB@#MDPFy{rWrO)Etm#b~QmLs6+m3gf2ZWsY``#07pDwhy2b0jTYQNbO_XX`Zpv z)YX(-hemLjU{OVCa_Ps z=@#od!+EJBja7;41OtLpfuciPkwS0@Bd1B4Mp-T`z+}`w!x3E2uq3)IC@M`BwCPXS zzAF3{&lQ;Mhmzd&6j?fqf^FTIvo^I9VpK|5;oLRbXD|KY&+lEfV*)j;ijJBU)I@B3 zxemB?_P3gOmN;^*DiY(_SEdY0c9%pFDxWygWX&q&iO zSr>|>nb$~^waW@2K^)S};oQOmLG-q*MY5>CYgKJs#j1sCR_S$a9cENQ@G&nyMkoPS zAfJqIT@*F)>;KZ#0cmkF*T+jfKD!IM>T=a-KH|VnQHac8GZpy*BF|G#Emc0rcgjI8 zj1_u#C}1rk0@n80t2zZ)0;r&?oElcTnP=6sCnlnKOw_`>U=niHsr3a z%5IIdgxT~okgOEjM{m$33ce~lERn5dS1pXq)I^zqQbSU+twZFh>l9ux0e^mH2lXAb zxi#RSSI{j01LOrynLSY>1&Xeu$DXDveLa3;oDKu1710VTz{%sc4qFwuvH5&-RD0Ge zi8b3J9{AO$$Hhu^{d44oTAqQtatCWf#3D$t0zK(uAkcBnq6sAVP#@%TpR=bVflw&~ zR)B@zKHTH%1azd@naNi>Ee`3~^_7@?(?>2szin>L*4>?LvNtA6#?>^tlXh;mhOaMF z`DmaMQ_+di2a~Zmfph1yxd1KD{V-ibjkBG2x}L=T4~d%`AhtgpGp3PNpB} zoDja196CznBgkbHH?=Ox-Pr6#(yw_J8;Ab&?hT)e#w~1>Qc&SDS*jeQ8*6Vxk9i=1 zbgG=mBN^NhN%q`vI_QzqHlQ<28opkmlDv#k1gn&WdTgbP`N1-)6BB}Ax$BdeSYJ4q4K2Sk|TD+wtenK2IZcM|Qs;Z)!AhZ!} z%+3OaHjbs1DOzaEh^YF*d%LcMENZ5-r6_Te^Zr7;Fs>Pxq`3P{Kb8;pI$Og@O-GNZ zqQur=sqs@&| z?yXWj$`73?NjMZ4r>1&(ovLUH3Rm$|k4^vq_KNlF9Q&suPm0>xx{D8!*_)~G+jAR| zrK7~{TwX@E698SmjGwV-_Qh>|1~+RZOV5&yINjx(-e!=1eW+MvpGrKYh3nkUr-d~Y zKwW~24Iqz|dSO`@Jf0BLaA*Nx=Rs4YN%JJuo^Xxek4 zzGoxPG{OG>YtpWw4W&G|7Q*i7GuwKDao5$;V)xE{_QvR$>Txl)>)yHAZKGe8!(sNu zD<=~W^pyuGnTd25nBLxJgg&gI(t}XfqW2e`v+mdnxm|SYo50$x-du+a*;F7PAWwj*hM6qN}TB zEi7ZyzUsay?b6Ia9nYq;K4nmqTKOq89(n4X95gQ*C>h`yzcE(sKj1!HLYoU)gvIYC zdU`wtI|-1-s@H5!@22J0o64ekN>z_y{{VWiB{p3qG6>|7O6uzAo_H#mqeM3rb3%|^ z#-p7iB@~gwg4DqI1753LEKoHbl`E)f1N|b`kEuO+o~E9vd^R?$JE^@#wcYI4Q7I@S<8I1xv5%tR3QFcHzA$Ra*~QT zfS>>kGE@;$<;9OkYPl&lWej_RW#BPwn5T~)4u1`^cK+z9UAd5-a7f#BuPG+!mpuh* z)m6BRQ{&_^OwN&&lS7kzI9Saz;(d z8@BQpjoB6_dG5+R)BVxkTS|%W+n+gv$Wrn3vvZO(gsDmfD*CYH~RMAQH@kgec{FT%zE3Mm404l-7Lkv=>{{S2{ z{E6#9!uQaJ;wl4YhXM#6v***6I}e4Si*Mz()kxU*EbV<=MiVNVHlwjAHzq|WqN3ah zMN0XMMs6JDDoWVotEZkwsTRIPk}pg}i#lVCh-7^ra7`h<<6q%ET{cXv%_f}FB$H2; zMSqq@4x(-hdD>#4mv`i{Te~AJDx#fgw#M|uZ%j@;TolmBw(#4Yss{(UO8?_nmu zsHDnKW_MQA?xQ6Z)544;Hpa?zKFr%w3VOPHrkeOSuJFjzViuw^_Hok+W2xg3YEXx2 zk2`o#LhT?GC0T_4^aug_d#Up3nu>SGRIxt^K|}K_NKyMM^XbZ6jkoq@_}mfYcK2NN zEiG*wRda3)<(cfQqZd^{UsVkBoBOu0_`R{Vve_&?;I6GO&{EXXeYI7>_>kK7k(w|{ zNTGqFD@I$; zs$ya^u=L{9;#``Xc~YGTxUB3s&A&_48#A(U8O%oi0Ltb@^ry`Ap2FIA#*ov~S5DMD zxwb<=s7Gn{%s&_p;;j7xz7~kNpR|Hg#yf%$2lo`w|7Ad^B z47jDKNoA2CrQ z7}*JJh;j@v$O!XYYg+LIP|}C-3eER)w9Nfso zi4lnEI4dy}{{U=BKD0lub*DOeqmrPuHK+!he+~)x`T6zUYjjPPnvR2P)27_1$zh*n zW;X}-in=G?bl8}qqlTwBL!E@;wz;cXB-afKDoC+}k&n=}ifAg{bsRzb$YWpiW2%Q$ zZ7QG^8Q^pBzytkR>z+GtZfw5s+8^lu0B&vAcMjggHX~}{@o-n-vb&=vNsfqRhH}04 zB$-O6Bc~F`4E1!>1_1CvijCs;c8ru*UR46MsR`%gO(=d0)rQ<2UrH1Nh% zDZH+#Jy?@U5X)2MwOXGr!ib>x;-k~1%tcPEN=Ox@a(^$2^YiJOYWO0|ftN=2VWHhM7>yrMt4Ft53Fv958xN?;Orc7eiBz+lvBqS7dJ7rEVg>bK`pU zr*ihTUkj6hlRY#$?`GoCuWRg0pIP9nhKI+GqEODU8DiAI#*#r9RFjFwRxCJvAwboq zodB*!RV{aYD(kFHTCH=x9gR5rdMn}-0SVjwU;eZk)Xur!)-qJ-T9oY zV^ZK-5x6ioY_{m#)YKUn9=4kcjA2PF4LkW%M0ujiBfUIaHxxC}ah!lCPXNV+de(&+ zs;9&p7#!sJscJCw8c$tSVk_{JxO{#;bq%>fGPxa}x%Y0^-J7o!y7#3|iaDdf?ry88 zn;)LrlO-Kt#^e6th6)Pl8O+3?W9^L)8Z7akl{2KTdRNZ5Qa)D@#wrPK+*qa7xO zo|r$;^yy1m)w_#oY&>^iZR$SP#>%zXd`4IMv9zCUzS-EdIn%b^Ztkt;7^8 zB0)`vISg{s{>-5AzSSghNpCAUuFvE{AI z^WsiDcDfbU&Zfs_MHBc(Tw4w<_IVl=KklocqU%=9j zsv1-VX40o$;q9qBI58bGT0&W45)~dxsexK~V~u!$(|+5crr!I@4P*rWb zR@ATEbeI&ZhiD?cP5%InZREk_rrNk{R1?>-O(itd5r%>amyj*>HC0hOR7xE=B!gZW zbs7qu8Pny8^zb#1mWj%+sihR)a3l{ekgo&f)3$33iQSQIUFEknF521~Z))v2t;0Uy z>aNSo<(jWGoSrOp-@uuB3TMj6RfDA0{8JB#N}8lnOtm4&CqU{{grpj(NvbqvgUW!i z>aJFm2c}I!yTr1rbfrTpWciW+G^P$K&=X6QtB#8yMM3-{A4`#-#_iqHH2xaQhE58~ z<5^8r5>-c8S4y}uAC!tVrjx`1lH}OePE@Nmij^XSfNO#ek^2u@>{=^CD97Y~I{AKG z4VzOdwIz!Wmff3*ma7kf{xR2EUk9?fQxTM|&QeH*rk6ij+oGonw8d?7pSXXD)>maz z0>NWdQSHr5r6Xr>k+z}mkBf+@4T|{?N2g8!*x#n2HUw1E@bsYspPfZL4@pc0?!!>f z!&SC69(Mz~sLavqZqlIaeZhgG+Ru$isVZ|-bZ}BvV=6N_jGT;Wr8RKIld{1{fr>(1tAGWsE{l`65mlG8v(wOKYu7;MrNv`B2*n7DS8fH)c)j|o%bG>a`vuXs=1^|o{Bgz@y&m`seJ_dV8q{~Btndm5E-c;1BpGX7z+7TyeN8p zC)V<^vbwScAy0;Dzz*djhH5Ae%cRCv1DwuE_^dpcZLzYq1$_?S+Z}PUbK9r5c6Q#+ zOj8$+!DTbRzCMp~<0h*Csxp;YscB}@tUG8bU%{BQ#1`RBoicbqv!^AQSds%C?j!?K zja+rOIwf2TnEwheq8<@ysw;sjV+t(9D zYMLGALn>}9!H&meA1hlsQ_$DcHDvMA$EuYSU)vJ+3Rc=nq>byVOn?>CXmu;;B9!t5 zl{wE^ijtvZiTpASqZuNgdWwVmzi&zT4&KS*urh7Vv);L{zMn0Mr`fxkbL8f#-QAHa z6Vcc1?!B$r`*R;9eh+2QK(Ng~^^-M2+2t$=_h48wn$bh6P?aoWarjWxfLG!}ej&rE z6;;$?cX;Vk6amxKjRDlZXasc2B_P_0yLWO`;_Ki{<1_N4_j-^Fd6rMLFh1`{6FhJ zM_*eEzi*O%ut`#`U)4JchP5|=BE}p}4G`B_=&emu>3vFmWNF|>4!q?AgalI+Ds+u4 zu9TvaRG}ZV@g99 zo+2~Z2`TaEE#2c1UBjLt2`*h#7fJvMvxd(a4i2Zyc#k^p>qZ$GJ9Kh;%|@j_Dm;k< z=wNto2Z-oe%k|8Z^>p?3>FPXn4mN1_-pW5HI^%WjWue;iMk;^q%|nU^sdAX`AL}Ma zty`dhUqHX0ka%$*ythlN031pdKypNg$jSlZK*|T6dQ~Tl2Dw_+X0-fNG1MLvQmhH5 zt1m&`J8NY3E^}{VvWdR%Yc(b&w`yQFb_*rFX^k~>RaMS*rqISgM+R>ll%$R+1OiGr zsY=OJFn$NSOpL4IrLaikVM2rjB%LEBi>r+_(^mjTO&u&GKh7`LH;+H=ZAC_5iHhaMSEe=3}sEGEYEcsmNyXTWU0~mt*6p=~_w(0gSx3BbD zi0QJLqFRjZezzAg_Fm9j=kc6{9_*I8Xa4|tYVu0ZWAd5&d*$QYGUBjPkm957q)1&A zjFxsK$=A3Tq!GDLXyYBcP$?uh#V80QU{H>&8v+1u8AA{>nq-VHGzCwdMJt2Sw;hk4 zA%xu2%hr?BZJfmpQE7Kh;EN%-Xg0p&$5WWArpI;`exq-7`^TQCqgMMvZ4S}HKT=XMJcE*h9E9j8uhOi!wg$cm@s4~Qn64)RE3~(f@%kG z!4&C5y7SmR#OvLb(RL0Ka&}cMJMF4HwMf0KxVr;&W50;fm}xfV%f)SMXJ2(*I+~U+ zL{w8`C(FSJXA3J2Y}@!yTTN>yWzxsPBpoYN_(Pc)SQCLE3d(qbI#F;QTZpbB(nI`8 zg=#2CtEfqvb8zWzmlAP{5 zb|Wn<9Q$gAEK48Y`1rVba=^BtJ-GJ9csx6xtgOsx$^ivf7=28G&ngOy*=*!!OGO;Dka?+s@lxlvkLm$%|qAb_Z3o8VrlXCOhq34-8+vn zxau~}=%w=-Lcttg>6EpcRNN9?F`q}^Rhz0IP;*9riZ2{f-B=bAE5hh#zhvYyw& zs2S^50g~7y!#Hwkk_Ki|Lq(0vY5_m!WN^xp(;gnKkFA9URwz2AwK0g-8+L^g2-35Lu!&_9rH9>F1WJucLORF;~fvZR%7FHmFx{jI> zKLdheVS+2uUL|6N8N$3IgHq*@L0o_V;Kzs*bs$vqpn@zvVhpWaJ}Q>BvV#wo6qUP6 zU}f`IJoXl!CSM~TUF~hLg_9N3=pvcw;>zv=Ij2Qnq%qPIrQG*dQNmeWixc9600%4n zi3lsNS?wk<@plo|oZBK9bhdyLX(u3hi8xU>(TF4(0(uOlO3KZmyT=Pngs9uQYQGRz*JXGuQk)dhH7w5Iur3&eD==XIEwllR&QzKw~jOT z{?*(&rx~)~#ZzoL_@|e5ZoGy!3q!ge6$LTol6WcBu8N&(u@@uT4D!nrz3QouYSGxj zzB71t=ua& zjM2y$oC>lBqKpu-EF&CMfHgHeT~oe2Lr7?HaUkVo7~Iq~SpmsqrA0s=nD~J`E--yvLAv&( zM*7%!EZj7$md9-P_RN%1XZwRIzaylcN{DubXK&+i+is6;SIrcT(XC0Y`zYI6yVw;l z_)@g-T`EO9DttmH(70!!i1iX{NU0Kut>6yud$0fAhBo9`Mnu!1lRuU?T6$3S1 z0D@PKLHz|LR%~wMp{47*cIwO5;vl51moc=eA0@TwXfj{IslT{V#a~HXU6GcpgmcSH z1$9eKN<3r&ebEcs-6Fh!Sqz9{kRgrnR@7SpMHv)zBLr5xRUgESRtUzw5m-7`UUCH& zf)F?rDo3Y69^l%v+epoFB7 zJ8BFyBQ|nMnjp;Kc#l9w5{@)@jWUabUl&0e_*hruu1ZLPt$XlHG344x{o zp0Q%f&r49RMg=+l043lt0{-+PXJV)0jBw*mw61DA`dcJ{04c?e2^@V6cn?mTqG)ls zx#;s*7_z(j0CDi`O5L@9!B%7HvymXjrqbTk8L6?fDS+FsLt!-~G|p;{vi27h@wEbC ztH^x#3K5f51e{tWhB>d5G5jH^CAPvUh7+9KCr3o<{25)=xS%S}asg3L}cT|^8G zDgZoBTTsl?7Lkmy3Lq6BK6C?#^bfvN71l+?B?n z`JKOy#!}J!x@2)#NhgX)t1IQGtXV^sQs4mS4ojCNOP{m>sCgeHP&|}>I-a#Fh7crx zC{audk>*dEF+b`9r(uW4ZqyjUyHbmE)NVXt%Tu`b+*s^DuZo=0$&ZU`$YR=Y;xKfy zuO(enh6xeNL>!k2Ypx(w+EfZMO)K*!(w;zhnhf=)W{nvH3~5RLJHE;jn)&)<_3hjI zTW?h+7YDezBNc+jP(E6p2fea2`$7ooCYC7U+!zgyM;tIDRNrq_w)<3(R1bAY5Sb;Ts(?Tw z9D&D5jYO6>_4_)~#>J2jU7Tl!Z`yDG9(^!VOxU<8a##s-5Yggt(Is@LQ%91+V}(eY z7fAWK8u%fht;pBHvPnl$DV@Ad5>-YQ_n=x)RzMKr(9rpM{k>?aqB^NG{#f&<@~;l1 zVg}-%#bNg*)u+ns>}4k5sivpN{4j$ud;WPxi2rp(R@| z7aH|O-eRCo_fzq3$Q1MQ>hZ9lD5902Bx0w4KDDR%k54SoF1cJ&=rCnZf4G%e$xGa9Wt%HUXg){QGc5-;%g5`UNkpI;%? zoW|9wex*CKr~r&-c@qcq4xz`1B>HybpSK-UO6a|c7@s3R2bD!g1Er=m zwsCD)J(Ayik75)0#5!7VolkaINF%jhQJ$EyCOq6iZ=nyO-{uJ5JfeAn17|~yly5v@3(7bhkxvk?{!v7A(q@&T)y3- z+L$eofmMoVE%}TEP(0bcF0tV#vG^j-q-T6k8)DyLRViJ!LIU zK*hW0Gx-$T8*MgD+p0A*Zw)PM^ZCU=SeXO+(UD?Pp-z0pl?puAl4?oeKrzO>c>$CX zNcq;LzM5z#GsdSrU1X-+G&QW-GJVOr_TOCNDcda$$=e;YpWI3ajMTMTl6{FsyHMeG zUVCs*2@O3qK~_h|J9^A9g!i%$)ovw?US$+gbyR$ofrtmpkGGFkZD6!fu|Q~OD8ub$ z!61592Lq`T^<7Vqq}ur$c6r7jb9GosPN<>8Rc!sqoxoG%6)1AOv)Z_*=h*n{{Z2hr zrn@1GqMmr^;$={d5q;?$PlhIpyu*k%j1Tm}j=*|pug|YEMFX-<39kd(al16$j^ENY=O64b>5c8(;lZ6QhWP+ZfA2d(IqC_pjrB+!)y%-{}@X_=Ot zGnDmJ_-uYRapdt-*xmQN_SJmZs`{;~Do|u;wqEb1S{iI6W-=HpBv30!LdaN>qF5u~EdXdBAFi*_&#nmNdEwjX%)}Pr=b@kHBQOwO>~(`9l1V7F@oINMCY+xbtc!qM-1&lQJ3ru zzqKRY@$EgY20I~8XtA`7C0ua-0Kk>=A|Grlt0`s^J5%D)+L#ZXkf67y6sG~zsx<)d zEeXbpYvPIMA^73oqa1!kIiiwjfJtL{_gD@ zu0mv#Nt%)`yp{@75gAL|Y!+u?BqX0!)P7aSpr@d(N%W#Iw?c}lYA6i}JaR=rKW#b_ zq1^e-i@{(v_TPiBc6R8@<1(9v9F;o@1=jK$22CYwmPdT{78avD+dGE^i^w`hfR1nB zP*W9Ft6ehKUS*xuD|UGVN-9T)C_Z{(Aduc-R_*>1(um|;58=9vc&?h(o?4g?2hB!& z&q2;F_#W}3+SGfA_pL1~hbulWacyh{-+j;6+lc26rD5ls@&!45eo-$atyLv4YkL*mPp6{U4C zsp2VuKf%*X47DOK5xjuM?IaQTaq2eM-MhM^Ze8h)+#7b1t1*wv(8Yy^5w~h6D)U*# zgBva*1+(%POr{GNS(n7Kcxovir-qp+gFQrYXw_B{YhL#aULcy|)}PO-HkiCPnj|qO zI5`8>pFd6~sCf3GsH(-%)8Y2^BQF-vsN3{dO^XgHj;5n-C5VY06H3GB?#|ERC0%H7!k@OBPt5e%_%6+(P)dEj;W!^5(w8TZ+Elac5sk_A zuGy!e+Vyzd^;1o@cD~cd(P5}!l-1!W@fiHFW%oQaIoVKFO`Mu4$E9&-PMH1Zs^lzB zP}%Muo{#{i=U=z04L|5|4PK>5$CY!F_G6^=3P(eLhG{7_hC?5oG#SihFD*uL^i{iu zb0tIbWr~Q9NRdJk=46@sJ8a|m&Hgat6TW(KVekkCfoF+Nd_YplyFVxa-^0u zG7WlPQF1u5jDhE-nIq3VZ5=~1DGHR~rHQYeYd}3K(+w)cU5UZf#n-WJJ%O+?{{X|c zhH}4hZWwmf_Q~$d!`5Kv*KO3*u6M6tX1pdnyA?$91QO1CjemA5-`Sx>JVE?f`BsDv zkR4PsZc*eySPEc~{J`_{C#3vIQBy-b7Ec95i^c8yeo72oT$o6yE27Kc=WK;e-Q3mn zQ(SH?aVITt=YpPh-`#w1w0K?jLB4QeAi*(D%in6g=}p!w6W-E zNU|N&>(Kgv9}5fv=yAmPXB~OYg#@aUJZY2j__%$mUY1xGu-$WttKB(nz{PcDM>B-n zn|CF(de<>QmF^6V-raE{P(g&jXK=OHJ&A^+N`DqcKjU#{>FLV|yliwGX-N-srR7o$ zD8L^g3kt1&qQI&1>Zp{FwK-JMMNJrwm>4-8VDe_@9f`Q}cz&a&Y1ys1>yp^*LIq%BNK!306Ss22@p6WgK+2mjwBM zaJ2bjt1t&tqBPcUSxHwvJk;0J)2tQpOG~$^a5?Pn_o^OpT~e zpVVg~`a!#XSjhA}26_A=?#=DFuvD39J*&0p>9MuFho8;wO#bM??FjNSM+~(uSChqI z_r7A64_jE&uZX3`&d^l`c%w0Z{`C4VB#%YK4k<<_&jiy|IQM6yLO&2lBA2j#5y!{^ z2lzmzUZGs3GknK{%V14*LvZ73wjLTxwksLZJ7YJu>fydvS$S6El;zpq`o?s3`bGMl_01*MFnY7`B&GZ z+;C2E8#XFThG%xQ6g2y442<|peq$ZBro`mL8;2RRw&FG)BQd2h3D~O5v+RPtLwwJ=Sh`w;0RS=eEwyn!69SF%#^XJ&S|K?Yth@ z+I0}t!{R%Z^xHC2*15Qf%G1w6;w#1MYmXRm6mkkSfMg*YG2 z6h5Op4*OpfF6`U69>m`pcXRex-ScE{6^C`_YPv_PZ-u9s_O(qG_S>?hZusAoQ$ZR~ z?fMK<)J9?>XK70Nyh4(Ri>)IePl-aMPm@uEiBD1aigiy6tZf=46y}S78_0@^Hhj7c zaQIwAvttb1sn-XOsL{b^Q6(;9&xl$=wxj3{x!fc4e`c+Q?fgKo>VtkrqgHx9(x@06zO33D|pD=O+`r<%41;Q}a`RC{6MqqOBzOQwLR z(7}oPBr=0h+7Yo%6zS+$8%!iIqg3i8mV?!Fno#7r=Dd21pW68Ye)QVH z;5`2Tq%eMcHjf>`iK3^3%zX7w@Sr|p^*K1Nt})br#20J@!fkfYlhdv8`?v)jvY z(C4b?H<%D)HwM?*o5K}bH649bS_XYo5@Y;HB9#^&}XWlxjDV6vHw?Xfq) z)NOsOnxR^#auH);slsjTu_i*Qj-OO?nOaJ@o?Rr$8d81jWYZO^nH0#%K?PhD&u*%K zP}2uVWi+o;C3Q-oCc&sZrlOs|07zhXf;66zSgd}~$iY*P%4Vn7$%|ZE6dPhKr9FHZ z>Kav9zgN0@YcS6E~c(WD*NUw$-B1R)`KmPtvTGbBNsA{NQ8C^Le8o{l2nvSmx z8l>WxI!M7Miw3BooY0C6mc7Nh@mammoUM{7O|>0%-rLoclkMH_2Xf87Hzo?94g#w$ zxwF_Er4G}J6GN=Yj>gf`tP;l>v`?vusdsX=;j{W|r0SPYQ^6T!sloipnuF7FDc3fk zR4yBYc|VDfqrtBqO5>yjHeQnm%|77Uhj&usk@EXXZSP#JVOJ}Qt`%upyy|khTXWLO zw)b^8jx`ZO9qJ)K7z6`TDHsjnwKNr{!mg}VgG-}O=>oc2h&(!QiJQXIA4M=j6=0`^ zk^#X#5}aeFJX7u}C^qI=UBkSv+bS#uPMa}~>z&M)UdD@KLlo(p+%V(olCLbn@`muhBXtiWt+R{g->cYa7vM+GPFKktlNf^Dg^Alp+1VJ1Qv zlo3F!;y^{qvpkNl-2{+X#^X^_tbl8)K`O{jtm$wvbJwlnF6{%zzB4YM3eYxbnh-&z zYAfZ^uV>|Bj-PjR-FDX79g~-es;e{B_}Z=4*$K00bF{KcBUAPM*u-Zj`qilRjWSJK z)fs5#pqex>-bH0bwZMfp6rMLlhHlpaB%vgBg6PP~T+mes3P%7sdP!I5DWS}o;1TO+G#<=J?+xbjnlH{{;?oG2W!sg@LnIGX*_1hVwgT)P-ma2eo0{5Paj>zwgB6k6l~XL4s;b-`OCz~AydB3l z4KqndDdLh6EMqK4Q6av!jZNH$(#PEtnvrE(Znh}Tm80K)@(sgAK>Ve6Q8hFP+khF!NVD=mksr=r@OAG>Nd26~o`m+h;z-DglP zc8hJ{*KSD?*W@P4REXxD?Hi}PO1B5;;*!R8{UAG*KNT1n;g|bED&RJn6{4`?(-3$% zC3)@!lFSctGL<|S9BEZPRn)bptvcaRkicX2A+C;;ZwyT~D;b8xWp{k}T$K(Val>5M z8cePVs-BApw&?2V>4Q|kLzP@dwCV|oV~SOYS<9;-Q0nKjG*zrQG$sb7 zv8Yqw>u?w~yAl{RG#af}NX~v4MFkG92?y6bEh%v`?P)Pvz55!brl+`RGFkflnZEWu z_3GZc+{PIt@l~~VU*>7?+x~=AhK83LM@>yhQ!K+wVR#M9KC(ZqktKwrz8XnbrBV`s zwK9;==>Tfi9ZwQT&rdu;9~#mYNkBlxKh%xaRz)K#MyTLbm{XvyC5p|-{9k#Uzg@9$ zJ65uNv%SE=VevbEWX-zRPZreKTR%BccMc|cjA}^!NzFv2TWgXVk7^uT$s;nVi^#x~ zGIl9Jg_eZS>NzEKR<+W4W+hhv+Cpt#vZjnd8D+1k;}}0au;6hN(&YCpDz{^2_Y4V7 z4R$UyuB7X_OdCf>_d9oZZp`HkC3Z1u-iiWa#m!L_J$$Xfl0X;Qc+5g*9z+tv>y=_^ z=yBZ1l|aWbQy2_D>GQ9`mSmUpRI$`JV~7geYBE%0aZq|_udK~(y4)R2O!9C2*SW-1 z*os_UN?fky!_i}^%ykgwu{2ouC7Uf&wBhN?nc5mv4sCLSY{jB=cl|XcB~~>f9ibVH zP}fS0R3`uqJu_EXlougD4rn_Ce9w}V_?XiIl_#M;Kf1EJV{*Zg$9DeO?5y76G0nO1 z@nEt0`ihq?gr{MNp{&~3y`_!GOHq$YK_8lvN=q9{>Q!HR@KK<(@mhH0hm}l; zJ{xHjg)pS6Dmai*jsYNnriVRLG*)n`#IGH*zL3>w_>4Q2s!HkeLsh37bqfM%sW#n2 zJCkc}e6CK83F)?9V#Bz1O;%%IWkoyXqlc|FP6sWCdYmRnT+30Io;e|imvy=J)G@@a z#h{8yIZa*~Q5ZG^iZQN5BANjs03IDY^0I^A%u?_HNed8Yykl~p=~@${u^f6svg0B4rV)J<5*Wc!$d#{dOMBG;*Sfk_N5 zk|XI{0YGu9hy-~R8S|%1GZU#m4+x`R@ji7Vei59SH(&qM)tU^IHp|Q4aJUZBtCov# zjl4I8f3C7KZ^^P*b*Y{y>86`<((HWAAjeX&B_$0dY;;d0ytNj%36bJ`P(qLNwFD1? zQ_%NOu~KL%!$=vS>2Pxmt4WEJ9w5yt+uB_c# zop)~G**OixhrmfplzWFS*qfU#TZ!9WaZ+6?s4*~ARnyXWMyHZpN8MwQN}m#FqJ}Vk z7id069E!;%tagfdFJ6`>GIoZNM?It|s~=K;)l_`VX91U6Ht&Sf2%xCP2Y|A8qieOj>=!hd$}54y&`=TOP+Pn5 zuculhB&`rFP$)n(1*`Uo50-jYJLUHkENLdo+SrPGhEr+bb5vV1WxWkvI+{3RJ8ld{ z@5bfpX2kC9%cy3GrKv+qzE8N61yX_YBTCVs(ox);1XV3eMkzz4nLGgEYI>tD_Jtzu zMdMORiu`_K2lntCVae?Zp_1Pj4ae6KrZ;ELN0QxpTL+b(rpatfWj%7xQte&UylJC) zX35misw`DB)b%wp&l#3v)LPY3*{-O?TAXMrQ`$4A(w~N-9C~(0<}Q(UFJ(nVO(~K^ zFAQ~Ix3`1jk5C@N*b(|2L&}FRK_1EHa8Wz>M5&ov%OV>QqoN+MTSL; z0BnyhZ(?fAKxQF*6+x-TnI}AH(l!Ym0VXlRpaM^s`w!<&UYc?E167NcHJp4V9U_zX z6cicC{7df4t}^C}Aebx-MGKbPlr>5OQ`bvM?<*=r<>ZH1-X#ji%2wp0>cSQ!|PFb0+M;z>U`(Dc)&5cVD%d#hHjs2X$S(x+}o zfUCe(Y;BQEwf_K(QB`Gkb`Q7nJD+v!iCZN@U*o4Wn0$`o$L$WG$kyRuYGE;ag;h;B zSb_4$N>PZBd*oC=xvGLss+Z0w_*G3!GuGfWEQ<@h!5AU*g{PQWcN4;{!kIMb7lqB| z_TEyGw->u``*$;6i>%Ha{{Xc2OD2D4VX^{M&0wl3VW*C&n|Mc>+}q?p-BAeJXz5mUX)qCx+WwXEna!-WykEXI`qGZ12o&){Asww|;q4*HKe#`Uvw_ z&CfZ?3R&sua?(Qd=AJMkM~O6-JTeh$86c^msapEyjR%>odZ=JjNQ^=bC%9AjP@hco zGXeZXX?I5V>&Z6fQ{(IZ0NiCR)ynRjzrVXaIM!NdAluz-j?7~!cb4RvC0He@$cShu zHP9}YWYVEok_$$k<633ZI}=bXPf!7(4n52PIqSwYkf{l+KqpfHLGw8SQQ!av{Jlfm z8GYSPH6BxW=Qk}rTd{N1oqM_WE++%mm_*KOI!P(uG!%Gf-y4_3W%3O$HEolIhLUP+ z3TAajVPYMMtw|naw{<+e!RkprXIiPyA4nR05UWA?dY`a$&DQ;AlFm|B(PzzKHKIFRYU%4FI_T;G#U`hGDr=*h`3+Tn zK(qv~JVpQ`Jvy-($Eq;Lfyg>M>ea%Z+Im&>)^8=3ugk}^x87T2ZqM#*T_y`H*?E4Z z#cZ9SOF>&r1m?djzhZ_yzQbZLUMpoWG;O%@^=v}Ks)d=5G#O664T zroNvUmC0->-N@BFf!p-3LPl0C&wuDX8sgt7nK2gHcLSuS)uL zzX`xskwKxYX{krr*cB&+n$xC?m3}&wTy1`5Z?9o(eX~`K>+GiD*;P~YRxf((jHV4_ z#q3kHX)rXqwwEDIlTYFqT=eNvSzVwkrB&61GiVhTdSC12#b*&({ zs*#$VG$ZmP9`Btg=sHsE-HSoBGjvey?5!NQ4CE8;8VW6~y>MUL2{M~p8a$0ZV{UvU zKJ$H?XU9|uOnqw5OO%`L9hbn(ac;t`prfe8M!G5VVyX%GDxbBwb)(g(5~_HBK&kon z9XRv#0MbA$zw#X+cYPfV4$a%yg{8!8&B2D<6*N0GqKkLdRPMZP)Qcxtl=v*x&Y{7@ zH3ePj|qpV+gs99+&gb$%A%OR>Ktil& z2;%I`Q|JKrK>I3B%cqnUgcYu##{dfOtw1HeJ|10R$-}T}=yMx`aBc`>>^;GZ#Eqr0 z`k!oV+RnV&)Rhra!4&)RB0kDpznP(!z9J+t$9x}2nx8w0SU-y4>ai+$xK+|(F)EVd_QWtMsN_Frq)i9)OIU z4rdvgl9we77Cw%j3-;JLxv;azC2q~n1gqD;0Ox2r zoj|1nm8LOD{#mD0Po{TeW+8YS@cU1h{{Rn4Ox`9$%56>Y{ny+0U8g_{`!1@t1DP>) zJ}YlaQj+gXt`?s)l*l^Q)zU>zmW~?gWv7}{5hy^+D7DfIj1Q(3qvXI~)6|NepH){# zwXuw!K~s;I^Bq0xfsU%&`0baPsmRmsJ?*%$`{Os3#_!x#-@;JgDOI;3?VZ=P`)?OX zwP`AFIaZFMT$V;^)QXNapbFrh zu#ju~S?P+u1RHr`vs?cFvDa_V}jA`kg1gXK=M<>lMsvL>vT zd3EeNXL?uVe*XY3Ctc)Xi)-T&t;IbS_vw5BRp)kIb8uJCtxPzY8ma1%nbF>1?HKaj%9Q!Q&I5_75Opwe1}QK!{ab-SZnj!Dk?3#l*MiA-G0{2)$e+}JEOn_$(Sg(jM`;+Z3Xwp=(9)x)Le@oM4tTHG z=Ynug0y=Wq6_l8GtGgp?ZX6{R@!B}*s;sWnl;kiJIlLsbVllWg&63H+cild6YQs!+ zra1?eo;8u#VMD7#Tgm!UwH%()Kr83yay+UibDq3dA@SlE7-cM4g#EN2e8H$aW~bXR zN0_Ln-#a63Hd{4=n|smGR&Eu=VKX$@V+h-L>RGTs9GAhUt{4q_jBcQ7|oNhV3K5x7-*si4KbQTnnr64C@6$P(JGe* z03ihb07xG{N@V%;?4f4T;U0xeYgPuIW^w$74x-U*O{-bexn13hn!aAs#crxRU4L58 zZd_g&sH-Anio5%n)mTh*XJl?Hb~R$PZF#GshMq{-RwnV^-s6rkXM$*fm<$3)C+uA% zT+@n{9=YkA5yp|t8@`(7v`~GgR-it5Pe^HCr#Tv}v76fal6~2qt=rRL_YU*T=Qe$A z0|ie|wRzgPw*E$v8ceP~Hz$#zt;z|OiUblMk+mOmW|A()Ko?B{kU;rU%mL|2b!0Kf z&EhdC4Nj9bv<4ma!0r~?L|i3q-uuSkUkag z8+$*p^6)EFZd~M$Bdd;G{+jY0Tm}C{7B7081Mri@axSaZybnG^aE9I zhXcvfRdMPlM;^0L!?gEa;EmsWbe~GpZK^uhu^8>6MZIYD9%nL*1|tu=RH?uue7dqJ3n7h=6GNs(uO1;P z3D2NBXh%p*%YfaR7j#zQ@;KSHR^q`>&7Rwbbsf(fwb+WtW2eS8*23i?{w25P+!ZM; zT@0-SElRU8odr}K%N${p$r`f1;s6@@mdQUOTAKNF=-y_H^i@I(DJLHxUq3_V>(ZMQ zJ|`PNT}4!Pw7qd(ncAP;-Ossp7TT9FS-+lIYWeB&+hcHKVBO2L@pNBuu|bZkrIRq4 zO;g6x8(fl_l@ZoM9UN-XXn1I-(@qp>RC?2@u7fE_Bn=j-p({{Gr9){o1IU0)dV`!f zP2Wwr^B78c?Dp8h)8{kWZxh!$HmGerzM_{l!lsicfTEhG4bppmH9-g8Bym*LNb&$4 zXVP3avG}tvwT+sixBvqkDgbs-hCWP3&+O@$Br${H05tH)AOe0JMVL=306wF__JybVXfF_W2Jq>U}0NtJ->N zRYMb%D}aD%4g5Mus5H%2%ZFE^0%dE2LFcNxDa0@o&kX0T_U`DTq=ut)Ra0kj8y=G} zQ(cs&#_tN=wW_M#IVX`aPq4F_LX6FclOc)HEmszZDFZ?j@B@+~)a!t0hu06kh36igt4B6iK`pmw{s2id+ zI8DL2aM@oa4lQ=ZH6%aYQAbkLb6R0}6#=6vMqXQZ3b5`PRJ#S?KmhLxT#OoZrEnX- zXBs$AkfT?qCxag^#F6%(QWzX0vwvdTU%1Gq4CMD(kUza4q$x*)s6!SjQDseNIwse96;%$KpwI>mHZ}$ zO@F1qf|19}eEJe!)Wi6?ToIL5Vb?$c2Y!G|2sA?WGBZ%lZqujE8dgk1_UuD)$wv%vBy?z$AdF69kuN9rZ($7&&k@g(4&%H6! z8(y{*sg}MN(HF$9O(v2Dy-1Hbv`GjT8ffSPGQNBJNhiO|DXQ^O2ToN}vRS(gO1S|@ z6riaBhMt5`xKh16*KTR^89ZL^+`CeJ&r=5JiwT+RO|er@DtFtALCCu0@Hxy@ZXA~8 zuCJCly6nf>Jd)DI;Yx6}b9HBy0)SQH(m*A=MFqdJ)lyghG{;($1BtCVWnzU{0_lla zO+`UNq-oRv!e_atKqT-TCi3{Kwk}G11y=Le*~*-)4JLp4v9_9)Kh8Zg8s&>B7 z+_^e!pHELLh($CNQdPwTJW>+_Ia{TWf)V>vs{mGkRqKLv07zlvXgjh^I(8*4kE*4# z>J7vKI4gOP>O6-IpK+C2^M2-z&dF~qWlb*O%?-u6dfzdY+Pgn#Q{(W_Q&iFAcKFWZ zX!_=>JztHfKW&eIK@~LX>qE#6w5bNUV7TxkkO;wYLON8CCTPb1!i2ID<`0)zi^pY# z86jy>GEEc$=uQuZtb;?x4Wth$^pMBke7nA@ZP&@RcCOWmOvc~FZeG=jt2wf^*&5ko zt;_97489hlb24cQJrYk0Q=Mv>03pkjNZ2}~JYb6WRF!fvaX`sakAwOQOxW9O^zRJ(OIE<0}1V=!{iVc`mkuw$gf z;%IW)VuGHF#SUT^Y3eEgb(K}Gdlf+ytO;<=iBPyYMNR->H4~oXVN`5nXQqqBWR_Np zDQ48(M!zsHweqG2p&dG8FqF0XWbTYTRzANAxAL2J8oODu8)Gw$#O@8n1T)er&n&b# zY}^$UR8lowB94-JOkF;dmZ%mtrMks38*tig1ZA3psd5btl_L$pflD)F(w%4~hDk^w z7LbJ{a4}E~4n;o`P*#9+g{!NDpvVw0=NtS@<*%o27TJ?Mj#~GcELJlgL+7i((9zaw z1VGNhG68J>4}Oq2k-=aZnHok70AWrU`v;#_Edm%vhUL_M5n@hgOL4D86A!g>d$xye z@2!c}yYaGHHwxQ-b=U3PtF`t{%81lcG}szFlejjn=)~{Lmi^1iKZb0*Q`A?)kL7sV zg!aTjIUs8%L@u)GN|@b3HFbEYBB^Q|qKDJzPM%<4V|8mJgIJ?{Na27V2}0lkJ|aM< z}VKdxuq^yeMDN~;e@u=s)(u?i&I!_KoG{T)8S$ms3M?dy)h#Y8SUeu7Gldm z@UQ?i6n?3|BMNA9!=yC3S@PK0?B>|pnH;_wW8yH`Ud_tmq|Vb+?QGjC(LNmKGx-&x zrZd1kvkSHAWBfsXba}Xan4=uCWFS8+RJB z3euFQ(s+El>C?S69(r0_B(J#f{fA#pTQ6Uc$6@MsoMlMgRn zU@^E=)h#TQ6VG`3trM95_e}^Oc&==9cd%lmnvsv})uNK1FmK0EsBk#zZxva@a}EF~ zJ)o99sNN!zRU?AwARg0BreJF1+gqwV!$tk&#A7yEt7SKLU*_mnb!McJF`>Kj6 zt+h7Y$5v2DF5KJr9mlcdsj8r*&(nuUu<+8uD!RrR%kd{a(n4i8`d)zn)QX!02h-2~LQiK3qm zxN0{RD;v7sY-93`OPg6lpUAgMAnb|3# zPbgSqiY8n5-B|m&tZqk%Czfeb_6jNW;4|4VrALs)?3z=qjK(#;sI&523m$~vq?iw zwRbH&b0*3-jI_JEAC})a`KDjClCV%zMMFkfbctM+_T$VNJ9MKOHZndVf)HeZPl>R2 z0Zyu>FA}?4cECd)6IgQ&Ot*FrNhF;$`SB>v1Iem}0_WpBv?K~|9Tw=1_sk-pFEr|x; zs;FEoc1wF@3)OC%PHP%Otrc_8P|A|Cg+b}}=)76Xh&&$?8nHxBMQKeb#%Bc%`I{?-!ei^Qn5>s%b;NXg-jj9BfTpIT zlMA*fBdNt~Y^?MW)Of#%c|ygho=+o@t6n0VOaPLcG!P4UV4e%})An@1iO{Spo*bl& zRTTocH2{)Z{_)fIMjmulnX$n4#%wrS<7r`p+k&T^L_OO3{0;iUc_iO$pDDXZtj zW#gu=El~deZ4?!CZzF2Dak>TwT0mS^0;KW(007`C*Mh8?p^ZoyxSA_-JYNV~OHv)s)66Qf4xY5(wkN&wv9I2c=%et-$QP-B#PeD6+6r)z<$23(ny% zI}^3)cV=#RsG-PYHvaP6RMPEgB*aqB3>6h-hbB!!$>M>fCB3wa(Jdej7lP%d@3|%MKt2MXEphJAXAAn{{SaV=`Tk_ za{i-$JV__~gQ?ja(MY+mn#JJj-yEAaYxO^5;P6}DF_g@28XToG^s?;A{l&VmQ)V!g z(B)KmDtiaCULk+c<^n@4c+05b65jZ95E$e=!eb-MomW(Ynf5^&ih(9nPs z`FWq8T=quw-g_G{4(hDz9M@me?ff-H4-43sig`O5uzJ!sY3d@N>d3a(-+3vff~QiX0ad-&Fhoce zMsxEFY33?P?)l`OQ`VhaX?9Uc(v=m*o;VLf=hOara`SEsE)x}x&hEOb;zgFGz-6*| zd?!|lnx~g+V0!O*RPH*+_ig}?uTfiF15{Gf!oo?sXjtsb3jl#}f@lSP!Nd=jT9pu( z%xc3N3CR0#Mm|->I$CWF^_`mxc3$VkG&?hNVeuJECtYo>)uZUXyX;K;1lb%mb9Htl zNPN|1e=u@**PA0Ks-XTOQxfY%j!6C2O0W%B-c>l%TS`}tYS0#^3g_l}e_9e#Q>s&f zfJybs3X1uG&<%*9uiSAQHa{RJDe7yhw>4HXbyj~0+r^^DLqM54TCed6+^$BB8H&`T zi9G)RWdw|eLNGoEO-}>I8U26{+3VF~1OOugLofvJuiIbn^s>lp&AmrURfDS8(C)0w zE+=qqT<>9ZUgN@V4WmVgY=B+6n80G8#YIW7_Pr&0>&(wq4nnFa6hj>_Di5-++ojT# zBv!fg1PT%82iw)Afn%);2GvZ^t~lwZ8v2|ME|?&NBzlNeo`@7x3|t>>43=8?9zCc0KjrG9QtDsyGsFEu zrM@#aiQB2Qn*f=7)>e;hxj48CC3?5~x6UR^X~rrUYU&f=`hZOj^P z9>=Ht@?o;ui?Q<&((T%s=X$DnVX4N9g*N)#`6%QP)pnhkIuO2%BYG-M<1|L_Tbm$)Wq639qovQZJ&b5SM1HAxhP}EZidf#{!;)1~N`OeG`%pkR`*`)?B!x6-&!`5c z%On%h=V0yq;PCC7<|C(f25W3*w-z>wYwxX%go>ZFH(e$=N$Di1`0=zev(#ee$<@Fl zYU;W0`9zCbyz)fqPrJslNrhxAe2D?irhX;iU-R_hATg4`iUUnRR0H!E)%I7U-4!11 zi#fYDPCI90Fj#Dqxttd4-1~QDZTha$>+P4c)=X}D0Y`(QN=!D)sH?-|qsHedD(K;& z$L8(om7I#2|`F} zdeC`Mt3mmXmreU-lV)zJ>|WQ#?4;Nf+n*m>ip=jm#NIMd;4pidT8VPoX11er?p!Qb zj<3T|Qd0^F=16NRGPH{KB54aNk|QB5@DKs+pl%1uiW80_twR`^KnW-1P%1~JK>I=H zY};>34_$Uf3}Cl+Y{NBNqp-Ku;NIO$iRgXhm)iA|X&ksd%FJM;?rr}7wKn{5)5%AO z#MV;PRY1XIjU#luVRH(&Sr93xuZYSU719u>sq+BRy*z5iPk;;Kih@%-Yp8+qU=BJ4 zcc$K=+xyZjkxxgO+*J_Q;5Qa3n;X}e9;4m)I&9r5WG35iVY?wrC(Jx0ol| zus&@hI{Vp&!z9VttO22-=jB30KGR>9O%!F7qB82I;!|JdK;hEMZtv~gKF7#)vB=}Q zEAHnzx_k|Mwfkppbz;!6*HL#yd$DM1unWAq9~~uVg1TIws9bra9yOd0p`sF?sU#YW zFO^~FMxl}9Xnsel_=Y%i74FrBToFtF-J~!)c#QGt6-FW|O!@7Nm$5TjCuZ#vCOdKW z#s_sr--)>U0-RFR()KRds@;jR<663miy$vSLevzCA+RzJdm3c@G*v93r%BRu`C*R{ z<-q>{hph#SAU-Rpr{Y~-vp@oe(38-2i=eFD87$otRCw%L($eI!^|d>%dqGD=SO)-+LR-(~PH299eQGqNOiI*RU{fF9 z$DJ#Vq0w$U-fDVOl;bC)#7&spG@02>18(*eelCJF!nG|fa&cWWIoK$4QDd=kE2L1D zjtJO#{pf32FU1)=3C2BXk@oPfULX=3q5xL41C4zD0MF8~mMnG`7ns~MU40hB{_;Ur zE<>!SsJ8ED_I({5DkyMt^6d=8O$8=zt8v+iUj=0IQq#{-ku@x)R*_g)t6CSX%*sqM^5{8O^JfX=96%B4*vkd?#vr%?H=XZ+q1Ef zkF2OSEr@7_W zGf-4izUa$tOfKLXcAvCnjzdUr-b#v!x#kHWQVI9x5y&A1Fe4-J5m0N8Xeue>X~U|< z^TjD(Ko!jar3k?vZf0^4cRpc@m zJ*N#U;oz4eE-m0>K@yu5y^E_Bc-(4?(5L{KpF}yw^80#nv`QAMkO(>9{+Li?c~?D8 zn{ZM80Ce&@hj~zSJiEJb=6471T;}2G?di92^>nz}SZV(Nk8MuD+fv~A!zEoz@N388 zpr@3%vVhM%?1y`8-Qsc-6IN5>aofC8WTU2^ADrG@g!vqs{{RxkOj4qP7-;^| zoptM#nfOWB;mW2kV;~X0sr3{TU_A&te7bpO?m^-mTs0b>m^w+JK1RM>3JaRrS&ru$ zlP^AJcQVnOHe-ADTw7P5eC$zwO3=?=|^0J^cgkjKZdt6IgT?^QA0$j`4NCf{{Um8#_!yC?U}i^>S6Pl zs*Jr}?Z9N{&c@w%gzMGEP{#u;ZDe~V6OGvWqcKa9@u^?480vKm6e%%dA<;;S31&@S zr|}b?o+CO&XGu=T(GN@mVwD-1W?q}6Ts?Is8iOs z{JQnNxD19F6$J_MH3Z}ZYJ*ed(1*Uei?=%#s};Ahz01FQQysSPdt)p719Td9@%5B1p{8+y`Z!!ql!SP&2738|gSWVz}T& zdTIU>94W3LA=C&QaYp?`2M5S!%pQW=j>F#qs*hsgu@Yq^+);mfx35%nrb`I>Ya3IK zp@s0-f4ahMJjN!nnk+R?o_eXIMxZY`61H+F4~FrHgs56dDv)WZM*u<6L8v219#sQ9 zU6H^r0Oe5BmIt-G@_yVf#Scu|iz!{6#qCPH>)5op+}fPq5~idOf5X=BXk3!?t|{q& zMhH01Supf_6E|O5y0;~E8)5BwFuE`@?Oo?vhTYj(SQeS~=HJO}sp>z6N>niGN zqmG7Ie5D;Op6#j46&19C2Z&HIk3B90IQn^t(uc2V4O&U6T46P5Z?s_Gdivw1EKdC2 zIJh5h?B2+!+haRPKFyN_wCdiPvG&&4wAj6qxhuBj-lc;nUz9QlJrcWC#*HmtwU4)l zgznCTkV4&*4^<74Re`N5fC<#R1xHQ>5b9kuc|a^XKx4zXPYMkB9z1%TwDNG{b9f5f zzr6Fi3$l9lOr~Qex-nau1xHnsX=)6g!1|XbipOMfS-!z_sqs>z(zFsMkZOe#0-9xx zNSZm|)?|?LkgMz(UH)N5ew`~O$g=jUCkVpr$mYhi(GhU!>JhlgQ z4Bl62R_+;UzlKy&_HOI!Y?j>5)#hi-R~pEqe7fqYn`_`_q2adUEt5gy{4MloO+A|ayps1)CLDVza!-A3ODe8KcjL1iV z$8KB(TWVnHHf1g%lD9iUv@)A6PRWLwbO;w2wW>P{apS70QBnR3Kc8eO<{5kY6}p45$Y*kA1~=D?rD>}2bI%MeRM<)6 zME7-L;z1-UBF7+L)F8BKc&P^x5IB|L#~o@&i^nUoq0z&Q7}kRzcGu_jQoSqca?m$U z?b&xGM|ENL3Q1CS=UDBH{rr0y*ab4LQI)A}uSs1n=&iGfio%m4H3eNpMz8kElj`=( zvZ0pv#6}w|Dz98=R*tlhNELSk=*Bvu>px7gLTRLF2AC8%5>VBv!3_%mo|#VM#ZpmB z`*M=2?=iR|iT?9rcaHk2#qAxvnWu%Sy6bGxRbzxnzB4Xnl3J&kXex`$u~UQvi^w8o z1~`xt+yxr3xTq322fDbU00=axB=qa}#M0(c(U2Csy}(lmQC{ERYJf5hI#FP^?$_zA z*Z%-XG(C0NI4JS^a-Ru?!BBS;n`?b-KflMtMOQ6XV`4T%O$B3aym8eX4J{ZHu}T(6 z1E@aRmJg_c&E7R8G8~`Oqq>@`ibE^LRPb8Y9ablZeOil#F~|&j7NCA4aLQG@sz3wK z^n}XOVrsKln$bhnwY8Ohz^bsjcWYE`-PxT~dXtmPNl3EM#ZS9;y(K$%v){yoaa711 z;!9kIrMg?k6CFz=s`!0H^^-*pA?^|rnA(g8AR3;V7Q!bePy&uBLG988N)Ly^Z#;sg zq)>G)Gqz}RRJ(^WpTq3VzRYb*T)C`%$-(WN>5`}2IGmJGi1#)wmugG6wr0bvfi(H@ zH8qsf>rnS~x~lv1B`1CDiv};2CP!5GH3@@U{P88au-lmQznX3 z;HxmmHK1KpZVOuU-#upCgCmK83{3{_6+2!XyNcU*?B4m=vGrbiA>{u6auDUJDw3mg zRK**8{O}`#WsWxuh+*z0x6OPAH=}EW7$f?zd$Y-&%Uu&7$G}Q29 zDX&vl9+M>GG?Af34es%?MI%g(YY{pe07#HmQWgfKw72>y6r}()9a`oB0?AgSpAsL! z4pqf+7ZjosPchSeYi6V?x9Owa7%j`U=x{kq{a#aJ&}B2nYU3ztUYY85?hZ_DJ0Z8K z=g7EqRRcy22uwH1LTt$sq*@q@aKc6$YWu4AoAOLBOSYYGEohT|)&5 z6x0N2oGD@Ow~-716#}QH-M@$5osAAlYxTC)&1W#VnzOj7y2Gxwb#&B}b=VwiP}c71 z+)hHZs&W*OW8`L%wxq~aot7{c)9$FTMI!#JV(6m9sL>v5lAz=%Vt)uAR+#hZ<))1s zI+F?#z>%qA2L~e{a24|$N$U<52Tb{RF!Xsx+Sv?_YHC{U!=Rq6ddn+_!NCnpRv&ED z<2J>9;FCK=QZH7N=`0{z%>WlC&XOc^B$kfSohgk)<7Td;nQAIXzzV^!+FPgX%ZCCf zG_r#18%PWVG_+*?9zPJ$al<_c+lIfhJDsuhd5+GPwJz$Hz5GSZ5e>6pMY zR@4rYlGO3dG_cL|pvxws*q~N}GHFWattk9Y1D>9G_K&i#uh=_+lYVdhvrHD;ixIwa zb^Rlq>^hoF%S$wo;Wln-Gg%0JvisU24OKmKQd85?c~v7aGL!Aaw`g}OXjNueRavTq z3oHjBQ69QVjA{ys(v_}y(<`-exE#oCUe|mE>6( z{Vt}8Y1wLwbt58!LR-7MFrXmNsQ7c!u}0dh&6G1FD^NuNQrtlp?Vzu!o|RQpI6cj{ zarmfqzEXjp-4)qA;a9tRUn#j{IGhybJncsM+S_e*{@Rxi~_JlvR*akhI5(8|up_ z1v61WUV}7(lkan*Y$h5intJS%avU`^RBum#lDacPmBv$78rb%#(MlE=tD2&0gl!;3 zel-`aewbW3heof$G|&^KglQ$UV-Mo|X{4CybRXkzNN+ojA}RUY|E!9Oo$LH@0-`6Gf1Uo-MJr z_Jmt!0g|MO3h|A`(`5E?OAc;}3QR0w6>zOf3rO-Za@GuEawL(YxHK$J5nr$X56Dms z1a)wtb@3xrRIMqW+A2vuZ?91{@AnGpiWtLYk5Ge%xG*Tpr`c#pNHSIg9aUOYN!hyf9t_-aLT zlN}?d^TILX=9!VH)B+@ zl#d}j+>oVwfwb9UWQ`>hDoGU|3ozmn$k1`2KeMacJZwtDt$+zyRe&RlA0T{<2T9md zIkqFhWTT^_+Y`f8m~1X;IN5h5MWlhEuG}?w3aU4w+`BmWo(gKTNusu>)vhn@%7p9Y2Ma{`9j_|X&${y;(^?uj9G=vl15h_Udm!|CfvB*HRf{`eA%=WRmy|(SnevRRXNUFycRu94bzHy4$o`S5kJ@fzJcS?LLD8u6S7{ z!x`qOqlT+Jw=tEiwPVO)cK$|(Bb?7wr7mL~SeaO>YIp8NBRa)GlmyhlF)io|W1_`l z{ViJBfPIGtPiZ8c6(6^%)g8$y4vC8?t;PfxM>ixY~k%kM4G_U_G1B=pDZ;*d+P#09V62-TIBODCcif3p}- z>c*7y>BVZsJXg}B)H66lr_8np@&II<4!hYo&9%3xvpIFdZcG+)Hu*ifL0O32)YJnH zw`ef0O}bxp(B*da=-jTEOo~Q^sYN#{3Zf&ClZqvi=M#W+O0FLG>XsYrUF2DXOlHOR{uH}R-BMq4A$x7q4 z)&g98D^x-;XTx@WedWps%m&w2EMfX&q;dfO3apeyEREwLis6kOP8u_rZsx@mveu2a+j~% z8-97~DCqXpRZf0UOC}>8w9>}}W=}y@RjDY)Rdk*`^snbi*1nx=pkUFO=*as&pU&<4 zC2m&@xc2N4FW8N`GW&}Glf>k5JHDc>4;1rLJYT$FrPVMDAJZt+L{b3xf%`^9KWU~q z+M_85B>j{p=Sq>EmU}zEL;HkNDnVqQ07WW~Y%B z7{vukw8K%2)vVt4rn&~8SLSHHLKgiRkEJEXIWwsh|g#H0ryzBG3 zgRO8|j=#4d!d9fPVrZ&jsn0$$Ik#!(L3#e!;+q*oqe`Fjwdtmfoe63L9##0W=qvWr z)2Vo9y0WitW9t6@0I=!nab~0Vdqq=2wkS4@URyY5YBpUicQcHu$M#lQu+0r+bz0S8 zVWOl-6GPaOv|z-Rw*3|SM34#oi2%}^POP6UpNvH=1D3e-#{s|^kWc$s^p=Zk<7@JG zy{8mZxjo@Yy7yFDvmvwK&UT%4ad9msQkQc>hr$QjnM@@eJu|^5#Y#lfrRwTfB9D5j z7iEn&SK;#>wI+wq-3=zh+; zHR&Ct7s$|4^5RMRbJB9BYv|pX-LskAyIUDejgFXAZ#CT&n}Y`~+n}I~;`UA=UA2j( zi+JurO2Z8@Bv8vN3_QLyGJ9(T20%)a^R0eWrac=1oq9hJsY{A}&K{_XC^D3evMR-&-?j90`T1}=cP(H3OEeJFO48EPs44jN z^8Ww{0D6ou`Fx4_4Ec3;@g2j7OFnV|T7E{9A8%PHFx8dyqb0TSi@&CWEj$>lm$c|} zw7GPoriH3ECPI@LjFs~HFRAfSRx{J(43Wb!sWOOEGka}eEaor`YxspfI&l1}QP+oz zq%+}u(Vx%P)bRQA(~f9y)S2C^1r9XkV3TSsO*z9>V`i<3Ed^ZJ-Pxb}T)c+?hVnJ? zIPpqMB`qtW5Z0|hF@x!j6#F>Sq~(&jUX}9U{(tavB6d9v$f4W&KC3RovI*|yoESldmb6800Mb@LqF}Y z`!G6rll0NtpB|V5Eh+N@Kes23OuKV!*5-F?F)rb!+dHEolWl<{*)7pcyr{C9jv4cG zHCs1jVCBZu?TRY;G+H!{DN_$jYSvkhqZSPnkHi|ZlGrsBC+2*Q?dpgm3Tn){b5Ljp z$PX&{Q}*=OxV_6sSCP+R*Ky+J#w9K-XebSBeP&*!Jk!%r>}~0q#=bg(c~sI?Lh{cl z{p~ZbUnv@c2ih<}jld|rU{DXU{eo%L%#5n39H&>G5Kpc=zdk)G7KQVBk`2Y(yP}GM zEzvG^8s5|1JD+t=v$t;D$6}>ih7S#y!Q%3Dl1GQgtXdKXEmbl5Whn~0p6FA+2#ygGf^aaQf^!MC@b)U21TGkAUZx3f5zvfFA6xwUDq`?)Kr>2qn_ zCYvLJ>uem`P7smO%sx|wCDri#cH-sL)DW;&}uN@l-pJHKX6P9-hdNfq+-B-4g_ ze{V~^)0-tNOdXws-dQSaeonJ7*8BeecjrDt<9mjyddDR=r!~~ua+3qKH%2q9@OXKa zl5Dj_BN?1oSTpE4jZwmY7gCUD8cknqA2|DZ^o>_6saYEYkgB8XD^Nc%&=k89Hq*(6 z+VtP)MoNk3^IKypU4g9Hl=D!Wgnz?#R?uD1mBxtZw|t86)rc4Fj4&^elvu029D0bV z)Z-;Ze=>NFnd++v1uEdU{t`*_@*kfH9F=oat7&f|h{J6Y#z%=BX^JxF{{Uw0V+NvgI@1#WL2 zSg)AQ?z*aRO;;>fns^p3On@UFd!ms})%BqSaP&RY{(nB0)gn}*6Cas4KV>*)4x;$5ht6O$0R5hLIW5 zQyKND?^#-7-s-4syARB#=S-aGOQt<@bpvNH)wQ&$3FX=lnBc2NFDRzCD)RRFu4 zJO~R)SAnSn(}ij(Ji4Pr7|~Z^X;Dm)eAIU)a!MS#((@m+hwxwqA+_j|PsCz5; zzRcJiW0l!^C$HYBs~J;3Hzpr%_6d1!XV8zZo? z)H{l@rYJV$7V@du_-)5mQ9d%3jVkJEF!b$Dj)GTLs99Nwv1wvuQ7cHyatdlXeF0J{ zQRP~L)u^PT#xS0R2vJ`u*0iUd2Tc_FH+AIj+1zdpwn10BYomu}=J8#XjmPb7>ZOBt ztQE5EDqY!MN0{9*;YvaPSP8m&en$*50tYeGknT9NYUL%HztZO!^AYH__Oy*Ez##t@X$8OooMxO_J9mPN-+ zC4N^APaQ_u-&mS0RWd_HGU|pjV;hf8zb3!YVJ24;QIk(53C1I$w9644q!IvaOT&$6 zT;vf#Jo@8{%528jmA!eJ**o@+JrGK4K35A@*0@YP7I!S~3EjP$*ctt+4`ARn7E*fD zc<3dm@JmE=YfrDg31y8X1|c=E1&LN_{{W_@mdDHypDgs*FiRr#5NV`feVl3s zYAte6?aDZ*X;L;dl@D^Is1+zkc$l)1N;4@W;8j^@Sb9_w)nq~riBdoYD#{2Rcwlf3 z+0bd7%?PnMErCaxN&3eam7BLSRfxt=W@FqtuDU3EGvu?F{C?To17cL?Lbf?88ENsR z`Xg_vIzUnbGiqvUr_0bD6yU&d>tCrZoiU6GDWD%=u0i<|nsMts;)(YL6J>4cx_NMQ z8xLpFZT;n2Q@h)Enu#iFYHBvd(Zuaam@)XeN-CU_30z^Ot%5Y2nxfg|P?ss{mD{JL$&VB_5wT=wax-7)63t}c~w z`=19@TY|x2Fm!n8s(fryR@d&FoDJCt&y}jeVY0c5T|G`-zZHg(Ixf50xg565-8fp@ zo>T2#Ba-aexNF;P6sx0_WqENinwY9|6?GA}yJWmsiUPDC98ikW=hfB2 zv+5n(D8hqHeEmIY52+n1Ycd^!weeXrwcS zxl%#F0Jm@>ju?+l709L!No+n#XT`Sgl$jl&vo?q{6&S_do0C1**#+8JyfsuaP-E(8 z=oSn<)UV6byVg~SW64r@0P@2cg;s2_W+cWLK_P%cs)QQ1#l-L$N|Ey&Zc#_Q*rEcy42v9!*ZFrn-tS{vOr`QA$yYHVrG&YXig(s+HAV z!T}#VhCFLp5G&=wsC%bwZ|W>~&nCy;lsi#z`5EwV?)qK3lfYB#+>Kl_?wP4`7+MT| zGQSy?-XYN@qmfn+e%&;(G55H{lPS7J49ANrh6U-}kHU1*1Oh&1rzlrOx@tfL7-?V! zz$$q8=QSREHc{>!*Hx2?7bfh(VzRg_tuFb)VJYIJ6tQlc(3okFVWl4TX;%m6s2P!R&p%w{dvQiH@3P$>pDFVzCv^i_g+m zW@a$c!Cz4{@WXk0yag9|OGLme5`fc%Skk9}An6sM6erW9rUY^fZCNQnTnY{WzE$%X z1J|U4v=n%HcrY8LT55b~tjJ|@aP8mV`=@&0Yoo`cH5-bl)nbPog{`KV5l;-2(o-yo z=ltcbRMtFE2y+V+)DPkUq!ELa6|WDTI`hn}N@0SZT33Y+1Cl)nrbkL8!sj<00=o~l zup8d8mXBs)cQ#s8Nw>6r!KRtvpK@*;!?)sp^nb95MkW3qTpFGVfJq`k8{0@VJQ2dW zrI5CrCZ(uP!yg?$VYHl#oOQC`lM;}TsZha<6};d$ zobGk1F!Xz?7lo?Z+czgeOkt*_-1OV#Ok-{B{{TTtOd2^Lr>0e>MGVE{9^Z>o#9b=U z#=}Wkw{I*twE=$7*oVB&ap}p)XF^0OEI)4vDlnWKOMU^ zhD#qGUgWlhN~dJjR=QVI$&uXnZLy8RPg&i0qXcqIQJ1f(h~gk%AReNjxYtOzis`5veiCZc1a;{q4J0z6Xt)F`6e58_oU&$^tz;d|@S20ulo)JvCf3Mj z;LCP4V`iq}rG2Hm_YQY&b?qGv?yE%p{ZdD;=1tX=+&R6&ji_kpE5cLLK$ezy9fps4 zj!7l)*kVM8j48iKls^8<@l00^RwQ}|(yk^m~vd4LX8iJ`%u9!IIW ze`sR2Wkqv!W?L1vYqrK0B_CpDH@9W=R@TT+0~<8~|IhAJ)XmD;%pw?^9Ry~9zJEGFxXg1DSUCbwzEo)VZ$ zjNfM_hNzZTEueXobjFiNtv7KpuA$jXE0Izqr9(&w@f!w%kC1?6F~;i?5Cl)8omu>f zYN1-1#t0&(gM~#lYisV!)l=t{adAa);x&)Z#8^F4bjO^<%Km+kUdYWzmV&(Jk5Ur*7{VzU?|$vjm!9M5+4 zg+4x?4N-^6RLdYfMFLsY_c*ttZvSt8pB1r;1kxRemFH#p8)hG?wi?M!h!Z z1eT=8jzK7KZM5(bww#ff<;!+RVk277&L2hDA6M_$dVQsUL}w% z7s3=OWl}ig9QCOqx132Wvxt}=E|hif%AVaxsI_Dt7L(~vdI+hd%~G~23rCZveABL- zuZgP3RnkYcaJd+sQCW(tqR2E@{Epy=v{mt>B5gKDX4P+ONepnjvJv`a@Bj=Ml<5q> zek4Bw3h^az)s|SrRzgF8M^w)_OAI@Mc5OV)Uon))Zkn2fvQjyLspw+6K&xgfBx)jpGvOUt^tKh#g<{k&6@C;n z8je9dQaOuBD$bHsTe>{5f>e;pPCBWoL*1kr5(w+83g)q!YNL6oY-*fd=&#T0Eqq9@vdds=dp^qCI-0>>(~& zHD**lr=dvrDNqGG`tvJKag+L`K#Y>5qe|2uWATH=r~ExBn+WY1;OTH?3J7yp++`l! z!yFAxV>7!j^wGh)ArR7K>t7)pn8wzPke)1L)c}Zxmw{8Q5>-tB{4gXez-5VO2q4sE zp_(yJKeWX<^|=ouQZ_>~71E}@7{gE>Fla#I{5Y>)|JT%nWV2YgaGP%hpU%q$-g=GM zLr+Jx>8bK~9mOZwBpwHW!h;~O+M_amN>)YX=B56b|Qux)K6C&M+cg${yka!*`&kdrI@iwX;QKh zEh?!u_d^|9Kw{2E$SBVOX~d6}K7BXcT5YJZeh^a5x zn&F(CO`pQKJOJwQcdT%UDHg3EaKsFf6fHCAPuhBmk;-rSd~I&+-p#u49haNWQ0>aB zzDBzXv2oJv?ZbKh{`Qnr{ z>ru48Fbzg*8UdB#=aKWJ0Y5IY%DcBagu~}+HrD0HZFq5;kNbrU4Q+Pd#_akmZ8(-( z*3+iM*8cz*+w^;JBNESDT?$1Sr*B2q&cN)r8we(T;k`xZC&q{b{NW*Xfl|OId zC#9YrcTbJmd!Hb8H(^ok`t1JPjq7$+_P{~4w+;@p~??5Gs}dY zEPN(X(#yi4vdW*Pj|$MWbg?R|Ji7oIzuOvmdiAuHq|EMh>7tD~nSAOhXess<^y#yA zO||pcB*E-?IY#8i@(Ou=8%;)R77P1ONX=^L1YH4vY z6C{Wn0ek2!&)umgH1?_|siKdB4jPz}e7bRvus~H-O7YZP+vdd30&9Sy90}?^-rn`w z8Z_HDEyX1YE<&JG40N;X&C$4NW{A;dw)RuFXe5_#4W+c}5&Tp${jHpo4Kx>^-fM{v%Dl@%XrM z_&v3~yEAfR`^7R?%F3nf45eP-iw9ROCuL+|VHPTXw2LC%xcreXknKcrxQRmPLTTHe zVGrBC72N)I8!tw$kIQU{25l5#=(7#OFWD_)az6uX11>M&a$w(yCOivf#=IkL9p z7h~gabeKx1Jn#yvgq?FqnXjnb*#l6OAH$@rin-!Ik0O>pH7>Sc-i=g9@vN_ zG!Ii9ZewBY`b?d5E_%LdpYyfQn35X>U%68L?2Oda78qk3eK_zR;q>a#NfelL>@*-! zqX!xD{{UB)Qg{#K{{Xa`Z)0<3D^*WVn9J`dB(JWi!)=@% zLiE_$x{(Bi6*9!SSwL@F7cqn?2dM;#`I-+uLz;DW@Iru-2My_f51_3$dhqIeu~kz+ zT3~#J>)6m#(?P$t?%drwl0BV~u4*Z&ab16k>}(uUOD@r%s*)LKsHu3cC~hY zH8xE$6J#;z20Lid)W@}}v6&9Qq%%mf2ceFYB_uqoK!0u$lyzsP`cTL6@;LK6JvvN= zP*e1C#*E+3{f?bBK1#C(Pfxib+r4+Xa64L;C5Eio+uJ=+wKpbbExf9tT%?iWI`=Dt z-W`!a8$F_?YKMubwZvjE@$QD9LW!tIpsH)9_=$`~D}AYrP1 z!|FW$0549i;YvOgMm(y2BVL5v$+~vlZm&H_G<}!Xy-POP!e+LgUg6>E`1aF543JUg zbGyH2LAY@kXUXNHg=c@^;AQG6&E^&wz1mLZ4Wgw@Xd8#fVub!f?d!z}K^!EkTxvl- zX&EQ>AIqfP@t0y^%?4{|@BYS3#Ycn3B$Y2E&>mrKdI{);EI_h)SOUj3k}+ruY>qNl0b+vXm_+&M{U zmac{^zlp=r(8W(fOev`T+aH(AR={W};*I8{nkkjN(3n7?vX>dsH4o-+KFZhAr{e5w zVjw$wijU5jsrdn(l8=zuIL!Pw3{?(liiZT_AF;LvZ`AFYTIt(!wLNxwIoO%4sZoxi z#5ObTBdw%XN|;(AtfC-}jaLe4#86aIH3QTTbNe`TQ6f7iZXQH-*X^mHr_ZG(?R?hR zP0O3!)w?TlRd{Ns{{Yh7$n2fj47-|!s{pXj?9I2>J9?KNwD*QDYf>sLW(`8kIE|8_ znk7E=Rdgfj)Rn;?)9eL+KkBbqc}qJ56md$BMMubijQ;?GshB;hkR4grJC|+evv?mq z*TYtBZKbxhp54H8{&Q|r(o@wuS&i|Q-jq<)<0+UC{0kKYeo1PWNmC4AkbAIL$Us!9 zl4x}(75ffP+0&8h?khkmLI5mj>%xOSG1Q)|#%`%9vwOih>m$DR{>K}4!>}=XM|I<~ z+b>|#W1Ax$?yJh;F-K=&@p%kGtt>+=6;*3PD^y1wp|9SP;v#{V0r7DBj-?>{g?jTy zuFP3AD8Z-rFh8GAC))UJ!L#wZr+IhZT2x;?W&5ZjIJ_>?Jb=Z zcVT4n*?QoyNmW-3Jaq9La!Mi6p6Vrzp&4ISmXT5RWDI|{C*{**I>)IID8_&jpUtyR zmO5^pKfT-CceXNcb-n{~U^345+FkYD+m1!cVDea~s-Gc_*y;ZK?W4CcF*n@QNsX)( z?=*fHV^EyB2dgkDK{4uaf-6iO6ySe4^ublUw-yg`WVgoOs_JYc z*q6u8gxl1+KB4xt9R@yHTxQtZJxh=53QVkdIpiU-5&2vs2gxjm!1#leB)cSsg(?L< zZaDtK>D3?mPYgr_JoQ(P5yv2U=Di4*x(H$2_^i%zv+x_Uc5gh@4&lhpO|Wx)rHs!S zN$P5_`)4n+auRJlp;H|ed8%t9#>*uIBqE;N?8CcBKfs<$zRm<11IM}iu(TmA=TZQRBq~nN)I9VoPp_4`ShaR z8NI!=cb3$t#cj^A*zs-gRasTJK0M{}IU3B~?+py8wgoS0<+nCIuCrw2OjNBzX;K>3 zG89>u1Mb1zL{*?+#-M0#+AH?gru7?m%xZ`2Wa9qzZ%x71J6Ck$ zDrz(Pr0yNrT_0|5+4oARlMA#ucP+Hy+ZdYq8a0|IB!Z5Q8&6Q@?q%Q+eHBxxO(gKD zv2U=N5PfQTtw4zAp+YEV!2bXsYCg*J9qia9tdA>&+b=A5>b&+-HImqM8@_`99d6p$ z7}v?rHu%HjDlxk+F^V;gp<_zPD`crM$4dY%u3G>W6krW#4JpUx!|lgaGEJZD66z1xPeB#eY9f@Db$q zooh53OQoxJzJ87!!?yQ`rH{xn7`b0yIx}c^`x_cfK_4|>c-P9EF6rj|92Zjsf{>}JHrNxEqI zvuftD{beo>YSU3vtzPWRy=HSA+V~9BY%Lt|*3d}uYP_wVK$BjDm{JjF*JKA(*d zU6hR}@c>95AIL9Iv+b~QQ&-PTvc5oJbM^F3xwq8#ynZTelewvB>Lh$N;g4a%w(-@Q zGplK`5Q+ZUx9$=uRPiZU7!|V_rI4fB)RDyttC30&R+Jx=Gm<)}c>CTK(gDt@6$J3} z^ZR;+v^y@gnxC<$ahu+nnjPY+xqBNQf!VR`TGp+{)ljt#3uNG{FdM6G)oz@OY}6R) ziDIFpg-McGZb595EK;w=S513>A#22|17AvlMR?P#X-JqTP^8xY5Su9;v-q}KIy-Le8>d7`Tf+OX4!&oKd zb}~HjNKG5MqfnEyC}ZXb08oKbOxLE9OHv^omeblnp;{X0In8Q#k_WF!EwhA=37gLC z$+o3F?SpIW>~>FeM@QVfeUI9edz)$In<%a73gH zD_2Q%AZg(`^#WCm3XzH&0Km|iig{zFD1o)QwxlAMQgv|qO4HM&KV@Ly+Rd?dWljS< zwYGNembRiCtppu^jBFZi3|OhnVfOykmp#1qWgbcy>QU-97U*beE8^7aPaLcVx1HYR zCb(S;%2YCksRSBS{vrs-IRgOWtxAP%w3gFU$6)}EPa%WE44yRUFpq_jDr&8d*qc*# z?v0a=!s5F3Z(;EJn`G4GvR`YEuig8H9k(|dWwBY7#8IO(xvKh%Z`@B9dRjvIJ+)Yk z5V2b7BT|Z%C$&p0Drv%^fC^Wtl0jw_V$=qN(M1hNQ<@K!Yru5dw=&rckzKa8M%dp~ zIDPR$HcxS4Hx4nfSy?hLWzi9PV|HV+^jnJwio$KGp(Z-7A5o8wDPF8982I!O*@+kt zbO}PhgOJ3IC^WD&Plz!DFsK|l)J;Z_;%os*P#!t2aNztYUeW<0ri}hcD>l6(`-67l z_fAhUyI*kADyd!E6BhouDNbm zU7efaBsQW~gN`7rJm?AY;nS_A9|4vn4O-%v1big%s60T&r%)dak2JW7oYv`=XYDM` zUQh1@E;kvJ+#3sI3F)S<+H|;l7Bf9nQ(u|L!X)uftZ@CCxbjKMduWAWG_k^_YKrL6 zDumFn7&QcN&2mRocMmRuE0@j~HxZfwY6z#FmkjjcarjAScJt)7*3XY@ZibeVC64Q@ zu|v2!ClP|#X)ECJS&f}TOHYv7JC|@X%jA-J`JxQMYRkr+^feUy7h@tefULA;3~E|{ z67)PXP%yaZg1#K5$D$!kM5zTq;ip#tQJ*2yUA<8ZbhUer8BMe6cE$j1fkB+f<+jpx z?KsHQ$BM%mx*9sd((X)AkW^ArQ%ClqFFdhY;r;lPY0BG!saZ)93Ij!{0O_Wd@;UCH zIq5=S0?OyR0E~c1_^DqZ@p;n&r3D`J#nND3t>{JlsAgj$* z(QggmikEfKZj8lCiE*@VTxlS8D^ac>2fb^W0d(sjq>+;0*p${l_=Ok+0-%)A#EP#I z(}@gCBz0Bs17M13)58X;7}lQ=NwsF&J{1;=*Lj-WPHy;gJt2nV_EIqwCvPS@b0CWM|b%Cf2H3Nc=!g$ll zwdpKsflb7N0jffP38x)3;%mpqe8);=-1$zvS#}gZ={slj&ifTzla1RAxf5^XCyZkz z6nlSgKK$7@JVyAED!Mh6si~o!o~d-fPKC)~UjPPM`0Yx(fns7BKzmMT!k`DQYLVIw zPfoO{Byw9witQOB5uk!iC`cx>Upf&}kw7{NusN)LF`~&*H5DYeiaJ!?$(!BTOlHf? zgnhE zx6jt?ZqKg`*ZVe|CTI>af`(d(h>;~ABcE@$O;RJrODWe=1RfIuOe#?6Y8;tsQVFJd zVp$3RN!IJy1JV0L#V>^;8}%o803 z#oPGIjQg)}_f>vYDIu$=uahB*KJcmA@Md?`3#PXJ z08{N;thnN3p`+UQ4Ygm``;wNI3KpFzbJWvN(Nw8026p$T%dNHDoyMdBM3qq)g*&@X zc1;aSENoJlVbeup@gtTt@in6>616O8+yxGhPBfAgyoET1dTc!wLlu^y>|7NF#@yRW z5s=I67&i{{r0eWeK0`4Q<*;LlXZJSnhc7%YSO|Dvsh*)DX{liQ?v?&;(BDpiwSiuE*6Ru(6%YqK{W+b;1;cX&rPQvv*{@4 zvyH|fqyp~K5bpx7}2Aw_xaZRBnc$T1e4QVcw=+%;<4FH+q*Z81OmOXqsG>%g zQPWq~LMqi`(xriA9vVR%#7!KDY*-bilgI&L$O|Y|CoH5koRvOJ%_P#1aLR^PO2}v` z$}p_0#fVx_S!?LtT{2{*72A6V`I^kON=YdaFYZp~rroh(BEn**%v781gL-FcUl%oP zO>BlZaah2V>m*|8RA~0vtg!}4cyR`xWfhKUldVV?P?+xch&)FgtsJzFthHmNyg+El zrjf#@P|tD4r%H{Y*}Ud^6Bf+en7x&`GB`=<_AHx&wclgZ?Ha9T5s=7a_vY%v!5(_2 za!@1brKhTjk_03qip!v|{{T#}!fwSa)>5Xb<$Oh>B!QPuK&)^8t$rW@uTG?MNNx;H zS%PHME1{}c3Yr$BIPo>bddat`H;o3~&u*&Nwgqk*87*AK0*&9u}D>wok$9;qnzJdTRqtNwWtrRO$Zfl3PK9II3N^bMqfe* z>v2mAalh-M3j&aSjM`q?t)(*Z&@UTZSS>(W$?v9 zgNdF%{u5%W;efA@b56BAAi9+rvcMGReO1*_@FLJUQ1?~!2jB?nHt5`$<{M*W=5V!} z_KP2~TRF6`J&X4{avq&p*ruAZB}Y%!)zaj$6;M+z?SB?{CZ=H=(^H3XPpwPGZ5e_B zmeWqb?eipZx|%D|$def~3ImGJupMefdyg3iUm7G(CBiU3J|Ez%eF*}(aB4QiT! z2f0sBXfeA3ABvV;`vjW~moJQ}rrEUk4UtQ}7cDJqbu_Y7?R@@YH?}6&(&61Bi82{R zt%L(BL=`N3qcVn(Cs<2bYi4o?Y?UA+krCW!QcPu3H8JJamKbF1@r-w3lvAi00#2bN zLWCy)NH3?)um8~0k1>?o5>n-N2IH%#6#bPlWT2?TQR6oL-^thDt6mzmo`RDf0z#CG zKW;pEriwRlb#KxW=_&v%likFgK6Lf;^7QD*nnmKs1{44Q!1Dh9Kbh)%B{p||;&#r< z#%|r^yRxmCs*7lK^>mdoY^Y|dNa}LAtX+OrEV#UVeC0>pO)OA1h-#K%qTby^1(C9J zsqSU~DvZ!qfb$~)zP&OQM)43D0>J45;wKr!N%Z5=j$DS~$L~Ggj>+Oq_{i7d={EE; zZi=|;sc<%f?jgwJ7p~=~+xwcXjUbh1X;bJIt5o#SENabTAj!8aYKm-y`kOX}3)l6iP$O#&}^w;^~ zpFbh<>UC`vUnRG4f5Wreo~y4m-F80{Q9WHP9v^L0Vj+ap(=?l2qcFKKQ6>F&ZYH|mi4@{tERc7Kr0YR+*z$K0VJam9a;nFuhi^siAPjF*% zYPGw=JBX>lMY<-VT>U0CqLnJ?CEm3d&A*D-cucHSw2LWNnQ5yaA!A7u9lh8C7y$99 zCWM-KjI{~*pIoUsf&E}2VUeU<(CrKuF$F4yNh|{dnR+_t*x%u*x9k0 zTPN0A2MI?|@yCwE)6rw9r-h}72yJVq*;T>R#xQa!7@j9n>TN?;0Hlfoz*DQp?894x z@pRyVD5HQ;K|)6oKtFFyTayO{^TXgbOgZkoijN^vpU-1Ds+(+XoJ#e^-IYGq`_a6+ zD{9}Nfbq{Xr{f#%K+1lO+?BWnWtRf z0DH|a4w_(m%|6bOn>r}>h6VN=CPS>Y?$?5MS*rJj;)i5YRBlXUOwewu#_-HRSy3#R z{B+G7HU^5KItU$%ixWsM?Z%O0g<45M#F+rpP@XtYOR@f!42F37K}l3vW+=C2)2htAq) zS4%@@4oz%jPosaauOPY@AgZPc02DPb*U#Qo|g63TlQ|d4P{ky-1}9G^4WA zD50;Hk*FMKa60oZ>4O>rQ$kHZucmN*%$}ke+)W_&Gt4AdU&eKNqn#mDRH}e5IMkjv#Rtx(&#mhj@k0mm zB7jf~4A-u82~&j?&s(@~5$+mV9iN)W?s)f=esZq1wwg$#$L#!kl zEB@A_Q3vHfdU@2WLs?Bk8hlmxaP0@}t~v~}HQ2fVgxfg&tcPN6U6$H64Q^W@yXZ4{ zYRXuiuCpb(cE0NW0CD?rp1MXwNMnK+;yMDMFYe4#@zMbF{{Shesp&Qa7KK`#xIdS# zLf*>Q+y4L)gP`9VOLf=cH%{%^nT(R|jm-yDZOw&6)jOO|j@}6a?~Til&gHi)RYf_a z#8YCZ=+9$}dht_G)CH;M{sMfy+H@dKJ_-tI4Z)O?`}?!@oSEY$T9Sh;)EM-Q zvJ_KO*3;y2G?P{CZNr|eto|ukK?L;~`03-kix#DCc2yCQ=|X~^8Noh)16~|y`JT0p z)M|pBbjh#gI36D^J#?F{t7TW!?{28(7_f@+LHN#$CNdYOIVNOi1w!;wN&N{SvJaWot&`wv=m8We?$iqtK2 zQk*J9DW5OeIzc^or>C8A8N5zDuW4;0+d7wR?aZ=gcMW{9m&DNIFw+J85j_L6i@0mn zYJ_zv&2t$V?#NO|95eo`e$&;KjG+i3pKtp){{SaWw6r^p99>53q}y`u+3E81*eAq4 zTJ8#-8E3ye+Q52uD zEUOT%mMh{^kLZGF_7Hr%X`Z~Y#Ig`kJ|BpRIb#;t;8bdSFL06mCS5cL+OBhf|tyEN%{X%@d z$>==2di2Wr98*kcMh~5H<|==0On6MDOBtBRZhS^Fw5jWM)(0`Xu$z}5h}v79?DppQ z&6w&pW=CdjNY38b^48Nbz?B#@N#w|%I(XuZK;D-cg7$(unuecm`j1Yt3WjxE6yZWv zr|jWgxZ`P|$p?1c5@hgOCK}Gg?Oo5b_QP%;u&b;T!wEs0%H=b7Y_9gg zSQV?>Fm4{iq;8zU)a}l!+wxW%uGL+&TM>snMBAdeszrQiJr*_Kc;oUqsnc&2&`8Yg zTD)qsVe3j@kJ-{>kUP}E43)(}txp=CPnLS)wzCxVHQS zm@8o@D}yc{t#KH-YMMCShK?l2JyEE|Vq%|EHBMqnzR_Aj8I_9;8Oa}&2ki%^3;@Vb zkQ5x(@VBNA5zeToo%o|%il>07&8@RF=?Z37vaud>I_ioYNlV$qz za_@{1_+`t{)lC%|@f|#Jk3npf{0T!|I8*yZEAt@rc+QaO#Ag(2gZ^54fgLwsD=T+h zZB&>{1r2s0y00ny<=eYsY-D%#V|woOqR8YW?P&U^7eDzuMhng%jUq5%umr0`0b7FT zAiEYNq$kJG}1wGO=M0MMLF9KRgBmSN3$x zncNiFjHXj`%l?-4Dcdy^lhN*O+1|7}lRdXK4kD>&_ckwgQp9o9*@* zJme}3W!0d>ut6Ho`V+)?iu#XUw&mppS5i%Q&>?mII*D^kIMtEqx#sVOWf%%Cr$(uinDT2{0nm8<9pTzb-kbyjH!2)bMb zpaz<0#+lN_ziA_+e&O7>{=wZ86YeaPUI%II{k=Ut<6Q4oP~vt^RK7|Tq^ru}`rECd z#~O?dYa&onw4y53mT2XfoT2x3mO`RQD)ZK)V<35fMI1Qbb)pctCqg0e6##s^=~L)> z$puE@+k3kl-`rlO+?ieT7Tv;OA?_Wmj--<(j9gqa^joV3xAHBs=(euW%~HmKn5NduJ`T6i8@;-fH+&f2V;<5GFeeaLo zb$Jcp9^uVwMw@eO%x2Wvxcnu27&`2};+mQ~({3p+nPf4hKNhN$6iX8dhqjTj950Gu zQyUVr1OZSgX-)$muK;*suNI7#kHmDKs1&Km^C$V!AoV^BFKE?IPq_DXFSIk&IY*~E z<8p7ky}mPDUsu(eWKq>cMVQ=8PhYxM4FyCH`F_T-2&pM1iWr1$4VaDxXqDD7BNYp# zn6DZN(w`&OmHa}jJ1A=LY-DhzD_@;BkY{p8yza5*-WN~pe8-DK!te)!Y z9iOfWm|e@isxkw#qRiB6J(IDw9C)gu)0u6rw`#WJxyaEf=ju(V zx^tBktC!p+B%ZRhR#1j^X{Aeq7Iltd(H0FT0H4E9ybdS{9$tSgowxB(R%08Bb5VdA zo^+|rKGJ^Pl=;5HuFQXV>*=u_ue9j90vhDVZB4J+8O`e#YHls6C8ONg?$yfGW~#Te z29B1ZIfgn9E+$D)w4tZe!)@W}4(+Nzjdjw*pM)IJl&wf0pHD8DXLB2hu#JwPz^EJ! zXbH~^Lm#uCb!)b~*o<7Mfx$LI6E-4}zj;#s01}``sGf$Z3Yv4WvCj0Hrmr7b>035t zN|>vB(4+|ui;(45#8BZ&b-0(e_{!xYmZ-sg9Q2HbR|u>GF1?6Y`*XB9ft--an;lH z_UXgm>h|25_bp3HOlQW(5q31&D`#~M6C)!se{mWxw3evIia^Qbd;wdv#?2q#qSQL#bGJhI3um7iYkh|F78AG-R}`2)*i0wfI&3?fON7D zYTQnsc<}10K&cpwK`mU2gI+4t;C&BMXe#!`8nb!qD%|}J(uZ(k@U)X}=pKBI3X-2} z(#cup+`BJhV{4%83jN8Fa~(EY?qf(2M5toUukE1C43W5x#8Q;OpAbxDiKZ#-=_Ix8kVo~oVWE(6D_hVha(Wjdq)xhiT%R$stHLC}28p--Pq zQb{ewh{t6Jpas;Qh#b|2kfleR2Tj|8ef16>8MnJLE0q2nQ;Pm2j?7VQ&58U>>}*^T z2Z;CmK^1Kr@-VJ~F!1?SH1}xXk{J9=Ol?aA6ky6TR;6`OfZ#z3npZtg zmYS`j{AQKa!nDHHl*by>RB`E}A-$=vcx}UsdOg{-wNxSIOPV@8x7Rx&4belBgA=~srb--L1utTB#{0%?UA>tUl{=Cs zwpK$QlHaY_)zBl>)5y&U!?Ph*8cLemE6A@Y@WG)g+{$%R1=WECNW}rql@Cwpc%2DG z@Xa+5fG zd9jCge-v3+>mkIze9*p`%Qm2FfoHgaHX&|8YSdVTs{a5BpM}4K6RYRacSbQt{sDM3 z(CHpbaj7av9;5=J<isXZ<1L74vU0lCuk;v7+ie+hq_QnqI=U(|Un$*#ihozuJOVl*^c=dbp5D`e%<`>~Cq4k4C$ zxudG4h>4|+z!wlz<%)nkL1KJBk|@YUD^aK%YT~VmQ>)H@M@uoLnlHjx7@V;Nl>~kh zPg?Yt+S%N8+|1!}J2P=*aCoe3BsFw<0+EeWP-6FGRcRJH;>dcGeGT8insAwgn z5zkW@^+X5*+Y&(xs;babvF=97@$D7CqVdfLZk>il4$6}S0cfvI0FLUeK-Iv3QBH<5 z-+htRyRQwI#`b4n?n)lh!co?3dTjS$;TI*nu-RJbr-LsJ@2RccnGUepv{_ikl9H}W zW@<&elB{UVJ^D!P%Ex$;g95t(Rhqh%fz-!cK#@-J2tRdTe!1AJX`JBY`X7CNpacy*4Nvs z7nd7LOEAZI5e-CcQpT|)sR9VD9buqS1s*a`>L{VBq-VN>Kb2|LrIT4|r|JslDC?{7 zV+?3GkVZ)zDmu9KCez(HsJDjY?Jbpt$!+>dz28Z(2VY6O<=ZWej9_wEL)g>44;iox zC0O!IB$c3w;VD^wUu}3qNn>$rgT!J=1!B6C5?I6(>C^}~dVYOfSbaS3vx69JHvX4!D|yj^X9rlFc_CvA2{-rk$1Gq{qleWgyz*)*MWwb9pX zoQ-3eidy5%_VTq~;42vwI_ub2kaW1AA+bsdnrUfcbK@dN zxBwO!hA0hnP^~dT!kOt`u-{p`Iw z_V+#;G|MmH3c|IvGaKx{&KdjErG%9J)28WkEq_buCm2rAjxk30JT}_ zc7%19T-HN*KH`=MsWoNZgI+3;1cs^5>0rYm6^7o@pp>9;X)%b992STGWd0BrRcYEq zM_!gfrb!tEHPkB|QHcP-A&#X=dbJM)JtoXmSdG<+-8I%^c z0)^@TVhwdytHRMn9u_)P(Sz#@KrAXWwpnYz4M|#zigf3@_9ooUZGE?t>k6K>%hh5r zQewA`YZtw@0^@fkZV(d-grcI|_-(gIUA*&fxtbab1a+?)x7*ZCWLuR1;4u`ElIBI%r z_VpQjt}cdyarKtq>#gNMO|~+4+PIr~e|P&6dCJ)QPVlbD(yTJJFCNsfHRCc^8>P1_ zB5x61-sM9I(Ox-qd<^QWQ~?F&Zr{XVaJ0D8&tZ3F@7sH~a_#=QWsK6`Hq8d+d`>HJC8UahAchKe zXLSS?_kB+scCgySv7<*=!I6Y@{BEX)PO+6zDp&w@b*7ZJiQ=B-kcT=2Nv~*dG79i! zCl$pyROPc>VNtgF+ZnYpyE21uQ|IdUJGRc;oAVX6Dcn#O#?M{2_nkd%)!CUYy&gZj z#BI8I$r=(Br+vG9~R`LQu?JUrA`%H7?#C9K=iRmq;K ztJ?i}jhtZWvYr%r3cSsyaLX*Q=q+tXKB?ljk+s6|m`P($58-a&l1PAKwB&*pAaz7V zvxZrtw*bZi=~`7(jtApadht<#it*_UN4R2>1?9`&FfrqDJI*b|jNO}yVr8m3M{r}K zt#9Ig-QDX!TZq9$kD!qP)>32D9%_dw9awRBHKdpM601kylFF=sg(w$L{WmL+TRLbM zXQraA)k^b&hZ14B}*MSF#CDZq?$tjg8xla`jbyN-u>;>~~YCf=3!J^K!Rk29O0 zma?~C*p{L1EQQXyR60#V-*$S`7`QWR2>}DO9Nu zr8KE4PFBW)qL#NP{k2_)!0#-^%GepqM6$<@eY-McmB?iW$#t~QiYKncQ`6=*uUygWJu!WqPJ4Iubrw%>%a6_E;E(L7@~|x|>dP2%PLFT0 zMRhz$B8Rz-GEzu&0`9dE%ciwKr1zNWs%uqHdak>bUiU19Or)x{Qh&3Ic{>5?Mr<6@ zum921{{SmPwsKi&&DVk%yiZ%r15{;k*eY$KL%Hy@^tGu=K$P1?w{h3e#AWXwTpS%sq|Raxk+fRT)`KOzZZ z>0Sdpd8UnDLn$iM72rT0FnfM}y-Qq{F9ftXO|PBoJWMqhYKk4-RBHCl-bCM(w6!&r z6f{(LDQA`)s*qH=hO0%$7z~J}Fu{H4w4Mvuzr|JOBWmomLf+!)#(!|S;>CSP%5r~*wQzRtyA>MConnS7A(iilD=SYaw0vTDBIj(FyHQZgk% zO*pU~MXSL1lERhGO~~kUw36vlf_@S950}}WA=Z7-CVz3}_fPTOyrZV0DrB(-%Ce93B&Pe3tV z9eP#p<_3q?g#Z-vsFcx}SC%!cQw$+qmu?5r*m85|9cpMCYV8jMwLF(y%6 z@#$ZciyKo^>Sc+dT_Ht8VJR3n$vxEn07|E`SD|3kIj2=8xX~yI(@q6_d#GBU#1@$I z&slpOY)(rrxAzID*y&9!K1p_d0*Z^TuzP}o3x=(x%Fq6mc8=7?NwaG=2IY>TWyRvs zws|K*6f+pm6fG>8Bw|}sn67J2m2`m3PBa8pr%VXi*##m#O^V|rElCOFwIH8PqD8tl zHu%U(LqWd#D>0v>-2VW^w$|9*M{aG+g+aD(kxMmRLoD@~Rogo|CAVnio(O1Z>3+hV zE3G1#3ZZP6B8{BlJeFo8(zx^_lfxPG$4!~l)GF!F7Jw?y{DmpQ^FKbBw+`x?C7HuX zf!NzmW8^l?9#%+CUTiod+ZCG%5zb<5=)VVzwgrVy5}brwV3 zWU2+F0005yKn5%3SdvelPnKaBgv0>*PEXCMYxAI>^y(f*8gQBUvRkvRw_Ri5u<}&w z_$2G9{1)5YvQpQrPC|asr>c!B+X)pNPx)iwCyz{?C|XFO1&^6qQFc%qQ;jK4TyZ{? z!97(T8q}dsJja>x&OguAGe?N0+}kfRnxOkS2{2H09#?GcYWghJ#yANp>Lkgg)5UH5 z$4i~W?RqLrFCGG>tuqtKo;K30tKWd58mi;Z1n~0|0H2qapH)^XrGO<#;7I_Fwxs@e zJt-ng9>(08dm&j}m#3PWA)bphkL#|!z_)W_usgfYHXd1PcT4ULy2;e%adogoj)F<% zs>IStVM5c3`>K)%1(@QPG!^ox1I+Ow%ZF5V(nN(-RJBGckFffASI>`A){dl9_I66S z_WpBnS0)qqW*UpA@f(AzQiiM+8mXwMq}4pko-^)^8m@=Yl4(=?{J+@gfYJfs)vNO1 z_Hm{^Z%UlT-y4at_0(BCzt~xWE;|EX_8o-`8HjS*atU(V_NI9A8Jg_3Wo>GTTzQ0N zsw(Me=b6XZBesAoCx(Csm>B6?3Vw6~pDg6@r&}=19;R|g`!WybpV%qVlP)oM-GR9G zy?tKZ+WYsl>G4z;t*=Lr+c_G4?hKVN#SJAs+o-|r4aK&rL@=OwoSsh?QX@q1`P8xZ z=954P8v|CW4C?jr0YLjnKQ6Ue#?H)X<-(uL*Y*yBiD~LEb&%$<+gUM@;ilWbOJX8UTn-f82gmC=KMqSp%b1;%Mw;=NHE5He^6PamI` zLM{Pvoqtz>%MJUsb~aOF?uwjj8ym2(nBLBV6~1z_8XW%l#C3DyvwM2CVNv54B~DQN z=0;k$5;$U&d}S+yH7x4K9l0atQ;*1JtCLD7L@0lYJbg#_X~1>DgK+mw-mBjmzYV*0 zRsxrDZq%mD_HNyyO`(L&WKy>wip4HxW;A>2_%y<7XSDZ}k7CwFFOQ?4Y9kYsnX`$Ma0usA6( z`?YEW(QTSa$RntNM>0CGWi?bqd0MK@!i3PV9+au2N9^?-J4rM)s{FC0pD$m`=cGgw z{jaq%7*)sZF4H-jL>sz?VNhW9%`Sd?9L`fcNs!wc8d$S=JQmxd`;?Zg-WelSfc3>`{(c=M8r#Dm*TSwUJv@zg=jGCeAD+tW+H90Nw|w^OTLy(`PTK5k zif3320+1<}u64ljYCaB0_QCPtj+$%4-v}o(EO;JrN zTAKO_@cH9CE0Tz;l~TiwC;<85r~Dl;Z9Tz?t=JLlgxs5F4NFI!uHIXldGEY_FJg86 z^~Yplf@wAu=H7U04R>j7JjGUO7ZFg`Rwg@CB3fiZON%UcQpBqIn$RDzo_@VHO3hYf zC9&s<4>MEcg(MQc-B{g|iudhjg42D9K(faCUmm~{8Dvb(B0=GohL zZOdJ?Hk>=dcV{HnbU1CxoW*RcZbAb`Q@m-n99v^Eo9rweW_n;Lq@a$ybf#xiPZV#oP7-kOjtaw3jr=?Jx57NyJ@JasW$x&VP>&Ck3)&U z*J5&MUk7F8u+=9qu<|>HanVWQq{L^XsG*_Kx~W@H_R$5vZ8;vRoc{oVo^%~}1X5a7 z0N2-#%ATJtl^vPf&~{dS4cP+j3JNW`w@wlWHKu9?$7zXI;oftLg_C`P%5bWs5Ac9pSPwg<`Z)N z0C}d|xg6F5Ze-)6p_)zYuxoIer>`k@cH*Oh6SlUFV!I5~`zvFnDv@3~+KO+umWmJD zksd*;)}u<1F0|vQd40I!{-M=Z#0-hy0V50sr~5rXi+AqvyJ&MmeNb%)@w-lauU}Wx zyN3hT*_{5w+tM~OGls@yc8w-4ADPT&j4a425v0u0I?YonDYv#LUrK|jhXj+y*0ilX zIQ1iL3H=q^FnCttH!2@--2NBn~vGJUGzOzp!-lgdtHJKsd-cMNiD}2dAuV z^ToxA-n%QXJe#8c^;xaPYVkQPvg@p7`WPC?X=(Ahv$tDl8*`ycM1NNQzk zX|ptoKuK`K);1n&cz!~kv~@_@o+E-PKqSyp_Eb~WgQrRw9o@94v6&U@eZ8>vZWCr< z@_5=k+u^}(%!a|;Y}KiS>z=mXTPHCNe?1;LoQX5yXa+z=C8($Xi&+XE2~_E7)mV}M zK8H<32ha9(QXGQJ11%|o!_uJB{JjLjY402sA8*S?fyiyVZ)sp^T8f^R0Ur0v?=HKk z$W+T!*;x828MAR=-zkxzXeOkjih`~crZQ?;X4G^vn#`|LQVI1nq2Zi*Q$AgIgwV>> z70nGm6!gaf#=R>yj9Gv5RSw^UHf|GaVl(n&_I}rwb!?jc#oSfv`&*B6S4WD%e|mE} zCXys&fLCN`;is9j#T4wf_TphAjhF+(jYlWdLBKTPG1iLIL=_2Aa=;JfYx^iVNYQMZ zm2PhtvzK}7uC<4CZESYt$>sYSveRzuP0vq9Jk?a&yC$mH6v9_iNQN3*T}%>JMJ#%w zjCnb2d=AsDqNEd_*m33RDi2j?=)`aXG_GsvIArxUJcerzxpTdNl9mj#yL&m0!&l^c zLluwTblbZpQBP6!bM9OQ;Hssn+_-4)YxfxHx1f49iD}EMZWrIA2mw@Mr~qmYm3V@D zzF(2+(UaX2)X+y0$N72weLC!&$=4W+e&);WthO^hmCI6BLD%~uu{xU@+!+d{mVnVv z=QF#{F`vTi{hx!z>1gRGBU-YEL&E~HFSjCej#bmFDdVR_EA}v;sq?1}uHUGQse?Hb z9}=I)ugH1y6TyqDi)~{d&0%K6WAha+nA=cGhRS2Io2IFm@pI!gj(V~wC>I4osVA5S z{8N>(v3q;efy*;0_P3xEt#}VknPaFba4GYtHTCuBRg2H=Ew4vko5p4HyQgepDJd~W z2fg<0;?MOKYkSQWtiBGX5l5JhY)m%nQmu6x*4)cFhmsX-B+(%XH7Ze;EJX<8iusUy z@zdj71za&Ag0>0XpnSdO^DMY(sCZq400!(?IThS%Mj8ztG8-HBUExw5o0 zbr_w^PrWvcG~eFrJyuS6o-773h|NU>I+~iD1hDqBlt-yhIPN07tTSCF1rL=oT+^zE zV?t`|W2qIzRlKXj5%c_yOv#GJNrR)^`JMT<)3mnCQvU!5>P(kTXKONhfoiH2YH#nh z?5RpEtvBCe=2_96I>Kq9NXSw^_jM_yqitxFs+=E~&1+9A_3aJ|ICa!$56|WWC=ag= zm3jTqvn0pi#z)orORTB-zZ11Q(&qO4Ef!OF&xy)maPO7$u0lG5@Wptb zl2;0>;{a(SvDFF2mZ1ZIs+B5F%YgIg-7dP2NGcY&97y4n$;aAA^6GBc6*>GS?vk>7 z{{T^y*mx|)Ph?NB@jZ2pq{GwXX{sQ|;QK>2zLycd^K|(ZsAP(Ugx6*&qi1-Li!Zwf z!Jolae+Zh;Fbt${AfCm=Jizqw>9ta-WmP(bE7?%M{f7hc$Cw>M-CL+*x6U@NGqhhP zxF2F-_O9XCeT9bGTQ_OXh^@sW)RAKFy;VK|A;MxQq!UuXlB$xrNl-OgG=st!@Z}I& ziCM&nkWY0*etDyCVrYLZy-+2(V6_ZrMJYpr$0O{fDeKgH)?Nzy1s43uQ|5AcYTT?9 zdqp>OG<&0D)@{rs8{@K=oW6f><1sm`y?isolT%}$s;H!=q46xE$zkttmO9*^SQJoc ztrdo7Yfu!905EPoU3tVoR5vr55e+{(jvn|%ReY=UniDXOEDWVUPc)w7`y3Ta}|Iu`nEN3_({Soe)z!cP_%T+*E>GRP}b zVKy6G1wjKHya}c>oF0T;n@#tG0>JmfN>hA7>)#xNf{=%>dO*I z6wx`0>Ao!L3?94<0W0zV(zxN!R(7seEmYe!vZ@?{#hszG2A+>iRv$v$hNybnMK}X6-s&(|x1ZTPF!D!n-$<-usIiU0b&C zIeE*%Xkhy)T1T8f@d6LO1fYsI33<_p)~ZB`%|gJaI4kFh`PZ)*rEPC=niYUL7}lU+ zNNNhyWPdJ$j9qryn<0URH<72qVldl~Rby&s_SIJ4-IQ3gG__cY%)TckVWi&sXA4ZS zLrIVQsp?-*EMsQ&(}wV_QAV_HR-vh_LO9Bja@DD?4D{qOlF_p<4O)C4kM_Xv{kZ5z z-tqP2Wp-k=k0H16Sq{g`(DoJ!v9kExyRl)U#9`j9n>m5qy?WVLUXjs&mR8_0jm^HYC8467qEmb;|m4*j* z2M08+D?^Tw8^3aAH=Tai&TlAbbN!iH4k`+a=65R`6gg}xwcZW4v-cL>N-S31#?WG@ z^hT1=yihzc>z%b;$=XqGYa~x8FeQ9E8peyqPZG++78-`3!=~0ao^vcI-omVZiM-hG zp&Tj080l%dI_j%tkK$X?Z&X*{a2Wi2`RFsdziZ{U9S&!5(bUo7_P!E}V{g2rZ6{Vz z)w0%N+BnSZU zqzdX86&ktbspf{TZ&vvc`Po}8**$` z^{d-(P*!Bf5KDUSZ$@rZNy87i8qdExiAP;FdJ4hpC?lz6(V zRWsIQv6XPkYB}-Z3}j5#kXrui$l2B!+CBqX< z2T|gr9tNIftDJN$?|iKe=$~V3O|Mn4@_W&CT?Pkm?i^>x{GRN^WP0|W7FvTDyYrQ_ z8yBqhc0X(750v5Jj;^XX&83!Lw>O2OwcDUpy44VN@U*L|D>EMucy%m-K|*RsrwVkU zO5EK}(L`uySax?614C*Q48tL5N_ph;gP}W%V{S@3W@{t2wvAWt+IhEbQv=xWRP3$g zvug4ldA7#r%XQ{buCHrgr>BHKv={)DwQW#Zp#g0{r+}v9a0Zw^GEc+CK)27vmO zVW`s;r&m^u%j&f85K~l7QLN;E2+1b2rAm*NNGkotxoMXJmV;+?_6ahy@wPh=h5qj5 zmkn843cm#+p+Cr>Ir~osHfyD-2^$u7D z$vB|LN#c<~wlfwwT7&?ix#Hh|vhW0t^YkNRvKt;O=Vh)2zMmmMRgA?@;cI&vW^A6q z&)4n*D@_e<(BE4j_RiGn+%4lXL71h4%POif!tOY5D2iJT9hfMDhZvSK=z=E!jwlYJ zsR$!iPEx2?5**7_T*lye>Uy3zs;yM{Q>2&hy|YJ>+q4^SLN-m^S6_9r2Q!O&1V zH5D{)Z2jYsr^-v3qulZF1yyD_Jhe_GP|<+i(mDv?T%Q@31Z4rD)5B9x>g_eu7f>8H z)OAE-;!ayAi-AxWx0+`a&u&G0>C(3+vEjqzDY11&8P*t_{w9lcVCUX-yL+=}XlNnG z!24$rL%HxZ8JwO|5s_~s^^}oN(q!1DkL}EQhqsxnni#HN?zL@5?2k|Y9q*-rvNozv zFaQJC#P#CSD+nf(wdyjp3R0x-29*a&(;%{w@d47CH?n(=JG&skZtMbW?f(GUbaWrY z@H87Ar}nno&h_phNan?5cC#jT4UER;GHi(?^km|z>Qt)8OI&;N$Stj{?|!H~s3seE zhr;0eVd^!m4{J)N{V?gl1d>ZMFPMj~rlf+tx(x@R=@$XrYy5hXH$K#& z`#NnKtF&`zLra^%?5HGM18h7ces*(+j=L8uK@Bz*3i{|LkbjhTgCBk{n>&vNAPb6! zqmqRqU<)%6rH~g5Rt(Gtp;gt>Q5f_z&ZI`iQ4Iq*`Nns6&>lIc6czW5SZ#tGV^)2dpqX_h) z1yw~LkT@Fp6a3FeS@T)hvDg`+siTIUZPDo4zrrYKsoQSPQ(sWdH-oM*8lx+nl}wS( zSv>5`${i;_+a{**5xcloH2Vja`m@)C9wQr9!^s}CKRz`1bs?*O#jP$AA-m}Dx$Utx z@%lWc*kd;KLvi8iqK6|}Q-;Q5;)bUai=<>U)s>JvbhQ>?8B=iE0$3MHX`xfZk5lqB z;Y`!7El>uIO%jkn;wn6V^{C@qbg@nMxW3TkFk`ato8xrLMSxD*Zo%wGviV$fEgV?M z_B?rfjzWtMQ@66UzB%h=TBk}>RER8bAqLM9GlgUbvQ)8QO?BW{o*-tYHQ;)2URR0C zj9u3Y=cIZ8OnkU?0~d{pZsa#^%re24%os5Hbs%bbJ=a?{=BvxbcWixsn8a07Z2H=F zhUrg}$W$yO5bDa{u=HR&XoydNtO25es4M2c1s`DH!xigP%Lz>wC2C0>#+0opPyAha zRPS5{=%OS$?#13% zUbEPc%b46-*DttsR?)=tu1gi4sqC%Iii%wBKW!kRf< zNIR2FH9Uhz1m}PQ@gLzHWbq@U@<>tEK(zUQNfpfi8LyEax28SUu(uys?>)uR`4+@f z@BNRMtl9g64YKDwt+TS*hbcat+b$ZT9ZfzvZ)Em89;B(N$HhEyS5v?4BSu`aZ9H3q zLgL-TkTT)cxlm156Zmjwa6I^RX(F21V;tnH)C7WZH41=7k);U+q;%aKB?dyGyBp)k z$F}zZJ|`QOf}S0Nw6fLvQy(FulXV=WK2HIWsHLt`QClq?M3pU7CBR2HX~!LEH)eXh<_JGXF@cy;@&xssKZiz&Wh*?CDq z#|(0q(<3~-IT^?yZq<`Uqe>d^;(ZA7`z!P5x*q7&L6WrN!|W&do|IA6R#WZV6&?c@ zg{IE#yw+oMQ0DsIci=G<>zSY_UAO8t1~QlJ>o(3aZ%z zok|?`D6bk)yh$VF^ZPn<2|`WcDKwy|r8xc?=j}edC-aoKO3kOXAjtL{RY!ehW!!u6 zqN^)Oxh30m610$w%e}E%a? z)Qu`BA&3Van!nimx>F}&?W~1mb|Y}&Hx}~R*!(fwJ#@R9x-)x!4YzXXNgf|??`SF{ z+nGAe$lLy+h(!i2xgn;chze$VC~@R=a#$J>ky3GAL0WOiJytDB0BWAv04Yz~^7QGK za(1*9y$jHtxl~+s17!z04*ayvw)f zCC(g9!`-wI)KO*OXQ_ibk)L_zarEm?QCC{^e{yv*x-GO>bsD>1o&*YhR2csNS024A zh%}(mNEGg-YxeQ!){ioG1w^Tv%x@;{iCVsfk7`f1w)w?1HB2$9;&(3S+&QW|Ry$|o zHq9f}($KCtDC4V?7*@kkrmYlqR?|-AsHgc!@&kujX(blwl3_Sfgi}6L{(VQ5s+S$M zs;Rdw!@%RVZYHy53^wDZ>+Gf{v$Oj~2dtWod_MmGtEQ*fxW>v^nzJEQ3dxxi%CPz( zKJL#YXjYXzf}bH?ARkVup+S9M;Bg**W@%qep7Kkx_QV-FovFOGcJi&?dutbv#bfvO z4|4Af^My?O>p@YmrOedgu)7k2FH=lpuB_eE=_GjSV3hFAWRcuyNZ^q$VaK+E{pjaU zPbg_MO$cy8iPiSw>ro+`_aVI1F*rm_q z@-ye4OkE^WinpM4f|4IDx$a9JCY3FrR))E)1%GCLmrNB4r5Tx68fQH+;Al5yM`doj zp3B%Z8&j%j_eRsgc3$syhj(K?jndP7o-b)niIuUHxfjiDQLP&ezIuPS(Ilo27`a&k zYhnPek>gJ)SEn_|{kph*U*zkmZN;8B4f6CeVtU&{=2y6Y>DJIl1HA*Y6>EziFuI3c+4`z#5AR-k zv7y|lxsO(Dyfs^GJQNMnvrUTIJC{4SDXRY78akBAWvOZE#Ym2v#@_1e8SvE<{PE~c zDm^^<)*e!YPQT;_pAIzX2Uix`mX>&_H=Z+kO@op+6 z$45(or`TDEQYt#Sb(S2hT;?ExB)d8o8kW>3KZo|zgFrrGr#u-WR*_^=T-KxZ3~~8% zqnB`v)Hhb??tSswS&r7jM%bsP8@FlD=cANPnEki2_BCBbKC5via+Y}vxms!{>0lH9 z!x6lV?YROdCrNr5aj%!1LH_^`Rg4N%q-BzxLlhr6{{WEm&o(xvXKk82nY{N#+u56I zuxS#LIfUE0(|7MomdDM|zn-VEI|HlsU0A`*oTz$uXpR!5c_gI{CD4|?y)1)HNGv>u z5I%ebM_LTZpaN*vCGmFHg+r(~klwhzKox!_v8O(eW z(%~Nigxu$D;`RC@fn_`+gV!58L6^+C%e0weBf&`U26M+s69@9 z9k*-Y5UYV35sdQ|C-lpU;Wvj$WP{GX^6A6sPCMq~$Kw#?aDk?#0V?oZDY;?L4m1 z+I8FOMo#cKb+~bBV*%edSa}8K%3L4#4gYB^e6V zpo)({LIJIO`1P=k)GXR6erN3ll>k#TsIRA7_jNB(OU)OL7=C98xf3Mn82EAq`+zwr}+o@x|@gC9k>0`$aa?A z+8ds)Zbe;Ly)!jb-Fb-3Y}yQ+JG9$D>T7ZJm6TNQzA~;_!3)sGONx;Kv~P7IVFb>= zHCS<>0-$`cPqQ`a%uGTu;erw~LxbyD9Dj$V{N`f|oX=u+M&RGs-r3#Q{i{#BckUZ^ z?F`)x)~(2+(!LK1nW)Kbx=hY$k1mye<<`r^D@lrzBS*NmehaLzo$s)#B5W3W3D#BnqvOv{b0_QqAXbUuv$wlNq{<_Zg$B4`fOwAKk?5d<$JeF=F1nnxMR03^ zDaM{(x26S-uW`wR!9k15Zan7W&kP1HI0(qr)Y0Z=rW6}{7q)676kB(4QnXCTC!L;O zDM!+x{_0A_8<_yoGwDiT*Zlo$RF)KWsq+5-H?BC2jAkm2x#;rSrkj3j4VSoceR-C~ zZH?)@zER__Tgz+goPHoYdsk)W>#KJJsj~3&@hFWbF%eB2RIIANpf=JgYw+S~C_une z5U76;2BL)I&{wNzs_IzAl62IH58fxBn zI+UM0onD8pBykg2T?C5NC2AWUdBXwcS`q8iAz#mS01@L+`Sl)_4368~d&?iP`zJTMvXt0ti|4og(W0iS z!*1W=6_lq7w5qW^pG}6!)Z$^>H9kCsNW~=84BklTh*m!BsS-$J@z`LR)P_I-#ZSeG ze5s6_bl#0n$*QJ3KmaIJ&ymLg#1BuisQC&!UN;w2gOR&>r?B=$ek^VyuEtAf?@puZ ztoGoj0=|n0f~m;ocRuXOzm8d_n-NNszET65MlRB)WP;*4E3b)FV7kpP?6lKUQBj5i z2d((76=O%Q5HaxQBji5bC#U`I*nOu%fZhFN+1rD(1s2)F;^>dbkU*UdOQyl^%=_a$JUNn1VUk+9gvNL(8Ab~{`B~FuE0pFe!>9?Q6 zR%69ndKy#W@&~)kxUZFZnN!#OV@b8>w|+mZa#>oM`U(nX>duz#m)^2}2QbKodG~!R zIQ-{ibhl$e*F#E( zz|hvfnLWW@y0&%$Ggpvl@%sj^ zZSKlE21#<;hOP-Co|1+MVW?F;NzqsnVzIjTal1#WQ7CmIARmc=!KFY15_sdUGtl>` zb{HHDML3EadVp!uV(v_i#)}`j8w1zbYW(irlD`qPvO9MLzxL%uI=3TJ4OU;VHf2p- zMhp-4a+*mZ!9_QUTzq0Vbm?VdrHR@km_DBNpkCIf@+(SsXNeRcypJB7WGYZLrUge6 zs8IeQY6z3(ig}KOUE50e_oCdXynC;+`vYmKoF3t;*_$eTx3O0exYnK=mj15XTb~`e zy8CY9E3{&$ag?#84D6Q<+Ld;oOC1|9kyS)xE2x4&KxyF$in>y!oo(ds*h%#*;HBAq<%U5QV;cWZ7O6g&1aUAC}s<@X&1Pj~hBsuG$5eYckYo7yup=Os)<=9=Xp|41!l6ew}bDO5%qig{$Tp zhfFy-9rLqf%YBmOuv-eEhD-%_Syth<4PR8WHFWNXm3v<&nS51l;xe(QTB)_4y(XY1 zkPC0=iprBi7Ma$BxBwRQ@ekq+z=OnK^u&_6jiGmDRv(Dgo|=6r_-Vjbq)yh`S-EGV zsoJo1Rz|Z7St)YcQygcn+Sp3iUXM4oVHDJr@~tLH2?SAAO(&9-H3;pf`=S`cnrfl- zY5)!l4RwltgNL6@pgJ9k07#<}E2tkM{;Kr*P16~HM?Fn`+U$%*7i`kj)Z;Q4y|q1T z7;Jj8$xVd&y1GhuBF4cq>`g?CWpk_QZS6r)^3hO|#Y2OPUcAG&t7)6Z7A4U>b|IjpJ4B(qaf=W@HIrn-Z-cMR0EMn#$h zLj^l5RPhN?{@F{{S52fjm?Jf+QGJBv3}w0D?(1>G~{;(m>QjK&%G}@IAi1 zt>=nTokhh*QMC3J+21=CJllVGZOzA9wef$!wpQTB?)|RWXr@fQ6BU#G2|m})Zd|o2 zl1)Cks*1%)Ruqj?SkgZVQF|1vSx~HkxfQM?s+=0|)kVfQ^{E`9KmycC3Y_s##b|he z=0$RI(u$98QqajEgtL1Wj3bm!eOD?lkT|~ z)Jk(Hl@Pd9qoxt9j0skm`cOCfg)sbtfDNEpK^k;bI-vNNsLSkjiLp>h|N)U#8%s8M7zsoQfzmngK_@=1MCQn z!otTr4LlP)T*>!XJUT^x+c1GAyEKLFBbHeUJ6nZM4YbG|!BWFWAP1!=t6GnZje2cB zfl3Mlh2O-~x}zaascMZi0Fr$H0;8l>b0?L|WRB6vB@G73+}o2T-H+BiN!8da)2q$Q>#~Q&AWoD>>b4U5!Zbt z-Iup|R|J*5dMBXB)NkIS%>B(~Pbao%plGSGRMNvsjGPB~na#b^LI((Blvu!lg0mEn zWYtik46;O6)#5$OIM5Eg-*Bg45f$!nsr-PS#;^2Odyrh{0p5eq>-BT)E+zm1EB_+ zwD%uYVzLo!F3hIL)9*~vHpJb{2F=WOcEg~;Rtz+?d$$|>Cw0`}24fQLF}SKMtZ+*X znId2a9@-J6sqXE6I zII;Co8EfTbRA*vEjL9v+J=Dy`Wij}ThgYa$bNoCw`gGfneV0j&$5htJ*iFexuw}+?xFy1Eec?@ARaa2>{C3-Iqy68*L)SZ| zo{$!+$>gTUWglL#D3GXHKprS<;%8-%E+l1ONGgC-7E}GaaxtnB#V9@iDbtrqf=j5- zRt5{&YesBTq>6h6GO85$W~Zlpk)NW$W3aVUH1wNqbL{HM$*cD+>&8{?7U~V9l%6OB zJ}0Yp&PKCsZ~7d^|5O!6mkT@#3zo8{n{{RmP zb!gcGtkOsn74Y4NGE*l?6ro{H<63FpMsotcGmqXIntH6(T0O&>pxqSNjQ;?7<+i+; zezQArm`4s0P0`boJ7pgmLqvg68dY`k%IgfVk^w8OWG@Vmvc1bRU`L{`$r}7lw62x_ zl1rS5RZS07RH#YnuzW#-QNuamrHA5R00NZzD0-hmD|Qa#-6;Fxs`~w>pjk4RPS42U zI)`iT&7)TFQ{?Nh($ioUB~3$JEeul7;qkcUl9D2INW?Yt?p9k<6xy625zMMp11>a_ z;Djp`YO@&_R+-15NMnXcSwM?bS|cZa9YU1&n^5?LG}J9A)OoO*m$x%@6?+e9ZR|GM z+c49lc>L#MQDz$jw&>uFg1dC#w|8SzV>21Ool_s~$5Qdh6%3525-NhBww^n27S$BU z_cU!fHJIjcQpE?ttbF5AxCDV-ytI{#Qzj;O9PqS zJ2z%$cdpvmSxh*m>|E70&)9v9p5Ij%TA#kl)l=>a9zk~6($GfA@K$3gD3)k!CqsLe ziao5>PaCW5#xktQAZXM`qLIcZ2~sL4BKWA)8jno4x0*SFlD4ZLWM2%c4LAkOO$|uY z6qIV#gRlS7);lXxxOR4DboHL%>&(YjRcEp^yQ2|`iT8~T18-1PQYBs%f*zg8)#Yom zH5j(-D2wGx5_8*Jzt5%odt-F&Ouj28p2qJSb{e}q z{m()eEMvo>uCX?9*2+n zKE8c8;r{mlNtxW+Z*^^bpSY=U)sKkCZEeL#w{bLh&CNkAUgX(WoGRj9ICGUzOer9S zo?%5#AT;JyQV+J+_;EBvnURi`p{XMo10BAkk=4?xN+1ez>U&Af2fymt7)r}K7Qs*k`>m@!@PXvbE z{N>n)$Q~U|pE5`ExD5XQ2(3L&Oh&KrX5hnE2?lT*}0T6)R(G5gyT8lqGl z69I~v3UMAl*M^!z`uo4BqHFS88sECCFg#Lm>{$ ztla&HKJlf+b^anVhO2{TW^tmQZPIPrWmYyrj;vf%SsL1^q?UD_5Wemm8N`mH=@jkb zPr@o{Xa)cP4_x)VdH{pOJ{4+502uKkdY?W%mFZ!(yNhy;sHFJsysI~KUl{jB`pWiK zUhHUheKuLP4tAps(e5qnwKhC?{kOAoJ)|-4pskZN{z_(*-U?)qiDc44Zu7%*@q=|5 zutIB8RwGiaO%yc-q86r5NArQLmDz5Y_> zG244%X6UPSGve3|D>ID=lE7e!SByp~&;*9}DQjxPX zvpN({;tWeM0NFq$zxk3tr^ph1T`)?GB|vAV4Kx(>{h8tU`Sc5}Vxe~)M|3XXsq8=R z20|vmH6%Ixt5e&#sw#+n)yB=o&}3l8)9oy^RCOzk$Wi^JK>|1hnA*lFf)oG>jxJtj?#s$u+2<1l0P|0RI4}byo0$1psN%0W@wNd}v7hmG$Yp`yQ`!b|yQ0 zZr$qmecwwn%bo7LhTN&k=C%bT0j!M4nd?k;J@%gDr^8@fX(_0&bo6v_w7R2DLol*C z6RDZJLQP1?KbiCY00&-Rrcy$yC=>#e6!Ne7kLT0RU`^MXPi*2&!tGw^%vI%{Yy=r? z!PC@TTh-gY94C`2xT1np-MfQ5xoYYw<$^a_V301h^AT+a#k9zvBY|83%0V8wN6+U> zb?q^f)-0O&2rXX)#(v`}vmgqELhPn6Bcwl=Sa3yMsLrl_UEZjISC zDxSL}a@cyUX%-{F6*-_~<#nHWWo>4^5&fT-9(`C!ttn;-YBFdK>^_|hReM`>u-eVdedZp+u_iN+Drrw6{;Ya+KVsx6DJnZMudjCw_0GYcY>qQ?_J-2k zxSpY|-9bpoMt(()eBDs4jhy-B$^C#^6S!-48>?%s#hab3I6~+ zPI~sIrll(B0m*oIEN*}Zj9P5f4;cT?l=nC;0&vR@ZAD+7-0 z4fEC1m0Q0dz85A$`E9>PMfUZVMw$I&tG*^Qv+0Odpnz(9I0Ak~wCc!EDghQx5^?9m z3eXRpPeH~#c0SYGJ8L6RlcnDH3{Us2IqN#!o*aJn&tbBzn4Evx(C^qXc)g)nm3LL6 zjVR{J($mV$6V2i)P)Q2vRMxnq8|*X&pO;$HVg{D80CV#0LsJ|R7{Y{J29}l3 zM{pVA`P0+$>9q@`^e8&LX~(FrZhYqGTz(^a??=YL4ihP}@R=BPWSf_M?9IQoKKF3r z@mTsTvrmX>`YrE}uaYXPi&R!fwBk`a_@h-cWfA;lk<%uX{guZat|Lzj$aJY3Gf%Xi z@^qA$sPMF#b2Qr<0;3b9Uo|>N(TJKyRvSjrbg<9Jic|ewoo~diasUl@n(*_- zpHj}<$>k}xCKGG@{^E6^$I95Qt$Lm5gQdYyJo#vAcQ)k2T#omt8|f~+Vw{Ljnn{#_!Yt-)p`r^I4%*uAHP%2!k)RMcg69#aE@ z#K%nqHg_>o4N#JNj2p_X6swXNc+E;kix?U}1KNl~L=~?eU!PP8WNZzHyytW{d7#37{#H6p&1rw)}HM{;C(w?1&)Pq^|}{mDsJoZ3}=k~U7(-PQTM z`-ZEjti#cDzR=xx8ok%ncq%x2!n&lzRa}zB&wtYxrCF$>Ij0>sKA`#iho(Zxv4#{m zu6Pc+k9t(agKoz|zpJ-KQ+Q3gx8CoMuP~X7iLx_EQ6}E6>}qV)LQj#&b{1kt{FF~o zCMy>ObFxQGGaYE?LWQ-GTnviW_SE%q=%{J~Ga8(5{QW*dtm}~4S$sCm+c{jE-LJNB zly%uGR?Fyo)oufN?#{>Fxf-nD$#xbOdQ;{xJKu3)sc5z3r`!0*sj1GIR+)e@8ZnHv z3Hj7%Z$K-Mdfb{3O0>sFT|$PSA3i)jb?c2D;)ZN37F&E}b0UL%?^;ZT{{WY3?ya|s zkG62Ml(OP5;|a3r_Iqs2vq9E1>S?n1s+P15Gx#Z=L6Efa5NfD=L4jJ=Pnw!wk;jKr zhBN_nf)KGMfywg~{(T~|8;=c_ifnH4qujN)I3b4%()1WS#=@wRYvAbeb(r|*b6dJh zD9TrD+Bl?t0;DvCugUi^*+LI?RzO%Npw233UO1>fZ%-$LqaL+Aw6ELtkG7pUZuHMm zm@)I=_NF^&Rqi}BURSE{JCk+hHZIbsr^V9ILA8#+hk{8w zQAVW^Z&n&zs2nXSqbKG^3ZKfodCWzLT|z3>mB>DVxgwr@ICcionX%Z7%N=)F(DbJ7 z%u?-6x873X<=Hqry#+ps{PySD*cz}M;=ojG z4ZlS1Bofxp=$~7|rKTta3XLx8s#nUZQa(YdDbo=?hj`4L%4yofeV~p9{Z!~f>>bg# zFc|Hfu;}-OFSmOBhZ9F0Ct&thP0)1S7jfBQrpZ>?kNsK6U&x`EltVw>m4a zH=gd?duw6r3{LW0laZ>g$kOeMw$a~MT0Pg4#5_2izlPpTxo|mL-YQsb7NQ!Oh^T8K zF6v79sz{(lmOX7s(1B6wLMd9{fz{SIC|oN97_D(rnqt4S^&c0rw+06b7W~1T=QHeD zh1*@?+dr%~UMFyM#Ia=BT$Dq%ney9Ked$#MjSRJl)XtRF46-4+U861;3{JNRk_`yX zYlB)3FHa-Y8Qhh2KjQo=zq>mXfDbuPd~%Lm|8LxveVOKt4Ec6d`` z>nh`=6plS*-|dSXDVlSm;@FAwYl%5N+l zJ7H{{pH-a5<2PRAowwfI&2HTO{EaCw;-xXG>7of@n`d@~7hqLv zjK1!{&4t6@cm5k`{{WFZd_gx0-!R>Cf!tMHMFBB;bHo0PyPGO8NX+7FK zG0P{4HAW*XOfdxDE{qZCPNPFg*QQKi<7PDs9F8OtOq!kt?8Qe8lbHRnwQ;!R-P^Zq z?M=l)M^Rj|bPOH2xpv=VXX|Pp6u2(O+EsXcxs}}c-HS@m$&jj;RisiPI{=VepDH}1 zqcRA}(}<{$4l1Yk&kRzZZ%;zsrLS7mY5_V%k1TO*OywRL%1n3iq}K?_*>bfB8r7mjZk0v1_f#}@;x-{9PS$jO`g-5*&9FoAegh*?c)7! zw);j+kGAs$rk6KGx~n6Hb#D!=wdH~mtBawDauqDeG_%IMnnzZhE(4m3P-KT*51{>~ zt(`*vbj?)8*79ip8r6ZJ1Yvay*V4FClhU7~s`C+JcW&CkY+kv`?;5-wLp`;sGu?C7 zbE0jCYeil|JHK+hr<}le_6Bx^lk8!lHI*_%rau@6Z>??h(Zpue6EV`mw^Ml)s4A)` zbp|4apmFNz8|fL4A#|p&*`Tc{P(ds_u}?G7b#q%jr*Bu~H|J^OqThL4qXr;s{1;f% zZwiVGt`{{UZQ2vK_dQP6+kJbq>ghyr(yjtLoUzf`%tV9-6vVOtatcO_;OM0^wrY#; z9_smzGCJ{6bgXi%Sybk<)HsGCA-zQ@gf zkguD>DFrPyG8yNpuajSa5Jz_Ud(#L6KTxDBKvc2C2dO@tCXJ+d#0oVvO#l`1@*h5s zJA=FXJF{yW6TR{|oMj$5O7T^K$ma5sqh+XM@H;a{_=!saJL)HJp;>*dg;*}IFgw*Km(*&E+< zW9u;atQHeC9B)@6;ZbH`)mesdUxmk+G$-upx_D0^Tso#EP?HcTYDoYHax9-6EfuIc{o*JXU1=MlK7CIGW1Waq6 z6p9j8ijY9^)7G^J)_p3-Ku<(7~*>yNR(aA%Y zrR!{-UJ5Odxv`j<8k|I%hqJPh?urz`_LUyngY5C~QOA;l?ItwjfWdvHw~F37;dv66 zTtXubq-29p9EwJhZmz}SYSmx5gEd(!(zUAEk{&f;4Im7Z#op3lGO@IEWh6eJPX#<^2XBXy zOpGE!Vl*rK|SxEhX)E8Dt z14I1lAq1yOr zstj{S23m${$(iLouP@WyrJfayE{G9Brv{CrGj^iQPlj>>gT@IR5T@);gu?sL(RS7$AV-uY+NzwG5*0!Vcui1FkP1i~kwtn110uBP zkm+%5u^<78vg-IjWFVS08E63%71T`*4^g&uKW|92xt+tcGaK|_>Y~NbVX=LqilC)# z%X*1q#O{69kKHiJcP7`*y)4qb4m-f}z=X8$nG~}c6>cT8mOx@qOX+P4@$eoLv}6TI z3#oxW(V!$f83htZ;nOWghFt?9fGW!IsSe$>JVg%zO$SPP+?E3zW}2U2Lz&IXxw2cA z9okKZ&unZBR>-aUSvMU%(CMzl$NvBT%2VMgCX$wxuCps!Qv~R*3ZirE_EsT_ARwY? zN-``{BIO=bEV9rIOa&uwO%(LnxY^7CJz}dJ){_bNk_?nuHomriNtG2MT^sp^v?8ch?$B)`LsqqvUU3D2sI{20v zdCXvW0MuG<7R??vR)+RiMzxbr4=Fri023UHnE_g!5Ix>qX$)=>Rgq+~*4kMpMw)i` zmBT1Ks?;6i;B^lVp6)6wx+rF!c}Le-E%lI#4MB|Bn{P9V%yt&pf=awJapm&#gBbL< z`bf%8Nsp}icp_FS8w1TsMuz=u>L4nSPF1s_OoTdWq1mWG05Lf&UbK(fYR;DO&-jK5{WUAbDHXLpr&hcCP{y>YVW_f;Qi?bAhzsE;f5n2ocC zq@vp!I|Pg>>vAxb#Z%OTjsF17FgID|xRdDG<)XeaBnuR%KUArr2tcQeD}h6#__{%3 zkzSL?sT6N1KkmFK)he1SVCg#Kt#qI#N@^NOBn|_l7DFqwqN}a1+8DeH!xS(P?7D5e zxI~+GYD-rv4MCQx+?h!B{a*9z{9as&de@g6)RF*9msr&MW@U)7CEOZfNSMtNYSzvw zBuQ`zDEN_4%P+zS1oW;0aRE_nCQN`VfG8B=x&a5Zh8c(zBUTSz|J2oDt+qBEHA(lj zH?t>WUkz+k`(t!sbNhLB2ZmWY8nUA?m8DJNpAdNd!iuW0Na!PddRt2*A01u0F)#rXgLxkCwd~|hWnwcr3r&uT{cu&DTjrB1qp@FCX)k3e9s+zZ{G#;Hg zRApVVtCLV_-zroA>67#6Ul#b!e{pv=PwZTlESy_& za7ijbTR!TEm{kgqB}F_;Pyp9H?Hkboy|^h_pR%|gXRlQ88T>--S+tM|rWpP&T7$y4 z`E)I9ST^3^ef|7LKejsS5s9Izr=!@|9jCdwV{lR7^QJ776(3VkW9F&GY?}O^+FGkS zlFG&=t9LAtAY~iTqB&+@&*en`XNX-!ilftsrV#HT%owbqM8y`8iaVZa$s=kHfgn4vF zt4TinsTwtiga)-F0#Dcrc@I!C*QBI!y&d$@gMj}4ZHn>o9$h)&_f0O(%;4yb7O!hn z;!f_)VS5^qv-`h;rPuVPL}<>c zDv(ISuqU@XKptUeNc8JqLec6)Q<2&-E9OWUK0wz4jXFrtRaWIc-`OS;ucEHns~+pA ztKZqWiR(LT<*!4Gt)bc*$0t#W-u1CoK`mBBrj#syspKrG6Wvit6{QtMC^*#l`I>oG z{Jm;`zi_J@oktk*`*=`!k3c$G&9*lV&g-gu>s`=$akh0HV-dUePW|m{J8fK^_G+4i znu8Iwu^WeR;I~yC#Fl!+qne*@Qb|jeqF*_gK^k1wBn=X{Kr2lxmL!a771i?qfzzfF zI<}aOkyETxEj;P?aD3`dOgVkQNlQb&al0ougxh#s)t+ekCmAPGrUJ8X?V0H@`5Fu% ziz%4S=96h*v(p1XilCJ$A*K=3PdkV4uC+)|M`sm6UPOrNuY{QC1Np-_w~qJN+E(%!ORi?v3S=+1+o1g12B~tMXzrp{m?< zbyCE#d1bRSdVI=t)D>0I0HGv->ExjK&~P0%)oXQ#k{?+=>9P2-Skv}&7G&yjw6vRh z?{?qXjnT6k_#J4%He#xWYE;%#M^U(|CShAPar4;-HJrsvk{FuTJa)m!IgVCrxfjpwx~H%{>0eUF#T z*G2qqbne`(PCp|>w=tF2@F_8saxDu}DA5R#K+W!|!4=A>sT9RVJo8>B)An_=kS!UF zamR@tk;e|EVJW*gYx?5135eVIJq%0+uJig zj1w6smU=%kQZr3FFLP_4kVv2q2pj>Y5n9*QoO-K1lx-l?=Dbhx{{RO`sxAGvD{Jd^ zlI|QmHCA(V#YvFe+sb?nW&;*SH6BBC;h%d~8lA1PHcd7~e~5?0P||(nM5X3(hflo# zQ3>%#1pd+UJbuB~km+Ko$3fvtQ}+J=K9t+vaMy0V!@s4$?v2}($I@f5arVCB%hqjd zonGpKmmp|1^&ZB}?Hm+1k=9UEM*~sIRAEKas!5n=Uwc+Es~s(*d7RYxlaI@-=|y!= z<5&lPpy)S}opJaKO$9wxGLK{LT;?Vn%afNZO+GhsVd@1oPYD-l3C<5 z(@^NLEU%&MrDDgp0s->>08#5@OPv)Oiu#}CKgs#@A?7J4A$`N!I}5J2Wq(lZXQriH z(bzjvYHp6ZpS7c9#^OdcO_?^{+jtyZPus0dK4{i?#L*;@tcfEpz3N~*LMSUheCzrD z0Gq1lXq97QsMqZMpX#qkJ8uo`O`q+0jnjwR+0C1fqTD&0>ZS^pGnB~Y>sGHPxbk0j zRf)*%ZOewOWcyg@C~GP8p;MwI=DLA8T#qVr;;>+~T_ACw{gwH2`1EkWo81(+ZO)r3 zElGyVS8b);ctqSCi@hkfG*IT-?y{R=D(#=Nw+&=+P5xH0QGJ90+Jv_ES0EA<2|pvl z?KSDOqSHtQrlk2)d3Bd@=V~_}_il!(1+?htv(HTXb9mQa@qKM3^x6BKid8f0YMV_U%vcY4*f) zd490Z=Hmfssf4cWVP?n^bkGEi-u*VP#$fpS=V$-ZLA(_nJFjf>8$ z3%q!Bp#;MUJmDpn##YLKatWzENBo_5NTg6I6!arC`5*H1)0M)}WcTJf8=BskF1Mtu z+7t`@{{YSH?CgUvfP$v6_V(i0n_I3i_}$IAsdpA4o;?(Kcz=r3N9LNeoi_Jk6;rtz zPxBv_`8q~Jc#lrjKRQ?BE5x5pmi5QByFqvNXH@M9{`|phU71C*M`iDBxvI+Sd{)u% z$sGIN1Cy*xuZP+htaNdQ#N!$|oQ*m>o(Nom-r6LRG)mdw^Y!~WdL|mdD_>ucA7>td zeC+fQ&9V2kHz^iZepO|#&61v7%|)2rc|GlpnW2j{9>|Yx(9&Zt5M$`+zlYP;!BtZn zpqW{<=?;OZ2xa+Vqy1mu>BmJaK`j9vm4Cz3oQ__VcM8eb6tZqgC~Nn871dbWmN#c^ zU*h?C)s{@=Q+;Ca)l`|dYO-wRIHO4+Ql>k?w;t>Z5%p ze+sOjnW;>zE3;lhy=+|RN)R}FRrzFpBl&gWz8Q>-B$LGP1pSBk@aYXnxhtu2G&R{+ zGrKzrk)V%r;@1m4QlAW)ew#b|M{i~D+d95_j2801?FfYM;;Axh^v|bMv$Lrz%)!}# zX#Bp)50+{=x{w|9xYwsR2B+uq=}))mcb@jg<+jew*|TQbcW#;MvpcGvsj+n3wT7+A zO(eTYEw{U|^%(qw&AF%*s-(wYVvZ;kq$DyB-u>Xn0dm9xz#a$C{l8~TN1=*@6_-As ze8oOrKA9IS4OU}2x4RhZuD!@^oYpFzeC|pfm8z=UJzKRl_70aAa{E4u5tGBrMt|+n zEUprsA0|e59;M{fBOiKS5H^uhB`KO`_R@rU^q_c0Lumk?ET{&#^#|?i1%6AZWsM`u z(o|)$GmM_z!*9M=k||E9++@7>Ri-Rh0c7aPoJ-sPuQ)KyXh;i+e>X=dr^AFu%f2i`(teGd@Uw- zKVL#?XmRm&Wp>2cxhz&AdS})B1xDj7fwKo+K1+8^n5oQG3) z-;Asn%mp-*`Gtpab^RM)rfAZZqN1Qqs;=p*s7fJj;%Y@HT;L7@htt$~e7f-wu?!lA zjz&#>&WDZ9)|69ioKITew*J`ce(BHSacQ?`_NLn0{g>R)&{B$dsW!DxmmRnE*H>-Y zC?%btlNUpi$<``_o^qbAdQwzYW~Qzhxaass0uKt*ka%?D>ljr<8k)RUAk)^LFHcPL z6mCc>b{!s5WNsRI-MPHz{2PCM^v)uObYUyDQ{g0rs-H2rtHx@tZ|@!Nz9=UD04qd- zS!t;dMKFbwD7S(mLX8;?1}j2HY=cqhzys4P!bN293q`7?gqjdIXUo=|C#$zk;n_Y6 zUf0f0?f5bn`b@MGJ0E|~xHhE)7U-pFO#TuIIm2Uiw&KcT-66_D5o+o{3}SmR0)bUD zy+|Zf4o zdoqg~TKPdnFdJ8Hw$GM>AC|47GqX<>bX0)64I9+DkPe1r@pV=sLqfbL4M99}`RA); zKoSNZ{OAcMkDWjspR=TvM`LEb`m1JTHs&t_x#=GfT-Bp<=R_nrF-b^UX8WPNi}HI+uv3r77jZj~|~7 zh4zzc$F=tb4(r;rdj}VT!EDXJfapl4?0mk??AZ4^q;&nSxO)a2;S5_tIATEblbl^_ za>8`2IwFF71B5C9j^%FQLLP*QHbw?$!-4WWIdV~r1kGJwXe1FHIIC04@l(f*dTOTH zIZT!_uzP)_t?YfHwdR8Xxik5mzRmvtckz?t=vE0cm356{TS$oOLG8 z+c0Fdgqs^Nj=}9L<^wS%(lEtMLD*Q_#$LC?+uL@mtt!VuS80MbnjZrdE+H&pnks5S zXI>OSbt;jxvt`8GZub@g^TcWvFFL%FIm z82zI@(A@akC~S6LGgY)Uv{?x%u}!%sURrr0k*h0MH1nu^C*A5&7+#;_F@{}AamO^^ zPAD5yYfNLN%#rKu6@(gq!!@UA^c2rYtOYjFqJpP24_{=n!)#9-e(1sCw_fVR!MUjN zl2k#Duc6Cryf#9QYwavmbaeGH{{R#wqN;P?Rw~6+ke(rRty?T;4|0RtrkPrfEx|@` zdUzPsLzXO9Pd18Xy}6Us(btZ_VAzn#~q%QG@nIs0E5k(wA$%hD302-WXX;IgJ zRffREdR-MUQ14SgOaH%6J{@Z}_>7Ji@Y|O63>}*!?#YMO`jd{iD0IS@%N}j&kc#Xaj(FQ*zwRI_GSd;)Y3oI8STCue7%Fxk(^Ia&^12|^{5I6(X zWCy~GF#=I2VpgEI{92e3U-YDB__{DXEe6iaW#xl#<)g%AD3XF~C3M@Oy(6lcC?iQ` zqOYQ(k>z-r(jh6{hb(``gCj?Lo-m@j}9v7spMLD>oHrhIc2JqWk`qb zQ|XQ=9hGBS>Gg4LeXO?;yr`~!PtJpY`v)GYGZ$Xjbx04Nr>72zK31XV;Mw^G!(dUe z_zK)^7d4dJ*{m)v69zh_x=f}UF-3}IlO-PFr<2DFa)$ly9)WB7PD-K|2C#`K!y&w$ zyg&nuJc;V)&L=8JBq%gKVweNw4pyFHq}+esou`sUs=>Jm-rAa%ahO

        !*&E37Ugm1Bd|E%cTH_rV^yU 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

        q<}>|4gvJ(uvEfz zAl9eiULR(jC)fRsqSIsc)<-E_huj^Px1`_H)pVN!37n;;p`+U2J`oMV6y}#af&-J~L}# zb9vkslOs`0zxHTWNl8+;s5doTKIzTSZS9>tBQuT6#tky;jgg!QEnO}$yALBJKDic+nBGNu zT(XpjRRs^8a^EpillkMVNX;P8Az0(`^u}xQ&*nO}Pvv2kz-^w;-nm=_Zd+yby*}^g zP1%px`;U3!caCcvjK^ zCkB=1E6x19wDT`8UhkIt<+jBHp)`gpSW!U8UtcU&*P_Ri_$}2?$Z50x0L(k#_C0J` zRHMmnO!5JBB4m0jNR6Z*+SljWPwLj{TmDKGamiYm%%}Vx<~I_`?J*oWY@OuvvP-KQ&FJEDMny(O$$?26TRv@rZCD{65(6=`h z_9M4D<)lpua}AQ96#my&gXg@B4h3F4~lVx&Q zeck-Wvsrn&X))gR$dT z82-v|{{T?vvg2>$OUY!O=bW#llDTG#F*NfPsXyTBIqJXVoktOltLCqF)ey_;$9!|0 zRzRlg)ZcNC7C%4<@&0#`YnQhHD(kTz~C4X zK0J3HT=$L(xxQBK?Z?*Jg?A<+7QI)tFc_TOT@^i4P~$Q$CQWBbDyEcqG_WGT{e7#j zU7u{cg5~$%;VN{9WX(Yz5%cKVX1w)Y90uK6dq zyEYBcg@bA@VD8<=o&E_WZ20^p;>6~&)8%MzwV66s^WirNLo!1pLNJPRf1y6fJbUXa z=`Z%gl3Qnxv5tVq0W~x}Yx1Q>ms^j1v)uQm-S(GVvzc|18xTAx*Z3y#48oNs4e~kY z27l%KpUv;s_oi=WZXMONaTIMwwtBO$s~dK8&fdknG<1xnkkqK4OU`u+K z5nvBnoSI0LO`NV2@X;-Q!CZdI^g0~x?m|X^HVv=pSBnXTlV32p&)f3rF5~`OM>R>c zsj0f#6|!*KZj&IClsjvBZSAoZQl_eAsi@6n@-3EZmPaX0(g9A>KALENNW!h}{{XXvK1#_?$XAcgrzpM|(9vw{R?L@rbpF}I?cKpH@q;r-*jsLocsAsb zr7f7sZwh!{JzG30E2;*c#TuIhzdqBx`@U&o9?3G#j%kJO5x918!b+XM&(nxAgsjCxH=}*h8UT?hSi5%BF`D&1!4zM*b z=*0jd?BmjEUxq&yB{b7!dt;^JsfKzc)lFTy=7nO%NE!yHjtKtRc%ftr!PSwib_d@7 z0C@9DAXuzGQa{lqj=yCEdPKa@zC@x)J;4C z97PolGClo@=`P2t+tFjOak9})nJOFwE)H5+D8J0jVyUX(h5eyz%Y7*tGg^r2O8DRp z_`>n8uU8W9*KqxF^Tz8XjSqZwt`?kX2vJe$cvGYe7g2mY#M9*Ci?(qV%{Sd-7a7zw z)2>OtGDa$@>d?zl<<6@+6~8B+Z9DThEJfX+Q^5Gr)PBG}mqZs=TSS3=r=PcXVZa4t zBiHc((VXi)fH>aS+3;_UtLr}h0PGEgLMkQ4?hTjmzM4EmT&sC1n+GLg(za-s*2U?T zen<88!EN2iSufy{Ncgski4|+=%CsLkpSPpiE>ybRAd7H<>wUPikX2osQ&{yycLj&c z4uMRr8{+QUtj%Hf4okf0vWs5yn~w`y*SKs3Mm&`Rl$M({N0bp&MO{TA+R`XxumF2g z^!v*a=X>6mvEYRI)kP@ zPWF4p4MIalf!q5>?keM_iK-<^N;*19imI4ng;Ag&v8;uF?171? z;00QSzJMN=Z9KWP^8^xIY`nL-O$s#`+UXP$K5aoy&*jIU^K#dGZR?D^cHZ3GE#6p+ z);3nBsmJB_PT0juLojBJqB&rSgi8fXGR9Hkuw@{r0E>HEEG7wG-&5!~s=$H2<3}AA z-KQ??v(II@a(&>uj|>`j$E85yUs2J$_<`|4ADZu-spvnAJBFuiZ3?Pt9m%|V2f8UX z{@ta?)Ijq=jEK-;s`8mEgpn?`6wtaxzpRVK&=H`@Cou6 zBm!wbdJ%HpD(&3Nk9TX!5L?-y)2?Y`V9Y-V3Jaf`Q%LpAIzarf>Po+a`=bql?vIRn zS_*y4xf8XwPAk0f8>a)5Tui1MhCOOAi%(xeT}c&yXsnzn4vKoWK2EnPdK@ZS%nO(9!s>!-!#rU(8VS#qmE4xBg%D4PL|R&XxGz zuxYS#36k8K_qTgnapN}T0*0bf1SS|H$VFM2$W+veM^8+wz>Q2*Zhg`%gxsH|w2N_; zcFtr9pm~x)V10m}L0*;e&dqns4=hpgZr5iD4(Vor*{XOfYEGtO`6%-vp(o|nQ&9Xx zqgr12T4WEK69*;`{FPqsGw1U{;Ynu)411*#>E1N%q_@-=}Y>+H3;N+}%? zb~&e*nkaeQK_~c_kw7?~ItmP)lkD41IPSM`+1>0`c2-&<00l`tRiO1f9RC26 zOVB+fvojg)llk-Tr@8mG-NI33Yr4k`)ffq~+320)j-nl@nZjhZ4jt>FE@WC-nU+%; zn}BU|r1ttK6RuO?uVLVE(>OI*Do&@`uProsL%B#sK5Chzc)v&=L&3MS%gVN@SreD- zi1j*;{Qm$>fy=XdpFE)(z(`oovn(|O%-|FII(yzd=hVHmi^o%TFJ<;5)p*Q4NbUNp z9?8Jtu=HDusA?KK{@rkD&Ip9$00FqCstLgxB=bKVdviLJiy6 z={G&N3AgEH+|*S83bE^^YCSxw`Se##PO+(7VSt#7@yD&1S)`9rhmtsro#O$o$pydH zzrCj|-2^PGgz*`re%^sg?GG}D(kU;kRgcY&+vU-|#O_~$_-(UGg~;`XdheacV1YBc z?w5aI_MFL8JV?_^w)V{QbvXGcaniG>ilNI&5E8=tDYoUtRYQAv?J3C-s0cn)J;&zX z%c0ah(sHV8>1%Nu?|4Uao*@Lcs2>O)Dsbqi%E9N9Xm+zl;O+RD;Y)6`+!k0DbirSLNsDJWE_dH#&HZ9h;!_M~#{tE(eP z`cGPd0m0xY!2JIJmqjV;{>(0n(eBg7CaQ`k?WX_@bNTdi{yqG|=x(c)rz7$o;O5Es zSGg)6$VE}QvKz-QvMQ>iD;dVLm`~w(OchMDwq>cE;Atid2r9#tEjd4Ivy_XAi>YnH zRbvfBMaC9|NzO%0Jg9mcZM>Pw`&>+Au!`#VoXaXJG4-e*ujU1Qe0nM!%h;Pswm05i zckI5W+Fb*-vVK{k>usHq&Tc$zHWrbV6sM`oG?i;Ojfa@1SlyQBsyGKX8&1_ThqAYp z7{(}EGas2W0>5TDCAjv}moBa(xYI0Q%}U2aN}oZR56`8SQGB(|d}^mno40y*qB}1a zU6PkGQ;_YxxPy0Psiv!^RhAk&oQ5feF_mm0)#xVUpKT3~Y*%UKw|S*t2XnO+pTYs4 zK4+m$)v)cG1)tGa+Ae~`>Tn(Ef22h~`E(I{wE1(od*`oe`uj829S5{9kmcdbz&gjO zw*Jq`LsduTG|(n)jyK9rM8W-W7a_(=A*&ttj%GTo@oS;iw!3Hdo<P z)nvYb5Y=9;SdB!L_cAs@NUD>A*TgfbCC8nVsg(}S8{{RhZPcdGM z_moSGg3WEH(8P@&p#-*}`#pNstF-4a{>o$jnu|5~28-hQ$H-U=D!mDU1^x%ylA_D$U)) z3@}f~SE_FLV(On8w!8~LmcrB1_D14?Fx!SnCC%XFhbHX!+?0|XO!VqXspM$`+(*wr zVYcQ-<3ZYEtvDKik@7VkZ$=jS*Ko6EA&H1ofkF0x^E`SPejsH!v&_Tqn4gbwscfaLqiQNZVH!A-YXok(=FWuYA#6s0B`MRf&_U} z#~u*ieSJLq{{WXr1i^?32!A{u*<_^QBq^enPbQKfTQaPrfeaAA_O-#|~ zT6pe(jM|A8A5-<>-uE7bV09B1IW-mOp5hN_2g?Vd!;9T{CdyIfw#%Kjovq2`rlzdP zR$-vSL4n9)>K8Y+>oWP;D*9?%o^Kpll8QqZVI+e=Su~K{#L&w-NHXQYN`Ts29@0Ug zki1Q5Jw-Zx6_zD)!9pElBB1#SXFi;LI&#@H@m1xiq}+R-C$p(?nJih_8=H7#a$D|) zU<^HcveM!5{bh?<%Kp@@s+_Di`fQX%0)FaPdr5g&8f7pRgTrKWE+J4@g3=jF1ov%diM@3J$(tu#4z*Dot8hC3&aMRO}g@Y~qsoXW%ERd|A+Cr)#@M9>< zrzVR))HUtFBoa;!RuF_hJB{TP@===4Q>sxz!##RNi7Kl*NM-GA$`GTA2Ve=*e}sN?>7%D`8!0z#-vz1wD)(I6HQd6ZgOpi3^pr2_B?IrEB zmlsT`r1<_AMNmj5P+}RQKsW$}nBWR^xPu5TBU?!1T|+{(YDH)d6$FkYi2xpydnaq{ z{kzzkpKEtM$E@4KXYLs?7@Qt^w?rEgW8~_id8FBS?Bym4deCJm^XgR~tOHz+AFYW5 zhqp9iIznTf8*7Ns!Y-1*e5Q7Cq#+pY0E+OYI<1V*J-A^S%P(?!zTMcpXSDZ|<2Mu;?$yL?$yMf}e1-__F7V!pvDVPRk-bhno{JEH zVmez=xUzeL1hnjxuOR50-L zu@oJh&g=)7AQ6ml=n&oecXBNbJ8bSc{)5Kjc9!AXSZH@PD=W2EIk+pUM45{0jZX5x zQpu9u`+h|}9CdW4X%eOUXi#3t<%q>LTQtj&GiwjjZR<&m0 zmub)nJhg7msCcOGS?v2uQouG!oA`*0tddAnduH57Hu$XVoBU`_5@~cdhFp^2OH>j7 z9f8=Y`ij$~6M+@Q%-1NonlMlTRf4t_xFJ{gvt zKH}brI%AO|yaY?{ej6nQ{0)I=nPd-1?7e8gMk!2TA!h9xFJ~Z)yhF zUA2kG?p$sjZoli<_YYm=Cc!NvFlDnjzPqBs%FhT8xZ+ zgSqlJjP~%#V&GyitzAw8raLr>_5s_qcv@R|+CQX7B50#mX&L6n>B}N^#}$4xT}4UK z29eS`bX4$JWMxyY#&-c2CUS@?sgIuy+>G?iRZ-RRCRbh+A7Gqd2|G67yo|BkDCHx@iFw z1Q$>ZG}4s2xtl_)tP99wBvT{}HDYQIQ-b!_=hy$!)y9Vf7Wd8PagVd%#7JVFFSUBp zWXLEgAl!*HE+Qsc~6{pLf((?wAojytyoW zJuH%CVb8}5QKVBjdT5$5$o!HmQt=j%iBdIJfu(rYj~+GaZ>Axj$=l=spwA3?eVquD zopq6XHg>kMB&6H@e@}t0mlxO@(`ZM$w%+N14B1>xCjlh?0K}{OsI594A#5_cyX_w>8}ga$9y(ow`kPCgm-M%mi?e<7+#(W)X@8s~xasSE(pK^5Q$ z45P@A=zO!&s?jjZEMS5KKq}4rAmg|XQNVPgqMLJJ_g+^wPWvUdMl3~3mrl?7Uhu&h zyc)$#gxecZza;rwhJPcQnOw<8k^QtwWDVg@ZK+vHOW=5-rw%lnnjF*?`*@x`G_0da zxzH&}twuda{6Citm^Y@*%H%Rs`9Za}&JQP*teLmn6=uxB)8TM+RN@SVNbN1LwPk4W z)ReUHw69Gfz`h+ih#yB3EI@cJGz~ zvgFNG(`;R>Ux&fcVW_ZlQOi}3&Th=!PO_aVGW57`{{ZArMG^9V`o4qSqtX!^OIGus zCmy3FxX)GwH7>I*k~mPDpF%vd{JMCdU6+ie-xa%iaqpa_KMji8lv`65yn5qkRnuuqu{(a6uBvK$RFE0#XKx#@0dMbZ88Mv(IXm&%*$3@7KWU|Uvc8>5 zE~PZ!8F+)~#EzJE7hdk(mdI^Z&5AC+-BHjbb$G1Z7=7UtMLuHGZIPnGU>_w0I$BIk za}!Nc!f*k#n}KCk1HzILtHA0M`)lVmWPWGtoI0Btd^Wk!}yB?Ez*Y1tW)#Eji z!QqYylMRJx$}C)wQ&7-ttj2PkEAa|vky^g1ASD#BHPYmJsEnqac*ZCP@+Xhy(?Q)? zm}Nj1sjub-@~2UEM&IknvQ*W3TDxvj)$R@3Pl?5KJe#cVNpUMfP`LN5>@L9j3}k=8 zDrG-#h6ixb24)Hr19*(6=mVBh#MA;mqeUQo-kohZkw%oQ2j$k8Y9i83 zv5Ily>0XT|z%1Iwm+t82!&FmEQMWd1IC|E_(qQ67ps%Z!J3~-o{mihSNr764S*8(- zxhDR@e8*_FmXK+w()GZtK^}gG=hPMNp4GhW@bZ}2?OJFenqeX;mTIzsq!I9eLt5j= zbzy=|y8i6cXCHj+qgP2%)YUkOccff{$kG&fG1T&^&tC~A_1QyPjx2qJU zzv*x*!yI}8?S9E`mz#QD-CaWk;S~|L5Dx%o2nW`@Iu5d%!*65cnhIQ{21XbHxT>Xs zPaL6@T@%J)Sp>0zW(VlsUvI^*-iZuNX!QLHzv$rNg z3%7TrChEsV2is-wboGr(ST3PzD5rQKmTG4tTIj7GAb>}-=a%o=jj_XegZY9u^i8^Z zIn1`#a;D9q=Fo6*LLc{&{Le>Y;r8$TSacg_DY?FI?~dcl?<$;})O%m4y3+xi81%wJ z0vNXzS2v6l^3_d|otik}`?_f2(hCOEN}NH;kj)T#jmX16@F^OJ^3I0x^2giIyOe#Q z+tS^q=Ic)y{ILN%RuL-s6XBI+WA@MwFF=dscV>JYmoK+-UkzvO%6-3GOIn+=ue)mz z1bI!TUj*#5HMk7THDzMtXltRd@jTMW9l3M#_enWfl0t27M3$^8R}^(3l?MP3=s>Ud zdViTcoU&q%%Fec|YvL=jJY;zkB(td;2qc5YqPey^qpR>WbJy>Uqq%pav&$4XnhI8i zj~5((>M~|pNmgVEZ~awGjfuCtN3c#9F_}dO_(=!$)An^FtG^#TN z`PTx!XG`tz@&jjfeBZ)0zgwM!or0o~aoK&py0h(z%HlrQMK(V@fvK#iql&(sRo4|& zDNi6`BwuTe(I8sIG?d_K#OK!(IrAJk5^w(5Y`c}bLu-X?Ct3nUNF&bxjQW2*oPIX< z-%NCubiup6N%RI&t<7m%kD|)%=Fm|MHYg7)^`rD!X`YoC>B2>U@Fn8!&uciTG+mijBp$x`i5cB{vL$MI=3R-oV*5$Dm) z`9=KCzAgN$+MAnX;Qs)Z7Rc%hgt&}Cb+>2jEbiXN?>(WoXy%OMDzfyuTWsL*dxvk; zK#c@+j#!jBnko zhsdJ<3XpuON@A4iwK~JHaD8Rln-6$yF1f(=?lWxWY4a`Dd!{L&+k2SMw~{P=aj4a% zmW`(h%@GWa1)LG}X*Mef5G~ZQJS6u8Bo-ckjH&sG9)a6$wc7^Sdj<58yzLVLs~}Q@ zjs=up(~US+k5s*%C&+TX0tGBb2)%f(u(;8e}UvJhl z@Fou}wm=h8Ej%cOL35_c0{J%0kk8Gb=@urNri`R;ve{&7=BwqcFj1 z62L_~Fr!cN6{+(z06HbR%OAdT_1lAR<|=9EE4L0>yERcm zgT~Wi@ozp>qFTz8!ed}x7C#vjvapIIw~cHE7WPcZjh z`Xa}F1>9o`{8EOwAXScflz%L-i(Gwuo7-uE7~+E76^ScKsV6*ZQ$zWKP9r@EQBpOI zFpEW?_24K6*-B%FMK^wSpL2H({oLKD+?&56zc;q$qoz5%$6ZfDj*7mjl9DQDr>vpF z!ADHBanrzv&WIX9H4;y@ZX&e1xih`2el0kK02*+|5A*b0aj|T(+#8v;m}Iy-S(Gt8 zmDT*ZiPyX5zV=Q?R%|}*>`t~2c;=v~**otywri%9BYz6h&55t0se|pJnUEbo6(k?8 zy+*2_QYBJ25ThTZDqk@%vYKZcVRFYgr0;s%h~VDj23>2i1qu^KL!e zC3pc;W)<`_{{RPCMHcK9-9j(O0sMzatX9U#R?Qt1W>&tw2qdeil;(5w`ATC|HJ+kc z6v$LmM3q%?o5<=E$j0nR_qUPcMK0{*pE61Pwdv=HDoCM!P$++I9-=Q|syQ?n;H3p4iQKDNJu7n<;^cy)aqmh=3}|}TtDSm{Y5uJA@w>LX85o|DN{C#n zNjyzkM8=k(2(XnRk%&OVaKG_icLAhPTrbCRf`X1X zqVo$EFnT|2i9G)RfVV#Pgd{qK*03rVsZHQ#?;!Lp=QT2tl}AzHAt8I;%Oxs7D4`|D_o_+ZiHNmMpT!5mL?ddt0!pBWdL}{qfDpZb1 zL@>G{$q8aVeTZjv{)$h#x{{@I(RyiPUnZ~lI*UP)rK)ISYB=d$Lm%5ZOXFzO2}1f@ z0&MMa3FICRwt*sw2X9p*5LTH7q^9ewtXWKTa#PB*<>ICg&X#o{nWRvccP*yi5pF*| z-!2FW7qoufs(V;q@aZSEvvhRzK5w&Td&?A%)DYfM>Ubjhh>cFA0N;!KJ<-WPEB527 z>uov+6zSVJmB7~0)6Gv#@ib@cBGehGd!`tdpNhAvKJ$R_WV@`oB z$G5T75!STz6mdu+GONb=L!eSu_m~?P&B3=P{7<_HwG~=psuBn)1$riX3%WZWr2Di@ z)!E$M+^pOmZ?^I{zZNzJ-1W*g5?yk_-AyEprsAs3KrHMv zO{GQx13;$+hlfQ{w2|(&t8R)Ah1Ni#hw@)T+vmrRMc?BW&Hnl6eeF?4*A-ZtRJ-zx zHsiK;8TXV}II84`49ZMH8V943_YB7Bg7@}ixTerj*7o+roWM!a2^!C(JkOx$!Uwqk zyg)<0lGJsq+`cRTZjk)%rHw$Un2DI884}?Pa&PIh{L!b^GVwC7JAh(8I z^_iTSgsy}Y#;Q~K@%f&pyXLOY zw(Cm^qQpqW9(gg*0nq+h;*Zdsn>N>5nnZ|BP+yzb_ZyF5!ax9rMx$;dnkY=Ve zP5wtBL_}gV^taUeO$Dv$nLeWE$sv%ir~^v>0001R9;YX#Ze@j>EHG)n?HB-#CZ{I7 zWSirz5viR&zY;&0OerGJc;{${;I9_A5BdI<_O(26<$+K~+tO1JBnEnuX}$7c36Pc4?n?zySa@_U)GAb2sAT2v%dG-LvZ3Dn-pEw<_6y4>z2ye=*Z z=~@6H3*DM{Yo5vT?Sl-jy8&fSa|Sec zV%1j-Q?<5MJ1Y-n?U^x>#~FoL49^$=kPm6LwVL!uqTb?3Loy{J3kXn2a7&uE4~l?R zwCUS}6af@61i@e#nTt1_2W<^}^ z-8CysxNEBN)OgHXnB2S+&?ri2=c@>0)WwDEXckE!YrBh&1$&DJWYpq3N846?6g3$Y zr{&e|kQrJS#<03TDx@lcDrm}uYg{QL z6|GuEqK*TtF*7>PaVD_9E4@Wj14U2?$*urV`Sc)TaC=^r{_DiJFvQ5( z)W>fdy8KGa{{X2X_Xy)E2LeGg>vOu+1YsOfG;OHpGRY7*P#J1~C>3BsWYZMrA;E9V zR@|<@zC*F{OSk%iGnTH}8!u?YxHYY8jz)TiU5}iq!(=LOQcx*bRd)n+ZnCLSq>_Es z`ra#nb!ZX@Y~_?n_#_qpcAaE9oM{yy0RWXFuUp9>@UBd6EzXY*R;@H#(W;mOHKK}; zNUuulUed;Qe`D3)_b%vKtr^3S(6eE2MO&Hn&NJGXUH;Ht12%9A&M*<%|?w=oM-7USD} zb(O#_;jD%TYaT}X;0w)8+N^|w?@ebVgB7~)mvW9{p#rNYENTmCVy`2mD4-CnP%BQZ zQYp!n5Z_58V6zq>nuD~FKteB_b4(tfZGE}5yEdhEOV?o`-1HcjsrF9dsH@IWW2!N@ z+Q+S<+S@k`v~ZPKP3OLHbWbD_K3yr~cTYrv>+L+#wY-ZMMq4>u%^AXoT1r+)8U_gx5!_fESkFof)^}uWUFW(pbQ@!J?EIF) z{_o?q7Q?987*FofZ?~fmW$Qa@s(VK*n#oMLXcYa`MFKmYNg)9P+vdhMOFIjhTj^F4 zB=P|#i7b_@MOc(m7~r@aq|kL`xVaKdb!f@_n5~ zVcc79w6GX@{>7SYvq{?hd%Clm4-LBTX-^X6x=vlDlVd6N&ePh`RmjOvl7cE3oHTJr z>0$2n_Y(L*_B&XTTUuxlqK~4LsznG=(mlWcv5lA~7GQc|<46Np%3b1S)XHd0!q*b9 zVnESKDzFU4@brbGqobl&CQg>V|Gs8+m$tt)l)%5ONBZ8zl>kulxrLr zH^=W9rNlnY&DB!<@u{emCwb=a=|FV*tjh(wQrk;7pMsZ&u`;uqm7=LEHE3V}2o|Hv z_2DhrxV}1KU|IhFQ%Di;qT-{rhes0C&2iJ7dpp(}ziCtEw~h~UV*7VBxnQHp_9X`N z+x2*2n%-bf~eucF+wnC;>b#TtmBSjfT& zB_*0&IW9+Ye-=9ThYXEs@P01&NiOXrYDompA#y<?|(em71F;w>D1Cnyu(Clx-V|>S^ZtxYg9p5F+09V6jPS744j} zO){4zeF7VG(b~xtv*NUsI6N2wr`M(>D;3k*N~jK{9u#EARPhZXfuV83O;jH~zyH+M zS9116UiHh0=pZXV`}Bz3C8)aH9Pa??;vxbb<`Lb1H^fV7FE zB8?;4X&fg{hys;U+^Pc;{WVenKBuMfJo2g6Aqpq}{69KzBc$fjrQP|Nw-W4}24f?T z&r`6+Zpmd$&@Ck{MOPYuE02)F1W0uKdDJs_YE@W<97sGz%yFmB z^6O6$iaQby04rSlzTe37>$I{pmOSjr#Yvi`k6Y#O&^et#$MiS%rz-I?G(g79LJyGwwH#=C{SQ=Rcc2UjTih6bJBr)+KQl4YxeEwPLM%Z8AH24kGvUe=IJ9%L-v$j^J zAB(J>uNy+A!4_^j#Hn2s4)@(&Q%?*r#E`%Wk08{2xLC$@fmq1M86(R8*sPup5wY+!QX|)H9_{QHJlHA; zGqk=)zS;{iD7?o_l)la{w zX}2YRVnL9DZf0c`8Y;&A6s$>E8#pqTAScu<3xWYI)R8QI?h@pTf$@b+)g5 zPlcT-WRUj)1!{d%lTS(vSFOovNMP#344xn#&b0&O)Q#VS+?$8^tyW%}ZbQ3v)D`&c z?Ty@7j3!E=wq4XAs*iBcW#P$Bkl#Dbd1aDW=F%a?Az0L#5$|e&7#QIz7#e5=G!f`4 zPt0-YwPU2DlJ^{ggNjms(u3^d=g@1rak*H3h-RSODZO^v(_`>;JF(-ImN%0hLjpmM zTs33Il%$UdaZHm4jAW>2jlJE2ld0*)h$B9S6zjmMK9tF)*hPAOIeLx%0GioSS9R{h zqmOOHgWI^SsM!>dY^?tNj;Wq%R<36)m(5hy%NTr?MzVFOG09~h5oUBnB#kgqP@d`% zczve7Z92B6)e^gE8K$cL0LQ8OD~^@W;OaKrUTe2ER?)&^cD-Q9;BdWRu{&Ca6}YfD zJlu5{$N>l4U1L~;W;whjUe=&1UOmL0@&neR1H^Ta z*HWC+ar-Gj`#PVsca?nGB7;BNTW@Xl7R&26srHXjb>3fe$J7%FjJ04h0Tel#Qt=zPU&d76b#gjTDW?xabNXQq-NHp z!0#m7dk;D`&da5*tj=z|w@b3No5Iclc1XevvEbyDw)?sIif zQ^|)F@oeg;@EsL_!7y27n*WocVOQ4p_W+kjI0G)AXk76 zDN~G8bm1`+(B+g9L%`5_ie|r`RyVqOdvxpwc9jlFI$AuXcG<&ZbCO}G1~yH3${6da z8nTULVI5U+OR8ix({i@Vy2a1 ztalNslAl?kjEyhlOY>q+*53T0t{h|$!>z=>5z|)dg)ZBoq^PKYXPTfaK6ouJrAl15 zMj-i^FtAn@7e4gKq_%&{){Rt>R)?t%gQ2X!)Fe1mgCpkEkF9vtZA`W@8RTzN3P(Cc zmj3|Z?ufvV+-vF9)m*JXIOsqA=*N+$ijr8X1#D8tjWo^TiW%fvsD;&pGE>H%r%lNJ z0AcTCTUmYz26%Piu1PAObT93#nL|Y!5Z0BFv_&9+t6@_J0yaOrI^3WiQD8y8zZEWO z#OdqYLkFz~r=Lh!_AWM6)11UfO;Yn!%SDoc&TcgEjXFMVy9enJ1>JfW!9{4)PuZJg$bgxEHmLy1MF0oHz38$*dC9P~%s+EY$7V4i?UO&S3_f0AjR!Hm8yoEIe6&{@kyQZHR z4q~3W3qT>7dT`(5G?A3hqVFtBz}P?Z925BW-hr&|iNG;DR&D;Kz9cwVOwL0J=1cdZaYz{(4$JWvPhlP>ks*&c6rLqwiKf3A(`h#Kq zx4#8YFrku`pPyE!3P>b_(s|>C znyR8&SWR2SRHEV}9w8;XdSP2gs=rfjp!)mMwH-xxb>OlN<0o&S=zQAw!6g#orN_W3 ztgRbBtqV>X`kin>mh3mzJc`&l^P{w9sCnp#lpS zye{EnMNx7&EPdZbvJm<8tun}HqoqDRi5O$6B9&T}nq^rQREbHjK^!I6MJ~Ngz~;ocR+-Fe386sI~2H@b_wf7f7i+ zdCD^URci3*6N$z_B`C+^a}YyO8wq6-uaT;Tp(8~j9ZMq)Y%j(A>;M5gN$P+CwIuYX z%%vm=0Fp%O%=5A*A4pb%QM=}!#|84PT1510t1kV*;gvrQOK zp-Nrf#(1$DpRXSF0xlPi^XqO`R+Tlc%RMtiK~qCGrjAAtRL*CWifffwfx07wvhY8{ zlgIS;wjn^ydZ`{Btt-=!riPy#l$NdvjEd-KT6hdgQBNC^u|mp(JH|*Qzt`v9)-?xH z)DD<6BTBbP+7pYW#;q+ZP}9j&ZyiHSXPzQ{i6m|t$}C3%>HZ$>6c%8)9=$w>fs|Ac z)0G7VQe?ALI=G0UO*DEUP%mi=MYJ<2+ydWG?Y&5{&@O+&*QC&=wuE&DD+N7GFomQN zPLZ+lr9wp+XpWU2D}dk;^dDcy_V@OHf_tmOs}>A}eR@P;F&ZjSsaeqES8}&D{8(F$ZOcHSt&#HTg-`_m)PByS?yL?ThDh?&weZuYhDV(urzPp; zXDJ*?+ECbm{Vb>6=ya(g2d0Xe>J_J_LF?6H4Jx!$)of8iHC&Oxra>cFWGJTgA3#Ur zkA6NIEfuQWIZ)k#pJz$z#Z?YcWXH;lOH84pnpl!mDNvC!M$p(^%y?n_KgZsxFf`|? z>K_R~UW1yfkg7@X!I9dW7^)>&NnFiLtf6HkZi>d{_O_q)KJV~wVb+0CYh3zMqS>^w z_zti6WwN(+=%dM3ZJK&Y%KFLntngEA9B`69gYsaQ1`7+}-l`Hmkxji1VYlN7%pwqM8nr6vT`opdo5yu_09cTH$D8%F(C1EB zyxcdNb+Un@VGBw@Vd9SwjB8rz9ko0MLRq7~o0lho&H@`-YHrb70Duy8V>+qp)f)DH zz<-zBO9VUHuLe?rOw~0;a|^Zhe&ep7-jtYmB%NWJw*XB%bF@)MX`)?Dx3L8Kn`Pa0 zUD@wsw}FL`nUxv90MW1%)Q|^}I3u8+)Fc-M*6foqs11!uDm>dFo?Q}up0qXlm!x_Z zu%m*qDx7sR+h2UsRnxUTN{4b%R7nMUKM) zT!ud+YJf+P95OoIkq+Y^Py#ZIK7>-Z`Pa*+y;Y3ut%1^;W4Ew48kO2_Q&o(|RRyQX z#`SQiYKUJJ9jc_%sz_p*RQ~|C_Y1?}&SePImM{x^y*}QLO=#Jimp*Ykxfh%X#Bt+RQfG|AdU$4zZGRzrBu?4 zeJPKhS`A9pwH+iWepqi>3?5@GB_`#Q6M(FT8I#Im@tFB2Y3r)k{{RnyvSv>eIH-{R zdH$a0E^L7Evft&feymn>%ig*+SRc$1XX>H<;=l7rLE5NMY zB#N%cC`eUTJ(N5csikw$i-={4XhP9tDkzl!f|?qT4Fi3-r(VL)?q$b~$wj{QwSMi} zI6cL=Y9qjJt+Thc-pI&iYtjwIcOEl2ilzShQzCVUo(%LIuEu*4n7?A zMjg9>#&*WtsKjL;+na~6usfe=;U%P0*H;E{adUmR-48tKw1!&ef|b=?Pf6ob&KmL= zr@GZKYRIT`)s9#;p8o(0W}!gTG6g!+X($qiky15U0^xXY1#5ubgmBFdO~-4{W7+C< z&hG1625y5TirdW|D=)ezHw{K=tTN=cl^jn;GS2&bW;9ik(@qeC*9tH<_vVeqh|}3o z)-xpwDHJBF5Y06%3Xe)vi*;JLM3YN2PUK;K2o%+y!2bX~>hS<{GWEA)_BPM2tJ)h2 zdu{E3z33<>!&B$>7R}muY%gW(Xx6f$ab!29t8-VTt zo^|LDdM%P@QhLqLRgS~vA3IZ5na|N=Qzy7EDLfx>v7pAK1y4 zl~6sXxp}3#mHbpU#!3>vEO9jnc@B}3C$&@ncu-K1JgW*v7y zqdr8QmY9m%-fo|7W_H#~ckPUv6Yd?UiOom2YO*`mGmy{1ZeH#iS>3OK%*LzP_(Wj?oul2T4Rq|Z>X8-u#jC?6$eps zT})W9qOClR2^AUZ4F=rawHSJgHr&8(jlHvW&1}_spLXH)?qXW=x$#m$CCu*pW*SPY zhS;XsK6i<#V=+Y0`iU-my3#S4MF7pY%zMF8u8o}us8zL7R}Duefa%1LNS{<@M7I&A^ZbSZB`}sTJrz+dC&_WiT1M$6(dr_Ag#-3{lz{jpH|0W^!A z<8YgfpK{dZG1A6<#-gU2VvL+fh)=Xu@!h?|7SKW(VOi&C9o1orAq8~*0A|93h{mrn zdUobOA`?-VJ9u!$g(~_0EaIn1xZq3F(}Au!7sgDtShTdvnF4KP9xM$kq1e@ryh|t$6{`6lLA)D zklUGt#dtAW^K*7RcIBqrl5NVU(tW2>v9OdT9lN)yW_6PrHE|H8oh6&`dpmH|SC&$q zBPnnaD52I1DL}QBTw%!kO;SZVVs8oEB}EF_m9){FoNy)CsG;kc0r1cP($gJT7TemD zd0MT@Q?{tPQalD;9ji@`>zw}I-T57zJOaA~0(}AWsRHlsKm%}Ey6Iqka0JXUJW8K4yQ_6~WCMngLTR4w<@4$08eR1adz-L&-o1Nk0gk}`00`b&n{(`K zuNE4QESSh~c`Rns#^tMI$p~>+#}w3=IN)g#QRGC`W9^0yRuaM*-J9Y8vtBu%p|9oB zX;VjL3n=^{jVOIR&zM? zhNgoQ?X8Zqdau*~7WZOMVkwcM28Dq&ucnd#1b%&7sy%6L!GHt-MhDi64iDNod#kJK zE$jR{6|}IOH`6!{zp9NBeCMa%S*+)6?o^3YD>60pG38{UN@k6!1~xciri$9G-21VN zu@hQGsib5)pw#+`s2`V9@gg9?b@vbV+KN-ugT(sgqovj-aACK%M|LGf@Xb{2jnvzk zw4R0p@yp-hF|;yGmRJSG6|~pF6U4&R-u*n%q)Pn0>>IOo~Mg*Q3T$W2x~Q zbCTi-btDq#G8Zg)^sgMnPLvW*0tS_@*Z>(Gnd?!J87Zjgt|?#g*B>sLsrJ_5$ZX`# zVX(AWEtj(8$ZiB-N3-8AOSZEWqZ3&B$wgdwTK&T{ewgSfZ6=t2kpLX~)`FrrMZW<; z>s;p=vrm<1I`*Nc(drIBEJxc)^t#3D+T49#U((Y_vbQ!Zauiuj$+`9he{p5X~iiz4m=D9C%?`rQ9fo4`#;ybW&j8>H#bDDMKFCw{%S*H+J zfcs8*xP0{<<Uzkj>Ef1XjI&e1QXv}6P_kZGAd10n^d8nQC2C04eEoly zUepKzxd(~=008SALjWlzhXqtT@@a*osH3T9su`U_M50KDc8O4hk%h>)xc1h8jd?w2 zwwI{L^XYioeySa~%LFv$mI|1oN_b;(sFG+dLyy}Wai+F(P01EznJ0(gCt$ha`p=R7G`TF2d#l~SWW;p@z0PSBtNJo>?bn<1W@V~LbcQBcxFJGntDbGn&@Lc%}I z#FhY+vA5Hobs9k+9`2e}&?{P#*L&M*}+!mofg!zA$r7Ivv!DkdW0Q8^9 z*Cq;Vwl1F;9aJ)Dk~*d^6!EYCvsGM75dAC%zW{4edS}Xn`T6x54V%Z;RKZJ8QfOUR zG%{1Oi7CPkBZg2tWl7{-%s;2Li%3WS@axQ65s(Mj(w{Am5XBjVl1XW$h8k(2s8Jp_yHNmZ*|DnOnIN+jy32AhU|O`2&I#5S%8 zo#ZD;BX}>J-?uh0nT;G$N#)uj0iR zP*?{(UcEVPUEP6~8$lK}s~)v6ERp@Z)p1Es@;mxl)NiDy^&9$rp6%ceg_KkuLH=I6 z#hU_|KQ4nw_a-Jv$v)<@8Yf4FqD6-(OBkZm07c?ea;|=>&Bs3K%2WUqi61Vg@B4PS5IC@CeYt={`)Xetz#WP>k7AI8T z4_{%ZYT8c3*^Kj{rPDq}mTwEr*CnZx{_0tQJlK1lfRThZKAuK~&=>T8fghqk^*z2P>X(lQ0d;vdZQ<&jY73dX)* ze=dWS`FYehh|?%HQ&-kV;bX_s;HP?&L3L+lXR;|}^xDTyw6ZF^kE%rp>J56SXI2FU zYnt%tF5>yk(iu7wmmyKQ-nJ!p)mIXbQoWRss!1odxi7`X;9UE86#&v_9v`R`>CYWl zf%w0dL0S2))(jwzAB@kvP#^FXT6#?eF(;-()iEY-&HkU$pLHSt5BSIIQ~rLa9MtPV z53fxbf0-LH)sxSG+^_W*U?r??39I=r_ad@%qZC15C*UZ-a&Hcylsw4jqdqP z@VL;p3$1k3sG}+n_JTnT>(OWL7>(_~@B&zb1zLwuX8a_4fT=$|t~2>X{{TI2h+hgi zJG45JyjOkEX18rrc}=&O+FO1c<|)I-arlhJ#nRGE%S09hBuqN@y?YVOu zp6zeBTP3;#3>}85BbMRlLE&E^(Y)8oakfVkF=>)LWl1H`Lnc@sHB=qE)y}f*JtKqf$HU`f}W~LsAh()x(MZ1$<`6{{{UZe5ASYTg4ykt zV2Kk^AcqFE#cNtq6`=L#9F~+TBQ)BG0kUcHpc&81(w$b%$lc`*;Mjeihu&RSNMbKrG+m?lI?G&KtLw8DmiPnsf#PV4WcU z07#FS>0EHBHlp4KP>yg$XNqLrAN_k_yr9(RFCs?C_=m>sjAaFDd;*jR2@t4sN-<7Qem!1JdH4=>7<=)z0m zEHNaKh7jQ@2+}_+AGf4l@7tYAQ<$408f0B^4W_zsQ&EwQfFf0WE5NV;d7X!X-ph{bO}V#Tma7d}OEwp=Z8pRJ|MYKAPeSB2s~+Cfo+jZv-d4lIvv%B-#NB?g+?PUQ9-^x zfNd;3S0Ju7J`y^Ny*5K7g~4IwS83V>aV0QRK!ji0S2Il%lBAbTmTJKGagADIuYQ2d zpfeIQlYx?J((7nMfka4)DO23!fX)R&Fc~ToP>v+iAay0Tg+4L2Jr-Z6y8i$*y}yp& z@f#m{%^gx;@X=vQ;pC4Ci;fC?v%0D4*q^wsu2*Mb9f)DWa@#>}^2cx)?Bj@lf&Ty% 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

        #lO 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

        0n-s1YcecWD23Av2#cxou;N?{ zARa)rdQwtt?dP*``0d-f_Kjs9b-BV{U>bG6Zk~!8H{QfkP6quoPec|3V~33x_q>DFXGP7HS2(ZTQU>tpneg= z0%!+W@)^Ck9Tc^c+m~bX=HKj@X|lN8pR%YbH(occ@)+1zDyw%D24)F&e%-B{Ad(7* zBzV=D_T$~6fh7L`AG6v7aH5z?+{h()&3-Xb08d)2agR=_#p88~Tbbs&P*@dR0X2W2 zp!it&w;qz&xp%8=yyaQ!3hYHZ($eK18;f*HL0{W7GAcnl^zs!<|< zI(FGxqhRHza$8q9+E|PRdvN1&)O)7^xjNQ|EwypE3Yb<{tGe4IOD!^C^VJeUi6gNd zGjb2t*?cQB5x_#c6Q%$bo^a8QdI##CFDf z$f>7LX*z>$x`B)M@4@TAgZUwFx!M^A%bH91uq3hmj8L zMdQGl0zA6^)7HMCYOTdVoR_b+E?fJRL4|6WcCBSrKMI?1a#9I1_>4UcMgH=#nRIB1 zMJ#1*Y%lK4^4q9Xk*0v)I8s`kTFA~g5_(q59lusRG9D~R?mu9_uSyDhp3=kg?%Kdh zTfDKfyQ6YRxE7{t#t$d7=rNf2Tg6Y6+4M3002etKWJWScEQ+CifP1q?HmDX!fl3oc zii&H)Ox$%>%9QI-$)O#ifm&V_)O7*q2MQljI-NZ?Rc|az)R_wW?G^Jjyl6^SZB%(Yqhzpw=k?lz=?1Zy2D5jH2eV}ps zdb(6ID}%!r0Dj&kzdH0XU@2;9_O3^J?~TjWdHl^TB{BFurJ9Q&Q%8lt(@vDqXJn$o z)YD_AvO`sy$R1a)zq^*4$3X>cN#Z2ZLGqxHzSta2(#tLi2|0Ts{=~1th5;Vn(V^7G`Q+!lT48i50B|@Y*8k5 zhCjFyQLZ%lp5O3wD>*$)WZRP)O!!@^9J15ZRO7KURm%<% zc&hwqw)UoCISh1B*2Q+3P(*V5Paf?7C{#oWk?MPgt!qmBf$L%QfXvRw)u{k?dJ~G{ z_Vlgm&BdL^Wm{tGt&dTdDYmr8oDJc*~Eay>{55+<~R1qr|L{7pXBK$jGE> z_vw5A9F2Js9yDQHKzh^V*MmBgc;yJ-f+|2-@Xz_USEU@e-l*IAza3vL7k}++X6K5d zA-Hy)z@e+beXeg2Ij6?$j0Qs@D&XAssyfJn%Ql0p?i736D->#UZYq$Ktyy)`(^8se z{2e_cmn17Z0#?X1pcVBRX~U+BO-2_ZTfaATCS$j@=H#rJuAdQt!qLw@^4wHaN{^9T z_Ev@(Y8-Yllmq6Cd~C`E&$_G02ol?0z?C^|AYl2b*B@_5O8D*<=xPD49141x)SjCk zWaMz$ODDUq6t!EkY41vv#C6UybMARy&eZ2n6PwRc?AmI_l6tIk(K<&_HH>Pvy@YZ9EKXl#MY!`2#RlWc z?Zcg=&(P7+K(W=}G9p!IC62CQOzcYn!1M0Q0aK_WF0p_lRs?Ys9D3Tg0z{CpULY00 zC(Ii8be_j$-vyAxN3{1g=BEI@^jn)`*eK&0B2T60f>aMkjLb}RY4wAv9a}0 zXR-U&E4g=$Q!`FhqNA{<-6E@Lltrj~y*}ScnCPl!t*BoZE}9h&)9LL;k3G%139lLB z@(5Kx`49&Vn<}=g8HUhAz}2Xrvw9kwujSW0y*}aIvQ}=b+1MDW4DQ&Y$4S;37jjLM z+;e1Rl0}MHf~Q+(sG43i z4sGo@g;!j#SzE`dor+Bdsnm5;{JPUcG(dQ!M*#jKSI?+ET{7V}_ETYPt;g4UH+}A^ z3OdYcN4RJ()e&R1{J9Hxauu(dj-1O=O9e0dqZt&Fz#iROj|oJ2A@L6eC_F)5Ek?8* zY{BD69FkkVXf$I|06tV01p4`Ow$H_1))VbM!|Tq~+?kEtx%S%P22XhGXsIwX8*Zwc zB!d@{%dGU$ELw`J+Aq!T&$QH+#$$CIwDlNJ3kv+k0X~#GdTqpJIy5rG;M5-ywFBn4 z`$6NvohC6GLorE{@NZtop`cBnL^p;OhNtiMzCSeeu{}x(I5BNLHl8+;L*&$o681cM zQ6pYFD6bkWpTi?)H2DrcVD#%zHNIHt)#{^%+rW;bZ3=w-V`Xr4y>+tk8;h{?R^YcT zR~K1Vnc3S+m#V7Vdw!D{B2!VoC0#_mr;mYdJ+(_#ZxTyqd6$QIMX%2WpdV9Cl*C;X zNS(fv6n&(0+5!N0<7JGT)ahz^3gi4e51Sr>zjM*Q zTd7K8~tgqR$)R+urc7qUFT!vqFb`J28Y4Q08Ev5=c*G0he+uO2;QRA2B z{{UI=+I3tx9#l{Qs*gP9hgLE~hxHtYzovA6JjRs=S^49jk8|$6!`_+Q)t$pW=$f{_ zaMt59_4L(kxofF5?qybvgKuUx3`n%{(@QL8#FX(yruX1;?W>7mib%nYOKG4cFtnh} z6bdQz&3`_c3mI^#Lj&e9^T(gt{QBje>;3uA`*Un0jwCxJCkpz_T9X(&mYtnB=L!&m(+{)fIzSMZl5tmjs%j{A;c*M z%Z)vLN2Sd^;KFrw+NE8syCvWICwF3MvN^}?-HTI)qujq|I<-F3>y6D_B~D73DP?8W z(b z+8d%x&rh>*G&tR}LyymIo%6P^a$+fZ?ik?$lL?KblD0W>bHfW=s&%xo6~E`(1z|$5 zLUhV$N>z}2+|#%G9W@rVibEo&gj$(lsgIB!=JNCCNZA|Ta<0|i*uK5pJ(=1YDkoZM zOsT2CY)8VqRLdhtx?49%K1(B6R-lMb%B}+c07LA?x)h|Q-R2_?90o$(q_H}H94Mll zGzPP#I2I=V0ERnc4N&Z*7l{+%vU?7Ax?rUNBGbGObG=w2qt-OCqFj%EMFS zD=ketj;zp(W2CO!!ea27k9u}mq}#aQ4nq^0+*|&i5xH9}x-(1u{rGWPNoo>S)}>YD zk5GX?%1jwRR_CVQHwUc4XU^W$Z27vd`F6o5qfVZ|&OHD9xdy!enX# zCgFLgmiI;xmo_&Z*^b~V%8^GL_Z6lPlAfTk;rSkw&2IWs$w=3V(2`s794LIxNL_in zhUlLwwJP&iitWKt_#K6v#=SKieLKSuqn4TR&^gEBu=yzU8S6p_$mYk|iCN;)!^1;> zGAr^1x%AIXq=o+gPUE?l632<4^(KcMI>A|r>ngqdhO5NWU^jW%)YwK{k4oK*O*Ti= za~WFw#ZNqPZR(ko^}9rTZF?W5y@M1oEVoVJNNPZs(aAhC0g8RRI`XT?ttGMwA?Wm-noiX{jknXUCad$g(~c68f}`-9^z+oX9e zLa6gRPg;@JT#r4=ExL?GtHQoO3KQ#|ociZt?|!}Acx=9BAF`|V)lDu>dreWicRe=V z*;RQb6ACQkRrqan_(`2j>EVzDkRj?&!PGoX;EM@UMVpR;9Y>nZ&^{LdgWubFndq?_N(NMqjh{7Mf6^gUb#j4HdjHk_5?@~5En;?zPa2p(fYQ!<%8>L~n)7#dI0+IKd= zS~ZSBV>O@zEl=8MUrwm0;W&-wLd1qEl72+_kFvcjGdnJy7rZxi_uQ0nc9zQ9w7mls(*yd$ABwHRctNoe75&D(!hnML;|2kqE}R0=71m` zbuli6Y<~UAW@5=z?G3d? zT-H8PF{Vhe3l*N_g#2m)+DTqn=J6FCQd)?l09(+SV~5I}KD7a$GNemNyHNgM4kzR* z`+5+!m2Mren?D=anH(Pd!wsvEtK9XyLnhgVzaxR8sFF-fwfQ=@zlaUSm8V@w)E_L6 zo&ol(*-1pzY?ksghrEv!sf|Pc)cGz4O~za#s|b=1QsId{-AKGy(ULn^{3N3^?7?I6 zq*1A^qIh+w9^gQ+v75wZ_+p}{6yn6>{{X1;3GG}q8!ruBS1&fw$$t@|ug1{6Q#&;o zO~CJ}8vJE0ITmQ-B0`a?ksFg@eYEo#C-F2j6q0n6RU^`@N&T7X(MAtumexS2(inl} zb3lK?($+aQp4FqlVygR5HtyTn`-+fYrpDG&;oE5L9~)HFSJh)47p%%w(nE0^r&MZ4 z9{ovWhE=2V=y1zn4r(=w=d1WM@5~0%%kZA~3b{^XNp)VfX(4WZ}Qk zUMscp9idye>T0&T)$a|d;F6mG3WTZL8GXey6nJcG2*i|aO+JxuJ^E=~-bI=1OTqwD zikgcb!m*}JJjuZ8ejIT|5Jw~ywAHE4Wqg2R+~oQIdd)?c-wNh;;cJ|-g*uAisT1t$@-_6M_4(rU~#UjTgT45;TY%M(>lrk-GySX=R zJ+~Ui4V0@D@Oy*A>C%cx$O=hvN3Ch{=|odYG_-4EG##o5YGS%jsmfvS<>%TG!ZCz7T^c@{@1&2>?KZOa5kHn+Bkb;?05 z>sNYz6%WJcJi1NZBw6NKNTQS^g*mPVmVGjM6mdPxU;X8qw;-Y2`>3`v{vG4+o1|m z0ETyB1!y#in)=hBpBq!R>-t+EyfFE^<|}t}mSUe|N7*|=CA6rv-|#B>)r&2jpu;XX z^IN8!=$MKPo~5APo3lAb*0~&yYD2m3amR<=dz-`6_$)R@4+_<82dBbI zP$(*O!5O>B<9VEdJx1R5B(g&lp`KM~m=IvL1&4^ovsoj!`su(J={rdnStgnjZ4#R5 zk(J!9*Z|Y=87H9^t9MrN*?o1pcDGt?3cOZVu`(1mY=_?OleRaCTA87is=AXSM_EN( zvueFUDuk(sgg3uF>t{K(+-1MHw-eq&89}Kca=G|pSt@md{40agvNK)UC8{aB87(m)LNbMv#9pPF44{GJP%W5qoSyzZt2@m?(NID^E ze&VK`x!Q<(Qc&N3rkOt+Sz(nq`_t1BNTbY!a-eCn5&jm6xCQ-%IMOn7#?V~NhY#F zu{<05W_G2-vOBEPS1d_1A7(S@!>Y6_z*S1hDMi&lGn#??x*0KD3$}5XSh78Z*}FR@ zv$IJBXZMGzYiYNp`P)s4(DhWAZMteHE9kMaD|n=^V8jvh=i5+Q?$cILws*MifLA04P2A(g~tl? z*b*!Y;=mSA2X3LNr`5P%e6n%UgBL+Xn8smJnzyZ~Fh6>^x{k`-lr?z$$G0~U#4<02 zsCgust2v5hi^T-b3qtN}Pd?KK{Ba~PSedS5>>x-&Aguu`Kv7ZL-@-A~q_~pZn7zb_ zY>QM-qhV&t{jYbZMn9o@f({3MTUB5Dr?trZ3U~U z-7xOKAqEyT5xf+V6x5`G;;sH6QV)wox$GL??n8+e&5 z2qEMrQy1e}P-TY_#=Qtp;r{@*w3#R}yXytmo0o8HjCL<@Z646t`5dhK7av$HL%4QM zQ7h^&l=PU{B)F-MOQc}>c(=btCDqIpQ{G0V(jvwiaU-I!JWC?!)_mw|o;@dN;EFqo zYXDL}qYxQ6}4`re+B) z&4!wj?W3m0D=8}4rA5*`UfNqbxa_VkFRbTfT_O~$Ng5V71PaK;zGndOuTDiI6Wz+F zv5QrWnnR)L%s&%I#-5Y_bq5VT-oR`s`Lo-5A-XnYKH#aO+57V$hQw!~s@*vGT9*Td zt)kqFIX90;;l~b4^wE z713fhZ5qj#I0`Q~3XJE{bpAcL2(_?-ak@>SKOW&bot2tJj({$TwGfav0baDGdx>CS zb8ykc@MMKNa>@XyKeOf1K{qDuOodGzZ^4kUKOoq2cQ7; z|J2qy6;HP}T{Sc_Qf?aKMTSgf=Bke$Ls63cEl#pL18zk|W05iLyiYv0Wgk*Kvifb) zT1*zSJP4umKD{b=9u`>2fhf;$G$Ygffzoi-ZXLlS0vrW41}Fsv(}OiZj17mT!ql;) zjx5ATk0owiszc0z(l_<|`*D~TP&m2ZNzzZKsi67wV6ym3YD(6;Y55OMj0WSO#C7(} z!r^Os2B#gG+*P8J`{_-!GHXt_YEvkfcMdbgV`yQ^g!-h9VgX51&BRq$dk53R5in403Jb!<4&A1nY=d1 z%x;~XyS7g0+#BYin+vw~sN5ME9BXYXT;>Ilswgo@=B&!cs2HyzjWz|j_S|vW+$OVf z;mO98rw>}^cD8jO#_LS^kK5_?buW0wNx19e+Pi`(+&)`m!yOjV+50bPK}R-G zDd}UVIUM#~7ViYUKM$c=qlC9pE`U#3WvMW4Ibex1)Pj z3bKoU{0E1nLZ4Dkbv|8gKdFX5(M+ls4k#Fr^E?Oa>U|~yZEc(cRog4Iy6184DXFp( z=D4?h z;_{@UIZy>_og{UG9fQE`9F8w=)#oU(w6q&_D)U=kW@gU8j~P`_B2v?)H!F~M;K*g` zN!3!&S$Sejxc99S#IiIGBq+nQ#zVL#)mt?6r&U>F(y1_3c5E3|sz;x~E05dL9bR6i zVs44I4P{1aIVQ}cIBk!O$L?ARiME#N$*^o_rpYuj(B;J%Nvc&)bvHiPC4`D4EKM<~ z2Y0TeG~=GU<$O6Ps9|n2s8gOJH3z5stM7_DR6CZZe`H|X8@$tF`%<kmoj7g2-|S7U_`G1>St?u=26}(tyB3=X zj?Gix@$Xt!Ay-Webu_IGZGx48XD??W*Y|j&je;cBury=wGF6A>C`~;MI?~!WN04~B zj}0tUTE4ztv!zdA^EFVr|JQHtykxsj_>wbLZ(P#RX%{k%FDEn5rCngH%Y!*I(3l_o)&wAb6Y;#MM9_ zlGNAd>*?0lQGzrvqXK9^sMG3e#;5!}CAOa0>$RF5z*8|B#HrN0Z;U|y%|f8kR(LcDo=(#V9)I7)PbQ=(g*Op6oNqWIVP0r zmM6FBcNQ|Le1^-96}KqqvWIqNc6KHVs&5^~TXe)C(o{h7_*!IAF0rxWl7AlGacGQm z#ifsvWH0(s4S#KVWu5iwC7vKLk`L$PdPCuY&-RO(tJP&JnN{(aqE zHqz~HrRZqvSdczL)PCN)(S01$uJXJMMnB%s%VIbrl}$+ThK$_P*Tg zO~Y6B*h<>bAKv706}VceY=rdsi4jKRQ><)9wxWA^oAqR#SU~ucgsA=+S|57)m<@7T~%1h&L)DQs;3PV zO)KP~FXVTtkmGY)IL-c9-TaarjPaIdBOZa2vr_= zI0Nkbx(LqL&Fn*y-dWwLjLu_X+26#c{vWv?D<0s>*RS~=XLeCiR;+MWrxm@)EX%;!o&5g`+wr@M&^ReMtMyPoLPwXypF zsZsu1_2m->ad4ppC>hrPo-`D#etj+b&IZBskd%-X=E!ZBFN!;M{j=wd>-qrs0lrF1~VO13>hJcoCT+jrQSHl1bgsU!gxt? zlg7g)J#nA(rnw{68T09fNp%K$XMyuh;J}Y65s%Dgre45&l|JYj2YKPPNS@r90t=NN?Lo@d?axjl zuqYPbNI<~B0=#n7%yxv-MMUx20CyMqNTHhhI-^gC;2*VRE$k;tt?PemSoZr4=( ztvqd56#_Wa_qq4FP8LOUD+Ve_)En$0JtwNoGk%~Fss0*i`P5_fbji2qw+7biY`*dA z{<+?nIdEASp00~+&q;{>AG-eBJu1mE323Ql=%ZzJRYv23dy(%&;hdB+v{v-al_sOp zOM3kJebQxFJTDGeNcf4t9)Hrv^y?B1aZ~V{uy^M$Q~d#wLlaf zGr*ri(DBwCE!{YskH6x_ZhUWEZN0>`jgqU*KHbIcPQB*1nu5HBM{0Ei zn1F5h)w^8YPVz;weL+%dBgV{-t(F##ER1!^Eua-e;So^xq43Q#z zI2OvpfvAwp=EMR4Bg(kza`?y!p^&w6N`Mca&+QyK!3_^nw_oFSoo8BZxHp#3_tKi+FKCQ^wfKnx=hFqHh@%MO zqUN+ZzuOx6aOx*l%ewPhzZ;vw{{W)8tbI*2M%u>J_Dtg+wQ;mKhs+4MjvT zkgF@{Unmyi+se~4Yi^b@Tp&1!T&Q#QlU4k>vaKFT4ex-Y6R$?1Jn@bvfaztJ>AYqq zA6fn8+&yi+Gu3pNOtvPgs`r)~A4!IRsu)b!s!HuESxYq11*eT3;Q;rwvfLB(Z#H=> zqh_M0b(>Z)DhXw$^tkcr&2a$>qTtI~5?Nh;m(PtW(uV^tMCJPPZ|n}t+k4KpaBO(1 zGu01?lWFZuza(r#hKi4JRIHWzqOxe*D2*8S+wty;WgeLv?kg0sHdSGHB%tA`iv&^W zO!V?iHBX0Z3^V|jW+1hH0t^AeH0Uzi7;GLMk8-s>H*(W#45XA9Tz1cRmgwL08X{*crO9$`Lub6-v( zy#{p)i^EdIw@%if-8n-+9zKOxgGr66$jj!Apsf_m_qh!OSu}zy0rvSopcy4#yl63B zx1^Ox2=HU0jwJlL8EQK-cN~5n0k^M?**iaORpDy!y^)5%W%0ComZAc=nfCO;o*Iwh zLIy2Pvb#J^KTo|y^x`PvTUh3hlI(Pp`vG8e5$nRgXIhZEPV%!D-GKO9)PeFi74;dX zSaH-HkG%y>4=1-Wy~A6P+Aj{#n=I6oE3OE>0va0aaH8H@v$c5LH-s~jBg9C~-9#8%x{X$K&mcJW1NNBg@aGjGiNX;bf_YbZ$+t zx%$r^yD9Q{dOA$aB^ExTGn|E_G>=(}RILddBqWI&G*Q~xc=n;?o;jX7dsc zap5E0sZ*xAC!eaB7c*6|;iqt>2^&)tmIawgvd19V6 zqRLl=w4ZL*Ml4$A+5t&iS|;RSj8=g~T-PksuWfv)I#Voj+Mt~*gBNk%A#F8pOm|c5 z>SpGJ`wJVjuv-tWcFw@uc_qkYYjIn9C6uE$+)FWvjy=Nlvqg+rN@_EIxEGQBt;e;D z);8ADy@FhoX9@$bk;$fT1xY79ol${|%C{F0umYrkf_Tw*lkynpQ?Rpf(B|+M`U;48 z!zm>tcG}AJcHt2AmMP)JLSbky_!@ZLrkaAW^#*M|HB;#~=iM44AsSnMsJ%uMj!+_r zE5)6GsUy=TsxyfIE3F`9;SX$$@?zMa`DdXzx2E=H@#_kFmet=FjqSWgV&rf&?Iuo# zX5sq{KGI5@Mssd$+>}(+*nD2vZDOK%e_~xAa%_F+BE5n4DXwBdB2+ZC8qpR)07Yum zovV;4Mr(o7vbC%t%S*aU(VF<(>?!!#m|BlqpFz-fjih=C%5BiQW4b$mF?F;FpWD&k zYG}Hvapf?&>GIUFz6K*hk)g*!5}0aAuyQYZ6YV_YTO|8c-uZ86&G~t>NjE3>^vkeZ0*N^+L$^Gl+_t6 zo4%82?kWub0DaKcvd39dT}@F~ak$86A&{7KqN_3h-1{<$F9}-SE4bcQ?~-Ma)+mn= z3`?XI9;{7#hfMuTNgP;FICk6emr86cRyvOpn4`$%F_e&P3{GbaQMqHM z!`4+ilH_ToWsZDSLNW!UiCQ@?X8L=flE^Tf=+KIi80o81fz!lSg-=&ssd>CIe^`)Q zrT_!VjZ;JO=|R{#V+Wk4*sD5@la!X4|hN+{frK_u#A|p{WQ=;ic zI*rG+#4@BeKUcfkBoPs!DAGoE1m;G1X~t+W$IBgE(5tV5XjV2&Oz$AAK*-Zl00;3` zpvQG?Oa*M4b{y^w41Pj{)KtzWB#O48p0b)(j)x0MHT}9^DCz+6!#1bnoBOjz4}l_U zaEyLnXd@xhFLslS}8;60+_{riH>VeDr2KtwmVC?HoSO>t(m;B+dCb(DsdIN zmwfeh1=na}Yt12`quN$s)ZtmE(jX{*ni^cRP$_Ui{z0EffG;!~k$U z9{_PE2a>7u$4x`Pdg7AF9h*_ZqFM|cR8#I7Pru` zM2O-gCWBO$E^5T_BaMAJ&{&hewVp$usb304Z3^KHOOr0JZZJ zH5mDcqI)Kv_CPHuR8cz%?@t|a2Xmt!!`fB1j zT2sV8{w#8>X~wi8{3LmG0}HfrH2cDj37gy)^RefH!3N`ovo%q(XfpK_O;wAdTABz% z`5g8+qyb`GY#-}yZ-$mbEC!u>7xp7<9cKM0tqtJ00S(RHXmPl`k1ey({}OwWM>0i zIDe%XKg*?t6@rpNNr{d^=?(HUKAverHw6OF+(I-(o} zbpEWSOEpZ;&e7D#F9`B#Q(^e_`b@F1NU$oo#X)MHm!*F$o0z<@(OlOgYN1h2l{$aS z(^p`37DA%6cDB#UZoF&~d9!utxTtFIQ6Q`PiStcYS2iy#T_OaHL#qx4w$&#sBN*h8 zZB-$MciOlWA3lCd=dh0EAW4RyJYk zl}_3Ofe!k$>H43qy^j&3cGgy5WU3?&Pqr#@^ssrVYsg^E+RBiB*Y@#_b}YA0 zAQ;j^F0wsOkUuW8vBr%vLXH`z4OATbfH@s{ulv21r_bf{n<|rUW`DjIT8Xl7Pfc0Z z8$$_O5`ejAqjQ?Cl*HQDFX=Y+oo!;&q9-7dKvuyu^nZkW>(`jb(G_O}RDAUhu}`mD z_pDg@t(ix*AlqAOEtXu2xUHw0f`f45^7+~tx{o9oJ-HoP#Y-&&?JkJJD|$aZ^wFy- zNQlC9!_mW1pCS1ib!C!NRH$3Oj*sf?Fm;=6aRc2yS8#nR=m`+hve zUQ9G2J4!^go11*Wjh=j^dr<}}8mggh$G4*JZzM>}Qmlb~Aav@do~P{udGYC^D+VSx z0dhv5RJU)C1ArsSzn@9|&Bb8x7_2kwuF8`=*Ol44mSOUA>n$$TZNp0^+$}B#5m@Il zD!|F1Dk_5xKiK=Bj`H3^4c~{YO+`D0=O+gH20Gh>xMM7K#aId&oRBzGcn`~`_$zl7 zb89bVZY;)kdhX4~U5T%w65$0V-`d#BJgZMjNuJJl>1iA9X$S^7dr2aZ{wLc~n8m^? z2v)f$pw+?Sfr0k)=Z3Eri=~8Xijof=6bCdP@qJ?78?QMW86C}t#p5uN^8WpW!c zZPP>6_1k`-)&Bri z;X#r{a0NrwjgKuO%kt?Xy(;$p+L~-uPkZgX*^%DZDth{?j>Dstx=pc?H1V2Uu}@72 z5o7Wb%WpKW3zPNydw%8#VJF9oL>DSGY6NPTTAVsKROQc@SC%1u%gq?T?yT=G4#rJYttqm3r7 z7j+9xHOa~J9e5;hItB5aTA+m$p+2Mh+&XyQJA`MY+jwrr?ybd{iaLd#a%QraJlpOn z3{@%nd_F3l2~ivv>iT$~(#p{TU^(RbRP$Wimi=o?4l2Metw>R*XUnRHVun8nEZhai z2B4pqW13g(=sd5h!(p&FJ+ni$w>I;{(&s8O+k0|WLq60&wgiCI#MtQ}h3k$|Lbp#N zBCYuLnkf+XtEk9%i}gS@SAe& zirlpqTW&4;7E^0&&8bYF(IR50Yod5E$xq0Ih0A|mYTcxCRlBmC?0_V8s-L$|T||AS z?CP*3lCd#d#+OQJ%&JXmJFVc%b!Bcl^yF$tyQ_TdY-W2gy5P%WI?&)g z`#-w#kh)EdNh%>$mlc9kRarlEV+uJU*7oBp#e8_I;xHh|FWvSk*H`8N>C)&U5z6dY zL7^WAuM&7?(Dc9T8h!V?-yu`l`$w%dwnr_E3xdpT%hXf|Fv2vOYEfhGQ_C5y$*gv2 znx9gsHn+CjV|evNVUVEpZW_`msq!@VN=0hy&fTV-?CUwvr2RPdn60WRk#Hud?SNTf25#@$=5jkv zc~PegVuu6eO!SJZ%I0?lc3fWL-SjC(ws!qYSfmCFkMYx4F`lVYCruHM zWb2u=nO(I8xCh%orDv%`5))Ez4SjL`4y^=nX*xp%^7O}+cyyiHrneKHq^j9?ZN&9B z!#xA!cI9iqo|`Y4PaP}`B~X7faO$(RlXN6|Y{*2Vo=yg}E3f%e_Ih=w;}ZCYbnEg5 z0D7EsxY+w-;c^)oN5Je_4#(M%)a7>tZttzgWar)0Rni&a!o@{O>kU3?oc==tbNKgl z(IkMId1PiJu-BnL@*r{ihI(||cx&M}q(o2@6(Ig~{{UAWg$Vb>b{e{DyjFo=ei)>{vQ_{;y z^~};$WwG<3tqwkM%B|$oq*(oZvO=h&R>MHZ?lt|KO+7l>#FJ6wXAH;4;~$-A`E(_0 z2s*E0CfeV0^&74CXW0J$cXpmeqpxS5Xi@G;#nV1}cGqU1e060VB$5)dLRb(kp!;M& zYjVZr+^y>$cZI2$ormG=p(Z%Hz*JFfB8D{7T9g#{fE6aaGMk|If!-qmu=kZAd9!yb{S{{T~S?S;6W<_38snIYAcmNo)L{{TyXN2wt6 zqe6Ic#|y;j-fGm+K1UU=%cjiFXhXO6m1akD(`36MhOY^XgLGBbe-NX{?mX0rW{)YH zsi=loA&U^sB@*CF|yEhg`9<&wM930rJw3z+#SD2}ZNuM=E`CRVkWt<~aDB$wms?TD?eWzzouR3xtijVqrbSdmYk zl{$2iw2p`n5Nq7xpDjEO$n?k8+lyvTOPG@t7hL0a9aSYCUhRFcy7sxp8~yni`D0P}RQ>^@!ov!2M3vwvmRa=e8h0drJ7=ZpRI?xmlq0U(JzNw z3V3Cy=R-^r>G^ej)M+CDNCK4^(th5By_45;c&u*j+dG3{Z@F@`^v{Rd`;)Bqiajpn z+__dCX-kx=j$;-^ii}7D!AW@?K~g@x*ox!nW)jJ{OK(Nhn9Gp9gB_LgYV|-GUk)ha zhE-xIuLI_2e9xCqsJ5TTKDEooi^OeR&({0nC6A=XP>O2GSSspc#+IC9cLqB<_fH-& zL|sW>k*^mX+>ZEMs>z|JT9BqhW(QVip@0=WeK|d|+ce2DsAkE~z-b56ss8{Ddch`V zv-?9WyQnwTZj*TSK3{Fcj-;)tU9l_%IvS;dvXSbdj*_1rT8m*DMhme0KiA)iY=jRD7DsuDac6T>jY0b>v8X#Z8c8H%ylneQ{p#z zV5l(rmwRA#zEf|>v}$37)3mwz(<^53c?g+=(>2!o4{eCPokY_tPj;b!I3W3)bgEXCCS5Vg%}qtlks5hvjYn~B zK~FA}+f#Gw8tuEeFx!{7DYjPNsmj&Gi^Sk|EoSk`XXCMo32x;>|F4S3;_Q3rNfX`5`nE9(k$HNQ08Aix-URP0_Ki&9w2E z72O+;bnO``Yd6H0O)MqB)Mp;3MNN&SRw(dDyz_JJx?+i?k|^em=4u6!Mm>vP!x$8) z_2XZcTB|XQq@7+AuV4TMW9C|wKOxYmu(wWcxoWaB^q3x|!Qgt+A1ig`2J54nYSh=_ zq<^=Le6B|i5tDIE9X_8Xrd14iHujyG$~j@N+qU+UYpjkW0!Kb&yhftr_NuLVQw%eB z6JJkvCy4Y=G#6A~=%@fMp<;SYR3&a#XKu}dUAH=qJ4uGl!!BQX?JS*kbABxiWUWw` zZH-S9qA%bS^AajFtA$bOZ)+rtY^0mV+hmU5rBuAZV}iU`g+0;{fm4r4^xA2VMH)!X zl{5i9CaxLSlH60i$qle|NH)^4cVx#^b<=r6fq!vCS-xfmQJoogK{FX=5zflA zV9g?dPr|xL;ploQ`@gm&$6{+b*8#V1Rk%u=-1WO}A(Y$CH)Z1}sj@7{BHa`cicHki z);gqEof}ohC*I^RZSvkpBN=9pFlT8U2BXEyNJ3P315i3_MR_!~;yH?wLQxe;pCF*J zmQ|-35Km4k);W1_ly#e@t9uU>iR{{=jp{o5?(ve7YvXrhC0@MNVq|h>IUlGVDBoKP zn|m*_++n)$&(&QWx*`P28UUrpqE*coADO2Po{}fFmqf7JoANTuYRaSJr_1M#9Vc?t zQo}W8TyCsJ*4mZOW^mhLrk8cr=BsiWMAHRn^LTvSM3odc>{Rm|by2AxjsPCixClQ^ zIVOD-3S0t9d8*V@`2uhTda^_H6n_|qOH{C4(@Kh0%zc@tr$V+{qPC0~!uVd<+dHaU z9@&b#ZEl~7G1)U^<5+c8)S0R2JQ%rh5(1K=0pJH$! zk(O!?D&+OJ&9Rl*7_Mh31xJVB56zyK^FD*ARNZ%v-1{pXn$6%g_gCRJhGHmomL{f) zaAx;ej~qlb5##)-w2;ePP`|z8F{ol~dt5UZ1l>nt`l$kil38R_4(E#^(xiF-2_0H! zfOXX|RBcZz3wSp9=7ut~c1px6lEhFkK7jsxB)OW+BT1ya zgqa3V{7ea@OQ+!;UcDDQc6V-V9qCmDN{4Q4_1)=9k$ua#@|o&w$JaR&MsYG`ph%|j z`TcClvL=fvdvf6YQI7WNCzDNA!&X!enpZ&WS^?TIPA97wG(hlL0SrrxVKr0zElo&2 zGg5kfp~&Z|sBk-Hu<$#Lc7I}J<)0JTm<%#hZ*9epr=96yrrC9~R7C{THA`!1MdOaW6)Ju4RS%5ANiBg52@hDGr!=OH;n88qQu zj2$;t()?T9b(uQ3H|`^BZVWv&1}aVO*E?%)Z%poHSOm3r72A~+HBjyPC#QX4s$ew% zf3Lk+TYmKxxB8*Di7N6K3@=Ts!lYL=f-lt809a;5sHRIl6$|Jq z_H>7@$?b~Wn-x^EWb5{iT+~%hS3`~7nS5p^c4f2G4^v5w#>I@GTrS<*J92q-$d1Gp zUqb*rsX$flt)XKZ+{$Hr2@(X2KpIN6r(omZ1*uFGuSt%Wip*wKM61PP zY9vJxd6n)|aDA(~OOd!uZ6*9y5atqRDi|21Nrf^y>0Rw=g|gR){rp1Ern8rU0PQ zc#52kf~-tuXVmTu$(Y!!iK?vIRalSVy@5V+2@sC38hSCctLWjUf~z2D$#5m~IN;yj z(nYzsiB{>Qf+j6UnL<50+O@@UH0P^MXNuZLWQRgXzynQ8b6nKol<7yeD(H6B#J~W@ zKsdkdeY2Alo2LMkn7!$U$Lyg}*u9sXsSuiN&AReQSBO~Zp_BZP;fZ94jqmN4pn`X} zl3%A1_`2XnW|l`_GRq2$Arm^8&U)SJibouRV+`?_-GK^;>W-??N&E{#L95GF6j!RmCW_t|Sqe_$`%NDLk3ikkK3shI81dNZY!=<$82!7k z_Q!nfjnh3wGjR7tdV@7HY-Xd4CK+w3grKU2FZ?Q!nXh_^a}jhOk8P}0w)>n{o2hG? z)P;OIJ87wJ60paKC|xZmCXc3+6&35!SLx!mwnJ%ZtX!4|^U3Oepd0Xt*E#a*|JK)f zvtaJrgj-gEzZi^(ABQ;Pe>F^4;w6%?C{c!p(qpFf_S#Htr)7q7 zD`}+}Xlg&C*lw2G6a`K)agUvXmT zaxu2?9nex>}#^a8zk(!+|+`mKsl zj<3vAElxgNHp#ns{{SoL_#)OA^kKjPb}8W}GYEYPf`pBF-s25m$F z1+Q)gw`2?>k{NH(MC02K8TH@|e?FRIMDXOdv`?u7f*IQw@;T3_;Cd4G4_&TTXkzmi zF0|YoLAG-BC3cC+XJuR#>Yj@AP=9+W@>Nm8I{mzNjUxsr8-NM+TwN8sJ2~cQ00ohU zr=N+ZT zl2>=!)eOxgb0m7aF+?u5QZ4OHiEb5VhUl5pe`0DGhxA;UDf@bF$7p;;kv~h!u2^S? zP&4~FO650=OHfqxbr1IwABLySN|_DOildgjw>47D;~6@7+K|;$6cot6w-ihRC?8MF zNk&v@ZP;9cP#LPr>a`d>IMTWjf^y&wAwowU94q;Ky)L@HX>NYV&ou_jqTATaM_5Nq zk~u00Omf4xa+LEM*45HwSUq)JY-#9(DOP`|_jh>X26eS0oE<>5E5{>;$aST7L$8f1 zQOB9m%k}~3=6Z9VXMYuwcy4v1k_>h?bc{|~gFjh~+tv9wtJO_YHVGsplA2;(HV9Q? z79U@92U0*aGeG3z13^zL@an@#xk(%KwAPtCKcz~4pQe1aZ*}J?YB3eE!P$Aet0MmZ zc5}CqJ7M`D0I%ZXlFf}^@c^r+F5$TvCETHjF20V!X8lRndq-Ve( zV^K#r)JY#dI)VNUrw*#YlZO8Jb~f1C`--n==NZGWe_OB^5=?veZ^_+tQ? zA5lyYJv{o>rXD0POHhWoxE!7hQBpjB9S6|W=QDJ9O``>FS+Et^)R!C9@aE!NWc2u1 z8XA|UoVwGcT`G^-lHnvI5r4zVWiV(;m>1DIf&Tyx^Xi5u#D-Z%>wgffGr(!#Px5p; z&q>v1ud#h!nBMtaq-ae0uQg4%vh6<6+VyZSmYZ&5=rNS?HeYh(MU_}HC=Gks-u%(t z%Niszt0=7%l~t+dS8n03gIAo+o)fPZgV zo5WcPjciW>Gmo7*8?(7B?}h&L_m)X3aT{xS)njQkRVEK1wfATgSn?W`E3vs~(<0tV zm9ey7vYUU8yDF-K43=l<)v6k3I~(kE?XRE*JV#cNNKj^R^%SKMo-(-2MmkIH*6mHw zHm3C5)H!bB+&j9OY$Y};3$#}W9>MZyG}!+DvBy!O)>l%~{^3hHl0Q)Pl6md?c9P;4 zpojrNfYH9*KcAmkNQB9v)!)QJ!Q2v5=eDQeua}otcg7M`x z2@|=PoQ5^eqUYiHb(ay*IK#5CJKCy`Z}qQV?p?bXpKoRbIEnR-p+w^j^ zd>?fwA{Ak!MS)RocNX`OqogogN{T8SyCYHO+)ioedUQzus$I&0;BbuxA1vyppF#f1 zt=qUg!HdZ4-O1VeXKUhi?PS?p?k^=YRom7u;Y~g(5hKC|KB<>YOlmcdZO6A_mRo&7 zJIJbV#IB`Ke$YrCI#;HO#uHTVsO}nle=c+zI2=Oia>wKjN6X8tmX9otakcPGgC4y~!=Mm|2Z9|@)pYH_jgkA8YN(d~H4k zrnRZFJ0GmJzI((PiR*JQxT?(Lsr418a0n!xdG_P9Z8)^PyO7GtSVt3ax2V%o< zB~*5oDW<2*#WPP%nlC!S(8;0KHKLC1N@+jgJx$uXi)>csJ4T}&xc3e-ZDuxvlhJOT zz{k_&cUI=jW3?>Q*m<0mg)%iO!g`xQ{Xc5?O=4KB zStACa5R+Q}02OQJ$2}>xYHwcr>%El*?~z)+)O|fC-D{~iKzbo4^PPiiCEuAkex)5Nhgj650*M( z-NOYCPp1>d%ZEXX;r@P|U;D4MaJbqC#a&Fh zyE8|g&F*}KRJHX`;$bD{$7JH56INpD>S_m%$kGOJb8av0%^suU+|1$IhmfbJJZd_5 zyh#GILZLX*%>4YiV&1!wk9E?eUemy5a&%MOARhrQFb6yjbqN6T2 zc!##1pHx_+E|(q&NI;+<>u=3T$L#4}xx2F@V zGDH(Iku3M{@UT`u2= z%Y#ovT7W)y=^(j&y3Fo8ZtmKhdA2ZnJ7_V;R^qosO?^!H4CbLMiMz6R&?2G!D^YfV zVgMqLFMnvhj?pO!EbJK7m@q*TXW{LUpZ)`ho3i(!()2FD8oG zH9A$B#%1+2Z}JbbuSGq>1!lK`Ne7z^BmL!YKR$$)!Tn_B|Tnm zYj2#)JB_j!3BX!fiDr&Enz+S6a72Etcn03f9Euo+K4{sR7%#nz! z*sUwy*v6i00mrR6V@r)vM(4sfssp6_mxe3U&8eH&TXv>Ot@XLLo+iGUvTen(FcEDm zKIXwsQJaOJk0H3KAWKs~WS3Emy%C`LA8a%Mq$RFkNP);;z?yIXjQqZRZC)gaz_NK5 ziWd(+2iQ$X`O~Hhw%w}UIZPK+_1??Mc0Nl5mY;NQxiFE^(_^;#PT}aNTB3J~suKt5;67CID&lhUY;@-q+KlowQ9~9s66Ocf1LD*?2H_{FLvcNHhm6G zt83Cw;dZ7HkukYC&#=f5AzI1t#zdsZvpw{J(y#a*ZWtaIA~Qr|MqPDvDq6M8IDwBa zI!0y_xRwUgABhCh^7ZN3pJVO)yGv6>o4#$swzDYp*&1!diJuMkIjRanG?=rQu8vC8 zhaC2ZsVW}aU*3vb+$d>gLr^{zEJFGU@cg=Um?!~ZWM$8n?J7ENuH9RLvMsGeOBO?} zcJ>B3jl)k*w6b;ZQ$>&w{k;}v6t%t}wO(XWWQB_ocoz1e3!`rsj?uHLEZSR!bA$HK zql3#a=6{~w!5c2*;|VkaxJ}=aLtwe^3qdPuY~7b zvE<9+@C{13Wf52scoyf~<=kePPprJ(-^3LP1Y(>&2AV3jt5Usft=cjmiqbJ0WD*WE zpHt^k^F1JGFdbK%&K%Zyw!5paxfZ3P!DF_Bl{>ClY>hkv?y4T2jE$#dE*qa4HHWlH zx209BF7%ZZX(wg`{Pifu?COQW$X;7>CVmy5p#1*;!_c3w;FQ(lFdIsPam~G8+%x6& zX64Rq7k$B&!v$#PY(MZDVD8@ z7RPP;opAu^k3=M!-|Bs+`fcWWc!aYT#$@U?^%n7-d`ubZMAcQ8EL}|BgU?>3AY2~PS59iV= z6@bWYy~UfG4Yo1#J6k=H$tD}G7kE?ANrIr3XwBLZwAhnP zvbMw5Q^$|WSESwuGT3Zw5c?{uH6R*DA>3SA{{UZmhVD99yeyFHDy#Y3cza3jC?|^d)VoPV?(Z{j;_oXW?-hXC)0bdu!~@?Z@Nc z#cn*ETE?{*jE#LeiQ0mie_RmMxP$@$9?PxdvATm?c1?3^&ECkSH*h}!zmlIaGw0H+ zPYmrG_emY<<5K>oh7Ss$!DC8v59O?Yf#QHsr};(x+s_g~!8&+&LKn z+XW3KiK}q;OG0C~OJ4rf&LNU;BijC&AOX?=V1k$hi8=K=Nv}y%_-vu&c^UW?;@Pcf z<@R}W{{RkGXVpoyB-q)l_5JaRq8wu9H(CAxw)U=GL_fsi&DIA|k%u86DutPd3v+L$ zwk#Nstl7>_EmdVI0drbydbHI|5|d)c*Ae?$%+XC9Q>H)f{jdfl~>%;GkT zY;)5~x})4FM0eik@|2E(j=j~5ZY7B~rw9uIEDycBmydGcBXe_r^#PJKAHq%n`PV%# zt!v?|p@9OLV*s32;vCmBt&u*=<6Rd0dZxz&I#EV6>w+_dPbz*bah>)}5rQSP# z9aEU5Ozi5)X#rV+H#WDnqJg1*8V$0*$k_2N2uW&qx&|Qu1B3Ce4wS@Jd5g2$+$ydT zHgJIP0gzBNJjF=p5ux8X9h1Ed?AuiBuyR|Ht1UsC{{TljVicgj;vu{dV>a^c6p>$_WNBFmm{;*Ruf%-U$aK*c9u$zwU5Q+RbX4&G>EH*Y zen+OQq1xFD2J3@6liAo##@zeSpAAXX+3mOn+iYa6@KRR%tj>J6@FOTRCvzy!dyP1B3zvzMr zMG9z)DvUcuxJpy;X1U|iG`F|4ggkcX9jQanr z25nwEhZS3LO%|gChJ30zTs%~k-WYC6eJYYl5#hzFJ;(qI{{U@i_Vi#HP4R`U?F{DU z+I@e4$x-bZ80)@7e0Q$#ZLN(?w1FtGU%@uK$wggRlaMM+<|f69F#LPHycTv>`!s*J zCbzr_S{O+TG>?jDUA46bki}_EkV$hD#@}@9xUI#jOT^SPjZicoeIO`4U$VUwnp&LK zU`f@xdG{R#3mcG(0d77`?T& zc3wg}z6#_u;bpFR6^OO6B!itt4Qrv z7%bEvHFJ&!rdCNV7G;6Rw+uCQ1Qp^16dEYNqWNOI3cFKi=eL(kWvFs{BC9D$j^6Q2 zkIy|89!;K*(*%+nHtFozx{;GKH1xzol<=+Hg^B!oNffq?akyK{AzOxpbfAh!CIY!B zpm=clv&qD8>0HX;Eaujv3XrcLL?_i@16-%jlR?r}4TUOhDYvgag8Y zLD_R+@{vahw}W+T!JCvxE(zyBBPA`QkbOD!`$uziZwBACy~=HAC1saFxMNP`TG4g< z&1t~(L}+aymg+{gn{<$X0S1Z<09Vmgpz<6&dQ0!@?FR12U~2P8fyGnj=?*som)pCK za^|;A)}cvN{{V{acxz{@tjuL=U?wzCq^}?VJ*>HwU!v1)*KK5tMKj6|i1hPNLLx8p zR-ZC@q!FgM7UqpJ9ZjMoMN#Ca02QyPHK!iC&uq+<7RIiq+jD0!U1n+EtN!z1DxjmP zpB+G243GEAVp7dCkXO`I>R4)}jbzhn+uBG3$Q>48B=WC$P-&~o24PlEI1z)#s$Gdk zhO+66KIkN4fF2eZTxS34rXKolUr=m7=EFo4b7DV@ixhI)aVP zh+_1(HkRO}AA+WUWV?cUAF?LNNkT)e5i_Rjv>o8v24fuzPQ>gljp?X8NZs)DY% zSv@f7&yWVc|%XfT4LLk&Be|0D9-9Zl)IcAc9wUVIW9W zBGNfLC`|zVk@6X*Obe6Vd%}V!x4u(y_mueB41VF;g10;l#>Uao)D@_u-OyG?PU%qa zBP>zE=0#!$9^UaJWRAvN$zrjP6%pG;jVrQ@06^4;IF>$H73)#jOKfJlfnpROJhBF2 z0}cqJ(Vo95SI?yeF1s+;%!V?Trg1fGn#0vs>>8N&47(ruxmAv+k1JO;@xVPqqjzH| zwCSRPxCC^tTm5~pYIca_SCn4;6q=!tZNIdY*>tKIo`oW=W$^NIo|T8Ygs>zZw)?MUVF_rqHc-sCahvaD`M<1QxlvkkOsIs&FgUqDw(=*R$TV zX!IJSFFf))8qp8}s~Ga(L+Cne%+%!i_a%^|!(_0TJO;;?6-y^;U?{V0a#?wnC9A+o zP>@kmR!~(SRr^Zl!rJ_s-`lX+$!K7+nmE^VXp74l${0kMp(P0i(xcC&$rmz9bg;TZ z;+WA&fX+u2H9P^y^B!G)|JT;KN%MJ{P0PEc*%^KLw{mn)VsQAK#k}%a2zGT|PEslA zmR}>9{Dplp zj@sI_sauSw#O(~7W_J@z*etyk?S(fTFY(0!vMfd$5+#ya3RmE87CRGv>+OcQUk}8V ze-bKiU{nAx#Bu8J9}UWQ;wLqxgXD3NabL5g79(y=+Z~Udrx-kKM&pYPwJ(m_vc0_m)RVkz5Oz{)q_c6S zuWf36+;siDGSyqRCq;zayLytAzX6n^#o_klF7C@@u=Bx1LIf>Ejmu7GBcYl|kCJG| z>EIqmwFc%}g--_Ja}NTILq_>fS003(l`;qv06|6-2S644#(IsgcD8dZ98`FWg;cp{ zGPzu?;@C8pXofRuVI%S*ZYnCO(vVhGNlrA!7}Pnq2Hw+Vft-aHgIt%#~EQTpsVn!H~tK=-Fd!qSRMZWzo{|@a+q?v^K)TvgLp|t_mJM2iWjR^mX^9w`c92M z;cs<{TbXs++{YY7wNT7RuggfF{hd_mM^=SdqM+f99$DeipEt7(%>EIb-8j6QdsjU4 z6gy851e5;&dAANS6Zc8D=&30tV~?(d00uT?A#cwf_ZiaiB#zOT__YWEo|vfz?Ca9f zWDORRC3sX+4@UI+dJ-$L+hV>tZI?xvG%+@3xUqQ(`UaB@&c+R`6t6u^WRkRC z)M^1s{Rsm8+lRutc@{l4E(tkr56k$CKbKxFBrB#!-WTE7Mkc<#pDv5NO-(Y^Zp^&f zkN6aOlCq|=?Qk?%3LUxFFjLg&qru6Frvc%{X{jLwu;=#-^YwMhFLi9bHP ze^W(uI;WooA3vG-9+tT}JSO!QBe$374*`qP$gtT zQF+)h59{wvN~_OlHiibLxQ8|Q0iW{qZ>n;FHjsLmvsX zL_ZM}AD6G&(B-vjj@ySBC1(2E6n*8rXehAw99C;?VWrx1m<)R8tE#Kb<`}@Vu~X_) zLHeAi=JyXQPUcC!#Uze^cx;ShubCo&e>&G4QJxDs_8cGYu00N`*(I$rtZ#l?QKru z+}nPWA{si{HJYHk1fw4q5XUSD*7q+`E=Ka}+h(ixrxj#V6h+&ZzvmHH+@)Q7dc_Yw5kg5n3U0upPO~)Nct;K8^_RPJJ+&i*^HJ8aM z3_ji4rOxW4sHQGrq--q{8Y*0FN~P^1BOoB&#@_ERzL`;rG*)0#cO3`iq>@3$r3abo zZ!~ChBw|lm)~D=lKhLiAw$I-!joZ7wFV}mA4T+|$s7nf|G1M@7zt9 z$!@IE*R@^``}e7Z*Aik0b_PqeK5X* z?FX-Fa~djJF+ez$Rsj8nBz?K*{{XV$+BxpG+ST~V{=Mq0r!=_SjXy%|@mZAYOt?^q zSDswOMI=)QYx$JLs30T~Prn;$go;@#;B#bJhIyn`lD=a=YU%VOADORS@g&cVuGeSD zR*}=w&p$f!8Pil?YA_j`OkIzdz-?`vQu*Dl*0a#nX6iH9S=6*=H$zBfq*&9N$syp5 zNVm6;T`j-Ui6R!vYRt?OpOTtZzbez^(`y`lAa%Bv#HMuCgY7k-AJ3 z>Zhf8eWti@7C^E`S}4<`ljIB2A86}6eny)Uv+@yTF*(ikzFweaYH|4*39(fhe+deR zaoKE=MvFv~Ll6aHBU3g102e;>GD1{IEy4gzD1hhYN1^qvRb_D^MH&DA&zSoMuU+hl z2=?7mXLkk_vg5}l2y5y z-Dd!4QzPq+gMbkV6$95Ddqg2#7oCK31fo$W-^HwCljqWBc*rbwZvhE5#CW^3|&(B921r*Um>5}E~xbdQ-J)P1L|BqD-4 zc-lfubvt;6<_&UsO5<>UZQ#t-=4$tabyW>UM>C4Vy-hyl#bl~vF;Zgla=Sq_r;^&0 zK~e|P>F>d=2kU$>HwF|shn_sT&^`o=sSsHJ;LD2n)2zKk26Ox0Q?+*{;KXbk4qBmd z8={|m!8{l$`ixwLYD_&;)X>S0*HjoFWGYw=Z+~o-GmwzNvdVnP3Rl#II3KX}XnYl` zO({c6Fa*&50Hx_$QCEe{RPUVCJK(l1M=M)bv?#Xj29|8DKR-_`qNc6He;0_Y6%>fN z+DoG-Cy#FUVu4Ib(V?gg+Nj>3id6a@oN0umOtEV7Bz9nVnt7i=)?L3(yeS$@wNv~n za&4?+aMSJj*`$uN;N+r3de82*IE(HVBfzT%OJ8LbBUA0NMR|S@? z`wU$8Ix$?hy~mOBh*oXGS2b<&)~>-w)Wf}O4;J2szc*K=p#aIE$wXa?$=HJH4=b;RL*Fqqt=3i zk3rKhHr?Trg<08~3ZSm9QaDh3v_C$cyDPCM`;T|^p6J`S;fUVVGSp%B7R^zU&u@7l zf&w2olUZr8`10xyyf8<0OWyo@Xqe%NrnZ`}Q~=dfsXjpxq%C~U?CR?uith_Ec*~F} zNc8^z2x3^49(5G-=`)tx+1w`6qKhAu>utk}rO(&mGkZ$1mS}qiEgY2&8g1Vmxn|Kt zBNks7773)E&$pTFp?m-bJmvk`j0; z0teeraprn$jEV?-NJtf|f14NsO+1B@JFHNLpOh zUnP#3I?ojqh3Tv=54V-(hFx*rcyTB{0)pke6p=tZPhKUotSN09rF)p4hyAJIPx9zM z?Cr_b+4>ATc)j<8gK}WD-h@2X1GKlk6R@^A^!68K)$JO2V9sv1cRdDP zq|~?)WyVUUBRq7zSBRETN~Oi^!ROwZ;sUnu$6g!;{~ShmsW$4Sf4@L$B(B%wsX6B^KfUX zbNEiH+}j?H8!kr=zcaXAz!@#gkx6yX($VAMsHTdG9k4(c?)iDq6+AC+Y6GJ7OUvk;&my8jW#^(MP3E z&mCPwLyLwH#pm1Q`DFAVZjA0@Kd~^Ie|E1|WHx_ZWU6qmZasodAA4?!>3_}T>9aFP zD>68!oy@bCQ3uqU*n4ot;46JL-tgb*)YEu{%7geo6huCR8u<>ZE5=opJF_Z^X+ofn zx7R*Z;nH7eQ|#EL&*EaK-;`TZ7l3&?A93v|X2>S|iJVQ2fXz~o%@sPkXlY3Sik@xl zJ9zNT8;#08ubh#tL=I3>hncN0UL)79EQKi~_KIy)u%FqTRN_33uTPns;e&nSwdgvZ zw);6`#Ner@_Pm*RXle0y9PME-)Z>vsl9ec;qiqt@ynLQTzP{BKlHS4?KBnGR4p^ea zq*vEb6?Q+vzrOqZzt2bV?HeYdnaQB|x)h5pD?a`deZXBCuF+sfhPh@S{MXaWy!&DoO zJb_UCK)t=cZnx6m*v^2Hrc#mH!VW=W@k-?6FPY+c^T`rb8Y;U3h||6NyWF18K2+#1 zZO>1X#%??o;aU45dStPbxk0)&hGRLA%I)lpJi=w9+SG78RXtTC%j%LTLPnz8al`&Q zyQ}Uu()ep#F~(IQA2t9A*X5qAZEm{$p4K#rBA_TGsp{uHw4RqWeO=mk%oablJ1UH%cE9Z8UIcnTq+p6A9umt;DB|QT>Nmj0_9 zSioOaV@4z8*RB=|9@o7_now0yd)#K7!-|4%5BNHE*i=11zV^5Ge{t?fv9Bvl9y=M1sEJSUdZ-9UiOgiN`AIhR=gClgopr^4R-NtErV4OY@TvzteE>^#Vutv4Q10f?Z*O}!|i%Wf=IQ+3niL<^&EX2Y#)R8=ww z3Pl4+sgE|lyGUoB>DuBqyLo5>PZ;h4f~vN3ubwH@jIlb*p#(^xpQgkpuMt(jZnJD$ zhBJ3&cr z*@-SJEm(uDNp7AP-a1sS;bj8FuOJGeuD%#;SOhC5>30PLl6Whpv(eX|r3G z0kWz$jtgw19_h!^KW@hzHBpZrTeQ|Dib`yJQJqqvHG^91e|nOG>rUQaxG=_bPFKT; zOL>(&#FN0}{JPz;#~a3EfCMF&q81{gWJvrlKQ4zqk(FEL2bSAgAGR=i#;2&LDKc-@ z`A8@hr?PizjC4s&U!TT9n#x1qif10H1_P7N9@i!EF4qdhaK&n#J;RBX8swFUSRk!D z#~+aCJT^M6qzI9{*#x99ly3|k6=cXX$n}pjFW_RvKu|K~Rc$(T;4y3~M zs?<|f?V5Y6TbJ*0uMRUGG%^1Gz=_0uKz)^3IlH-;;NC1D+f|7DMwO+SqO?SeXEeh% zN@tF1av(c=uYK_`E~<#Q_=!5dA<_zye`KpSCg$0_ExC7H9xs3G{C)zqrc7Qd3H(l$ zC3!Nq+=Mkz&qq@QB5G8UCycolAaU(+yj`vBu7`m&+)8wUo+g6Wphm4KGl7Ge^q1+L z?kA3T86wxH)yjthfvzh~AXL!vrau=>yGs+;Sem??wD}wlUd@Ksloa_)-A-%5Oxwz*E*3gk8JPHEsXnNHx`FM; zV-dN&xJz?y@yPn*cL(ssv3xWiB0oN) ztlC|py{dL|ZER&c17~$)mAPz2PjJSnXzD7d;H>@uS6=Kx%_zOE&(hx1!TahcmJ4=U zD=V73j_h?jZIM(1Q!YCc&{M5{i|cEvK-YHxil(l_Q^19D@PX$}JwE60O(sJDnVV*3 zH%4a{w=mh-e3f=vGn@YHQ&TZhNtvh4D#1&St(MHm2{6J*x3mI9p2|2T+$VU8GNOh6 zx0x!7z>q8J)38P@=a|AGhC)Cj_T=yykHiO&JbHPo+PSX0T(vghO|6gL-MNv$<@PQ| zZZ;!vP~vH_Ga;y^k2M6}Z?v)r8N0;sCyOCoy zXT&-q6|F^SsX-OviqQ15#q7PaCefhA_DnMj-diI{x+-YtH@+hsiQL%?yvp7#y1~*3 zDB{jR6t+QIrzq)(dn4@^@wAWI`s*$3MYi2r_o*`DO-Cg_vBr&Yfy~Jsx zuXDLRZCom^^XNL-Ra={4c7bQZmp#hnH=X|e+R+!&sd77(WjG6V;sV}BCcZ+MX4Ug z=m9?KVz;op#k5zJwo5tqZQwFox{L)gH9R$8h8lqNuUnn$qq&ae4ZM<|FO4*%>0Fi& z0ZOUhPJVp?`E!lS!!A09DMh?DJh(ZfgE_YMMMNeHWiuI@Z0_jtejmF`6%zR1Xb!0u zeSaR_Xyvt7l%&zZu2wk7S9N2-yKoC0J#I}5j_m#{YIU=+6$InGX zhi=g2b6G8sO%6G$I@@;dHhNvRw=31u)#jZlX(yx3sM!ml4TsBwLgc z(rACdJgq$(W?$lURaH+%f;i%|iQ%?nia8BlO-fOl$q>}BZ&5+VJ%9hu)#|32EK<S=1RwY2gNu&$|*368F27bAjVBkAu;aVLg=+$n_J756Gj;6ZcuQH8M@$Np7MtF~Bd#R<$4O^vZI$Ja#sNJB6yKefW=0QC6ab zrl7@AnwENs%;}lkGd0f4bp{7pa7X9gfopdS9I90LaR=q){%)B7NF81>Gk`zm)6&(q z<`;Toa?^KO?k&US!PC*xZXKbvF{t>AL@qyswIwAJQ%8-Grg9O?ji`_I-t{WmTq|n0 zj?!x5LOlumj~`m~XckzUGIz&cg_?)v2_vKgd-pT8X50-src$dvP5s@)9Lo6fn614K z5##BqXz89PAxTojrDk#n=JvO}_^QzbXvc_0#I*pQv**_3HIr09hjl{yRQ&wr4?jXcyi9j++>kY!pT!Ibg+2fqs|iJw|a64Qv2 zw2xC?I{9?kFp0Iv6TAe{tBm}?7#}{C7_E`j`7QOdu-J^&?xE|N_m?@8-1%JWSXp;G z*vIlkUy{Vs7KaT@PRaX1VhR49>l`;?NnuNYEP&%ef(QCjK~Q>rS(UUDjZTsC{&eXB z+nGIu{pZ~|jib17S&6H2n7no~XVbLVak;U$nIe*0jdn(!nNn_U(Oa zSnLcDz^z`DoAK?GVV-#dxvV#eg5O5 zucV3`ehxH|rx8h1WOQjJRnp!e!ybLKtuYBA!WkQeO-(rC%AY>BDTNruVkMh^2B$wN z4!glggvZ6Ucbab=zTCMwjP^$@U$=79xiJnI>0@QbQ{=O%OzlZA3*v}aUiJWcyDjFl zX)Qw`2AX67PqByLAGW=02wgPlo;Cmh*@Npr{$7{4D$Kue?8q~cZTtuK=Qp{R0aXlj z82yuk+tEWPXe7bVM&Esvf$6X0mOxnkrYC{#Qp6IEYYS;3f&#@z<5oXEv!^^ztYW*I z1qX|A?(A>~b(wOO!Zeuaj+A#DI$bl7s_3#bve{3{z$1N=5kg3fg z0YqcuOH`WXn8!}VE~p&Kq%w}tLd5;J<6kdMi@wWBRonUaXg8)uuJBo`+rAHOV6hLD z$z|#3r;*mPIWt5mBf~(U3QE96>U9!$9@Ggg!3HT|CpnP!AMn(kn`pxj@>|H#aiWm8 z^#iB6S~?i_Zd#AIH_lrtj>O?&tJ=8SRNuv@^EFcsB|Fs11aD7|5ouCma5y$6iyf0Y zriXNd0yyBe`d+D_Bc!k+G804nA6k?D02R~b-oaDV=XTyNJJyvOH#v~5gK|l~>+*3! zjHtm;Gfha#i$szItf+(m3Q9-#*n3XK)=;Yi(zU=jMqa``+T?!Don$uRtKmqTdumS) zg!z7Xr%K+#>@06^WvM>GUFDL_Hbz~wfxuR0s_E&eBBde+-SjndaZ=*w^+2qvYq2%} z`+j9jC?UBbAUGlgq4OF+C5O(r^y-Qb6^=`2;w_U!f)n?k*+sAU} zv3Lr`rp@fSiu9gk!P3qizZsUyNbHpG0mBYx}ITNf2MF0ptEH0JT3MT8}Qa zu)y-_swiBOQ>MO0G_OhArb{xrma0wFi>B+!I+|KKsRZyodo{6f6j37MF|_q6qSRSs zKo6v_4fXz&Q)zI~n`psMC>i@n{{T!p{#|N7-~$wuQSk*BW9yUU)7IYJyFVGc<;uqU zM;Aqu+mT~m3%3%k7Tw1oFs6#1C6KLxf8kY*&K_cIU~UMvx0ct%PYtxH0!i)!ll>Zz zUy$p@W|csA+Xo$|9;AW94w*N7es>eOFdZ*~tf#=q23S_rT%O`XO|8Z%)ZKv5R}pdZ)Xgs*cMo_oIvGCm|g)%63@ z?WatMJTD3hdw9fyI$PoY04VwN!M?Jz*_@?5C!JilQbaokW=ZW`=9-)ar5mdWQbc)WJT z&t$0IYh*ImH9(q@Sc*~{E6A65Wo=}BIrh@95y_=zAY%ZP8N;MN>^ZO-%1k zEp-?HL`!`?)9O9C)_0nOSMiH!f`;(sQdyMb9?|E=CWo!0ka#8Rw8;|+7gh*={)P|msElPp=PfARRArXG8p@0ER6e<3TABg(&QLvO7HlG!^w>M!_ z?v2U(UnJRmuRb#ySCkdzBysljwXwN+Nf-rJdmRn!$BV{xce{=xUL}ny_G6Ey^XZ7k z>FG$nS2d{^^u$U$O!w5Syz{{Y4HMlBiA*2Y=sjW|_4hy6#c8O?(ZFBPs7 zT1C%FcNQ-jm#mfYn{NkB;z)%fM*b+P>e!DYNV=4<IZ;EB231x2?#B zR6&6aOp0Kiv*qeKSnRLiMob=MCTuQVs+%g5b$KktS8>y2l65rIG}V~uDP+mx!YY{= z9Z^6Y+_<>8oAoESm62&c@1+NjqYyNq`s0zPNg^F1SXb_!Zq_ih_! zRP9XG-;W=UO6J4B%UhAkSF=kxZAfx4MPDsUat#t`4j1WuJ*FtJkkZtdsA3r!QS+4&piN$7WDwg*MUMxV*hKE^K>b zymxw;DPv0Pyv-YFa<w^NBUZMderpWm#*16Mz;Y;fx~4s-eqxuJ?p&lb+mhnAyr?IgvnV^PeLPRdRL9~ zfaFM|-q#l`g;hUNZVcDWQ$}4VJq1Cj`)QA#RB5Af(YRH&QAG#{B>IwiRP`3>$YFQ3 z*VxtjV`}dVHbN|fIEtL+(5K2xilfWt00}inh%SB9zdLrndy1FWvA=BPV&Ikb$VuEK#)>)RGAs5 z^RzS-^4>`#+p#TFG+IF_AV*e3H~M>b{843$%<~B;fTS2}xw~W9x<*gPlfZi8tH$Wk%xvuk_7VpTN!*cvNS ziOK715>;re;egwUcR3-dMR<9W zKu_`?m!CsEa<{EImbQzuwgv{aiz%PR#Xnx)ca(Tu!J@3lS2&7!_eK^OqNT#jWF$tG zfB)Kbw)w{iYTSkdYV2w^I94nCh+J4tmAcx)A6 zYH3Wyg-6Yebkm8hdZ0FuYmD57*QGH< z6||77nzeDHj7VSf+<%u2hRw&;+lQv;BCbt|vGVD-W{Q((E=PD!<@cW3#?(`*$w^g< zqVrS7M^vP-kbvCV+evOjW?P6ZO^ztkD2`9a@&5oPNo2T5rk36dsEgE+5HVU0Mk2qr zk4-qbMePTtif!w*_J;C~cwx+7Yon^cZA=!|!xJQQRT&y^k!8+N<0??8d%efHFqB5= zXAtnu!iwNX%-l(+pdT`Nejg4h8;x)0t<8JA0@DJV2eR- z=`@cm#NG*cis`PbDxB~X;z!xT&#aVmG?`wfz-4k3+nS4YQB6G#%-guU3&FGZJQUNK znz(bdpLQcPVo*vUj?Bw@T>EMZ$%oZ2xQaVvJ>L;`C(zSMf$3h9+(ku&L>lhM6=Fpd ze5kxbQ_rOCA7#!zi0*C4l%m1zV}Z$T80d2OT5N3-;FuUB#8A=58R;_;y}WS+*5Cv0 zaQ#K}h>%9jY7QtWF_OfZ15Z5lS&g;7=}OgLKr{uKr+~-#`hV%&wMU16cNCdz&9~)} zg0nx7-y24jk8o7&oB)i4q0DXCq2%+_9t(YJ3H*CxB$G%aK@&@?1zADSjx1?h4?;Su z?`W}@#8NOgU=EViJOTNAqolm@b&WRl+4*{1?Oog0*Osd%mfO99O_;=O*rpPPhYd|L zNi=j))}v}>g>=XM!`kh^_et$i3*F{9An^qwf%`xndN81#1J0dVHjdgyYfB>p!G1RZ z$tUJ=!FcB$oh~z7gFZ^PDOG^mn@16d+_ix>cGkgVMsqO+9*#)iix-Q|WuTILd@@D? z#`eD#;CoJCw1l%kYb0PMgfg94YsBeNH6Jlv9cmSM9yXPW>8UzFKuP{8d3yB6y|;PB z<}!P;t})fPs#l|=#LXpBQ&rXB8jci>N?MbQv=uN&hRq~~&QH)2?buS%+(enFLvBr-KIp8bWL?Xejq0fkHPJ}G z`E@Xe{Xys2OL1`|@mohFwYm^mMvxNi=&Dso0D2BSeK{bKTX`;u8LqWyMl2CxUpfPV zf0^kMi0s|@UktdfOg2z)d9X{b`a(xy7W)zw*D zr@OXYcU9MKjm5vIXvXZ^n~yR@7E1$zz4Lo}Zcy&CQHri-QhYKGO7U;UwD&iXUq+WZ zz3{x7SrJ>%&jKGObOk`C9RjA9IO_KBz^y8U7S<@DqPiMZIHsiT{Q6mUc4rs4x9t|~ z$YVZ3U?a-ytcz}}p7z|BdM(YJrN~+;I&2L+0g8@?3iA*qNWc;&(0h7Y#-1BNXSyR@ zM=d)nRtRBQcW6wPlC|z9^Xa`NC!Pk|El?9mEUzm$K61J81AzU#A-859BS*FR`)1^~ zuGZh%YZ{d^;r7p5;$j&sub0WHttA%q-0&o8B=RhwSTwd$r;ltPcr7Kk`WS7anq6Kj zj1APvwG|PAsTYrKk>!)qlR|D~4HHW#jX)*ASWr`fR|J9Q)6ZK~cD@F?cz+Aqm^!V? zwf5xudl6B(=(hCxW`i7rPgzHhtf^&>C6e$H;4!h7o-gf`Hqu{N3GC#WGv25b^|>Pj zxM?1BClu!Nn4K7*n~_h#WHuX#^j8mUwQK4!n&@HyOuLlN4$$9y!E6`AdqO@m#jfY}tx?6mb!u}vD6y8V6b zC?mL^$GG0%wY3xx!yIoU(qoByDvJ4&k05&VgvH@o#b%nwqe(OVFEFY&kIRo)wjMuc z?tIqR>$&Oo1ekZ4wdx_p?Pw#<;;^y6wI^{=)k{#H#PW#4(N4?-h0nHS0w`o??qf5% zfHkw4l6Wxy&;g(1I=pDoNYhV?bYAKZCRqGZEV^W z+>vdq-(HkOVV51a@YK`E_PF>DqBLtGI`RE|m{0X~ksF`h#tR!@73G2epfmmiEGkJH zPZQEa5KAM)ZEFvT-RHz&<3KoeARM0|<uXby2OGIYE!C zsHdf%$5l>kBSx$OpRc;hxR?ZR!*Mr==CXWV8CKu|sU@`e174h1ym2+$l1HQt)h9~< z!{ebPeE1CGsZF=(dgE=&h{*K56a6ae{l<|)*;!4~E=11NGBd=r9eFCrPgxyYE#p2p zEUoqTq_cpTrQI&K2Zg(mHD!(vJd1uXYn*i3%;h7F%HrK2U{sMAXJR;=WB@;D>5nlj zR^Z0rGP`bzWNh8wxv6&L9?{#i_4{*vrdK5@tohunN(hpIfoFe8>s1KW9D8ypqlznw z(`Mly{X;WI9h#pC#~G_J9;2%)EiAV7(p(o0iqHf=G2X+8Jt((#Om8l^pKD?FR@T|k zXL79-K4bfBari37Dm z+z|@4tSW`3qI~rpw;+z<@vLm_;*nt=1ZXs3u=r|B zFZ=T{QR6ixLnR(kx~xZq+%haWnU%_yCf{Fnd3M`-m{!)=ztJw8)H8q>=wh1#-oo9er z%fyr$emNzk&0uQ)S8KJ44n4IzP4v@Q$v9<{ke2@d0<$pgca#lP0=434(~vqP&(-OT zRVYiX8b`s>1y5}&f$N_xgiPmu?;N)IpLSzAUtrf$ZR$kZTMlfOQDbpKdtxdj5lZQ` z>5x*cN}f42B()&72cCVtZLRGgv)iqC%ty~Og# Yd-YcYgINQzCy@tDBd_8MpPyg<*+Jv|d;kCd literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/soldering/6.jpg b/lib/ESPiLight/pilight/docs/source/images/soldering/6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b1a9c00d757a2787ad34123c6ff64b7cce1fa8d1 GIT binary patch literal 400425 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 elamWcduF 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

        T_$&zVc{zmu`97X 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

        (ABo#tVO5UDLoRPCkOX8hTdAumB8Fm!BO>Ew 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 z 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

        ot{_N39ldkNZ=-zSnCRQ2qSjD5N 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�h@9!ZF;31^g* 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�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 z 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

        u4>EDtK%!(jm;e-3j?HxO0Fub!^=lYgaKqv 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

        ^P)k?R%nAP=&mHul67*aSYr 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�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]pSCNBh%-$G0- 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 iF`wyYSr~%vJ2SI4mXdo#1x}R|1CDx$ed4)j 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 CTn#k< literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/usb-nano-wiring.pdf b/lib/ESPiLight/pilight/docs/source/images/usb-nano-wiring.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bad1776fdb4001aff026a5388804b1f86e846771 GIT binary patch literal 311057 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Ν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

        `Rd)`GFz5Rc{s;N0 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 SwE;sYH#ZJFy_kYH&i?~f!Hi@8 literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/usb-nano-wiring.svg b/lib/ESPiLight/pilight/docs/source/images/usb-nano-wiring.svg new file mode 100644 index 0000000..0923efe --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/images/usb-nano-wiring.svg @@ -0,0 +1,1925 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A7 + A6 + A5 + A4 + A3 + A2 + A1 + A0 + 3.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/images/yes.png b/lib/ESPiLight/pilight/docs/source/images/yes.png new file mode 100644 index 0000000000000000000000000000000000000000..61bd0bbc668802161a17c9da80ff6b48d574c981 GIT binary patch literal 3955 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 K8&*JEp8X$z@ECjm literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/index.rst b/lib/ESPiLight/pilight/docs/source/index.rst new file mode 100644 index 0000000..a5044b7 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/index.rst @@ -0,0 +1,88 @@ +:tocdepth: 5 + +Welcome to pilight's documentation! +=================================== + +.. raw:: latex + + \newpage + +Overview +-------- + +pilight is a free, open source, full fledged domotica solution that runs on a Raspberry Pi, Hummingboard, and BananaPi, but also on \*BSD, various Linux distributions (tested on Arch, Ubuntu, and Debian), Windows, and OpenWRT routers. pilight works with a great deal of devices and is frequency independent. Therefore, due to its modular set-up, it can control devices working at 315 MHz, 433 MHz, and 868 MHz, but only 433.92 MHz is currently supported. Support for other frequencies and/or devices is dependent on community input, because we as developers do not own them all. + +.. raw:: latex + + \newpage + +Features +-------- +The main features of pilight are: + +* `Open Source`_ +* `Open Hardware`_ +* `Free`_ +* `Fully Modular`_ +* `High Quality Code`_ +* `Integrated Webserver and webGUI`_ +* `Light-Weight`_ + +.. _Open Source: +.. rubric:: Open Source + +The pilight source code can be found on the internet at https://www.github.com/pilight/. pilight is largely dependent on community input so if you have any suggestions, improvements, or fixes, feel free to provide them. + +.. _Open Hardware: +.. rubric:: Open Hardware + +The source and schematics of all pilight hardware is open and free for everyone. This means that you can easily build the hardware pilight offers yourself. However, by buying the hardware from pilight, you also support the project. + +.. _Free: +.. rubric:: Free + +pilight is free as in free speech. It is licensed under the GPLv3 license. If you have any plans with our source code, please make it clear that you are not affiliated to pilight in any way. We do not want to end up in a situation were we have to give support for something we did not approve. + +.. _Fully Modular: +.. rubric:: Fully Modular + +pilight is modular in about every inch. Adding new protocols is very easy just like adding new hardware modules. The API allows users to develop new applications that interact with pilight. The community already developed phone apps, desktop apps, and various plug-ins for various other projects. + +.. _High Quality Code: +.. rubric:: High quality code + +Almost everything pilight does is also developed by pilight from the ground up. This means that the developers of pilight know what is going on in every part of the pilight code. Whenever additional functionality is needed, external libraries are carefully selected for their own code quality. As an example, pilight does not use OpenSSL but polarSSL (currently called mbed TLS). OpenSSL has a bad reputation in terms of code quality while polarSSL is far more robust. pilight developers also constantly audit their own code by using tools like valgrind or gdb. Memory leaks or other common issues are therefore 99% nonexisting in pilight. The pilight code quality also allows it to be ported easily to any platform as was proven with the Windows and OpenWRT ports. + +.. _Integrated Webserver and webGUI: +.. rubric:: Integrated webserver and webGUI + +pilight has an integrated webserver and serves an intergrated webGUI. This allows users to immediately start using pilight in all its capacity. The webGUI makes it easy to control devices or to see their states. Those who do not want to install the phone apps can just use their regular browser to access pilight. + +.. _Light-Weight: +.. rubric:: Light-Weight + +pilight is written in C. This means that it is very fast and does not use much resources. All plug-ins are compiled into pilight so the overhead of the plug-ins is also kept to a minimum. This is also one of the reasons pilight can run on low-power consumer products like OpenWRT routers. All pilight hardware such as the ATTiny filter and the Arduino Nano interface are also written in pure C. This again allows us to have control over every inch of code and to prevent any overhead from tools like the Arduino programming libraries. + +.. raw:: latex + + \newpage + +Sitemap +------- + +.. toctree:: + :maxdepth: 4 + :titlesonly: + + changelog + installation + configuration/index + protocols/index + eventing/index + adhoc_network + programs/index + electronics/index + faq + development/index + about_manual + diff --git a/lib/ESPiLight/pilight/docs/source/installation.rst b/lib/ESPiLight/pilight/docs/source/installation.rst new file mode 100644 index 0000000..3529fcc --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/installation.rst @@ -0,0 +1,190 @@ +Installation +============ + +* `Linux Debian Based`_ +* `Windows 7 and up`_ +* `OpenWRT Routers`_ + +Linux Debian Based +------------------ + +Install pilight by using the apt repository in Debian / Ubuntu based distributions. + +#. Login to your computer. +#. Make sure you are running as root. Run the following command and use your own password. + + .. code-block:: console + + pi@pilight:~# sudo su + Password: + +#. Add the apt repository to the apt sources list: + + .. code-block:: console + + pi@pilight:~# echo "deb http://apt.pilight.org/ stable main" > /etc/apt/sources.list.d/pilight.list + + If you want to install the nightly version of pilight then also add: + + .. code-block:: console + + root@pilight:~# echo "deb http://apt.pilight.org/ nightly main" >> /etc/apt/sources.list.d/pilight.list + +#. pilight uses a signed repository. This means packages get validated before installation. So, to safely download and install pilight packages the pilight key needs to be installed. + + .. code-block:: console + + root@pilight:~# wget -O - http://apt.pilight.org/pilight.key | apt-key add - + +#. Now update the apt package list: + + .. code-block:: console + + root@pilight:~# apt-get update + +#. And install pilight + + .. code-block:: console + + root@pilight:~# apt-get install pilight + +#. When no errors are shown, pilight will be installed and automatically started at boot time. To manually start pilight: + + .. code-block:: console + + root@pilight:~# service pilight start + +#. And to stop pilight: + + .. code-block:: console + + root@pilight:~# service pilight stop + +.. note:: + + pilight makes it easy to install previous version, because all stable versions and all nightly versions between two stable versions will remain available in the apt repository. + To see what versions are available, you can run the following command: + + .. code-block:: console + + root@pilight:~# apt-cache policy pilight + pilight: + Installed: 7.0.16-g233c268 + Candidate: 7.0.21-ga8b12ea + Version table: + 7.0.21-ga8b12ea 500 + 500 http://apt.pilight.org nightly/main armhf Packages + *** 7.0.16-g233c268 500 + 500 http://apt.pilight.org nightly/main armhf Packages + 7.0.9-gfbc2643 500 + 500 http://apt.pilight.org nightly/main armhf Packages + 7.0.8-g953bb85 500 + 500 http://apt.pilight.org nightly/main armhf Packages + 7.0 500 + 500 http://apt.pilight.org stable/main armhf Packages + 6.0 500 + 500 http://apt.pilight.org stable/main armhf Packages + 5.0 500 + 500 http://apt.pilight.org stable/main armhf Packages + 4.0 500 + 500 http://apt.pilight.org stable/main amd64 Package + + In this case, both the stable and the nightly apt repositories are enabled. If you want to install a specific version run the following command: + + .. code-block:: console + + root@pilight:~# apt-get install pilight=7.0.67-g960219e + +.. raw:: latex + + \newpage + +Windows 7 and up +---------------- + +#. Go to http://download.pilight.org. +#. Download the latest Windows executable called pilight-vX.0-win32.exe. Run it to install pilight. +#. By default pilight will install into to c:\\pilight\\. +#. A default configuration can also be found in that folder. +#. If you want to use the pilight USB nano you can use the pilight-usb-nano.hex found in the default folder. + +OpenWRT Routers +--------------- + +#. When using OpenWRT you are assumed also to know how to login to your router with SSH. +#. Go to http://download.pilight.org. +#. Download the latest pilight OpenWRT compilation called pilight-Atheros-AR9132-vX.0.tar.gz. +#. Unpack this file like this: + + .. code-block:: console + + root@OpenWrt:~# tar -zxvf pilight-Atheros-AR9132-vX.0.tar.gz -C / + +#. The OpenWRT package only contains pilight-daemon to save space. +#. A default configuration is put into /etc/pilight/config.json. + +Manually Compiled Version +------------------------- + +.. warning:: + + We try to provide as many options as possible for you to keep up-to-date with the latest developments. Compiling C software requires some level of expertise, which we cannot and will not provide. This means that **no support is given** if any issues occur with manually compiling pilight. + +Manually compiling pilight is also possible. Use this method is you are not using a Debian-based or a \*BSD based operating system. + +#. Login to your computer. +#. Make sure you've configured the pilight stable apt repository, because some required dependencies are not available elsewhere. +#. Make sure you are running as root. Run the following command and use your own password. + + .. code-block:: console + + pi@pilight:~# sudo su + Password: + +#. Install all packages needed for manually compiling pilight. The best way to do this depends on your operating system. The packages needed for Debian are: + + #. build-essential + #. cmake + #. git + #. dialog + #. libwiringx-dev + #. libwiringx + #. libpcap0.8-dev + #. libpcap0.8 + #. libmbedtls-dev + #. libmbedx509-0 + #. libmbedcrypto0 + #. libmbedtls10 + #. liblua5.2 + #. liblua5.2-dev + +#. Then download the pilight source code from the pilight GitHub: + + .. code-block:: console + + root@pilight:~# git clone --depth 5 -b [branch] https://www.github.com/pilight/pilight.git + root@pilight:~# cd pilight + + +#. Replace the [branch] with either **master** for the latest stable version. This version is exactly the same as the stable version available through the apt repository. Or use **development** for the very latest developmental build. This development version of pilight is also automatically generated each night. You can download it from the pilight nightly repository. +#. pilight can be compiled with various built-in features which can be included or excluded. This is done through a menu driven program. This program will also automatically compile and install pilight: + + .. code-block:: console + + root@pilight:~/pilight# chmod +x setup.sh + root@pilight:~/pilight# ./setup.sh + + .. image:: images/installation.png + +#. When you are thrown back into the command prompt without error(s), pilight has been installed successfully. It will also install a default configuration in /etc/pilight/config.json. +#. Make sure to run the following command after installation: + + .. code-block:: console + + root@pilight:~/pilight# ldconfig + +#. pilight can now be started with: + + .. code-block:: console + + root@pilight:~/pilight# service pilight start diff --git a/lib/ESPiLight/pilight/docs/source/programs/control.rst b/lib/ESPiLight/pilight/docs/source/programs/control.rst new file mode 100644 index 0000000..a825f97 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/programs/control.rst @@ -0,0 +1,83 @@ +=============== +pilight-control +=============== + +Control pilight devices +----------------------- + +:Date: 2017 +:Copyright: MPLv2 +:Version: 7.0 +:Manual section: 1 +:Manual group: pilight 7.0 man pages + +SYNOPSIS +======== + +| ``pilight-control`` --device DEVICE --state STATE +| ``pilight-control`` [OPTION]... --device DEVICE --values VALUES +| ``pilight-control`` [--server SERVER] [ --port PORT] [OPTION]... --device DEVICE + +DESCRIPTION +=========== + +``pilight-control`` is a tool to control a device configured in a pilight daemon configuration. It supports switching the state and/or modifying other values (such as dimlevel, temperature, or humidity) of the device. + +OPTIONS +======= + +Mandatory arguments to long options are mandatory for short options too. + +| +| ``-H``, ``--help`` +| Print allowed options and exit +| +| ``-V``, ``--version`` +| Print version information and exit +| +| ``-S``, ``--server=x.x.x.x`` +| Connect to a pilight daemon at this address. Requires -P +| +| ``-P``, ``--port=xxxx`` +| Connect to a pilight daemon at this port. Requires -S +| +| ``-C``, ``--config=PATH_TO_CONFIG`` +| Path to configuration file +| +| ``-d``, ``--device=DEVICE_NAME`` +| Name of the configured device to be controlled +| +| ``-s``, ``--state=STATE`` +| State to switch DEVICE to +| +| ``-v``, ``--values=VALUES`` +| Supply other values for DEVICE, such as dimlevel=10 + +BUGS +==== + +Please report all bugs on GitHub . + +AUTHOR +====== + +Curlymo and contributors. + +This man page was originally written by pilino1234 . + +WWW +=== + +https://www.pilight.org/ + +SEE ALSO +======== + +| ``pilight-daemon`` +| ``pilight-debug`` +| ``pilight-flash`` +| ``pilight-raw`` +| ``pilight-receive`` +| ``pilight-send`` +| ``pilight-sha256`` +| ``pilight-uuid`` diff --git a/lib/ESPiLight/pilight/docs/source/programs/daemon.rst b/lib/ESPiLight/pilight/docs/source/programs/daemon.rst new file mode 100644 index 0000000..da47a7a --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/programs/daemon.rst @@ -0,0 +1,98 @@ +============== +pilight-daemon +============== + +The pilight daemon +------------------ + +:Date: 2017 +:Copyright: MPLv2 +:Version: 7.0 +:Manual section: 1 +:Manual group: pilight 7.0 man pages + +SYNOPSIS +======== + +| ``pilight-daemon`` +| ``pilight-daemon`` [OPTION]... +| ``pilight-daemon`` [--server SERVER] [ --port PORT] [OPTION]... + +DESCRIPTION +=========== + +``pilight-daemon`` is the main software of the pilight project. It is responsible for handling and interpreting received signals, as well as generating signals to communicate with and control various devices. + +A configuration file is required. By default, ``/etc/pilight/config.json`` is used. Configuration files are written in the JSON format. + +Consult the pilight manual for details on how to configure and use pilight. + +By default, the pilight daemon hosts a webgui which allows controlling devices through a clickable interface in a webbrowser. The pilight daemon runs a socket server and provides a REST API to interface with the pilight daemon. + +OPTIONS +======= + +Mandatory arguments to long options are mandatory for short options too. + +| +| ``-H``, ``--help`` +| Print allowed options and exit +| +| ``-V``, ``--version`` +| Print version information and exit +| +| ``-C``, ``--config=PATH_TO_CONFIG`` +| Specify to use configuration file at PATH rather than standard configuration +| +| ``-S``, ``--server=x.x.x.x`` +| Connect to a pilight daemon at this address. Requires -P +| +| ``-P``, ``--port=xxxx`` +| Connect to a pilight daemon at this port. Requires -S +| +| ``-F``, ``--foreground`` +| Do not daemonize +| +| ``-D``, ``--debug`` +| Do not daemonize and print more debug information + +Debugging options: + +| +| ``--stacktracer`` +| Show internal function calls +| +| ``--threadprofiler`` +| Show per thread CPU usage +| +| ``--debuglevel`` +| Show additional development information + +BUGS +==== + +Please report all bugs on GitHub . + +AUTHOR +====== + +Curlymo and contributors. + +This man page was originally written by pilino1234 . + +WWW +=== + +https://www.pilight.org/ + +SEE ALSO +======== + +| ``pilight-control`` +| ``pilight-debug`` +| ``pilight-flash`` +| ``pilight-raw`` +| ``pilight-receive`` +| ``pilight-send`` +| ``pilight-sha256`` +| ``pilight-uuid`` diff --git a/lib/ESPiLight/pilight/docs/source/programs/debug.rst b/lib/ESPiLight/pilight/docs/source/programs/debug.rst new file mode 100644 index 0000000..754bed2 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/programs/debug.rst @@ -0,0 +1,71 @@ +============= +pilight-debug +============= + +Decode incoming raw streams into logical pulsetrains +---------------------------------------------------- + +:Date: 2017 +:Copyright: MPLv2 +:Version: 7.0 +:Manual section: 1 +:Manual group: pilight 7.0 man pages + +SYNOPSIS +======== + +| ``pilight-debug`` +| ``pilight-debug`` [OPTION] + +DESCRIPTION +=========== + +``pilight-debug`` is a tool to decode incoming raw streams into logical pulsetrains. It also prints certain calculated parameters of the caught pulsetrain. + +Prints data to STDOUT until interrupted with ^C. + +This tool requires root privileges. + +OPTIONS +======= + +Mandatory arguments to long options are mandatory for short options too. + +| +| ``-H``, ``--help`` +| Print allowed options and exit +| +| ``-V``, ``--version`` +| Print version information and exit +| +| ``-C``, ``--config=PATH_TO_CONFIG`` +| Path to configuration file + +BUGS +==== + +Please report all bugs on GitHub . + +AUTHOR +====== + +Curlymo and contributors. + +This man page was originally written by pilino1234 . + +WWW +=== + +https://www.pilight.org/ + +SEE ALSO +======== + +| ``pilight-control`` +| ``pilight-daemon`` +| ``pilight-flash`` +| ``pilight-raw`` +| ``pilight-receive`` +| ``pilight-send`` +| ``pilight-sha256`` +| ``pilight-uuid`` diff --git a/lib/ESPiLight/pilight/docs/source/programs/flash.rst b/lib/ESPiLight/pilight/docs/source/programs/flash.rst new file mode 100644 index 0000000..2e9dad4 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/programs/flash.rst @@ -0,0 +1,79 @@ +============= +pilight-flash +============= + +Flash hardware with pilight firmware +------------------------------------ + +:Date: 2017 +:Copyright: MPLv2 +:Version: 7.0 +:Manual section: 1 +:Manual group: pilight 7.0 man pages + +SYNOPSIS +======== + +| ``pilight-flash`` --file FIRMWARE_FILE +| ``pilight-flash`` [OPTION]... --file FIRMWARE_FILE + +DESCRIPTION +=========== + +``pilight-flash`` is a tool to flash pilight firmware to ATMel chips (such as the ATTiny and ATMega). + +The pilight ATMel firmware pre-filters streams and prevents noise from reaching the pilight daemon. This +lowers the CPU usage of the pilight daemon greatly, because the pilight daemon will not continuously +attempt to interpret noise as valid protocols. Currently supported chips are the ATTiny25, ATTiny45, +ATTiny85, and ATMega328P. + +Besides acting as a pre-filter, the firmware also allows using pilight with senders and receivers on non +GPIO-capable hardware (such as most desktops, servers, etc.) The flashed ATMega chip is connected via USB, +and the sender and receiver are wired to the GPIO pins on the chip. Consult the pilight manual for wiring schematics. + +OPTIONS +======= + +Mandatory arguments to long options are mandatory for short options too. + +| +| ``-H``, ``--help`` +| Print allowed options and exit +| +| ``-V``, ``--version`` +| Print version information and exit +| +| ``-C``, ``--config=PATH_TO_CONFIG`` +| Path to configuration file +| +| ``-f``, ``--file=PATH_TO_FIRMWARE`` +| Firmware file to flashed + +BUGS +==== + +Please report all bugs on GitHub . + +AUTHOR +====== + +Curlymo and contributors. + +This man page was originally written by pilino1234 . + +WWW +=== + +https://www.pilight.org/ + +SEE ALSO +======== + +| ``pilight-control`` +| ``pilight-daemon`` +| ``pilight-debug`` +| ``pilight-raw`` +| ``pilight-receive`` +| ``pilight-send`` +| ``pilight-sha256`` +| ``pilight-uuid`` diff --git a/lib/ESPiLight/pilight/docs/source/programs/index.rst b/lib/ESPiLight/pilight/docs/source/programs/index.rst new file mode 100644 index 0000000..03c5661 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/programs/index.rst @@ -0,0 +1,15 @@ +Programs +======== + +.. toctree:: + :maxdepth: 1 + + control + daemon + debug + flash + raw + receive + send + sha256 + uuid \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/programs/raw.rst b/lib/ESPiLight/pilight/docs/source/programs/raw.rst new file mode 100644 index 0000000..df7903a --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/programs/raw.rst @@ -0,0 +1,74 @@ +=========== +pilight-raw +=========== + +Print received raw streams +-------------------------- + +:Date: 2017 +:Copyright: MPLv2 +:Version: 7.0 +:Manual section: 1 +:Manual group: pilight 7.0 man pages + +SYNOPSIS +======== + +| ``pilight-raw`` +| ``pilight-raw`` [OPTION]... + +DESCRIPTION +=========== + +``pilight-raw`` is a tool to print raw streams as they are picked up by the receiver hardware. + +Prints data to STDOUT until interrupted with ^C. + +This tool requires root privileges. + +OPTIONS +======= + +Mandatory arguments to long options are mandatory for short options too. + +| +| ``-H``, ``--help`` +| Print allowed options and exit +| +| ``-V``, ``--version`` +| Print version information and exit +| +| ``-C``, ``--config=PATH_TO_CONFIG`` +| Path to configuration file +| +| ``-L``, ``--linefeed`` +| Structure raw printout with newlines between (probably) separate pulsetrains. + +BUGS +==== + +Please report all bugs on GitHub . + +AUTHOR +====== + +Curlymo and contributors. + +This man page was originally written by pilino1234 . + +WWW +=== + +https://www.pilight.org/ + +SEE ALSO +======== + +| ``pilight-control`` +| ``pilight-daemon`` +| ``pilight-debug`` +| ``pilight-flash`` +| ``pilight-receive`` +| ``pilight-send`` +| ``pilight-sha256`` +| ``pilight-uuid`` diff --git a/lib/ESPiLight/pilight/docs/source/programs/receive.rst b/lib/ESPiLight/pilight/docs/source/programs/receive.rst new file mode 100644 index 0000000..1cc6941 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/programs/receive.rst @@ -0,0 +1,84 @@ +=============== +pilight-receive +=============== + +Show datagrams received and transmitted by pilight +-------------------------------------------------- + +:Date: 2017 +:Copyright: MPLv2 +:Version: 7.0 +:Manual section: 1 +:Manual group: pilight 7.0 man pages + +SYNOPSIS +======== + +| ``pilight-receive`` +| ``pilight-receive`` [OPTION]... +| ``pilight-receive`` [--server SERVER] [ --port PORT] [OPTION]... --device DEVICE + +DESCRIPTION +=========== + +``pilight-receive`` is a tool to show all data that is sent and received by a pilight daemon instance or a pilight adhoc network. All data is shown as-is in JSON format. + +OPTIONS +======= + +Mandatory arguments to long options are mandatory for short options too. + +| +| ``-H``, ``--help`` +| Print allowed options and exit +| +| ``-V``, ``--version`` +| Print version information and exit +| +| ``-S``, ``--server=x.x.x.x`` +| Connect to a pilight daemon at this address. Requires -P +| +| ``-P``, ``--port=xxxx`` +| Connect to a pilight daemon at this port. Requires -S +| +| ``-s``, ``--stats`` +| show CPU and RAM statistics in output +| +| ``-F``, ``--filter=PROTOCOL(S)`` +| Specify protocols that should not be printed in the +| output stream. This is useful when trying to find +| IDs of devices such as weather stations or remote +| controls, but certain protocols are spamming the +| output. For example, datetime protocol data is +| transmitted every second, and is likely to displace +| useful information in the output stream. It can +| then be hidden with --filter=datetime + +BUGS +==== + +Please report all bugs on GitHub . + +AUTHOR +====== + +Curlymo and contributors. + +This man page was originally written by pilino1234 . + +WWW +=== + +https://www.pilight.org/ + +SEE ALSO +======== + +| ``pilight-control`` +| ``pilight-daemon`` +| ``pilight-debug`` +| ``pilight-flash`` +| ``pilight-raw`` +| ``pilight-send`` +| ``pilight-sha256`` +| ``pilight-uuid`` diff --git a/lib/ESPiLight/pilight/docs/source/programs/send.rst b/lib/ESPiLight/pilight/docs/source/programs/send.rst new file mode 100644 index 0000000..25ecca9 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/programs/send.rst @@ -0,0 +1,160 @@ +============ +pilight-send +============ + +Send data to a pilight daemon +----------------------------- + +:Date: 2017 +:Copyright: MPLv2 +:Version: 7.0 +:Manual section: 1 +:Manual group: pilight 7.0 man pages + +SYNOPSIS +======== + +| ``pilight-send`` --protocol PROTOCOL [OPTION]... +| ``pilight-send`` [--server SERVER] [ --port PORT] --protocol PROTOCOL [OPTION]... + +DESCRIPTION +=========== + +``pilight-send`` is a tool to send data to a pilight daemon instance. It is a more versatile tool than ``pilight-control``, because it does not require the device to be previously configured. + +It can be used to send signals for any pilight protocol that supports sending. + +OPTIONS +======= + +Mandatory arguments to long options are mandatory for short options too. + +| +| ``-H``, ``--help`` +| Print allowed options and exit +| +| ``-V``, ``--version`` +| Print version information and exit +| +| ``-p``, ``--protocol=PROTOCOL`` +| Protocol to be sent +| +| ``-S``, ``--server=x.x.x.x`` +| Connect to a pilight daemon at this address. Requires -P +| +| ``-P``, ``--port=xxxx`` +| Connect to a pilight daemon at this port. Requires -S +| +| ``-C``, ``--config=PATH_TO_CONFIG`` +| Path to configuration file +| +| ``-U``, ``--uuid=UUID`` +| UUID to identify as when connecting to the pilight daemon + +Further options are required, depending on the chosen protocol. Use ``pilight-send`` ``-p`` PROTOCOL ``--help`` to find which options are required for the protocol. Some long options differ between protocols. Protocol options include: + +| +| ``-a``, ``--all``, ``--id=ALL`` +| Send command to all devices with the same ID +| +| ``-a``, ``--api=API_KEY`` +| Update a Weather Underground entry with the API code +| +| ``-b``, ``--battery=BATTERY`` +| Send battery state (0 = low, 1 = normal) for weather +| stations +| +| ``-c``, ``--code=RAW_CODE`` +| Raw code to be transmitted, as emitted by +| ``pilight-debug`` +| +| ``-c``, ``--color=COLOR`` +| Set a label device to this text color +| +| ``-c``, ``--country=COUNTRY`` +| Update a Weather Underground entry with this country +| +| ``-d``, ``--dimlevel=DIMLEVEL`` +| Set a dimmer to a specific dimlevel +| +| ``-f``, ``--off``, ``--down``, ``--stopped`` +| Send an 'off' (for switches) or 'down' (for screens) or +| 'stopped' (for programs) signal +| +| ``-g``, ``--gpio=GPIO`` +| GPIO pin number a device (for example a relay) is +| connected to. +| +| ``-h``, ``--humidity=HUMIDITY`` +| Send humidity value for a weather station +| +| ``-i``, ``--id=ID`` +| Send a code with this id +| +| ``-l``, ``--label=LABEL`` +| Set text of a label device to this text +| +| ``-l``, ``--learn`` +| Send multiple streams when a device is in learning mode +| to emulate the learning mode of a remote control. +| +| ``-l``, ``--location=LOCATION`` +| Update a Weather Underground entry with this location +| +| ``-n``, ``--name=NAME`` +| Name of the program to be controlled +| +| ``-n``, ``--num`` +| Use random (super)code sequence number 0..3 (7) +| +| ``-s``, ``--systemcode=SYSTEMCODE`` +| Send a code with this systemcode +| +| ``-s``, ``--super`` +| Send to all devices, regardless of id +| +| ``-t``, ``--on``, ``--up``, ``--running`` +| Send an 'on' (for switches) or 'up' (for screens) or +| 'running' (for programs) signal. +| +| ``-t``, ``--temperature=TEMPERATURE`` +| Send temperature value for a weather station +| +| ``-u``, ``--unit=UNITCODE``, +| ``--unitcode=UNITCODE``, +| ``--programcode=PROGRAMCODE`` +| Send a code this unitcode. Note that some protocols use +| long option ``--unit`` while others use long option +| ``--unitcode`` or long option ``--programcode``. +| +| ``-u``, ``--update`` +| Update a defined Weather Underground entry + +BUGS +==== + +Please report all bugs on GitHub . + +AUTHOR +====== + +Curlymo and contributors. + +This man page was originally written by pilino1234 . + +WWW +=== + +https://www.pilight.org/ + +SEE ALSO +======== + +| ``pilight-control`` +| ``pilight-daemon`` +| ``pilight-debug`` +| ``pilight-flash`` +| ``pilight-raw`` +| ``pilight-receive`` +| ``pilight-sha256`` +| ``pilight-uuid`` diff --git a/lib/ESPiLight/pilight/docs/source/programs/sha256.rst b/lib/ESPiLight/pilight/docs/source/programs/sha256.rst new file mode 100644 index 0000000..cd7b7f4 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/programs/sha256.rst @@ -0,0 +1,70 @@ +============== +pilight-sha256 +============== + +Generate a pilight SHA-256 hash for a password +---------------------------------------------- + +:Date: 2017 +:Copyright: MPLv2 +:Version: 7.0 +:Manual section: 1 +:Manual group: pilight 7.0 man pages + +SYNOPSIS +======== + +| ``pilight-send`` --password PASSWORD + +DESCRIPTION +=========== + +``pilight-sha256`` is a tool to generate a SHA-256 hash for a webgui password to avoid storing cleartext passwords in configuration files. + +The hash can be added to config.json under "settings" - "webserver-password". Consult the pilight manual for configuration details. + +Prints the hashed PASSWORD to STDOUT. + +OPTIONS +======= + +Mandatory arguments to long options are mandatory for short options too. + +| +| ``-H``, ``--help`` +| Print allowed options and exit +| +| ``-V``, ``--version`` +| Print version information and exit +| +| ``-p``, ``--password=PASSWORD`` +| Password to hash + +BUGS +==== + +Please report all bugs on GitHub . + +AUTHOR +====== + +Curlymo and contributors. + +This man page was originally written by pilino1234 . + +WWW +=== + +https://www.pilight.org/ + +SEE ALSO +======== + +| ``pilight-control`` +| ``pilight-daemon`` +| ``pilight-debug`` +| ``pilight-flash`` +| ``pilight-raw`` +| ``pilight-receive`` +| ``pilight-send`` +| ``pilight-uuid`` diff --git a/lib/ESPiLight/pilight/docs/source/programs/uuid.rst b/lib/ESPiLight/pilight/docs/source/programs/uuid.rst new file mode 100644 index 0000000..bc35a53 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/programs/uuid.rst @@ -0,0 +1,65 @@ +============ +pilight-uuid +============ + +Show pilight adhoc node UUID +---------------------------- + +:Date: 2017 +:Copyright: MPLv2 +:Version: 7.0 +:Manual section: 1 +:Manual group: pilight 7.0 man pages + +SYNOPSIS +======== + +| ``pilight-uuid`` + +DESCRIPTION +=========== + +``pilight-uuid`` is a tool to show the UUID for a pilight adhoc network node in order to identify as a unique node. This prevents multiple nodes from interfering with each other when sending and receiving. + +Prints the UUID to STDOUT. + +OPTIONS +======= + +Mandatory arguments to long options are mandatory for short options too. + +| +| ``-H``, ``--help`` +| Print allowed options and exit +| +| ``-V``, ``--version`` +| Print version information and exit + +BUGS +==== + +Please report all bugs on GitHub . + +AUTHOR +====== + +Curlymo and contributors. + +This man page was originally written by pilino1234 . + +WWW +=== + +https://www.pilight.org/ + +SEE ALSO +======== + +| ``pilight-control`` +| ``pilight-daemon`` +| ``pilight-debug`` +| ``pilight-flash`` +| ``pilight-raw`` +| ``pilight-receive`` +| ``pilight-send`` +| ``pilight-sha256`` diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/alarm/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/alarm/index.rst new file mode 100644 index 0000000..298b4e7 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/alarm/index.rst @@ -0,0 +1,7 @@ +Alarm +===== + +.. toctree:: + :maxdepth: 1 + + secudo \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/alarm/secudo.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/alarm/secudo.rst new file mode 100644 index 0000000..173ba5d --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/alarm/secudo.rst @@ -0,0 +1,117 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Secudo +====== + +.. versionadded:: 8.0 + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++-----------------------+----------------+ +| **Brand** | **Protocol** | ++-----------------------+----------------+ +| Secudo | secudo | ++-----------------------+----------------+ +| FlammEx | secudo | ++-----------------------+----------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "alarm": { + "protocol": [ "secudo" ], + "id": [{ + "id": 493 + }], + "state": "alarm" + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 1023 | ++------------------+-----------------+ +| state | alarm | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +*None* + +.. rubric:: Protocol + +This protocol sends 26 pulses like this: + +.. code-block:: console + + 314 314 628 628 314 314 628 314 628 628 314 314 628 314 628 314 628 314 628 628 314 628 314 314 628 10676 + +The first pulse is the ``header`` and the last pulse is the ``footer``. +These are meant to identify the pulses as genuine. +We don't use them for further processing. +The next step is to transform the remaining pulses into 12 groups of two pulses (and thereby dropping the ``header`` and ``footer`` pulses): + +.. code-block:: guess + + 314 628 + 628 314 + 314 628 + 314 628 + 628 314 + 314 628 + 314 628 + 314 628 + 314 628 + 628 314 + 628 314 + 314 628 + +If we now look carefully at these groups you can distinguish two types of groups: + +#. 314 628 +#. 628 314 + +So the first group is defined by a high 2nd and the second group by a high 1st pulse. +So we take either of these two pulses to define a 0 or a 1. +In this case we say a high 2nd pulse means a 1 and a low 2nd pulse means a 0. +We then get the following output: + +.. code-block:: guess + + 101101111001 + +The first 10 bits correspond to the setting of the ten dip switches inside the smoke sensor. +If a dip switch is ON, this corresponds to 1 and 0 otherwise. +The meaning of the two last bits is unknown. +When reversing the first 10 bits because the first bits are least signifant we get the smoke sensors ID as binary number + +.. code-block:: guess + + 0111101101 + +which is 493 as decimal number. +This means that the 2nd, 5th and 10th dip switch is OFF and all others are ON. diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/elro.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/elro.rst new file mode 100644 index 0000000..dbff04c --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/elro.rst @@ -0,0 +1,142 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Elro HE Contact +=============== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+------------------+ +| **Brand** | **Protocol** | ++------------------+------------------+ +| Elro 800 Series | elro_800_contact | ++------------------+------------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "contact": { + "protocol": [ "elro_800_contact" ], + "id": [{ + "systemcode": 31, + "unitcode": 0 + }], + "state": "closed" + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 31 | ++------------------+-----------------+ +| code | 0 - 31 | ++------------------+-----------------+ +| state | opened / closed | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +*None* + +.. rubric:: Protocol + +This protocol sends 148 pulses like this + +.. code-block:: guess + + 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 960 320 320 960 960 320 320 960 960 320 320 960 960 320 320 960 320 960 320 960 960 320 320 9920 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +.. code-block:: guess + + 320 960 320 960 + 320 960 320 960 + 320 960 320 960 + 320 960 320 960 + 320 960 320 960 + 320 960 320 960 + 320 960 960 320 + 320 960 960 320 + 320 960 960 320 + 320 960 960 320 + 320 960 320 960 + 320 960 960 320 + 320 9920 + +If we now look at carefully at these groups you can distinguish two types of groups: + +#. 320 960 320 960 +#. 320 960 960 320 + +So the first group is defined by a high 4th pulse and the second group has a low 4th pulse. In this case we say a high 4th pulse means a 1 and a low 4th pulse means a 0. We then get the following output: + +.. code-block:: guess + + 11111 10000 1 0 + +Each (group) of numbers has a specific meaning: + +- SystemCode: 0 till 5 +- UnitCode: 6 till 10 +- State: 11 +- Check: 12 (inverse state) + +.. code-block:: guess + + 11111 10000 1 0 + +- The ``SystemCode`` is defined as a binary number +- The ``UnitCode`` is defined as a binary number +- The ``State`` defines whether a devices needs to be turned On or Off +- The ``Check`` defines whether a devices needs to be turned On or Off (but is inverse) + +So this code represents: + +- SystemCode: 31 +- UnitCode: 1 +- State: Opened +- Check: Opened (inverse state) + +Another example: + +- SystemCode: 0 +- UnitCode: 4 +- State: Closed +- Check: Closed (inverse state) + +.. code-block:: guess + + 00000 00100 0 1 + +Furthermore the protocol filters out false positives by checking if: + +- Every 1st bit of the first 12 groups of 4 bits is always LOW (0) +- 2nd bit of the first 12 groups of 4 bits is always HIGH (1) +- 3rd and 4th bit of the first 12 groups of 4 bits are different (NOT EQUAL) +- Bits 49 and 50 are LOW (0) and HIGH (1) respectively (fixed footer) + +This makes the protocol more accurate because it will respond less when arctech_old commands are sent. \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/ev1527.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/ev1527.rst new file mode 100644 index 0000000..cf6693e --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/ev1527.rst @@ -0,0 +1,129 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +EV1527 Contact +============== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+--------------+ +| **Brand** | **Protocol** | ++------------------+--------------+ +| EV1527 | ev1527 | ++------------------+--------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "contact": { + "protocol": [ "ev1527" ], + "id": [{ + "unitcode": 0 + }], + "state": "closed" + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 31 | ++------------------+-----------------+ +| code | 0 - 31 | ++------------------+-----------------+ +| state | opened / closed | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +*None* + +.. rubric:: Protocol + +This protocol sends 50 pulses like this + +.. code-block:: guess + + 253 759 759 253 759 253 253 759 253 759 253 759 253 759 253 759 253 759 759 253 253 759 253 759 759 253 759 253 759 253 253 759 253 759 759 253 253 759 759 253 253 759 253 759 759 253 253 8602 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +The first six pulses are the address bits, followed by upto another 6 Address/Data Bits. Address Bits can have three states: 0, 1, F (tri-state). Data Bits have only two states: 0 or 1. + +.. code-block:: guess + + 253 759 + 759 253 + 759 253 + 253 759 + 253 759 + 253 759 + 253 759 + 253 759 + 253 759 + 759 253 + 253 759 + 253 759 + 759 253 + 759 253 + 759 253 + 253 759 + 253 759 + 759 253 + 253 759 + 759 253 + 253 759 + 253 759 + 759 253 + +If we now take a careful look at these groups you can distinguish three types of groups: + +#. ``253 759`` +#. ``759 253`` + +So the first group is defined by a high second pulse, the second group has a low second pulse. We then get the following output: + +.. code-block:: guess + + 10001111110110001101 0110 + +Each (group) of numbers has a specific meaning: + +- UnitCode: 0 till 20 +- State: 20 + +Bits 21-24 are not used. + +.. code-block:: guess + + 10001111110110001101 0 + +- The ``UnitCode`` is defined as a binary number +- The ``State`` defines whether a sensor state is opened or closed + +So this code represents: + +- UnitCode: 589197 +- State: opened diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/index.rst new file mode 100644 index 0000000..4c5af59 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/index.rst @@ -0,0 +1,10 @@ +Contact +======= + +.. toctree:: + :maxdepth: 1 + + kaku + elro + sc2262 + ev1527 \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/kaku.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/kaku.rst new file mode 100644 index 0000000..d2bb85d --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/kaku.rst @@ -0,0 +1,147 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +KlikAanKlikUit +============== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+--------------+ +| **Brand** | **Protocol** | ++------------------+--------------+ +| KlikAanKlikUit | kaku_contact | ++------------------+--------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "contact": { + "protocol": [ "kaku_contact" ], + "id": [{ + "id": 100, + "unit": 0 + }], + "state": "closed" + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 67108863 | ++------------------+-----------------+ +| code | 0 - 15 | ++------------------+-----------------+ +| state | opened / closed | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +*None* + +.. rubric:: Protocol + +This protocol sends 148 pulses like this + +.. code-block:: guess + + 294 2646 294 294 294 1176 294 294 294 1176 294 1176 294 294 294 294 294 1176 294 1176 294 294 294 294 294 1176 294 1176 294 294 294 1176 294 294 294 1176 294 294 294 294 294 1176 294 1176 294 294 294 1176 294 294 294 294 294 1176 294 294 294 1176 294 1176 294 294 294 294 294 1176 294 294 294 1176 294 1176 294 294 294 294 294 1176 294 294 294 1176 294 294 294 1176 294 1176 294 294 294 294 294 1176 294 294 294 1176 294 1176 294 294 294 294 294 1176 294 294 294 1176 294 1176 294 294 294 1176 294 294 294 294 294 1176 294 294 294 1176 294 1176 294 294 294 294 294 1176 294 1176 294 294 294 1176 294 294 294 1176 294 294 294 9996 + +The first 2 pulses are the ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine. We don't use them for further processing. The next step is to transform this output into 36 groups of 4 pulses (and thereby dropping the ``header`` and ``footer`` pulses). + +.. code-block:: guess + + 294 294 294 1176 + 294 294 294 1176 + 294 1176 294 294 + 294 294 294 1176 + 294 1176 294 294 + 294 294 294 1176 + 294 1176 294 294 + 294 1176 294 294 + 294 1176 294 294 + 294 294 294 1176 + 294 1176 294 294 + 294 1176 294 294 + 294 294 294 1176 + 294 294 294 1176 + 294 1176 294 294 + 294 294 294 1176 + 294 294 294 1176 + 294 1176 294 294 + 294 294 294 1176 + 294 294 294 1176 + 294 294 294 1176 + 294 1176 294 294 + 294 294 294 1176 + 294 294 294 1176 + 294 1176 294 294 + 294 294 294 1176 + 294 294 294 1176 + 294 1176 294 294 + 294 1176 294 294 + 294 294 294 1176 + 294 294 294 1176 + 294 1176 294 294 + 294 294 294 1176 + 294 1176 294 294 + 294 1176 294 294 + 294 1176 294 294 + +If we now look at carefully at these groups you can distinguish two types of groups: + +#. 294 1176 294 294 +#. 294 294 294 1176 + +So the first group is defined by a high 2nd and the second group has a high 4th pulse. So we take either of these two pulses to define a 0 or a 1. In this case we say a high 2nd pulse means a 1 and a low 2nd pulse means a 0. We then get the following output: + +.. code-block:: guess + + 001010111011001001000100100110010111 + +Each (group) of numbers has a specific meaning: + +- ID: 0 till 25 +- All: 26 +- State: 27 +- Unit: 28 till 31 +- Unknown: 32 till 35 + +.. code-block:: guess + + 00101011101100100100010010 0 1 1001 0111 + +- The ``ID`` is defined as a binary number +- The ``All`` tells us if a code was meant for all devices with the same ID +- The ``State`` defines whether a devices is opened or closed +- The ``Unit`` is also defined as a binary number +- The ``Unknown`` is also defined as a binary number(bits are missing in the closed state) + +So this code represents: + +- ID: 11454738 +- All: Single +- State: Opened +- Unit: 9 diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/sc2262.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/sc2262.rst new file mode 100644 index 0000000..10573ff --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/contact/sc2262.rst @@ -0,0 +1,158 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +SC2262 Contact +============== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+--------------+ +| **Brand** | **Protocol** | ++------------------+--------------+ +| SC2262 | sc2262 | ++------------------+--------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "contact": { + "protocol": [ "sc2262" ], + "id": [{ + "systemcode": 31, + "unitcode": 0 + }], + "state": "closed" + } + } + } + + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 31 | ++------------------+-----------------+ +| code | 0 - 31 | ++------------------+-----------------+ +| state | opened / closed | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +*None* + +.. rubric:: Protocol + +This protocol sends 50 pulses like this + +.. code-block:: guess + + 432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1728 1296 432 432 1296 432 1296 432 1296 1296 432 1296 432 1296 432 1296 432 1296 432 432 13392 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +The first six pulses are the address bits, followed by upto another 6 Address/Data Bits. Address Bits can have three states: 0, 1, F (tri-state). Data Bits have only two states: 0 or 1. + +.. code-block:: guess + + 432 1296 1296 432 + 432 1296 1296 432 + 432 1296 1296 432 + 432 1296 1296 432 + 432 1296 1296 432 + 432 1296 1296 432 + 432 1296 1296 432 + 432 1728 1296 432 + 432 1296 432 1296 + 432 1296 1296 432 + 1296 432 1296 432 + 1296 432 1296 432 + 432 14688 + +If we now take a careful look at these groups you can distinguish three types of groups: + +#. ``432 1296 432 1296`` - Logical Zero +#. ``1296 432 1296 432`` - Logical One +#. ``432 1296 1296 432`` - Logical Tri-State + + +.. code-block:: guess + + FFFFFF FF0F11 + +Each (group) of numbers has a specific meaning: + +- SystemCode: 0 till 5 +- UnitCode: 6 till 10 +- State: 11 + +Depending on the device the Unit Code my be shorter in order to provide more bits for state / data value conditions. + +.. code-block:: guess + + FFFFFF FF0F11 + +- The SystemCode is defined as a binary number +- The UnitCode is defined as a binary number +- The State defines whether a devices state is considered to be opened or closed + +So this code represents: + +- SystemCode: 0 +- UnitCode: 2 +- State: Closed + +.. code-block:: json + + { + "devices": { + "window": { + "protocol": [ "sc2262" ], + "id": [{ + "systemcode": 0, + "unitcode": 8 + }], + "state": "closed" + } + }, + "gui": { + "window": { + "name": "Bedroom", + "group": [ "Windows" ], + "media": [ "all" ] + } + } + } + +This code sets the state to opened: + +.. code-block:: console + + pilight-send -p raw -c "432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1728 1296 432 432 1296 432 1296 432 1296 1296 432 1296 432 1296 432 1296 432 1296 432 432 14680" + +This code sets the state to closed: + +.. code-block:: console + + pilight-send -p raw -c "432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1296 1296 432 432 1728 1296 432 432 1296 432 1296 432 1296 1296 432 1296 432 1296 432 432 1296 432 1296 432 14681" \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/_kaku.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/_kaku.rst new file mode 100644 index 0000000..2826dd1 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/_kaku.rst @@ -0,0 +1,223 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+--------------+ +| **Brand** | **Protocol** | ++----------------------+--------------+ +| KlikAanKlikUit | kaku_dimmer | ++----------------------+--------------+ +| Nexa WMR-252 | kaku_dimmer | ++----------------------+--------------+ +| Intertechno ITDM-250 | kaku_dimmer | ++----------------------+--------------+ +| Intertechno ITDM-150 | kaku_dimmer | ++----------------------+--------------+ +| Intertechno ITL-210 | kaku_dimmer | ++----------------------+--------------+ +| Intertechno ITL-250 | kaku_dimmer | ++----------------------+--------------+ +| Intertechno ITLR-300 | kaku_dimmer | ++----------------------+--------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -u --unit=unit control a device with this unit code + -i --id=id control a device with this id + -a --all send command to all devices with this id + -d --dimlevel=dimlevel send a specific dimlevel + -l --learn send multiple streams so dimmer can learn + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "kaku_dimmer" ], + "id": [{ + "id": 100, + "unit": 0 + }], + "state": "off", + "dimlevel": 15 + } + }, + "gui": { + "dimmer": { + "name": "Dimmer", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 67108863 | ++------------------+-----------------+ +| code | 0 - 31 | ++------------------+-----------------+ +| dimlevel | 0 - 15 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+-------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+-------------------------------------------------+ +| dimlevel-minimum | 0 | number | Minimum dimlevel | ++--------------------+-------------+------------+-------------------------------------------------+ +| dimlevel-maximum | 15 | number | Maximum dimlevel | ++--------------------+-------------+------------+-------------------------------------------------+ +| all | 0 | 1 or 0 | | If specified this will trigger the "group" | +| | | | | function of the advanced remotes and trigger | +| | | | | all registered devices for the given unitcode | ++--------------------+-------------+------------+-------------------------------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Notes + +If you want your switch to learn new codes, you can use the following command: + +.. code-block:: console + + pilight-send -p kaku_dimmer -i 1 -u 1 -t -l + +If you want your switch to remove a learned code, you can use the following command: + +.. code-block:: console + + pilight-send -p kaku_dimmer -i 1 -u 1 -f -l + +.. rubric:: Protocol + +This protocol sends 148 pulses like this + +.. code-block:: console + + 286 2825 286 201 289 1337 287 209 283 1351 287 204 289 1339 288 207 288 1341 289 207 281 1343 284 205 292 1346 282 212 283 1348 282 213 279 1352 282 211 281 1349 282 210 283 1347 284 211 288 1348 281 211 285 1353 278 213 280 1351 280 232 282 1356 279 213 285 1351 276 215 285 1348 277 216 278 1359 278 216 279 1353 272 214 283 1358 276 216 276 1351 278 214 284 1357 275 217 276 1353 270 217 277 1353 272 220 277 1351 275 220 272 1356 275 1353 273 224 277 236 282 1355 272 1353 273 233 273 222 268 1358 270 219 277 1361 274 218 280 1358 272 1355 271 243 273 222 268 1358 270 219 277 1361 274 218 280 1358 272 1355 271 243 251 11302 + +The first 2 pulses are the ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine. We don't use them for further processing. The next step is to transform this output into 36 groups of 4 pulses (and thereby dropping the ``header`` and ``footer`` pulses). + +.. code-block:: console + + 286 201 289 1337 + 287 209 283 1351 + 287 204 289 1339 + 288 207 288 1341 + 289 207 281 1343 + 284 205 292 1346 + 282 212 283 1348 + 282 213 279 1352 + 282 211 281 1349 + 282 210 283 1347 + 284 211 288 1348 + 281 211 285 1353 + 278 213 280 1351 + 280 232 282 1356 + 279 213 285 1351 + 276 215 285 1348 + 277 216 278 1359 + 278 216 279 1353 + 272 214 283 1358 + 276 216 276 1351 + 278 214 284 1357 + 275 217 276 1353 + 270 217 277 1353 + 272 220 277 1351 + 275 220 272 1356 + 275 1353 273 224 + 277 236 282 1353 + 272 1353 273 277 + 273 222 268 1358 + 270 219 277 1361 + 274 218 280 1358 + 272 1355 271 243 + 273 222 268 1358 + 270 219 277 1361 + 274 218 280 1358 + 272 1355 271 243 + +If we now look at carefully at these groups you can distinguish three types of groups: + +- ``272 1355 271 243`` +- ``274 218 280 1358`` +- ``277 236 282 277`` + +So the first group is defined by a high 2nd, the second group has a high 4th pulse, and the third group has a low 2nd and a low 4th pulse. This third group is a special one but not much of a use while receiving. However, it must be taken care of when sending arctech dimmer codes. So we take either of these two pulses to define a 0 or a 1. In this case we say a high 2nd pulse means a 1 and a low 2nd pulse means a 0. We then get the following output: + +.. code-block:: console + + 000000000000000000000000010100010001 + +Each (group) of numbers has a specific meaning: + +- ID: 0 till 25 +- All: 26 +- Check: 27 +- Unit: 28 till 31 +- Dimlevel: 32 till 35 + +.. code-block:: console + + 00000000000000000000000001 0 1 0001 0001 + +- The ``ID`` is defined as a binary number +- The ``All`` special pulse to identify the code was meant for a dimmer +- The ``Check`` defines whether a devices needs to be turned On or Off +- The ``Unit`` is also defined as a binary number +- The ``Dimlevel`` defines the specific dimlevel + +So this code represents: + +- ID: 1 +- All: Single +- Check: Valid +- Unit: 1 +- Dimlevel: 1 + +Another example: + +- ID: 123456 +- All: All +- Check: Valid +- Unit: 15 +- Dimlevel: 8 + +.. code-block:: console + + 000000000111100010010000001011111000 \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/index.rst new file mode 100644 index 0000000..ebdb4b8 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/index.rst @@ -0,0 +1,9 @@ +Dimmers +======= + +.. toctree:: + :maxdepth: 1 + + intertechno + kaku + nexa \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/intertechno.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/intertechno.rst new file mode 100644 index 0000000..c28f3c5 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/intertechno.rst @@ -0,0 +1,4 @@ +Intertechno +=========== + +.. include:: _kaku.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/kaku.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/kaku.rst new file mode 100644 index 0000000..82b17cf --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/kaku.rst @@ -0,0 +1,4 @@ +KlikAanKlikUit +============== + +.. include:: _kaku.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/nexa.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/nexa.rst new file mode 100644 index 0000000..a64751b --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/dimmer/nexa.rst @@ -0,0 +1,4 @@ +Nexa WMR-252 +============ + +.. include:: _kaku.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/index.rst new file mode 100644 index 0000000..3437455 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/index.rst @@ -0,0 +1,13 @@ +433.92Mhz +========= + +.. toctree:: + :maxdepth: 3 + + alarm/index + contact/index + dimmer/index + motion/index + screen/index + weather/index + switch/index \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/motion/ev1527.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/motion/ev1527.rst new file mode 100644 index 0000000..5b77414 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/motion/ev1527.rst @@ -0,0 +1,127 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +EV1527 Motion +============= + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+--------------+ +| **Brand** | **Protocol** | ++------------------+--------------+ +| EV1527 | ev1527 | ++------------------+--------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "contact": { + "protocol": [ "ev1527" ], + "id": [{ + "unitcode": 0 + }], + "state": "closed" + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| unitcode | 0 - 1048575 | ++------------------+-----------------+ +| state | opened / closed | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +*None* + +.. rubric:: Protocol + +This protocol sends 50 pulses like this + +.. code-block:: guess + + 253 759 759 253 759 253 253 759 253 759 253 759 253 759 253 759 253 759 759 253 253 759 253 759 759 253 759 253 759 253 253 759 253 759 759 253 253 759 759 253 253 759 253 759 759 253 253 8602 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +The first six pulses are the address bits, followed by upto another 6 Address/Data Bits. Address Bits can have three states: 0, 1, F (tri-state). Data Bits have only two states: 0 or 1. + +.. code-block:: guess + + 253 759 + 759 253 + 759 253 + 253 759 + 253 759 + 253 759 + 253 759 + 253 759 + 253 759 + 759 253 + 253 759 + 253 759 + 759 253 + 759 253 + 759 253 + 253 759 + 253 759 + 759 253 + 253 759 + 759 253 + 253 759 + 253 759 + 759 253 + +If we now take a careful look at these groups you can distinguish three types of groups: + +#. ``253 759`` +#. ``759 253`` + +So the first group is defined by a high second pulse, the second group has a low second pulse. We then get the following output: + +.. code-block:: guess + + 10001111110110001101 0110 + +Each (group) of numbers has a specific meaning: + +- UnitCode: 0 till 20 +- State: 20 + +Bits 21-24 are not used. + +.. code-block:: guess + + 10001111110110001101 0 + +- The ``UnitCode`` is defined as a binary number +- The ``State`` defines whether a sensor state is opened or closed + +So this code represents: + +- UnitCode: 589197 +- State: opened \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/motion/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/motion/index.rst new file mode 100644 index 0000000..b454ef1 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/motion/index.rst @@ -0,0 +1,8 @@ +Motion +======= + +.. toctree:: + :maxdepth: 1 + + ev1527 + kaku \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/motion/kaku.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/motion/kaku.rst new file mode 100644 index 0000000..72e59c8 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/motion/kaku.rst @@ -0,0 +1,150 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +KlikAanKlikUit +============== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+--------------+ +| **Brand** | **Protocol** | ++------------------+--------------+ +| KlikAanKlikUit | kaku_motion | ++------------------+--------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "contact": { + "protocol": [ "kaku_motion" ], + "id": [{ + "id": 100, + "unit": 0 + }], + "state": "on" + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| unitcode | 0 - 67108863 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +*None* + +.. rubric:: Protocol + +This protocol sends 148 pulses like this + +.. code-block:: guess + + 286 2825 286 201 289 1337 287 209 283 1351 287 204 289 1339 288 207 288 1341 289 207 281 1343 284 205 292 1346 282 212 283 1348 282 213 279 1352 282 211 281 1349 282 210 283 1347 284 211 288 1348 281 211 285 1353 278 213 280 1351 280 232 282 1356 279 213 285 1351 276 215 285 1348 277 216 278 1359 278 216 279 1353 272 214 283 1358 276 216 276 1351 278 214 284 1357 275 217 276 1353 270 217 277 1353 272 220 277 1351 275 220 272 1356 275 1353 273 224 277 236 282 1355 272 1353 273 233 273 222 268 1358 270 219 277 1361 274 218 280 1358 272 1355 271 243 251 11302 + +The first 2 pulses are the ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine. We don't use them for further processing. The next step is to transform this output into 36 groups of 4 pulses (and thereby dropping the ``header`` and ``footer`` pulses). + +.. code-block:: guess + + 286 201 289 1337 + 287 209 283 1351 + 287 204 289 1339 + 288 207 288 1341 + 289 207 281 1343 + 284 205 292 1346 + 282 212 283 1348 + 282 213 279 1352 + 282 211 281 1349 + 282 210 283 1347 + 284 211 288 1348 + 281 211 285 1353 + 278 213 280 1351 + 280 232 282 1356 + 279 213 285 1351 + 276 215 285 1348 + 277 216 278 1359 + 278 216 279 1353 + 272 214 283 1358 + 276 216 276 1351 + 278 214 284 1357 + 275 217 276 1353 + 270 217 277 1353 + 272 220 277 1351 + 275 220 272 1356 + 275 1353 273 224 + 277 236 282 1355 + 272 1353 273 233 + 273 222 268 1358 + 270 219 277 1361 + 274 218 280 1358 + 272 1355 271 243 + +If we now look at carefully at these groups you can distinguish two types of groups: + +#. 272 1355 271 243 +#. 274 218 280 1358 + +So the first group is defined by a high 2nd and the second group has a high 4th pulse. So we take either of these two pulses to define a 0 or a 1. In this case we say a high 2nd pulse means a 1 and a low 2nd pulse means a 0. We then get the following output: + +.. code-block:: guess + + 00000000000000000000000001010001 + +Each (group) of numbers has a specific meaning: + +- ID: 0 till 25(Convert the binary code to decimal to get the correct id) +- All: 26 +- State: 27 +- Unit: 28 till 31 + +.. code-block:: guess + + 00000000000000000000000001 0 1 0001 + +- The ``ID`` is defined as a binary number +- The ``All`` tells us if a code was meant for all devices with the same ID +- The ``State`` defines whether a devices is opened or closed +- The ``Unit`` is also defined as a binary number + +So this code represents: + +- ID: 1 +- All: Single +- State: On +- Unit: 1 + +Another example: + +- ID: 123456 +- All: All +- State: Off +- Unit: 15 + +.. code-block:: guess + + 00000000011110001001000000101111 \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/_kaku.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/_kaku.rst new file mode 100644 index 0000000..ac6b05c --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/_kaku.rst @@ -0,0 +1,187 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+--------------+ +| **Brand** | **Protocol** | ++------------------+--------------+ +| KlikAanKlikUit | kaku_screen | ++------------------+--------------+ +| DI-O (Chacon) | dio_screen | ++------------------+--------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + + -t --up send an up signal + -f --down send an down signal + -u --unit=unit control a device with this unit code + -i --id=id control a device with this id + -a --all send command to all devices with this id + -l --learn send multiple streams so screen can learn + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "screen": { + "protocol": [ "kaku_screen" ], + "id": [{ + "id": 100, + "unit": 0 + }], + "state": "down" + } + }, + "gui": { + "screen": { + "name": "Screen", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 67108863 | ++------------------+-----------------+ +| unit | 0 - 15 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++------------------+-------------+------------+-----------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++------------------+-------------+------------+-----------------------------------------------+ +| readonly | 0 | 1 or 0 | Disable controlling this device from the GUIs | ++------------------+-------------+------------+-----------------------------------------------+ +| confirm | 0 | 1 or 0 | Ask for confirmation when switching device | ++------------------+-------------+------------+-----------------------------------------------+ + +.. rubric:: Notes + +If you want your switch to learn new codes, you can use the following command: + +.. code-block:: console + + pilight-send -p kaku_screen -i 1 -u 1 -t -l + +If you want your switch to remove a learned code, you can use the following command: + +.. code-block:: console + + pilight-send -p kaku_screen -i 1 -u 1 -f -l + +.. rubric:: Protocol + +This protocol sends 132 pulses like this + +.. code-block:: guess + + 286 2825 286 201 289 1337 287 209 283 1351 287 204 289 1339 288 207 288 1341 289 207 281 1343 284 205 292 1346 282 212 283 1348 282 213 279 1352 282 211 281 1349 282 210 283 1347 284 211 288 1348 281 211 285 1353 278 213 280 1351 280 232 282 1356 279 213 285 1351 276 215 285 1348 277 216 278 1359 278 216 279 1353 272 214 283 1358 276 216 276 1351 278 214 284 1357 275 217 276 1353 270 217 277 1353 272 220 277 1351 275 220 272 1356 275 1353 273 224 277 236 282 1355 272 1353 273 233 273 222 268 1358 270 219 277 1361 274 218 280 1358 272 1355 271 243 251 11302 + +The first 2 pulses are the ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine. We don't use them for further processing. The next step is to transform this output into 36 groups of 4 pulses (and thereby dropping the ``header`` and ``footer`` pulses). + +.. code-block:: guess + + 286 201 289 1337 + 287 209 283 1351 + 287 204 289 1339 + 288 207 288 1341 + 289 207 281 1343 + 284 205 292 1346 + 282 212 283 1348 + 282 213 279 1352 + 282 211 281 1349 + 282 210 283 1347 + 284 211 288 1348 + 281 211 285 1353 + 278 213 280 1351 + 280 232 282 1356 + 279 213 285 1351 + 276 215 285 1348 + 277 216 278 1359 + 278 216 279 1353 + 272 214 283 1358 + 276 216 276 1351 + 278 214 284 1357 + 275 217 276 1353 + 270 217 277 1353 + 272 220 277 1351 + 275 220 272 1356 + 275 1353 273 224 + 277 236 282 1355 + 272 1353 273 233 + 273 222 268 1358 + 270 219 277 1361 + 274 218 280 1358 + 272 1355 271 243 + +If we now look at carefully at these groups you can distinguish two types of groups: + +#. 272 1355 271 243 +#. 274 218 280 1358 + +So the first group is defined by a high 2nd and the second group has a high 4th pulse. So we take either of these two pulses to define a 0 or a 1. In this case we say a high 2nd pulse means a 1 and a low 2nd pulse means a 0. We then get the following output: + +.. code-block:: guess + + 00000000000000000000000001010001 + +Each (group) of numbers has a specific meaning: + +- ID: 0 till 25 +- All: 26 +- State: 27 +- Unit: 28 till 31 + +.. code-block:: guess + + 00000000000000000000000001 0 1 0001 + +- The ``ID`` is defined as a binary number +- The ``All`` tells us if a code was meant for all devices with the same ID +- The ``State`` defines whether a devices is opened or closed +- The ``Unit`` is also defined as a binary number + +So this code represents: + +- ID: 1 +- All: Single +- State: Up +- Unit: 1 + +Another example: + +- ID: 123456 +- All: All +- State: Down +- Unit: 15 + +.. code-block:: guess + + 00000000011110001001000000101111 \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/d_io.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/d_io.rst new file mode 100644 index 0000000..238c973 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/d_io.rst @@ -0,0 +1,4 @@ +D-IO (Chacon) +============= + +.. include:: _kaku.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/index.rst new file mode 100644 index 0000000..d8de4ce --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/index.rst @@ -0,0 +1,9 @@ +Screens +======= + +.. toctree:: + :maxdepth: 1 + + kaku + d_io + kaku_old \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/kaku.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/kaku.rst new file mode 100644 index 0000000..82b17cf --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/kaku.rst @@ -0,0 +1,4 @@ +KlikAanKlikUit +============== + +.. include:: _kaku.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/kaku_old.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/kaku_old.rst new file mode 100644 index 0000000..ca3db4d --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/screen/kaku_old.rst @@ -0,0 +1,173 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +KlikAanKlikUit (Old) +==================== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+------------------+ +| **Brand** | **Protocol** | ++------------------+------------------+ +| KlikAanKlikUit | kaku_screen_old | ++------------------+------------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + + -t --up send an up signal + -f --down send an down signal + -u --unit=unit control a device with this unit code + -i --id=id control a device with this id + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "screen": { + "protocol": [ "kaku_screen_old" ], + "id": [{ + "id": 16, + "unit": 0 + }], + "state": "down" + } + }, + "gui": { + "screen": { + "name": "Screen", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 31 | ++------------------+-----------------+ +| unit | 0 - 15 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++------------------+-------------+------------+-----------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++------------------+-------------+------------+-----------------------------------------------+ +| readonly | 0 | 1 or 0 | Disable controlling this device from the GUIs | ++------------------+-------------+------------+-----------------------------------------------+ +| confirm | 0 | 1 or 0 | Ask for confirmation when switching device | ++------------------+-------------+------------+-----------------------------------------------+ + +.. rubric:: Notes + + +The old KlikAanKlikUit devices work setting two wheels: group (0-H) and device number (0-16). To control a device from pilight you need to send the correct group and unit id, these do not correspond 1:1. + +A-1 on the unit corresponds with unit 0 id 0 in pilight A-2 on the unit corresponds with unit 0 id 1 in pilight etc. + +.. rubric:: Protocol + +This protocol sends 50 pulses like this + +.. code-block:: guess + + 295 1180 295 1180 295 1180 1180 295 295 1180 295 1180 295 1180 1180 295 295 1180 1180 295 295 1180 1180 295 295 1180 1180 295 295 1180 1180 295 295 1180 295 1180 295 1180 1180 295 295 1180 1180 295 295 1180 1180 295 295 11210 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +.. code-block:: guess + + 295 1180 295 1180 + 295 1180 1180 295 + 295 1180 295 1180 + 295 1180 1180 295 + 295 1180 1180 295 + + 295 1180 1180 295 + 295 1180 1180 295 + 295 1180 1180 295 + 295 1180 295 1180 + 295 1180 1180 295 + + 295 1180 1180 295 + 295 1180 1180 295 + + 295 11210 + +If we now look at carefully at these groups you can distinguish two types of groups: + +#. 295 1180 1180 295 +#. 295 1180 295 1180 + +So the first group is defined by a high 3th pulse and the second group has a low 3rd pulse. In this case we say a high 3rd pulse means a 0 and a high 3rd pulse means a 1. We then get the following output: + +.. code-block:: guess + + 10100 00010 0 0 + +Each (group) of numbers has a specific meaning: + +- Unit: 0 till 5 (inversed) +- ID: 6 till 10 (inversed) +- Fixed: 11 (always 0) +- State: 12 (inversed) + +.. code-block:: guess + + 10100 00010 0 0 + +- The ``Unit`` is defined as a binary number +- The ``ID`` is defined as a binary number +- The ``Fixed`` is always 0 +- The ``State`` defines whether a devices needs to be go Up or Down + +So this code represents: + +- Unit: 20 +- ID: 1 +- Fixed: always 0 +- State: Down + +Another example: + +- Unit: 0 +- ID: 4 +- Fixed: always 0 +- State: Up + +.. code-block:: guess + + 00000 00100 0 1 + +Furthermore the protocol filters out false positives by checking if: + +#. Every 1st bit of the first 12 groups of 4 bits is always LOW (0) +#. 2nd bit of the first 12 groups of 4 bits is always HIGH (1) +#. 3rd and 4th bit of the first 12 groups of 4 bits are different (NOT EQUAL) +#. Bits 49 and 50 are LOW (0) and HIGH (1) respectively (fixed footer) + +This makes the protocol more accurate because it will respond rarely now when sartano commands are sent. \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_elro_800.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_elro_800.rst new file mode 100644 index 0000000..b72fdc1 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_elro_800.rst @@ -0,0 +1,178 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+------------------+ +| **Brand** | **Protocol** | ++----------------------+------------------+ +| Elro 800 Series | elro_800_switch | ++----------------------+------------------+ +| Brennenstuhl | brennenstuhl | ++----------------------+------------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -s --systemcode=systemcode control a device with this systemcode + -u --unitcode=unitcode control a device with this unitcode + -t --on send an on signal + -f --off send an off signal + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "elro_800_switch" ], + "id": [{ + "systemcode": 31, + "unitcode": 0 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| systemcode | 0 - 1023 | ++------------------+-----------------+ +| unitcode | 0 - 31 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. Note:: Workaround for 800 Series + + 1. Set your remote DIP switches like this off|off|on|off (AB660 Code) if possible + 2. Now look for systemcode and unitcode with pilight-receive + 3. Setup the config.json with the received results + 4. Get the switches in learning mode and push the buttons on the webgui accordingly to the unit. + 5. This should work until there is a protocol for the 800 series. + + +.. rubric:: Protocol + +This protocol sends 50 pulses like this + +.. code-block:: console + + 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 960 320 320 960 960 320 320 960 960 320 320 960 960 320 320 960 320 960 320 960 960 320 320 9920 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +.. code-block:: console + + 320 960 320 960 + 320 960 320 960 + 320 960 320 960 + 320 960 320 960 + 320 960 320 960 + 320 960 320 960 + 320 960 960 320 + 320 960 960 320 + 320 960 960 320 + 320 960 960 320 + 320 960 320 960 + 320 960 960 320 + 320 9920 + +If we now look at carefully at these groups you can distinguish three types of groups: + +- ``320 960 320 960`` +- ``320 960 960 320`` + +So the first group is defined by a high 4th pulse and the second group has a low 4th pulse. In this case we say a high 4th pulse means a 1 and a low 4th pulse means a 0. We then get the following output: + +.. code-block:: console + + 11111 10000 1 0 + +Each (group) of numbers has a specific meaning: + +- SystemCode: 0 till 5 +- UnitCode: 6 till 10 +- State: 11 +- Check: 12 (inverse state) + + +- The ``SystemCode`` is defined as a binary number +- The ``UnitCode`` is defined as a binary number +- The ``State`` defines whether a devices needs to be turned On or Off +- The ``Check`` defines whether a devices needs to be turned On or Off (but is inverse) + +So this code represents: + +- SystemCode: 31 +- UnitCode: 1 +- State: On +- Check: On (inverse state) + +.. code-block:: console + + 00000 00100 0 1 + +Another example: + +- SystemCode: 0 +- UnitCode: 4 +- State: Off +- Check: Off (inverse state) + +Furthermore the protocol filters out false positives by checking if: + +- Every 1st bit of the first 12 groups of 4 bits is always LOW (0) +- 2nd bit of the first 12 groups of 4 bits is always HIGH (1) +- 3rd and 4th bit of the first 12 groups of 4 bits are different (NOT EQUAL) +- Bits 49 and 50 are LOW (0) and HIGH (1) respectively (fixed footer) + +This makes the protocol more accurate because it will respond less when arctech_old commands are sent. + +The numeric mapping of a button on the remote control is binary counted, as follows: + +- A = 1 +- B = 2 +- C = 4 +- D = 8 +- E = 16 + +All possible combinations of dip switches on the socket can be used with pilight. For instance, if you set the switches that correspond to A and E, the socket will react on unit code “A+E”: 17 (1+16). By pushing A and E simultaneously on the remote, you can also switch the corresponding socket. However, this may also trigger sockets that are listening to A and/or E if you don't push both buttons at exactly the same time. diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_kaku.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_kaku.rst new file mode 100644 index 0000000..a06d725 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_kaku.rst @@ -0,0 +1,208 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+--------------------+ +| **Brand** | **Protocol** | ++----------------------+--------------------+ +| CoCo Technologies | coco_switch | ++----------------------+--------------------+ +| D-IO (Chacon) | dio_switch | ++----------------------+--------------------+ +| Intertechno | intertechno_switch | ++----------------------+--------------------+ +| KlikAanKlikUit | kaku_switch | ++----------------------+--------------------+ +| Nexa | nexa_switch | ++----------------------+--------------------+ +| Rev Ritter 8341LC | intertechno_switch | ++----------------------+--------------------+ +| Rev Ritter 8342LC | intertechno_switch | ++----------------------+--------------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -t --on send an on signal + -f --off send an off signal + -u --unit=unit control a device with this unit code + -i --id=id control a device with this id + -a --all send command to all devices with this id + -l --learn send multiple streams so switch can learn + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "kaku_switch" ], + "id": [{ + "id": 100, + "unit": 0 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 67108863 | ++------------------+-----------------+ +| unit | 0 - 15 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+-------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+-------------------------------------------------+ +| all | 0 | 1 or 0 | | If specified this will trigger the "group" | +| | | | | function of the advanced remotes and trigger | +| | | | | all registered devices for the given unitcode | ++--------------------+-------------+------------+-------------------------------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Notes + +If you want your switch to learn new codes, you can use the following command: + +.. code-block:: console + + pilight-send -p kaku_switch -i 1 -u 1 -t -l + +If you want your switch to remove a learned code, you can use the following command: + +.. code-block:: console + + pilight-send -p kaku_switch -i 1 -u 1 -f -l + +.. rubric:: Protocol + +This protocol sends 132 pulses like this + +.. code-block:: console + + 286 2825 286 201 289 1337 287 209 283 1351 287 204 289 1339 288 207 288 1341 289 207 281 1343 284 205 292 1346 282 212 283 1348 282 213 279 1352 282 211 281 1349 282 210 283 1347 284 211 288 1348 281 211 285 1353 278 213 280 1351 280 232 282 1356 279 213 285 1351 276 215 285 1348 277 216 278 1359 278 216 279 1353 272 214 283 1358 276 216 276 1351 278 214 284 1357 275 217 276 1353 270 217 277 1353 272 220 277 1351 275 220 272 1356 275 1353 273 224 277 236 282 1355 272 1353 273 233 273 222 268 1358 270 219 277 1361 274 218 280 1358 272 1355 271 243 251 11302 + +The first 2 pulses are the ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine. We don't use them for further processing. The next step is to transform this output into 32 groups of 4 pulses (and thereby dropping the ``header`` and ``footer`` pulses). + +.. code-block:: console + + 286 201 289 1337 + 287 209 283 1351 + 287 204 289 1339 + 288 207 288 1341 + 289 207 281 1343 + 284 205 292 1346 + 282 212 283 1348 + 282 213 279 1352 + 282 211 281 1349 + 282 210 283 1347 + 284 211 288 1348 + 281 211 285 1353 + 278 213 280 1351 + 280 232 282 1356 + 279 213 285 1351 + 276 215 285 1348 + 277 216 278 1359 + 278 216 279 1353 + 272 214 283 1358 + 276 216 276 1351 + 278 214 284 1357 + 275 217 276 1353 + 270 217 277 1353 + 272 220 277 1351 + 275 220 272 1356 + 275 1353 273 224 + 277 236 282 1355 + 272 1353 273 233 + 273 222 268 1358 + 270 219 277 1361 + 274 218 280 1358 + 272 1355 271 243 + +If we now look at carefully at these groups you can distinguish two types of groups: + +- ``272 1355 271 243`` +- ``274 218 280 1358`` + +So the first group is defined by a high 2nd and the second group has a high 4th pulse. So we take either of these two pulses to define a 0 or a 1. In this case we say a high 2nd pulse means a 1 and a low 2nd pulse means a 0. We then get the following output: + +.. code-block:: console + + 00000000000000000000000001010001 + +Each (group) of numbers has a specific meaning: + +- ID: 0 till 25(Convert the binary code to decimal to get the correct id) +- All: 26 +- State: 27 +- Unit: 28 till 31 + +.. code-block:: console + + 00000000000000000000000001 0 1 0001 + +- The ``ID`` is defined as a binary number +- The ``All`` tells us if a code was meant for all devices with the same ID +- The ``State`` defines whether a devices needs to be turned On or Off +- The ``Unit`` is also defined as a binary number + +So this code represents: + +- ID: 1 +- All: Single +- State: On +- Unit: 1 + +Another example: + +- ID: 123456 +- All: All +- State: Off +- Unit: 15 + +.. code-block:: console + + 00000000011110001001000000101111 \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_kaku_old.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_kaku_old.rst new file mode 100644 index 0000000..73fe57a --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_kaku_old.rst @@ -0,0 +1,201 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+------------------+ +| **Brand** | **Protocol** | ++----------------------+------------------+ +| Cogex | cogex | ++----------------------+------------------+ +| Dúwi Terminal | duwi | ++----------------------+------------------+ +| Eurodomest | kaku_switch_old | ++----------------------+------------------+ +| Intertechno | intertechno_old | ++----------------------+------------------+ +| Dúwi Terminal | duwi | ++----------------------+------------------+ +| KlikAanKlikUit | kaku_switch_old | ++----------------------+------------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -t --on send an on signal + -f --off send an off signal + -u --unit=unit control a device with this unit code + -i --id=id control a device with this id + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "kaku_switch_old" ], + "id": [{ + "id": 10, + "unit": 0 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 31 | ++------------------+-----------------+ +| unit | 0 - 15 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Notes + +The old KlikAanKlikUit devices work setting two wheels: group (0-H) and device number (0-16). To control a device from pilight you need to send the correct group and unit id, these do not correspond 1:1. + +A-1 on the unit corresponds with unit 0 id 0 in pilight A-2 on the unit corresponds with unit 0 id 1 in pilight etc. + +.. rubric:: Protocol + +This protocol sends 50 pulses like this + +.. code-block:: console + + 295 1180 295 1180 295 1180 1180 295 295 1180 295 1180 295 1180 1180 295 295 1180 1180 295 295 1180 1180 295 295 1180 1180 295 295 1180 1180 295 295 1180 295 1180 295 1180 1180 295 295 1180 1180 295 295 1180 1180 295 295 11210 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +.. code-block:: console + + 295 1180 295 1180 + 295 1180 1180 295 + 295 1180 295 1180 + 295 1180 1180 295 + 295 1180 1180 295 + + 295 1180 1180 295 + 295 1180 1180 295 + 295 1180 1180 295 + 295 1180 295 1180 + 295 1180 1180 295 + + 295 1180 1180 295 + 295 1180 1180 295 + + 295 11210 + +If we now look at carefully at these groups you can distinguish two types of groups: + +- ``295 1180 1180 295`` +- ``295 1180 295 1180`` + +So the first group is defined by a high 3th pulse and the second group has a low 3rd pulse. In this case we say a high 3rd pulse means a 0 and a low 3rd pulse means a 1. We then get the following output: + +.. code-block:: console + + 10100 00010 0 0 + +Each (group) of numbers has a specific meaning: + +- Unit: 0 till 5 (inversed) +- ID: 6 till 10 (inversed) +- Fixed: 11 (always 0) +- State: 12 (inversed) + +.. code-block:: console + + 10100 00010 0 0 + +- The ``Unit`` is defined as a binary number +- The ``ID`` is defined as a binary number +- The ``Fixed`` is always 0 +- The ``State`` defines whether a devices needs to be turned On or Off + +So this code represents: + +- Unit: 20 +- ID: 1 +- Fixed: always 0 +- State: Off + +Another example: + +- Unit: 0 +- ID: 4 +- Fixed: always 0 +- State: On + +.. code-block:: console + + 00000 00100 0 1 + +Furthermore the protocol filters out false positives by checking if: + +- Every 1st bit of the first 12 groups of 4 bits is always LOW (0) +- 2nd bit of the first 12 groups of 4 bits is always HIGH (1) +- 3rd and 4th bit of the first 12 groups of 4 bits are different (NOT EQUAL) +- Bits 49 and 50 are LOW (0) and HIGH (1) respectively (fixed footer) + +This makes the protocol more accurate because it will respond rarely now when sartano commands are sent. + +.. note:: **Eurodomest** + + The Eurodomest (Intertechno) switches listens to the kaku_switch_old protocol, but the remote doesn't send using the kaku_switch_old protocol. When using pilight-receive, the following protocols are received using the remote: + + - elro_800_contact + - elro_800_switch + - ehome + - cleverwatts + + To use the Eurodomest switches with the kaku_switch_old protocol on pilight, the following steps have to be performed: + + - Hold the On/Off button until the LED flashes. + - In a terminal window do: + + .. code-block:: console + + pilight-send -p kaku_switch_old -i -u 0 -t + + - If everything is Ok the switch is programmed. + - For wall-plug 2 & 3 change the value -u + diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_rsl366.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_rsl366.rst new file mode 100644 index 0000000..2fcca96 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/_rsl366.rst @@ -0,0 +1,166 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+------------------+ +| **Brand** | **Protocol** | ++----------------------+------------------+ +| Rising Sun RSL366 | rsl366 | ++----------------------+------------------+ +| Brennenstuhl | brennenstuhl | ++----------------------+------------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -s --systemcode=systemcode control a device with this systemcode + -u --programcode=programcode control a device with this programcode + -t --on send an on signal + -f --off send an off signal + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "switch": { + "protocol": [ "promax" ], + "id": [{ + "systemcode": 4, + "programcode": 1 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| systemcode | 0 - 4 | ++------------------+-----------------+ +| unitcode | 0 - 4 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. note:: **RSL366** + + The RSL366 switches come with two dials, one selecting the Systemcode (1 to 4) and the Programcode (1 to 4). The systemcode allows one remote to control up to 16 switches. The systemcode parameter designates the dial on top of the back side of the switch, and the small lever on the back of the remote. The programcode parameter designates the lower dial on the back of the switch, and the individual buttons on the face of the remote. So if your switch has the higher dial set to 4, and the lower one set to 1, you should use: + + .. code-block:: console + + systemcode: 4 + programcode: 1 + +.. rubric:: Protocol + +This protocol sends 50 pulses like this + +.. code-block:: console + + 390 1170 1170 390 390 1170 1170 390 390 1170 1170 390 390 1170 390 1170 390 1170 390 1170 390 1170 1170 390 390 1170 1170 390 390 1170 1170 390 390 1170 1170 390 390 1170 1170 390 390 1170 1170 390 390 1170 1170 390 390 13260 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +.. code-block:: console + + 390 1170 1170 390 + 390 1170 1170 390 + 390 1170 1170 390 + 390 1170 390 1170 + + 390 1170 390 1170 + 390 1170 1170 390 + 390 1170 1170 390 + 390 1170 1170 390 + + 390 1170 1170 390 + 390 1170 1170 390 + 390 1170 1170 390 + + 390 1170 1170 390 + +If we now look at carefully at these groups you can distinguish three types of groups: + +- ``390 1170 1170 390`` +- ``390 1170 390 1170`` + +#. The first group is defined by a low 1st and low 4th pulse, and we call it low. +#. The second group has a high 2nd and 4th pulse, and we call it high. + +We then get the following output: + +.. code-block:: console + + LLLH HLLL LL LL + +All H's can be translated to 1. All L's can be translated to 0. + +Each (group) of numbers has a specific meaning: + +- Systemcode: 1 till 4 +- Programcode: 5 till 8 +- 9 to 11 are always low and don't convey any information +- State: 12 (state) + +.. code-block:: console + + 0001 1000 000 0 + +- The ``SystemCode`` is defined as position of the pulse group that bears the **high** signal in the first grouping (i.e. if the third pulse group is high then systemcode is 3) +- The ``ProgramCode`` is defined as the position of the pulse group that bears the **high** signal in the second grouping (i.e. if the second pulse group is high then systemcode is 2) +- The ``State`` defines whether a devices needs to be turned On or Off. If it bears the **high** pulse group - the device must be turned off, if it bears the **low** pulse group it must be turned on + +So this code represents: + +- SystemCode: 4 +- ProgramCode: 1 +- State: On + +Another example: + +- Unit: 1 +- ID: 3 +- State: Off + +.. code-block:: console + + 1000 0010 000 1 diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/beamish.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/beamish.rst new file mode 100644 index 0000000..44617f4 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/beamish.rst @@ -0,0 +1,221 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Beamish +======= + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+------------------+ +| **Brand** | **Protocol** | ++----------------------+------------------+ +| Beamish 4-AE4 | beamish_switch | ++----------------------+------------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -t --on send a toggle state signal to the device + -f --off send a toggle state signal to the device + -i --id=id control the device with this system id (1 ... 65535) + -u --unit=unit control the device with this unit code (1 ... 4) + -a --all send on/off command to all device units belonging to this system id + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "beamish_switch" ], + "id": [{ + "id": 8, + "unit": 2 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| systemcode | 1 - 65535 | ++------------------+-----------------+ +| unit | 1 - 4 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Protocol + +This protocol sends 50 pulses like this + +.. code-block:: console + + 323 1292 323 1292 323 1292 323 1292 323 1292 323 1292 323 1292 323 1292 323 1292 323 1292 323 1292 323 1292 1292 323 323 1292 323 1292 323 1292 323 1292 323 1292 1292 323 1292 323 323 1292 323 1292 323 1292 323 1292 323 10982 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +.. code-block:: console + + 323 1292 + 323 1292 + 323 1292 + 323 1292 + 323 1292 + 323 1292 + 323 1292 + 323 1292 + 323 1292 + 323 1292 + 323 1292 + 323 1292 + 1292 323 + 323 1292 + 323 1292 + 323 1292 + 323 1292 + 323 1292 + 1292 323 + 1292 323 + 323 1292 + 323 1292 + 323 1292 + 323 1292 + 323 10982 + +If we now look at carefully at these groups you can distinguish three types of groups: + +- ``323 1292`` +- ``1292 323`` + +The 1st group is defined by a short-long sequence (logical 0) The 2nd group is defined by a long-short sequence (logical 1): + +.. code-block:: console + + 000000000000100000110000 + +We can group the sequence of bits into the following groups A and B: + +.. code-block:: console + + AAAAAAAAAAAAAAAA BBBB BBBB + 0000000000001000 0011 0000 + +Each of the groups of bits (A and B) has a specific meaning: + ++-----------+-----------+-----------------+------------+-----------------+ +| **Group** | **Bit #** | **Config name** | **Range** | **Description** | ++-----------+-----------+-----------------+------------+-----------------+ +| A | 1 to 16 | id | 1 to 65535 | SystemCode id | ++-----------+-----------+-----------------+------------+-----------------+ +| B | 17 to 24 | unit | 1 to 4 | ButtonCode unit | ++-----------+-----------+-----------------+------------+-----------------+ + +The protocol driver creates the binary presentation as required by the device + ++------+------+-------+-------------------------------+ +| 1100 | 0000 | -u 1 | Button A Toggle device status | ++------+------+-------+-------------------------------+ +| 0011 | 0000 | -u 2 | Button B Toggle device status | ++------+------+-------+-------------------------------+ +| 0000 | 1100 | -u 3 | Button C Toggle device status | ++------+------+-------+-------------------------------+ +| 0000 | 0011 | -u 4 | Button D Toggle device status | ++------+------+-------+-------------------------------+ +| 0000 | 1111 | -a -t | Button ALL ON | ++------+------+-------+-------------------------------+ +| 1100 | 0011 | -a -f | Button ALL OFF | ++------+------+-------+-------------------------------+ + +So this code represents: + +.. code-block:: console + + { + "code": { + "id": 8, + "unit": 2 + }, + "origin": "receiver", + "protocol": "beamish_switch", + "uuid": "0000-00-00-00-000000", + "repeats": 2 + } + +.. rubric:: Examples + +CLI command: + +.. code-block:: console + + pilight-send -p beamish_switch -i 8 -u 1 + +.. code-block:: console + + { + "code": { + "systemcode": 2, + "id": 8, + "unit": 1 + }, + "origin": "receiver", + "protocol": "beamish_switch", + "uuid": "0000-00-00-00-000000", + "repeats": 1 + } + +.. code-block:: console + + pilight-send -p beamish_switch -i 8 -a -t + +.. code-block:: console + + { + "origin": "sender", + "protocol": "beamish_switch", + "code": { + "id": 8, + "all": 1, + "state": "on" + }, + "repeat": 1, + "uuid": "0000-00-00-00-000000" + } \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/brennenstuhl.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/brennenstuhl.rst new file mode 100644 index 0000000..d59f633 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/brennenstuhl.rst @@ -0,0 +1,4 @@ +Brennenstuhl +============= + +.. include:: _elro_800.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/byebyestandby.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/byebyestandby.rst new file mode 100644 index 0000000..c8af038 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/byebyestandby.rst @@ -0,0 +1,4 @@ +ByeByeStandby +============= + +.. include:: _kaku_old.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/clarus.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/clarus.rst new file mode 100644 index 0000000..045542e --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/clarus.rst @@ -0,0 +1,160 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Clarus +====== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+------------------+ +| **Brand** | **Protocol** | ++----------------------+------------------+ +| Clarus | clarus_switch | ++----------------------+------------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -i --id=id control a device with this systemcode + -u --unit=unit control a device with this programcode + -t --on send an on signal + -f --off send an off signal + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "clarus_switch" ], + "id": [{ + "id": "A2", + "unit": 10 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | A0 - F32 | ++------------------+-----------------+ +| unit | 0 - 63 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Protocol + +This protocol sends 50 pulses like this + +.. code-block:: console + + 189 567 567 189 189 567 567 189 189 567 189 567 189 567 567 189 189 567 189 567 189 567 567 189 189 567 567 189 189 567 567 189 189 567 189 567 567 189 567 189 189 567 189 567 567 189 567 189 189 6426 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +.. code-block:: console + + 189 567 567 189 + 189 567 567 189 + 189 567 189 567 + 189 567 567 189 + 189 567 189 567 + + 189 567 567 189 + 189 567 567 189 + 189 567 567 189 + 189 567 189 567 + 567 189 567 189 + + 189 567 189 567 + 567 189 567 189 + + 189 6426 + +If we now look at carefully at these groups you can distinguish three types of groups: + +#. ``189 567 567 189`` +#. ``567 189 567 189`` +#. ``189 567 189 567`` + +- The first group is defined by a low 1st and low 4rd pulse pulse, hence we call it low. +- The second group has a high 1st and 3rd pulse, hence we call it med. +- The final group has a low 1st and low 3rd pulse, hence we call it high. + +We then get the following output: + +.. code-block:: console + + LLHLH LLLHM HM + +All L's can be translated to 0, the H's to 1's, and M's to 2. + +Each (group) of numbers has a specific meaning: + +- Unit: 0 till 5 +- ID: 6 till 10 +- State: 12 (state) + +.. code-block:: console + + 00101 00012 12 + +- The ``Unit`` is defined as a binary number +- The ``ID`` is defined as a binary number combined with a letter +- The ``State`` defines whether a devices needs to be turned On or Off + +So this code represents: + +- Unit: 10 +- ID: A2 +- State: On + +Another example: + +- Unit: 0 +- ID: B1 +- State: Off + +.. code-block:: console + + 00101 00021 21 \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/cleverwatts.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/cleverwatts.rst new file mode 100644 index 0000000..4690a24 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/cleverwatts.rst @@ -0,0 +1,178 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Cleverwatts +=========== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+------------------+ +| **Brand** | **Protocol** | ++----------------------+------------------+ +| Cleverwatts | cleverwatts | ++----------------------+------------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -i --id=id control a device with this id + -u --unit=unit control a device with this unit + -t --on send an on signal + -f --off send an off signal + -a --all send an all signal + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "cleverwatts" ], + "id": [{ + "id": 73404, + "unit": 0 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 1 - 1048575 | ++------------------+-----------------+ +| unit | 0 - 3 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Protocol + +This protocol sends 50 pulses like this + +.. code-block:: console + + 270 810 810 270 810 270 270 810 810 270 810 270 810 270 270 810 810 270 270 810 810 270 270 810 810 270 270 810 270 810 810 270 270 810 270 810 270 810 270 810 810 270 810 270 810 270 270 810 270 9180 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +.. code-block:: console + + 270 810 + 810 270 + 810 270 + 270 810 + 810 270 + 810 270 + 810 270 + 270 810 + 810 270 + 270 810 + 810 270 + 270 810 + 810 270 + 270 810 + 270 810 + 810 270 + 270 810 + 270 810 + 270 810 + 270 810 + 810 270 + 810 270 + 810 270 + 270 810 + +If we now look at carefully at these groups you can distinguish three types of groups: + +#. ``270 810`` +#. ``810 270`` + +- The first group is defined by a low 1st and high 2nd pulse, hence we call it low. +- The second group has a high 1st and low 2nd pulse, hence we call it high. + +We then get the following output: + +.. code-block:: console + + 0 1 + 1 0 + 1 0 + 0 1 + 1 0 + 1 0 + 1 0 + 0 1 + 1 0 + 0 1 + 1 0 + 0 1 + 1 0 + 0 1 + 0 1 + 1 0 + 0 1 + 0 1 + 0 1 + 0 1 + 1 0 + 1 0 + 1 0 + 0 1 + +We then remove the first column of numbers and then put the remaining numbers in a row: + +.. code-block:: console + + 1001000101011011110001 + +Each (group) of numbers has a specific meaning and are defined in binary format: + +- ID: 0 till 19 +- State: 20 +- Unit: 21 and 22 +- All: 23 + +So this code represents: + +- Unit: 595311 +- ID: 0 +- State: On +- All: Single \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/coco.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/coco.rst new file mode 100644 index 0000000..bba13c8 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/coco.rst @@ -0,0 +1,4 @@ +CoCo Technologies +================= + +.. include:: _kaku.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/cogex.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/cogex.rst new file mode 100644 index 0000000..a900513 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/cogex.rst @@ -0,0 +1,4 @@ +Cogex +===== + +.. include:: _kaku_old.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/dio.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/dio.rst new file mode 100644 index 0000000..238c973 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/dio.rst @@ -0,0 +1,4 @@ +D-IO (Chacon) +============= + +.. include:: _kaku.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/duwi.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/duwi.rst new file mode 100644 index 0000000..9d9e352 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/duwi.rst @@ -0,0 +1,4 @@ +Dúwi Terminal +============= + +.. include:: _kaku_old.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/elro_300.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/elro_300.rst new file mode 100644 index 0000000..be7e69c --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/elro_300.rst @@ -0,0 +1,274 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Elro HE (300 Series) +==================== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+------------------+ +| **Brand** | **Protocol** | ++----------------------+------------------+ +| Elro 300 Series | elro_300_switch | ++----------------------+------------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -s --systemcode=systemcode control a device with this systemcode + -u --unitcode=unitcode control a device with this unitcode + -t --on send an on signal + -f --off send an off signal + -a --all trigger group switching + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "elro_300_switch" ], + "id": [{ + "systemcode": 123456, + "unitcode": 0 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| systemcode | 0 - 4294967295 | ++------------------+-----------------+ +| unitcode | 0 - 99 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++----------------------+-------------+------------+------------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+------------------------------------------------------------+ +| all | 1 | 1 or 0 | | If specified this will trigger the **group** function of | +| | | | | the advanced remotes and trigger all registered devices | +| | | | | for the given Systemcode | ++----------------------+-------------+------------+------------------------------------------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. Note:: + + The group button appears to be sending the unitcode of I-1 (First band, first unit) no matter to which band the remote is currently set. + +.. rubric:: Protocol + +This protocol sends 116 pulses like this + +.. code-block:: console + + 302 1208 302 1208 302 302 302 302 302 302 302 1208 302 1208 302 1208 302 1208 302 302 302 302 302 1208 302 302 302 1208 302 1208 302 1208 302 1208 302 302 302 302 302 1208 302 302 302 1208 302 1208 302 302 302 302 302 1208 302 302 302 1208 302 1208 302 1208 302 1208 302 302 302 302 302 1208 302 1208 302 302 302 1208 302 1208 302 302 302 302 302 1208 302 302 302 1208 302 1208 302 302 302 1208 302 1208 302 302 302 1208 302 302 302 1208 302 302 302 302 302 1208 302 1208 302 1208 302 302 302 10268 + +These pulses are separated into groups of 2: + +.. code-block:: console + + 302 1208 + 302 1208 + 302 302 + 302 302 + 302 302 + 302 1208 + 302 1208 + 302 1208 + 302 1208 + 302 302 + 302 302 + 302 1208 + 302 302 + 302 1208 + 302 1208 + 302 1208 + 302 1208 + 302 302 + 302 302 + 302 1208 + 302 302 + 302 1208 + 302 1208 + 302 302 + 302 302 + 302 1208 + 302 302 + 302 1208 + 302 1208 + 302 1208 + 302 1208 + 302 302 + 302 302 + 302 1208 + 302 1208 + 302 302 + 302 1208 + 302 1208 + 302 302 + 302 302 + 302 1208 + 302 302 + 302 1208 + 302 1208 + 302 302 + 302 1208 + 302 1208 + 302 302 + 302 1208 + 302 302 + 302 1208 + 302 302 + 302 302 + 302 1208 + 302 1208 + 302 1208 + 302 302 + 302 10268 + +There are several easily identifiable facts here: + +- ``320 960 320 960`` +- ``320 960 960 320`` + +#. The baseline is at 302 +#. The high Pulse is basline * 4 = 1208 +#. The last 2-pulse sequence is special, it's the footer of the message + +Using a translation pattern of **302 1208** → 1 and **302 302** → 0 we translate this sequence into the following pattern + +.. code-block::console + + 1100011110010111100101100101111001101100101101101010011101 + +Testing and some outside info reveals the following sections: + +.. code-block: console + + AAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCDDEEFFFFFFG + + A = Startbits/preamble + B = Address (32 Bit system code) + C = Group Code (Grouped: 1100, Non-Grouped: 1011) + D = Command, (On: 01, Off: 10) + E = Group Code 2 (Grouped: 11, Non Grouped: 01) + F = UnitCode + G = Stopbit + +So this code represents: + +- SystemCode: 3165844325 +- UnitCode: 28 +- State: Off +- UnitCode: NotSet + +The protocol filters out false positives by checking if: + +#. Every 1st pulse in groups of 2 is a low pulse +#. The last two pulses are 302 and 10268 (fixed footer) + +This is the readout from the writer's reference HE300 remote + ++----------+----------+--------------+------------+------------+ +| **Band** | **Code** | **UnitCode** | **GroupA** | **GroupB** | ++----------+----------+--------------+------------+------------+ +| I | 1 | 56 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| I | 2 | 52 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| I | 3 | 44 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| I | 4 | 28 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| II | 1 | 50 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| II | 2 | 42 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| II | 3 | 26 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| II | 4 | 38 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| III | 1 | 22 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| III | 2 | 14 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| III | 3 | 49 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| III | 4 | 41 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| IV | 1 | 25 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| IV | 2 | 37 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| IV | 3 | 21 | 13 | 2 | ++----------+----------+--------------+------------+------------+ +| IV | 4 | 13 | 13 | 2 | ++----------+----------+--------------+------------+------------+ + +This is translated: + +.. code-block:: console + + 1-1 11000111100 10111100101100101111001101100101 1011 10 01 000111 1 + 1-2 11000111100 10111100101100101111001101100101 1011 10 01 001011 1 + 1-3 11000111100 10111100101100101111001101100101 1011 10 01 001101 1 + 1-4 11000111100 10111100101100101111001101100101 1011 10 01 001110 1 + 2-1 11000111100 10111100101100101111001101100101 1011 10 01 010011 1 + 2-2 11000111100 10111100101100101111001101100101 1011 10 01 010101 1 + 2-3 11000111100 10111100101100101111001101100101 1011 10 01 010110 1 + 2-4 11000111100 10111100101100101111001101100101 1011 10 01 011001 1 + 3-1 11000111100 10111100101100101111001101100101 1011 10 01 011010 1 + 3-2 11000111100 10111100101100101111001101100101 1011 10 01 011100 1 + 3-3 11000111100 10111100101100101111001101100101 1011 10 01 100011 1 + 3-4 11000111100 10111100101100101111001101100101 1011 10 01 100101 1 + 4-1 11000111100 10111100101100101111001101100101 1011 10 01 100110 1 + 4-2 11000111100 10111100101100101111001101100101 1011 10 01 101001 1 + 4-3 11000111100 10111100101100101111001101100101 1011 10 01 101010 1 + 4-4 11000111100 10111100101100101111001101100101 1011 10 01 101100 1 + + G1 11000111100 10111100101100101111001101100101 1100 10 11 000111 1 + G2 11000111100 10111100101100101111001101100101 1100 10 11 000111 1 + G3 11000111100 10111100101100101111001101100101 1100 10 11 000111 1 + G4 11000111100 10111100101100101111001101100101 1100 10 11 000111 1 diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/elro_400.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/elro_400.rst new file mode 100644 index 0000000..f0df75e --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/elro_400.rst @@ -0,0 +1,154 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Elro HE (300 Series) +==================== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+------------------+ +| **Brand** | **Protocol** | ++----------------------+------------------+ +| Elro 400 Series | elro_400_switch | ++----------------------+------------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -s --systemcode=systemcode control a device with this systemcode + -u --unitcode=unitcode control a device with this unitcode + -t --on send an on signal + -f --off send an off signal + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "elro_400_switch" ], + "id": [{ + "systemcode": 31, + "unitcode": 0 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| systemcode | 0 - 31 | ++------------------+-----------------+ +| unitcode | 0 - 31 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Protocol + +This protocol sends 50 pulses like this + +.. code-block:: console + + 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 320 960 960 320 320 960 960 320 320 960 960 320 320 960 960 320 320 960 320 960 320 960 960 320 320 9920 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +.. code-block:: console + + 320 960 320 960 + 320 960 320 960 + 320 960 320 960 + 320 960 320 960 + 320 960 320 960 + 320 960 320 960 + 320 960 960 320 + 320 960 960 320 + 320 960 960 320 + 320 960 960 320 + 320 960 320 960 + 320 960 960 320 + 320 9920 + +If we now look at carefully at these groups you can distinguish two types of groups: + +- ``320 960 320 960`` +- ``320 960 960 320`` + +So the first group is defined by a high 4th pulse and the second group has a low 4th pulse. In this case we say a high 4th pulse means a 0 and a low 4th pulse means a 1. We then get the following output: + +.. code-block::console + + 00000 01111 0 1 + +Each (group) of numbers has a specific meaning: + +- SystemCode: 0 till 5 +- UnitCode: 6 till 10 +- State: 11 (inverse state) +- Check: 12 + +.. code-block: console + + 00000 01111 0 1 + +- The ``SystemCode`` is defined as a binary number +- The ``UnitCode`` is defined as a binary number +- The ``State`` defines whether a devices needs to be turned On or Off +- The ``Check`` defines whether a devices needs to be turned On or Off (but is inverse) + +So this code represents: + +- SystemCode: 31 (inversed) +- UnitCode: 1 (inversed) +- State: On (inverse state) +- Check: On + +Another example: + +- SystemCode: 0 (inversed) +- UnitCode: 4 (inversed) +- State: Off (inverse state) +- Check: Off + +.. code-block:: console + + 11111 11011 1 0 \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/elro_800.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/elro_800.rst new file mode 100644 index 0000000..0fd9015 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/elro_800.rst @@ -0,0 +1,4 @@ +Elro HE (800 Series) +==================== + +.. include:: _elro_800.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/eurodomest.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/eurodomest.rst new file mode 100644 index 0000000..5f6a9d0 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/eurodomest.rst @@ -0,0 +1,4 @@ +Eurodomest +========== + +.. include:: _kaku_old.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/impuls.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/impuls.rst new file mode 100644 index 0000000..a78d830 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/impuls.rst @@ -0,0 +1,178 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Impuls +====== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+------------------+ +| **Brand** | **Protocol** | ++----------------------+------------------+ +| Impuls | impuls | ++----------------------+------------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -s --systemcode=systemcode control a device with this systemcode + -u --programcode=programcode control a device with this programcode + -t --on send an on signal + -f --off send an off signal + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "impuls" ], + "id": [{ + "programcode": 8, + "unitcode": 12 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| systemcode | 0 - 31 | ++------------------+-----------------+ +| unitcode | 0 - 31 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Notes + +The default settings for a set of Impuls switches are: + +#. SystemCode: 11111 and ProgramCode: 10000 +#. ProgramCode: 01000 +#. ProgramCode: 00100 + +This translates into the following pilight systemcode and unitcode: + +#. systemcode: 31, programcode: 1 +#. systemcode: 31, programcode: 2 +#. systemcode: 31, programcode: 4 + +.. rubric:: Protocol + +This protocol sends 50 pulses like this + +.. code-block:: console + + 885 295 885 295 885 295 885 295 885 295 885 295 295 885 885 295 295 885 885 295 295 885 295 885 295 885 885 295 295 885 295 885 295 885 885 295 295 885 885 295 295 885 885 295 295 885 295 885 295 9735 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +.. code-block:: console + + 885 295 885 295 + 885 295 885 295 + 885 295 885 295 + 295 885 885 295 + 295 885 885 295 + + 295 885 295 885 + 295 885 885 295 + 295 885 295 885 + 295 885 885 295 + 295 885 885 295 + + 295 885 885 295 + 295 885 295 885 + + 295 9735 + +If we now look at carefully at these groups you can distinguish three types of groups: + +#. ``295 885 295 885`` +#. ``885 295 885 295`` +#. ``295 885 885 295`` + +- The first group is defined by a low 1th and low 3rd pulse pulse, hence we call it low. +- The second group has a high 1st and 3rd pulse, hence we call it med. +- The final group has a low 1st and high 3rd pulse, hence we call it high. + +We then get the following output: + +.. code-block:: console + + MMMHH LHLHH H L + +All M's and H's can be translated to 1. All L's can be translated to 0. + +Each (group) of numbers has a specific meaning: + +- Unit: 0 till 5 +- ID: 6 till 10 +- Check: 11 (inverse state) +- State: 12 (state) + +.. code-block:: console + + 11100 10100 1 0 + +- The ``SystemCode`` is defined as a binary number +- The ``ProgramCode`` is defined as a binary number +- The ``Check`` is always inverse state +- The ``State`` defines whether a devices needs to be turned On or Off + +So this code represents: + +- SystemCode: 7 +- ProgramCode: 5 +- Check: Inverse state +- State: Off + +Another example: + +- Unit: 0 +- ID: 4 +- Fixed: Inverse state +- State: On + +.. code-block:: console + + 00000 00100 0 1 \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/index.rst new file mode 100644 index 0000000..b060e93 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/index.rst @@ -0,0 +1,32 @@ +Switches +======== + +.. toctree:: + :maxdepth: 1 + + beamish + brennenstuhl + byebyestandby + clarus + cleverwatts + coco + cogex + dio + duwi + elro_300 + elro_400 + elro_800 + eurodomest + quigg_1000 + quigg_7000 + impuls + intertechno + intertechno_old + kaku_old + kaku + nexa + rsl366 + selectremote + silvercrest + techlico + x10 \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/intertechno.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/intertechno.rst new file mode 100644 index 0000000..c28f3c5 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/intertechno.rst @@ -0,0 +1,4 @@ +Intertechno +=========== + +.. include:: _kaku.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/intertechno_old.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/intertechno_old.rst new file mode 100644 index 0000000..afc9764 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/intertechno_old.rst @@ -0,0 +1,4 @@ +Intertechno (Old Version) +========================= + +.. include:: _kaku_old.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/kaku.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/kaku.rst new file mode 100644 index 0000000..82b17cf --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/kaku.rst @@ -0,0 +1,4 @@ +KlikAanKlikUit +============== + +.. include:: _kaku.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/kaku_old.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/kaku_old.rst new file mode 100644 index 0000000..f8f058f --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/kaku_old.rst @@ -0,0 +1,4 @@ +KlikAanKlikUit (Old Version) +============================ + +.. include:: _kaku_old.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/nexa.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/nexa.rst new file mode 100644 index 0000000..39e3c38 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/nexa.rst @@ -0,0 +1,4 @@ +Nexa +==== + +.. include:: _kaku.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/quigg_1000.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/quigg_1000.rst new file mode 100644 index 0000000..4bd7711 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/quigg_1000.rst @@ -0,0 +1,119 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Globaltronics Quigg GT-1000 +=========================== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++-------------------------------+---------------+ +| **Brand** | **Protocol** | ++-------------------------------+---------------+ +| Globaltronics GmbH GT-1000 RC | quigg_gt1000 | ++-------------------------------+---------------+ +| Globaltronics GmbH GT-FSI-08 | quigg_gt1000 | ++-------------------------------+---------------+ +| Silvercrest AAA3680-A IP20 DE | quigg_gt1000 | ++-------------------------------+---------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -t send an on signal to a device + -f send an off signal to a device + -i control the device with this system id (1 ... 15) + -u control the device with this unit code (0 ... 3) + -a control all switches in the given group + -s control all switches in all groups + + The next two parameters are optional: + + -n specify the code sequence to use (0 ... 3) + -s specify the super codes (0 ... 7) + + If the specified sequence does not exists, sequence 0 will be used instead. + If not specified a sequence will be selected at random. + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "quigg_gt1000" ], + "id": [{ + "id": 15, + "unit": 0 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 15 | ++------------------+-----------------+ +| unit | 0 - 3 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Examples + +.. code-block:: console + + pilight-send -p quigg_gt1000 -i [0..15] -u [0..3] [-t|-f] {-n [0..3]} + +Switch on or off the specified switch (-u) belonging to group (-i) optionally using specified codeseq (-n) + +.. code-block:: console + + pilight-send -p quigg_gt1000 -i [0..15] -a [-t|-f] {-n [0..3]} + +Switch on or off all switches belonging to group (-i) optionally using specified codeseq (-n) + +.. code-block:: console + + pilight-send -p quigg_gt1000 -s [-t|-f] {-n [0..7]} + +Switch on or off all compatible switches optionally using specified codeseq (-n) + +When using the Web-GUI use "unit": 4 in the config.json file for the master switch ("all": 1) and "id”: 16 with "unit”: 5 for the super code switch ("super”: 1). diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/quigg_7000.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/quigg_7000.rst new file mode 100644 index 0000000..795deb2 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/quigg_7000.rst @@ -0,0 +1,232 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Globaltronics Quigg GT-7000 +=========================== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++-------------------------------+---------------+ +| **Brand** | **Protocol** | ++-------------------------------+---------------+ +| Aldi Quigg GT-7000 | quigg_gt7000 | ++-------------------------------+---------------+ +| Globaltronics GT-7000 | quigg_gt7000 | ++-------------------------------+---------------+ +| Globaltronics GT-8000 | quigg_gt7000 | ++-------------------------------+---------------+ +| Globaltronics GT-FSI-02 | quigg_gt7000 | ++-------------------------------+---------------+ +| Globaltronics GT-FSI-04a | quigg_gt7000 | ++-------------------------------+---------------+ +| Globaltronics GT-FSI-05 | quigg_gt7000 | ++-------------------------------+---------------+ +| Globaltronics GT-FSI-05d | quigg_gt7000 | ++-------------------------------+---------------+ +| Globaltronics 7008AS | quigg_gt7000 | ++-------------------------------+---------------+ +| Conrad RC-710 | quigg_gt7000 | ++-------------------------------+---------------+ +| Globaltronics GT-FSI-05 | quigg_gt7000 | ++-------------------------------+---------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -t --on send an on signal to a device + -f --off send an off signal to a device + -i --id=id control the device with this system id (1 ... 4095) + -u --unit=unit control the device with this unit code (0 ... 3) + -a --all send command to all device units belonging to this system id + -l --learn send multiple streams so switch can learn + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "quigg_gt7000" ], + "id": [{ + "id": 15, + "unit": 0 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 1 - 4095 | ++------------------+-----------------+ +| unit | 1 - 3 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. versionchanged:: 8.0 Allow ID 0 + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 4095 | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+-------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+-------------------------------------------------+ +| all | 0 | 1 or 0 | | If specified this will trigger the "group" | +| | | | | function of the advanced remotes and trigger | +| | | | | all registered devices for the given unitcode | ++--------------------+-------------+------------+-------------------------------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Protocol + +The quigg_switch protocol sends 42 pulses like this + +.. code-block:: console + + 700 1400 700 700 1400 1400 700 1400 700 700 1400 700 1400 700 1400 700 1400 700 1400 700 1400 700 1400 700 1400 700 1400 700 1400 700 1400 1400 700 700 1400 700 1400 700 1400 1400 700 81000 + +The first pulse is the ``header`` and the last pulse is the ``footer``. These are meant to identify the pulses as genuine. We don't use them for further processing. The next step is to transform this output into 20 groups of 2 pulses (and thereby dropping the ``header`` and ``footer`` pulse). + +.. code-block:: console + + 1400 700 + 700 1400 + 1400 700 + 1400 700 + 700 1400 + 700 1400 + 700 1400 + 700 1400 + 700 1400 + 700 1400 + 700 1400 + 700 1400 + 700 1400 + 700 1400 + 700 1400 + 1400 700 + 700 1400 + 700 1400 + 700 1400 + 1400 700 + +If we now analyse these groups we can distinguish two types of groups: + +#. ``700 1400`` +#. ``1400 700`` + +So the first group is defined by a short 1st and 2nd long and the second group by a long 1st and 2nd short pulse. So we take either of these two pulses to define a logical 0 or 1. In our case a long 1st pulse means a 1 and a short 1st pulse means a 0. We then get the following output: + +.. code-block:: console + + 10110000000000010001 + +We can group the sequence of bits into the following groups A to H: + +.. code-block:: console + + AAAAAAAAAAAA BB C D E F G H + 101100000000 00 0 1 0 0 0 1 + +Each of the groups of bits (A to H) has a specific meaning: + ++-----------+-----------+-----------------+------------+-----------------------------+ +| **Group** | **Bit #** | **Config name** | **Range** | **Description** | ++-----------+-----------+-----------------+------------+-----------------------------+ +| A | 1 to 12 | id | 1 to 4095 | SystemCode | ++-----------+-----------+-----------------+------------+-----------------------------+ +| B | 13, 14 | unit | 1 to 3 | UnitCode | ++-----------+-----------+-----------------+------------+-----------------------------+ +| C | 15 | id | 1 | Command to all devices | ++-----------+-----------+-----------------+------------+-----------------------------+ +| D | 16 | all | 0,1 | Switch ON or OFF | ++ + + + + Dimmer DOWN or UP + +| | | | | | ++-----------+-----------+-----------------+------------+-----------------------------+ +| E | 17 | dimm | 0,1 | switch, dimmer mode | ++-----------+-----------+-----------------+------------+-----------------------------+ +| F | 18 | | 0 | always zero | ++-----------+-----------+-----------------+------------+-----------------------------+ +| G | 19 | | 0,1 | internal, handled by driver | ++-----------+-----------+-----------------+------------+-----------------------------+ +| H | 20 | | 0,1 | even parity bit | ++-----------+-----------+-----------------+------------+-----------------------------+ + +So this code represents: + +.. code-block:: console + + "id": 2816, + "unit": 1 + "state": Off + +.. rubric:: Examples + +CLI command: + +.. code-block:: console + + pilight-send -p quigg_gt7000 -i 2816 -u 1 -f + +.. rubric:: Comment + +Extracting the system code id from an existing Globaltronics GT-7000 remote control device either requires a special version of the BPF, or you need to bypass the BPF. + +After insertion of batteries the GT-7000 defaults to system code id #2816. Pressing the button "Neuer Code" located in the battery compartment, will trigger the generation of a new system code id. These are generated in sequential order, for the current quigg_switch protocol driver the id's are: + +.. code-block:: console + + 2816, 1792, 3840, 128, 2176, 1152, 3200, 640, 2688, 1664, 3712, 384, 2432, 1408, 3456, 896, 2944, 1920, 3968, .... + +To let the device learn a new value, press the learning mode button on the switch and send the appropriate CLI command with pilight-send (configure a switch to be unit #2 and system code id #29): + +.. code-block:: console + + pilight-send -p quigg_gt7000 -i 29 -u 2 -l -t + +The device learns that it has now system code id #29 and that it is unit #2 and enters ON mode (e.q. the switch is turned on). If the switch is not connected to power for an extended period of time, it will loose its configuration and reset to the default id #2816 unit #0. QUIGG_GT7000 compatible switches with integrated dimmer require that you configure the quigg_screen protocol in addition to the quigg_gt7000 protocol. On the webgui you will get a separate button to dimm the device up and down. + +Subsequently the switch unit #1 with system code id #2816 is turned off. \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/rsl366.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/rsl366.rst new file mode 100644 index 0000000..c9a8f56 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/rsl366.rst @@ -0,0 +1,4 @@ +RSL366 +====== + +.. include:: _rsl366.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/selectremote.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/selectremote.rst new file mode 100644 index 0000000..766e4d8 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/selectremote.rst @@ -0,0 +1,138 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +SelectRemote +============ + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+------------------+ +| **Brand** | **Protocol** | ++----------------------+------------------+ +| SelectRemote | selectremote | ++----------------------+------------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -i --id=id control a device with this id + -t --on send an on signal + -f --off send an off signal + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "selectremote" ], + "id": [{ + "id": 4 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 7 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Protocol + +This protocol sends 50 pulses like this + +.. code-block:: console + + 396 1188 396 1188 1188 396 1188 396 1188 396 1188 396 1188 396 1188 396 396 1188 396 1188 396 1188 396 1188 396 1188 396 1188 396 1188 396 1188 396 1188 396 1188 396 1188 396 1188 396 1188 396 1188 396 1188 396 1188 396 13464 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +.. code-block:: console + + 390 1170 1170 390 + 390 1170 1170 390 + 390 1170 1170 390 + 390 1170 390 1170 + + 390 1170 390 1170 + 390 1170 1170 390 + 390 1170 1170 390 + 390 1170 1170 390 + + 390 1170 1170 390 + 390 1170 1170 390 + 390 1170 1170 390 + + 390 1170 1170 390 + +If we now look at carefully at these groups you can distinguish three types of groups: + +- ``396 1188 396 1188`` +- ``1188 396 1188 396`` + +#. The first group is defined by a low 1th and low 3rd pulse pulse, hence we call it low. +#. The second group has a high 1st and 3rd pulse, hence we call it high. + +We then get the following output: + +.. code-block:: console + + 011100000000 + +Each (group) of numbers has a specific meaning: + +- ID: 1 till 3 +- State: 8 (state) + +.. code-block:: console + + x 111 xxxx 0 xxx + +- The ``ID`` is defined as a binary number. To calculate the ID we subtract the binary represented decimal from 7. In this case the binary ``111`` is equal to the decimal 7. That means this code represents ID 0. +- The ``State`` defines whether a devices needs to be turned On or Off + +So this code represents: + +- SystemCode: 0 +- State: Off \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/silvercrest.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/silvercrest.rst new file mode 100644 index 0000000..132a600 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/silvercrest.rst @@ -0,0 +1,146 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +SilverCrest +=========== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+------------------+ +| **Brand** | **Protocol** | ++----------------------+------------------+ +| Silvercrest | silvercrest | ++----------------------+------------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -t --on send an on signal + -f --off send an off signal + -u --unit=unit control a device with this unit code + -i --id=id control a device with this id + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "silvercrest" ], + "id": [{ + "systemcode": 22, + "unitcode": 0 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| systemcode | 0 - 31 | ++------------------+-----------------+ +| unitcode | 0 - 31 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Protocol + +This protocol sends 50 pulses like this + +.. code-block:: console + + 312 936 936 312 312 936 312 936 312 936 312 936 312 936 936 312 312 936 312 936 312 936 936 312 312 936 312 936 312 936 936 312 312 936 936 312 312 936 936 312 312 936 936 312 312 936 312 936 312 10608 + +It has no ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine, and the protocol also has some bit checks to filter false positives. We don't use them for further processing. The next step is to transform this output into 12 groups of 4 pulses (and thereby dropping the ``footer`` pulses). + +.. code-block:: console + + 312 936 936 312 + 312 936 312 936 + 312 936 312 936 + 312 936 936 312 + 312 936 312 936 + + 312 936 936 312 + 312 936 312 936 + 312 936 936 312 + 312 936 936 312 + 312 936 936 312 + + 312 936 936 312 + 312 936 312 936 + + 312 10608 + +If we now look at carefully at these groups you can distinguish three types of groups: + +- ``312 936 936 312`` +- ``312 936 312 936`` + +So the first group is defined by a high 3th pulse and the second group has a low 3rd pulse. In this case we say a high 3rd pulse means a 0 and a high 3rd pulse means a 1. We then get the following output: + +.. code-block:: console + + 01101 01000 01 + +Each (group) of numbers has a specific meaning: + +- Unit: 0 till 5 (inversed) +- ID: 6 till 10 (inversed) +- Check: 11 (inverse of state) +- State: 12 (inversed) + +.. code-block:: console + + 10110 00010 0 0 + +- The ``Unit`` is defined as a binary number +- The ``ID`` is defined as a binary number +- The ``Check`` is always the inverse of the state +- The ``State`` defines whether a devices needs to be turned On or Off + +So this code represents: + +- Unit: 22 +- ID: 2 +- Fixed: Off +- State: On diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/techlico.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/techlico.rst new file mode 100644 index 0000000..0fff42b --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/techlico.rst @@ -0,0 +1,190 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +TechLiCo +======== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+------------------+ +| **Brand** | **Protocol** | ++----------------------+------------------+ +| TechLiCo | techlico_switch | ++----------------------+------------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -t --on send a toggle state signal to the device + -f --off send a toggle state signal to the device + -i --id=id control the device with this system id (1 ... 65535) + -u --unit=unit control the device with this unit code (1 ... 4) + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "techlico_switch" ], + "id": [{ + "id": 4935, + "unit": 1 + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 1 - 65535 | ++------------------+-----------------+ +| unit | 1 - 4 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Protocol + +The techlico_switch protocol sends 50 pulses like this + +.. code-block:: console + + 208 624 208 832 208 624 624 208 208 624 208 624 624 208 624 208 208 832 624 208 208 832 208 624 208 832 624 208 624 208 624 208 208 832 208 624 208 832 208 832 208 624 208 624 624 208 624 208 208 7072 + +The last two pulses are the ``footer``. These are meant to identify the pulses as genuine. We don't use them for further processing. The next step is to transform this output into 24 groups of 2 pulses (and thereby dropping the ``footer`` pulse). + +.. code-block:: console + + 208 624 + 208 832 + 208 624 + 624 208 + 208 624 + 208 624 + 624 208 + 624 208 + 208 832 + 624 208 + 208 832 + 208 624 + 208 832 + 624 208 + 624 208 + 624 208 + 208 832 + 208 624 + 208 832 + 208 832 + 208 624 + 208 624 + 624 208 + 624 208 + 208 7072 + +If we now analyse these groups we can distinguish two types of groups: + +- ``208 624`` +- ``624 208`` + +The 1st group is defined by a short-long sequence (logical 0) The 2nd group is defined by a long-short sequence (logical 1): + +Binary representation: + +.. code-block:: console + + 000100110100011100000011 + +We can group the sequence of bits into the following groups A and B: + +.. code-block:: console + + AAAAAAAAAAAAAAAA BBBB BBBB + 0001001101000111 0000 0011 + +Each of the groups of bits (A and B) has a specific meaning: + ++-----------+-----------+-----------------+------------+-----------------+ +| **Group** | **Bit #** | **Config name** | **Range** | **Description** | ++-----------+-----------+-----------------+------------+-----------------+ +| A | 1 to 16 | id: | 1 to 65535 | SystemCode id | ++-----------+-----------+-----------------+------------+-----------------+ +| B | 17 to 24 | unit: | 1 to 4 | ButtonCode unit | ++-----------+-----------+-----------------+------------+-----------------+ + +The protocol driver creates the binary presentation as required by the device + ++-----------+------------------------------------+ +| 0000 0011 | -u 1 Button A Toogle device status | ++-----------+------------------------------------+ +| 1100 0000 | -u 2 Button B Toogle device status | ++-----------+------------------------------------+ +| 0000 1111 | -u 3 Button C Toogle device status | ++-----------+------------------------------------+ +| 0000 1100 | -u 4 Button D Toogle device status | ++-----------+------------------------------------+ + +So this code represents: + +.. code-block:: console + + { + "code": { + "id": 4935, + "unit": 1 + }, + "origin": "receiver", + "protocol": "techlico_switch", + "uuid": "0000-00-00-00-000000", + "repeats": 2 + } + +.. rubric:: Examples + +CLI command: + +.. code-block:: console + + pilight-send -p techlico_switch -i 4935 -u 1 + +.. rubric:: Known Limitations + +As the device will not report its state, and the same Button on the original remote control toggles the state of the device, the GUI may show the wrong status of the device. \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/x10.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/x10.rst new file mode 100644 index 0000000..f0981de --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/switch/x10.rst @@ -0,0 +1,79 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +X10 +=== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +.. code-block:: console + :linenos: + + -i --id=id control a device with this id + -t --on send an on signal + -f --off send an off signal + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "x10" ], + "id": [{ + "id": "A2" + }], + "state": "off" + } + }, + "gui": { + "Lamp": { + "name": "TV Backlit", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | A0 - P16 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| readonly | 1 | 1 or 0 | Disable controlling this device from the GUIs | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| confirm | 1 | 1 or 0 | Ask for confirmation when switching device | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Protocol + +A good description on this protocol can be found in this document `x10 `_ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_alecto_ws1700.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_alecto_ws1700.rst new file mode 100644 index 0000000..4873a9c --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_alecto_ws1700.rst @@ -0,0 +1,172 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+--------------+ +| **Brand** | **Protocol** | ++------------------+--------------+ +| Alecto WSD17 | alecto_wsd17 | ++------------------+--------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "weather": { + "protocol": [ "alecto_wsd17" ], + "id": [{ + "id": 100 + }], + "temperature": 23.00 + } + }, + "gui": { + "weather": { + "name": "Weather Station", + "group": [ "Outside" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 9 | ++------------------+-----------------+ +| temperature | -50 - 70 | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+---------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+---------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+---------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 2 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-humidity | 1 | 1 or 0 | Don't display the humidity value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-battery | 1 | 1 or 0 | Don't display the battery value | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Comment + +This weather station or just the sensor is available from several (mostly Chinese) suppliers on eBay or Alibaba. Description for device is usually like: “Digital Wireless Indoor/Outdoor Weather Station with 3 Remote Sensors”. The sensor can be identified by the option to choose from 3 different channels. + +Please be aware that the ID of a sensor changes after you replace the batteries. + +.. rubric:: Protocol + +The protocol sends 74 pulses like: + +.. code-block:: guess + + 540 1890 540 3780 540 1890 540 3780 540 3780 540 3780 540 3780 540 3780 540 1890 540 1890 540 3780 540 3780 540 3780 540 1890 540 1890 540 1890 540 1890 540 1890 540 1890 540 1890 540 3780 540 3780 540 1890 540 1890 540 4050 540 1890 540 4050 540 4050 540 1890 540 1890 540 4050 540 1890 540 3780 540 1890 540 3780 540 3780 540 9180 + +There first 8 pulses are the header and the last 2 pulses are the footer. These are meant to identify the pulses as genuine. We don't it for further processing. The next step is to transform this output into 36 groups of 2 pulses (and thereby dropping the footer pulses). + +.. code-block:: guess + + 540 1890 + 540 3780 + 540 1890 + 540 3780 + 540 3780 + 540 3780 + 540 3780 + 540 3780 + 540 1890 + 540 1890 + 540 3780 + 540 3780 + 540 3780 + 540 1890 + 540 1890 + 540 1890 + 540 1890 + 540 1890 + 540 1890 + 540 1890 + 540 3780 + 540 3780 + 540 1890 + 540 1890 + 540 4050 + 540 1890 + 540 4050 + 540 4050 + 540 1890 + 540 1890 + 540 4050 + 540 1890 + 540 3780 + 540 1890 + 540 3780 + 540 3780 + +If we now look at carefully at these groups you can distinguish two types of groups: + +#. ``540 1890`` +#. ``540 3780`` + +So the first group is defined by a low 2nd, the second group has a high 2nd pulse. So we take either of these two pulses to define a 0 or a 1. In this case we say a high 2nd pulse means a 1 and a low 2nd pulse means a 0. We then get the following output: + +.. code-block:: guess + + 010111110011000000011001011001010111 + +Each (group) of numbers has a specific meaning: + +- Header 0 till 3 +- ID: 4 till 11 +- Battery: 12 +- TX mode: 13 +- Channel: 14 till 15 +- Temperature: 16 till 27 +- Humidity: 28 till 35 + +.. code-block:: guess + + 0101 11110011 0 0 00 000110010110 01010111 + +- The ID is defined as a binary number +- The Battery identifies the state of the battery +- The TX mode defines whether the signal was sent automatic or manual +- The Channel is defined as a binary number and specifies which channel the sensor uses +- The Temperature is defined as a binary number and represents the temperature +- The Humidity is defined as a binary number and represents the humidity + +This protocol was created for pilight with the help of this thread: http://forum.pilight.org/Thread-Fully-Supported-No-brand-temp-humidity-sensor \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_alecto_wx500.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_alecto_wx500.rst new file mode 100644 index 0000000..29ffe59 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_alecto_wx500.rst @@ -0,0 +1,114 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+------------------+ +| **Brand** | **Protocol** | ++------------------+------------------+ +| Alecto WX500 | alecto_wx500 | ++------------------+------------------+ +| Auriol H13726 | auriol_h13726 | ++------------------+------------------+ +| Hama EWS1500 | hama_ews1500 | ++------------------+------------------+ +| Meteoscan W1XXX | meteoscan_w1XX | ++------------------+------------------+ +| Balance RF-WS105 | balance_rf_ws105 | ++------------------+------------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "weather": { + "protocol": [ "alecto_wsd17" ], + "id": [{ + "id": 100 + }], + "temperature": 18.90, + "humidity": 41.00, + "windavg": 10.00, + "winddir": 90.00, + "windgust": 20.00, + "battery": 1 + } + }, + "gui": { + "weather": { + "name": "Weather Station", + "group": [ "Outside" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 9 | ++------------------+-----------------+ +| temperature | -40 - 60 | ++------------------+-----------------+ +| humidity | 10 - 99 | ++------------------+-----------------+ +| windavg | 0 - 50 | ++------------------+-----------------+ +| windavg | 0 - 359 | ++------------------+-----------------+ +| windgust | 0 - 50 | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+---------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+---------------------------+ +| humidity-offset | 0 | number | Correct humidity value | ++--------------------+-------------+------------+---------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+---------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 2 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| humidity-decimals | 2 | number | How many decimals the GUIs should display for humidity | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-humidity | 1 | 1 or 0 | Don't display the humidity value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-wind | 1 | 1 or 0 | Don't display the wind value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-battery | 1 | 1 or 0 | Don't display the battery value | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Protocol + +A good description on this protocol can be found in `this `_ PDF. diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_conrad.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_conrad.rst new file mode 100644 index 0000000..1ea7c45 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_conrad.rst @@ -0,0 +1,205 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++-----------------------+----------------+ +| **Brand** | **Protocol** | ++-----------------------+----------------+ +| Soens Weather Station | soens | ++-----------------------+----------------+ +| TFA | tfa | ++-----------------------+----------------+ +| Conrad | conrad_weather | ++-----------------------+----------------+ + + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "weather": { + "protocol": [ "tfa" ], + "id": [{ + "id": 108, + "channel": 3 + }], + "temperature": 18.90, + "humidity": 41.00, + "battery": 1 + } + }, + "gui": { + "weather": { + "name": "Weather Station", + "group": [ "Outside" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 9 | ++------------------+-----------------+ +| temperature | -39.9 - 59.9 | ++------------------+-----------------+ +| humidity | 10 - 99 | ++------------------+-----------------+ +| battery | 0 - 1 | ++------------------+-----------------+ + +.. note:: **Conrad** + + This sensor does not support humidity measurements + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+---------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+---------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+---------------------------+ +| humidity-offset | 0 | number | Correct humidity value | ++--------------------+-------------+------------+---------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 2 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| humidity-decimals | 2 | number | How many decimals the GUIs should display for humidity | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-humidity | 1 | 1 or 0 | Don't display the humidity value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-battery | 1 | 1 or 0 | Don't display the battery value | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Protocol + +The tfa protocol sends 86 pulses like + +.. code-block:: guess + + 498 1992 498 1992 498 1992 498 1992 498 1992 498 4233 498 4233 498 1992 498 1992 498 2241 498 1992 498 1992 498 2241 498 2241 498 1992 498 1992 498 4233 498 2241 498 2241 498 1992 498 1992 498 4482 498 1992 498 4233 498 4233 498 2241 498 4482 498 1992 498 1992 498 4233 498 1992 498 1992 498 4233 498 4233 498 1992 498 1992 498 1992 498 2241 498 2241 498 1992 498 4233 498 2241 498 8466 + +The next step is to transform this output into groups of 2 pulses. + +.. code-block:: guess + + 498 1992 + 498 1992 + 498 1992 + 498 1992 + 498 1992 + 498 4233 + 498 4233 + 498 1992 + 498 1992 + 498 2241 + 498 1992 + 498 1992 + 498 2241 + 498 2241 + 498 1992 + 498 1992 + 498 4233 + 498 2241 + 498 2241 + 498 1992 + 498 1992 + 498 4482 + 498 1992 + 498 4233 + 498 4233 + 498 2241 + 498 4482 + 498 1992 + 498 1992 + 498 4233 + 498 1992 + 498 1992 + 498 4233 + 498 4233 + 498 1992 + 498 1992 + 498 1992 + 498 2241 + 498 2241 + 498 1992 + 498 4233 + 498 2241 + 498 8466 + +If we now look at carefully at these groups you can distinguish two types of groups: + +#. ``498 1992`` +#. ``498 4233`` + +So the first group is defined by a low 2nd, the second group has a high 2nd pulse. So we take either of these two pulses to define a 0 or a 1. In this case we say a high 2nd pulse means a 1 and a low 2nd pulse means a 0. We then get the following output: + +.. code-block:: guess + + 000001100000000010000101101001001100000010 + +Each (group) of numbers has a specific meaning: + +- ID: 2 till 9 +- Channel: 12 till 13 +- Temperature: 14 till 25 +- Humidity: 26 till 33 +- Battery: 34 till 35 + +.. code-block:: guess + + ID : 00011000 | Channel : 00 | Temp : 011000010010 | Hum : 00111001 | Bat : 00 + +- The ID is defined as a binary number +- The Channel is defined as a binary number and specifies which channel the sensor uses +- The Temperature is defined as a binary number and represents the temperature (value is given in fahrenheit strating at -90°F). Assuming that the Temp binary value is AAAABBBBCCCC, the formula to calculate the temperature value in °C is + +.. code-block:: guess + + (((DEC(CCCC)*256) + (DEC(BBBB)*16) + (DEC(AAAA))/10) - 90 - 32) * (5/9) + +- The ``Humidity`` is defined as a binary number. Assuming that the Hum binary value is AAAABBBB, the formula to calculate the humidity percentage is DEC(BBBB)*16 + DEC(AAAA) +- The ``Battery`` identifies the state of the battery + +.. code-block:: guess + + ID : 24 | Channel : 1 | Temp : 18.56°C | Hum : 57% | Bat : OK + +This protocol was created for pilight with the help of this thread: http://forum.pilight.org/Thread-New-Protocol-Wireless-Indoor-Outdoor-Weather-Station-with-3-Sensors + +.. rubric:: Comments + +This weather station or just the sensor is available from several (mostly Chinese) suppliers on eBay or Alibaba. Description for device is usually like: “Digital Wireless Indoor/Outdoor Weather Station with 3 Remote Sensors”. The sensor can be identified by the option to choose from 3 different channels. + +Humidity and battery are supported by this protocol. The battery function is not tested 100%. Please be aware that the ID of a sensor changes after you replace the batteries. Conrad sensor only provide temperature (no humidity). diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_tfa30.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_tfa30.rst new file mode 100644 index 0000000..103ac8f --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/_tfa30.rst @@ -0,0 +1,227 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++-----------------------+----------------+ +| **Brand** | **Protocol** | ++-----------------------+----------------+ +| Dostmann TFA 30.3200 | tfa30 | ++-----------------------+----------------+ +| TFA30 | tfa30 | ++-----------------------+----------------+ + + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "weather": { + "protocol": [ "tfa30" ], + "id": [{ + "id": 228 + }], + "temperature": 18.90, + "humidity": 41.00 + } + }, + "gui": { + "weather": { + "name": "Weather Station", + "group": [ "Outside" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 255 | ++------------------+-----------------+ +| temperature | -39.9 - 59.9 | ++------------------+-----------------+ +| humidity | 10 - 99 | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+---------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+---------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+---------------------------+ +| humidity-offset | 0 | number | Correct humidity value | ++--------------------+-------------+------------+---------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 2 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| humidity-decimals | 2 | number | How many decimals the GUIs should display for humidity | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-humidity | 1 | 1 or 0 | Don't display the humidity value | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Protocol + +*After extensive testing it was detected that the Dostman TFA 30.3200 shares most parameters with the tfa and conrad weather station sensors, however due to the differences detected those are described in this document.* + +The protocol sends 88 pulses like: + +.. code-block:: guess + + 603 7630 601 1881 605 1897 610 3803 605 3811 651 3798 618 1884 600 1911 597 3806 599 1909 590 1930 595 1906 594 1905 591 1920 584 3804 593 3829 585 3808 600 1905 591 1937 602 3805 594 3809 599 3821 590 1903 595 1908 593 3826 586 1908 596 3837 597 3825 569 1918 594 3809 597 1911 594 1903 594 1909 591 3829 585 1926 592 1907 590 1972 531 1917 586 1911 607 1895 589 1952 556 3818 590 3811 594 7639 + +The next step is to transform this output into groups of 2 pulses. + +.. code-block:: guess + + 603 7630 + 601 1881 + 605 1897 + 610 3803 + 605 3811 + 651 3798 + 618 1884 + 600 1911 + 597 3806 + 599 1909 + 590 1930 + 595 1906 + 594 1905 + 591 1920 + 584 3804 + 593 3829 + 585 3808 + 600 1905 + 591 1937 + 602 3805 + 594 3809 + 599 3821 + 590 1903 + 595 1908 + 593 3826 + 586 1908 + 596 3837 + 597 3825 + 569 1918 + 594 3809 + 597 1911 + 594 1903 + 594 1909 + 591 3829 + 585 1926 + 592 1907 + 590 1972 + 531 1917 + 586 1911 + 607 1895 + 589 1952 + 556 3818 + 590 3811 + 594 7639 + +Analysing the pulsetrain, we can distinguish three types of groups: + +- The first group is defined by a short 2nd +- The second group has a long 2nd pulse. +- The third group has an extended long 2nd pulse, this 3rd group forms the header and the footer pulse group. + +The duration of the pulses varies between manufacturers. + +**Dostmann TFA 30.3200** + +#. ``605 1905`` +#. ``605 3811`` +#. ``594 7639`` + +Length of pulsetrain is 88. + +**TFA30 and conrad_weather** + +#. ``498 1992`` +#. ``498 4233`` +#. ``498 8466`` + +Length of pulsetrain is 80 or 86. + +It is currently unknown wether the ``tfa`` and the ``conrad weather pro`` are using identical protocols or not, due to discrepencies in the documentation. The current version of the tfa protocol module can handle both variants using the tfa30 protocol. The differentiation is analysing the header information and the length of the pulsetrain automatically. + +We take either of the two other pulse groups to define a logical 0 or a 1. A long 2nd pulse means a 1 and a short 2nd pulse means a 0. + +For the above pulsetrain we get the following binary output: + +.. code-block:: console + + MSB--LSB AAAABBBBCCCC AAAABBBB + 00 11100100 0 001 110011100101 10100010 0 0 000011 + +Each (group) of numbers has a specific meaning: + +**Dostmann TFA 30.3200** + +- unknown: 0 till 1 +- ID: 2 till 9 +- unknown: 10 +- Channel: 11 till 13 +- Temperature: 14 till 25 +- Humidity: 26 till 33 +- Tx Button: 34 +- Battery low: 35 +- unknown: 36 till 41 + +**tfa30 and conrad_weather** + +- unknown: 0 till 1 +- ID: 2 till 9 +- Channel: 12 till 13 +- Temperature: 14 till 25 +- Humidity: 26 till 33 +- Battery: 34 till 35 +- unknown: 36 till 41 + +.. code-block:: console + + ID : 11100100 | Channel : 01 | Temp : 0101 1110 1100 | Hum : 00101010 | Bar : 00 + +- The ``ID`` is defined as a binary number +- The ``Temperature`` is defined as a binary number and represents the temperature in Fahrenheit, starting at -90°F). Assuming that the Temp binary value is AAAABBBBCCCC, the formula to calculate the temperature value in °C is + +.. code-block:: console + + ( ((DEC(CCCC)*256)+(DEC(BBBB)*16)+(DEC(AAAA)))/10 -90 -32) * (5/9) + +The ``Humidity`` is defined as a binary number. Assuming that the Hum binary value is AAAABBBB, the formula to calculate the humidity percentage is DEC(BBBB)*16 + DEC(AAAA) + +.. code-block:: console + + ID : 228 | Temp : 16.44°C | Hum : 42% + diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/alecto_ws1700.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/alecto_ws1700.rst new file mode 100644 index 0000000..04c31dc --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/alecto_ws1700.rst @@ -0,0 +1,4 @@ +Alecto WS1700 +============= + +.. include:: _alecto_ws1700.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/alecto_wsd17.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/alecto_wsd17.rst new file mode 100644 index 0000000..1d6d698 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/alecto_wsd17.rst @@ -0,0 +1,88 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Alecto WSD17 +============ + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+----------------+ +| **Brand** | **Protocol** | ++------------------+----------------+ +| Alecto WSD1700 | alecto_wsd1700 | ++------------------+----------------+ +| iBoutique | iboutique | ++------------------+----------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "weather": { + "protocol": [ "alecto_ws1700" ], + "id": [{ + "id": 108 + }], + "temperature": 18.90, + "humidity": 41.00, + "battery": 1 + } + }, + "gui": { + "weather": { + "name": "Weather Station", + "group": [ "Outside" ], + "media": [ "all" ] + } + } + } + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+---------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+---------------------------+ +| humidity-offset | 0 | number | Correct humidity value | ++--------------------+-------------+------------+---------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+---------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 2 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| humidity-decimals | 2 | number | How many decimals the GUIs should display for humidity | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Comment + +This protocol was created for pilight with the help of this document: http://www.tfd.hu/tfdhu/files/wsprotocol/auriol_protocol_v20.pdf + +Humidity and battery are not supported yet \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/alecto_wx500.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/alecto_wx500.rst new file mode 100644 index 0000000..32cc2cd --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/alecto_wx500.rst @@ -0,0 +1,4 @@ +Alecto WX500 +============ + +.. include:: _alecto_wx500.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/auriol_89210.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/auriol_89210.rst new file mode 100644 index 0000000..d83a129 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/auriol_89210.rst @@ -0,0 +1,128 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Auriol 89210 +============ + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+------------------+ +| **Brand** | **Protocol** | ++------------------+------------------+ +| Auriol | auriol | ++------------------+------------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "weather": { + "protocol": [ "auriol" ], + "id": [{ + "id": 3 + }], + "temperature": 18.90, + "humidity": 41.00, + "battery": 1 + } + }, + "gui": { + "weather": { + "name": "Weather Station", + "group": [ "Outside" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 9 | ++------------------+-----------------+ +| temperature | 0 - 50 | ++------------------+-----------------+ +| humidity | 20 - 99 | ++------------------+-----------------+ +| battery | 0 - 1 | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+---------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+---------------------------+ +| humidity-offset | 0 | number | Correct humidity value | ++--------------------+-------------+------------+---------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+---------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 2 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| humidity-decimals | 2 | number | How many decimals the GUIs should display for humidity | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-humidity | 1 | 1 or 0 | Don't display the humidity value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-battery | 1 | 1 or 0 | Don't display the battery value | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Comments + +This weather station was available at the Lidl. Description for device could be: “Auriol IAN 89210 FUNK-WEATHER STATION/RADIO CONTROLLED WEATHER”, Hama EWS-750 (not confirmed) and IAN 55982 (neither confirmed). The sensor can be identified by the option to choose from 3 different channels. + +Humidity and battery assumed to be supported by this protocol, but might not be. The battery function is not tested 100% and humidity seems to vary regularly. Please be aware that the ID of a sensor is actually the channel. + +.. rubric:: Protocol + +This protocol has similarities with the protocols alecto and threechan. + +Each (group of 2) numbers have the following specific meaning: + + - Battery ID 0 untill 7 (assumed) + - Battery: 8 + - TX mode: 9 + - Channel: 10 untill 11 (3 = 10, 2 = 01, 1 = 11) + - Temperature: 12 untill 23 + - Humidity: 24 untill 31 (assumed, alternatively this might be a checksum) + - Footer: 32 + - The Battery ID is not used + - The Battery identifies the state of the battery + - The TX mode defines whether the signal was sent automatically or manually + - The ID is defined as a binary number and specifies which channel the sensor uses + - The Temperature is defined as a binary number and represents the temperature + - The Humidity is defined as a binary number and represents the humidity (unconfirmed) + +.. rubric:: Checksum + +We need someone who is able to decipher the checksum and write a c snippet for it. + +This protocol was created for pilight with the help of pilight-debug. \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/auriol_h13726.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/auriol_h13726.rst new file mode 100644 index 0000000..7710090 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/auriol_h13726.rst @@ -0,0 +1,4 @@ +Auriol H12726 +============= + +.. include:: _alecto_wx500.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/conrad.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/conrad.rst new file mode 100644 index 0000000..792ff25 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/conrad.rst @@ -0,0 +1,4 @@ +Conrad +====== + +.. include:: _conrad.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/dostmann.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/dostmann.rst new file mode 100644 index 0000000..bf67cd6 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/dostmann.rst @@ -0,0 +1,7 @@ +Dostmann TFA 30.3200 +==================== + +.. versionchanged:: 8.0 + + +.. include:: _tfa30.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/hama_ews1500.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/hama_ews1500.rst new file mode 100644 index 0000000..f2e9d32 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/hama_ews1500.rst @@ -0,0 +1,4 @@ +Hama EWS1500 +============ + +.. include:: _alecto_wx500.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/iboutique.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/iboutique.rst new file mode 100644 index 0000000..5a2e107 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/iboutique.rst @@ -0,0 +1,4 @@ +iBoutique +========= + +.. include:: _alecto_ws1700.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/index.rst new file mode 100644 index 0000000..a506cdb --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/index.rst @@ -0,0 +1,23 @@ +Weather Stations +================ + +.. toctree:: + :maxdepth: 1 + + alecto_wsd17 + alecto_ws1700 + alecto_wx500 + auriol_89210 + auriol_h13726 + conrad + dostmann + hama_ews1500 + iboutique + kaku + meteoscan_w1xxx + ninja_blocks + soens + tcm + teknihall + tfa + ventus_wsxxx diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/kaku.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/kaku.rst new file mode 100644 index 0000000..76776dd --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/kaku.rst @@ -0,0 +1,152 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +KlikAanKlikUit (Dusk/Dawn) +========================== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++----------------------+--------------------+ +| **Brand** | **Protocol** | ++----------------------+--------------------+ +| KlikAanKlikUit | kaku_dusk | ++----------------------+--------------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "kaku_dusk" ], + "id": [{ + "id": 100, + "unit": 0 + }], + "state": "dusk" + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 67108863 | ++------------------+-----------------+ +| unit | 0 - 15 | ++------------------+-----------------+ +| state | dusk / dawn | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +*None* + +.. rubric:: Protocol + +This protocol sends 132 pulses like this + +.. code-block:: console + + 286 2825 286 201 289 1337 287 209 283 1351 287 204 289 1339 288 207 288 1341 289 207 281 1343 284 205 292 1346 282 212 283 1348 282 213 279 1352 282 211 281 1349 282 210 283 1347 284 211 288 1348 281 211 285 1353 278 213 280 1351 280 232 282 1356 279 213 285 1351 276 215 285 1348 277 216 278 1359 278 216 279 1353 272 214 283 1358 276 216 276 1351 278 214 284 1357 275 217 276 1353 270 217 277 1353 272 220 277 1351 275 220 272 1356 275 1353 273 224 277 236 282 1355 272 1353 273 233 273 222 268 1358 270 219 277 1361 274 218 280 1358 272 1355 271 243 251 11302 + +The first 2 pulses are the ``header`` and the last 2 pulses are the ``footer``. These are meant to identify the pulses as genuine. We don't use them for further processing. The next step is to transform this output into 32 groups of 4 pulses (and thereby dropping the ``header`` and ``footer`` pulses). + +.. code-block:: console + + 286 201 289 1337 + 287 209 283 1351 + 287 204 289 1339 + 288 207 288 1341 + 289 207 281 1343 + 284 205 292 1346 + 282 212 283 1348 + 282 213 279 1352 + 282 211 281 1349 + 282 210 283 1347 + 284 211 288 1348 + 281 211 285 1353 + 278 213 280 1351 + 280 232 282 1356 + 279 213 285 1351 + 276 215 285 1348 + 277 216 278 1359 + 278 216 279 1353 + 272 214 283 1358 + 276 216 276 1351 + 278 214 284 1357 + 275 217 276 1353 + 270 217 277 1353 + 272 220 277 1351 + 275 220 272 1356 + 275 1353 273 224 + 277 236 282 1355 + 272 1353 273 233 + 273 222 268 1358 + 270 219 277 1361 + 274 218 280 1358 + 272 1355 271 243 + +If we now look at carefully at these groups you can distinguish two types of groups: + +- ``272 1355 271 243`` +- ``274 218 280 1358`` + +So the first group is defined by a high 2nd and the second group has a high 4th pulse. So we take either of these two pulses to define a 0 or a 1. In this case we say a high 2nd pulse means a 1 and a low 2nd pulse means a 0. We then get the following output: + +.. code-block:: console + + 00000000000000000000000001010001 + +Each (group) of numbers has a specific meaning: + +- ID: 0 till 25(Convert the binary code to decimal to get the correct id) +- All: 26 +- State: 27 +- Unit: 28 till 31 + +.. code-block:: console + + 00000000000000000000000001 0 1 0001 + +- The ``ID`` is defined as a binary number +- The ``All`` tells us if a code was meant for all devices with the same ID +- The ``State`` defines whether a devices needs to be turned On or Off +- The ``Unit`` is also defined as a binary number + +So this code represents: + +- ID: 1 +- All: Single +- State: Dawn +- Unit: 1 + +Another example: + +- ID: 123456 +- All: All +- State: Dusk +- Unit: 15 + +.. code-block:: console + + 00000000011110001001000000101111 \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/meteoscan_w1xxx.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/meteoscan_w1xxx.rst new file mode 100644 index 0000000..eea1d69 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/meteoscan_w1xxx.rst @@ -0,0 +1,4 @@ +Meteoscan W1XXX +=============== + +.. include:: _alecto_wx500.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/ninja_blocks.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/ninja_blocks.rst new file mode 100644 index 0000000..d270eaa --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/ninja_blocks.rst @@ -0,0 +1,146 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Ninja Blocks Weather Sensor +=========================== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+---------------------+ +| **Brand** | **Protocol** | ++------------------+---------------------+ +| Ninja Blocks | ninjablocks_weather | ++------------------+---------------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "weather": { + "protocol": [ "ninjablocks_weather" ], + "id": [{ + "id": 1, + "unit": 1 + }], + "temperature": 18.90, + "humidity": 41.00 + } + }, + "gui": { + "weather": { + "name": "Weather Station", + "group": [ "Outside" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 3 | ++------------------+-----------------+ +| unit | 0 - 15 | ++------------------+-----------------+ +| temperature | -50 - 205.99 | ++------------------+-----------------+ +| humidity | 0 - 99 | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 2 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| humidity-decimals | 2 | number | How many decimals the GUIs should display for humidity | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-humidity | 1 | 1 or 0 | Don't display the humidity value | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Comments + +This weather station was available at the Lidl. Description for device could be: “Auriol IAN 89210 FUNK-WEATHER STATION/RADIO CONTROLLED WEATHER”, Hama EWS-750 (not confirmed) and IAN 55982 (neither confirmed). The sensor can be identified by the option to choose from 3 different channels. + +Humidity and battery assumed to be supported by this protocol, but might not be. The battery function is not tested 100% and humidity seems to vary regularly. Please be aware that the ID of a sensor is actually the channel. + +.. rubric:: Protocol + +The protocol sends 74 pulses like: + +.. code-block:: guess + + 1083 860 966 986 1970 1953 2083 1829 1927 1014 938 1978 1943 993 946 1003 953 1983 2056 877 934 1020 931 1070 884 2013 1893 1012 930 2008 923 1019 1995 1930 925 1026 978 985 1891 1052 907 1036 913 2031 901 1034 916 1067 1881 1988 971 1004 890 1060 754 72330 + +The pulse stream uses the “Bi-Phase Mark Code” (BMC) or Frequencey/Double Frequency (F2F) principle as defined in ISO/IEC7811. + +The first 6 pulses are the SYNC header and the last pulse is the footer. These are meant to identify the pulses as genuine. We check for their presence, an error in the first pulse of the header is tolerated, if the second sync pulse after the Unit code and the parity bit is correct, the length of the footer pulse is used to identify the protocol and as end of data transmission. + +The first step is to transform this pulse stream into 36 logical bits We can group the sequence of bits into the following groups A to H: + +.. code-block:: guess + + AAAA BBBB CC DDD EEEEEEE FFFFFFFFFFFFFFF G H + 1100 0001 00 110 0111001 010011011011001 1 F + +Each of the groups of bits (A to H) has a specific meaning: + ++-----------+-----------+-----------------+------------+----------------------------------------+ +| **Group** | **Bit #** | **Config name** | **Range** | **Description** | ++-----------+-----------+-----------------+------------+----------------------------------------+ +| A | 0-3 | 12 | SYNC Header | ++-----------+-----------+-----------------+------------+----------------------------------------+ +| B | 4-7 | unit | 0 to 15 | Unit Code | ++-----------+-----------+-----------------+------------+----------------------------------------+ +| C | 8-9 | id | 0 to 3 | Channel Code | ++-----------+-----------+-----------------+------------+----------------------------------------+ +| D | 10-12 | 110 | Sync Data | ++-----------+-----------+-----------------+------------+----------------------------------------+ +| E | 13-19 | humidity | 0 to 100 | Humidity in % | ++-----------+-----------+-----------------+------------+----------------------------------------+ +| F | 20-34 | temperature | 0 to 32767 | Temperature -50°C to 205,99°C | ++-----------+-----------+-----------------+------------+----------------------------------------+ +| G | 35 | 0,1 | Even Parity Bit | ++-----------+-----------+-----------------+------------+----------------------------------------+ +| H | 36 | Footer or gap pulse followed by Footer | ++-----------+-----------+-----------------+------------+----------------------------------------+ + +.. code-block:: console + + { + "code": { + "id": 0, + "unit": 1, + "temperature": 2769, + "humidity": 5700 + }, + "origin": "receiver", + "protocol": "ninjablocks_weather", + "uuid": "0000-00-00-b4-46a46b", + "repeats": 1 + } \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/soens.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/soens.rst new file mode 100644 index 0000000..b030a8d --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/soens.rst @@ -0,0 +1,4 @@ +Soens Weather Station +===================== + +.. include:: _conrad.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/tcm.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/tcm.rst new file mode 100644 index 0000000..4caf123 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/tcm.rst @@ -0,0 +1,187 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +TCM 218943 +========== + +.. versionadded:: 8.0 + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++-------------+----------------+ +| **Brand** | **Protocol** | ++-------------+----------------+ +| TCM 218943 | tcm | ++-------------+----------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "weather": { + "protocol": [ "tcm" ], + "id": [{ + "id": 104, + }], + "temperature": 22.70, + "humidity": 50.00, + "battery": 1 + } + }, + "gui": { + "weather": { + "name": "Weather Station", + "group": [ "Outside" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 255 | ++------------------+-----------------+ +| temperature | -39.9 - 59.9 | ++------------------+-----------------+ +| humidity | 0 - 99 | ++------------------+-----------------+ +| battery | 0 - 1 | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+---------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+---------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+---------------------------+ +| humidity-offset | 0 | number | Correct humidity value | ++--------------------+-------------+------------+---------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 2 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| humidity-decimals | 2 | number | How many decimals the GUIs should display for humidity | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-humidity | 1 | 1 or 0 | Don't display the humidity value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-battery | 1 | 1 or 0 | Don't display the battery value | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Protocol + +The tcm protocol sends 74 pulses like + +.. code-block:: guess + + 194 1035 194 1994 194 1994 194 1035 194 1994 194 1035 194 1035 194 1035 194 1035 194 1035 194 1035 194 1035 194 1035 194 1035 194 1035 194 1035 194 1035 194 1035 194 1994 194 1994 194 1035 194 1035 194 1994 194 1035 194 1035 194 1035 194 1035 194 1035 194 1994 194 1994 194 1994 194 1035 194 1035 194 1035 194 1994 194 1994 194 8037 + +The next step is to transform this output into groups of 2 pulses. + +.. code-block:: guess + + 194 1035 + 194 1994 + 194 1994 + 194 1035 + 194 1994 + 194 1035 + 194 1035 + 194 1035 + 194 1035 + 194 1035 + 194 1035 + 194 1035 + 194 1035 + 194 1035 + 194 1035 + 194 1035 + 194 1035 + 194 1035 + 194 1994 + 194 1994 + 194 1035 + 194 1035 + 194 1994 + 194 1035 + 194 1035 + 194 1035 + 194 1035 + 194 1035 + 194 1994 + 194 1994 + 194 1994 + 194 1035 + 194 1035 + 194 1035 + 194 1994 + 194 1994 + 194 8037 + +If we now look at carefully at these groups you can distinguish two types of groups: + +#. ``194 1035`` +#. ``194 1994`` + +So the first group is defined by a low 2nd, the second group has a high 2nd pulse. So we take either of these two pulses to define a 0 or a 1. In this case we say a high 2nd pulse means a 1 and a low 2nd pulse means a 0. We then get the following output: + +.. code-block:: guess + + 011010000000000000110010000011100011 + +Each (group) of numbers has a specific meaning: + +- ID: 1 till 8 +- Battery: 9 +- Button: 12 +- Humidity: 17 till 24 +- Temperature: 25 till 36 + +.. code-block:: guess + + ID : 01101000 | Bat : 0 | But : 0 | Hum : 00110010 | Temp : 000011100011 + +- The ID is defined as a binary number. +- The Battery indicates low battery with 1. +- The Button is 1, if the button on the sensor is pressed. +- The Temperature is a 12 bits wide 2's complement signed binary number represents the actual temperature value in 0.1 °C units. DEC(AAAAAAAAAAAA)/10 +- The Humidity is defined as a binary number. + +.. code-block:: guess + + ID : 104 | Bat : OK | But : not pressed | Hum : 50% | Temp : 22.7°C + +This protocol was created for pilight with the help of this thread: http://forum.arduino.cc/index.php?topic=136836.0 (german) + +.. rubric:: Comments + +Please be aware that the ID of a sensor changes after you replace the batteries. diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/teknihall.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/teknihall.rst new file mode 100644 index 0000000..d8ede27 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/teknihall.rst @@ -0,0 +1,185 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Teknihall GT-WT-02 +================== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++--------------------+------------------+ +| **Brand** | **Protocol** | ++--------------------+------------------+ +| Teknihall GT-WT-02 | teknihall | ++--------------------+------------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "weather": { + "protocol": [ "teknihall" ], + "id": [{ + "id": 108 + }], + "temperature": 18.90, + "humidity": 41.00, + "battery": 1 + } + }, + "gui": { + "weather": { + "name": "Weather Station", + "group": [ "Outside" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 3 | ++------------------+-----------------+ +| unit | 0 - 15 | ++------------------+-----------------+ +| temperature | -15 - 60 | ++------------------+-----------------+ +| humidity | 20 - 99 | ++------------------+-----------------+ +| battery | 0 - 1 | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+---------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+---------------------------+ +| humidity-offset | 0 | number | Correct humidity value | ++--------------------+-------------+------------+---------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+---------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 2 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| humidity-decimals | 2 | number | How many decimals the GUIs should display for humidity | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-humidity | 1 | 1 or 0 | Don't display the humidity value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-wind | 1 | 1 or 0 | Don't display the wind value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-battery | 1 | 1 or 0 | Don't display the battery value | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Comments + +This weather station is available at Aldi. Please be aware that there are several types of Teknihall weather stations and sensors available. Not all types might be compatible. + +Please be aware that the ID of a sensor could change after you replace the batteries. + +.. rubric:: Protocol + +The protocol sends 76 pulses like: + +.. code-block:: guess + + 532 2128 532 4256 532 4256 532 2128 532 4256 532 4256 532 2128 532 2128 532 2128 532 2128 532 2128 532 2128 532 2128 532 2128 532 2128 532 2128 532 4256 532 2128 532 4256 532 4256 532 4256 532 4256 532 2128 532 2128 532 2128 532 4256 532 4256 532 4256 532 2128 532 2128 532 2128 532 4256 532 4256 532 2128 532 2128 532 2128 532 2128 532 9044 + +The last 2 pulses are the footer. These are meant to identify the pulses as genuine. We don't it for further processing. The next step is to transform this output into 38 groups of 2 pulses (and thereby dropping the footer pulses). + +.. code-block:: guess + + 532 2128 + 532 4256 + 532 4256 + 532 2128 + 532 4256 + 532 4256 + 532 2128 + 532 2128 + 532 2128 + 532 2128 + 532 2128 + 532 2128 + 532 2128 + 532 2128 + 532 2128 + 532 2128 + 532 4256 + 532 2128 + 532 4256 + 532 4256 + 532 4256 + 532 4256 + 532 2128 + 532 2128 + 532 2128 + 532 4256 + 532 4256 + 532 4256 + 532 2128 + 532 2128 + 532 2128 + 532 4256 + 532 4256 + 532 2128 + 532 2128 + 532 2128 + 532 2128 + 532 9044 + +If we now look at carefully at these groups you can distinguish two types of groups: + +- ``540 2128`` +- ``540 4256`` + +So the first group is defined by a low 2nd, the second group has a high 2nd pulse. So we take either of these two pulses to define a 0 or a 1. In this case we say a high 2nd pulse means a 1 and a low 2nd pulse means a 0. The binary conversion could look as follows: + +.. code-block:: guess + + 0101111100111000000011001011001010111 + +Each (group) of numbers has a specific meaning: + +- ID: 0 till 7 +- Temperature: 14 till 23 +- Humidity: 24 till 30 + +.. code-block:: guess + + 01011111 001110 0000001100 1011001 010111 + + +- The ID is defined as a binary number +- The Temperature is defined as a binary number and represents the temperature +- The Humidity is defined as a binary number and represents the humidity + +This protocol was created for pilight with the help of this thread: http://forum.pilight.org/Thread-Connect-digital-weather-sensor \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/tfa.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/tfa.rst new file mode 100644 index 0000000..c224ca1 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/tfa.rst @@ -0,0 +1,4 @@ +TFA +=== + +.. include:: _conrad.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/ventus_wsxxx.rst b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/ventus_wsxxx.rst new file mode 100644 index 0000000..3dc17db --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/433.92/weather/ventus_wsxxx.rst @@ -0,0 +1,4 @@ +Ventus WSXXX +============ + +.. include:: _alecto_wx500.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/api/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/api/index.rst new file mode 100644 index 0000000..9fdf02f --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/api/index.rst @@ -0,0 +1,8 @@ +API +=== + +.. toctree:: + :maxdepth: 3 + + program/index + weather/index \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/api/program/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/api/program/index.rst new file mode 100644 index 0000000..8c49fd5 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/api/program/index.rst @@ -0,0 +1,9 @@ +Program +=========== + +.. toctree:: + :maxdepth: 1 + + lirc + program + xbmc \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/api/program/lirc.rst b/lib/ESPiLight/pilight/docs/source/protocols/api/program/lirc.rst new file mode 100644 index 0000000..38686b0 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/api/program/lirc.rst @@ -0,0 +1,98 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Lirc +==== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "ab": { + "protocol": [ "lirc" ], + "id": [{ + "remote": "logitech" + }], + "code": "000000000000e204", + "repeat": 1, + "button": "KEY_ARROWDOWN" + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| remote | *any value* | ++------------------+-----------------+ +| code | *any value* | ++------------------+-----------------+ +| repeat | 1 - 999 | ++------------------+-----------------+ +| button | *any value* | ++------------------+-----------------+ + +.. rubric:: Comments + +The Lirc protocol tries to automatically connect to Lirc when pilight starts. When a connection can be made, it will send the same output as shown with ``irw`` in a pilight format. + +.. code-block:: console + + root@pi:~# irw + 000000037ff07be0 00 KEY_ARROWDOWN logitech-harmony-300i + +.. code-block:: console + + root@pi:~# pilight-receive + { + "code": { + "id": "000000000000e204", + "repeat": "01", + "button": "KEY_ARROWDOWN", + "remote": "logitech" + }, + "origin": "receiver", + "protocol": "lirc" + } + +Whenever, a connection to Lirc is lost, pilight will try to automatically reconnect. + +All signal processing will be done by Lirc, so make sure you have a working Lirc configuration. Tutorials on this can be found all around the internet. + +pilight tries to connect to the lirc socket found in ``/dev/lircd`` so make sure it exists or a symlink to the original socket is created to ``/dev/lircd``. + +**Raspbian Kernels 3.18 and higher** + +The most recent Raspbian release, with Pi 2 support, switches to a new kernel (3.18), and includes a configuration change to enable Device Tree support by default. + +You do need to add ``dtoverlay=lirc-rpi`` to ``/boot/config.txt``. + +Depending on your hardware setup, ``lirc-rpi`` module parameters are added to the end of the dtoverlay line: ``gpio_in_pin=16,gpio_in_pull=high,gpio_out_pin=17`` + +Example: + +.. code-block:: console + + dtoverlay=lirc-rpi,gpio_in_pin=18,gpio_out_pin=17 \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/api/program/program.rst b/lib/ESPiLight/pilight/docs/source/protocols/api/program/program.rst new file mode 100644 index 0000000..429c223 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/api/program/program.rst @@ -0,0 +1,124 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Program +======= + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +.. code-block:: console + + -t --running start the program + -f --stopped stop the program + -n --name=name name of the program + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "XBMC": { + "protocol": [ "program" ], + "id": [{ + "name": "xbmc" + }], + "program": "/usr/local/lib/xbmc/xbmc.bin", + "arguments": "", + "stop-command": "service xbmc stop", + "start-command": "service xbmc start", + "state": "running", + "pid": 11642 + } + }, + "gui": { + "xbmc": { + "name": "XBMC", + "group": [ "Programs" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| name | *any value* | ++------------------+-----------------+ +| arguments | *any value* | ++------------------+-----------------+ +| stop-command | *any value* | ++------------------+-----------------+ +| start-command | *any value* | ++------------------+-----------------+ +| state | | starting | +| | | running | +| | | stopped | ++------------------+-----------------+ +| pid | 0 - 9 | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++------------------+-------------+------------+-------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++------------------+-------------+------------+-------------------------------------------------+ +| poll-interval | 1 | >= 1 | How ofter do we want to check the program state | ++------------------+-------------+------------+-------------------------------------------------+ + +:underline:`GUI Settings` + ++------------------+-------------+------------+-----------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++------------------+-------------+------------+-----------------------------------------------+ +| readonly | 0 | 1 or 0 | Disable controlling this device from the GUIs | ++------------------+-------------+------------+-----------------------------------------------+ +| confirm | 0 | 1 or 0 | Ask for confirmation when switching device | ++------------------+-------------+------------+-----------------------------------------------+ + +.. rubric:: Comment + +The program protocol takes two important arguments + +- The program +- The arguments + +You can run ``ps aux`` to find out what these are. An example: + +.. code-block:: console + + USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND + root 11622 0.0 2.3 20216 8860 tty4 Ssl+ 20:04 0:01 /usr/local/sbin/splash-daemon + root 11636 0.0 0.4 4096 1540 ? Ss 20:04 0:00 sudo -u xbian /usr/local/lib/xbmc/xbmc.bin --standalone -fs --lircdev /run/lirc/lircd + xbian 11642 22.5 12.6 390836 48280 ? RNl 20:04 15:09 /usr/local/lib/xbmc/xbmc.bin --standalone -fs --lircdev /run/lirc/lircd + xbian 11734 0.0 0.2 2692 1092 ? S 20:04 0:00 /bin/bash + root 11868 0.0 1.4 9732 5432 ? Ss 20:04 0:00 python /usr/local/sbin/upstart-xbmc-bridge.py + root 11908 0.0 0.0 0 0 ? S 20:06 0:00 [btrfs-delalloc-] + root 13078 0.0 0.0 0 0 ? S 21:05 0:00 [kworker/u2:0] + root 13085 0.0 0.0 0 0 ? S 21:08 0:00 [btrfs-worker-2] + root 13166 0.0 0.0 0 0 ? S 21:10 0:00 [kworker/u2:1] + root 13186 0.0 0.2 4424 1116 pts/2 R+ 21:11 0:00 ps aux + +In thise case, i want to control XBMC. The xbian entry with the PID 11642 is what i want to use. The first word is the program name. In this case ``/usr/local/lib/xbmc/xbmc.bin``. Everything that comes after are the arguments ``–standalone -fs –lircdev /run/lirc/lircd``. pilight will now check for a program that matches these exact parameters. So the protocol looks for processes matching those lines and when a process is found, it updates the pid value accordingly. (The pid is just informative.) + +If you omit the arguments value, all matching programs will be processes with or without matching arguments. If there are more than once matches, pilight will use the first. diff --git a/lib/ESPiLight/pilight/docs/source/protocols/api/program/xbmc.rst b/lib/ESPiLight/pilight/docs/source/protocols/api/program/xbmc.rst new file mode 100644 index 0000000..5d50f6e --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/api/program/xbmc.rst @@ -0,0 +1,115 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +XBMC / Kodi +=========== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "xbmc": { + "protocol": [ "xbmc" ], + "id": [{ + "server": "127.0.0.1", + "port": 9090 + }], + "action": "shutdown", + "media": "none" + } + }, + "gui": { + "xbmc": { + "name": "XBMC", + "group": [ "Programs" ], + "media": [ "all" ] + } + } + } + + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| server | *valid ip* | ++------------------+-----------------+ +| port | 1 - 65535 | ++------------------+-----------------+ +| action | | shutdown | +| | | home | +| | | play | +| | | pause | +| | | active | +| | | inactive | ++------------------+-----------------+ +| media | | none | +| | | episode | +| | | movie | +| | | movies | +| | | song | +| | | screensaver | ++------------------+-----------------+ + +.. note:: + + - The ``shutdown`` and ``home`` actions are only allowed for the ``none`` media. + - The ``play``, ``home``, and ``pause`` actions are only allowed for the ``episode``, ``movie``, ``movies``, or ``song`` media. + - The ``active`` and ``inactive`` actions are only allowed for the ``screensaver`` media. + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++------------------+-------------+------------+-----------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++------------------+-------------+------------+-----------------------------------------------+ +| show-media | 1 | 1 or 0 | Don't display the media icon | ++------------------+-------------+------------+-----------------------------------------------+ +| show-action | 1 | 1 or 0 | Don't display the action icon | ++------------------+-------------+------------+-----------------------------------------------+ + +.. rubric:: Comment + +The XBMC protocol will try to connect to a XBMC instance. However, make sure the JSON-RPC API is `enabled `_ in XBMC. You don't need to do anything more. Whenever a connection to XBMC is lost, the protocol will automatically try to reconnect. The XBMC protocol sends several messages depending on the actions in XBMC. + ++-----------+----------------+ +| **Media** | **Action** | ++-----------+----------------+ +| movie | play, pause | ++-----------+----------------+ +| song | play, pause | ++-----------+----------------+ +| episode | play, pause | ++-----------+----------------+ +| none | shutdown, home | ++-----------+----------------+ + +The stop event isn't recording, but pilight will interpret as the home action of the none media. So when XBMC is started or when nothing plays, the action will be home. When pilight can't connect to XBMC or when the connection is lost the shutdown action of the none media will be sent. + +Important + +pilight uses JSON-RPC via TCP-Port 9090. Don't mix it up with JSON-RPC via HTTP which is available over port 8080 by default (http://Kodi:8080/jsonrpc). This setting is hidden in Kodi/XBMC. \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/api/weather/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/api/weather/index.rst new file mode 100644 index 0000000..d43fe26 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/api/weather/index.rst @@ -0,0 +1,9 @@ +Weather +======= + +.. toctree:: + :maxdepth: 1 + + wunderground + openweathermap + sunriseset \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/api/weather/openweathermap.rst b/lib/ESPiLight/pilight/docs/source/protocols/api/weather/openweathermap.rst new file mode 100644 index 0000000..4e5712a --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/api/weather/openweathermap.rst @@ -0,0 +1,122 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +OpenWeatherMap +============== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "outside": { + "protocol": [ "openweathermap" ], + "id": [{ + "location": "amsterdam", + "api": "1234567890", + "country": "nl" + }], + "humidity": 76.00, + "temperature": 7.00, + "sunrise": 7.00, + "sunset": 16.15, + "sun": "set", + "update": 1 + } + }, + "gui": { + "outside": { + "name": "Temperature", + "group": [ "Outside" ], + "media": [ "all" ] + } + } + } + ++------------------+----------------------------------+ +| **Option** | **Value** | ++------------------+----------------------------------+ +| location | *valid openweathermap location* | ++------------------+----------------------------------+ +| country | *valid country abbreviation* | ++------------------+----------------------------------+ +| temperature | -100.00 - 100.00 | ++------------------+----------------------------------+ +| humitidy | 0.00 - 100.00 | ++------------------+----------------------------------+ +| sunrise | 00.00 - 23.59 | ++------------------+----------------------------------+ +| sunset | 00.00 - 23.59 | ++------------------+----------------------------------+ +| sun | rise / set | ++------------------+----------------------------------+ +| update | 0 - 1 | ++------------------+----------------------------------+ + +.. versionadded:: 8.0.7 + ++------------------+----------------------------------+ +| **Option** | **Value** | ++------------------+----------------------------------+ +| api | *valid openweathermap api key* | ++------------------+----------------------------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+---------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+---------------------------------------------+ +| humidity-offset | 0 | number | Correct humidity value | ++--------------------+-------------+------------+---------------------------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+---------------------------------------------+ +| poll-interval | 86400 | seconds | What should be the poll interval of the API | ++--------------------+-------------+------------+---------------------------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| temperature-decimals | 2 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| humidity-decimals | 2 | number | How many decimals the GUIs should display for humidity | ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| sunriseset-decimals | 2 | number | How many decimals the GUIs should display for sunrise/sunset time | ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| show-humidity | 1 | 1 or 0 | Don't display the humidity value | ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| show-battery | 0 | 1 or 0 | Don't display the battery value | ++----------------------+-------------+------------+----------------------------------------------------------------------+ + + +.. rubric:: Comment + +#. Please notice that the open weather map interval cannot be less than 10 minutes (600 seconds) to respect open weather map traffic and policy \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/api/weather/sunriseset.rst b/lib/ESPiLight/pilight/docs/source/protocols/api/weather/sunriseset.rst new file mode 100644 index 0000000..84d1b4c --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/api/weather/sunriseset.rst @@ -0,0 +1,138 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Sunriseset +========== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "outside": { + "protocol": [ "sunriseset" ], + "id": [{ + "longitude": 1.2345, + "latitude": 50.607080 + }], + "sunrise": 7.00, + "sunset": 16.15, + "sun": "set" + } + }, + "gui": { + "sun": { + "name": "Sunrise / Sunset", + "group": [ "Outside" ], + "media": [ "all" ] + } + } + } + ++------------------+----------------------+ +| **Option** | **Value** | ++------------------+----------------------+ +| longitude | -180.0000 - 180.0000 | ++------------------+----------------------+ +| latitude | -90.0000 - 90.0000 | ++------------------+----------------------+ +| sunrise | 00.00 - 23.59 | ++------------------+----------------------+ +| sunset | 00.00 - 23.59 | ++------------------+----------------------+ +| sun | rise / set | ++------------------+----------------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| sunriseset-decimals | 2 | number | How many decimals the GUIs should display for sunrise/sunset time | ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| show-sunriseset | 0 | 1 or 0 | Don't display the sunrise /sunset | ++----------------------+-------------+------------+----------------------------------------------------------------------+ + +.. rubric:: Comment + +The sunriseset will send three messages: + +#. When the sunset time has been arrived. +#. When the sunrise time has been arrived. +#. After midnight so all values can be updated for a new day. + +When using sunriseset in eventing, keep in mind of the following; The output of sunriseset.sunset and sunriseset.sunrise is just a number, so the time 17:00 equals 17.00. When using it in eventing make sure you get usable numbers. For example the time for sunriseset.sunset is 16:30 + +.. code-block:: guess + :linenos: + + IF ((sunrisesetdev.sunset == (datetime.hour + (datetime.minute / 100))) AND datetime.second == 0) THEN .." + +pilight will see this: + +.. code-block:: guess + :linenos: + + IF ((16.30 == (16 + (30 / 100))) AND 0 == 0) THEN ..." + +The math pilight will use: 16.30 == 16.30 + +When you look at the result you will see that the datetime.minute 30 will give 0.30 in the used rule (in normal case divide minutes through 100) + +Using the sunriseset. + +Example + +.. code-block:: guess + :linenos: + + IF sunrisesetdev.sun IS set THEN .... + IF sunrisesetdev.sun IS rise THEN .... + +Please note that with the three messages mentioned above, the first rule fires two times: At sunset, and at midnight (sunrisesetdev.sun is either set or rise, and will be set at midnight). So, it's better to use + +.. code-block:: guess + :linenos: + + IF (DATE_FORMAT(CurrentDateTime, %H.%M) == sunrisesetdev.sunset AND CurrentDateTime.second == 0) THEN ... + +with CurrentDateTime as a ``datetime`` device. + +.. rubric:: Notes + +ntpserver has been removed from the sunriseset id. Instead, ntp-servers are defined in the settings section of config.json in an array like this: + +.. code-block:: json + :linenos: + + { + "ntp-servers": [ "0.nl.pool.ntp.org", "1.nl.pool.ntp.org", "..." ], + "ntp-sync": 1 + } + +Both the datetime and sunriseset protocol will use the ntp time to adjust their time when needed. diff --git a/lib/ESPiLight/pilight/docs/source/protocols/api/weather/wunderground.rst b/lib/ESPiLight/pilight/docs/source/protocols/api/weather/wunderground.rst new file mode 100644 index 0000000..ae8652b --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/api/weather/wunderground.rst @@ -0,0 +1,119 @@ +.. |yes| image:: ../../../images/yes.png +.. |no| image:: ../../../images/no.png + +.. role:: underline + :class: underline + +Weather Underground +=================== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "outside": { + "protocol": [ "wunderground" ], + "id": [{ + "api": "1ihn472a6ea384jd", + "location": "amsterdam", + "country": "nl" + }], + "humidity": 76.00, + "temperature": 7.00, + "sunrise": 7.00, + "sunset": 16.15, + "sun": "set", + "update": 1 + } + }, + "gui": { + "outside": { + "name": "Temperature", + "group": [ "Outside" ], + "media": [ "all" ] + } + } + } + ++------------------+--------------------------------------+ +| **Option** | **Value** | ++------------------+--------------------------------------+ +| api | *valid weather underground api key* | ++------------------+--------------------------------------+ +| location | *valid weather underground location* | ++------------------+--------------------------------------+ +| country | *valid country abbreviation* | ++------------------+--------------------------------------+ +| temperature | -100.00 - 100.00 | ++------------------+--------------------------------------+ +| humitidy | 0.00 - 100.00 | ++------------------+--------------------------------------+ +| sunrise | 00.00 - 23.59 | ++------------------+--------------------------------------+ +| sunset | 00.00 - 23.59 | ++------------------+--------------------------------------+ +| sun | rise / set | ++------------------+--------------------------------------+ +| update | 0 - 1 | ++------------------+--------------------------------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+---------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+---------------------------------------------+ +| humidity-offset | 0 | number | Correct humidity value | ++--------------------+-------------+------------+---------------------------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+---------------------------------------------+ +| poll-interval | 86400 | seconds | What should be the poll interval of the API | ++--------------------+-------------+------------+---------------------------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| temperature-decimals | 2 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| humidity-decimals | 2 | number | How many decimals the GUIs should display for humidity | ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| sunriseset-decimals | 2 | number | How many decimals the GUIs should display for sunrise/sunset time | ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| show-humidity | 1 | 1 or 0 | Don't display the humidity value | ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+----------------------------------------------------------------------+ +| show-battery | 0 | 1 or 0 | Don't display the battery value | ++----------------------+-------------+------------+----------------------------------------------------------------------+ + + +.. rubric:: Comment + + +#. Please notice that the weather underground interval cannot be less than 15 minutes due to daily polling restrictions. +#. This restriction also counts for the update button in the webgui. You won't receive updates within the 15 minutes between two updates. +#. This wiki page shows a random API key. Please register yourself at wunderground.com to get your own. \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/generic/dimmer.rst b/lib/ESPiLight/pilight/docs/source/protocols/generic/dimmer.rst new file mode 100644 index 0000000..fc8a35c --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/generic/dimmer.rst @@ -0,0 +1,111 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Dimmer +====== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |no| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +.. code-block:: console + + -t --on send an on signal + -f --off send an off signal + -i --id=id control a device with this id + -d --dimlevel=dimlevel send a specific dimlevel + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "dimmer": { + "protocol": [ "generic_dimmer" ], + "id": [{ + "id": 100 + }], + "state": "off", + "dimlevel": 0 + } + }, + "gui": { + "dimmer": { + "name": "Dimmer", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 99999 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ +| dimlevel | 0 - 99999 | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++------------------+-------------+------------+-----------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++------------------+-------------+------------+-----------------------------------------------+ +| readonly | 0 | 1 or 0 | Disable controlling this device from the GUIs | ++------------------+-------------+------------+-----------------------------------------------+ +| confirm | 0 | 1 or 0 | Ask for confirmation when switching device | ++------------------+-------------+------------+-----------------------------------------------+ + +.. versionadded:: 8.0.6 + +.. note:: + + The minimum and maximum is dependent on the ``Device Settings`` below. + The actual dimlevel is not validated against these ranges. + +:underline:`GUI Settings` + ++------------------+-------------+------------+------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++------------------+-------------+------------+------------------+ +| dimlevel-minimum | 0 | number | Minimum dimlevel | ++------------------+-------------+------------+------------------+ +| dimlevel-maximum | 15 | number | Maximum dimlevel | ++------------------+-------------+------------+------------------+ + +.. deprecated:: 8.0.5 + +.. note:: + + The minimum and maximum is dependent on the ``Device Settings`` below. + +:underline:`Device Settings` + ++------------------+-------------+------------+------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++------------------+-------------+------------+------------------+ +| dimlevel-minimum | 0 | number | Minimum dimlevel | ++------------------+-------------+------------+------------------+ +| dimlevel-maximum | 15 | number | Maximum dimlevel | ++------------------+-------------+------------+------------------+ diff --git a/lib/ESPiLight/pilight/docs/source/protocols/generic/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/generic/index.rst new file mode 100644 index 0000000..436c594 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/generic/index.rst @@ -0,0 +1,13 @@ +Generic +======= + +.. toctree:: + :maxdepth: 3 + + dimmer + label + raw + screen + switch + weather + webcam \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/generic/label.rst b/lib/ESPiLight/pilight/docs/source/protocols/generic/label.rst new file mode 100644 index 0000000..9654405 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/generic/label.rst @@ -0,0 +1,69 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Label +===== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |no| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +.. code-block:: console + + -i --id=id control a device with this id + -l --label=label show a specific label + -c --color=color give the label a specific color + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "label": { + "protocol": [ "generic_label" ], + "id": [{ + "id": 100 + }], + "label": "test1234", + "color": "red" + } + }, + "gui": { + "label": { + "name": "Label", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 99999 | ++------------------+-----------------+ +| label | *any value* | ++------------------+-----------------+ +| color | *any color* | ++------------------+-----------------+ + +.. note:: + + Please notice that the label color is not validated in any way. The color information is just forwarded to the GUIs as is. So it could be that some GUIs do not support certain color naming. Using hex colors is therefore the safest, e.g. #000000. diff --git a/lib/ESPiLight/pilight/docs/source/protocols/generic/raw.rst b/lib/ESPiLight/pilight/docs/source/protocols/generic/raw.rst new file mode 100644 index 0000000..ef67872 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/generic/raw.rst @@ -0,0 +1,33 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Raw +=== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |no| | ++------------------+-------------+ +| Config | |no| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +.. code-block:: console + + -c --code="raw" raw code divided by spaces + (just like the output of debug) + +.. rubric:: Config + +*None* \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/generic/screen.rst b/lib/ESPiLight/pilight/docs/source/protocols/generic/screen.rst new file mode 100644 index 0000000..235be57 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/generic/screen.rst @@ -0,0 +1,74 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Screen +====== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |no| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +.. code-block:: console + + -t --up send an up signal + -f --down send a down signal + -i --id=id control a device with this id + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "screen": { + "protocol": [ "generic_screen" ], + "id": [{ + "id": 100 + }], + "state": "down" + } + }, + "gui": { + "screen": { + "name": "Screen", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 99999 | ++------------------+-----------------+ +| state | up/down | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++------------------+-------------+------------+-----------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++------------------+-------------+------------+-----------------------------------------------+ +| readonly | 0 | 1 or 0 | Disable controlling this device from the GUIs | ++------------------+-------------+------------+-----------------------------------------------+ +| confirm | 0 | 1 or 0 | Ask for confirmation when switching device | ++------------------+-------------+------------+-----------------------------------------------+ diff --git a/lib/ESPiLight/pilight/docs/source/protocols/generic/switch.rst b/lib/ESPiLight/pilight/docs/source/protocols/generic/switch.rst new file mode 100644 index 0000000..c39cffb --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/generic/switch.rst @@ -0,0 +1,74 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Switch +====== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |no| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +.. code-block:: console + + -t --on send an on signal + -f --off send an off signal + -i --id=id control a device with this id + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "switch": { + "protocol": [ "generic_switch" ], + "id": [{ + "id": 100 + }], + "state": "off" + } + }, + "gui": { + "switch": { + "name": "Switch", + "group": [ "Living" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 99999 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`GUI Settings` + ++------------------+-------------+------------+-----------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++------------------+-------------+------------+-----------------------------------------------+ +| readonly | 0 | 1 or 0 | Disable controlling this device from the GUIs | ++------------------+-------------+------------+-----------------------------------------------+ +| confirm | 0 | 1 or 0 | Ask for confirmation when switching device | ++------------------+-------------+------------+-----------------------------------------------+ diff --git a/lib/ESPiLight/pilight/docs/source/protocols/generic/weather.rst b/lib/ESPiLight/pilight/docs/source/protocols/generic/weather.rst new file mode 100644 index 0000000..0184966 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/generic/weather.rst @@ -0,0 +1,97 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Weather +======= + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |yes| | ++------------------+-------------+ +| Receiving | |no| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +.. code-block:: console + + -t --temperature=temperature set the temperature + -h --humidity=humidity set the humidity + -b --battery=battery set the battery level + -i --id=id control a device with this id + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "weather": { + "protocol": [ "generic_weather" ], + "id": [{ + "id": 100 + }], + "temperature": 23.00, + "humidity": 76.00, + "battery": 0 + } + }, + "gui": { + "weather": { + "name": "Weather", + "group": [ "Weather" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| id | 0 - 99999 | ++------------------+-----------------+ +| temperature | 0.00 - 100.00 | ++------------------+-----------------+ +| humidity | 0.00 - 100.00 | ++------------------+-----------------+ +| battery | 0 - 1 | ++------------------+-----------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+---------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+---------------------------+ +| humidity-offset | 0 | number | Correct humidity value | ++--------------------+-------------+------------+---------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+---------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 2 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| humidity-decimals | 2 | number | How many decimals the GUIs should display for humidity | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-humidity | 1 | 1 or 0 | Don't display the humidity value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-battery | 0 | 1 or 0 | Don't display the battery value | ++----------------------+-------------+------------+-----------------------------------------------------------+ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/generic/webcam.rst b/lib/ESPiLight/pilight/docs/source/protocols/generic/webcam.rst new file mode 100644 index 0000000..6e5969e --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/generic/webcam.rst @@ -0,0 +1,80 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Webcam +======= + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |no| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "webcam": { + "protocol": [ "generic_webcam" ], + "id": [{ + "id": 100 + }], + "url": "http://x.x.x.x:xxxx" + } + }, + "gui": { + "webcam": { + "name": "Webcam", + "group": [ "Frontdoor" ], + "media": [ "all" ] + } + } + } + ++------------------+-------------------+ +| **Option** | **Value** | ++------------------+-------------------+ +| id | 0 - 99999 | ++------------------+-------------------+ +| url | *valid image url* | ++------------------+-------------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+-------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+-------------------------------+ +| poll-interval | 10 | number | Refresh webcam image interval | ++--------------------+-------------+------------+-------------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| image-width | NULL | number | Webcam image width | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| image-height | 300 | number | Webcam image height | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-webcam | 1 | 1 or 0 | Don't display the webcam image | ++----------------------+-------------+------------+-----------------------------------------------------------+ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/_am2302.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/_am2302.rst new file mode 100644 index 0000000..e39c9e5 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/_am2302.rst @@ -0,0 +1,99 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+--------------+ +| **Brand** | **Protocol** | ++------------------+--------------+ +| 1-Wire DHT11 | dht11 | ++------------------+--------------+ +| 1-Wire DHT22 | dht22 | ++------------------+--------------+ +| 1-Wire AM2302 | am2302 | ++------------------+--------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "weather": { + "protocol": [ "dht22" ], + "id": [{ + "gpio": 7 + }], + "temperature": 5.2, + "humidity": 1.7, + "poll-interval": 5 + } + }, + "gui": { + "temperature": { + "name": "Temperature Sensor", + "group": [ "Misc" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| gpio | 0 - 255 | ++------------------+-----------------+ +| temperature | -40 - 80 | ++------------------+-----------------+ +| humidity | 0 - 100 | ++------------------+-----------------+ + +.. note:: + + The ``gpio`` value should be a valid GPIO for the platform used + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+-------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+-------------------------------------------------+ +| poll-interval | 5 | seconds | What should be the poll interval of the sensors | ++--------------------+-------------+------------+-------------------------------------------------+ +| humidity-offset | 0 | number | Correct humidity value | ++--------------------+-------------+------------+-------------------------------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+-------------------------------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 1 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| humidity-decimals | 1 | number | How many decimals the GUIs should display for humidity | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-humidity | 1 | 1 or 0 | Don't display the humidity value | ++----------------------+-------------+------------+-----------------------------------------------------------+ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/_bmp180.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/_bmp180.rst new file mode 100644 index 0000000..78536c2 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/_bmp180.rst @@ -0,0 +1,115 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+--------------+ +| **Brand** | **Protocol** | ++------------------+--------------+ +| BMP180 | bmp180 | ++------------------+--------------+ +| BMP085 | bmp085 | ++------------------+--------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "bmp180": { + "protocol": [ "bmp180" ], + "id": [{ + "id": "0x77" + }], + "temperature": 19.1, + "pressure": 1006.8, + "oversampling": 1 + } + }, + "gui": { + "temperature": { + "name": "Temperature Sensor", + "group": [ "Misc" ], + "media": [ "all" ] + } + } + } + ++------------------+------------------+ +| **Option** | **Value** | ++------------------+------------------+ +| id | *valid i2c path* | ++------------------+------------------+ +| temperature | -40 - 85 | ++------------------+------------------+ +| pressure | 300 - 1100 | ++------------------+------------------+ +| oversampling | 0 - 3 | ++------------------+------------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+-------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+-------------------------------------------------+ +| poll-interval | 10 | seconds | What should be the poll interval of the sensors | ++--------------------+-------------+------------+-------------------------------------------------+ +| humidity-offset | 0 | number | Correct humidity value | ++--------------------+-------------+------------+-------------------------------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+-------------------------------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 2 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| pressure-decimals | 2 | number | How many decimals the GUIs should display for pressure | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-pressure | 1 | 1 or 0 | Don't display the pressure value | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Comments + +Pressure is provided in hectopascal (hPa) and temperature in degrees Celsius (°C). + +Option ``oversampling`` sets the BMP180 hardware accuracy mode which is relevant for pressure readings only. + ++-----------------------+--------------+-------------------------+------------------------------------+ +| Mode | oversampling | Internal no. of samples | Conversion time pressure max. [ms] | ++-----------------------+--------------+-------------------------+------------------------------------+ +| ultra low power | 0 | 1 | 4.5 | ++-----------------------+--------------+-------------------------+------------------------------------+ +| standard | 1 | 2 | 7.5 | ++-----------------------+--------------+-------------------------+------------------------------------+ +| high resolution | 2 | 4 | 13.5 | ++-----------------------+--------------+-------------------------+------------------------------------+ +| ultra high resolution | 3 | 8 | 25.5 | ++-----------------------+--------------+-------------------------+------------------------------------+ + +The algorithm for pressure and temperature measurement is based on the specification in the `official datasheet `_. diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/_ds18b20.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/_ds18b20.rst new file mode 100644 index 0000000..27c5b0e --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/_ds18b20.rst @@ -0,0 +1,145 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+--------------+ +| **Brand** | **Protocol** | ++------------------+--------------+ +| 1-Wire DS18B20 | ds18b20 | ++------------------+--------------+ +| 1-Wire DS18S20 | ds18s20 | ++------------------+--------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "weather": { + "protocol": [ "ds18b20" ], + "id": [{ + "id": "0000052ba3ac" + }], + "temperature": 19.562 + } + }, + "gui": { + "temperature": { + "name": "Temperature Sensor", + "group": [ "Misc" ], + "media": [ "all" ] + } + } + } + ++------------------+-------------------+ +| **Option** | **Value** | ++------------------+-------------------+ +| id | *valid 1-wire id* | ++------------------+-------------------+ +| temperature | -55 - 125 | ++------------------+-------------------+ + +.. note:: **DS18B20** + + Valid id's can be found in the path ``/sys/bus/w1/devices/`` starting with ``28-``. The prefix ``28-`` should be removed from the id. + +.. note:: **DS18S20** + + Valid id's can be found in the path ``/sys/bus/w1/devices/`` starting with ``10-``. The prefix ``10-`` should be removed from the id. + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+-------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+-------------------------------------------------+ +| poll-interval | 5 | seconds | What should be the poll interval of the sensors | ++--------------------+-------------+------------+-------------------------------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+-------------------------------------------------+ + +:underline:`GUI Settings` + +.. note:: DS18B20 + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 2 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. note:: DS18S20 + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 3 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ + + +.. rubric:: Comments + +Before pilight can see the sensor, you have to run the following commands: + +.. code-block:: console + + sudo modprobe w1-gpio + sudo modprobe w1-therm + +To make sure this is done every reboot, edit ``/etc/modules`` and add the following lines: + +.. code-block:: console + + w1-gpio + w1-therm + +If you have enabled "Device tree support" (since Raspbian with kernel 3.18 it's the default configuration), you have to add the following line to ``/boot/config.txt``: + +.. code-block:: console + + dtoverlay=w1-gpio-pullup,gpiopin=4 + +.. note:: The GPIO pin number is the BCM GPIO and not the WiringX number. + +This will load the module ``w1-gpio``, so you only have to add ``w1-therm`` to your ``/etc/modules``. + +To find the correct sensor id, you have to run the following commands: + +.. code-block:: console + + cd /sys/bus/w1/devices + ls + +The result will look like: + +.. code-block:: console + + 28-0000055bd776 w1_bus_master1 + +Use the part after 28- as the correct id, e.g. 0000055bd776. \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/_lm75.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/_lm75.rst new file mode 100644 index 0000000..807a413 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/_lm75.rst @@ -0,0 +1,131 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+--------------+ +| **Brand** | **Protocol** | ++------------------+--------------+ +| LM75 | lm75 | ++------------------+--------------+ +| LM76 | lm76 | ++------------------+--------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "temperature": { + "protocol": [ "lm75" ], + "id": [{ + "id": "0x49" + }], + "temperature": 17.2 + } + }, + "gui": { + "temperature": { + "name": "Temperature Sensor", + "group": [ "Misc" ], + "media": [ "all" ] + } + } + } + ++------------------+-------------------+ +| **Option** | **Value** | ++------------------+-------------------+ +| id | *valid i2c id* | ++------------------+-------------------+ +| temperature | -55 - 125 | ++------------------+-------------------+ + +.. versionchanged:: 8.0 + +.. code-block:: json + :linenos: + + { + "devices": { + "temperature": { + "protocol": [ "lm75" ], + "id": [{ + "id": "0x49", + "i2c-path": "/dev/i2c-0" + }], + "temperature": 17.2 + } + }, + "gui": { + "temperature": { + "name": "Temperature Sensor", + "group": [ "Misc" ], + "media": [ "all" ] + } + } + } + + ++------------------+-------------------+ +| **Option** | **Value** | ++------------------+-------------------+ +| id | *valid i2c id* | ++------------------+-------------------+ +| i2c-path | *valid i2c path* | ++------------------+-------------------+ +| temperature | -55 - 125 | ++------------------+-------------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+-------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+-------------------------------------------------+ +| poll-interval | 5 | seconds | What should be the poll interval of the sensors | ++--------------------+-------------+------------+-------------------------------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+-------------------------------------------------+ + +:underline:`GUI Settings` + +.. note:: LM75 + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 1 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. note:: LM76 + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 3 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/am2302.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/am2302.rst new file mode 100644 index 0000000..4b8fe7f --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/am2302.rst @@ -0,0 +1,4 @@ +1-Wire AM2302 +============= + +.. include:: _am2302.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/bmp085.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/bmp085.rst new file mode 100644 index 0000000..26cefce --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/bmp085.rst @@ -0,0 +1,4 @@ +BMP085 +====== + +.. include:: _bmp180.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/bmp180.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/bmp180.rst new file mode 100644 index 0000000..7331610 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/bmp180.rst @@ -0,0 +1,4 @@ +BMP180 +====== + +.. include:: _bmp180.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/cputemp.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/cputemp.rst new file mode 100644 index 0000000..dfcf4e0 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/cputemp.rst @@ -0,0 +1,105 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +CPU Temperature +=============== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+--------------+ +| **Brand** | **Protocol** | ++------------------+--------------+ +| Raspberry Pi | cpu_temp | ++------------------+--------------+ +| Hummingboard | cpu_temp | ++------------------+--------------+ + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "weather": { + "protocol": [ "cpu_temp" ], + "id": [{ + "id": 1 + }], + "temperature": 59.397, + "poll-interval": 10 + } + }, + "gui": { + "temperature": { + "name": "Temperature Sensor", + "group": [ "Misc" ], + "media": [ "all" ] + } + } + } + ++------------------+-------------------+ +| **Option** | **Value** | ++------------------+-------------------+ +| id | 0 - 99999 | ++------------------+-------------------+ +| temperature | -40.000 - 85.000 | ++------------------+-------------------+ +| poll-interval | 1 - 60 | ++------------------+-------------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+-------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+-------------------------------------------------+ +| poll-interval | 5 | seconds | What should be the poll interval of the sensors | ++--------------------+-------------+------------+-------------------------------------------------+ +| temperature-offset | 0 | number | Correct temperature value | ++--------------------+-------------+------------+-------------------------------------------------+ + +:underline:`GUI Settings` + ++----------------------+-------------+------------+-----------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| temperature-decimals | 1 | number | How many decimals the GUIs should display for temperature | ++----------------------+-------------+------------+-----------------------------------------------------------+ +| show-temperature | 1 | 1 or 0 | Don't display the temperature value | ++----------------------+-------------+------------+-----------------------------------------------------------+ + +.. rubric:: Comments + +On the Raspberry Pi: + +It is possible you need to first load the sensor module: + +.. code-block:: console + + sudo modprobe bcm2835_thermal + +To make sure this is done every reboot, edit ``/etc/modules`` and add the following lines: + +.. code-block:: console + + bcm2835_thermal \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/dht11.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/dht11.rst new file mode 100644 index 0000000..f262c0d --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/dht11.rst @@ -0,0 +1,4 @@ +1-Wire DHT11 +============= + +.. include:: _am2302.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/dht22.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/dht22.rst new file mode 100644 index 0000000..b7d838f --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/dht22.rst @@ -0,0 +1,4 @@ +1-Wire DHT22 +============= + +.. include:: _am2302.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/ds18b20.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/ds18b20.rst new file mode 100644 index 0000000..0b911d2 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/ds18b20.rst @@ -0,0 +1,4 @@ +DS18B20 +======= + +.. include:: _ds18b20.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/ds18s20.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/ds18s20.rst new file mode 100644 index 0000000..d775465 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/ds18s20.rst @@ -0,0 +1,4 @@ +DS18S20 +======= + +.. include:: _ds18b20.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/gpio_switch.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/gpio_switch.rst new file mode 100644 index 0000000..4f48dff --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/gpio_switch.rst @@ -0,0 +1,86 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +GPIO Switch +=============== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + ++------------------+--------------+ +| **Brand** | **Protocol** | ++------------------+--------------+ +| Raspberry Pi | cpu_temp | ++------------------+--------------+ +| Hummingboard | cpu_temp | ++------------------+--------------+ + +.. rubric:: Sender Arguments + +.. code-block:: console + + -g --gpio=gpio the gpio the switch is connected to + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "switch": { + "protocol": [ "gpio_switch" ], + "id": [{ + "gpio": 1 + }], + "state": "off" + } + }, + "gui": { + "switch": { + "name": "Switch", + "group": [ "Misc" ], + "media": [ "all" ] + } + } + } + ++------------------+-----------------+ +| **Option** | **Value** | ++------------------+-----------------+ +| gpio | 0 - 255 | ++------------------+-----------------+ +| state | on / off | ++------------------+-----------------+ + +.. note:: + + The ``gpio`` value should be a valid GPIO for the platform used + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++------------------+-------------+------------+-----------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++------------------+-------------+------------+-----------------------------------------------+ +| readonly | 0 | 1 or 0 | Disable controlling this device from the GUIs | ++------------------+-------------+------------+-----------------------------------------------+ +| confirm | 0 | 1 or 0 | Ask for confirmation when switching device | ++------------------+-------------+------------+-----------------------------------------------+ + +.. rubric:: Comments + +The GPIO switch protocol follows the wiringX numbering as can be found here: http://wiringx.org \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/index.rst new file mode 100644 index 0000000..79693a3 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/index.rst @@ -0,0 +1,17 @@ +GPIO +==== + +.. toctree:: + :maxdepth: 3 + + am2302 + bmp180 + bmp085 + cputemp + dht22 + dht11 + ds18b20 + ds18s20 + gpio_switch + lm75 + lm76 \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/lm75.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/lm75.rst new file mode 100644 index 0000000..378ff89 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/lm75.rst @@ -0,0 +1,4 @@ +I2C-bus LM75 +============ + +.. include:: _lm75.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/gpio/lm76.rst b/lib/ESPiLight/pilight/docs/source/protocols/gpio/lm76.rst new file mode 100644 index 0000000..712c5ff --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/gpio/lm76.rst @@ -0,0 +1,4 @@ +I2C-bus LM76 +============ + +.. include:: _lm75.rst \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/index.rst new file mode 100644 index 0000000..335183c --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/index.rst @@ -0,0 +1,11 @@ +Protocols +========= + +.. toctree:: + :maxdepth: 3 + + 433.92/index + api/index + generic/index + network/index + gpio/index \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/network/arping.rst b/lib/ESPiLight/pilight/docs/source/protocols/network/arping.rst new file mode 100644 index 0000000..c5a28af --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/network/arping.rst @@ -0,0 +1,75 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Arping +====== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "arping": { + "protocol": [ "arping" ], + "id": [{ + "mac": "xx:xx:xx:xx:xx:xx" + }], + "ip": "0.0.0.0", + "state": "connected" + } + } + } + ++------------------+--------------------------+ +| **Option** | **Value** | ++------------------+--------------------------+ +| mac | *valid mac address* | ++------------------+--------------------------+ +| ip | *valid ip address* | ++------------------+--------------------------+ +| state | connected / disconnected | ++------------------+--------------------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+-------------------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+-------------------------------------------------------------+ +| poll-interval | 1 | >= 1 | How often do we want to arping the mac address (in seconds) | ++--------------------+-------------+------------+-------------------------------------------------------------+ + +.. rubric::: Comment + + +The arping protocol doesn't have a GUI representation. You can of course use the arping protocol in your rules. + +The ping protocol doesn't have a GUI representation. You can of course use the ping protocol in your rules. + +.. rubric:: Note + +The MAC address must be written in lowercase. \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/network/index.rst b/lib/ESPiLight/pilight/docs/source/protocols/network/index.rst new file mode 100644 index 0000000..095e603 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/network/index.rst @@ -0,0 +1,8 @@ +Network +======= + +.. toctree:: + :maxdepth: 3 + + ping + arping \ No newline at end of file diff --git a/lib/ESPiLight/pilight/docs/source/protocols/network/ping.rst b/lib/ESPiLight/pilight/docs/source/protocols/network/ping.rst new file mode 100644 index 0000000..b22a880 --- /dev/null +++ b/lib/ESPiLight/pilight/docs/source/protocols/network/ping.rst @@ -0,0 +1,82 @@ +.. |yes| image:: ../../images/yes.png +.. |no| image:: ../../images/no.png + +.. role:: underline + :class: underline + +Ping +==== + ++------------------+-------------+ +| **Feature** | **Support** | ++------------------+-------------+ +| Sending | |no| | ++------------------+-------------+ +| Receiving | |yes| | ++------------------+-------------+ +| Config | |yes| | ++------------------+-------------+ + +.. rubric:: Supported Brands + +*None* + +.. rubric:: Sender Arguments + +*None* + +.. rubric:: Config + +.. code-block:: json + :linenos: + + { + "devices": { + "ping": { + "protocol": [ "ping" ], + "id": [{ + "ip": "x.x.x.x" + }], + "state": "connected" + } + } + } + ++------------------+--------------------------+ +| **Option** | **Value** | ++------------------+--------------------------+ +| ip | *valid ip address* | ++------------------+--------------------------+ +| state | connected / disconnected | ++------------------+--------------------------+ + +.. rubric:: Optional Settings + +:underline:`Device Settings` + ++--------------------+-------------+------------+--------------------------------------------------+ +| **Setting** | **Default** | **Format** | **Description** | ++--------------------+-------------+------------+--------------------------------------------------+ +| poll-interval | 1 | >= 1 | How often do we want to ping the ip (in seconds) | ++--------------------+-------------+------------+--------------------------------------------------+ + +.. rubric::: Comment + + +The ping protocol uses the ICMP ECHO request command and reports the state DISCONNECTED if it receives a response that it is not an ECHO REPLY. + +The ping protocol doesn't have a GUI representation. You can of course use the ping protocol in your rules. + +.. rubric:: Status Replies + +| 3 - Destination Unreachable +| 4 - Source Quench +| 5 - Redirect (change route) +| 11 - Time Exceeded +| 12 - Parameter Problem +| 13 - Timestamp Request +| 14 - Timestamp Reply +| 15 - Information Request +| 16 - Information Reply +| 17 - Address Mask Request +| 18 - Address Mask Reply \ No newline at end of file diff --git a/lib/ESPiLight/pilight/flash.c b/lib/ESPiLight/pilight/flash.c new file mode 100644 index 0000000..2cf6d65 --- /dev/null +++ b/lib/ESPiLight/pilight/flash.c @@ -0,0 +1,176 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 +#include +#endif + +#include "libs/pilight/core/threads.h" +#include "libs/pilight/core/pilight.h" +#include "libs/pilight/core/gc.h" +#include "libs/pilight/core/common.h" +#include "libs/pilight/core/log.h" +#include "libs/pilight/core/options.h" +#include "libs/pilight/core/firmware.h" + +#include "libs/pilight/events/events.h" + +int main(int argc, char **argv) { + // memtrack(); + + atomicinit(); + log_shell_enable(); + log_file_disable(); + + struct options_t *options = NULL; + char *configtmp = MALLOC(strlen(CONFIG_FILE)+1); + char *args = NULL; + char *fwfile = NULL; + char comport[255]; + + memset(&comport, '\0', 255); + + strcpy(configtmp, CONFIG_FILE); + + if((progname = MALLOC(15)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(progname, "pilight-flash"); + + options_add(&options, 'H', "help", OPTION_NO_VALUE, 0, JSON_NULL, NULL, NULL); + options_add(&options, 'V', "version", OPTION_NO_VALUE, 0, JSON_NULL, NULL, NULL); + options_add(&options, 'C', "config", OPTION_HAS_VALUE, 0, JSON_NULL, NULL, NULL); + options_add(&options, 'f', "file", OPTION_HAS_VALUE, 0, JSON_NULL, NULL, NULL); + options_add(&options, 'p', "comport", OPTION_HAS_VALUE, 0, JSON_NULL, NULL, NULL); + + while (1) { + int c; + c = options_parse(&options, argc, argv, 1, &args); + if(c == -1) + break; + if(c == -2) + c = 'H'; + switch (c) { + case 'H': + printf("Usage: %s [options]\n", progname); + printf("\t -H --help\t\tdisplay usage summary\n"); + printf("\t -V --version\t\tdisplay version\n"); + printf("\t -C --config\t\tconfig file\n"); + printf("\t -p --comport\t\tserial COM port\n"); + printf("\t -f --file=firmware\tfirmware file\n"); + goto close; + break; + case 'V': + printf("%s v%s\n", progname, PILIGHT_VERSION); + goto close; + break; + case 'C': + configtmp = REALLOC(configtmp, strlen(args)+1); + strcpy(configtmp, args); + break; + case 'p': + strcpy(comport, args); + break; + case 'f': + if(access(args, F_OK) != -1) { + fwfile = REALLOC(fwfile, strlen(args)+1); + strcpy(fwfile, args); + } else { + fprintf(stderr, "%s: the firmware file %s does not exist\n", progname, args); + goto close; + } + break; + default: + printf("Usage: %s -f pilight_firmware_tX5_v3.hex\n", progname); + goto close; + break; + } + } + + if(config_set_file(configtmp) == EXIT_FAILURE) { + goto close; + } + + protocol_init(); + config_init(); + if(config_read() != EXIT_SUCCESS) { + FREE(configtmp); + goto close; + } + +#ifdef _WIN32 + if(fwfile == NULL || strlen(fwfile) == 0 || strlen(comport) == 0) { + printf("Usage: %s -f pilight_firmware_XXX_vX.hex -p comX\n", progname); + goto close; + } +#else + if(fwfile == NULL || strlen(fwfile) == 0) { + printf("Usage: %s -f pilight_firmware_XXX_vX.hex\n", progname); + goto close; + } +#endif + + log_level_set(LOG_DEBUG); + firmware.version = 0; + logprintf(LOG_INFO, "**** START UPD. FW ****"); + firmware_getmp(comport); + + if(firmware_update(fwfile, comport) != 0) { + logprintf(LOG_INFO, "**** FAILED UPD. FW ****"); + } else { + logprintf(LOG_INFO, "**** DONE UPD. FW ****"); + } + +close: + log_shell_disable(); + options_delete(options); + if(fwfile != NULL) { + FREE(fwfile); + } + if(configtmp != NULL) { + FREE(configtmp); + } + log_shell_disable(); + log_level_set(LOG_ERR); + config_gc(); + protocol_gc(); + options_gc(); +#ifdef EVENTS + events_gc(); +#endif +#ifndef _WIN32 + wiringXGC(); +#endif + log_gc(); + threads_gc(); + gc_clear(); + FREE(progname); + xfree(); + return (EXIT_SUCCESS); +} diff --git a/lib/ESPiLight/pilight/inc/CMakeLists.txt b/lib/ESPiLight/pilight/inc/CMakeLists.txt new file mode 100644 index 0000000..b279a6a --- /dev/null +++ b/lib/ESPiLight/pilight/inc/CMakeLists.txt @@ -0,0 +1,5 @@ +project(inc) + +include(../CMakeConfig.txt) + +configure_file(${PROJECT_SOURCE_DIR}/defines.h.in ${PROJECT_SOURCE_DIR}/defines.h) \ No newline at end of file diff --git a/lib/ESPiLight/pilight/inc/defines.h.in b/lib/ESPiLight/pilight/inc/defines.h.in new file mode 100644 index 0000000..3f01c6a --- /dev/null +++ b/lib/ESPiLight/pilight/inc/defines.h.in @@ -0,0 +1,98 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _DEFINES_H_ +#define _DEFINES_H_ + +#cmakedefine WEBSERVER +#cmakedefine EVENTS + +#define PILIGHT_VERSION "7.0" +#define PULSE_DIV 34 +#define MAXPULSESTREAMLENGTH 512 +#define EPSILON 0.00001 +#define SHA256_ITERATIONS 25000 + +#ifdef WEBSERVER + #define WEBSERVER_HTTP_PORT 5001 + #define WEBSERVER_HTTPS_PORT 5002 + #ifdef _WIN32 + #define WEBSERVER_ROOT "c:/pilight/web/" + #else + #define WEBSERVER_ROOT "/usr/local/pilight/webgui/" + #endif + #define WEBSERVER_ENABLE 1 + #define WEBSERVER_CACHE 1 + #define MAX_UPLOAD_FILESIZE 5242880 + #define MAX_CACHE_FILESIZE 1048576 + #define WEBSERVER_WORKERS 1 + #define WEBSERVER_CHUNK_SIZE 4096 + #define WEBGUI_WEBSOCKETS 1 + #cmakedefine WEBSERVER_HTTPS 1 +#endif + +#define MAX_CLIENTS 30 +#define BUFFER_SIZE 1025 +#define MEMBUFFER 128 +#define EOSS "\n\n" // End Of Socket Stream + +#ifdef _WIN32 + #define PROTOCOL_ROOT "c:/pilight/protocols/" + #define HARDWARE_ROOT "c:/pilight/hardware/" + #define OPERATOR_ROOT "c:/pilight/operators/" + #define FUNCTION_ROOT "c:/pilight/functions/" + #define ACTION_ROOT "c:/pilight/actions/" + + #define CONFIG_FILE "c:/pilight/config.json" + #define LOG_FILE "c:/pilight/pilight.log" + #define PEM_FILE "c:/pilight/pilight.pem" +#else + #define PROTOCOL_ROOT "/usr/local/lib/pilight/protocols/" + #define HARDWARE_ROOT "/usr/local/lib/pilight/hardware/" + #define OPERATOR_ROOT "/usr/local/lib/pilight/operators/" + #define FUNCTION_ROOT "/usr/local/lib/pilight/functions/" + #define ACTION_ROOT "/usr/local/lib/pilight/actions/" + + #define PID_FILE "/var/run/pilight.pid" + #define CONFIG_FILE "/etc/pilight/config.json" + #define LOG_FILE "/var/log/pilight.log" + #define PEM_FILE "/etc/pilight/pilight.pem" +#endif +#define LOG_MAX_SIZE 1048576 // 1024*1024 + +#define UUID_LENGTH 21 + +#define FIRMWARE_PATH "c:/pilight/" +#define FIRMWARE_GPIO_RESET 10 +#define FIRMWARE_GPIO_SCK 14 +#define FIRMWARE_GPIO_MOSI 12 +#define FIRMWARE_GPIO_MISO 13 + +#define PILIGHT_V 7 + +#define GPIO_PLATFORM "none" + +#if !defined(PATH_MAX) + #if defined(_POSIX_PATH_MAX) + #define PATH_MAX _POSIX_PATH_MAX + #else + #define PATH_MAX 1024 + #endif +#endif + +#endif diff --git a/lib/ESPiLight/pilight/inc/i2c-dev.h b/lib/ESPiLight/pilight/inc/i2c-dev.h new file mode 100644 index 0000000..39f0fd5 --- /dev/null +++ b/lib/ESPiLight/pilight/inc/i2c-dev.h @@ -0,0 +1,335 @@ +/* + i2c-dev.h - i2c-bus driver, char device interface + + Copyright (C) 1995-97 Simon G. Vogl + Copyright (C) 1998-99 Frodo Looijaard + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301 USA. +*/ + +/* $Id: i2c-dev.h 5894 2010-12-12 13:22:29Z khali $ */ + +#ifndef LIB_I2CDEV_H +#define LIB_I2CDEV_H + +#include +#include + + +/* -- i2c.h -- */ + + +/* + * I2C Message - used for pure i2c transaction, also from /dev interface + */ +struct i2c_msg { + __u16 addr; /* slave address */ + unsigned short flags; +#define I2C_M_TEN 0x10 /* we have a ten bit chip address */ +#define I2C_M_RD 0x01 +#define I2C_M_NOSTART 0x4000 +#define I2C_M_REV_DIR_ADDR 0x2000 +#define I2C_M_IGNORE_NAK 0x1000 +#define I2C_M_NO_RD_ACK 0x0800 + short len; /* msg length */ + char *buf; /* pointer to msg data */ +}; + +/* To determine what functionality is present */ + +#define I2C_FUNC_I2C 0x00000001 +#define I2C_FUNC_10BIT_ADDR 0x00000002 +#define I2C_FUNC_PROTOCOL_MANGLING 0x00000004 /* I2C_M_{REV_DIR_ADDR,NOSTART,..} */ +#define I2C_FUNC_SMBUS_PEC 0x00000008 +#define I2C_FUNC_SMBUS_BLOCK_PROC_CALL 0x00008000 /* SMBus 2.0 */ +#define I2C_FUNC_SMBUS_QUICK 0x00010000 +#define I2C_FUNC_SMBUS_READ_BYTE 0x00020000 +#define I2C_FUNC_SMBUS_WRITE_BYTE 0x00040000 +#define I2C_FUNC_SMBUS_READ_BYTE_DATA 0x00080000 +#define I2C_FUNC_SMBUS_WRITE_BYTE_DATA 0x00100000 +#define I2C_FUNC_SMBUS_READ_WORD_DATA 0x00200000 +#define I2C_FUNC_SMBUS_WRITE_WORD_DATA 0x00400000 +#define I2C_FUNC_SMBUS_PROC_CALL 0x00800000 +#define I2C_FUNC_SMBUS_READ_BLOCK_DATA 0x01000000 +#define I2C_FUNC_SMBUS_WRITE_BLOCK_DATA 0x02000000 +#define I2C_FUNC_SMBUS_READ_I2C_BLOCK 0x04000000 /* I2C-like block xfer */ +#define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK 0x08000000 /* w/ 1-byte reg. addr. */ + +#define I2C_FUNC_SMBUS_BYTE (I2C_FUNC_SMBUS_READ_BYTE | \ + I2C_FUNC_SMBUS_WRITE_BYTE) +#define I2C_FUNC_SMBUS_BYTE_DATA (I2C_FUNC_SMBUS_READ_BYTE_DATA | \ + I2C_FUNC_SMBUS_WRITE_BYTE_DATA) +#define I2C_FUNC_SMBUS_WORD_DATA (I2C_FUNC_SMBUS_READ_WORD_DATA | \ + I2C_FUNC_SMBUS_WRITE_WORD_DATA) +#define I2C_FUNC_SMBUS_BLOCK_DATA (I2C_FUNC_SMBUS_READ_BLOCK_DATA | \ + I2C_FUNC_SMBUS_WRITE_BLOCK_DATA) +#define I2C_FUNC_SMBUS_I2C_BLOCK (I2C_FUNC_SMBUS_READ_I2C_BLOCK | \ + I2C_FUNC_SMBUS_WRITE_I2C_BLOCK) + +/* Old name, for compatibility */ +#define I2C_FUNC_SMBUS_HWPEC_CALC I2C_FUNC_SMBUS_PEC + +/* + * Data for SMBus Messages + */ +#define I2C_SMBUS_BLOCK_MAX 32 /* As specified in SMBus standard */ +#define I2C_SMBUS_I2C_BLOCK_MAX 32 /* Not specified but we use same structure */ +union i2c_smbus_data { + __u8 byte; + __u16 word; + __u8 block[I2C_SMBUS_BLOCK_MAX + 2]; /* block[0] is used for length */ + /* and one more for PEC */ +}; + +/* smbus_access read or write markers */ +#define I2C_SMBUS_READ 1 +#define I2C_SMBUS_WRITE 0 + +/* SMBus transaction types (size parameter in the above functions) + Note: these no longer correspond to the (arbitrary) PIIX4 internal codes! */ +#define I2C_SMBUS_QUICK 0 +#define I2C_SMBUS_BYTE 1 +#define I2C_SMBUS_BYTE_DATA 2 +#define I2C_SMBUS_WORD_DATA 3 +#define I2C_SMBUS_PROC_CALL 4 +#define I2C_SMBUS_BLOCK_DATA 5 +#define I2C_SMBUS_I2C_BLOCK_BROKEN 6 +#define I2C_SMBUS_BLOCK_PROC_CALL 7 /* SMBus 2.0 */ +#define I2C_SMBUS_I2C_BLOCK_DATA 8 + + +/* ----- commands for the ioctl like i2c_command call: + * note that additional calls are defined in the algorithm and hw + * dependent layers - these can be listed here, or see the + * corresponding header files. + */ + /* -> bit-adapter specific ioctls */ +#define I2C_RETRIES 0x0701 /* number of times a device address */ + /* should be polled when not */ + /* acknowledging */ +#define I2C_TIMEOUT 0x0702 /* set timeout - call with int */ + + +/* this is for i2c-dev.c */ +#define I2C_SLAVE 0x0703 /* Change slave address */ + /* Attn.: Slave address is 7 or 10 bits */ +#define I2C_SLAVE_FORCE 0x0706 /* Change slave address */ + /* Attn.: Slave address is 7 or 10 bits */ + /* This changes the address, even if it */ + /* is already taken! */ +#define I2C_TENBIT 0x0704 /* 0 for 7 bit addrs, != 0 for 10 bit */ + +#define I2C_FUNCS 0x0705 /* Get the adapter functionality */ +#define I2C_RDWR 0x0707 /* Combined R/W transfer (one stop only)*/ +#define I2C_PEC 0x0708 /* != 0 for SMBus PEC */ + +#define I2C_SMBUS 0x0720 /* SMBus-level access */ + +/* -- i2c.h -- */ + + +/* Note: 10-bit addresses are NOT supported! */ + +/* This is the structure as used in the I2C_SMBUS ioctl call */ +struct i2c_smbus_ioctl_data { + char read_write; + __u8 command; + int size; + union i2c_smbus_data *data; +}; + +/* This is the structure as used in the I2C_RDWR ioctl call */ +struct i2c_rdwr_ioctl_data { + struct i2c_msg *msgs; /* pointers to i2c_msgs */ + int nmsgs; /* number of i2c_msgs */ +}; + + +static inline __s32 i2c_smbus_access(int file, char read_write, __u8 command, + int size, union i2c_smbus_data *data) +{ + struct i2c_smbus_ioctl_data args; + + args.read_write = read_write; + args.command = command; + args.size = size; + args.data = data; + return ioctl(file,I2C_SMBUS,&args); +} + + +static inline __s32 i2c_smbus_write_quick(int file, __u8 value) +{ + return i2c_smbus_access(file,value,0,I2C_SMBUS_QUICK,NULL); +} + +static inline __s32 i2c_smbus_read_byte(int file) +{ + union i2c_smbus_data data; + if (i2c_smbus_access(file,I2C_SMBUS_READ,0,I2C_SMBUS_BYTE,&data)) + return -1; + else + return 0x0FF & data.byte; +} + +static inline __s32 i2c_smbus_write_byte(int file, __u8 value) +{ + return i2c_smbus_access(file,I2C_SMBUS_WRITE,value, + I2C_SMBUS_BYTE,NULL); +} + +static inline __s32 i2c_smbus_read_byte_data(int file, __u8 command) +{ + union i2c_smbus_data data; + if (i2c_smbus_access(file,I2C_SMBUS_READ,command, + I2C_SMBUS_BYTE_DATA,&data)) + return -1; + else + return 0x0FF & data.byte; +} + +static inline __s32 i2c_smbus_write_byte_data(int file, __u8 command, + __u8 value) +{ + union i2c_smbus_data data; + data.byte = value; + return i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_BYTE_DATA, &data); +} + +static inline __s32 i2c_smbus_read_word_data(int file, __u8 command) +{ + union i2c_smbus_data data; + if (i2c_smbus_access(file,I2C_SMBUS_READ,command, + I2C_SMBUS_WORD_DATA,&data)) + return -1; + else + return 0x0FFFF & data.word; +} + +static inline __s32 i2c_smbus_write_word_data(int file, __u8 command, + __u16 value) +{ + union i2c_smbus_data data; + data.word = value; + return i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_WORD_DATA, &data); +} + +static inline __s32 i2c_smbus_process_call(int file, __u8 command, __u16 value) +{ + union i2c_smbus_data data; + data.word = value; + if (i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_PROC_CALL,&data)) + return -1; + else + return 0x0FFFF & data.word; +} + + +/* Returns the number of read bytes */ +static inline __s32 i2c_smbus_read_block_data(int file, __u8 command, + __u8 *values) +{ + union i2c_smbus_data data; + int i; + if (i2c_smbus_access(file,I2C_SMBUS_READ,command, + I2C_SMBUS_BLOCK_DATA,&data)) + return -1; + else { + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; + } +} + +static inline __s32 i2c_smbus_write_block_data(int file, __u8 command, + __u8 length, const __u8 *values) +{ + union i2c_smbus_data data; + int i; + if (length > 32) + length = 32; + for (i = 1; i <= length; i++) + data.block[i] = values[i-1]; + data.block[0] = length; + return i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_BLOCK_DATA, &data); +} + +/* Returns the number of read bytes */ +/* Until kernel 2.6.22, the length is hardcoded to 32 bytes. If you + ask for less than 32 bytes, your code will only work with kernels + 2.6.23 and later. */ +static inline __s32 i2c_smbus_read_i2c_block_data(int file, __u8 command, + __u8 length, __u8 *values) +{ + union i2c_smbus_data data; + int i; + + if (length > 32) + length = 32; + data.block[0] = length; + if (i2c_smbus_access(file,I2C_SMBUS_READ,command, + length == 32 ? I2C_SMBUS_I2C_BLOCK_BROKEN : + I2C_SMBUS_I2C_BLOCK_DATA,&data)) + return -1; + else { + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; + } +} + +static inline __s32 i2c_smbus_write_i2c_block_data(int file, __u8 command, + __u8 length, + const __u8 *values) +{ + union i2c_smbus_data data; + int i; + if (length > 32) + length = 32; + for (i = 1; i <= length; i++) + data.block[i] = values[i-1]; + data.block[0] = length; + return i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_I2C_BLOCK_BROKEN, &data); +} + +/* Returns the number of read bytes */ +static inline __s32 i2c_smbus_block_process_call(int file, __u8 command, + __u8 length, __u8 *values) +{ + union i2c_smbus_data data; + int i; + if (length > 32) + length = 32; + for (i = 1; i <= length; i++) + data.block[i] = values[i-1]; + data.block[0] = length; + if (i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_BLOCK_PROC_CALL,&data)) + return -1; + else { + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; + } +} + + +#endif /* LIB_I2CDEV_H */ diff --git a/lib/ESPiLight/pilight/libs/CMakeLists.txt b/lib/ESPiLight/pilight/libs/CMakeLists.txt new file mode 100644 index 0000000..55c0742 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/CMakeLists.txt @@ -0,0 +1,23 @@ +project(libs) + +include(../CMakeConfig.txt) + +if(${MODULESPACK} MATCHES "OFF" OR WIN32) + set(${PROJECT_NAME}_files "" CACHE INTERNAL "") + + add_subdirectory(libuv) + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_files} ${libuv_files} CACHE INTERNAL "") + + add_subdirectory(avrdude) + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_files} ${avrdude_files} CACHE INTERNAL "") + + if(${ZWAVE} MATCHES "ON") + add_subdirectory(openzwave) + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_files} ${openzwave_files} CACHE INTERNAL "") + endif() + + add_subdirectory(pilight) + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_files} ${pilight_files} CACHE INTERNAL "") +else() + add_subdirectory(pilight) +endif() diff --git a/lib/ESPiLight/pilight/libs/avrdude/CMakeLists.txt b/lib/ESPiLight/pilight/libs/avrdude/CMakeLists.txt new file mode 100644 index 0000000..a8c4ab8 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/CMakeLists.txt @@ -0,0 +1,10 @@ +project(avrdude) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +if(WIN32) + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/avrgpio.c") +endif() + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/avrdude/arduino.c b/lib/ESPiLight/pilight/libs/avrdude/arduino.c new file mode 100644 index 0000000..6848adf --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/arduino.c @@ -0,0 +1,126 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2009 Lars Immisch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* $Id: arduino.c 1294 2014-03-12 23:03:18Z joerg_wunsch $ */ + +/* + * avrdude interface for Arduino programmer + * + * The Arduino programmer is mostly a STK500v1, just the signature bytes + * are read differently. + */ + +#include +#include +#include + +#include "avrdude.h" +#include "pgm.h" +#include "stk500_private.h" +#include "stk500.h" +#include "serial.h" +#include "arduino.h" +#include "../pilight/core/log.h" + +/* read signature bytes - arduino version */ +static int arduino_read_sig_bytes(PROGRAMMER *pgm, AVRPART *p, AVRMEM *m) { + unsigned char buf[32]; + + /* Signature byte reads are always 3 bytes. */ + + if(m->size < 3) { + logprintf(LOG_ERR, "memsize too small for sig byte read"); + return -1; + } + + buf[0] = Cmnd_STK_READ_SIGN; + buf[1] = Sync_CRC_EOP; + + serial_send(&pgm->fd, buf, 2); + + if(serial_recv(&pgm->fd, buf, 5) < 0) { + return -1; + } + if(buf[0] == Resp_STK_NOSYNC) { + logprintf(LOG_ERR, "stk500_cmd(): programmer is out of sync"); + return -1; + } else if (buf[0] != Resp_STK_INSYNC) { + logprintf(LOG_ERR, "arduino_read_sig_bytes(): (a) protocol error, expect=0x%02x, resp=0x%02x", Resp_STK_INSYNC, buf[0]); + return -2; + } + if(buf[4] != Resp_STK_OK) { + logprintf(LOG_ERR, "arduino_read_sig_bytes(): (a) protocol error, expect=0x%02x, resp=0x%02x", Resp_STK_OK, buf[4]); + return -3; + } + + m->buf[0] = buf[1]; + m->buf[1] = buf[2]; + m->buf[2] = buf[3]; + + return 3; +} + +static int arduino_open(PROGRAMMER * pgm, char * port) { + union pinfo pinfo; + strcpy(pgm->port, port); + pinfo.baud = pgm->baudrate? pgm->baudrate: 115200; + + if(serial_open(port, pinfo, &pgm->fd) == -1) { + return -1; + } + + /* Clear DTR and RTS to unload the RESET capacitor + * (for example in Arduino) */ + serial_set_dtr_rts(&pgm->fd, 0); + usleep(250*1000); + /* Set DTR and RTS back to high */ + serial_set_dtr_rts(&pgm->fd, 1); + usleep(50*1000); + + /* + * drain any extraneous input + */ + stk500_drain(pgm, 0); + + if(stk500_getsync(pgm) < 0) { + return -1; + } + + return 0; +} + +static void arduino_close(PROGRAMMER * pgm) { + serial_set_dtr_rts(&pgm->fd, 0); + serial_close(&pgm->fd); + pgm->fd.ifd = -1; +} + +const char arduino_desc[] = "Arduino programmer"; + +void arduino_initpgm(PROGRAMMER * pgm) { + /* This is mostly a STK500; just the signature is read + differently than on real STK500v1 + and the DTR signal is set when opening the serial port + for the Auto-Reset feature */ + stk500_initpgm(pgm); + + strcpy(pgm->type, "Arduino"); + pgm->read_sig_bytes = arduino_read_sig_bytes; + pgm->open = arduino_open; + pgm->close = arduino_close; +} diff --git a/lib/ESPiLight/pilight/libs/avrdude/arduino.h b/lib/ESPiLight/pilight/libs/avrdude/arduino.h new file mode 100644 index 0000000..c2072ea --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/arduino.h @@ -0,0 +1,29 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2009 Lars Immisch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* $Id: arduino.h 1294 2014-03-12 23:03:18Z joerg_wunsch $ */ + +#ifndef arduino_h__ +#define arduino_h__ + +extern const char arduino_desc[]; +void arduino_initpgm (PROGRAMMER * pgm); + +#endif + + diff --git a/lib/ESPiLight/pilight/libs/avrdude/avr.c b/lib/ESPiLight/pilight/libs/avrdude/avr.c new file mode 100644 index 0000000..25b8099 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/avr.c @@ -0,0 +1,915 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000-2004 Brian S. Dean + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: avr.c 907 2010-01-12 15:42:40Z joerg_wunsch $ */ + +#include +#include +#include +#include +#include +#include + +#include "avrdude.h" + +#include "../pilight/core/log.h" +#include "../pilight/core/common.h" +#include "avr.h" +#include "pindefs.h" +#include "safemode.h" + +FP_UpdateProgress avr_update_progress; + +void avr_set_update_progress(FP_UpdateProgress callback) { + avr_update_progress = callback; +} + +int parse_cmdbits(OPCODE * op, char *t) { + int bitno; + unsigned int n = 0, i = 0; + char ch; + char *e = NULL; + char *q = NULL; + int len; + char **array = NULL; + + bitno = 32; + n = explode(t, " ", &array); + for(i=0;ibit[bitno].type = AVR_CMDBIT_VALUE; + op->bit[bitno].value = 1; + op->bit[bitno].bitno = bitno % 8; + break; + case '0': + op->bit[bitno].type = AVR_CMDBIT_VALUE; + op->bit[bitno].value = 0; + op->bit[bitno].bitno = bitno % 8; + break; + case 'x': + op->bit[bitno].type = AVR_CMDBIT_IGNORE; + op->bit[bitno].value = 0; + op->bit[bitno].bitno = bitno % 8; + break; + case 'a': + op->bit[bitno].type = AVR_CMDBIT_ADDRESS; + op->bit[bitno].value = 0; + op->bit[bitno].bitno = 8*(bitno/8) + bitno % 8; + break; + case 'i': + op->bit[bitno].type = AVR_CMDBIT_INPUT; + op->bit[bitno].value = 0; + op->bit[bitno].bitno = bitno % 8; + break; + case 'o': + op->bit[bitno].type = AVR_CMDBIT_OUTPUT; + op->bit[bitno].value = 0; + op->bit[bitno].bitno = bitno % 8; + break; + default : + break; + } + } else { + if(ch == 'a') { + q = &array[i][1]; + op->bit[bitno].bitno = strtol(q, &e, 0); + op->bit[bitno].type = AVR_CMDBIT_ADDRESS; + op->bit[bitno].value = 0; + } + } + } + array_free(&array, n); + return 0; +} + +int avr_read_byte_default(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char * value) +{ + unsigned char cmd[4]; + unsigned char res[4]; + unsigned char data; + OPCODE * readop, * lext; + + if (pgm->cmd == NULL) { + logprintf(LOG_ERR, "%s programmer uses avr_read_byte_default() but does not provide a cmd() method", pgm->type); + return -1; + } + + /* + * figure out what opcode to use + */ + if (mem->op[AVR_OP_READ_LO]) { + if (addr & 0x00000001) + readop = mem->op[AVR_OP_READ_HI]; + else + readop = mem->op[AVR_OP_READ_LO]; + addr = addr / 2; + } + else { + readop = mem->op[AVR_OP_READ]; + } + + if (readop == NULL) { + return -1; + } + + /* + * If this device has a "load extended address" command, issue it. + */ + lext = mem->op[AVR_OP_LOAD_EXT_ADDR]; + + if (lext != NULL) { + memset(cmd, 0, sizeof(cmd)); + + avr_set_bits(lext, cmd); + avr_set_addr(lext, cmd, addr); + pgm->cmd(pgm, cmd, res); + } + + memset(cmd, 0, sizeof(cmd)); + + avr_set_bits(readop, cmd); + avr_set_addr(readop, cmd, addr); + pgm->cmd(pgm, cmd, res); + data = 0; + avr_get_output(readop, res, &data); + + *value = data; + + return 0; +} + + +/* + * Return the number of "interesting" bytes in a memory buffer, + * "interesting" being defined as up to the last non-0xff data + * value. This is useful for determining where to stop when dealing + * with "flash" memory, since writing 0xff to flash is typically a + * no-op. Always return an even number since flash is word addressed. + */ +int avr_mem_hiaddr(AVRMEM * mem) +{ + int i, n; + + /* return the highest non-0xff address regardless of how much + memory was read */ + for (i=mem->size-1; i>0; i--) { + if (mem->buf[i] != 0xff) { + n = i+1; + if (n & 0x01) + return n+1; + else + return n; + } + } + + return 0; +} + + +/* + * Read the entirety of the specified memory type into the + * corresponding buffer of the avrpart pointed to by 'p'. If size = + * 0, read the entire contents, otherwise, read 'size' bytes. + * + * Return the number of bytes read, or < 0 if an error occurs. + */ +int avr_read(PROGRAMMER * pgm, AVRPART * p, char * memtype, int size) +{ + int wsize; + unsigned char rbyte; + unsigned long i; + unsigned char * buf; + AVRMEM * mem = NULL; + int rc; + + /* NEW */ + if(strcmp(memtype, "signature") == 0) { + mem = p->sigmem; + } else if(strcmp(memtype, "flash") == 0) { + mem = p->flashmem; + } else if(strcmp(memtype, "lfuse") == 0) { + mem = p->lfusemem; + } else if(strcmp(memtype, "hfuse") == 0) { + mem = p->hfusemem; + } + // mem = avr_locate_mem(p, memtype); + if (mem == NULL) { + logprintf(LOG_ERR, "No \"%s\" memory for part %s", memtype, p->desc); + return -1; + } + + wsize = mem->size; + if (size < wsize) { + wsize = size; + } + + buf = mem->buf; + if (size == 0) { + size = mem->size; + } + + /* + * start with all 0xff + */ + memset(buf, 0xff, size); + + if (pgm->paged_load != NULL && mem->page_size != 0) { + /* + * the programmer supports a paged mode read + */ + int need_read, failure; + unsigned int pageaddr; + unsigned int npages, nread; + + /* quickly scan number of pages to be written to first */ + for (pageaddr = 0, npages = 0; + pageaddr < wsize; + pageaddr += mem->page_size) { + /* check whether this page must be read */ + for (i = pageaddr; + i < pageaddr + mem->page_size; + i++) + if (i < mem->size) { + npages++; + break; + } + } + + for (pageaddr = 0, failure = 0, nread = 0; + !failure && pageaddr < wsize; + pageaddr += mem->page_size) { + /* check whether this page must be read */ + for (i = pageaddr, need_read = 0; + i < pageaddr + mem->page_size; + i++) + if (i < mem->size) { + need_read = 1; + break; + } + if (need_read) { + rc = pgm->paged_load(pgm, p, mem, mem->page_size, + pageaddr, mem->page_size); + if (rc < 0) + /* paged load failed, fall back to byte-at-a-time read below */ + failure = 1; + } + nread++; + report_progress(nread, npages, NULL); + } + if (!failure) { + if (strcasecmp(mem->desc, "flash") == 0 || + strcasecmp(mem->desc, "application") == 0 || + strcasecmp(mem->desc, "apptable") == 0 || + strcasecmp(mem->desc, "boot") == 0) + return avr_mem_hiaddr(mem); + else + return mem->size; + } + } + + if (strcmp(mem->desc, "signature") == 0) { + if (pgm->read_sig_bytes) { + return pgm->read_sig_bytes(pgm, p, mem); + } + } + + for (i=0; iread_byte(pgm, p, mem, i, &rbyte); + if (rc != 0) { + logprintf(LOG_ERR, "avr_read(): error reading address 0x%04lx", i); + if (rc == -1) + logprintf(LOG_ERR, "read operation not supported for memory \"%s\"", memtype); + return -2; + } + buf[i] = rbyte; + report_progress(i, size, NULL); + } + + if (strcasecmp(mem->desc, "flash") == 0) + return avr_mem_hiaddr(mem); + else + return i; +} + + +/* + * write a page data at the specified address + */ +int avr_write_page(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr) +{ + unsigned char cmd[4]; + unsigned char res[4]; + OPCODE * wp, * lext; + + if (pgm->cmd == NULL) { + logprintf(LOG_ERR, "%s programmer uses avr_write_page() but does not provide a cmd() method", pgm->type); + return -1; + } + + wp = mem->op[AVR_OP_WRITEPAGE]; + if (wp == NULL) { + logprintf(LOG_ERR, "avr_write_page(): memory \"%s\" not configured for page writes", mem->desc); + return -1; + } + + /* + * if this memory is word-addressable, adjust the address + * accordingly + */ + if ((mem->op[AVR_OP_LOADPAGE_LO]) || (mem->op[AVR_OP_READ_LO])) + addr = addr / 2; + + /* + * If this device has a "load extended address" command, issue it. + */ + lext = mem->op[AVR_OP_LOAD_EXT_ADDR]; + if (lext != NULL) { + memset(cmd, 0, sizeof(cmd)); + + avr_set_bits(lext, cmd); + avr_set_addr(lext, cmd, addr); + pgm->cmd(pgm, cmd, res); + } + + memset(cmd, 0, sizeof(cmd)); + + avr_set_bits(wp, cmd); + avr_set_addr(wp, cmd, addr); + pgm->cmd(pgm, cmd, res); + + /* + * since we don't know what voltage the target AVR is powered by, be + * conservative and delay the max amount the spec says to wait + */ + usleep(mem->max_write_delay); + + return 0; +} + + +int avr_write_byte_default(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char data) +{ + unsigned char cmd[4]; + unsigned char res[4]; + unsigned char r; + int ready; + int tries; + unsigned long start_time; + unsigned long prog_time; + unsigned char b; + unsigned short caddr; + OPCODE * writeop; + int rc; + int readok=0; + struct timeval tv; + + if (pgm->cmd == NULL) { + logprintf(LOG_ERR, "%s programmer uses avr_write_byte_default() but does not provide a cmd() method.", pgm->type); + return -1; + } + + if (!mem->paged) { + /* + * check to see if the write is necessary by reading the existing + * value and only write if we are changing the value; we can't + * use this optimization for paged addressing. + */ + rc = pgm->read_byte(pgm, p, mem, addr, &b); + if (rc != 0) { + if (rc != -1) { + return -2; + } + /* + * the read operation is not support on this memory type + */ + } + else { + readok = 1; + if (b == data) { + return 0; + } + } + } + + /* + * determine which memory opcode to use + */ + if (mem->op[AVR_OP_WRITE_LO]) { + if (addr & 0x01) + writeop = mem->op[AVR_OP_WRITE_HI]; + else + writeop = mem->op[AVR_OP_WRITE_LO]; + caddr = addr / 2; + } + else if (mem->paged && mem->op[AVR_OP_LOADPAGE_LO]) { + if (addr & 0x01) + writeop = mem->op[AVR_OP_LOADPAGE_HI]; + else + writeop = mem->op[AVR_OP_LOADPAGE_LO]; + caddr = addr / 2; + } + else { + writeop = mem->op[AVR_OP_WRITE]; + caddr = addr; + } + + if (writeop == NULL) { + return -1; + } + + memset(cmd, 0, sizeof(cmd)); + + avr_set_bits(writeop, cmd); + avr_set_addr(writeop, cmd, caddr); + avr_set_input(writeop, cmd, data); + pgm->cmd(pgm, cmd, res); + + if (mem->paged) { + /* + * in paged addressing, single bytes to be written to the memory + * page complete immediately, we only need to delay when we commit + * the whole page via the avr_write_page() routine. + */ + return 0; + } + + if (readok == 0) { + /* + * read operation not supported for this memory type, just wait + * the max programming time and then return + */ + usleep(mem->max_write_delay); /* maximum write delay */ + return 0; + } + + tries = 0; + ready = 0; + while (!ready) { + + if ((data == mem->readback[0]) || + (data == mem->readback[1])) { + /* + * use an extra long delay when we happen to be writing values + * used for polled data read-back. In this case, polling + * doesn't work, and we need to delay the worst case write time + * specified for the chip. + */ + usleep(mem->max_write_delay); + rc = pgm->read_byte(pgm, p, mem, addr, &r); + if (rc != 0) { + return -5; + } + } + else { + gettimeofday (&tv, NULL); + start_time = (tv.tv_sec * 1000000) + tv.tv_usec; + do { + /* + * Do polling, but timeout after max_write_delay. + */ + rc = pgm->read_byte(pgm, p, mem, addr, &r); + if (rc != 0) { + return -4; + } + gettimeofday (&tv, NULL); + prog_time = (tv.tv_sec * 1000000) + tv.tv_usec; + } while ((r != data) && + ((prog_time-start_time) < mem->max_write_delay)); + } + + /* + * At this point we either have a valid readback or the + * max_write_delay is expired. + */ + + if (r == data) { + ready = 1; + } + else if (mem->pwroff_after_write) { + /* + * The device has been flagged as power-off after write to this + * memory type. The reason we don't just blindly follow the + * flag is that the power-off advice may only apply to some + * memory bits but not all. We only actually power-off the + * device if the data read back does not match what we wrote. + */ + logprintf(LOG_NOTICE, "this device must be powered off and back on to continue"); + if (pgm->pinno[PPI_AVR_VCC]) { + logprintf(LOG_NOTICE, "attempting to do this now ..."); + pgm->powerdown(pgm); + usleep(250000); + rc = pgm->initialize(pgm, p); + if (rc < 0) { + logprintf(LOG_ERR, "initialization failed, rc=%d", rc); + logprintf(LOG_ERR, "can't re-initialize device after programming the %s bits", mem->desc); + return -3; + } + + logprintf(LOG_NOTICE, "device was successfully re-initialized"); + return 0; + } + } + + tries++; + if (!ready && tries > 5) { + /* + * we wrote the data, but after waiting for what should have + * been plenty of time, the memory cell still doesn't match what + * we wrote. Indicate a write error. + */ + return -6; + } + } + + return 0; +} + + +/* + * write a byte of data at the specified address + */ +int avr_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char data) +{ + + unsigned char safemode_lfuse; + unsigned char safemode_hfuse; + unsigned char safemode_efuse; + unsigned char safemode_fuse; + + /* If we write the fuses, then we need to tell safemode that they *should* change */ + safemode_memfuses(0, &safemode_lfuse, &safemode_hfuse, &safemode_efuse, &safemode_fuse); + + if (strcmp(mem->desc, "fuse")==0) { + safemode_fuse = data; + } + if (strcmp(mem->desc, "lfuse")==0) { + safemode_lfuse = data; + } + if (strcmp(mem->desc, "hfuse")==0) { + safemode_hfuse = data; + } + if (strcmp(mem->desc, "efuse")==0) { + safemode_efuse = data; + } + + safemode_memfuses(1, &safemode_lfuse, &safemode_hfuse, &safemode_efuse, &safemode_fuse); + + return pgm->write_byte(pgm, p, mem, addr, data); +} + + +/* + * Write the whole memory region of the specified memory from the + * corresponding buffer of the avrpart pointed to by 'p'. Write up to + * 'size' bytes from the buffer. Data is only written if the new data + * value is different from the existing data value. Data beyond + * 'size' bytes is not affected. + * + * Return the number of bytes written, or -1 if an error occurs. + */ +int avr_write(PROGRAMMER * pgm, AVRPART * p, char * memtype, int size) +{ + int rc; + int wsize; + long i; + unsigned char data; + AVRMEM * m = NULL; + + /* NEW */ + if(strcmp(memtype, "flash") == 0) { + m = p->flashmem; + } else if(strcmp(memtype, "lfuse") == 0) { + m = p->lfusemem; + } else if(strcmp(memtype, "hfuse") == 0) { + m = p->hfusemem; + } + + if (m == NULL) { + logprintf(LOG_ERR, "No \"%s\" memory for part %s", memtype, p->desc); + return -1; + } + + wsize = m->size; + if (size < wsize) { + wsize = size; + } + else if (size > wsize) { + logprintf(LOG_ERR, "%d bytes requested, but memory region is only %d bytes", size, wsize); + logprintf(LOG_ERR, "Only %d bytes will actually be written", wsize); + } + + if (pgm->paged_write != NULL && m->page_size != 0) { + /* + * the programmer supports a paged mode write + */ + int need_write, failure; + unsigned int pageaddr; + unsigned int npages, nwritten; + + /* quickly scan number of pages to be written to first */ + for (pageaddr = 0, npages = 0; + pageaddr < wsize; + pageaddr += m->page_size) { + /* check whether this page must be written to */ + for (i = pageaddr; + i < pageaddr + m->page_size; + i++) + if (i < m->size) { + npages++; + break; + } + } + + for (pageaddr = 0, failure = 0, nwritten = 0; + !failure && pageaddr < wsize; + pageaddr += m->page_size) { + /* check whether this page must be written to */ + for (i = pageaddr, need_write = 0; + i < pageaddr + m->page_size; + i++) + if (i < m->size) { + need_write = 1; + break; + } + if (need_write) { + rc = 0; + if (rc >= 0) + rc = pgm->paged_write(pgm, p, m, m->page_size, pageaddr, m->page_size); + if (rc < 0) + /* paged write failed, fall back to byte-at-a-time write below */ + failure = 1; + } + nwritten++; + report_progress(nwritten, npages, NULL); + } + if (!failure) + return wsize; + /* else: fall back to byte-at-a-time write, for historical reasons */ + } + + if (pgm->write_setup) { + pgm->write_setup(pgm, p, m); + } + + for (i=0; ibuf[i]; + report_progress(i, wsize, NULL); + + rc = avr_write_byte(pgm, p, m, i, data); + if (rc) { + logprintf(LOG_ERR, "***failed"); + } + + if (m->paged) { + /* + * check to see if it is time to flush the page with a page + * write + */ + if (((i % m->page_size) == m->page_size-1) || + (i == wsize-1)) { + rc = avr_write_page(pgm, p, m, i); + if (rc) { + logprintf(LOG_ERR, " *** page %ld (addresses 0x%04lx - 0x%04lx) failed to write", + i % m->page_size, + i - m->page_size + 1, i); + } + } + } + } + + return i; +} + + + +/* + * read the AVR device's signature bytes + */ +int avr_signature(PROGRAMMER * pgm, AVRPART * p) +{ + int rc; + + report_progress (0,1,"Reading"); + rc = avr_read(pgm, p, "signature", 0); + if (rc < 0) { + logprintf(LOG_ERR, "error reading signature data for part \"%s\", rc=%d", p->desc, rc); + return -1; + } + report_progress (1,1,NULL); + + return 0; +} + + +/* + * Verify the memory buffer of p with that of v. The byte range of v, + * may be a subset of p. The byte range of p should cover the whole + * chip's memory size. + * + * Return the number of bytes verified, or -1 if they don't match. + */ +int avr_verify(AVRPART * p, AVRPART * v, char * memtype, int size) +{ + int i; + unsigned char * buf1, * buf2; + int vsize; + AVRMEM * a = NULL, * b = NULL; + + /* NEW */ + if(strcmp(memtype, "flash") == 0) { + a = p->flashmem; + } else if(strcmp(memtype, "lfuse") == 0) { + a = p->lfusemem; + } else if(strcmp(memtype, "hfuse") == 0) { + a = p->hfusemem; + } + if (a == NULL) { + logprintf(LOG_ERR, "No \"%s\" memory for part %s", memtype, p->desc); + return -1; + } + + /* NEW */ + if(strcmp(memtype, "flash") == 0) { + b = v->flashmem; + } else if(strcmp(memtype, "lfuse") == 0) { + b = v->lfusemem; + } else if(strcmp(memtype, "hfuse") == 0) { + b = v->hfusemem; + } + if (b == NULL) { + logprintf(LOG_ERR, "No \"%s\" memory for part %s", memtype, p->desc); + return -1; + } + + buf1 = a->buf; + buf2 = b->buf; + vsize = a->size; + + if (vsize < size) { + logprintf(LOG_ERR, "requested verification for %d bytes", size); + logprintf(LOG_ERR, "%s memory region only contains %d bytes", memtype, vsize); + logprintf(LOG_ERR, "Only %d bytes will be verified.", vsize); + size = vsize; + } + + for (i=0; i0; i--) { + rc = pgm->read_byte(pgm, p, a, a->size-i, &v1); + if (rc < 0) { + logprintf(LOG_ERR, "can't read memory for cycle count, rc=%d", rc); + return -1; + } + cycle_count = (cycle_count << 8) | v1; + } + + /* + * If the EEPROM is erased, the cycle count reads 0xffffffff. + * In this case we return a cycle_count of zero. + * So, the calling function don't have to care about whether or not + * the cycle count was initialized. + */ + if (cycle_count == 0xffffffff) { + cycle_count = 0; + } + + *cycles = (int) cycle_count; + + return 0; +} + + +int avr_put_cycle_count(PROGRAMMER * pgm, AVRPART * p, int cycles) +{ + AVRMEM * a = NULL; + unsigned char v1; + int rc; + int i; + + // a = avr_locate_mem(p, "eeprom"); + if (a == NULL) { + return -1; + } + + for (i=1; i<=4; i++) { + v1 = cycles & 0xff; + cycles = cycles >> 8; + + rc = avr_write_byte(pgm, p, a, a->size-i, v1); + if (rc < 0) { + logprintf(LOG_ERR, "can't write memory for cycle count, rc=%d", rc); + return -1; + } + } + + return 0; + } + +int avr_chip_erase(PROGRAMMER * pgm, AVRPART * p) +{ + int rc; + + rc = pgm->chip_erase(pgm, p); + + return rc; +} + +/* + * Report the progress of a read or write operation from/to the + * device. + * + * The first call of report_progress() should look like this (for a write op): + * + * report_progress (0, 1, "Writing"); + * + * Then hdr should be passed NULL on subsequent calls while the + * operation is progressing. Once the operation is complete, a final + * call should be made as such to ensure proper termination of the + * progress report: + * + * report_progress (1, 1, NULL); + * + * It would be nice if we could reduce the usage to one and only one + * call for each of start, during and end cases. As things stand now, + * that is not possible and makes maintenance a bit more work. + */ +void report_progress (int completed, int total, char *hdr) +{ + static int last = 0; + static double start_time; + int percent = (completed * 100) / total; + struct timeval tv; + double t; + + if (avr_update_progress == NULL) + return; + + gettimeofday(&tv, NULL); + t = tv.tv_sec + ((double)tv.tv_usec)/1000000; + + if (hdr) { + last = 0; + start_time = t; + avr_update_progress (percent, t - start_time, hdr); + } + + if (percent > 100) + percent = 100; + + if (percent > last) { + last = percent; + avr_update_progress (percent, t - start_time, hdr); + } + + if (percent == 100) + last = 0; /* Get ready for next time. */ +} diff --git a/lib/ESPiLight/pilight/libs/avrdude/avr.h b/lib/ESPiLight/pilight/libs/avrdude/avr.h new file mode 100644 index 0000000..c85303c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/avr.h @@ -0,0 +1,76 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000-2004 Brian S. Dean + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: avr.h 804 2009-02-23 22:04:57Z joerg_wunsch $ */ + +#ifndef __avr_h__ +#define __avr_h__ + +#include + +#include "avrpart.h" +#include "pgm.h" + +typedef void (*FP_UpdateProgress)(int percent, double etime, char *hdr); + +extern struct avrpart parts[]; + +#ifdef __cplusplus +extern "C" { +#endif + +void avr_set_update_progress(FP_UpdateProgress callback); + +int parse_cmdbits(OPCODE * op, char *t); + +int avr_read_byte_default(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char * value); + +int avr_read(PROGRAMMER * pgm, AVRPART * p, char * memtype, int size); + +int avr_write_page(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr); + +int avr_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char data); + +int avr_write_byte_default(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char data); + +int avr_write(PROGRAMMER * pgm, AVRPART * p, char * memtype, int size); + +int avr_signature(PROGRAMMER * pgm, AVRPART * p); + +int avr_verify(AVRPART * p, AVRPART * v, char * memtype, int size); + +int avr_get_cycle_count(PROGRAMMER * pgm, AVRPART * p, int * cycles); + +int avr_put_cycle_count(PROGRAMMER * pgm, AVRPART * p, int cycles); + +int avr_mem_hiaddr(AVRMEM * mem); + +int avr_chip_erase(PROGRAMMER * pgm, AVRPART * p); + +void report_progress (int completed, int total, char *hdr); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/avrdude/avrbitbang.c b/lib/ESPiLight/pilight/libs/avrdude/avrbitbang.c new file mode 100644 index 0000000..ee1afc8 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/avrbitbang.c @@ -0,0 +1,341 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000, 2001, 2002, 2003 Brian S. Dean + * Copyright (C) 2005 Michael Holzt + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* $Id: bitbang.c 898 2010-01-08 20:02:35Z joerg_wunsch $ */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "../pilight/core/log.h" +#include "../pilight/core/mem.h" +#include "avrdude.h" +#include "avr.h" +#include "pindefs.h" +#include "pgm.h" + +#ifdef _WIN32 +struct itimerval { + struct timeval it_value, it_interval; +}; +#define SIGALRM 14 +#define ITIMER_REAL 0 +#endif + +static int delay_decrement; +static volatile int done; + +typedef void (*mysighandler_t)(int); +static mysighandler_t saved_alarmhandler; + +static void alarmhandler(int signo) +{ + done = 1; + signal(SIGALRM, saved_alarmhandler); +} + +/* + * Calibrate the microsecond delay loop below. + */ +static void bitbang_calibrate_delay(void) +{ + struct itimerval itv; + volatile int i; + + i = 0; + done = 0; + saved_alarmhandler = signal(SIGALRM, alarmhandler); + /* + * Set ITIMER_REAL to 100 ms. All known systems have a timer + * granularity of 10 ms or better, so counting the delay cycles + * accumulating over 100 ms should give us a rather realistic + * picture, without annoying the user by a lengthy startup time (as + * an alarm(1) would do). Of course, if heavy system activity + * happens just during calibration but stops before the remaining + * part of AVRDUDE runs, this will yield wrong values. There's not + * much we can do about this. + */ + itv.it_value.tv_sec = 0; + itv.it_value.tv_usec = 100000; + itv.it_interval.tv_sec = itv.it_interval.tv_usec = 0; +#ifndef _WIN32 + setitimer(ITIMER_REAL, &itv, 0); +#endif + while (!done) + i--; + itv.it_value.tv_sec = itv.it_value.tv_usec = 0; +#ifndef _WIN32 + setitimer(ITIMER_REAL, &itv, 0); +#endif + /* + * Calculate back from 100 ms to 1 us. + */ + delay_decrement = -i / 100000; +} + +/* + * Delay for approximately the number of microseconds specified. + * usleep()'s granularity is usually like 1 ms or 10 ms, so it's not + * really suitable for short delays in bit-bang algorithms. + */ +void bitbang_delay(int us) +{ + volatile int del = us * delay_decrement; + + while (del > 0) + del--; +} + +/* + * transmit and receive a byte of data to/from the AVR device + */ +static unsigned char bitbang_txrx(PROGRAMMER * pgm, unsigned char byte) +{ + int i; + unsigned char r, b, rbyte; + + rbyte = 0; + for (i=7; i>=0; i--) { + /* + * Write and read one bit on SPI. + * Some notes on timing: Let T be the time it takes to do + * one pgm->setpin()-call resp. par clrpin()-call, then + * - SCK is high for 2T + * - SCK is low for 2T + * - MOSI setuptime is 1T + * - MOSI holdtime is 3T + * - SCK low to MISO read is 2T to 3T + * So we are within programming specs (expect for AT90S1200), + * if and only if T>t_CLCL (t_CLCL=clock period of target system). + * + * Due to the delay introduced by "IN" and "OUT"-commands, + * T is greater than 1us (more like 2us) on x86-architectures. + * So programming works safely down to 1MHz target clock. + */ + + b = (byte >> i) & 0x01; + + /* set the data input line as desired */ + pgm->setpin(pgm, pgm->pinno[PIN_AVR_MOSI], b); + + pgm->setpin(pgm, pgm->pinno[PIN_AVR_SCK], 1); + + /* + * read the result bit (it is either valid from a previous falling + * edge or it is ignored in the current context) + */ + r = pgm->getpin(pgm, pgm->pinno[PIN_AVR_MISO]); + + pgm->setpin(pgm, pgm->pinno[PIN_AVR_SCK], 0); + + rbyte |= r << i; + } + + return rbyte; +} + + +int bitbang_rdy_led(PROGRAMMER * pgm, int value) +{ + // pgm->setpin(pgm, pgm->pinno[PIN_LED_RDY], !value); + return 0; +} + +int bitbang_err_led(PROGRAMMER * pgm, int value) +{ + // pgm->setpin(pgm, pgm->pinno[PIN_LED_ERR], !value); + return 0; +} + +int bitbang_pgm_led(PROGRAMMER * pgm, int value) +{ + // pgm->setpin(pgm, pgm->pinno[PIN_LED_PGM], !value); + return 0; +} + +int bitbang_vfy_led(PROGRAMMER * pgm, int value) +{ + // pgm->setpin(pgm, pgm->pinno[PIN_LED_VFY], !value); + return 0; +} + + +/* + * transmit an AVR device command and return the results; 'cmd' and + * 'res' must point to at least a 4 byte data buffer + */ +int bitbang_cmd(PROGRAMMER * pgm, unsigned char cmd[4], + unsigned char res[4]) +{ + int i; + + for (i=0; i<4; i++) { + res[i] = bitbang_txrx(pgm, cmd[i]); + } + + return 0; +} + +/* + * transmit bytes via SPI and return the results; 'cmd' and + * 'res' must point to data buffers + */ +int bitbang_spi(PROGRAMMER * pgm, unsigned char cmd[], + unsigned char res[], int count) +{ + int i; + + pgm->setpin(pgm, pgm->pinno[PIN_LED_PGM], 0); + + for (i=0; isetpin(pgm, pgm->pinno[PIN_LED_PGM], 1); + + return 0; +} + + +/* + * issue the 'chip erase' command to the AVR device + */ +int bitbang_chip_erase(PROGRAMMER * pgm, AVRPART * p) +{ + unsigned char cmd[4]; + unsigned char res[4]; + + if (p->op[AVR_OP_CHIP_ERASE] == NULL) { + logprintf(LOG_ERR, "chip erase instruction not defined for part \"%s\"", p->desc); + return -1; + } + + pgm->pgm_led(pgm, ON); + + memset(cmd, 0, sizeof(cmd)); + + avr_set_bits(p->op[AVR_OP_CHIP_ERASE], cmd); + pgm->cmd(pgm, cmd, res); + usleep(p->chip_erase_delay); + pgm->initialize(pgm, p); + + pgm->pgm_led(pgm, OFF); + + return 0; +} + +/* + * issue the 'program enable' command to the AVR device + */ +int bitbang_program_enable(PROGRAMMER * pgm, AVRPART * p) +{ + unsigned char cmd[4]; + unsigned char res[4]; + + if (p->op[AVR_OP_PGM_ENABLE] == NULL) { + logprintf(LOG_ERR, "program enable instruction not defined for part \"%s\"", p->desc); + return -1; + } + + memset(cmd, 0, sizeof(cmd)); + avr_set_bits(p->op[AVR_OP_PGM_ENABLE], cmd); + pgm->cmd(pgm, cmd, res); + + if (res[2] != cmd[1]) + return -2; + + return 0; +} + +/* + * initialize the AVR device and prepare it to accept commands + */ +int bitbang_initialize(PROGRAMMER * pgm, AVRPART * p) +{ + int rc; + int tries; + + bitbang_calibrate_delay(); + + pgm->powerup(pgm); + usleep(20000); + + pgm->setpin(pgm, pgm->pinno[PIN_AVR_SCK], 0); + pgm->setpin(pgm, pgm->pinno[PIN_AVR_RESET], 0); + usleep(20000); + + pgm->highpulsepin(pgm, pgm->pinno[PIN_AVR_RESET]); + + usleep(20000); /* 20 ms XXX should be a per-chip parameter */ + + /* + * Enable programming mode. If we are programming an AT90S1200, we + * can only issue the command and hope it worked. If we are using + * one of the other chips, the chip will echo 0x53 when issuing the + * third byte of the command. In this case, try up to 32 times in + * order to possibly get back into sync with the chip if we are out + * of sync. + */ + + if (strcmp(p->desc, "AT90S1200")==0) { + pgm->program_enable(pgm, p); + } + else { + tries = 0; + do { + rc = pgm->program_enable(pgm, p); + if ((rc == 0)||(rc == -1)) + break; + pgm->highpulsepin(pgm, pgm->pinno[p->retry_pulse/*PIN_AVR_SCK*/]); + tries++; + } while (tries < 65); + + /* + * can't sync with the device, maybe it's not attached? + */ + if (rc) { + logprintf(LOG_ERR, "AVR device not responding"); + return -1; + } + } + + return 0; +} + +static void verify_pin_assigned(PROGRAMMER * pgm, int pin, char * desc) +{ +} + + +/* + * Verify all prerequisites for a bit-bang programmer are present. + */ +void bitbang_check_prerequisites(PROGRAMMER *pgm) +{ + verify_pin_assigned(pgm, PIN_AVR_RESET, "AVR RESET"); + verify_pin_assigned(pgm, PIN_AVR_SCK, "AVR SCK"); + verify_pin_assigned(pgm, PIN_AVR_MISO, "AVR MISO"); + verify_pin_assigned(pgm, PIN_AVR_MOSI, "AVR MOSI"); +} diff --git a/lib/ESPiLight/pilight/libs/avrdude/avrbitbang.h b/lib/ESPiLight/pilight/libs/avrdude/avrbitbang.h new file mode 100644 index 0000000..99197b3 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/avrbitbang.h @@ -0,0 +1,56 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000, 2001, 2002, 2003 Brian S. Dean + * Copyright (C) 2005 Michael Holzt + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* $Id: bitbang.h 797 2009-02-17 15:31:27Z joerg_wunsch $ */ + +#ifndef avrbitbang_h +#define avrbitbang_h + +#ifdef __cplusplus +extern "C" { +#endif + +int bitbang_setpin(int fd, int pin, int value); +int bitbang_getpin(int fd, int pin); +int bitbang_highpulsepin(int fd, int pin); +void bitbang_delay(unsigned int us); + +void bitbang_check_prerequisites(PROGRAMMER *pgm); + +int bitbang_rdy_led (PROGRAMMER * pgm, int value); +int bitbang_err_led (PROGRAMMER * pgm, int value); +int bitbang_pgm_led (PROGRAMMER * pgm, int value); +int bitbang_vfy_led (PROGRAMMER * pgm, int value); +int bitbang_cmd (PROGRAMMER * pgm, unsigned char cmd[4], + unsigned char res[4]); +int bitbang_spi (PROGRAMMER * pgm, unsigned char cmd[], + unsigned char res[], int count); +int bitbang_chip_erase (PROGRAMMER * pgm, AVRPART * p); +int bitbang_program_enable (PROGRAMMER * pgm, AVRPART * p); +void bitbang_powerup (PROGRAMMER * pgm); +void bitbang_powerdown (PROGRAMMER * pgm); +int bitbang_initialize (PROGRAMMER * pgm, AVRPART * p); +void bitbang_disable (PROGRAMMER * pgm); +void bitbang_enable (PROGRAMMER * pgm); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/avrdude/avrconfig.c b/lib/ESPiLight/pilight/libs/avrdude/avrconfig.c new file mode 100644 index 0000000..4b72dff --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/avrconfig.c @@ -0,0 +1,110 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000-2004 Brian S. Dean + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: config.c 725 2007-01-30 13:41:54Z joerg_wunsch $ */ + +#include +#include +#include +#include +#include + +#include "../pilight/core/log.h" +#include "../pilight/core/mem.h" +#include "avrconfig.h" + +TOKEN * new_token(int primary) +{ + TOKEN * tkn; + + tkn = (TOKEN *)MALLOC(sizeof(TOKEN)); + if (tkn == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + memset(tkn, 0, sizeof(TOKEN)); + + tkn->primary = primary; + + return tkn; +} + +void free_token(TOKEN * tkn) +{ + if (tkn) { + switch (tkn->primary) { + case TKN_STRING: + case TKN_ID: + if (tkn->value.string) + FREE(tkn->value.string); + tkn->value.string = NULL; + break; + } + + FREE(tkn); + } +} + +TOKEN * number(char * text) +{ + struct token_t * tkn; + + tkn = new_token(TKN_NUMBER); + tkn->value.type = V_NUM; + tkn->value.number = atof(text); + + return tkn; +} + +TOKEN * hexnumber(char * text) +{ + struct token_t * tkn; + char * e; + + tkn = new_token(TKN_NUMBER); + tkn->value.type = V_NUM; + tkn->value.number = strtoul(text, &e, 16); + if ((e == text) || (*e != 0)) { + logprintf(LOG_ERR, "%s:%d: can't scan hex number \"%s\"", infile, lineno, text); + return NULL; + } + + return tkn; +} + +TOKEN * string(char * text) +{ + struct token_t * tkn; + int len; + + tkn = new_token(TKN_STRING); + + len = strlen(text); + + tkn->value.type = V_STR; + tkn->value.string = (char *) MALLOC(len+1); + if (tkn->value.string == NULL) { + fprintf(stderr, "out of memory\n"); + return NULL; + } + strcpy(tkn->value.string, text); + + return tkn; +} diff --git a/lib/ESPiLight/pilight/libs/avrdude/avrconfig.h b/lib/ESPiLight/pilight/libs/avrdude/avrconfig.h new file mode 100644 index 0000000..ad13d69 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/avrconfig.h @@ -0,0 +1,237 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000-2004 Brian S. Dean + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: config.h 725 2007-01-30 13:41:54Z joerg_wunsch $ */ + +#ifndef avrconfig_h +#define avrconfig_h + +#include "avrpart.h" +#include "pindefs.h" +#include "avr.h" +#include "pgm.h" + +#define MAX_STR_CONST 1024 + +enum { V_NONE, V_NUM, V_STR }; +typedef struct value_t { + int type; + double number; + char * string; +} VALUE; + + +typedef struct token_t { + int primary; + VALUE value; +} TOKEN; +typedef struct token_t *token_p; + + +extern FILE * in; +extern PROGRAMMER * current_prog; +extern AVRPART * current_part; +extern AVRMEM * current_mem; +extern int lineno; +extern const char * infile; +extern char default_programmer[]; +extern char default_parallel[]; +extern char default_serial[]; + +enum tokentype { + K_READ = 258, + K_WRITE = 259, + K_READ_LO = 260, + K_READ_HI = 261, + K_WRITE_LO = 262, + K_WRITE_HI = 263, + K_LOADPAGE_LO = 264, + K_LOADPAGE_HI = 265, + K_LOAD_EXT_ADDR = 266, + K_WRITEPAGE = 267, + K_CHIP_ERASE = 268, + K_PGM_ENABLE = 269, + K_MEMORY = 270, + K_PAGE_SIZE = 271, + K_PAGED = 272, + K_ARDUINO = 273, + K_BAUDRATE = 274, + K_BS2 = 275, + K_BUFF = 276, + K_BUSPIRATE = 277, + K_CHIP_ERASE_DELAY = 278, + K_DEDICATED = 279, + K_DEFAULT_PARALLEL = 280, + K_DEFAULT_PROGRAMMER = 281, + K_DEFAULT_SERIAL = 282, + K_DESC = 283, + K_DEVICECODE = 284, + K_DRAGON_DW = 285, + K_DRAGON_HVSP = 286, + K_DRAGON_ISP = 287, + K_DRAGON_JTAG = 288, + K_DRAGON_PDI = 289, + K_DRAGON_PP = 290, + K_GPIO = 291, + K_STK500_DEVCODE = 292, + K_AVR910_DEVCODE = 293, + K_EEPROM = 294, + K_ERRLED = 295, + K_FLASH = 296, + K_ID = 297, + K_IO = 298, + K_JTAG_MKI = 299, + K_JTAG_MKII = 300, + K_JTAG_MKII_AVR32 = 301, + K_JTAG_MKII_DW = 302, + K_JTAG_MKII_ISP = 303, + K_JTAG_MKII_PDI = 304, + K_LOADPAGE = 305, + K_MAX_WRITE_DELAY = 306, + K_MIN_WRITE_DELAY = 307, + K_MISO = 308, + K_MOSI = 309, + K_NUM_PAGES = 310, + K_NVM_BASE = 311, + K_OFFSET = 312, + K_PAGEL = 313, + K_PAR = 314, + K_PARALLEL = 315, + K_PART = 316, + K_PGMLED = 317, + K_PROGRAMMER = 318, + K_PSEUDO = 319, + K_PWROFF_AFTER_WRITE = 320, + K_RDYLED = 321, + K_READBACK_P1 = 322, + K_READBACK_P2 = 323, + K_READMEM = 324, + K_RESET = 325, + K_RETRY_PULSE = 326, + K_SERBB = 327, + K_SERIAL = 328, + K_SCK = 329, + K_SIGNATURE = 330, + K_SIZE = 331, + K_STK500 = 332, + K_STK500HVSP = 333, + K_STK500PP = 334, + K_STK500V2 = 335, + K_STK500GENERIC = 336, + K_STK600 = 337, + K_STK600HVSP = 338, + K_STK600PP = 339, + K_AVR910 = 340, + K_USBASP = 341, + K_USBTINY = 342, + K_BUTTERFLY = 343, + K_TYPE = 344, + K_VCC = 345, + K_VFYLED = 346, + K_NO = 347, + K_YES = 348, + K_TIMEOUT = 349, + K_STABDELAY = 350, + K_CMDEXEDELAY = 351, + K_HVSPCMDEXEDELAY = 352, + K_SYNCHLOOPS = 353, + K_BYTEDELAY = 354, + K_POLLVALUE = 355, + K_POLLINDEX = 356, + K_PREDELAY = 357, + K_POSTDELAY = 358, + K_POLLMETHOD = 359, + K_MODE = 360, + K_DELAY = 361, + K_BLOCKSIZE = 362, + K_READSIZE = 363, + K_HVENTERSTABDELAY = 364, + K_PROGMODEDELAY = 365, + K_LATCHCYCLES = 366, + K_TOGGLEVTG = 367, + K_POWEROFFDELAY = 368, + K_RESETDELAYMS = 369, + K_RESETDELAYUS = 370, + K_HVLEAVESTABDELAY = 371, + K_RESETDELAY = 372, + K_SYNCHCYCLES = 373, + K_HVCMDEXEDELAY = 374, + K_CHIPERASEPULSEWIDTH = 375, + K_CHIPERASEPOLLTIMEOUT = 376, + K_CHIPERASETIME = 377, + K_PROGRAMFUSEPULSEWIDTH = 378, + K_PROGRAMFUSEPOLLTIMEOUT = 379, + K_PROGRAMLOCKPULSEWIDTH = 380, + K_PROGRAMLOCKPOLLTIMEOUT = 381, + K_PP_CONTROLSTACK = 382, + K_HVSP_CONTROLSTACK = 383, + K_ALLOWFULLPAGEBITSTREAM = 384, + K_ENABLEPAGEPROGRAMMING = 385, + K_HAS_JTAG = 386, + K_HAS_DW = 387, + K_HAS_PDI = 388, + K_HAS_TPI = 389, + K_IDR = 390, + K_IS_AVR32 = 391, + K_RAMPZ = 392, + K_SPMCR = 393, + K_EECR = 394, + K_FLASH_INSTR = 395, + K_EEPROM_INSTR = 396, + TKN_COMMA = 397, + TKN_EQUAL = 398, + TKN_SEMI = 399, + TKN_TILDE = 400, + TKN_NUMBER = 401, + TKN_STRING = 402, + TKN_ID = 403 +}; + +char default_programmer[MAX_STR_CONST]; +char default_parallel[4096]; +char default_serial[4096]; + +char string_buf[MAX_STR_CONST]; +char *string_buf_ptr; + +PROGRAMMER * current_prog; +AVRPART * current_part; + +int lineno; +const char * infile; +extern char string_buf[MAX_STR_CONST]; +extern char *string_buf_ptr; + +#ifdef __cplusplus +extern "C" { +#endif + +int init_config(void); +TOKEN * new_token(int primary); +void free_token(TOKEN * tkn); +void free_tokens(int n, ...); +TOKEN * number(char * text); +TOKEN * hexnumber(char * text); +TOKEN * string(char * text); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/avrdude/avrdude.h b/lib/ESPiLight/pilight/libs/avrdude/avrdude.h new file mode 100644 index 0000000..2cbaec2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/avrdude.h @@ -0,0 +1,27 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2007 Joerg Wunsch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: avrdude.h 788 2008-11-19 23:32:30Z joerg_wunsch $ */ + +#ifndef avrdude_h +#define avrdude_h + +extern char * progname; /* name of program, for messages */ + +#endif diff --git a/lib/ESPiLight/pilight/libs/avrdude/avrgpio.c b/lib/ESPiLight/pilight/libs/avrdude/avrgpio.c new file mode 100644 index 0000000..d732dc2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/avrgpio.c @@ -0,0 +1,177 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Support for bitbanging GPIO pins using the /sys/class/gpio interface + * + * Copyright (C) 2010 Radoslav Kolev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "avrdude.h" +#include "avr.h" +#include "pindefs.h" +#include "pgm.h" +#include "avrbitbang.h" +#include "defines.h" +#include "../pilight/core/log.h" +#include "../pilight/config/settings.h" + +/* + * GPIO user space helpers + * + * Copyright 2009 Analog Devices Inc. + * Michael Hennerich (hennerich@blackfin.uclinux.org) + * + * Licensed under the GPL-2 or later + */ + +#define GPIO_DIR_IN 0 +#define GPIO_DIR_OUT 1 +#define N_GPIO 256 + +/* +* an array which holds open FDs to /sys/class/gpio/gpioXX/value for all needed pins +*/ +static int gpio_fds[N_GPIO]; + +static int gpio_setpin(PROGRAMMER * pgm, int pin, int value) { + if(gpio_fds[pin] != PINMODE_OUTPUT) { + return -1; + } + + /* Small delay for too fast computers */ + delayMicroseconds(1); + + if(value == 1) { + digitalWrite(pin, HIGH); + } else { + digitalWrite(pin, LOW); + } + + if(pgm->ispdelay > 1) { + bitbang_delay(pgm->ispdelay); + } + + return 0; +} + +static int gpio_getpin(PROGRAMMER * pgm, int pin) { + if(gpio_fds[pin] == PINMODE_INPUT) { + return digitalRead(pin); + } else { + return -1; + } +} + +static int gpio_highpulsepin(PROGRAMMER * pgm, int pin) { + + if(gpio_fds[pin] == PINMODE_OUTPUT) { + digitalWrite(pin, HIGH); + digitalWrite(pin, LOW); + return 0; + } else { + return -1; + } +} + +static void gpio_display(PROGRAMMER *pgm, const char *p) { + /* MAYBE */ +} + +static void gpio_enable(PROGRAMMER *pgm) { + /* nothing */ +} + +static void gpio_disable(PROGRAMMER *pgm) { + /* nothing */ +} + +static void gpio_powerup(PROGRAMMER *pgm) { + /* nothing */ +} + +static void gpio_powerdown(PROGRAMMER *pgm) { + /* nothing */ +} + +static int gpio_open(PROGRAMMER *pgm, char *port) { + int i = 0; + + bitbang_check_prerequisites(pgm); + + for(i=0;ipinno[i] != 0) { + if(i == PIN_AVR_MISO) { + gpio_fds[pgm->pinno[i]] = PINMODE_INPUT; + pinMode(pgm->pinno[i], PINMODE_INPUT); + } else { + gpio_fds[pgm->pinno[i]] = PINMODE_OUTPUT;; + pinMode(pgm->pinno[i], PINMODE_OUTPUT); + } + } + } + + return(0); +} + +static void gpio_close(PROGRAMMER *pgm) { + if(gpio_fds[pgm->pinno[PIN_AVR_RESET]] == PINMODE_OUTPUT) { + digitalWrite(pgm->pinno[PIN_AVR_RESET], HIGH); + // digitalWrite(pgm->pinno[PIN_AVR_RESET], LOW); + } + + return; +} + +void gpio_initpgm(PROGRAMMER *pgm) +{ + strcpy(pgm->type, "GPIO"); + char *platform = GPIO_PLATFORM; + if(settings_find_string("gpio-platform", &platform) != 0 || strcmp(platform, "none") == 0) { + logprintf(LOG_ERR, "gpio_switch: no gpio-platform configured"); + exit(EXIT_FAILURE); + } + if(wiringXSetup(platform, logprintf1) < 0) { + exit(EXIT_FAILURE); + } + pgm->rdy_led = bitbang_rdy_led; + pgm->err_led = bitbang_err_led; + pgm->pgm_led = bitbang_pgm_led; + pgm->vfy_led = bitbang_vfy_led; + pgm->initialize = bitbang_initialize; + pgm->display = gpio_display; + pgm->enable = gpio_enable; + pgm->disable = gpio_disable; + pgm->powerup = gpio_powerup; + pgm->powerdown = gpio_powerdown; + pgm->program_enable = bitbang_program_enable; + pgm->chip_erase = bitbang_chip_erase; + pgm->cmd = bitbang_cmd; + pgm->open = gpio_open; + pgm->close = gpio_close; + pgm->setpin = gpio_setpin; + pgm->getpin = gpio_getpin; + pgm->highpulsepin = gpio_highpulsepin; + pgm->read_byte = avr_read_byte_default; + pgm->write_byte = avr_write_byte_default; +} diff --git a/lib/ESPiLight/pilight/libs/avrdude/avrgpio.h b/lib/ESPiLight/pilight/libs/avrdude/avrgpio.h new file mode 100644 index 0000000..45868b4 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/avrgpio.h @@ -0,0 +1,35 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000-2004 Brian S. Dean + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: par.h 722 2007-01-24 22:43:46Z joerg_wunsch $ */ + +#ifndef avrgpio_h +#define avrgpio_h + +#ifdef __cplusplus +extern "C" { +#endif + +void gpio_initpgm (PROGRAMMER * pgm); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/avrdude/avrpart.c b/lib/ESPiLight/pilight/libs/avrdude/avrpart.c new file mode 100644 index 0000000..675b972 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/avrpart.c @@ -0,0 +1,251 @@ + +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000-2004 Brian S. Dean + * Copyright (C) 2006 Joerg Wunsch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: avrpart.c 772 2008-06-07 21:03:41Z joerg_wunsch $ */ + +#include +#include +#include + +#include "../pilight/core/log.h" +#include "../pilight/core/mem.h" +#include "avrdude.h" +#include "avrpart.h" +#include "pindefs.h" + +/*** + *** Elementary functions dealing with OPCODE structures + ***/ + +OPCODE * avr_new_opcode(void) +{ + OPCODE * m; + + m = (OPCODE *)MALLOC(sizeof(*m)); + if (m == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + memset(m, 0, sizeof(*m)); + + return m; +} + + +/* + * avr_set_bits() + * + * Set instruction bits in the specified command based on the opcode. + */ +int avr_set_bits(OPCODE * op, unsigned char * cmd) +{ + int i, j, bit; + unsigned char mask; + + for (i=0; i<32; i++) { + if (op->bit[i].type == AVR_CMDBIT_VALUE) { + j = 3 - i / 8; + bit = i % 8; + mask = 1 << bit; + if (op->bit[i].value) + cmd[j] = cmd[j] | mask; + else + cmd[j] = cmd[j] & ~mask; + } + } + + return 0; +} + + +/* + * avr_set_addr() + * + * Set address bits in the specified command based on the opcode, and + * the address. + */ +int avr_set_addr(OPCODE * op, unsigned char * cmd, unsigned long addr) +{ + int i, j, bit; + unsigned long value; + unsigned char mask; + + for (i=0; i<32; i++) { + if (op->bit[i].type == AVR_CMDBIT_ADDRESS) { + j = 3 - i / 8; + bit = i % 8; + mask = 1 << bit; + value = addr >> op->bit[i].bitno & 0x01; + if (value) + cmd[j] = cmd[j] | mask; + else + cmd[j] = cmd[j] & ~mask; + } + } + + return 0; +} + + +/* + * avr_set_input() + * + * Set input data bits in the specified command based on the opcode, + * and the data byte. + */ +int avr_set_input(OPCODE * op, unsigned char * cmd, unsigned char data) +{ + int i, j, bit; + unsigned char value; + unsigned char mask; + + for (i=0; i<32; i++) { + if (op->bit[i].type == AVR_CMDBIT_INPUT) { + j = 3 - i / 8; + bit = i % 8; + mask = 1 << bit; + value = data >> op->bit[i].bitno & 0x01; + if (value) + cmd[j] = cmd[j] | mask; + else + cmd[j] = cmd[j] & ~mask; + } + } + + return 0; +} + + +/* + * avr_get_output() + * + * Retreive output data bits from the command results based on the + * opcode data. + */ +int avr_get_output(OPCODE * op, unsigned char * res, unsigned char * data) +{ + int i, j, bit; + unsigned char value; + unsigned char mask; + + for (i=0; i<32; i++) { + if (op->bit[i].type == AVR_CMDBIT_OUTPUT) { + j = 3 - i / 8; + bit = i % 8; + mask = 1 << bit; + value = ((res[j] & mask) >> bit) & 0x01; + value = value << op->bit[i].bitno; + if (value) + *data = *data | value; + else + *data = *data & ~value; + } + } + + return 0; +} + +/*** + *** Elementary functions dealing with AVRMEM structures + ***/ + +AVRMEM * avr_new_memtype(void) +{ + AVRMEM * m; + + m = (AVRMEM *)MALLOC(sizeof(*m)); + if (m == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + memset(m, 0, sizeof(*m)); + + return m; +} + + +AVRMEM * avr_dup_mem(AVRMEM * m) +{ + AVRMEM * n; + + n = avr_new_memtype(); + + *n = *m; + + n->buf = (unsigned char *)MALLOC(n->size); + if (n->buf == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(n->buf, 0, n->size); + + memcpy(n->tags, m->tags, n->size); + + return n; +} + +/* + * Elementary functions dealing with AVRPART structures + */ + + +AVRPART * avr_new_part(void) +{ + AVRPART * p; + + p = (AVRPART *)MALLOC(sizeof(AVRPART)); + if (p == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + memset(p, 0, sizeof(*p)); + + p->id[0] = 0; + p->desc[0] = 0; + p->reset_disposition = RESET_DEDICATED; + p->retry_pulse = PIN_AVR_SCK; + p->flags = AVRPART_SERIALOK | AVRPART_PARALLELOK | AVRPART_ENABLEPAGEPROGRAMMING; + p->lineno = 0; + memset(p->signature, 0xFF, 3); + p->ctl_stack_type = CTL_STACK_NONE; + + return p; +} + + +AVRPART * avr_dup_part(AVRPART * d) +{ + AVRPART * p; + + p = avr_new_part(); + *p = *d; + + /* NEW */ + p->sigmem = avr_dup_mem(p->sigmem); + p->flashmem = avr_dup_mem(p->flashmem); + p->lfusemem = avr_dup_mem(p->lfusemem); + p->hfusemem = avr_dup_mem(p->hfusemem); + + return p; +} diff --git a/lib/ESPiLight/pilight/libs/avrdude/avrpart.h b/lib/ESPiLight/pilight/libs/avrdude/avrpart.h new file mode 100644 index 0000000..906e3cb --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/avrpart.h @@ -0,0 +1,224 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2003-2004 Brian S. Dean + * Copyright (C) 2006 Joerg Wunsch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: avrpart.h 916 2010-01-15 16:36:13Z joerg_wunsch $ */ + +#ifndef avrpart_h +#define avrpart_h + +#include + +/* + * AVR serial programming instructions + */ +enum { + AVR_OP_READ, + AVR_OP_WRITE, + AVR_OP_READ_LO, + AVR_OP_READ_HI, + AVR_OP_WRITE_LO, + AVR_OP_WRITE_HI, + AVR_OP_LOADPAGE_LO, + AVR_OP_LOADPAGE_HI, + AVR_OP_LOAD_EXT_ADDR, + AVR_OP_WRITEPAGE, + AVR_OP_CHIP_ERASE, + AVR_OP_PGM_ENABLE, + AVR_OP_MAX +}; + + +enum { + AVR_CMDBIT_IGNORE, /* bit is ignored on input and output */ + AVR_CMDBIT_VALUE, /* bit is set to 0 or 1 for input or output */ + AVR_CMDBIT_ADDRESS, /* this bit represents an input address bit */ + AVR_CMDBIT_INPUT, /* this bit is an input bit */ + AVR_CMDBIT_OUTPUT /* this bit is an output bit */ +}; + +enum { /* these are assigned to reset_disposition of AVRPART */ + RESET_DEDICATED, /* reset pin is dedicated */ + RESET_IO /* reset pin might be configured as an I/O pin */ +}; + +enum ctl_stack_t { + CTL_STACK_NONE, /* no control stack defined */ + CTL_STACK_PP, /* parallel programming control stack */ + CTL_STACK_HVSP /* high voltage serial programming control stack */ +}; + +/* + * serial programming instruction bit specifications + */ +typedef struct cmdbit { + int type; /* AVR_CMDBIT_* */ + int bitno; /* which input bit to use for this command bit */ + int value; /* bit value if type == AVR_CMDBIT_VALUD */ +} CMDBIT; + +typedef struct opcode { + CMDBIT bit[32]; /* opcode bit specs */ +} OPCODE; + + +#define AVRPART_SERIALOK 0x0001 /* part supports serial programming */ +#define AVRPART_PARALLELOK 0x0002 /* part supports parallel programming */ +#define AVRPART_PSEUDOPARALLEL 0x0004 /* part has pseudo parallel support */ +#define AVRPART_HAS_JTAG 0x0008 /* part has a JTAG i/f */ +#define AVRPART_ALLOWFULLPAGEBITSTREAM 0x0010 /* JTAG ICE mkII param. */ +#define AVRPART_ENABLEPAGEPROGRAMMING 0x0020 /* JTAG ICE mkII param. */ +#define AVRPART_HAS_DW 0x0040 /* part has a debugWire i/f */ +#define AVRPART_HAS_PDI 0x0080 /* part has PDI i/f rather than ISP (ATxmega) */ +#define AVRPART_AVR32 0x0100 /* part is in AVR32 family */ +#define AVRPART_INIT_SMC 0x0200 /* part will undergo chip erase */ +#define AVRPART_WRITE 0x0400 /* at least one write operation specified */ +#define AVRPART_HAS_TPI 0x0800 /* part has TPI i/f rather than ISP (ATtiny4/5/9/10) */ + +#define AVR_DESCLEN 64 +#define AVR_IDLEN 32 +#define CTL_STACK_SIZE 32 +#define FLASH_INSTR_SIZE 3 +#define EEPROM_INSTR_SIZE 20 + +#define TAG_ALLOCATED 1 /* memory byte is allocated */ + +#define AVR_MEMDESCLEN 64 +typedef struct avrmem { + char desc[AVR_MEMDESCLEN]; /* memory description ("flash", "eeprom", etc) */ + int paged; /* page addressed (e.g. ATmega flash) */ + int size; /* total memory size in bytes */ + int page_size; /* size of memory page (if page addressed) */ + int num_pages; /* number of pages (if page addressed) */ + unsigned int offset; /* offset in IO memory (ATxmega) */ + int min_write_delay; /* microseconds */ + int max_write_delay; /* microseconds */ + int pwroff_after_write; /* after this memory type is written to, + the device must be powered off and + back on, see errata + http://www.atmel.com/atmel/acrobat/doc1280.pdf */ + unsigned char readback[2]; /* polled read-back values */ + + int mode; /* stk500 v2 xml file parameter */ + int delay; /* stk500 v2 xml file parameter */ + int blocksize; /* stk500 v2 xml file parameter */ + int readsize; /* stk500 v2 xml file parameter */ + int pollindex; /* stk500 v2 xml file parameter */ + + unsigned char * buf; /* pointer to memory buffer */ + unsigned char tags[1024*1024]; /* allocation tags */ + OPCODE * op[AVR_OP_MAX]; /* opcodes */ +} AVRMEM; + +typedef struct avrpart { + char desc[AVR_DESCLEN]; /* long part name */ + char id[AVR_IDLEN]; /* short part name */ + int stk500_devcode; /* stk500 device code */ + int avr910_devcode; /* avr910 device code */ + int chip_erase_delay; /* microseconds */ + unsigned char pagel; /* for parallel programming */ + unsigned char bs2; /* for parallel programming */ + unsigned char signature[3]; /* expected value of signature bytes */ + int reset_disposition; /* see RESET_ enums */ + int retry_pulse; /* retry program enable by pulsing + this pin (PIN_AVR_*) */ + unsigned flags; /* see AVRPART_ masks */ + + int timeout; /* stk500 v2 xml file parameter */ + int stabdelay; /* stk500 v2 xml file parameter */ + int cmdexedelay; /* stk500 v2 xml file parameter */ + int synchloops; /* stk500 v2 xml file parameter */ + int bytedelay; /* stk500 v2 xml file parameter */ + int pollindex; /* stk500 v2 xml file parameter */ + unsigned char pollvalue; /* stk500 v2 xml file parameter */ + int predelay; /* stk500 v2 xml file parameter */ + int postdelay; /* stk500 v2 xml file parameter */ + int pollmethod; /* stk500 v2 xml file parameter */ + + enum ctl_stack_t ctl_stack_type; /* what to use the ctl stack for */ + unsigned char controlstack[CTL_STACK_SIZE]; /* stk500v2 PP/HVSP ctl stack */ + unsigned char flash_instr[FLASH_INSTR_SIZE]; /* flash instructions (debugWire, JTAG) */ + unsigned char eeprom_instr[EEPROM_INSTR_SIZE]; /* EEPROM instructions (debugWire, JTAG) */ + + int hventerstabdelay; /* stk500 v2 hv mode parameter */ + int progmodedelay; /* stk500 v2 hv mode parameter */ + int latchcycles; /* stk500 v2 hv mode parameter */ + int togglevtg; /* stk500 v2 hv mode parameter */ + int poweroffdelay; /* stk500 v2 hv mode parameter */ + int resetdelayms; /* stk500 v2 hv mode parameter */ + int resetdelayus; /* stk500 v2 hv mode parameter */ + int hvleavestabdelay; /* stk500 v2 hv mode parameter */ + int resetdelay; /* stk500 v2 hv mode parameter */ + int chiperasepulsewidth; /* stk500 v2 hv mode parameter */ + int chiperasepolltimeout; /* stk500 v2 hv mode parameter */ + int chiperasetime; /* stk500 v2 hv mode parameter */ + int programfusepulsewidth; /* stk500 v2 hv mode parameter */ + int programfusepolltimeout; /* stk500 v2 hv mode parameter */ + int programlockpulsewidth; /* stk500 v2 hv mode parameter */ + int programlockpolltimeout; /* stk500 v2 hv mode parameter */ + int synchcycles; /* stk500 v2 hv mode parameter */ + int hvspcmdexedelay; /* stk500 v2 xml file parameter */ + + unsigned char idr; /* JTAG ICE mkII XML file parameter */ + unsigned char rampz; /* JTAG ICE mkII XML file parameter */ + unsigned char spmcr; /* JTAG ICE mkII XML file parameter */ + unsigned short eecr; /* JTAC ICE mkII XML file parameter */ + unsigned int nvm_base; /* Base address of NVM controller in ATxmega devices */ + + OPCODE * op[AVR_OP_MAX]; /* opcodes */ + + AVRMEM *sigmem; + AVRMEM *flashmem; + AVRMEM *lfusemem; + AVRMEM *hfusemem; + AVRMEM *fusesmem; + AVRMEM *lockmem; + char config_file[4096]; /* config file where defined */ + int lineno; /* config file line number */ +} AVRPART; + +#ifdef __cplusplus +extern "C" { +#endif + +/* Functions for OPCODE structures */ +OPCODE * avr_new_opcode(void); +int avr_set_bits(OPCODE * op, unsigned char * cmd); +int avr_set_addr(OPCODE * op, unsigned char * cmd, unsigned long addr); +int avr_set_input(OPCODE * op, unsigned char * cmd, unsigned char data); +int avr_get_output(OPCODE * op, unsigned char * res, unsigned char * data); + +/* Functions for AVRMEM structures */ +AVRMEM * avr_new_memtype(void); +int avr_initmem(AVRPART * p); +AVRMEM * avr_dup_mem(AVRMEM * m); +AVRMEM * avr_locate_mem(AVRPART * p, char * desc); + +/* Functions for AVRPART structures */ +AVRPART * avr_new_part(void); +AVRPART * avr_dup_part(AVRPART * d); +typedef void (*walk_avrparts_cb)(const char *name, const char *desc, + const char *cfgname, int cfglineno, + void *cookie); + +#ifdef __cplusplus +} +#endif + +#endif /* avrpart_h */ diff --git a/lib/ESPiLight/pilight/libs/avrdude/avrupd.c b/lib/ESPiLight/pilight/libs/avrdude/avrupd.c new file mode 100644 index 0000000..5a74af4 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/avrupd.c @@ -0,0 +1,357 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000-2005 Brian S. Dean + * Copyright (C) 2007 Joerg Wunsch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: AVRUPD.c 819 2009-04-28 18:35:14Z joerg_wunsch $ */ + +#include +#include +#include +#include +#include + +#include "../pilight/core/log.h" +#include "../pilight/core/mem.h" +#include "avrdude.h" +#include "avr.h" +#include "avrconfig.h" +#include "fileio.h" +#include "avrupd.h" + +AVRUPD * parse_op(char * s) +{ + char buf[1024]; + char * p, * cp, c; + AVRUPD * upd; + int i; + size_t fnlen; + + upd = (AVRUPD *)MALLOC(sizeof(AVRUPD)); + if (upd == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + i = 0; + p = s; + while ((i < (sizeof(buf)-1) && *p && (*p != ':'))) + buf[i++] = *p++; + buf[i] = 0; + + if (*p != ':') { + upd->memtype = (char *)MALLOC(strlen("flash")+1); + if (upd->memtype == NULL) { + outofmem: + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(upd->memtype, "flash"); + upd->op = DEVICE_WRITE; + upd->filename = (char *)MALLOC(strlen(buf) + 1); + if (upd->filename == NULL) + goto outofmem; + strcpy(upd->filename, buf); + upd->format = FMT_AUTO; + return upd; + } + + upd->memtype = (char *)MALLOC(strlen(buf)+1); + if (upd->memtype == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(upd->memtype, buf); + + p++; + if (*p == 'r') { + upd->op = DEVICE_READ; + } + else if (*p == 'w') { + upd->op = DEVICE_WRITE; + } + else if (*p == 'v') { + upd->op = DEVICE_VERIFY; + } + else { + logprintf(LOG_ERR, "invalid I/O mode '%c' in update specification", *p); + logprintf(LOG_ERR, + " allowed values are:\n" + " r = read device\n" + " w = write device\n" + " v = verify device"); + FREE(upd->memtype); + FREE(upd); + return NULL; + } + + p++; + + if (*p != ':') { + logprintf(LOG_ERR, "invalid update specification"); + FREE(upd->memtype); + FREE(upd); + return NULL; + } + + p++; + + /* + * Now, parse the filename component. Instead of looking for the + * leftmost possible colon delimiter, we look for the rightmost one. + * If we found one, we do have a trailing :format specifier, and + * process it. Otherwise, the remainder of the string is our file + * name component. That way, the file name itself is allowed to + * contain a colon itself (e. g. C:/some/file.hex), except the + * optional format specifier becomes mandatory then. + */ + cp = p; + p = strrchr(cp, ':'); + if (p == NULL) { + upd->format = FMT_AUTO; + fnlen = strlen(cp); + upd->filename = (char *)MALLOC(fnlen + 1); + } else { + fnlen = p - cp; + upd->filename = (char *)MALLOC(fnlen +1); + c = *++p; + if (c && p[1]) + /* More than one char - force failure below. */ + c = '?'; + switch (c) { + case 'a': upd->format = FMT_AUTO; break; + case 's': upd->format = FMT_SREC; break; + case 'i': upd->format = FMT_IHEX; break; + case 'r': upd->format = FMT_RBIN; break; + case 'm': upd->format = FMT_IMM; break; + case 'b': upd->format = FMT_BIN; break; + case 'd': upd->format = FMT_DEC; break; + case 'h': upd->format = FMT_HEX; break; + case 'o': upd->format = FMT_OCT; break; + default: + logprintf(LOG_ERR, "invalid file format '%s' in update specifier", p); + FREE(upd->memtype); + FREE(upd); + return NULL; + } + } + + if (upd->filename == NULL) { + fprintf(stderr, "out of memory\n"); + FREE(upd->memtype); + FREE(upd); + return NULL; + } + memcpy(upd->filename, cp, fnlen); + upd->filename[fnlen] = 0; + + return upd; +} + +AVRUPD * dup_AVRUPD(AVRUPD * upd) +{ + AVRUPD * u; + + u = (AVRUPD *)MALLOC(sizeof(AVRUPD)); + if(u == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + memcpy(u, upd, sizeof(AVRUPD)); + + if((u->memtype = MALLOC(strlen(upd->memtype)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(u->memtype, upd->memtype); + if((u->filename = MALLOC(strlen(upd->filename)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(u->filename, upd->filename); + + return u; +} + +AVRUPD * new_AVRUPD(int op, char * memtype, int filefmt, char * filename) +{ + AVRUPD * u; + + u = (AVRUPD *)MALLOC(sizeof(AVRUPD)); + if (u == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + u->memtype = MALLOC(strlen(memtype)+1); + strcpy(u->memtype, memtype); + u->filename = MALLOC(strlen(filename)+1); + strcpy(u->filename, filename); + u->op = op; + u->format = filefmt; + + return u; +} + +int do_op(PROGRAMMER * pgm, struct avrpart * p, AVRUPD * upd, int nowrite, + int verify) +{ + struct avrpart * v; + AVRMEM * mem = NULL; + int size, vsize; + int rc; + + /* NEW */ + if(strcmp(upd->memtype, "flash") == 0) { + mem = p->flashmem; + } else if(strcmp(upd->memtype, "lfuse") == 0) { + mem = p->lfusemem; + } else if(strcmp(upd->memtype, "hfuse") == 0) { + mem = p->hfusemem; + } + + if (mem == NULL) { + logprintf(LOG_ERR, "\"%s\" memory type not defined for part \"%s\"", upd->memtype, p->desc); + return -1; + } + + if (upd->op == DEVICE_READ) { + /* + * read out the specified device memory and write it to a file + */ + + report_progress(0,1,"Reading"); + rc = avr_read(pgm, p, upd->memtype, 0); + if (rc < 0) { + logprintf(LOG_ERR, "failed to read all of %s memory, rc=%d", mem->desc, rc); + return -1; + } + report_progress(1,1,NULL); + size = rc; + + logprintf(LOG_INFO, + "writing output file \"%s\"", + strcmp(upd->filename, "-")==0 ? "" : upd->filename); + + rc = fileio(FIO_WRITE, upd->filename, upd->format, p, upd->memtype, size); + if (rc < 0) { + logprintf(LOG_ERR, "write to file '%s' failed", upd->filename); + return -1; + } + } + else if (upd->op == DEVICE_WRITE) { + /* + * write the selected device memory using data from a file; first + * read the data from the specified file + */ + + logprintf(LOG_INFO, + "reading input file \"%s\"", + strcmp(upd->filename, "-")==0 ? "" : upd->filename); + + rc = fileio(FIO_READ, upd->filename, upd->format, p, upd->memtype, -1); + if (rc < 0) { + logprintf(LOG_INFO, "write to file '%s' failed", upd->filename); + return -1; + } + size = rc; + + /* + * write the buffer contents to the selected memory type + */ + logprintf(LOG_INFO, "writing %s (%d bytes)", mem->desc, size); + + if (!nowrite) { + report_progress(0,1,"Writing"); + rc = avr_write(pgm, p, upd->memtype, size); + report_progress(1,1,NULL); + } + else { + /* + * test mode, don't actually write to the chip, output the buffer + * to stdout in intel hex instead + */ + rc = fileio(FIO_WRITE, "-", FMT_IHEX, p, upd->memtype, size); + } + + if (rc < 0) { + logprintf(LOG_ERR, "failed to write %s memory, rc=%d", mem->desc, rc); + return -1; + } + + vsize = rc; + + logprintf(LOG_INFO, "%d bytes of %s written", vsize, mem->desc); + + } + else if (upd->op == DEVICE_VERIFY) { + /* + * verify that the in memory file (p->mem[AVR_M_FLASH|AVR_M_EEPROM]) + * is the same as what is on the chip + */ + v = avr_dup_part(p); + + logprintf(LOG_INFO, "verifying %s memory against %s:", mem->desc, upd->filename); + logprintf(LOG_INFO, "load data %s data from input file %s:", mem->desc, upd->filename); + + rc = fileio(FIO_READ, upd->filename, upd->format, p, upd->memtype, -1); + if (rc < 0) { + logprintf(LOG_ERR, "read from file '%s' failed", upd->filename); + return -1; + } + size = rc; + + logprintf(LOG_INFO, "input file %s contains %d bytes", upd->filename, size); + + report_progress (0,1,"Reading"); + rc = avr_read(pgm, v, upd->memtype, size); + if (rc < 0) { + logprintf(LOG_ERR, "failed to read all of %s memory, rc=%d", mem->desc, rc); + return -1; + } + report_progress (1,1,NULL); + + logprintf(LOG_INFO, "verifying ..."); + + rc = avr_verify(p, v, upd->memtype, size); + if (rc < 0) { + logprintf(LOG_ERR, "verification error; content mismatch"); + return -1; + } + + logprintf(LOG_INFO, "%d bytes of %s verified", rc, mem->desc); + + FREE(v->sigmem->buf); + FREE(v->sigmem); + FREE(v->flashmem->buf); + FREE(v->flashmem); + FREE(v->hfusemem->buf); + FREE(v->hfusemem); + FREE(v->lfusemem->buf); + FREE(v->lfusemem); + FREE(v); + } + else { + logprintf(LOG_ERR, "invalid update operation (%d) requested", upd->op); + return -1; + } + + return 0; +} + diff --git a/lib/ESPiLight/pilight/libs/avrdude/avrupd.h b/lib/ESPiLight/pilight/libs/avrdude/avrupd.h new file mode 100644 index 0000000..2640d97 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/avrupd.h @@ -0,0 +1,52 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000-2005 Brian S. Dean + * Copyright (C) 2007 Joerg Wunsch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: AVRUPD.h 722 2007-01-24 22:43:46Z joerg_wunsch $ */ + +#ifndef avrupd_h +#define avrupd_h + +enum { + DEVICE_READ, + DEVICE_WRITE, + DEVICE_VERIFY +}; + +typedef struct { + char * memtype; + int op; + char * filename; + int format; +} AVRUPD; + +#ifdef __cplusplus +extern "C" { +#endif + +AVRUPD * parse_op(char * s); +AVRUPD * dup_AVRUPD(AVRUPD * upd); +AVRUPD * new_AVRUPD(int op, char * memtype, int filefmt, char * filename); +int do_op(PROGRAMMER * pgm, struct avrpart * p, AVRUPD * upd, int nowrite, int verify); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/avrdude/fileio.c b/lib/ESPiLight/pilight/libs/avrdude/fileio.c new file mode 100644 index 0000000..c83e818 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/fileio.c @@ -0,0 +1,544 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000-2004 Brian S. Dean + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: fileio.c 929 2010-01-18 20:40:15Z joerg_wunsch $ */ + +#include +#include +#include +#include +#include +#include + +#include "../pilight/core/log.h" +#include "../pilight/core/mem.h" +#include "../pilight/core/common.h" +#include "avrdude.h" +#include "avr.h" +#include "fileio.h" + +#define IHEX_MAXDATA 256 +#define MAX_LINE_LEN 256 /* max line length for ASCII format input files */ + +struct ihexrec { + unsigned char reclen; + unsigned int loadofs; + unsigned char rectyp; + unsigned char data[IHEX_MAXDATA]; + unsigned char cksum; +}; + +static int b2ihex(unsigned char * inbuf, int bufsize, + int recsize, int startaddr, + char * outfile, FILE * outf) +{ + unsigned char * buf; + unsigned int nextaddr; + int n, nbytes, n_64k; + int i; + unsigned char cksum; + + if (recsize > 255) { + logprintf(LOG_ERR, "recsize=%d, must be < 256", recsize); + return -1; + } + + n_64k = 0; + nextaddr = startaddr; + buf = inbuf; + nbytes = 0; + + while (bufsize) { + n = recsize; + if (n > bufsize) + n = bufsize; + + if ((nextaddr + n) > 0x10000) + n = 0x10000 - nextaddr; + + if (n) { + cksum = 0; + fprintf(outf, ":%02X%04X00", n, nextaddr); + cksum += n + ((nextaddr >> 8) & 0x0ff) + (nextaddr & 0x0ff); + for (i=0; i= 0x10000) { + int lo, hi; + /* output an extended address record */ + n_64k++; + lo = n_64k & 0xff; + hi = (n_64k >> 8) & 0xff; + cksum = 0; + fprintf(outf, ":02000004%02X%02X", hi, lo); + cksum += 2 + 0 + 4 + hi + lo; + cksum = -cksum; + fprintf(outf, "%02X\n", cksum); + nextaddr = 0; + } + + /* advance to next 'recsize' bytes */ + buf += n; + bufsize -= n; + } + + /*----------------------------------------------------------------- + add the end of record data line + -----------------------------------------------------------------*/ + cksum = 0; + n = 0; + nextaddr = 0; + fprintf(outf, ":%02X%04X01", n, nextaddr); + cksum += n + ((nextaddr >> 8) & 0x0ff) + (nextaddr & 0x0ff) + 1; + cksum = -cksum; + fprintf(outf, "%02X\n", cksum); + + return nbytes; +} + + +static int ihex_readrec(struct ihexrec * ihex, char * rec) +{ + int i, j; + char buf[8]; + int offset, len; + char * e; + unsigned char cksum; + int rc; + + len = strlen(rec); + offset = 1; + cksum = 0; + + /* reclen */ + if (offset + 2 > len) + return -1; + for (i=0; i<2; i++) + buf[i] = rec[offset++]; + buf[i] = 0; + ihex->reclen = strtoul(buf, &e, 16); + if (e == buf || *e != 0) + return -1; + + /* load offset */ + if (offset + 4 > len) + return -1; + for (i=0; i<4; i++) + buf[i] = rec[offset++]; + buf[i] = 0; + ihex->loadofs = strtoul(buf, &e, 16); + if (e == buf || *e != 0) + return -1; + + /* record type */ + if (offset + 2 > len) + return -1; + for (i=0; i<2; i++) + buf[i] = rec[offset++]; + buf[i] = 0; + ihex->rectyp = strtoul(buf, &e, 16); + if (e == buf || *e != 0) + return -1; + + cksum = ihex->reclen + ((ihex->loadofs >> 8) & 0x0ff) + (ihex->loadofs & 0x0ff) + ihex->rectyp; + + /* data */ + for (j=0; jreclen; j++) { + if (offset + 2 > len) + return -1; + for (i=0; i<2; i++) + buf[i] = rec[offset++]; + buf[i] = 0; + ihex->data[j] = strtoul(buf, &e, 16); + if (e == buf || *e != 0) + return -1; + cksum += ihex->data[j]; + } + + /* cksum */ + if (offset + 2 > len) + return -1; + for (i=0; i<2; i++) + buf[i] = rec[offset++]; + buf[i] = 0; + ihex->cksum = strtoul(buf, &e, 16); + if (e == buf || *e != 0) + return -1; + + rc = -cksum & 0x000000ff; + + return rc; +} + + + +/* + * Intel Hex to binary buffer + * + * Given an open file 'inf' which contains Intel Hex formated data, + * parse the file and lay it out within the memory buffer pointed to + * by outbuf. The size of outbuf, 'bufsize' is honored; if data would + * fall outsize of the memory buffer outbuf, an error is generated. + * + * Return the maximum memory address within 'outbuf' that was written. + * If an error occurs, return -1. + * + * */ +static int ihex2b(char * infile, FILE * inf, + unsigned char * outbuf, int bufsize) +{ + char buffer [ MAX_LINE_LEN ]; + unsigned char * buf; + unsigned int nextaddr, baseaddr, maxaddr, offsetaddr; + int i; + int lineno; + int len; + struct ihexrec ihex; + int rc; + + lineno = 0; + buf = outbuf; + baseaddr = 0; + maxaddr = 0; + offsetaddr = 0; + nextaddr = 0; + + while (fgets((char *)buffer,MAX_LINE_LEN,inf)!=NULL) { + lineno++; + len = strlen(buffer); + if (buffer[len-1] == '\n') + buffer[--len] = 0; + if (buffer[0] != ':') + continue; + rc = ihex_readrec(&ihex, buffer); + if (rc < 0) { + logprintf(LOG_ERR, "invalid record at line %d of \"%s\"", lineno, infile); + return -1; + } + else if (rc != ihex.cksum) { + logprintf(LOG_ERR, "ERROR: checksum mismatch at line %d of \"%s\"", lineno, infile); + logprintf(LOG_ERR, "checksum=0x%02x, computed checksum=0x%02x", ihex.cksum, rc); + return -1; + } + + switch (ihex.rectyp) { + case 0: /* data record */ + nextaddr = ihex.loadofs + baseaddr; + if ((nextaddr + ihex.reclen) > (bufsize+offsetaddr)) { + logprintf(LOG_ERR, "ERROR: address 0x%04x out of range at line %d of %s", nextaddr+ihex.reclen, lineno, infile); + return -1; + } + for (i=0; i maxaddr) + maxaddr = nextaddr+ihex.reclen; + break; + + case 1: /* end of file record */ + return maxaddr-offsetaddr; + break; + + case 2: /* extended segment address record */ + baseaddr = (ihex.data[0] << 8 | ihex.data[1]) << 4; + break; + + case 3: /* start segment address record */ + /* we don't do anything with the start address */ + break; + + case 4: /* extended linear address record */ + baseaddr = (ihex.data[0] << 8 | ihex.data[1]) << 16; + if(nextaddr == 0) offsetaddr = baseaddr; // if provided before any data, then remember it + break; + + case 5: /* start linear address record */ + /* we don't do anything with the start address */ + break; + + default: + logprintf(LOG_ERR, "don't know how to deal with rectype=%d at line %d of %s", ihex.rectyp, lineno, infile); + return -1; + break; + } + + } /* while */ + + logprintf(LOG_ERR, "no end of file record found for Intel Hex file \"%s\"", infile); + + return maxaddr-offsetaddr; +} + +static int fileio_imm(struct fioparms * fio, + char * filename, FILE * f, unsigned char * buf, int size) +{ + int rc = 0; + char *e = NULL, **array = NULL; + unsigned long b = 0; + int loc = 0; + unsigned int n = 0, i = 0; + + switch (fio->op) { + case FIO_READ: + loc = 0; + n = explode(filename, " ,", &array); + for(i=0;iop); + return -1; + } + + if (rc < 0 || (fio->op == FIO_WRITE && rc < size)) { + logprintf(LOG_ERR, "%s error %s %s: %s; %s %d of the expected %d bytes", + fio->iodesc, fio->dir, filename, strerror(errno), fio->rw, rc, size); + return -1; + } + + return rc; +} + + +static int fileio_ihex(struct fioparms * fio, + char * filename, FILE * f, unsigned char * buf, int size) +{ + int rc; + + switch (fio->op) { + case FIO_WRITE: + rc = b2ihex(buf, size, 32, 0, filename, f); + if (rc < 0) { + return -1; + } + break; + + case FIO_READ: + rc = ihex2b(filename, f, buf, size); + if (rc < 0) + return -1; + break; + + default: + logprintf(LOG_ERR, "invalid Intex Hex file I/O operation=%d", fio->op); + return -1; + break; + } + + return rc; +} + +int fileio_setparms(int op, struct fioparms * fp) +{ + fp->op = op; + + switch (op) { + case FIO_READ: + fp->mode = "r"; + fp->iodesc = "input"; + fp->dir = "from"; + fp->rw = "read"; + break; + + case FIO_WRITE: + fp->mode = "w"; + fp->iodesc = "output"; + fp->dir = "to"; + fp->rw = "wrote"; + break; + + default: + logprintf(LOG_ERR, "invalid I/O operation %d", op); + return -1; + break; + } + + return 0; +} + +int fmt_autodetect(char * fname) +{ + FILE * f; + unsigned char buf[MAX_LINE_LEN]; + int i; + int len; + int found; + + f = fopen(fname, "r"); + if (f == NULL) { + logprintf(LOG_ERR, "error opening %s: %s", fname, strerror(errno)); + return -1; + } + + while (fgets((char *)buf, MAX_LINE_LEN, f)!=NULL) { + buf[MAX_LINE_LEN-1] = 0; + len = strlen((char *)buf); + if (buf[len-1] == '\n') + buf[--len] = 0; + + /* check for binary data */ + found = 0; + for (i=0; i 127) { + found = 1; + break; + } + } + if (found) { + fclose(f); + return FMT_RBIN; + } + + /* check for lines that look like intel hex */ + if ((buf[0] == ':') && (len >= 11)) { + found = 1; + for (i=1; i= 10) && isdigit(buf[1])) { + found = 1; + for (i=1; iflashmem; + } else if(strcmp(memtype, "lfuse") == 0) { + mem = p->lfusemem; + } else if(strcmp(memtype, "hfuse") == 0) { + mem = p->hfusemem; + } + if (mem == NULL) { + logprintf(LOG_ERR, "fileio(): memory type \"%s\" not configured for device \"%s\"", memtype, p->desc); + return -1; + } + + rc = fileio_setparms(op, &fio); + if (rc < 0) + return -1; + + /* point at the requested memory buffer */ + buf = mem->buf; + if (fio.op == FIO_READ) + size = mem->size; + + if (fio.op == FIO_READ) { + /* 0xff fill unspecified memory */ + memset(buf, 0xff, size); + } + + fname = filename; + f = NULL; + + if (format == FMT_AUTO) { + format = fmt_autodetect(fname); + logprintf(LOG_INFO, "%s file %s auto detected as Intel Hex", fio.iodesc, fname); + } + + if (format != FMT_IMM) { + f = fopen(fname, fio.mode); + if (f == NULL) { + logprintf(LOG_ERR, "can't open %s file %s: %s", fio.iodesc, fname, strerror(errno)); + return -1; + } + } + + switch (format) { + case FMT_IHEX: + rc = fileio_ihex(&fio, fname, f, buf, size); + break; + case FMT_IMM: + rc = fileio_imm(&fio, fname, f, buf, size); + break; + default: + return -1; + } + + if (rc > 0) { + if ((op == FIO_READ) && (strcasecmp(mem->desc, "flash") == 0)) { + /* + * if we are reading flash, just mark the size as being the + * highest non-0xff byte + */ + rc = avr_mem_hiaddr(mem); + } + } + if (format != FMT_IMM) { + fclose(f); + } + + return rc; +} + diff --git a/lib/ESPiLight/pilight/libs/avrdude/fileio.h b/lib/ESPiLight/pilight/libs/avrdude/fileio.h new file mode 100644 index 0000000..8711d2d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/fileio.h @@ -0,0 +1,67 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000-2004 Brian S. Dean + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: fileio.h 722 2007-01-24 22:43:46Z joerg_wunsch $ */ + +#ifndef fileio_h +#define fileio_h + +typedef enum { + FMT_AUTO, + FMT_SREC, + FMT_IHEX, + FMT_RBIN, + FMT_IMM, + FMT_HEX, + FMT_DEC, + FMT_OCT, + FMT_BIN +} FILEFMT; + +struct fioparms { + int op; + char * mode; + char * iodesc; + char * dir; + char * rw; +}; + +enum { + FIO_READ, + FIO_WRITE +}; + +#ifdef __cplusplus +extern "C" { +#endif + +char * fmtstr(FILEFMT format); + +int fileio_setparms(int op, struct fioparms * fp); + +int fileio(int op, char * filename, FILEFMT format, + struct avrpart * p, char * memtype, int size); + +int fmt_autodetect(char * fname); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/avrdude/pgm.c b/lib/ESPiLight/pilight/libs/avrdude/pgm.c new file mode 100644 index 0000000..e56ba85 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/pgm.c @@ -0,0 +1,174 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2002-2004 Brian S. Dean + * Copyright 2007 Joerg Wunsch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: pgm.c 797 2009-02-17 15:31:27Z joerg_wunsch $ */ + +#include +#include +#include + +#include "../pilight/core/log.h" +#include "../pilight/core/mem.h" +#include "avrdude.h" +#include "pgm.h" + +static int pgm_default_2 (struct programmer_t *, AVRPART *); +static int pgm_default_3 (struct programmer_t * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char * value); +static void pgm_default_4 (struct programmer_t *); +static int pgm_default_5 (struct programmer_t * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char data); +static void pgm_default_6 (struct programmer_t *, const char *); + + +static int pgm_default_open (struct programmer_t *pgm, char * name) { + return 0; +} + +static int pgm_default_led (struct programmer_t * pgm, int value) +{ + /* + * If programmer has no LEDs, just do nothing. + */ + return 0; +} + + +static void pgm_default_powerup_powerdown (struct programmer_t * pgm) +{ + /* + * If programmer does not support powerup/down, just do nothing. + */ +} + + +PROGRAMMER * pgm_new(void) +{ + int i; + PROGRAMMER * pgm; + + pgm = (PROGRAMMER *)MALLOC(sizeof(*pgm)); + if (pgm == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + memset(pgm, 0, sizeof(*pgm)); + + pgm->desc[0] = 0; + pgm->type[0] = 0; + pgm->lineno = 0; + pgm->baudrate = 0; + + for (i=0; ipinno[i] = 0; + + /* + * mandatory functions - these are called without checking to see + * whether they are assigned or not + */ + pgm->initialize = pgm_default_2; + pgm->display = pgm_default_6; + pgm->enable = pgm_default_4; + pgm->disable = pgm_default_4; + pgm->powerup = pgm_default_powerup_powerdown; + pgm->powerdown = pgm_default_powerup_powerdown; + pgm->program_enable = pgm_default_2; + pgm->chip_erase = pgm_default_2; + pgm->open = pgm_default_open; + pgm->close = pgm_default_4; + pgm->read_byte = pgm_default_3; + pgm->write_byte = pgm_default_5; + + /* + * predefined functions - these functions have a valid default + * implementation. Hence, they don't need to be defined in + * the programmer. + */ + pgm->rdy_led = pgm_default_led; + pgm->err_led = pgm_default_led; + pgm->pgm_led = pgm_default_led; + pgm->vfy_led = pgm_default_led; + + /* + * optional functions - these are checked to make sure they are + * assigned before they are called + */ + pgm->cmd = NULL; + pgm->spi = NULL; + pgm->paged_write = NULL; + pgm->paged_load = NULL; + pgm->write_setup = NULL; + pgm->read_sig_bytes = NULL; + pgm->set_vtarget = NULL; + pgm->set_varef = NULL; + pgm->set_fosc = NULL; + pgm->perform_osccal = NULL; + pgm->setup = NULL; + pgm->teardown = NULL; + + return pgm; +} + + +static void pgm_default(void) +{ + logprintf(LOG_NOTICE, "AVR programmer operation not supported"); +} + + +static int pgm_default_2 (struct programmer_t * pgm, AVRPART * p) +{ + pgm_default(); + return -1; +} + +static int pgm_default_3 (struct programmer_t * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char * value) +{ + pgm_default(); + return -1; +} + +static void pgm_default_4 (struct programmer_t * pgm) +{ + pgm_default(); +} + +static int pgm_default_5 (struct programmer_t * pgm, AVRPART * p, AVRMEM * mem, + unsigned long addr, unsigned char data) +{ + pgm_default(); + return -1; +} + +static void pgm_default_6 (struct programmer_t * pgm, const char * p) +{ + pgm_default(); +} + + +// void programmer_display(PROGRAMMER * pgm, const char * p) +// { + // logprintf(LOG_INFO, "%sProgrammer Type : %s", p, pgm->type); + // logprintf(LOG_INFO, "%sDescription : %s", p, pgm->desc); + + // pgm->display(pgm, p); +// } diff --git a/lib/ESPiLight/pilight/libs/avrdude/pgm.h b/lib/ESPiLight/pilight/libs/avrdude/pgm.h new file mode 100644 index 0000000..633c6dc --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/pgm.h @@ -0,0 +1,129 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2002-2004 Brian S. Dean + * Copyright 2007 Joerg Wunsch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: pgm.h 797 2009-02-17 15:31:27Z joerg_wunsch $ */ + +#ifndef pgm_h +#define pgm_h + +#include + +#include "avrpart.h" +#include "serial.h" +#include "pindefs.h" + +#define ON 1 +#define OFF 0 + +#define PGM_DESCLEN 80 +#define PGM_PORTLEN 4096 +#define PGM_TYPELEN 32 + +typedef enum { + EXIT_VCC_UNSPEC, + EXIT_VCC_ENABLED, + EXIT_VCC_DISABLED +} exit_vcc_t; + +typedef enum { + EXIT_RESET_UNSPEC, + EXIT_RESET_ENABLED, + EXIT_RESET_DISABLED +} exit_reset_t; + +typedef struct programmer_t { + char desc[PGM_DESCLEN]; + char type[PGM_TYPELEN]; + char port[PGM_PORTLEN]; + unsigned int pinno[N_PINS]; + exit_vcc_t exit_vcc; + exit_reset_t exit_reset; + int ppidata; + int ppictrl; + int baudrate; + double bitclock; /* JTAG ICE clock period in microseconds */ + int ispdelay; /* ISP clock delay */ + union filedescriptor fd; + int page_size; /* page size if the programmer supports paged write/load */ + int (*rdy_led) (struct programmer_t * pgm, int value); + int (*err_led) (struct programmer_t * pgm, int value); + int (*pgm_led) (struct programmer_t * pgm, int value); + int (*vfy_led) (struct programmer_t * pgm, int value); + int (*initialize) (struct programmer_t * pgm, AVRPART * p); + void (*display) (struct programmer_t * pgm, const char * p); + void (*enable) (struct programmer_t * pgm); + void (*disable) (struct programmer_t * pgm); + void (*powerup) (struct programmer_t * pgm); + void (*powerdown) (struct programmer_t * pgm); + int (*program_enable) (struct programmer_t * pgm, AVRPART * p); + int (*chip_erase) (struct programmer_t * pgm, AVRPART * p); + int (*cmd) (struct programmer_t * pgm, unsigned char cmd[4], + unsigned char res[4]); + int (*spi) (struct programmer_t * pgm, unsigned char cmd[], + unsigned char res[], int count); + int (*open) (struct programmer_t * pgm, char * port); + void (*close) (struct programmer_t * pgm); + int (*paged_write) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m, + unsigned int page_size, unsigned int baseaddr, + unsigned int n_bytes); + int (*paged_load) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m, + unsigned int page_size, unsigned int baseaddr, + unsigned int n_bytes); + void (*write_setup) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m); + int (*write_byte) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m, + unsigned long addr, unsigned char value); + int (*read_byte) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m, + unsigned long addr, unsigned char * value); + int (*read_sig_bytes) (struct programmer_t * pgm, AVRPART * p, AVRMEM * m); + void (*print_parms) (struct programmer_t * pgm); + int (*set_vtarget) (struct programmer_t * pgm, double v); + int (*set_varef) (struct programmer_t * pgm, unsigned int chan, double v); + int (*set_fosc) (struct programmer_t * pgm, double v); + int (*set_sck_period) (struct programmer_t * pgm, double v); + int (*setpin) (struct programmer_t * pgm, int pin, int value); + int (*getpin) (struct programmer_t * pgm, int pin); + int (*highpulsepin) (struct programmer_t * pgm, int pin); + int (*parseexitspecs) (struct programmer_t * pgm, char *s); + int (*perform_osccal) (struct programmer_t * pgm); + void (*setup) (struct programmer_t * pgm); + void (*teardown) (struct programmer_t * pgm); + char config_file[4096]; /* config file where defined */ + int lineno; /* config file line number */ + void *cookie; /* for private use by the programmer */ + char flag; /* for private use of the programmer */ +} PROGRAMMER; + +#ifdef __cplusplus +extern "C" { +#endif + +PROGRAMMER * pgm_new(void); + +void programmer_display(PROGRAMMER * pgm, const char * p); + +typedef void (*walk_programmers_cb)(const char *name, const char *desc, + const char *cfgname, int cfglineno, + void *cookie); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/avrdude/pindefs.h b/lib/ESPiLight/pilight/libs/avrdude/pindefs.h new file mode 100644 index 0000000..9d75a6d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/pindefs.h @@ -0,0 +1,44 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000-2004 Brian S. Dean + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: pindefs.h 515 2005-09-18 20:12:23Z joerg_wunsch $ */ + +#ifndef __pindefs_h__ +#define __pindefs_h__ + +enum { + PPI_AVR_VCC=1, + PPI_AVR_BUFF, + PIN_AVR_RESET, + PIN_AVR_SCK, + PIN_AVR_MOSI, + PIN_AVR_MISO, + PIN_LED_ERR, + PIN_LED_RDY, + PIN_LED_PGM, + PIN_LED_VFY, + N_PINS +}; +#define PIN_INVERSE 0x80 /* flag for inverted pin in serbb */ +#define PIN_MASK 0x7f + +#define LED_ON(fd,pin) ppi_setpin(fd,pin,0) +#define LED_OFF(fd,pin) ppi_setpin(fd,pin,1) + +#endif diff --git a/lib/ESPiLight/pilight/libs/avrdude/safemode.c b/lib/ESPiLight/pilight/libs/avrdude/safemode.c new file mode 100644 index 0000000..f201af2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/safemode.c @@ -0,0 +1,297 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * avrdude is Copyright (C) 2000-2004 Brian S. Dean + * + * This file: Copyright (C) 2005-2007 Colin O'Flynn + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include + +#include "../pilight/core/log.h" +#include "avrdude.h" +#include "avr.h" +#include "pgm.h" +#include "safemode.h" + +/* This value from ac_cfg.h */ +/* + * Writes the specified fuse in fusename (can be "lfuse", "hfuse", or + * "efuse") and verifies it. Will try up to tries amount of times + * before giving up + */ +int safemode_writefuse (unsigned char fuse, const char * fusename, PROGRAMMER * pgm, + AVRPART * p, int tries) +{ + AVRMEM * m = NULL; + unsigned char fuseread; + int returnvalue = -1; + + // m = avr_locate_mem(p, fusename); + if (m == NULL) { + return -1; + } + + /* Keep trying to write then read back the fuse values */ + while (tries > 0) { + if (avr_write_byte(pgm, p, m, 0, fuse) != 0) { + continue; + } + if (pgm->read_byte(pgm, p, m, 0, &fuseread) != 0) { + continue; + } + + /* Report information to user if needed */ + logprintf(LOG_ERR, "AVR wrote %s to %x, read as %x. %d attempts left", fusename, fuse, fuseread, tries-1); + + /* If fuse wrote OK, no need to keep going */ + if (fuse == fuseread) { + tries = 0; + returnvalue = 0; + } + tries--; + } + + return returnvalue; +} + +/* + * Reads the fuses three times, checking that all readings are the + * same. This will ensure that the before values aren't in error! + */ +int safemode_readfuses (unsigned char * lfuse, unsigned char * hfuse, + unsigned char * efuse, unsigned char * fuse, + PROGRAMMER * pgm, AVRPART * p) +{ + + unsigned char value; + unsigned char fusegood = 0; + unsigned char allowfuseread = 1; + unsigned char safemode_lfuse; + unsigned char safemode_hfuse; + unsigned char safemode_efuse; + unsigned char safemode_fuse; + AVRMEM * m = NULL; + + safemode_lfuse = *lfuse; + safemode_hfuse = *hfuse; + safemode_efuse = *efuse; + safemode_fuse = *fuse; + + + /* Read fuse three times */ + // fusegood = 2; /* If AVR device doesn't support this fuse, don't want + // to generate a verify error */ + // m = avr_locate_mem(p, "fuse"); + // if (m != NULL) { + // fusegood = 0; /* By default fuse is a failure */ + // if(pgm->read_byte(pgm, p, m, 0, &safemode_fuse) != 0) + // { + // allowfuseread = 0; + // } + // if(pgm->read_byte(pgm, p, m, 0, &value) != 0) + // { + // allowfuseread = 0; + // } + // if (value == safemode_fuse) { + // if (pgm->read_byte(pgm, p, m, 0, &value) != 0) + // { + // allowfuseread = 0; + // } + // if (value == safemode_fuse) + // { + // fusegood = 1; /* Fuse read OK three times */ + // } + // } + // } + + // //Programmer does not allow fuse reading.... no point trying anymore + // if (allowfuseread == 0) + // { + // return -5; + // } + + // if (fusegood == 0) { + // logprintf(LOG_ERR, "AVR verify error, unable to read fuse properly."); + // logprintf(LOG_ERR, "Programmer may not be reliable."); + // return -1; + // } + // else if ((fusegood == 1)) { + // logprintf(LOG_INFO, "AVR fuse reads as %X", safemode_lfuse); + // } + + + /* Read lfuse three times */ + fusegood = 2; /* If AVR device doesn't support this fuse, don't want + to generate a verify error */ + m = p->lfusemem; + if (m != NULL) { + fusegood = 0; /* By default fuse is a failure */ + if (pgm->read_byte(pgm, p, m, 0, &safemode_lfuse) != 0) { + allowfuseread = 0; + } + if (pgm->read_byte(pgm, p, m, 0, &value) != 0) { + allowfuseread = 0; + } + if (value == safemode_lfuse) { + if (pgm->read_byte(pgm, p, m, 0, &value) != 0) { + allowfuseread = 0; + } + if (value == safemode_lfuse) { + fusegood = 1; /* Fuse read OK three times */ + } + } + } + + //Programmer does not allow fuse reading.... no point trying anymore + if (allowfuseread == 0) { + return -5; + } + + + if (fusegood == 0) { + logprintf(LOG_ERR, "AVR verify error, unable to read lfuse properly."); + logprintf(LOG_ERR, "Programmer may not be reliable."); + return -1; + } + else if (fusegood == 1) { + logprintf(LOG_INFO, "AVR lfuse reads as %X", safemode_lfuse); + } + + /* Read hfuse three times */ + fusegood = 2; /* If AVR device doesn't support this fuse, don't want + to generate a verify error */ + m = p->hfusemem; + if (m != NULL) { + fusegood = 0; /* By default fuse is a failure */ + if (pgm->read_byte(pgm, p, m, 0, &safemode_hfuse) != 0) { + allowfuseread = 0; + } + if (pgm->read_byte(pgm, p, m, 0, &value) != 0) { + allowfuseread = 0; + } + if (value == safemode_hfuse) { + if (pgm->read_byte(pgm, p, m, 0, &value) != 0) { + allowfuseread = 0; + } + if (value == safemode_hfuse) { + fusegood = 1; /* Fuse read OK three times */ + } + } + } + + //Programmer does not allow fuse reading.... no point trying anymore + if (allowfuseread == 0) { + return -5; + } + + if (fusegood == 0) { + logprintf(LOG_ERR, "AVR verify error, unable to read hfuse properly."); + logprintf(LOG_ERR, "Programmer may not be reliable."); + return -1; + } + else if (fusegood == 1) { + logprintf(LOG_INFO, "AVR hfuse reads as %X", safemode_lfuse); + } + + /* Read efuse three times */ + fusegood = 2; /* If AVR device doesn't support this fuse, don't want + to generate a verify error */ + // m = avr_locate_mem(p, "efuse"); + // if (m != NULL) { + // fusegood = 0; /* By default fuse is a failure */ + // if (pgm->read_byte(pgm, p, m, 0, &safemode_efuse) != 0) + // { + // allowfuseread = 0; + // } + // if (pgm->read_byte(pgm, p, m, 0, &value) != 0) + // { + // allowfuseread = 0; + // } + // if (value == safemode_efuse) { + // if (pgm->read_byte(pgm, p, m, 0, &value) != 0) + // { + // allowfuseread = 0; + // } + // if (value == safemode_efuse){ + // fusegood = 1; /* Fuse read OK three times */ + // } + // } + // } + + // //Programmer does not allow fuse reading.... no point trying anymore + // if (allowfuseread == 0) + // { + // return -5; + // } + + // if (fusegood == 0) { + // logprintf(LOG_ERR, "AVR verify error, unable to read efuse properly."); + // logprintf(LOG_ERR, "Programmer may not be reliable."); + // return -1; + // } + // else if ((fusegood == 1)) { + // logprintf(LOG_INFO, "AVR efuse reads as %X", safemode_lfuse); + // } + + *lfuse = safemode_lfuse; + *hfuse = safemode_hfuse; + *efuse = safemode_efuse; + *fuse = safemode_fuse; + + return 0; +} + + +/* + * This routine will store the current values pointed to by lfuse, + * hfuse, and efuse into an internal buffer in this routine when save + * is set to 1. When save is 0 (or not 1 really) it will copy the + * values from the internal buffer into the locations pointed to be + * lfuse, hfuse, and efuse. This allows you to change the fuse bits if + * needed from another routine (ie: have it so if user requests fuse + * bits are changed, the requested value is now verified + */ +int safemode_memfuses (int save, unsigned char * lfuse, unsigned char * hfuse, + unsigned char * efuse, unsigned char * fuse) +{ + static unsigned char safemode_lfuse = 0xff; + static unsigned char safemode_hfuse = 0xff; + static unsigned char safemode_efuse = 0xff; + static unsigned char safemode_fuse = 0xff; + + switch (save) { + + /* Save the fuses as safemode setting */ + case 1: + safemode_lfuse = *lfuse; + safemode_hfuse = *hfuse; + safemode_efuse = *efuse; + safemode_fuse = *fuse; + + break; + /* Read back the fuses */ + default: + *lfuse = safemode_lfuse; + *hfuse = safemode_hfuse; + *efuse = safemode_efuse; + *fuse = safemode_fuse; + break; + } + + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/avrdude/safemode.h b/lib/ESPiLight/pilight/libs/avrdude/safemode.h new file mode 100644 index 0000000..9e0a0a0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/safemode.h @@ -0,0 +1,47 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * avrdude is Copyright (C) 2000-2004 Brian S. Dean + * + * This file: Copyright (C) 2005 Colin O'Flynn + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#ifndef safemode_h +#define safemode_h + +#ifdef __cplusplus +extern "C" { +#endif + +/* Writes the specified fuse in fusename (can be "lfuse", "hfuse", or "efuse") and verifies it. Will try up to tries +amount of times before giving up */ +int safemode_writefuse (unsigned char fuse, const char * fusename, PROGRAMMER * pgm, AVRPART * p, int tries); + +/* Reads the fuses three times, checking that all readings are the same. This will ensure that the before values aren't in error! */ +int safemode_readfuses (unsigned char * lfuse, unsigned char * hfuse, unsigned char * efuse, unsigned char * fuse, PROGRAMMER * pgm, AVRPART * p); + +/* This routine will store the current values pointed to by lfuse, hfuse, and efuse into an internal buffer in this routine +when save is set to 1. When save is 0 (or not 1 really) it will copy the values from the internal buffer into the locations +pointed to be lfuse, hfuse, and efuse. This allows you to change the fuse bits if needed from another routine (ie: have it so +if user requests fuse bits are changed, the requested value is now verified */ +int safemode_memfuses (int save, unsigned char * lfuse, unsigned char * hfuse, unsigned char * efuse, unsigned char * fuse); + +#ifdef __cplusplus +} +#endif + +#endif /* safemode_h */ diff --git a/lib/ESPiLight/pilight/libs/avrdude/ser_posix.c b/lib/ESPiLight/pilight/libs/avrdude/ser_posix.c new file mode 100644 index 0000000..ee5a77f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/ser_posix.c @@ -0,0 +1,285 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2003-2004 Theodore A. Roth + * Copyright (C) 2006 Joerg Wunsch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* $Id: ser_posix.c 1294 2014-03-12 23:03:18Z joerg_wunsch $ */ + +/* + * Posix serial interface for avrdude. + */ + +#ifndef _WIN32 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "../pilight/core/log.h" +#include "../pilight/core/mem.h" +#include "avrdude.h" +#include "serial.h" + +long serial_recv_timeout = 5000; /* ms */ + +static struct termios original_termios; +static int saved_original_termios; + +static int ser_setspeed(union filedescriptor *fd, long baud) { + int rc = 0; + struct termios termios; + speed_t speed = baud; + + if(!isatty(fd->ifd)) { + return -ENOTTY; + } + + /* + * initialize terminal modes + */ + if(tcgetattr(fd->ifd, &termios) < 0) { + logprintf(LOG_ERR, "ser_setspeed(): tcgetattr() failed"); + return -errno; + } + + /* + * copy termios for ser_close if we haven't already + */ + if(!saved_original_termios++) { + original_termios = termios; + } + + termios.c_iflag = IGNBRK; + termios.c_oflag = 0; + termios.c_lflag = 0; + termios.c_cflag = (CS8 | CREAD | CLOCAL); + termios.c_cc[VMIN] = 1; + termios.c_cc[VTIME] = 0; + + cfsetospeed(&termios, speed); + cfsetispeed(&termios, speed); + + if(tcsetattr(fd->ifd, TCSANOW, &termios) < 0) { + logprintf(LOG_ERR, "%s: ser_setspeed(): tcsetattr() failed"); + return -errno; + } + + /* + * Everything is now set up for a local line without modem control + * or flow control, so clear O_NONBLOCK again. + */ + rc = fcntl(fd->ifd, F_GETFL, 0); + if(rc != -1) { + fcntl(fd->ifd, F_SETFL, rc & ~O_NONBLOCK); + } + + return 0; +} + +static int ser_set_dtr_rts(union filedescriptor *fdp, int is_on) { + unsigned int ctl = 0; + + if(ioctl(fdp->ifd, TIOCMGET, &ctl) < 0) { + // perror("ioctl(\"TIOCMGET\")"); + return -1; + } + + if(is_on > 0) { + /* Set DTR and RTS */ + ctl |= (TIOCM_DTR | TIOCM_RTS); + } else { + /* Clear DTR and RTS */ + ctl &= ~(TIOCM_DTR | TIOCM_RTS); + } + + if(ioctl(fdp->ifd, TIOCMSET, &ctl) < 0) { + // perror("ioctl(\"TIOCMSET\")"); + return -1; + } + + return 0; +} + +static int ser_open(char * port, union pinfo pinfo, union filedescriptor *fdp) { + int rc = 0, fd = 0; + + /* + * open the serial port + */ + if((fd = open(port, O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0) { + logprintf(LOG_ERR, "ser_open(): can't open device \"%s\": %s", port, strerror(errno)); + return -1; + } + + fdp->ifd = fd; + + /* + * set serial line attributes + */ + if((rc = ser_setspeed(fdp, pinfo.baud)) > 0) { + logprintf(LOG_ERR, "ser_open(): can't set attributes for device \"%s\": %s", port, strerror(-rc)); + close(fd); + return -1; + } + return 0; +} + + +static void ser_close(union filedescriptor *fd) { + /* + * restore original termios settings from ser_open + */ + if(saved_original_termios > 0) { + if(tcsetattr(fd->ifd, TCSANOW | TCSADRAIN, &original_termios) > 0) { + logprintf(LOG_ERR, "ser_close(): can't reset attributes for device: %s", strerror(errno)); + } + saved_original_termios = 0; + } + + close(fd->ifd); +} + + +static int ser_send(union filedescriptor *fd, unsigned char * buf, size_t buflen) { + int rc = 0; + unsigned char *p = buf; + size_t len = buflen; + + if(len <= 0) + return 0; + + while(len) { + rc = write(fd->ifd, p, (len > 1024) ? 1024 : len); + if(rc < 0) { + logprintf(LOG_ERR, "ser_send(): write error: %s", strerror(errno)); + exit(1); + } + p += rc; + len -= rc; + } + + return 0; +} + + +static int ser_recv(union filedescriptor *fd, unsigned char * buf, size_t buflen) { + struct timeval timeout, to2; + fd_set rfds; + int nfds = 0, rc = 0; + unsigned char *p = buf; + size_t len = 0; + + timeout.tv_sec = serial_recv_timeout / 1000L; + timeout.tv_usec = (serial_recv_timeout % 1000L) * 1000; + to2 = timeout; + + while(len < buflen) { + reselect: + FD_ZERO(&rfds); + FD_SET(fd->ifd, &rfds); + + nfds = select(fd->ifd + 1, &rfds, NULL, NULL, &to2); + if(nfds == 0) { + logprintf(LOG_ERR, "ser_recv(): programmer is not responding"); + return -1; + } else if(nfds == -1) { + if(errno == EINTR || errno == EAGAIN) { + logprintf(LOG_ERR, "ser_recv(): programmer is not responding, reselecting"); + goto reselect; + } else { + logprintf(LOG_ERR, "ser_recv(): select(): %s", strerror(errno)); + return -1; + } + } + + rc = read(fd->ifd, p, (buflen - len > 1024) ? 1024 : buflen - len); + if(rc < 0) { + logprintf(LOG_ERR, "ser_recv(): read error: %s", strerror(errno)); + return -1; + } + p += rc; + len += rc; + } + + p = buf; + + return 0; +} + + +static int ser_drain(union filedescriptor *fd, int display) { + struct timeval timeout; + fd_set rfds; + int nfds = 0, rc = 0; + unsigned char buf; + + timeout.tv_sec = 0; + timeout.tv_usec = 250000; + + while(1) { + FD_ZERO(&rfds); + FD_SET(fd->ifd, &rfds); + + reselect: + nfds = select(fd->ifd + 1, &rfds, NULL, NULL, &timeout); + if(nfds == 0) { + break; + } else if(nfds == -1) { + if(errno == EINTR) { + goto reselect; + } else { + logprintf(LOG_ERR, "ser_drain(): select(): %s", strerror(errno)); + return -1; + } + } + + rc = read(fd->ifd, &buf, 1); + if(rc < 0) { + logprintf(LOG_ERR, "ser_drain(): read error: %s", strerror(errno)); + return -1; + } + } + + return 0; +} + +struct serial_device serial_serdev = { + .open = ser_open, + .setspeed = ser_setspeed, + .close = ser_close, + .send = ser_send, + .recv = ser_recv, + .drain = ser_drain, + .set_dtr_rts = ser_set_dtr_rts, + .flags = SERDEV_FL_CANSETSPEED, +}; + +struct serial_device *serdev = &serial_serdev; + +#endif /* WIN32NATIVE */ diff --git a/lib/ESPiLight/pilight/libs/avrdude/ser_win32.c b/lib/ESPiLight/pilight/libs/avrdude/ser_win32.c new file mode 100644 index 0000000..65dbdc8 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/ser_win32.c @@ -0,0 +1,292 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2003-2004 Theodore A. Roth + * Copyright (C) 2006 Joerg Wunsch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* $Id: ser_win32.c 1294 2014-03-12 23:03:18Z joerg_wunsch $ */ + +/* +* Native Win32 serial interface for avrdude. +*/ + +#ifdef _WIN32 + +#include +#include +#include + +#include "../pilight/core/log.h" +#include "../pilight/core/mem.h" +#include "serial.h" + +long serial_recv_timeout = 5000; /* ms */ + +#define W32SERBUFSIZE 1024 + +static BOOL serial_w32SetTimeOut(HANDLE hComPort, DWORD timeout) { + COMMTIMEOUTS ctmo; + ZeroMemory (&ctmo, sizeof(COMMTIMEOUTS)); + ctmo.ReadIntervalTimeout = timeout; + ctmo.ReadTotalTimeoutMultiplier = timeout; + ctmo.ReadTotalTimeoutConstant = timeout; + + return SetCommTimeouts(hComPort, &ctmo); +} + +static int ser_setspeed(union filedescriptor *fd, long baud) { + DCB dcb; + HANDLE hComPort = (HANDLE)fd->pfd; + + ZeroMemory (&dcb, sizeof(DCB)); + dcb.DCBlength = sizeof(DCB); + dcb.BaudRate = baud; + dcb.fBinary = 1; + dcb.fDtrControl = DTR_CONTROL_DISABLE; + dcb.fRtsControl = RTS_CONTROL_DISABLE; + dcb.ByteSize = 8; + dcb.Parity = NOPARITY; + dcb.StopBits = ONESTOPBIT; + + if(!SetCommState(hComPort, &dcb)) { + return -1; + } + + return 0; +} + + +static int ser_open(char * port, union pinfo pinfo, union filedescriptor *fdp) { + LPVOID lpMsgBuf; + HANDLE hComPort=INVALID_HANDLE_VALUE; + char *newname = 0; + + if(strncasecmp(port, "com", strlen("com")) == 0) { + // prepend "\\\\.\\" to name, required for port # >= 10 + newname = MALLOC(strlen("\\\\.\\") + strlen(port) + 1); + + if(newname == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(newname, "\\\\.\\"); + strcat(newname, port); + + port = newname; + } + + hComPort = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + + if(hComPort == INVALID_HANDLE_VALUE) { + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL); + logprintf(LOG_ERR, "ser_open(): can't open device \"%s\": %s", port, (char*)lpMsgBuf); + if(newname != NULL) { + FREE(newname); + } + LocalFree(lpMsgBuf); + return -1; + } + + if(!SetupComm(hComPort, W32SERBUFSIZE, W32SERBUFSIZE)) { + CloseHandle(hComPort); + logprintf(LOG_ERR, "ser_open(): can't set buffers for \"%s\"", port); + if(newname != NULL) { + FREE(newname); + } + return -1; + } + + fdp->pfd = (void *)hComPort; + if(ser_setspeed(fdp, pinfo.baud) != 0) { + CloseHandle(hComPort); + logprintf(LOG_ERR, "ser_open(): can't set com-state for \"%s\"", port); + if(newname != NULL) { + FREE(newname); + } + return -1; + } + + if(!serial_w32SetTimeOut(hComPort, 0)) { + CloseHandle(hComPort); + logprintf(LOG_ERR, "ser_open(): can't set initial timeout for \"%s\"", port); + if(newname != NULL) { + FREE(newname); + } + return -1; + } + + if(newname != NULL) { + FREE(newname); + } + return 0; +} + + +static void ser_close(union filedescriptor *fd) { + HANDLE hComPort=(HANDLE)fd->pfd; + if(hComPort != INVALID_HANDLE_VALUE) { + CloseHandle (hComPort); + } + + hComPort = INVALID_HANDLE_VALUE; +} + +static int ser_set_dtr_rts(union filedescriptor *fd, int is_on) { + HANDLE hComPort=(HANDLE)fd->pfd; + + if(is_on > 0) { + EscapeCommFunction(hComPort, SETDTR); + EscapeCommFunction(hComPort, SETRTS); + } else { + EscapeCommFunction(hComPort, CLRDTR); + EscapeCommFunction(hComPort, CLRRTS); + } + return 0; +} + + +static int ser_send(union filedescriptor *fd, unsigned char *buf, size_t buflen) { + size_t len = buflen; + DWORD written; + + HANDLE hComPort = (HANDLE)fd->pfd; + + if(hComPort == INVALID_HANDLE_VALUE) { + logprintf(LOG_ERR, "ser_send(): port not open"); + return -1; + } + + if(len <= 0) { + return 0; + } + + serial_w32SetTimeOut(hComPort,500); + + if(!WriteFile(hComPort, buf, buflen, &written, NULL)) { + logprintf(LOG_ERR, "ser_send(): write error"); // TODO + exit(1); + } + + if(written != buflen) { + logprintf(LOG_ERR, "ser_send(): size/send mismatch"); + return -1; + } + + return 0; +} + + +static int ser_recv(union filedescriptor *fd, unsigned char *buf, size_t buflen) { + DWORD read; + + HANDLE hComPort = (HANDLE)fd->pfd; + + if(hComPort == INVALID_HANDLE_VALUE) { + logprintf(LOG_ERR, "ser_read(): port not open"); + return -1; + } + + serial_w32SetTimeOut(hComPort, serial_recv_timeout); + + if(!ReadFile(hComPort, buf, buflen, &read, NULL)) { + LPVOID lpMsgBuf; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL); + logprintf(LOG_ERR, "ser_recv(): read error: %s", (char*)lpMsgBuf); + LocalFree(lpMsgBuf); + return -1; + } + + /* time out detected */ + if(read == 0) { + return -1; + } + + return 0; +} + + +static int ser_drain(union filedescriptor *fd, int display) { + unsigned char buf[10]; + BOOL readres; + DWORD read; + + HANDLE hComPort=(HANDLE)fd->pfd; + + if(hComPort == INVALID_HANDLE_VALUE) { + logprintf(LOG_ERR, "%s: ser_drain(): port not open"); + return -1; + } + + serial_w32SetTimeOut(hComPort,250); + + while(1) { + readres=ReadFile(hComPort, buf, 1, &read, NULL); + if(!readres) { + LPVOID lpMsgBuf; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL); + logprintf(LOG_ERR, "ser_drain(): read error: %s", (char*)lpMsgBuf); + LocalFree(lpMsgBuf); + return -1; + } + + if(read <= 0) { + break; + } + } + return 0; +} + +struct serial_device serial_serdev = { + .open = ser_open, + .setspeed = ser_setspeed, + .close = ser_close, + .send = ser_send, + .recv = ser_recv, + .drain = ser_drain, + .set_dtr_rts = ser_set_dtr_rts, + .flags = SERDEV_FL_CANSETSPEED, +}; + +struct serial_device *serdev = &serial_serdev; + +#endif diff --git a/lib/ESPiLight/pilight/libs/avrdude/serial.h b/lib/ESPiLight/pilight/libs/avrdude/serial.h new file mode 100644 index 0000000..3b07472 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/serial.h @@ -0,0 +1,94 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2003-2004 Theodore A. Roth + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* $Id: serial.h 1294 2014-03-12 23:03:18Z joerg_wunsch $ */ + +/* This is the API for the generic serial interface. The implementations are + actually provided by the target dependant files: + + ser_posix.c : posix serial interface. + ser_win32.c : native win32 serial interface. + + The target file will be selected at configure time. */ + +#ifndef serial_h +#define serial_h + +extern long serial_recv_timeout; +union filedescriptor +{ + int ifd; + void *pfd; + struct + { + void *handle; + int rep; /* bulk read endpoint */ + int wep; /* bulk write endpoint */ + int eep; /* event read endpoint */ + int max_xfer; /* max transfer size */ + int use_interrupt_xfer; /* device uses interrupt transfers */ + } usb; +}; + +union pinfo +{ + long baud; + struct + { + unsigned short vid; + unsigned short pid; + unsigned short flags; +#define PINFO_FL_USEHID 0x0001 +#define PINFO_FL_SILENT 0x0002 /* don't complain if not found */ + } usbinfo; +}; + + +struct serial_device +{ + // open should return -1 on error, other values on success + int (*open)(char * port, union pinfo pinfo, union filedescriptor *fd); + int (*setspeed)(union filedescriptor *fd, long baud); + void (*close)(union filedescriptor *fd); + + int (*send)(union filedescriptor *fd, unsigned char * buf, size_t buflen); + int (*recv)(union filedescriptor *fd, unsigned char * buf, size_t buflen); + int (*drain)(union filedescriptor *fd, int display); + + int (*set_dtr_rts)(union filedescriptor *fd, int is_on); + + int flags; +#define SERDEV_FL_NONE 0x0000 /* no flags */ +#define SERDEV_FL_CANSETSPEED 0x0001 /* device can change speed */ +}; + +extern struct serial_device *serdev; +extern struct serial_device serial_serdev; +extern struct serial_device usb_serdev; +extern struct serial_device usb_serdev_frame; +extern struct serial_device avrdoper_serdev; + +#define serial_open (serdev->open) +#define serial_setspeed (serdev->setspeed) +#define serial_close (serdev->close) +#define serial_send (serdev->send) +#define serial_recv (serdev->recv) +#define serial_drain (serdev->drain) +#define serial_set_dtr_rts (serdev->set_dtr_rts) + +#endif /* serial_h */ diff --git a/lib/ESPiLight/pilight/libs/avrdude/stk500.c b/lib/ESPiLight/pilight/libs/avrdude/stk500.c new file mode 100644 index 0000000..008a332 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/stk500.c @@ -0,0 +1,624 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2002-2004 Brian S. Dean + * Copyright (C) 2008,2014 Joerg Wunsch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +/* $Id: stk500.c 1294 2014-03-12 23:03:18Z joerg_wunsch $ */ + +/* + * avrdude interface for Atmel STK500 programmer + * + * Note: most commands use the "universal command" feature of the + * programmer in a "pass through" mode, exceptions are "program + * enable", "paged read", and "paged write". + * +*/ + +#include +#include +#include +#include +#include + +#include "../pilight/core/log.h" +#include "avrdude.h" +#include "avr.h" +#include "pgm.h" +#include "stk500.h" +#include "stk500_private.h" +#include "serial.h" + +#define STK500_XTAL 7372800U +#define MAX_SYNC_ATTEMPTS 1 + +struct pdata { + unsigned char ext_addr_byte; /* Record ext-addr byte set in the target device (if used) */ +}; + +#define PDATA(pgm) ((struct pdata *)(pgm->cookie)) + +static int stk500_send(PROGRAMMER *pgm, unsigned char *buf, size_t len) { + return serial_send(&pgm->fd, buf, len); +} + +static int stk500_recv(PROGRAMMER *pgm, unsigned char *buf, size_t len) { + if(serial_recv(&pgm->fd, buf, len) < 0) { + logprintf(LOG_ERR, "stk500_recv(): programmer is not responding"); + return -1; + } + return 0; +} + + +int stk500_drain(PROGRAMMER *pgm, int display) { + return serial_drain(&pgm->fd, display); +} + +int stk500_getsync(PROGRAMMER * pgm) { + unsigned char buf[32], resp[32]; + int attempt = 0; + + /* + * get in sync */ + buf[0] = Cmnd_STK_GET_SYNC; + buf[1] = Sync_CRC_EOP; + + /* + * First send and drain a few times to get rid of line noise + */ + stk500_send(pgm, buf, 2); + stk500_drain(pgm, 0); + stk500_send(pgm, buf, 2); + stk500_drain(pgm, 0); + + for(attempt = 0; attempt < MAX_SYNC_ATTEMPTS; attempt++) { + stk500_send(pgm, buf, 2); + stk500_recv(pgm, resp, 1); + if(resp[0] == Resp_STK_INSYNC){ + break; + } + logprintf(LOG_ERR, "stk500_getsync() attempt %d of %d: not in sync: resp=0x%02x", + attempt + 1, MAX_SYNC_ATTEMPTS, resp[0]); + } + if(attempt == MAX_SYNC_ATTEMPTS) { + stk500_drain(pgm, 0); + return -1; + } + + if(stk500_recv(pgm, resp, 1) < 0) { + return -1; + } + if(resp[0] != Resp_STK_OK) { + logprintf(LOG_ERR, "stk500_getsync(): can't communicate with device: resp=0x%02x", resp[0]); + return -1; + } + + return 0; +} + + +/* +* transmit an AVR device command and return the results; 'cmd' and +* 'res' must point to at least a 4 byte data buffer +*/ +static int stk500_cmd(PROGRAMMER *pgm, const unsigned char *cmd, unsigned char *res) { + unsigned char buf[32]; + + buf[0] = Cmnd_STK_UNIVERSAL; + buf[1] = cmd[0]; + buf[2] = cmd[1]; + buf[3] = cmd[2]; + buf[4] = cmd[3]; + buf[5] = Sync_CRC_EOP; + + stk500_send(pgm, buf, 6); + + if(stk500_recv(pgm, buf, 1) < 0) { + return -1; + } + if(buf[0] != Resp_STK_INSYNC) { + logprintf(LOG_ERR, "stk500_cmd(): programmer is out of sync"); + return -1; + } + + res[0] = cmd[1]; + res[1] = cmd[2]; + res[2] = cmd[3]; + if(stk500_recv(pgm, &res[3], 1) < 0) { + return -1; + } + + if(stk500_recv(pgm, buf, 1) < 0) { + return -1; + } + if(buf[0] != Resp_STK_OK) { + logprintf(LOG_ERR, "stk500_cmd(): protocol error"); + return -1; + } + + return 0; +} + + + +/* +* issue the 'chip erase' command to the AVR device +*/ +static int stk500_chip_erase(PROGRAMMER *pgm, AVRPART *p) { + unsigned char cmd[4]; + unsigned char res[4]; + + if(pgm->cmd == NULL) { + logprintf(LOG_ERR, "Error: %s programmer uses stk500_chip_erase() but does not provide a cmd() method.", pgm->type); + return -1; + } + + if(p->op[AVR_OP_CHIP_ERASE] == NULL) { + logprintf(LOG_ERR, "chip erase instruction not defined for part \"%s\"", p->desc); + return -1; + } + + pgm->pgm_led(pgm, ON); + + memset(cmd, 0, sizeof(cmd)); + + avr_set_bits(p->op[AVR_OP_CHIP_ERASE], cmd); + pgm->cmd(pgm, cmd, res); + usleep(p->chip_erase_delay); + pgm->initialize(pgm, p); + + pgm->pgm_led(pgm, OFF); + + return 0; +} + +/* +* issue the 'program enable' command to the AVR device +*/ +static int stk500_program_enable(PROGRAMMER *pgm, AVRPART *p) { + unsigned char buf[16]; + int tries=0; + + retry: + + tries++; + + buf[0] = Cmnd_STK_ENTER_PROGMODE; + buf[1] = Sync_CRC_EOP; + + stk500_send(pgm, buf, 2); + if(stk500_recv(pgm, buf, 1) < 0) { + return -1; + } + if(buf[0] == Resp_STK_NOSYNC) { + if(tries > 33) { + logprintf(LOG_ERR, "stk500_program_enable(): can't get into sync"); + return -1; + } + if(stk500_getsync(pgm) < 0) { + return -1; + } + goto retry; + } else if(buf[0] != Resp_STK_INSYNC) { + logprintf(LOG_ERR, "%s: stk500_program_enable(): protocol error, expect=0x%02x, resp=0x%02x\n", Resp_STK_INSYNC, buf[0]); + return -1; + } + + if(stk500_recv(pgm, buf, 1) < 0) + return -1; + if(buf[0] == Resp_STK_OK) { + return 0; + } else if(buf[0] == Resp_STK_NODEVICE) { + logprintf(LOG_ERR, "stk500_program_enable(): no device"); + return -1; + } + + if(buf[0] == Resp_STK_FAILED) { + logprintf(LOG_ERR, "stk500_program_enable(): failed to enter programming mode"); + return -1; + } + + + logprintf(LOG_ERR, "stk500_program_enable(): unknown response=0x%02x", buf[0]); + + return -1; +} + +/* +* initialize the AVR device and prepare it to accept commands +*/ +static int stk500_initialize(PROGRAMMER *pgm, AVRPART *p) { + unsigned char buf[32]; + AVRMEM *m = NULL; + int tries = 0; + + tries = 0; + +retry: + tries++; + + memset(buf, 0, sizeof(buf)); + + /* + * set device programming parameters + */ + buf[0] = Cmnd_STK_SET_DEVICE; + buf[1] = p->stk500_devcode; + buf[2] = 0; /* device revision */ + + if((p->flags & AVRPART_SERIALOK) && (p->flags & AVRPART_PARALLELOK)) { + buf[3] = 0; /* device supports parallel and serial programming */ + } else { + buf[3] = 1; /* device supports parallel only */ + } + + if(p->flags & AVRPART_PARALLELOK) { + if(p->flags & AVRPART_PSEUDOPARALLEL) { + buf[4] = 0; /* pseudo parallel interface */ + } else { + buf[4] = 1; /* full parallel interface */ + } + } + + buf[5] = 1; /* polling supported - XXX need this in config file */ + buf[6] = 1; /* programming is self-timed - XXX need in config file */ + buf[7] = 0; + buf[8] = 0; + buf[8] += p->lfusemem->size; + buf[8] += p->hfusemem->size; + + m = p->flashmem; + if(m != NULL) { + buf[9] = m->readback[0]; + buf[10] = m->readback[1]; + if(m->paged == 1) { + buf[13] = (m->page_size >> 8) & 0x00ff; + buf[14] = m->page_size & 0x00ff; + } + buf[17] = (m->size >> 24) & 0xff; + buf[18] = (m->size >> 16) & 0xff; + buf[19] = (m->size >> 8) & 0xff; + buf[20] = m->size & 0xff; + } + + buf[11] = 0xff; + buf[12] = 0xff; + buf[15] = 0; + buf[16] = 0; + buf[21] = Sync_CRC_EOP; + + stk500_send(pgm, buf, 22); + if(stk500_recv(pgm, buf, 1) < 0) { + return -1; + } + if(buf[0] == Resp_STK_NOSYNC) { + logprintf(LOG_ERR, "stk500_initialize(): programmer not in sync, resp=0x%02x", buf[0]); + if(tries > 33) { + return -1; + } + if(stk500_getsync(pgm) < 0) { + return -1; + } + goto retry; + } else if(buf[0] != Resp_STK_INSYNC) { + logprintf(LOG_ERR, "stk500_initialize(): (a) protocol error, expect=0x%02x, resp=0x%02x", Resp_STK_INSYNC, buf[0]); + return -1; + } + + if(stk500_recv(pgm, buf, 1) < 0) { + return -1; + } + if(buf[0] != Resp_STK_OK) { + logprintf(LOG_ERR, "stk500_initialize(): (b) protocol error, expect=0x%02x, resp=0x%02x", Resp_STK_OK, buf[0]); + return -1; + } + + return pgm->program_enable(pgm, p); +} + +static int stk500_loadaddr(PROGRAMMER *pgm, AVRMEM *mem, unsigned int addr) { + unsigned char buf[16]; + int tries = 0; + unsigned char ext_byte; + OPCODE * lext; + + tries = 0; + +retry: + tries++; + + /* To support flash > 64K words the correct Extended Address Byte is needed */ + lext = mem->op[AVR_OP_LOAD_EXT_ADDR]; + if(lext != NULL) { + ext_byte = (addr >> 16) & 0xff; + if(ext_byte != PDATA(pgm)->ext_addr_byte) { + /* Either this is the first addr load, or a 64K word boundary is + * crossed, so set the ext addr byte */ + avr_set_bits(lext, buf); + avr_set_addr(lext, buf, addr); + stk500_cmd(pgm, buf, buf); + PDATA(pgm)->ext_addr_byte = ext_byte; + } + } + + buf[0] = Cmnd_STK_LOAD_ADDRESS; + buf[1] = addr & 0xff; + buf[2] = (addr >> 8) & 0xff; + buf[3] = Sync_CRC_EOP; + + stk500_send(pgm, buf, 4); + + if(stk500_recv(pgm, buf, 1) < 0) { + return -1; + } + if(buf[0] == Resp_STK_NOSYNC) { + if(tries > 33) { + logprintf(LOG_ERR, "stk500_loadaddr(): can't get into sync"); + return -1; + } + if(stk500_getsync(pgm) < 0) { + return -1; + } + goto retry; + } else if(buf[0] != Resp_STK_INSYNC) { + logprintf(LOG_ERR, "stk500_loadaddr(): (a) protocol error, expect=0x%02x, resp=0x%02x", Resp_STK_INSYNC, buf[0]); + return -1; + } + + if(stk500_recv(pgm, buf, 1) < 0) { + return -1; + } + if(buf[0] == Resp_STK_OK) { + return 0; + } + + logprintf(LOG_ERR, "loadaddr(): (b) protocol error, expect=0x%02x, resp=0x%02x", Resp_STK_INSYNC, buf[0]); + + return -1; +} + + +static int stk500_paged_write(PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, + unsigned int page_size, + unsigned int addr, unsigned int n_bytes) { + + unsigned char buf[page_size + 16]; + int memtype = 0, a_div = 0, block_size = 0, tries = 0; + unsigned int n = 0, i = 0; + + if(strcmp(m->desc, "flash") == 0) { + memtype = 'F'; + } else if(strcmp(m->desc, "eeprom") == 0) { + memtype = 'E'; + } else { + return -2; + } + + if((m->op[AVR_OP_LOADPAGE_LO]) || (m->op[AVR_OP_READ_LO])) { + a_div = 2; + } else { + a_div = 1; + } + + n = addr + n_bytes; + + for(; addr < n; addr += block_size) { + if(n - addr < page_size) { + block_size = n - addr; + } else { + block_size = page_size; + } + tries = 0; + retry: + tries++; + stk500_loadaddr(pgm, m, addr/a_div); + + /* build command block and avoid multiple send commands as it leads to a crash + of the silabs usb serial driver on mac os x */ + i = 0; + buf[i++] = Cmnd_STK_PROG_PAGE; + buf[i++] = (block_size >> 8) & 0xff; + buf[i++] = block_size & 0xff; + buf[i++] = memtype; + + memcpy(&buf[i], &m->buf[addr], block_size); + + i += block_size; + buf[i++] = Sync_CRC_EOP; + stk500_send(pgm, buf, i); + + if(stk500_recv(pgm, buf, 1) < 0) { + return -1; + } + if(buf[0] == Resp_STK_NOSYNC) { + if(tries > 33) { + logprintf(LOG_ERR, "stk500_paged_write(): can't get into sync", progname); + return -3; + } + if(stk500_getsync(pgm) < 0) { + return -1; + } + goto retry; + } else if(buf[0] != Resp_STK_INSYNC) { + logprintf(LOG_ERR, "stk500_paged_write(): (a) protocol error, expect=0x%02x, resp=0x%02x", Resp_STK_INSYNC, buf[0]); + return -4; + } + + if(stk500_recv(pgm, buf, 1) < 0) { + return -1; + } + if(buf[0] != Resp_STK_OK) { + logprintf(LOG_ERR, "stk500_paged_write(): (a) protocol error, expect=0x%02x, resp=0x%02x", Resp_STK_INSYNC, buf[0]); + return -5; + } + } + + return n_bytes; +} + +static int stk500_paged_load(PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, + unsigned int page_size, + unsigned int addr, unsigned int n_bytes) { + unsigned char buf[16]; + int memtype = 0, a_div = 0, tries = 0, block_size = 0; + unsigned int n = 0; + + if(strcmp(m->desc, "flash") == 0) { + memtype = 'F'; + } else if(strcmp(m->desc, "eeprom") == 0) { + memtype = 'E'; + } else { + return -2; + } + + if((m->op[AVR_OP_LOADPAGE_LO]) || (m->op[AVR_OP_READ_LO])) { + a_div = 2; + } else { + a_div = 1; + } + + n = addr + n_bytes; + for(; addr < n; addr += block_size) { + if(n - addr < page_size) { + block_size = n - addr; + } else { + block_size = page_size; + } + + tries = 0; + retry: + tries++; + stk500_loadaddr(pgm, m, addr/a_div); + buf[0] = Cmnd_STK_READ_PAGE; + buf[1] = (block_size >> 8) & 0xff; + buf[2] = block_size & 0xff; + buf[3] = memtype; + buf[4] = Sync_CRC_EOP; + stk500_send(pgm, buf, 5); + + if(stk500_recv(pgm, buf, 1) < 0) { + return -1; + } + if(buf[0] == Resp_STK_NOSYNC) { + if(tries > 33) { + logprintf(LOG_ERR, "stk500_paged_load(): can't get into sync"); + return -3; + } + if(stk500_getsync(pgm) < 0) { + return -1; + goto retry; + } + } else if(buf[0] != Resp_STK_INSYNC) { + logprintf(LOG_ERR, "stk500_paged_load(): (a) protocol error, expect=0x%02x, resp=0x%02x", Resp_STK_INSYNC, buf[0]); + return -4; + } + + if(stk500_recv(pgm, &m->buf[addr], block_size) < 0) { + return -1; + } + + if(stk500_recv(pgm, buf, 1) < 0) { + return -1; + } + + if(buf[0] != Resp_STK_OK) { + logprintf(LOG_ERR, "stk500_paged_load(): (a) protocol error, expect=0x%02x, resp=0x%02x", Resp_STK_OK, buf[0]); + return -5; + } + } + + return n_bytes; +} + + +static void stk500_display(PROGRAMMER * pgm, const char * p) { +} + +static void stk500_disable(PROGRAMMER * pgm) { + unsigned char buf[16]; + int tries=0; + +retry: + tries++; + buf[0] = Cmnd_STK_LEAVE_PROGMODE; + buf[1] = Sync_CRC_EOP; + stk500_send(pgm, buf, 2); + + if(stk500_recv(pgm, buf, 1) < 0) { + return; + } + if(buf[0] == Resp_STK_NOSYNC) { + if(tries > 33) { + logprintf(LOG_ERR, "stk500_disable(): can't get into sync"); + return; + } + if(stk500_getsync(pgm) < 0) { + return; + } + goto retry; + } else if(buf[0] != Resp_STK_INSYNC) { + logprintf(LOG_ERR, "stk500_disable(): protocol error, expect=0x%02x, resp=0x%02x", Resp_STK_INSYNC, buf[0]); + return; + } + if(stk500_recv(pgm, buf, 1) < 0) { + return; + } + if(buf[0] == Resp_STK_OK) { + return; + } else if(buf[0] == Resp_STK_NODEVICE) { + logprintf(LOG_ERR, "stk500_disable(): no device"); + return; + } + logprintf(LOG_ERR, "stk500_disable(): unknown response=0x%02x", buf[0]); + return; +} + +static void stk500_enable(PROGRAMMER *pgm) { + return; +} + +static void stk500_close(PROGRAMMER *pgm) { + serial_close(&pgm->fd); + pgm->fd.ifd = -1; +} + +const char stk500_desc[] = "Atmel STK500 Version 1.x firmware"; + +void stk500_initpgm(PROGRAMMER * pgm) { + strcpy(pgm->type, "STK500"); + + /* + * mandatory functions + */ + pgm->initialize = stk500_initialize; + pgm->display = stk500_display; + pgm->enable = stk500_enable; + pgm->disable = stk500_disable; + pgm->program_enable = stk500_program_enable; + pgm->chip_erase = stk500_chip_erase; + pgm->cmd = stk500_cmd; + pgm->close = stk500_close; + pgm->read_byte = avr_read_byte_default; + pgm->write_byte = avr_write_byte_default; + + /* + * optional functions + */ + pgm->paged_write = stk500_paged_write; + pgm->paged_load = stk500_paged_load; + pgm->page_size = 256; +} diff --git a/lib/ESPiLight/pilight/libs/avrdude/stk500.h b/lib/ESPiLight/pilight/libs/avrdude/stk500.h new file mode 100644 index 0000000..1cdb6bf --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/stk500.h @@ -0,0 +1,41 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2002-2004 Brian S. Dean + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* $Id: stk500.h 1294 2014-03-12 23:03:18Z joerg_wunsch $ */ + +#ifndef stk500_h +#define stk500_h + +#ifdef __cplusplus +extern "C" { +#endif + +extern const char stk500_desc[]; +void stk500_initpgm (PROGRAMMER * pgm); + +/* used by arduino.c to avoid duplicate code */ +int stk500_getsync(PROGRAMMER * pgm); +int stk500_drain(PROGRAMMER * pgm, int display); + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/lib/ESPiLight/pilight/libs/avrdude/stk500_private.h b/lib/ESPiLight/pilight/libs/avrdude/stk500_private.h new file mode 100644 index 0000000..6e6e12a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/avrdude/stk500_private.h @@ -0,0 +1,103 @@ +//**** ATMEL AVR - A P P L I C A T I O N N O T E ************************ +//* +//* Title: AVR061 - STK500 Communication Protocol +//* Filename: command.h +//* Version: 1.0 +//* Last updated: 09.09.2002 +//* +//* Support E-mail: avr@atmel.com +//* +//************************************************************************** + +// *****************[ STK Message constants ]*************************** + +#define STK_SIGN_ON_MESSAGE "AVR STK" // Sign on string for Cmnd_STK_GET_SIGN_ON + +// *****************[ STK Response constants ]*************************** + +#define Resp_STK_OK 0x10 // ' ' +#define Resp_STK_FAILED 0x11 // ' ' +#define Resp_STK_UNKNOWN 0x12 // ' ' +#define Resp_STK_NODEVICE 0x13 // ' ' +#define Resp_STK_INSYNC 0x14 // ' ' +#define Resp_STK_NOSYNC 0x15 // ' ' + +#define Resp_ADC_CHANNEL_ERROR 0x16 // ' ' +#define Resp_ADC_MEASURE_OK 0x17 // ' ' +#define Resp_PWM_CHANNEL_ERROR 0x18 // ' ' +#define Resp_PWM_ADJUST_OK 0x19 // ' ' + +// *****************[ STK Special constants ]*************************** + +#define Sync_CRC_EOP 0x20 // 'SPACE' + +// *****************[ STK Command constants ]*************************** + +#define Cmnd_STK_GET_SYNC 0x30 // ' ' +#define Cmnd_STK_GET_SIGN_ON 0x31 // ' ' + +#define Cmnd_STK_SET_PARAMETER 0x40 // ' ' +#define Cmnd_STK_GET_PARAMETER 0x41 // ' ' +#define Cmnd_STK_SET_DEVICE 0x42 // ' ' +#define Cmnd_STK_SET_DEVICE_EXT 0x45 // ' ' + +#define Cmnd_STK_ENTER_PROGMODE 0x50 // ' ' +#define Cmnd_STK_LEAVE_PROGMODE 0x51 // ' ' +#define Cmnd_STK_CHIP_ERASE 0x52 // ' ' +#define Cmnd_STK_CHECK_AUTOINC 0x53 // ' ' +#define Cmnd_STK_LOAD_ADDRESS 0x55 // ' ' +#define Cmnd_STK_UNIVERSAL 0x56 // ' ' +#define Cmnd_STK_UNIVERSAL_MULTI 0x57 // ' ' + +#define Cmnd_STK_PROG_FLASH 0x60 // ' ' +#define Cmnd_STK_PROG_DATA 0x61 // ' ' +#define Cmnd_STK_PROG_FUSE 0x62 // ' ' +#define Cmnd_STK_PROG_LOCK 0x63 // ' ' +#define Cmnd_STK_PROG_PAGE 0x64 // ' ' +#define Cmnd_STK_PROG_FUSE_EXT 0x65 // ' ' + +#define Cmnd_STK_READ_FLASH 0x70 // ' ' +#define Cmnd_STK_READ_DATA 0x71 // ' ' +#define Cmnd_STK_READ_FUSE 0x72 // ' ' +#define Cmnd_STK_READ_LOCK 0x73 // ' ' +#define Cmnd_STK_READ_PAGE 0x74 // ' ' +#define Cmnd_STK_READ_SIGN 0x75 // ' ' +#define Cmnd_STK_READ_OSCCAL 0x76 // ' ' +#define Cmnd_STK_READ_FUSE_EXT 0x77 // ' ' +#define Cmnd_STK_READ_OSCCAL_EXT 0x78 // ' ' + +// *****************[ STK Parameter constants ]*************************** + +#define Parm_STK_HW_VER 0x80 // ' ' - R +#define Parm_STK_SW_MAJOR 0x81 // ' ' - R +#define Parm_STK_SW_MINOR 0x82 // ' ' - R +#define Parm_STK_LEDS 0x83 // ' ' - R/W +#define Parm_STK_VTARGET 0x84 // ' ' - R/W +#define Parm_STK_VADJUST 0x85 // ' ' - R/W +#define Parm_STK_OSC_PSCALE 0x86 // ' ' - R/W +#define Parm_STK_OSC_CMATCH 0x87 // ' ' - R/W +#define Parm_STK_RESET_DURATION 0x88 // ' ' - R/W +#define Parm_STK_SCK_DURATION 0x89 // ' ' - R/W + +#define Parm_STK_BUFSIZEL 0x90 // ' ' - R/W, Range {0..255} +#define Parm_STK_BUFSIZEH 0x91 // ' ' - R/W, Range {0..255} +#define Parm_STK_DEVICE 0x92 // ' ' - R/W, Range {0..255} +#define Parm_STK_PROGMODE 0x93 // ' ' - 'P' or 'S' +#define Parm_STK_PARAMODE 0x94 // ' ' - TRUE or FALSE +#define Parm_STK_POLLING 0x95 // ' ' - TRUE or FALSE +#define Parm_STK_SELFTIMED 0x96 // ' ' - TRUE or FALSE +#define Param_STK500_TOPCARD_DETECT 0x98 // ' ' - Detect top-card attached + +// *****************[ STK status bit definitions ]*************************** + +#define Stat_STK_INSYNC 0x01 // INSYNC status bit, '1' - INSYNC +#define Stat_STK_PROGMODE 0x02 // Programming mode, '1' - PROGMODE +#define Stat_STK_STANDALONE 0x04 // Standalone mode, '1' - SM mode +#define Stat_STK_RESET 0x08 // RESET button, '1' - Pushed +#define Stat_STK_PROGRAM 0x10 // Program button, ' 1' - Pushed +#define Stat_STK_LEDG 0x20 // Green LED status, '1' - Lit +#define Stat_STK_LEDR 0x40 // Red LED status, '1' - Lit +#define Stat_STK_LEDBLINK 0x80 // LED blink ON/OFF, '1' - Blink + + +// *****************************[ End Of COMMAND.H ]************************** diff --git a/lib/ESPiLight/pilight/libs/libuv/CMakeLists.txt b/lib/ESPiLight/pilight/libs/libuv/CMakeLists.txt new file mode 100644 index 0000000..7a2d7f8 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/CMakeLists.txt @@ -0,0 +1,68 @@ +project(libuv) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PROJECT_SOURCE_DIR}/include/") + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +if(WIN32) + file(GLOB ${PROJECT_NAME}_sources ${${PROJECT_NAME}_sources} "${PROJECT_SOURCE_DIR}/win/*.c") + file(GLOB ${PROJECT_NAME}_headers ${${PROJECT_NAME}_headers} "${PROJECT_SOURCE_DIR}/win/*.h") +else() + file(GLOB ${PROJECT_NAME}_sources ${${PROJECT_NAME}_sources} "${PROJECT_SOURCE_DIR}/unix/*.c") + file(GLOB ${PROJECT_NAME}_headers ${${PROJECT_NAME}_headers} "${PROJECT_SOURCE_DIR}/unix/*.h") + + # Darwin only + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/darwin-proctitle.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/fsevents.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/darwin.c") + # Sun only + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/sunos.c") + # AIX only + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/aix.c") + # OpenBSD only + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/openbsd.c") + # NetBSD only + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/netbsd.c") + # Android only + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/android-ifaddrs.c") + # Cygwin only + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/cygwin.c") + # OS390 only + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/os390.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/os390-syscalls.c") + # General + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/no-fsevents.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/no-proctitle.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/procfs-exepath.c") + # list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/posix-poll.c") + + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/pthread-barrier.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/linux-inotify.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/linux-core.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/proctitle.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/sunos.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/kqueue.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/freebsd.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/sysinfo-loadavg.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/sysinfo-memory.c") + # elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS") + # list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/pthread-barrier.c") + # list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/linux-inotify.c") + # list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/linux-core.c") + # list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/proctitle.c") + # list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/kqueue.c") + # list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/freebsd.c") + else() + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/posix-poll.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/posix-hrtime.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/kqueue.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/pthread-barrier.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/freebsd.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/bsd-ifaddrs.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/unix/sunos.c") + endif() +endif() + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/libuv/android-ifaddrs.h b/lib/ESPiLight/pilight/libs/libuv/android-ifaddrs.h new file mode 100644 index 0000000..9cd19fe --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/android-ifaddrs.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 1995, 1999 + * Berkeley Software Design, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * BSDI ifaddrs.h,v 2.5 2000/02/23 14:51:59 dab Exp + */ + +#ifndef _IFADDRS_H_ +#define _IFADDRS_H_ + +struct ifaddrs { + struct ifaddrs *ifa_next; + char *ifa_name; + unsigned int ifa_flags; + struct sockaddr *ifa_addr; + struct sockaddr *ifa_netmask; + struct sockaddr *ifa_dstaddr; + void *ifa_data; +}; + +/* + * This may have been defined in . Note that if is + * to be included it must be included before this header file. + */ +#ifndef ifa_broadaddr +#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ +#endif + +#include + +__BEGIN_DECLS +extern int getifaddrs(struct ifaddrs **ifap); +extern void freeifaddrs(struct ifaddrs *ifa); +__END_DECLS + +#endif diff --git a/lib/ESPiLight/pilight/libs/libuv/fs-poll.c b/lib/ESPiLight/pilight/libs/libuv/fs-poll.c new file mode 100644 index 0000000..ee73d5a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/fs-poll.c @@ -0,0 +1,256 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "uv-common.h" + +#include +#include +#include + +struct poll_ctx { + uv_fs_poll_t* parent_handle; /* NULL if parent has been stopped or closed */ + int busy_polling; + unsigned int interval; + uint64_t start_time; + uv_loop_t* loop; + uv_fs_poll_cb poll_cb; + uv_timer_t timer_handle; + uv_fs_t fs_req; /* TODO(bnoordhuis) mark fs_req internal */ + uv_stat_t statbuf; + char path[1]; /* variable length */ +}; + +static int statbuf_eq(const uv_stat_t* a, const uv_stat_t* b); +static void poll_cb(uv_fs_t* req); +static void timer_cb(uv_timer_t* timer); +static void timer_close_cb(uv_handle_t* handle); + +static uv_stat_t zero_statbuf; + + +int uv_fs_poll_init(uv_loop_t* loop, uv_fs_poll_t* handle) { + uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_POLL); + return 0; +} + + +int uv_fs_poll_start(uv_fs_poll_t* handle, + uv_fs_poll_cb cb, + const char* path, + unsigned int interval) { + struct poll_ctx* ctx; + uv_loop_t* loop; + size_t len; + int err; + + if (uv__is_active(handle)) + return 0; + + loop = handle->loop; + len = strlen(path); + ctx = uv__calloc(1, sizeof(*ctx) + len); + + if (ctx == NULL) + return UV_ENOMEM; + + ctx->loop = loop; + ctx->poll_cb = cb; + ctx->interval = interval ? interval : 1; + ctx->start_time = uv_now(loop); + ctx->parent_handle = handle; + memcpy(ctx->path, path, len + 1); + + err = uv_timer_init(loop, &ctx->timer_handle); + if (err < 0) + goto error; + + ctx->timer_handle.flags |= UV__HANDLE_INTERNAL; + uv__handle_unref(&ctx->timer_handle); + + err = uv_fs_stat(loop, &ctx->fs_req, ctx->path, poll_cb); + if (err < 0) + goto error; + + handle->poll_ctx = ctx; + uv__handle_start(handle); + + return 0; + +error: + uv__free(ctx); + return err; +} + + +int uv_fs_poll_stop(uv_fs_poll_t* handle) { + struct poll_ctx* ctx; + + if (!uv__is_active(handle)) + return 0; + + ctx = handle->poll_ctx; + assert(ctx != NULL); + assert(ctx->parent_handle != NULL); + ctx->parent_handle = NULL; + handle->poll_ctx = NULL; + + /* Close the timer if it's active. If it's inactive, there's a stat request + * in progress and poll_cb will take care of the cleanup. + */ + if (uv__is_active(&ctx->timer_handle)) + uv_close((uv_handle_t*)&ctx->timer_handle, timer_close_cb); + + uv__handle_stop(handle); + + return 0; +} + + +int uv_fs_poll_getpath(uv_fs_poll_t* handle, char* buffer, size_t* size) { + struct poll_ctx* ctx; + size_t required_len; + + if (!uv__is_active(handle)) { + *size = 0; + return UV_EINVAL; + } + + ctx = handle->poll_ctx; + assert(ctx != NULL); + + required_len = strlen(ctx->path); + if (required_len >= *size) { + *size = required_len + 1; + return UV_ENOBUFS; + } + + memcpy(buffer, ctx->path, required_len); + *size = required_len; + buffer[required_len] = '\0'; + + return 0; +} + + +void uv__fs_poll_close(uv_fs_poll_t* handle) { + uv_fs_poll_stop(handle); +} + + +static void timer_cb(uv_timer_t* timer) { + struct poll_ctx* ctx; + + ctx = container_of(timer, struct poll_ctx, timer_handle); + assert(ctx->parent_handle != NULL); + assert(ctx->parent_handle->poll_ctx == ctx); + ctx->start_time = uv_now(ctx->loop); + + if (uv_fs_stat(ctx->loop, &ctx->fs_req, ctx->path, poll_cb)) + abort(); +} + + +static void poll_cb(uv_fs_t* req) { + uv_stat_t* statbuf; + struct poll_ctx* ctx; + uint64_t interval; + + ctx = container_of(req, struct poll_ctx, fs_req); + + if (ctx->parent_handle == NULL) { /* handle has been stopped or closed */ + uv_close((uv_handle_t*)&ctx->timer_handle, timer_close_cb); + uv_fs_req_cleanup(req); + return; + } + + if (req->result != 0) { + if (ctx->busy_polling != req->result) { + ctx->poll_cb(ctx->parent_handle, + req->result, + &ctx->statbuf, + &zero_statbuf); + ctx->busy_polling = req->result; + } + goto out; + } + + statbuf = &req->statbuf; + + if (ctx->busy_polling != 0) + if (ctx->busy_polling < 0 || !statbuf_eq(&ctx->statbuf, statbuf)) + ctx->poll_cb(ctx->parent_handle, 0, &ctx->statbuf, statbuf); + + ctx->statbuf = *statbuf; + ctx->busy_polling = 1; + +out: + uv_fs_req_cleanup(req); + + if (ctx->parent_handle == NULL) { /* handle has been stopped by callback */ + uv_close((uv_handle_t*)&ctx->timer_handle, timer_close_cb); + return; + } + + /* Reschedule timer, subtract the delay from doing the stat(). */ + interval = ctx->interval; + interval -= (uv_now(ctx->loop) - ctx->start_time) % interval; + + if (uv_timer_start(&ctx->timer_handle, timer_cb, interval, 0)) + abort(); +} + + +static void timer_close_cb(uv_handle_t* handle) { + uv__free(container_of(handle, struct poll_ctx, timer_handle)); +} + + +static int statbuf_eq(const uv_stat_t* a, const uv_stat_t* b) { + return a->st_ctim.tv_nsec == b->st_ctim.tv_nsec + && a->st_mtim.tv_nsec == b->st_mtim.tv_nsec + && a->st_birthtim.tv_nsec == b->st_birthtim.tv_nsec + && a->st_ctim.tv_sec == b->st_ctim.tv_sec + && a->st_mtim.tv_sec == b->st_mtim.tv_sec + && a->st_birthtim.tv_sec == b->st_birthtim.tv_sec + && a->st_size == b->st_size + && a->st_mode == b->st_mode + && a->st_uid == b->st_uid + && a->st_gid == b->st_gid + && a->st_ino == b->st_ino + && a->st_dev == b->st_dev + && a->st_flags == b->st_flags + && a->st_gen == b->st_gen; +} + + +#if defined(_WIN32) + +#include "win/internal.h" +#include "win/handle-inl.h" + +void uv__fs_poll_endgame(uv_loop_t* loop, uv_fs_poll_t* handle) { + assert(handle->flags & UV__HANDLE_CLOSING); + assert(!(handle->flags & UV_HANDLE_CLOSED)); + uv__handle_close(handle); +} + +#endif /* _WIN32 */ diff --git a/lib/ESPiLight/pilight/libs/libuv/heap-inl.h b/lib/ESPiLight/pilight/libs/libuv/heap-inl.h new file mode 100644 index 0000000..1e2ed60 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/heap-inl.h @@ -0,0 +1,245 @@ +/* Copyright (c) 2013, Ben Noordhuis + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef UV_SRC_HEAP_H_ +#define UV_SRC_HEAP_H_ + +#include /* NULL */ + +#if defined(__GNUC__) +# define HEAP_EXPORT(declaration) __attribute__((unused)) static declaration +#else +# define HEAP_EXPORT(declaration) static declaration +#endif + +struct heap_node { + struct heap_node* left; + struct heap_node* right; + struct heap_node* parent; +}; + +/* A binary min heap. The usual properties hold: the root is the lowest + * element in the set, the height of the tree is at most log2(nodes) and + * it's always a complete binary tree. + * + * The heap function try hard to detect corrupted tree nodes at the cost + * of a minor reduction in performance. Compile with -DNDEBUG to disable. + */ +struct heap { + struct heap_node* min; + unsigned int nelts; +}; + +/* Return non-zero if a < b. */ +typedef int (*heap_compare_fn)(const struct heap_node* a, + const struct heap_node* b); + +/* Public functions. */ +HEAP_EXPORT(void heap_init(struct heap* heap)); +HEAP_EXPORT(struct heap_node* heap_min(const struct heap* heap)); +HEAP_EXPORT(void heap_insert(struct heap* heap, + struct heap_node* newnode, + heap_compare_fn less_than)); +HEAP_EXPORT(void heap_remove(struct heap* heap, + struct heap_node* node, + heap_compare_fn less_than)); +HEAP_EXPORT(void heap_dequeue(struct heap* heap, heap_compare_fn less_than)); + +/* Implementation follows. */ + +HEAP_EXPORT(void heap_init(struct heap* heap)) { + heap->min = NULL; + heap->nelts = 0; +} + +HEAP_EXPORT(struct heap_node* heap_min(const struct heap* heap)) { + return heap->min; +} + +/* Swap parent with child. Child moves closer to the root, parent moves away. */ +static void heap_node_swap(struct heap* heap, + struct heap_node* parent, + struct heap_node* child) { + struct heap_node* sibling; + struct heap_node t; + + t = *parent; + *parent = *child; + *child = t; + + parent->parent = child; + if (child->left == child) { + child->left = parent; + sibling = child->right; + } else { + child->right = parent; + sibling = child->left; + } + if (sibling != NULL) + sibling->parent = child; + + if (parent->left != NULL) + parent->left->parent = parent; + if (parent->right != NULL) + parent->right->parent = parent; + + if (child->parent == NULL) + heap->min = child; + else if (child->parent->left == parent) + child->parent->left = child; + else + child->parent->right = child; +} + +HEAP_EXPORT(void heap_insert(struct heap* heap, + struct heap_node* newnode, + heap_compare_fn less_than)) { + struct heap_node** parent; + struct heap_node** child; + unsigned int path; + unsigned int n; + unsigned int k; + + newnode->left = NULL; + newnode->right = NULL; + newnode->parent = NULL; + + /* Calculate the path from the root to the insertion point. This is a min + * heap so we always insert at the left-most free node of the bottom row. + */ + path = 0; + for (k = 0, n = 1 + heap->nelts; n >= 2; k += 1, n /= 2) + path = (path << 1) | (n & 1); + + /* Now traverse the heap using the path we calculated in the previous step. */ + parent = child = &heap->min; + while (k > 0) { + parent = child; + if (path & 1) + child = &(*child)->right; + else + child = &(*child)->left; + path >>= 1; + k -= 1; + } + + /* Insert the new node. */ + newnode->parent = *parent; + *child = newnode; + heap->nelts += 1; + + /* Walk up the tree and check at each node if the heap property holds. + * It's a min heap so parent < child must be true. + */ + while (newnode->parent != NULL && less_than(newnode, newnode->parent)) + heap_node_swap(heap, newnode->parent, newnode); +} + +HEAP_EXPORT(void heap_remove(struct heap* heap, + struct heap_node* node, + heap_compare_fn less_than)) { + struct heap_node* smallest; + struct heap_node** max; + struct heap_node* child; + unsigned int path; + unsigned int k; + unsigned int n; + + if (heap->nelts == 0) + return; + + /* Calculate the path from the min (the root) to the max, the left-most node + * of the bottom row. + */ + path = 0; + for (k = 0, n = heap->nelts; n >= 2; k += 1, n /= 2) + path = (path << 1) | (n & 1); + + /* Now traverse the heap using the path we calculated in the previous step. */ + max = &heap->min; + while (k > 0) { + if (path & 1) + max = &(*max)->right; + else + max = &(*max)->left; + path >>= 1; + k -= 1; + } + + heap->nelts -= 1; + + /* Unlink the max node. */ + child = *max; + *max = NULL; + + if (child == node) { + /* We're removing either the max or the last node in the tree. */ + if (child == heap->min) { + heap->min = NULL; + } + return; + } + + /* Replace the to be deleted node with the max node. */ + child->left = node->left; + child->right = node->right; + child->parent = node->parent; + + if (child->left != NULL) { + child->left->parent = child; + } + + if (child->right != NULL) { + child->right->parent = child; + } + + if (node->parent == NULL) { + heap->min = child; + } else if (node->parent->left == node) { + node->parent->left = child; + } else { + node->parent->right = child; + } + + /* Walk down the subtree and check at each node if the heap property holds. + * It's a min heap so parent < child must be true. If the parent is bigger, + * swap it with the smallest child. + */ + for (;;) { + smallest = child; + if (child->left != NULL && less_than(child->left, smallest)) + smallest = child->left; + if (child->right != NULL && less_than(child->right, smallest)) + smallest = child->right; + if (smallest == child) + break; + heap_node_swap(heap, child, smallest); + } + + /* Walk up the subtree and check that each parent is less than the node + * this is required, because `max` node is not guaranteed to be the + * actual maximum in tree + */ + while (child->parent != NULL && less_than(child, child->parent)) + heap_node_swap(heap, child->parent, child); +} + +HEAP_EXPORT(void heap_dequeue(struct heap* heap, heap_compare_fn less_than)) { + heap_remove(heap, heap->min, less_than); +} + +#undef HEAP_EXPORT + +#endif /* UV_SRC_HEAP_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/inet.c b/lib/ESPiLight/pilight/libs/libuv/inet.c new file mode 100644 index 0000000..da63a68 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/inet.c @@ -0,0 +1,309 @@ +/* + * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") + * Copyright (c) 1996-1999 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +#if defined(_MSC_VER) && _MSC_VER < 1600 +# include "stdint-msvc2008.h" +#else +# include +#endif + +#include "uv.h" +#include "uv-common.h" + +#define UV__INET_ADDRSTRLEN 16 +#define UV__INET6_ADDRSTRLEN 46 + + +static int inet_ntop4(const unsigned char *src, char *dst, size_t size); +static int inet_ntop6(const unsigned char *src, char *dst, size_t size); +static int inet_pton4(const char *src, unsigned char *dst); +static int inet_pton6(const char *src, unsigned char *dst); + + +int uv_inet_ntop(int af, const void* src, char* dst, size_t size) { + switch (af) { + case AF_INET: + return (inet_ntop4(src, dst, size)); + case AF_INET6: + return (inet_ntop6(src, dst, size)); + default: + return UV_EAFNOSUPPORT; + } + /* NOTREACHED */ +} + + +static int inet_ntop4(const unsigned char *src, char *dst, size_t size) { + static const char fmt[] = "%u.%u.%u.%u"; + char tmp[UV__INET_ADDRSTRLEN]; + int l; + + l = snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]); + if (l <= 0 || (size_t) l >= size) { + return UV_ENOSPC; + } + strncpy(dst, tmp, size); + dst[size - 1] = '\0'; + return 0; +} + + +static int inet_ntop6(const unsigned char *src, char *dst, size_t size) { + /* + * Note that int32_t and int16_t need only be "at least" large enough + * to contain a value of the specified size. On some systems, like + * Crays, there is no such thing as an integer variable with 16 bits. + * Keep this in mind if you think this function should have been coded + * to use pointer overlays. All the world's not a VAX. + */ + char tmp[UV__INET6_ADDRSTRLEN], *tp; + struct { int base, len; } best, cur; + unsigned int words[sizeof(struct in6_addr) / sizeof(uint16_t)]; + int i; + + /* + * Preprocess: + * Copy the input (bytewise) array into a wordwise array. + * Find the longest run of 0x00's in src[] for :: shorthanding. + */ + memset(words, '\0', sizeof words); + for (i = 0; i < (int) sizeof(struct in6_addr); i++) + words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); + best.base = -1; + best.len = 0; + cur.base = -1; + cur.len = 0; + for (i = 0; i < (int) ARRAY_SIZE(words); i++) { + if (words[i] == 0) { + if (cur.base == -1) + cur.base = i, cur.len = 1; + else + cur.len++; + } else { + if (cur.base != -1) { + if (best.base == -1 || cur.len > best.len) + best = cur; + cur.base = -1; + } + } + } + if (cur.base != -1) { + if (best.base == -1 || cur.len > best.len) + best = cur; + } + if (best.base != -1 && best.len < 2) + best.base = -1; + + /* + * Format the result. + */ + tp = tmp; + for (i = 0; i < (int) ARRAY_SIZE(words); i++) { + /* Are we inside the best run of 0x00's? */ + if (best.base != -1 && i >= best.base && + i < (best.base + best.len)) { + if (i == best.base) + *tp++ = ':'; + continue; + } + /* Are we following an initial run of 0x00s or any real hex? */ + if (i != 0) + *tp++ = ':'; + /* Is this address an encapsulated IPv4? */ + if (i == 6 && best.base == 0 && (best.len == 6 || + (best.len == 7 && words[7] != 0x0001) || + (best.len == 5 && words[5] == 0xffff))) { + int err = inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp)); + if (err) + return err; + tp += strlen(tp); + break; + } + tp += sprintf(tp, "%x", words[i]); + } + /* Was it a trailing run of 0x00's? */ + if (best.base != -1 && (best.base + best.len) == ARRAY_SIZE(words)) + *tp++ = ':'; + *tp++ = '\0'; + + /* + * Check for overflow, copy, and we're done. + */ + if ((size_t)(tp - tmp) > size) { + return UV_ENOSPC; + } + strcpy(dst, tmp); + return 0; +} + + +int uv_inet_pton(int af, const char* src, void* dst) { + if (src == NULL || dst == NULL) + return UV_EINVAL; + + switch (af) { + case AF_INET: + return (inet_pton4(src, dst)); + case AF_INET6: { + int len; + char tmp[UV__INET6_ADDRSTRLEN], *s, *p; + s = (char*) src; + p = strchr(src, '%'); + if (p != NULL) { + s = tmp; + len = p - src; + if (len > UV__INET6_ADDRSTRLEN-1) + return UV_EINVAL; + memcpy(s, src, len); + s[len] = '\0'; + } + return inet_pton6(s, dst); + } + default: + return UV_EAFNOSUPPORT; + } + /* NOTREACHED */ +} + + +static int inet_pton4(const char *src, unsigned char *dst) { + static const char digits[] = "0123456789"; + int saw_digit, octets, ch; + unsigned char tmp[sizeof(struct in_addr)], *tp; + + saw_digit = 0; + octets = 0; + *(tp = tmp) = 0; + while ((ch = *src++) != '\0') { + const char *pch; + + if ((pch = strchr(digits, ch)) != NULL) { + unsigned int nw = *tp * 10 + (pch - digits); + + if (saw_digit && *tp == 0) + return UV_EINVAL; + if (nw > 255) + return UV_EINVAL; + *tp = nw; + if (!saw_digit) { + if (++octets > 4) + return UV_EINVAL; + saw_digit = 1; + } + } else if (ch == '.' && saw_digit) { + if (octets == 4) + return UV_EINVAL; + *++tp = 0; + saw_digit = 0; + } else + return UV_EINVAL; + } + if (octets < 4) + return UV_EINVAL; + memcpy(dst, tmp, sizeof(struct in_addr)); + return 0; +} + + +static int inet_pton6(const char *src, unsigned char *dst) { + static const char xdigits_l[] = "0123456789abcdef", + xdigits_u[] = "0123456789ABCDEF"; + unsigned char tmp[sizeof(struct in6_addr)], *tp, *endp, *colonp; + const char *xdigits, *curtok; + int ch, seen_xdigits; + unsigned int val; + + memset((tp = tmp), '\0', sizeof tmp); + endp = tp + sizeof tmp; + colonp = NULL; + /* Leading :: requires some special handling. */ + if (*src == ':') + if (*++src != ':') + return UV_EINVAL; + curtok = src; + seen_xdigits = 0; + val = 0; + while ((ch = *src++) != '\0') { + const char *pch; + + if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) + pch = strchr((xdigits = xdigits_u), ch); + if (pch != NULL) { + val <<= 4; + val |= (pch - xdigits); + if (++seen_xdigits > 4) + return UV_EINVAL; + continue; + } + if (ch == ':') { + curtok = src; + if (!seen_xdigits) { + if (colonp) + return UV_EINVAL; + colonp = tp; + continue; + } else if (*src == '\0') { + return UV_EINVAL; + } + if (tp + sizeof(uint16_t) > endp) + return UV_EINVAL; + *tp++ = (unsigned char) (val >> 8) & 0xff; + *tp++ = (unsigned char) val & 0xff; + seen_xdigits = 0; + val = 0; + continue; + } + if (ch == '.' && ((tp + sizeof(struct in_addr)) <= endp)) { + int err = inet_pton4(curtok, tp); + if (err == 0) { + tp += sizeof(struct in_addr); + seen_xdigits = 0; + break; /*%< '\\0' was seen by inet_pton4(). */ + } + } + return UV_EINVAL; + } + if (seen_xdigits) { + if (tp + sizeof(uint16_t) > endp) + return UV_EINVAL; + *tp++ = (unsigned char) (val >> 8) & 0xff; + *tp++ = (unsigned char) val & 0xff; + } + if (colonp != NULL) { + /* + * Since some memmove()'s erroneously fail to handle + * overlapping regions, we'll do the shift by hand. + */ + const int n = tp - colonp; + int i; + + if (tp == endp) + return UV_EINVAL; + for (i = 1; i <= n; i++) { + endp[- i] = colonp[n - i]; + colonp[n - i] = 0; + } + tp = endp; + } + if (tp != endp) + return UV_EINVAL; + memcpy(dst, tmp, sizeof tmp); + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/pthread-barrier.h b/lib/ESPiLight/pilight/libs/libuv/pthread-barrier.h new file mode 100644 index 0000000..900ebed --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/pthread-barrier.h @@ -0,0 +1,68 @@ +/* +Copyright (c) 2016, Kari Tristan Helgason + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef _UV_PTHREAD_BARRIER_ +#define _UV_PTHREAD_BARRIER_ +#include +#include +#if !defined(__MVS__) +#include /* sem_t */ +#endif + +#define PTHREAD_BARRIER_SERIAL_THREAD 0x12345 + +/* + * To maintain ABI compatibility with + * libuv v1.x struct is padded according + * to target platform + */ +#if defined(__ANDROID__) +# define UV_BARRIER_STRUCT_PADDING \ + sizeof(pthread_mutex_t) + \ + sizeof(pthread_cond_t) + \ + sizeof(unsigned int) - \ + sizeof(void *) +#elif defined(__APPLE__) +# define UV_BARRIER_STRUCT_PADDING \ + sizeof(pthread_mutex_t) + \ + 2 * sizeof(sem_t) + \ + 2 * sizeof(unsigned int) - \ + sizeof(void *) +#else +# define UV_BARRIER_STRUCT_PADDING 0 +#endif + +typedef struct { + pthread_mutex_t mutex; + pthread_cond_t cond; + unsigned threshold; + unsigned in; + unsigned out; +} _uv_barrier; + +typedef struct { + _uv_barrier* b; + char _pad[UV_BARRIER_STRUCT_PADDING]; +} pthread_barrier_t; + +int pthread_barrier_init(pthread_barrier_t* barrier, + const void* barrier_attr, + unsigned count); + +int pthread_barrier_wait(pthread_barrier_t* barrier); +int pthread_barrier_destroy(pthread_barrier_t *barrier); + +#endif /* _UV_PTHREAD_BARRIER_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/queue.h b/lib/ESPiLight/pilight/libs/libuv/queue.h new file mode 100644 index 0000000..ff3540a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/queue.h @@ -0,0 +1,108 @@ +/* Copyright (c) 2013, Ben Noordhuis + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef QUEUE_H_ +#define QUEUE_H_ + +#include + +typedef void *QUEUE[2]; + +/* Private macros. */ +#define QUEUE_NEXT(q) (*(QUEUE **) &((*(q))[0])) +#define QUEUE_PREV(q) (*(QUEUE **) &((*(q))[1])) +#define QUEUE_PREV_NEXT(q) (QUEUE_NEXT(QUEUE_PREV(q))) +#define QUEUE_NEXT_PREV(q) (QUEUE_PREV(QUEUE_NEXT(q))) + +/* Public macros. */ +#define QUEUE_DATA(ptr, type, field) \ + ((type *) ((char *) (ptr) - offsetof(type, field))) + +/* Important note: mutating the list while QUEUE_FOREACH is + * iterating over its elements results in undefined behavior. + */ +#define QUEUE_FOREACH(q, h) \ + for ((q) = QUEUE_NEXT(h); (q) != (h); (q) = QUEUE_NEXT(q)) + +#define QUEUE_EMPTY(q) \ + ((const QUEUE *) (q) == (const QUEUE *) QUEUE_NEXT(q)) + +#define QUEUE_HEAD(q) \ + (QUEUE_NEXT(q)) + +#define QUEUE_INIT(q) \ + do { \ + QUEUE_NEXT(q) = (q); \ + QUEUE_PREV(q) = (q); \ + } \ + while (0) + +#define QUEUE_ADD(h, n) \ + do { \ + QUEUE_PREV_NEXT(h) = QUEUE_NEXT(n); \ + QUEUE_NEXT_PREV(n) = QUEUE_PREV(h); \ + QUEUE_PREV(h) = QUEUE_PREV(n); \ + QUEUE_PREV_NEXT(h) = (h); \ + } \ + while (0) + +#define QUEUE_SPLIT(h, q, n) \ + do { \ + QUEUE_PREV(n) = QUEUE_PREV(h); \ + QUEUE_PREV_NEXT(n) = (n); \ + QUEUE_NEXT(n) = (q); \ + QUEUE_PREV(h) = QUEUE_PREV(q); \ + QUEUE_PREV_NEXT(h) = (h); \ + QUEUE_PREV(q) = (n); \ + } \ + while (0) + +#define QUEUE_MOVE(h, n) \ + do { \ + if (QUEUE_EMPTY(h)) \ + QUEUE_INIT(n); \ + else { \ + QUEUE* q = QUEUE_HEAD(h); \ + QUEUE_SPLIT(h, q, n); \ + } \ + } \ + while (0) + +#define QUEUE_INSERT_HEAD(h, q) \ + do { \ + QUEUE_NEXT(q) = QUEUE_NEXT(h); \ + QUEUE_PREV(q) = (h); \ + QUEUE_NEXT_PREV(q) = (q); \ + QUEUE_NEXT(h) = (q); \ + } \ + while (0) + +#define QUEUE_INSERT_TAIL(h, q) \ + do { \ + QUEUE_NEXT(q) = (h); \ + QUEUE_PREV(q) = QUEUE_PREV(h); \ + QUEUE_PREV_NEXT(q) = (q); \ + QUEUE_PREV(h) = (q); \ + } \ + while (0) + +#define QUEUE_REMOVE(q) \ + do { \ + QUEUE_PREV_NEXT(q) = QUEUE_NEXT(q); \ + QUEUE_NEXT_PREV(q) = QUEUE_PREV(q); \ + } \ + while (0) + +#endif /* QUEUE_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/stdint-msvc2008.h b/lib/ESPiLight/pilight/libs/libuv/stdint-msvc2008.h new file mode 100644 index 0000000..d02608a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/stdint-msvc2008.h @@ -0,0 +1,247 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2008 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. The name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we should wrap include with 'extern "C++" {}' +// or compiler give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#ifdef __cplusplus +extern "C" { +#endif +# include +#ifdef __cplusplus +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) + typedef signed char int8_t; + typedef signed short int16_t; + typedef signed int int32_t; + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; +#else + typedef signed __int8 int8_t; + typedef signed __int16 int16_t; + typedef signed __int32 int32_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef signed __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 signed int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +#define INTMAX_C INT64_C +#define UINTMAX_C UINT64_C + +#endif // __STDC_CONSTANT_MACROS ] + + +#endif // _MSC_STDINT_H_ ] diff --git a/lib/ESPiLight/pilight/libs/libuv/threadpool.c b/lib/ESPiLight/pilight/libs/libuv/threadpool.c new file mode 100644 index 0000000..7d80b89 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/threadpool.c @@ -0,0 +1,366 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv-common.h" + +#include "../libs/pilight/core/pilight.h" +#include "../libs/pilight/core/proc.h" + +#if !defined(_WIN32) +# include "unix/internal.h" +#endif + +#include + +#define MAX_THREADPOOL_SIZE 128 + +static uv_once_t once = UV_ONCE_INIT; +static uv_cond_t cond; +static uv_mutex_t mutex; +static unsigned int idle_threads; +static unsigned int nthreads; +static uv_thread_t* threads; +static uv_thread_t default_threads[4]; +static QUEUE exit_message; +static QUEUE wq; +static volatile int initialized; + +typedef struct data_t { + int nr; + + struct { + struct timespec first; + struct timespec second; + } timestamp; + + struct cpu_usage_t cpu_usage; +} data_t; + +static void uv__cancelled(struct uv__work* w) { + abort(); +} + + +/* To avoid deadlock with uv_cancel() it's crucial that the worker + * never holds the global mutex and the loop-local mutex at the same time. + */ +static void worker(void* arg) { + struct uv__work* w; + QUEUE* q; + +#ifndef _WIN32 + struct data_t *data = arg; +#endif + + for (;;) { + uv_mutex_lock(&mutex); + + while (QUEUE_EMPTY(&wq)) { + idle_threads += 1; + uv_cond_wait(&cond, &mutex); + idle_threads -= 1; + } + + q = QUEUE_HEAD(&wq); + + if (q == &exit_message) + uv_cond_signal(&cond); + else { + QUEUE_REMOVE(q); + QUEUE_INIT(q); /* Signal uv_cancel() that the work req is + executing. */ + } + + uv_mutex_unlock(&mutex); + + if (q == &exit_message) + break; + + w = QUEUE_DATA(q, struct uv__work, wq); +#ifndef _WIN32 + if(pilight.debuglevel >= 2) { + getThreadCPUUsage(pthread_self(), &data->cpu_usage); + clock_gettime(CLOCK_MONOTONIC, &data->timestamp.first); + } +#endif + w->work(w); + +#ifndef _WIN32 + if(pilight.debuglevel >= 2) { + clock_gettime(CLOCK_MONOTONIC, &data->timestamp.second); + getThreadCPUUsage(pthread_self(), &data->cpu_usage); + fprintf(stderr, "worker %d, executed %s in %.6f sec using %f%% CPU\n", + data->nr, + w->name, + ((double)data->timestamp.second.tv_sec + 1.0e-9*data->timestamp.second.tv_nsec) - + ((double)data->timestamp.first.tv_sec + 1.0e-9*data->timestamp.first.tv_nsec), + data->cpu_usage.cpu_per + ); + } +#endif + + // free(w->name); + uv_mutex_lock(&w->loop->wq_mutex); + w->work = NULL; /* Signal uv_cancel() that the work req is done + executing. */ + QUEUE_INSERT_TAIL(&w->loop->wq, &w->wq); + uv_async_send(&w->loop->wq_async); + uv_mutex_unlock(&w->loop->wq_mutex); + } +#ifndef _WIN32 + free(data); +#endif +} + + +static void post(QUEUE* q) { + uv_mutex_lock(&mutex); + QUEUE_INSERT_TAIL(&wq, q); + if (idle_threads > 0) + uv_cond_signal(&cond); + uv_mutex_unlock(&mutex); +} + + +#ifndef _WIN32 +UV_DESTRUCTOR(static void cleanup(void)) { + unsigned int i; + + if (initialized == 0) + return; + + post(&exit_message); + + for (i = 0; i < nthreads; i++) + if (uv_thread_join(threads + i)) + abort(); + + if (threads != default_threads) + uv__free(threads); + + uv_mutex_destroy(&mutex); + uv_cond_destroy(&cond); + + threads = NULL; + nthreads = 0; + initialized = 0; +} +#endif + + +static void init_threads(void) { + unsigned int i; + const char* val; + + nthreads = ARRAY_SIZE(default_threads); + val = getenv("UV_THREADPOOL_SIZE"); + if (val != NULL) + nthreads = atoi(val); + if (nthreads == 0) + nthreads = 1; + if (nthreads > MAX_THREADPOOL_SIZE) + nthreads = MAX_THREADPOOL_SIZE; + + threads = default_threads; + if (nthreads > ARRAY_SIZE(default_threads)) { + threads = uv__malloc(nthreads * sizeof(threads[0])); + if (threads == NULL) { + nthreads = ARRAY_SIZE(default_threads); + threads = default_threads; + } + } + + if (uv_cond_init(&cond)) + abort(); + + if (uv_mutex_init(&mutex)) + abort(); + + QUEUE_INIT(&wq); + + for (i = 0; i < nthreads; i++) { +#ifndef _WIN32 + struct data_t *data = malloc(sizeof(struct data_t)); + memset(data, '\0', sizeof(struct data_t)); + data->nr = i; + if (uv_thread_create(threads + i, worker, data)) + abort(); +#else + if (uv_thread_create(threads + i, worker, NULL)) + abort(); +#endif + } + + initialized = 1; +} + + +#ifndef _WIN32 +static void reset_once(void) { + uv_once_t child_once = UV_ONCE_INIT; + memcpy(&once, &child_once, sizeof(child_once)); +} +#endif + + +static void init_once(void) { +#ifndef _WIN32 + /* Re-initialize the threadpool after fork. + * Note that this discards the global mutex and condition as well + * as the work queue. + */ + if (pthread_atfork(NULL, NULL, &reset_once)) + abort(); +#endif + init_threads(); +} + + +void uv__work_submit(uv_loop_t* loop, + struct uv__work* w, + void (*work)(struct uv__work* w), + void (*done)(struct uv__work* w, int status)) { + uv_once(&once, init_once); + w->loop = loop; + w->work = work; + w->done = done; + post(&w->wq); +} + + +static int uv__work_cancel(uv_loop_t* loop, uv_req_t* req, struct uv__work* w) { + int cancelled; + + uv_mutex_lock(&mutex); + uv_mutex_lock(&w->loop->wq_mutex); + + cancelled = !QUEUE_EMPTY(&w->wq) && w->work != NULL; + if (cancelled) + QUEUE_REMOVE(&w->wq); + + uv_mutex_unlock(&w->loop->wq_mutex); + uv_mutex_unlock(&mutex); + + if (!cancelled) + return UV_EBUSY; + + w->work = uv__cancelled; + uv_mutex_lock(&loop->wq_mutex); + QUEUE_INSERT_TAIL(&loop->wq, &w->wq); + uv_async_send(&loop->wq_async); + uv_mutex_unlock(&loop->wq_mutex); + + return 0; +} + + +void uv__work_done(uv_async_t* handle) { + struct uv__work* w; + uv_loop_t* loop; + QUEUE* q; + QUEUE wq; + int err; + + loop = container_of(handle, uv_loop_t, wq_async); + uv_mutex_lock(&loop->wq_mutex); + QUEUE_MOVE(&loop->wq, &wq); + uv_mutex_unlock(&loop->wq_mutex); + + while (!QUEUE_EMPTY(&wq)) { + q = QUEUE_HEAD(&wq); + QUEUE_REMOVE(q); + + w = container_of(q, struct uv__work, wq); + err = (w->work == uv__cancelled) ? UV_ECANCELED : 0; + w->done(w, err); + } +} + + +static void uv__queue_work(struct uv__work* w) { + uv_work_t* req = container_of(w, uv_work_t, work_req); + + req->work_cb(req); +} + + +static void uv__queue_done(struct uv__work* w, int err) { + uv_work_t* req; + + req = container_of(w, uv_work_t, work_req); + if(QUEUE_EMPTY(&(req->loop)->active_reqs) != 0) { + printf("-- %s --\n", w->name); + } + free(w->name); + uv__req_unregister(req->loop, req); + + if (req->after_work_cb == NULL) + return; + + req->after_work_cb(req, err); +} + + +int uv_queue_work(uv_loop_t* loop, + uv_work_t* req, + char *name, + uv_work_cb work_cb, + uv_after_work_cb after_work_cb) { + if (work_cb == NULL) + return UV_EINVAL; + + uv__req_init(loop, req, UV_WORK); + req->loop = loop; + req->work_cb = work_cb; + req->after_work_cb = after_work_cb; + req->work_req.name = strdup(name); + uv__work_submit(loop, &req->work_req, uv__queue_work, uv__queue_done); + return 0; +} + + +int uv_cancel(uv_req_t* req) { + struct uv__work* wreq; + uv_loop_t* loop; + + switch (req->type) { + case UV_FS: + loop = ((uv_fs_t*) req)->loop; + wreq = &((uv_fs_t*) req)->work_req; + break; + case UV_GETADDRINFO: + loop = ((uv_getaddrinfo_t*) req)->loop; + wreq = &((uv_getaddrinfo_t*) req)->work_req; + break; + case UV_GETNAMEINFO: + loop = ((uv_getnameinfo_t*) req)->loop; + wreq = &((uv_getnameinfo_t*) req)->work_req; + break; + case UV_WORK: + loop = ((uv_work_t*) req)->loop; + wreq = &((uv_work_t*) req)->work_req; + break; + default: + return UV_EINVAL; + } + + return uv__work_cancel(loop, req, wreq); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/threadpool.c.ori b/lib/ESPiLight/pilight/libs/libuv/threadpool.c.ori new file mode 100644 index 0000000..1089341 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/threadpool.c.ori @@ -0,0 +1,312 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv-common.h" + +#if !defined(_WIN32) +# include "unix/internal.h" +#endif + +#include + +#define MAX_THREADPOOL_SIZE 128 + +static uv_once_t once = UV_ONCE_INIT; +static uv_cond_t cond; +static uv_mutex_t mutex; +static unsigned int idle_threads; +static unsigned int nthreads; +static uv_thread_t* threads; +static uv_thread_t default_threads[4]; +static QUEUE exit_message; +static QUEUE wq; +static volatile int initialized; + + +static void uv__cancelled(struct uv__work* w) { + abort(); +} + + +/* To avoid deadlock with uv_cancel() it's crucial that the worker + * never holds the global mutex and the loop-local mutex at the same time. + */ +static void worker(void* arg) { + struct uv__work* w; + QUEUE* q; + + (void) arg; + + for (;;) { + uv_mutex_lock(&mutex); + + while (QUEUE_EMPTY(&wq)) { + idle_threads += 1; + uv_cond_wait(&cond, &mutex); + idle_threads -= 1; + } + + q = QUEUE_HEAD(&wq); + + if (q == &exit_message) + uv_cond_signal(&cond); + else { + QUEUE_REMOVE(q); + QUEUE_INIT(q); /* Signal uv_cancel() that the work req is + executing. */ + } + + uv_mutex_unlock(&mutex); + + if (q == &exit_message) + break; + + w = QUEUE_DATA(q, struct uv__work, wq); + w->work(w); + + uv_mutex_lock(&w->loop->wq_mutex); + w->work = NULL; /* Signal uv_cancel() that the work req is done + executing. */ + QUEUE_INSERT_TAIL(&w->loop->wq, &w->wq); + uv_async_send(&w->loop->wq_async); + uv_mutex_unlock(&w->loop->wq_mutex); + } +} + + +static void post(QUEUE* q) { + uv_mutex_lock(&mutex); + QUEUE_INSERT_TAIL(&wq, q); + if (idle_threads > 0) + uv_cond_signal(&cond); + uv_mutex_unlock(&mutex); +} + + +#ifndef _WIN32 +UV_DESTRUCTOR(static void cleanup(void)) { + unsigned int i; + + if (initialized == 0) + return; + + post(&exit_message); + + for (i = 0; i < nthreads; i++) + if (uv_thread_join(threads + i)) + abort(); + + if (threads != default_threads) + uv__free(threads); + + uv_mutex_destroy(&mutex); + uv_cond_destroy(&cond); + + threads = NULL; + nthreads = 0; + initialized = 0; +} +#endif + + +static void init_threads(void) { + unsigned int i; + const char* val; + + nthreads = ARRAY_SIZE(default_threads); + val = getenv("UV_THREADPOOL_SIZE"); + if (val != NULL) + nthreads = atoi(val); + if (nthreads == 0) + nthreads = 1; + if (nthreads > MAX_THREADPOOL_SIZE) + nthreads = MAX_THREADPOOL_SIZE; + + threads = default_threads; + if (nthreads > ARRAY_SIZE(default_threads)) { + threads = uv__malloc(nthreads * sizeof(threads[0])); + if (threads == NULL) { + nthreads = ARRAY_SIZE(default_threads); + threads = default_threads; + } + } + + if (uv_cond_init(&cond)) + abort(); + + if (uv_mutex_init(&mutex)) + abort(); + + QUEUE_INIT(&wq); + + for (i = 0; i < nthreads; i++) + if (uv_thread_create(threads + i, worker, NULL)) + abort(); + + initialized = 1; +} + + +#ifndef _WIN32 +static void reset_once(void) { + uv_once_t child_once = UV_ONCE_INIT; + memcpy(&once, &child_once, sizeof(child_once)); +} +#endif + + +static void init_once(void) { +#ifndef _WIN32 + /* Re-initialize the threadpool after fork. + * Note that this discards the global mutex and condition as well + * as the work queue. + */ + if (pthread_atfork(NULL, NULL, &reset_once)) + abort(); +#endif + init_threads(); +} + + +void uv__work_submit(uv_loop_t* loop, + struct uv__work* w, + void (*work)(struct uv__work* w), + void (*done)(struct uv__work* w, int status)) { + uv_once(&once, init_once); + w->loop = loop; + w->work = work; + w->done = done; + post(&w->wq); +} + + +static int uv__work_cancel(uv_loop_t* loop, uv_req_t* req, struct uv__work* w) { + int cancelled; + + uv_mutex_lock(&mutex); + uv_mutex_lock(&w->loop->wq_mutex); + + cancelled = !QUEUE_EMPTY(&w->wq) && w->work != NULL; + if (cancelled) + QUEUE_REMOVE(&w->wq); + + uv_mutex_unlock(&w->loop->wq_mutex); + uv_mutex_unlock(&mutex); + + if (!cancelled) + return UV_EBUSY; + + w->work = uv__cancelled; + uv_mutex_lock(&loop->wq_mutex); + QUEUE_INSERT_TAIL(&loop->wq, &w->wq); + uv_async_send(&loop->wq_async); + uv_mutex_unlock(&loop->wq_mutex); + + return 0; +} + + +void uv__work_done(uv_async_t* handle) { + struct uv__work* w; + uv_loop_t* loop; + QUEUE* q; + QUEUE wq; + int err; + + loop = container_of(handle, uv_loop_t, wq_async); + uv_mutex_lock(&loop->wq_mutex); + QUEUE_MOVE(&loop->wq, &wq); + uv_mutex_unlock(&loop->wq_mutex); + + while (!QUEUE_EMPTY(&wq)) { + q = QUEUE_HEAD(&wq); + QUEUE_REMOVE(q); + + w = container_of(q, struct uv__work, wq); + err = (w->work == uv__cancelled) ? UV_ECANCELED : 0; + w->done(w, err); + } +} + + +static void uv__queue_work(struct uv__work* w) { + uv_work_t* req = container_of(w, uv_work_t, work_req); + + req->work_cb(req); +} + + +static void uv__queue_done(struct uv__work* w, int err) { + uv_work_t* req; + + req = container_of(w, uv_work_t, work_req); + uv__req_unregister(req->loop, req); + + if (req->after_work_cb == NULL) + return; + + req->after_work_cb(req, err); +} + + +int uv_queue_work(uv_loop_t* loop, + uv_work_t* req, + uv_work_cb work_cb, + uv_after_work_cb after_work_cb) { + if (work_cb == NULL) + return UV_EINVAL; + + uv__req_init(loop, req, UV_WORK); + req->loop = loop; + req->work_cb = work_cb; + req->after_work_cb = after_work_cb; + uv__work_submit(loop, &req->work_req, uv__queue_work, uv__queue_done); + return 0; +} + + +int uv_cancel(uv_req_t* req) { + struct uv__work* wreq; + uv_loop_t* loop; + + switch (req->type) { + case UV_FS: + loop = ((uv_fs_t*) req)->loop; + wreq = &((uv_fs_t*) req)->work_req; + break; + case UV_GETADDRINFO: + loop = ((uv_getaddrinfo_t*) req)->loop; + wreq = &((uv_getaddrinfo_t*) req)->work_req; + break; + case UV_GETNAMEINFO: + loop = ((uv_getnameinfo_t*) req)->loop; + wreq = &((uv_getnameinfo_t*) req)->work_req; + break; + case UV_WORK: + loop = ((uv_work_t*) req)->loop; + wreq = &((uv_work_t*) req)->work_req; + break; + default: + return UV_EINVAL; + } + + return uv__work_cancel(loop, req, wreq); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/threadpool.patch b/lib/ESPiLight/pilight/libs/libuv/threadpool.patch new file mode 100644 index 0000000..03b08a8 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/threadpool.patch @@ -0,0 +1,136 @@ +--- uv.h 2017-06-27 11:20:03.336712000 +0200 ++++ uv.h 2017-06-27 11:32:42.786153181 +0200 +@@ -974,6 +974,7 @@ + + UV_EXTERN int uv_queue_work(uv_loop_t* loop, + uv_work_t* req, ++ char *name, + uv_work_cb work_cb, + uv_after_work_cb after_work_cb); + +--- uv-threadpool.h 2017-06-27 11:15:32.716593000 +0200 ++++ uv-threadpool.h 2017-06-27 11:34:19.966961233 +0200 +@@ -28,6 +28,7 @@ + #define UV_THREADPOOL_H_ + + struct uv__work { ++ char *name; + void (*work)(struct uv__work *w); + void (*done)(struct uv__work *w, int status); + struct uv_loop_s* loop; +--- threadpool.c 2017-06-27 11:15:32.719162000 +0200 ++++ threadpool.c 2017-06-27 11:33:06.220654218 +0200 +@@ -21,6 +21,9 @@ + + #include "uv-common.h" + ++#include "../libs/pilight/core/pilight.h" ++#include "../libs/pilight/core/proc.h" ++ + #if !defined(_WIN32) + # include "unix/internal.h" + #endif +@@ -40,6 +43,16 @@ + static QUEUE wq; + static volatile int initialized; + ++typedef struct data_t { ++ int nr; ++ ++ struct { ++ struct timespec first; ++ struct timespec second; ++ } timestamp; ++ ++ struct cpu_usage_t cpu_usage; ++} data_t; + + static void uv__cancelled(struct uv__work* w) { + abort(); +@@ -53,7 +66,9 @@ + struct uv__work* w; + QUEUE* q; + +- (void) arg; ++#ifndef _WIN32 ++ struct data_t *data = arg; ++#endif + + for (;;) { + uv_mutex_lock(&mutex); +@@ -80,8 +95,29 @@ + break; + + w = QUEUE_DATA(q, struct uv__work, wq); ++#ifndef _WIN32 ++ if(pilight.debuglevel >= 2) { ++ getThreadCPUUsage(pthread_self(), &data->cpu_usage); ++ clock_gettime(CLOCK_MONOTONIC, &data->timestamp.first); ++ } ++#endif + w->work(w); + ++#ifndef _WIN32 ++ if(pilight.debuglevel >= 2) { ++ clock_gettime(CLOCK_MONOTONIC, &data->timestamp.second); ++ getThreadCPUUsage(pthread_self(), &data->cpu_usage); ++ fprintf(stderr, "worker %d, executed %s in %.6f sec using %f%% CPU\n", ++ data->nr, ++ w->name, ++ ((double)data->timestamp.second.tv_sec + 1.0e-9*data->timestamp.second.tv_nsec) - ++ ((double)data->timestamp.first.tv_sec + 1.0e-9*data->timestamp.first.tv_nsec), ++ data->cpu_usage.cpu_per ++ ); ++ } ++#endif ++ ++ free(w->name); + uv_mutex_lock(&w->loop->wq_mutex); + w->work = NULL; /* Signal uv_cancel() that the work req is done + executing. */ +@@ -89,6 +125,9 @@ + uv_async_send(&w->loop->wq_async); + uv_mutex_unlock(&w->loop->wq_mutex); + } ++#ifndef _WIN32 ++ free(data); ++#endif + } + + +@@ -157,9 +196,18 @@ + + QUEUE_INIT(&wq); + +- for (i = 0; i < nthreads; i++) ++ for (i = 0; i < nthreads; i++) { ++#ifndef _WIN32 ++ struct data_t *data = malloc(sizeof(struct data_t)); ++ memset(data, '\0', sizeof(struct data_t)); ++ data->nr = i; ++ if (uv_thread_create(threads + i, worker, data)) ++ abort(); ++#else + if (uv_thread_create(threads + i, worker, NULL)) + abort(); ++#endif ++ } + + initialized = 1; + } +@@ -269,6 +317,7 @@ + + int uv_queue_work(uv_loop_t* loop, + uv_work_t* req, ++ char *name, + uv_work_cb work_cb, + uv_after_work_cb after_work_cb) { + if (work_cb == NULL) +@@ -278,6 +327,7 @@ + req->loop = loop; + req->work_cb = work_cb; + req->after_work_cb = after_work_cb; ++ req->work_req.name = strdup(name); + uv__work_submit(loop, &req->work_req, uv__queue_work, uv__queue_done); + return 0; + } diff --git a/lib/ESPiLight/pilight/libs/libuv/tree.h b/lib/ESPiLight/pilight/libs/libuv/tree.h new file mode 100644 index 0000000..f936416 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/tree.h @@ -0,0 +1,768 @@ +/*- + * Copyright 2002 Niels Provos + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef UV_TREE_H_ +#define UV_TREE_H_ + +#ifndef UV__UNUSED +# if __GNUC__ +# define UV__UNUSED __attribute__((unused)) +# else +# define UV__UNUSED +# endif +#endif + +/* + * This file defines data structures for different types of trees: + * splay trees and red-black trees. + * + * A splay tree is a self-organizing data structure. Every operation + * on the tree causes a splay to happen. The splay moves the requested + * node to the root of the tree and partly rebalances it. + * + * This has the benefit that request locality causes faster lookups as + * the requested nodes move to the top of the tree. On the other hand, + * every lookup causes memory writes. + * + * The Balance Theorem bounds the total access time for m operations + * and n inserts on an initially empty tree as O((m + n)lg n). The + * amortized cost for a sequence of m accesses to a splay tree is O(lg n); + * + * A red-black tree is a binary search tree with the node color as an + * extra attribute. It fulfills a set of conditions: + * - every search path from the root to a leaf consists of the + * same number of black nodes, + * - each red node (except for the root) has a black parent, + * - each leaf node is black. + * + * Every operation on a red-black tree is bounded as O(lg n). + * The maximum height of a red-black tree is 2lg (n+1). + */ + +#define SPLAY_HEAD(name, type) \ +struct name { \ + struct type *sph_root; /* root of the tree */ \ +} + +#define SPLAY_INITIALIZER(root) \ + { NULL } + +#define SPLAY_INIT(root) do { \ + (root)->sph_root = NULL; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ENTRY(type) \ +struct { \ + struct type *spe_left; /* left element */ \ + struct type *spe_right; /* right element */ \ +} + +#define SPLAY_LEFT(elm, field) (elm)->field.spe_left +#define SPLAY_RIGHT(elm, field) (elm)->field.spe_right +#define SPLAY_ROOT(head) (head)->sph_root +#define SPLAY_EMPTY(head) (SPLAY_ROOT(head) == NULL) + +/* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */ +#define SPLAY_ROTATE_RIGHT(head, tmp, field) do { \ + SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \ + SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ + (head)->sph_root = tmp; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ROTATE_LEFT(head, tmp, field) do { \ + SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \ + SPLAY_LEFT(tmp, field) = (head)->sph_root; \ + (head)->sph_root = tmp; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_LINKLEFT(head, tmp, field) do { \ + SPLAY_LEFT(tmp, field) = (head)->sph_root; \ + tmp = (head)->sph_root; \ + (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_LINKRIGHT(head, tmp, field) do { \ + SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ + tmp = (head)->sph_root; \ + (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ASSEMBLE(head, node, left, right, field) do { \ + SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \ + SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field); \ + SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \ + SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \ +} while (/*CONSTCOND*/ 0) + +/* Generates prototypes and inline functions */ + +#define SPLAY_PROTOTYPE(name, type, field, cmp) \ +void name##_SPLAY(struct name *, struct type *); \ +void name##_SPLAY_MINMAX(struct name *, int); \ +struct type *name##_SPLAY_INSERT(struct name *, struct type *); \ +struct type *name##_SPLAY_REMOVE(struct name *, struct type *); \ + \ +/* Finds the node with the same key as elm */ \ +static __inline struct type * \ +name##_SPLAY_FIND(struct name *head, struct type *elm) \ +{ \ + if (SPLAY_EMPTY(head)) \ + return(NULL); \ + name##_SPLAY(head, elm); \ + if ((cmp)(elm, (head)->sph_root) == 0) \ + return (head->sph_root); \ + return (NULL); \ +} \ + \ +static __inline struct type * \ +name##_SPLAY_NEXT(struct name *head, struct type *elm) \ +{ \ + name##_SPLAY(head, elm); \ + if (SPLAY_RIGHT(elm, field) != NULL) { \ + elm = SPLAY_RIGHT(elm, field); \ + while (SPLAY_LEFT(elm, field) != NULL) { \ + elm = SPLAY_LEFT(elm, field); \ + } \ + } else \ + elm = NULL; \ + return (elm); \ +} \ + \ +static __inline struct type * \ +name##_SPLAY_MIN_MAX(struct name *head, int val) \ +{ \ + name##_SPLAY_MINMAX(head, val); \ + return (SPLAY_ROOT(head)); \ +} + +/* Main splay operation. + * Moves node close to the key of elm to top + */ +#define SPLAY_GENERATE(name, type, field, cmp) \ +struct type * \ +name##_SPLAY_INSERT(struct name *head, struct type *elm) \ +{ \ + if (SPLAY_EMPTY(head)) { \ + SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = NULL; \ + } else { \ + int __comp; \ + name##_SPLAY(head, elm); \ + __comp = (cmp)(elm, (head)->sph_root); \ + if(__comp < 0) { \ + SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field); \ + SPLAY_RIGHT(elm, field) = (head)->sph_root; \ + SPLAY_LEFT((head)->sph_root, field) = NULL; \ + } else if (__comp > 0) { \ + SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field); \ + SPLAY_LEFT(elm, field) = (head)->sph_root; \ + SPLAY_RIGHT((head)->sph_root, field) = NULL; \ + } else \ + return ((head)->sph_root); \ + } \ + (head)->sph_root = (elm); \ + return (NULL); \ +} \ + \ +struct type * \ +name##_SPLAY_REMOVE(struct name *head, struct type *elm) \ +{ \ + struct type *__tmp; \ + if (SPLAY_EMPTY(head)) \ + return (NULL); \ + name##_SPLAY(head, elm); \ + if ((cmp)(elm, (head)->sph_root) == 0) { \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL) { \ + (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ + } else { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ + name##_SPLAY(head, elm); \ + SPLAY_RIGHT((head)->sph_root, field) = __tmp; \ + } \ + return (elm); \ + } \ + return (NULL); \ +} \ + \ +void \ +name##_SPLAY(struct name *head, struct type *elm) \ +{ \ + struct type __node, *__left, *__right, *__tmp; \ + int __comp; \ + \ + SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL; \ + __left = __right = &__node; \ + \ + while ((__comp = (cmp)(elm, (head)->sph_root)) != 0) { \ + if (__comp < 0) { \ + __tmp = SPLAY_LEFT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if ((cmp)(elm, __tmp) < 0){ \ + SPLAY_ROTATE_RIGHT(head, __tmp, field); \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL) \ + break; \ + } \ + SPLAY_LINKLEFT(head, __right, field); \ + } else if (__comp > 0) { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if ((cmp)(elm, __tmp) > 0){ \ + SPLAY_ROTATE_LEFT(head, __tmp, field); \ + if (SPLAY_RIGHT((head)->sph_root, field) == NULL) \ + break; \ + } \ + SPLAY_LINKRIGHT(head, __left, field); \ + } \ + } \ + SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ +} \ + \ +/* Splay with either the minimum or the maximum element \ + * Used to find minimum or maximum element in tree. \ + */ \ +void name##_SPLAY_MINMAX(struct name *head, int __comp) \ +{ \ + struct type __node, *__left, *__right, *__tmp; \ + \ + SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL; \ + __left = __right = &__node; \ + \ + while (1) { \ + if (__comp < 0) { \ + __tmp = SPLAY_LEFT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if (__comp < 0){ \ + SPLAY_ROTATE_RIGHT(head, __tmp, field); \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL) \ + break; \ + } \ + SPLAY_LINKLEFT(head, __right, field); \ + } else if (__comp > 0) { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if (__comp > 0) { \ + SPLAY_ROTATE_LEFT(head, __tmp, field); \ + if (SPLAY_RIGHT((head)->sph_root, field) == NULL) \ + break; \ + } \ + SPLAY_LINKRIGHT(head, __left, field); \ + } \ + } \ + SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ +} + +#define SPLAY_NEGINF -1 +#define SPLAY_INF 1 + +#define SPLAY_INSERT(name, x, y) name##_SPLAY_INSERT(x, y) +#define SPLAY_REMOVE(name, x, y) name##_SPLAY_REMOVE(x, y) +#define SPLAY_FIND(name, x, y) name##_SPLAY_FIND(x, y) +#define SPLAY_NEXT(name, x, y) name##_SPLAY_NEXT(x, y) +#define SPLAY_MIN(name, x) (SPLAY_EMPTY(x) ? NULL \ + : name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF)) +#define SPLAY_MAX(name, x) (SPLAY_EMPTY(x) ? NULL \ + : name##_SPLAY_MIN_MAX(x, SPLAY_INF)) + +#define SPLAY_FOREACH(x, name, head) \ + for ((x) = SPLAY_MIN(name, head); \ + (x) != NULL; \ + (x) = SPLAY_NEXT(name, head, x)) + +/* Macros that define a red-black tree */ +#define RB_HEAD(name, type) \ +struct name { \ + struct type *rbh_root; /* root of the tree */ \ +} + +#define RB_INITIALIZER(root) \ + { NULL } + +#define RB_INIT(root) do { \ + (root)->rbh_root = NULL; \ +} while (/*CONSTCOND*/ 0) + +#define RB_BLACK 0 +#define RB_RED 1 +#define RB_ENTRY(type) \ +struct { \ + struct type *rbe_left; /* left element */ \ + struct type *rbe_right; /* right element */ \ + struct type *rbe_parent; /* parent element */ \ + int rbe_color; /* node color */ \ +} + +#define RB_LEFT(elm, field) (elm)->field.rbe_left +#define RB_RIGHT(elm, field) (elm)->field.rbe_right +#define RB_PARENT(elm, field) (elm)->field.rbe_parent +#define RB_COLOR(elm, field) (elm)->field.rbe_color +#define RB_ROOT(head) (head)->rbh_root +#define RB_EMPTY(head) (RB_ROOT(head) == NULL) + +#define RB_SET(elm, parent, field) do { \ + RB_PARENT(elm, field) = parent; \ + RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \ + RB_COLOR(elm, field) = RB_RED; \ +} while (/*CONSTCOND*/ 0) + +#define RB_SET_BLACKRED(black, red, field) do { \ + RB_COLOR(black, field) = RB_BLACK; \ + RB_COLOR(red, field) = RB_RED; \ +} while (/*CONSTCOND*/ 0) + +#ifndef RB_AUGMENT +#define RB_AUGMENT(x) do {} while (0) +#endif + +#define RB_ROTATE_LEFT(head, elm, tmp, field) do { \ + (tmp) = RB_RIGHT(elm, field); \ + if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) { \ + RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \ + } \ + RB_AUGMENT(elm); \ + if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \ + if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ + RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ + else \ + RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ + } else \ + (head)->rbh_root = (tmp); \ + RB_LEFT(tmp, field) = (elm); \ + RB_PARENT(elm, field) = (tmp); \ + RB_AUGMENT(tmp); \ + if ((RB_PARENT(tmp, field))) \ + RB_AUGMENT(RB_PARENT(tmp, field)); \ +} while (/*CONSTCOND*/ 0) + +#define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \ + (tmp) = RB_LEFT(elm, field); \ + if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) { \ + RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \ + } \ + RB_AUGMENT(elm); \ + if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \ + if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ + RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ + else \ + RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ + } else \ + (head)->rbh_root = (tmp); \ + RB_RIGHT(tmp, field) = (elm); \ + RB_PARENT(elm, field) = (tmp); \ + RB_AUGMENT(tmp); \ + if ((RB_PARENT(tmp, field))) \ + RB_AUGMENT(RB_PARENT(tmp, field)); \ +} while (/*CONSTCOND*/ 0) + +/* Generates prototypes and inline functions */ +#define RB_PROTOTYPE(name, type, field, cmp) \ + RB_PROTOTYPE_INTERNAL(name, type, field, cmp,) +#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \ + RB_PROTOTYPE_INTERNAL(name, type, field, cmp, UV__UNUSED static) +#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \ +attr void name##_RB_INSERT_COLOR(struct name *, struct type *); \ +attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\ +attr struct type *name##_RB_REMOVE(struct name *, struct type *); \ +attr struct type *name##_RB_INSERT(struct name *, struct type *); \ +attr struct type *name##_RB_FIND(struct name *, struct type *); \ +attr struct type *name##_RB_NFIND(struct name *, struct type *); \ +attr struct type *name##_RB_NEXT(struct type *); \ +attr struct type *name##_RB_PREV(struct type *); \ +attr struct type *name##_RB_MINMAX(struct name *, int); \ + \ + +/* Main rb operation. + * Moves node close to the key of elm to top + */ +#define RB_GENERATE(name, type, field, cmp) \ + RB_GENERATE_INTERNAL(name, type, field, cmp,) +#define RB_GENERATE_STATIC(name, type, field, cmp) \ + RB_GENERATE_INTERNAL(name, type, field, cmp, UV__UNUSED static) +#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \ +attr void \ +name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \ +{ \ + struct type *parent, *gparent, *tmp; \ + while ((parent = RB_PARENT(elm, field)) != NULL && \ + RB_COLOR(parent, field) == RB_RED) { \ + gparent = RB_PARENT(parent, field); \ + if (parent == RB_LEFT(gparent, field)) { \ + tmp = RB_RIGHT(gparent, field); \ + if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ + RB_COLOR(tmp, field) = RB_BLACK; \ + RB_SET_BLACKRED(parent, gparent, field); \ + elm = gparent; \ + continue; \ + } \ + if (RB_RIGHT(parent, field) == elm) { \ + RB_ROTATE_LEFT(head, parent, tmp, field); \ + tmp = parent; \ + parent = elm; \ + elm = tmp; \ + } \ + RB_SET_BLACKRED(parent, gparent, field); \ + RB_ROTATE_RIGHT(head, gparent, tmp, field); \ + } else { \ + tmp = RB_LEFT(gparent, field); \ + if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ + RB_COLOR(tmp, field) = RB_BLACK; \ + RB_SET_BLACKRED(parent, gparent, field); \ + elm = gparent; \ + continue; \ + } \ + if (RB_LEFT(parent, field) == elm) { \ + RB_ROTATE_RIGHT(head, parent, tmp, field); \ + tmp = parent; \ + parent = elm; \ + elm = tmp; \ + } \ + RB_SET_BLACKRED(parent, gparent, field); \ + RB_ROTATE_LEFT(head, gparent, tmp, field); \ + } \ + } \ + RB_COLOR(head->rbh_root, field) = RB_BLACK; \ +} \ + \ +attr void \ +name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, \ + struct type *elm) \ +{ \ + struct type *tmp; \ + while ((elm == NULL || RB_COLOR(elm, field) == RB_BLACK) && \ + elm != RB_ROOT(head)) { \ + if (RB_LEFT(parent, field) == elm) { \ + tmp = RB_RIGHT(parent, field); \ + if (RB_COLOR(tmp, field) == RB_RED) { \ + RB_SET_BLACKRED(tmp, parent, field); \ + RB_ROTATE_LEFT(head, parent, tmp, field); \ + tmp = RB_RIGHT(parent, field); \ + } \ + if ((RB_LEFT(tmp, field) == NULL || \ + RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) && \ + (RB_RIGHT(tmp, field) == NULL || \ + RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) { \ + RB_COLOR(tmp, field) = RB_RED; \ + elm = parent; \ + parent = RB_PARENT(elm, field); \ + } else { \ + if (RB_RIGHT(tmp, field) == NULL || \ + RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) { \ + struct type *oleft; \ + if ((oleft = RB_LEFT(tmp, field)) \ + != NULL) \ + RB_COLOR(oleft, field) = RB_BLACK; \ + RB_COLOR(tmp, field) = RB_RED; \ + RB_ROTATE_RIGHT(head, tmp, oleft, field); \ + tmp = RB_RIGHT(parent, field); \ + } \ + RB_COLOR(tmp, field) = RB_COLOR(parent, field); \ + RB_COLOR(parent, field) = RB_BLACK; \ + if (RB_RIGHT(tmp, field)) \ + RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK; \ + RB_ROTATE_LEFT(head, parent, tmp, field); \ + elm = RB_ROOT(head); \ + break; \ + } \ + } else { \ + tmp = RB_LEFT(parent, field); \ + if (RB_COLOR(tmp, field) == RB_RED) { \ + RB_SET_BLACKRED(tmp, parent, field); \ + RB_ROTATE_RIGHT(head, parent, tmp, field); \ + tmp = RB_LEFT(parent, field); \ + } \ + if ((RB_LEFT(tmp, field) == NULL || \ + RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) && \ + (RB_RIGHT(tmp, field) == NULL || \ + RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) { \ + RB_COLOR(tmp, field) = RB_RED; \ + elm = parent; \ + parent = RB_PARENT(elm, field); \ + } else { \ + if (RB_LEFT(tmp, field) == NULL || \ + RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) { \ + struct type *oright; \ + if ((oright = RB_RIGHT(tmp, field)) \ + != NULL) \ + RB_COLOR(oright, field) = RB_BLACK; \ + RB_COLOR(tmp, field) = RB_RED; \ + RB_ROTATE_LEFT(head, tmp, oright, field); \ + tmp = RB_LEFT(parent, field); \ + } \ + RB_COLOR(tmp, field) = RB_COLOR(parent, field); \ + RB_COLOR(parent, field) = RB_BLACK; \ + if (RB_LEFT(tmp, field)) \ + RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK; \ + RB_ROTATE_RIGHT(head, parent, tmp, field); \ + elm = RB_ROOT(head); \ + break; \ + } \ + } \ + } \ + if (elm) \ + RB_COLOR(elm, field) = RB_BLACK; \ +} \ + \ +attr struct type * \ +name##_RB_REMOVE(struct name *head, struct type *elm) \ +{ \ + struct type *child, *parent, *old = elm; \ + int color; \ + if (RB_LEFT(elm, field) == NULL) \ + child = RB_RIGHT(elm, field); \ + else if (RB_RIGHT(elm, field) == NULL) \ + child = RB_LEFT(elm, field); \ + else { \ + struct type *left; \ + elm = RB_RIGHT(elm, field); \ + while ((left = RB_LEFT(elm, field)) != NULL) \ + elm = left; \ + child = RB_RIGHT(elm, field); \ + parent = RB_PARENT(elm, field); \ + color = RB_COLOR(elm, field); \ + if (child) \ + RB_PARENT(child, field) = parent; \ + if (parent) { \ + if (RB_LEFT(parent, field) == elm) \ + RB_LEFT(parent, field) = child; \ + else \ + RB_RIGHT(parent, field) = child; \ + RB_AUGMENT(parent); \ + } else \ + RB_ROOT(head) = child; \ + if (RB_PARENT(elm, field) == old) \ + parent = elm; \ + (elm)->field = (old)->field; \ + if (RB_PARENT(old, field)) { \ + if (RB_LEFT(RB_PARENT(old, field), field) == old) \ + RB_LEFT(RB_PARENT(old, field), field) = elm; \ + else \ + RB_RIGHT(RB_PARENT(old, field), field) = elm; \ + RB_AUGMENT(RB_PARENT(old, field)); \ + } else \ + RB_ROOT(head) = elm; \ + RB_PARENT(RB_LEFT(old, field), field) = elm; \ + if (RB_RIGHT(old, field)) \ + RB_PARENT(RB_RIGHT(old, field), field) = elm; \ + if (parent) { \ + left = parent; \ + do { \ + RB_AUGMENT(left); \ + } while ((left = RB_PARENT(left, field)) != NULL); \ + } \ + goto color; \ + } \ + parent = RB_PARENT(elm, field); \ + color = RB_COLOR(elm, field); \ + if (child) \ + RB_PARENT(child, field) = parent; \ + if (parent) { \ + if (RB_LEFT(parent, field) == elm) \ + RB_LEFT(parent, field) = child; \ + else \ + RB_RIGHT(parent, field) = child; \ + RB_AUGMENT(parent); \ + } else \ + RB_ROOT(head) = child; \ +color: \ + if (color == RB_BLACK) \ + name##_RB_REMOVE_COLOR(head, parent, child); \ + return (old); \ +} \ + \ +/* Inserts a node into the RB tree */ \ +attr struct type * \ +name##_RB_INSERT(struct name *head, struct type *elm) \ +{ \ + struct type *tmp; \ + struct type *parent = NULL; \ + int comp = 0; \ + tmp = RB_ROOT(head); \ + while (tmp) { \ + parent = tmp; \ + comp = (cmp)(elm, parent); \ + if (comp < 0) \ + tmp = RB_LEFT(tmp, field); \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + RB_SET(elm, parent, field); \ + if (parent != NULL) { \ + if (comp < 0) \ + RB_LEFT(parent, field) = elm; \ + else \ + RB_RIGHT(parent, field) = elm; \ + RB_AUGMENT(parent); \ + } else \ + RB_ROOT(head) = elm; \ + name##_RB_INSERT_COLOR(head, elm); \ + return (NULL); \ +} \ + \ +/* Finds the node with the same key as elm */ \ +attr struct type * \ +name##_RB_FIND(struct name *head, struct type *elm) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + int comp; \ + while (tmp) { \ + comp = cmp(elm, tmp); \ + if (comp < 0) \ + tmp = RB_LEFT(tmp, field); \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + return (NULL); \ +} \ + \ +/* Finds the first node greater than or equal to the search key */ \ +attr struct type * \ +name##_RB_NFIND(struct name *head, struct type *elm) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + struct type *res = NULL; \ + int comp; \ + while (tmp) { \ + comp = cmp(elm, tmp); \ + if (comp < 0) { \ + res = tmp; \ + tmp = RB_LEFT(tmp, field); \ + } \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + return (res); \ +} \ + \ +/* ARGSUSED */ \ +attr struct type * \ +name##_RB_NEXT(struct type *elm) \ +{ \ + if (RB_RIGHT(elm, field)) { \ + elm = RB_RIGHT(elm, field); \ + while (RB_LEFT(elm, field)) \ + elm = RB_LEFT(elm, field); \ + } else { \ + if (RB_PARENT(elm, field) && \ + (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + else { \ + while (RB_PARENT(elm, field) && \ + (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + elm = RB_PARENT(elm, field); \ + } \ + } \ + return (elm); \ +} \ + \ +/* ARGSUSED */ \ +attr struct type * \ +name##_RB_PREV(struct type *elm) \ +{ \ + if (RB_LEFT(elm, field)) { \ + elm = RB_LEFT(elm, field); \ + while (RB_RIGHT(elm, field)) \ + elm = RB_RIGHT(elm, field); \ + } else { \ + if (RB_PARENT(elm, field) && \ + (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + else { \ + while (RB_PARENT(elm, field) && \ + (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + elm = RB_PARENT(elm, field); \ + } \ + } \ + return (elm); \ +} \ + \ +attr struct type * \ +name##_RB_MINMAX(struct name *head, int val) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + struct type *parent = NULL; \ + while (tmp) { \ + parent = tmp; \ + if (val < 0) \ + tmp = RB_LEFT(tmp, field); \ + else \ + tmp = RB_RIGHT(tmp, field); \ + } \ + return (parent); \ +} + +#define RB_NEGINF -1 +#define RB_INF 1 + +#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y) +#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y) +#define RB_FIND(name, x, y) name##_RB_FIND(x, y) +#define RB_NFIND(name, x, y) name##_RB_NFIND(x, y) +#define RB_NEXT(name, x, y) name##_RB_NEXT(y) +#define RB_PREV(name, x, y) name##_RB_PREV(y) +#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF) +#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF) + +#define RB_FOREACH(x, name, head) \ + for ((x) = RB_MIN(name, head); \ + (x) != NULL; \ + (x) = name##_RB_NEXT(x)) + +#define RB_FOREACH_FROM(x, name, y) \ + for ((x) = (y); \ + ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_SAFE(x, name, head, y) \ + for ((x) = RB_MIN(name, head); \ + ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_REVERSE(x, name, head) \ + for ((x) = RB_MAX(name, head); \ + (x) != NULL; \ + (x) = name##_RB_PREV(x)) + +#define RB_FOREACH_REVERSE_FROM(x, name, y) \ + for ((x) = (y); \ + ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_REVERSE_SAFE(x, name, head, y) \ + for ((x) = RB_MAX(name, head); \ + ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ + (x) = (y)) + +#endif /* UV_TREE_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/aix.c b/lib/ESPiLight/pilight/libs/libuv/unix/aix.c new file mode 100644 index 0000000..388c9cc --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/aix.c @@ -0,0 +1,1243 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include +#ifdef HAVE_SYS_AHAFS_EVPRODS_H +#include +#endif + +#include +#include +#include +#include +#include + +#define RDWR_BUF_SIZE 4096 +#define EQ(a,b) (strcmp(a,b) == 0) + +static void* args_mem = NULL; +static char** process_argv = NULL; +static int process_argc = 0; +static char* process_title_ptr = NULL; + +int uv__platform_loop_init(uv_loop_t* loop) { + loop->fs_fd = -1; + + /* Passing maxfd of -1 should mean the limit is determined + * by the user's ulimit or the global limit as per the doc */ + loop->backend_fd = pollset_create(-1); + + if (loop->backend_fd == -1) + return -1; + + return 0; +} + + +void uv__platform_loop_delete(uv_loop_t* loop) { + if (loop->fs_fd != -1) { + uv__close(loop->fs_fd); + loop->fs_fd = -1; + } + + if (loop->backend_fd != -1) { + pollset_destroy(loop->backend_fd); + loop->backend_fd = -1; + } +} + + +int uv__io_fork(uv_loop_t* loop) { + uv__platform_loop_delete(loop); + + return uv__platform_loop_init(loop); +} + + +int uv__io_check_fd(uv_loop_t* loop, int fd) { + struct poll_ctl pc; + + pc.events = POLLIN; + pc.cmd = PS_MOD; /* Equivalent to PS_ADD if the fd is not in the pollset. */ + pc.fd = fd; + + if (pollset_ctl(loop->backend_fd, &pc, 1)) + return -errno; + + pc.cmd = PS_DELETE; + if (pollset_ctl(loop->backend_fd, &pc, 1)) + abort(); + + return 0; +} + + +void uv__io_poll(uv_loop_t* loop, int timeout) { + struct pollfd events[1024]; + struct pollfd pqry; + struct pollfd* pe; + struct poll_ctl pc; + QUEUE* q; + uv__io_t* w; + uint64_t base; + uint64_t diff; + int have_signals; + int nevents; + int count; + int nfds; + int i; + int rc; + int add_failed; + + if (loop->nfds == 0) { + assert(QUEUE_EMPTY(&loop->watcher_queue)); + return; + } + + while (!QUEUE_EMPTY(&loop->watcher_queue)) { + q = QUEUE_HEAD(&loop->watcher_queue); + QUEUE_REMOVE(q); + QUEUE_INIT(q); + + w = QUEUE_DATA(q, uv__io_t, watcher_queue); + assert(w->pevents != 0); + assert(w->fd >= 0); + assert(w->fd < (int) loop->nwatchers); + + pc.events = w->pevents; + pc.fd = w->fd; + + add_failed = 0; + if (w->events == 0) { + pc.cmd = PS_ADD; + if (pollset_ctl(loop->backend_fd, &pc, 1)) { + if (errno != EINVAL) { + assert(0 && "Failed to add file descriptor (pc.fd) to pollset"); + abort(); + } + /* Check if the fd is already in the pollset */ + pqry.fd = pc.fd; + rc = pollset_query(loop->backend_fd, &pqry); + switch (rc) { + case -1: + assert(0 && "Failed to query pollset for file descriptor"); + abort(); + case 0: + assert(0 && "Pollset does not contain file descriptor"); + abort(); + } + /* If we got here then the pollset already contained the file descriptor even though + * we didn't think it should. This probably shouldn't happen, but we can continue. */ + add_failed = 1; + } + } + if (w->events != 0 || add_failed) { + /* Modify, potentially removing events -- need to delete then add. + * Could maybe mod if we knew for sure no events are removed, but + * content of w->events is handled above as not reliable (falls back) + * so may require a pollset_query() which would have to be pretty cheap + * compared to a PS_DELETE to be worth optimizing. Alternatively, could + * lazily remove events, squelching them in the mean time. */ + pc.cmd = PS_DELETE; + if (pollset_ctl(loop->backend_fd, &pc, 1)) { + assert(0 && "Failed to delete file descriptor (pc.fd) from pollset"); + abort(); + } + pc.cmd = PS_ADD; + if (pollset_ctl(loop->backend_fd, &pc, 1)) { + assert(0 && "Failed to add file descriptor (pc.fd) to pollset"); + abort(); + } + } + + w->events = w->pevents; + } + + assert(timeout >= -1); + base = loop->time; + count = 48; /* Benchmarks suggest this gives the best throughput. */ + + for (;;) { + nfds = pollset_poll(loop->backend_fd, + events, + ARRAY_SIZE(events), + timeout); + + /* Update loop->time unconditionally. It's tempting to skip the update when + * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the + * operating system didn't reschedule our process while in the syscall. + */ + SAVE_ERRNO(uv__update_time(loop)); + + if (nfds == 0) { + assert(timeout != -1); + return; + } + + if (nfds == -1) { + if (errno != EINTR) { + abort(); + } + + if (timeout == -1) + continue; + + if (timeout == 0) + return; + + /* Interrupted by a signal. Update timeout and poll again. */ + goto update_timeout; + } + + have_signals = 0; + nevents = 0; + + assert(loop->watchers != NULL); + loop->watchers[loop->nwatchers] = (void*) events; + loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds; + + for (i = 0; i < nfds; i++) { + pe = events + i; + pc.cmd = PS_DELETE; + pc.fd = pe->fd; + + /* Skip invalidated events, see uv__platform_invalidate_fd */ + if (pc.fd == -1) + continue; + + assert(pc.fd >= 0); + assert((unsigned) pc.fd < loop->nwatchers); + + w = loop->watchers[pc.fd]; + + if (w == NULL) { + /* File descriptor that we've stopped watching, disarm it. + * + * Ignore all errors because we may be racing with another thread + * when the file descriptor is closed. + */ + pollset_ctl(loop->backend_fd, &pc, 1); + continue; + } + + /* Run signal watchers last. This also affects child process watchers + * because those are implemented in terms of signal watchers. + */ + if (w == &loop->signal_io_watcher) + have_signals = 1; + else + w->cb(loop, w, pe->revents); + + nevents++; + } + + if (have_signals != 0) + loop->signal_io_watcher.cb(loop, &loop->signal_io_watcher, POLLIN); + + loop->watchers[loop->nwatchers] = NULL; + loop->watchers[loop->nwatchers + 1] = NULL; + + if (have_signals != 0) + return; /* Event loop should cycle now so don't poll again. */ + + if (nevents != 0) { + if (nfds == ARRAY_SIZE(events) && --count != 0) { + /* Poll for more events but don't block this time. */ + timeout = 0; + continue; + } + return; + } + + if (timeout == 0) + return; + + if (timeout == -1) + continue; + +update_timeout: + assert(timeout > 0); + + diff = loop->time - base; + if (diff >= (uint64_t) timeout) + return; + + timeout -= diff; + } +} + + +uint64_t uv__hrtime(uv_clocktype_t type) { + uint64_t G = 1000000000; + timebasestruct_t t; + read_wall_time(&t, TIMEBASE_SZ); + time_base_to_time(&t, TIMEBASE_SZ); + return (uint64_t) t.tb_high * G + t.tb_low; +} + + +/* + * We could use a static buffer for the path manipulations that we need outside + * of the function, but this function could be called by multiple consumers and + * we don't want to potentially create a race condition in the use of snprintf. + * There is no direct way of getting the exe path in AIX - either through /procfs + * or through some libc APIs. The below approach is to parse the argv[0]'s pattern + * and use it in conjunction with PATH environment variable to craft one. + */ +int uv_exepath(char* buffer, size_t* size) { + int res; + char args[PATH_MAX]; + char abspath[PATH_MAX]; + size_t abspath_size; + struct procsinfo pi; + + if (buffer == NULL || size == NULL || *size == 0) + return -EINVAL; + + pi.pi_pid = getpid(); + res = getargs(&pi, sizeof(pi), args, sizeof(args)); + if (res < 0) + return -EINVAL; + + /* + * Possibilities for args: + * i) an absolute path such as: /home/user/myprojects/nodejs/node + * ii) a relative path such as: ./node or ../myprojects/nodejs/node + * iii) a bare filename such as "node", after exporting PATH variable + * to its location. + */ + + /* Case i) and ii) absolute or relative paths */ + if (strchr(args, '/') != NULL) { + if (realpath(args, abspath) != abspath) + return -errno; + + abspath_size = strlen(abspath); + + *size -= 1; + if (*size > abspath_size) + *size = abspath_size; + + memcpy(buffer, abspath, *size); + buffer[*size] = '\0'; + + return 0; + } else { + /* Case iii). Search PATH environment variable */ + char trypath[PATH_MAX]; + char *clonedpath = NULL; + char *token = NULL; + char *path = getenv("PATH"); + + if (path == NULL) + return -EINVAL; + + clonedpath = uv__strdup(path); + if (clonedpath == NULL) + return -ENOMEM; + + token = strtok(clonedpath, ":"); + while (token != NULL) { + snprintf(trypath, sizeof(trypath) - 1, "%s/%s", token, args); + if (realpath(trypath, abspath) == abspath) { + /* Check the match is executable */ + if (access(abspath, X_OK) == 0) { + abspath_size = strlen(abspath); + + *size -= 1; + if (*size > abspath_size) + *size = abspath_size; + + memcpy(buffer, abspath, *size); + buffer[*size] = '\0'; + + uv__free(clonedpath); + return 0; + } + } + token = strtok(NULL, ":"); + } + uv__free(clonedpath); + + /* Out of tokens (path entries), and no match found */ + return -EINVAL; + } +} + + +uint64_t uv_get_free_memory(void) { + perfstat_memory_total_t mem_total; + int result = perfstat_memory_total(NULL, &mem_total, sizeof(mem_total), 1); + if (result == -1) { + return 0; + } + return mem_total.real_free * 4096; +} + + +uint64_t uv_get_total_memory(void) { + perfstat_memory_total_t mem_total; + int result = perfstat_memory_total(NULL, &mem_total, sizeof(mem_total), 1); + if (result == -1) { + return 0; + } + return mem_total.real_total * 4096; +} + + +void uv_loadavg(double avg[3]) { + perfstat_cpu_total_t ps_total; + int result = perfstat_cpu_total(NULL, &ps_total, sizeof(ps_total), 1); + if (result == -1) { + avg[0] = 0.; avg[1] = 0.; avg[2] = 0.; + return; + } + avg[0] = ps_total.loadavg[0] / (double)(1 << SBITS); + avg[1] = ps_total.loadavg[1] / (double)(1 << SBITS); + avg[2] = ps_total.loadavg[2] / (double)(1 << SBITS); +} + + +#ifdef HAVE_SYS_AHAFS_EVPRODS_H +static char *uv__rawname(char *cp) { + static char rawbuf[FILENAME_MAX+1]; + char *dp = rindex(cp, '/'); + + if (dp == 0) + return 0; + + *dp = 0; + strcpy(rawbuf, cp); + *dp = '/'; + strcat(rawbuf, "/r"); + strcat(rawbuf, dp+1); + return rawbuf; +} + + +/* + * Determine whether given pathname is a directory + * Returns 0 if the path is a directory, -1 if not + * + * Note: Opportunity here for more detailed error information but + * that requires changing callers of this function as well + */ +static int uv__path_is_a_directory(char* filename) { + struct stat statbuf; + + if (stat(filename, &statbuf) < 0) + return -1; /* failed: not a directory, assume it is a file */ + + if (statbuf.st_type == VDIR) + return 0; + + return -1; +} + + +/* + * Check whether AHAFS is mounted. + * Returns 0 if AHAFS is mounted, or an error code < 0 on failure + */ +static int uv__is_ahafs_mounted(void){ + int rv, i = 2; + struct vmount *p; + int size_multiplier = 10; + size_t siz = sizeof(struct vmount)*size_multiplier; + struct vmount *vmt; + const char *dev = "/aha"; + char *obj, *stub; + + p = uv__malloc(siz); + if (p == NULL) + return -errno; + + /* Retrieve all mounted filesystems */ + rv = mntctl(MCTL_QUERY, siz, (char*)p); + if (rv < 0) + return -errno; + if (rv == 0) { + /* buffer was not large enough, reallocate to correct size */ + siz = *(int*)p; + uv__free(p); + p = uv__malloc(siz); + if (p == NULL) + return -errno; + rv = mntctl(MCTL_QUERY, siz, (char*)p); + if (rv < 0) + return -errno; + } + + /* Look for dev in filesystems mount info */ + for(vmt = p, i = 0; i < rv; i++) { + obj = vmt2dataptr(vmt, VMT_OBJECT); /* device */ + stub = vmt2dataptr(vmt, VMT_STUB); /* mount point */ + + if (EQ(obj, dev) || EQ(uv__rawname(obj), dev) || EQ(stub, dev)) { + uv__free(p); /* Found a match */ + return 0; + } + vmt = (struct vmount *) ((char *) vmt + vmt->vmt_length); + } + + /* /aha is required for monitoring filesystem changes */ + return -1; +} + +/* + * Recursive call to mkdir() to create intermediate folders, if any + * Returns code from mkdir call + */ +static int uv__makedir_p(const char *dir) { + char tmp[256]; + char *p = NULL; + size_t len; + int err; + + snprintf(tmp, sizeof(tmp),"%s",dir); + len = strlen(tmp); + if (tmp[len - 1] == '/') + tmp[len - 1] = 0; + for (p = tmp + 1; *p; p++) { + if (*p == '/') { + *p = 0; + err = mkdir(tmp, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + if (err != 0 && errno != EEXIST) + return err; + *p = '/'; + } + } + return mkdir(tmp, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); +} + +/* + * Creates necessary subdirectories in the AIX Event Infrastructure + * file system for monitoring the object specified. + * Returns code from mkdir call + */ +static int uv__make_subdirs_p(const char *filename) { + char cmd[2048]; + char *p; + int rc = 0; + + /* Strip off the monitor file name */ + p = strrchr(filename, '/'); + + if (p == NULL) + return 0; + + if (uv__path_is_a_directory((char*)filename) == 0) { + sprintf(cmd, "/aha/fs/modDir.monFactory"); + } else { + sprintf(cmd, "/aha/fs/modFile.monFactory"); + } + + strncat(cmd, filename, (p - filename)); + rc = uv__makedir_p(cmd); + + if (rc == -1 && errno != EEXIST){ + return -errno; + } + + return rc; +} + + +/* + * Checks if /aha is mounted, then proceeds to set up the monitoring + * objects for the specified file. + * Returns 0 on success, or an error code < 0 on failure + */ +static int uv__setup_ahafs(const char* filename, int *fd) { + int rc = 0; + char mon_file_write_string[RDWR_BUF_SIZE]; + char mon_file[PATH_MAX]; + int file_is_directory = 0; /* -1 == NO, 0 == YES */ + + /* Create monitor file name for object */ + file_is_directory = uv__path_is_a_directory((char*)filename); + + if (file_is_directory == 0) + sprintf(mon_file, "/aha/fs/modDir.monFactory"); + else + sprintf(mon_file, "/aha/fs/modFile.monFactory"); + + if ((strlen(mon_file) + strlen(filename) + 5) > PATH_MAX) + return -ENAMETOOLONG; + + /* Make the necessary subdirectories for the monitor file */ + rc = uv__make_subdirs_p(filename); + if (rc == -1 && errno != EEXIST) + return rc; + + strcat(mon_file, filename); + strcat(mon_file, ".mon"); + + *fd = 0; errno = 0; + + /* Open the monitor file, creating it if necessary */ + *fd = open(mon_file, O_CREAT|O_RDWR); + if (*fd < 0) + return -errno; + + /* Write out the monitoring specifications. + * In this case, we are monitoring for a state change event type + * CHANGED=YES + * We will be waiting in select call, rather than a read: + * WAIT_TYPE=WAIT_IN_SELECT + * We only want minimal information for files: + * INFO_LVL=1 + * For directories, we want more information to track what file + * caused the change + * INFO_LVL=2 + */ + + if (file_is_directory == 0) + sprintf(mon_file_write_string, "CHANGED=YES;WAIT_TYPE=WAIT_IN_SELECT;INFO_LVL=2"); + else + sprintf(mon_file_write_string, "CHANGED=YES;WAIT_TYPE=WAIT_IN_SELECT;INFO_LVL=1"); + + rc = write(*fd, mon_file_write_string, strlen(mon_file_write_string)+1); + if (rc < 0) + return -errno; + + return 0; +} + +/* + * Skips a specified number of lines in the buffer passed in. + * Walks the buffer pointed to by p and attempts to skip n lines. + * Returns the total number of lines skipped + */ +static int uv__skip_lines(char **p, int n) { + int lines = 0; + + while(n > 0) { + *p = strchr(*p, '\n'); + if (!p) + return lines; + + (*p)++; + n--; + lines++; + } + return lines; +} + + +/* + * Parse the event occurrence data to figure out what event just occurred + * and take proper action. + * + * The buf is a pointer to the buffer containing the event occurrence data + * Returns 0 on success, -1 if unrecoverable error in parsing + * + */ +static int uv__parse_data(char *buf, int *events, uv_fs_event_t* handle) { + int evp_rc, i; + char *p; + char filename[PATH_MAX]; /* To be used when handling directories */ + + p = buf; + *events = 0; + + /* Clean the filename buffer*/ + for(i = 0; i < PATH_MAX; i++) { + filename[i] = 0; + } + i = 0; + + /* Check for BUF_WRAP */ + if (strncmp(buf, "BUF_WRAP", strlen("BUF_WRAP")) == 0) { + assert(0 && "Buffer wrap detected, Some event occurrences lost!"); + return 0; + } + + /* Since we are using the default buffer size (4K), and have specified + * INFO_LVL=1, we won't see any EVENT_OVERFLOW conditions. Applications + * should check for this keyword if they are using an INFO_LVL of 2 or + * higher, and have a buffer size of <= 4K + */ + + /* Skip to RC_FROM_EVPROD */ + if (uv__skip_lines(&p, 9) != 9) + return -1; + + if (sscanf(p, "RC_FROM_EVPROD=%d\nEND_EVENT_DATA", &evp_rc) == 1) { + if (uv__path_is_a_directory(handle->path) == 0) { /* Directory */ + if (evp_rc == AHAFS_MODDIR_UNMOUNT || evp_rc == AHAFS_MODDIR_REMOVE_SELF) { + /* The directory is no longer available for monitoring */ + *events = UV_RENAME; + handle->dir_filename = NULL; + } else { + /* A file was added/removed inside the directory */ + *events = UV_CHANGE; + + /* Get the EVPROD_INFO */ + if (uv__skip_lines(&p, 1) != 1) + return -1; + + /* Scan out the name of the file that triggered the event*/ + if (sscanf(p, "BEGIN_EVPROD_INFO\n%sEND_EVPROD_INFO", filename) == 1) { + handle->dir_filename = uv__strdup((const char*)&filename); + } else + return -1; + } + } else { /* Regular File */ + if (evp_rc == AHAFS_MODFILE_RENAME) + *events = UV_RENAME; + else + *events = UV_CHANGE; + } + } + else + return -1; + + return 0; +} + + +/* This is the internal callback */ +static void uv__ahafs_event(uv_loop_t* loop, uv__io_t* event_watch, unsigned int fflags) { + char result_data[RDWR_BUF_SIZE]; + int bytes, rc = 0; + uv_fs_event_t* handle; + int events = 0; + char fname[PATH_MAX]; + char *p; + + handle = container_of(event_watch, uv_fs_event_t, event_watcher); + + /* At this point, we assume that polling has been done on the + * file descriptor, so we can just read the AHAFS event occurrence + * data and parse its results without having to block anything + */ + bytes = pread(event_watch->fd, result_data, RDWR_BUF_SIZE, 0); + + assert((bytes >= 0) && "uv__ahafs_event - Error reading monitor file"); + + /* In file / directory move cases, AIX Event infrastructure + * produces a second event with no data. + * Ignore it and return gracefully. + */ + if(bytes == 0) + return; + + /* Parse the data */ + if(bytes > 0) + rc = uv__parse_data(result_data, &events, handle); + + /* Unrecoverable error */ + if (rc == -1) + return; + + /* For directory changes, the name of the files that triggered the change + * are never absolute pathnames + */ + if (uv__path_is_a_directory(handle->path) == 0) { + p = handle->dir_filename; + } else { + p = strrchr(handle->path, '/'); + if (p == NULL) + p = handle->path; + else + p++; + } + strncpy(fname, p, sizeof(fname) - 1); + /* Just in case */ + fname[sizeof(fname) - 1] = '\0'; + + handle->cb(handle, fname, events, 0); +} +#endif + + +int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { +#ifdef HAVE_SYS_AHAFS_EVPRODS_H + uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); + return 0; +#else + return -ENOSYS; +#endif +} + + +int uv_fs_event_start(uv_fs_event_t* handle, + uv_fs_event_cb cb, + const char* filename, + unsigned int flags) { +#ifdef HAVE_SYS_AHAFS_EVPRODS_H + int fd, rc, str_offset = 0; + char cwd[PATH_MAX]; + char absolute_path[PATH_MAX]; + char readlink_cwd[PATH_MAX]; + + + /* Figure out whether filename is absolute or not */ + if (filename[0] == '/') { + /* We have absolute pathname */ + snprintf(absolute_path, sizeof(absolute_path), "%s", filename); + } else { + /* We have a relative pathname, compose the absolute pathname */ + snprintf(cwd, sizeof(cwd), "/proc/%lu/cwd", (unsigned long) getpid()); + rc = readlink(cwd, readlink_cwd, sizeof(readlink_cwd) - 1); + if (rc < 0) + return rc; + /* readlink does not null terminate our string */ + readlink_cwd[rc] = '\0'; + + if (filename[0] == '.' && filename[1] == '/') + str_offset = 2; + + snprintf(absolute_path, sizeof(absolute_path), "%s%s", readlink_cwd, + filename + str_offset); + } + + if (uv__is_ahafs_mounted() < 0) /* /aha checks failed */ + return UV_ENOSYS; + + /* Setup ahafs */ + rc = uv__setup_ahafs((const char *)absolute_path, &fd); + if (rc != 0) + return rc; + + /* Setup/Initialize all the libuv routines */ + uv__handle_start(handle); + uv__io_init(&handle->event_watcher, uv__ahafs_event, fd); + handle->path = uv__strdup(filename); + handle->cb = cb; + + uv__io_start(handle->loop, &handle->event_watcher, POLLIN); + + return 0; +#else + return -ENOSYS; +#endif +} + + +int uv_fs_event_stop(uv_fs_event_t* handle) { +#ifdef HAVE_SYS_AHAFS_EVPRODS_H + if (!uv__is_active(handle)) + return 0; + + uv__io_close(handle->loop, &handle->event_watcher); + uv__handle_stop(handle); + + if (uv__path_is_a_directory(handle->path) == 0) { + uv__free(handle->dir_filename); + handle->dir_filename = NULL; + } + + uv__free(handle->path); + handle->path = NULL; + uv__close(handle->event_watcher.fd); + handle->event_watcher.fd = -1; + + return 0; +#else + return -ENOSYS; +#endif +} + + +void uv__fs_event_close(uv_fs_event_t* handle) { +#ifdef HAVE_SYS_AHAFS_EVPRODS_H + uv_fs_event_stop(handle); +#else + UNREACHABLE(); +#endif +} + + +char** uv_setup_args(int argc, char** argv) { + char** new_argv; + size_t size; + char* s; + int i; + + if (argc <= 0) + return argv; + + /* Save the original pointer to argv. + * AIX uses argv to read the process name. + * (Not the memory pointed to by argv[0..n] as on Linux.) + */ + process_argv = argv; + process_argc = argc; + + /* Calculate how much memory we need for the argv strings. */ + size = 0; + for (i = 0; i < argc; i++) + size += strlen(argv[i]) + 1; + + /* Add space for the argv pointers. */ + size += (argc + 1) * sizeof(char*); + + new_argv = uv__malloc(size); + if (new_argv == NULL) + return argv; + args_mem = new_argv; + + /* Copy over the strings and set up the pointer table. */ + s = (char*) &new_argv[argc + 1]; + for (i = 0; i < argc; i++) { + size = strlen(argv[i]) + 1; + memcpy(s, argv[i], size); + new_argv[i] = s; + s += size; + } + new_argv[i] = NULL; + + return new_argv; +} + + +int uv_set_process_title(const char* title) { + char* new_title; + + /* We cannot free this pointer when libuv shuts down, + * the process may still be using it. + */ + new_title = uv__strdup(title); + if (new_title == NULL) + return -ENOMEM; + + /* If this is the first time this is set, + * don't free and set argv[1] to NULL. + */ + if (process_title_ptr != NULL) + uv__free(process_title_ptr); + + process_title_ptr = new_title; + + process_argv[0] = process_title_ptr; + if (process_argc > 1) + process_argv[1] = NULL; + + return 0; +} + + +int uv_get_process_title(char* buffer, size_t size) { + size_t len; + len = strlen(process_argv[0]); + if (buffer == NULL || size == 0) + return -EINVAL; + else if (size <= len) + return -ENOBUFS; + + memcpy(buffer, process_argv[0], len + 1); + + return 0; +} + + +UV_DESTRUCTOR(static void free_args_mem(void)) { + uv__free(args_mem); /* Keep valgrind happy. */ + args_mem = NULL; +} + + +int uv_resident_set_memory(size_t* rss) { + char pp[64]; + psinfo_t psinfo; + int err; + int fd; + + snprintf(pp, sizeof(pp), "/proc/%lu/psinfo", (unsigned long) getpid()); + + fd = open(pp, O_RDONLY); + if (fd == -1) + return -errno; + + /* FIXME(bnoordhuis) Handle EINTR. */ + err = -EINVAL; + if (read(fd, &psinfo, sizeof(psinfo)) == sizeof(psinfo)) { + *rss = (size_t)psinfo.pr_rssize * 1024; + err = 0; + } + uv__close(fd); + + return err; +} + + +int uv_uptime(double* uptime) { + struct utmp *utmp_buf; + size_t entries = 0; + time_t boot_time; + + utmpname(UTMP_FILE); + + setutent(); + + while ((utmp_buf = getutent()) != NULL) { + if (utmp_buf->ut_user[0] && utmp_buf->ut_type == USER_PROCESS) + ++entries; + if (utmp_buf->ut_type == BOOT_TIME) + boot_time = utmp_buf->ut_time; + } + + endutent(); + + if (boot_time == 0) + return -ENOSYS; + + *uptime = time(NULL) - boot_time; + return 0; +} + + +int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { + uv_cpu_info_t* cpu_info; + perfstat_cpu_total_t ps_total; + perfstat_cpu_t* ps_cpus; + perfstat_id_t cpu_id; + int result, ncpus, idx = 0; + + result = perfstat_cpu_total(NULL, &ps_total, sizeof(ps_total), 1); + if (result == -1) { + return -ENOSYS; + } + + ncpus = result = perfstat_cpu(NULL, NULL, sizeof(perfstat_cpu_t), 0); + if (result == -1) { + return -ENOSYS; + } + + ps_cpus = (perfstat_cpu_t*) uv__malloc(ncpus * sizeof(perfstat_cpu_t)); + if (!ps_cpus) { + return -ENOMEM; + } + + strcpy(cpu_id.name, FIRST_CPU); + result = perfstat_cpu(&cpu_id, ps_cpus, sizeof(perfstat_cpu_t), ncpus); + if (result == -1) { + uv__free(ps_cpus); + return -ENOSYS; + } + + *cpu_infos = (uv_cpu_info_t*) uv__malloc(ncpus * sizeof(uv_cpu_info_t)); + if (!*cpu_infos) { + uv__free(ps_cpus); + return -ENOMEM; + } + + *count = ncpus; + + cpu_info = *cpu_infos; + while (idx < ncpus) { + cpu_info->speed = (int)(ps_total.processorHZ / 1000000); + cpu_info->model = uv__strdup(ps_total.description); + cpu_info->cpu_times.user = ps_cpus[idx].user; + cpu_info->cpu_times.sys = ps_cpus[idx].sys; + cpu_info->cpu_times.idle = ps_cpus[idx].idle; + cpu_info->cpu_times.irq = ps_cpus[idx].wait; + cpu_info->cpu_times.nice = 0; + cpu_info++; + idx++; + } + + uv__free(ps_cpus); + return 0; +} + + +void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { + int i; + + for (i = 0; i < count; ++i) { + uv__free(cpu_infos[i].model); + } + + uv__free(cpu_infos); +} + + +int uv_interface_addresses(uv_interface_address_t** addresses, + int* count) { + uv_interface_address_t* address; + int sockfd, size = 1; + struct ifconf ifc; + struct ifreq *ifr, *p, flg; + + *count = 0; + + if (0 > (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP))) { + return -errno; + } + + if (ioctl(sockfd, SIOCGSIZIFCONF, &size) == -1) { + uv__close(sockfd); + return -errno; + } + + ifc.ifc_req = (struct ifreq*)uv__malloc(size); + ifc.ifc_len = size; + if (ioctl(sockfd, SIOCGIFCONF, &ifc) == -1) { + uv__close(sockfd); + return -errno; + } + +#define ADDR_SIZE(p) MAX((p).sa_len, sizeof(p)) + + /* Count all up and running ipv4/ipv6 addresses */ + ifr = ifc.ifc_req; + while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) { + p = ifr; + ifr = (struct ifreq*) + ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr)); + + if (!(p->ifr_addr.sa_family == AF_INET6 || + p->ifr_addr.sa_family == AF_INET)) + continue; + + memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name)); + if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) { + uv__close(sockfd); + return -errno; + } + + if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING)) + continue; + + (*count)++; + } + + /* Alloc the return interface structs */ + *addresses = (uv_interface_address_t*) + uv__malloc(*count * sizeof(uv_interface_address_t)); + if (!(*addresses)) { + uv__close(sockfd); + return -ENOMEM; + } + address = *addresses; + + ifr = ifc.ifc_req; + while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) { + p = ifr; + ifr = (struct ifreq*) + ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr)); + + if (!(p->ifr_addr.sa_family == AF_INET6 || + p->ifr_addr.sa_family == AF_INET)) + continue; + + memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name)); + if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) { + uv__close(sockfd); + return -ENOSYS; + } + + if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING)) + continue; + + /* All conditions above must match count loop */ + + address->name = uv__strdup(p->ifr_name); + + if (p->ifr_addr.sa_family == AF_INET6) { + address->address.address6 = *((struct sockaddr_in6*) &p->ifr_addr); + } else { + address->address.address4 = *((struct sockaddr_in*) &p->ifr_addr); + } + + /* TODO: Retrieve netmask using SIOCGIFNETMASK ioctl */ + + address->is_internal = flg.ifr_flags & IFF_LOOPBACK ? 1 : 0; + + address++; + } + +#undef ADDR_SIZE + + uv__close(sockfd); + return 0; +} + + +void uv_free_interface_addresses(uv_interface_address_t* addresses, + int count) { + int i; + + for (i = 0; i < count; ++i) { + uv__free(addresses[i].name); + } + + uv__free(addresses); +} + +void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { + struct pollfd* events; + uintptr_t i; + uintptr_t nfds; + struct poll_ctl pc; + + assert(loop->watchers != NULL); + + events = (struct pollfd*) loop->watchers[loop->nwatchers]; + nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1]; + + if (events != NULL) + /* Invalidate events with same file descriptor */ + for (i = 0; i < nfds; i++) + if ((int) events[i].fd == fd) + events[i].fd = -1; + + /* Remove the file descriptor from the poll set */ + pc.events = 0; + pc.cmd = PS_DELETE; + pc.fd = fd; + if(loop->backend_fd >= 0) + pollset_ctl(loop->backend_fd, &pc, 1); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/android-ifaddrs.c b/lib/ESPiLight/pilight/libs/libuv/unix/android-ifaddrs.c new file mode 100644 index 0000000..30f681b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/android-ifaddrs.c @@ -0,0 +1,703 @@ +/* +Copyright (c) 2013, Kenneth MacKay +Copyright (c) 2014, Emergya (Cloud4all, FP7/2007-2013 grant agreement #289016) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "android-ifaddrs.h" +#include "uv-common.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct NetlinkList +{ + struct NetlinkList *m_next; + struct nlmsghdr *m_data; + unsigned int m_size; +} NetlinkList; + +static int netlink_socket(void) +{ + struct sockaddr_nl l_addr; + + int l_socket = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); + if(l_socket < 0) + { + return -1; + } + + memset(&l_addr, 0, sizeof(l_addr)); + l_addr.nl_family = AF_NETLINK; + if(bind(l_socket, (struct sockaddr *)&l_addr, sizeof(l_addr)) < 0) + { + close(l_socket); + return -1; + } + + return l_socket; +} + +static int netlink_send(int p_socket, int p_request) +{ + char l_buffer[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + NLMSG_ALIGN(sizeof(struct rtgenmsg))]; + + struct nlmsghdr *l_hdr; + struct rtgenmsg *l_msg; + struct sockaddr_nl l_addr; + + memset(l_buffer, 0, sizeof(l_buffer)); + + l_hdr = (struct nlmsghdr *)l_buffer; + l_msg = (struct rtgenmsg *)NLMSG_DATA(l_hdr); + + l_hdr->nlmsg_len = NLMSG_LENGTH(sizeof(*l_msg)); + l_hdr->nlmsg_type = p_request; + l_hdr->nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST; + l_hdr->nlmsg_pid = 0; + l_hdr->nlmsg_seq = p_socket; + l_msg->rtgen_family = AF_UNSPEC; + + memset(&l_addr, 0, sizeof(l_addr)); + l_addr.nl_family = AF_NETLINK; + return (sendto(p_socket, l_hdr, l_hdr->nlmsg_len, 0, (struct sockaddr *)&l_addr, sizeof(l_addr))); +} + +static int netlink_recv(int p_socket, void *p_buffer, size_t p_len) +{ + struct sockaddr_nl l_addr; + struct msghdr l_msg; + + struct iovec l_iov; + l_iov.iov_base = p_buffer; + l_iov.iov_len = p_len; + + for(;;) + { + int l_result; + l_msg.msg_name = (void *)&l_addr; + l_msg.msg_namelen = sizeof(l_addr); + l_msg.msg_iov = &l_iov; + l_msg.msg_iovlen = 1; + l_msg.msg_control = NULL; + l_msg.msg_controllen = 0; + l_msg.msg_flags = 0; + l_result = recvmsg(p_socket, &l_msg, 0); + + if(l_result < 0) + { + if(errno == EINTR) + { + continue; + } + return -2; + } + + /* Buffer was too small */ + if(l_msg.msg_flags & MSG_TRUNC) + { + return -1; + } + return l_result; + } +} + +static struct nlmsghdr *getNetlinkResponse(int p_socket, int *p_size, int *p_done) +{ + size_t l_size = 4096; + void *l_buffer = NULL; + + for(;;) + { + int l_read; + + uv__free(l_buffer); + l_buffer = uv__malloc(l_size); + if (l_buffer == NULL) + { + return NULL; + } + + l_read = netlink_recv(p_socket, l_buffer, l_size); + *p_size = l_read; + if(l_read == -2) + { + uv__free(l_buffer); + return NULL; + } + if(l_read >= 0) + { + pid_t l_pid = getpid(); + struct nlmsghdr *l_hdr; + for(l_hdr = (struct nlmsghdr *)l_buffer; NLMSG_OK(l_hdr, (unsigned int)l_read); l_hdr = (struct nlmsghdr *)NLMSG_NEXT(l_hdr, l_read)) + { + if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) + { + continue; + } + + if(l_hdr->nlmsg_type == NLMSG_DONE) + { + *p_done = 1; + break; + } + + if(l_hdr->nlmsg_type == NLMSG_ERROR) + { + uv__free(l_buffer); + return NULL; + } + } + return l_buffer; + } + + l_size *= 2; + } +} + +static NetlinkList *newListItem(struct nlmsghdr *p_data, unsigned int p_size) +{ + NetlinkList *l_item = uv__malloc(sizeof(NetlinkList)); + if (l_item == NULL) + { + return NULL; + } + + l_item->m_next = NULL; + l_item->m_data = p_data; + l_item->m_size = p_size; + return l_item; +} + +static void freeResultList(NetlinkList *p_list) +{ + NetlinkList *l_cur; + while(p_list) + { + l_cur = p_list; + p_list = p_list->m_next; + uv__free(l_cur->m_data); + uv__free(l_cur); + } +} + +static NetlinkList *getResultList(int p_socket, int p_request) +{ + int l_size; + int l_done; + NetlinkList *l_list; + NetlinkList *l_end; + + if(netlink_send(p_socket, p_request) < 0) + { + return NULL; + } + + l_list = NULL; + l_end = NULL; + + l_done = 0; + while(!l_done) + { + NetlinkList *l_item; + + struct nlmsghdr *l_hdr = getNetlinkResponse(p_socket, &l_size, &l_done); + /* Error */ + if(!l_hdr) + { + freeResultList(l_list); + return NULL; + } + + l_item = newListItem(l_hdr, l_size); + if (!l_item) + { + freeResultList(l_list); + return NULL; + } + if(!l_list) + { + l_list = l_item; + } + else + { + l_end->m_next = l_item; + } + l_end = l_item; + } + return l_list; +} + +static size_t maxSize(size_t a, size_t b) +{ + return (a > b ? a : b); +} + +static size_t calcAddrLen(sa_family_t p_family, int p_dataSize) +{ + switch(p_family) + { + case AF_INET: + return sizeof(struct sockaddr_in); + case AF_INET6: + return sizeof(struct sockaddr_in6); + case AF_PACKET: + return maxSize(sizeof(struct sockaddr_ll), offsetof(struct sockaddr_ll, sll_addr) + p_dataSize); + default: + return maxSize(sizeof(struct sockaddr), offsetof(struct sockaddr, sa_data) + p_dataSize); + } +} + +static void makeSockaddr(sa_family_t p_family, struct sockaddr *p_dest, void *p_data, size_t p_size) +{ + switch(p_family) + { + case AF_INET: + memcpy(&((struct sockaddr_in*)p_dest)->sin_addr, p_data, p_size); + break; + case AF_INET6: + memcpy(&((struct sockaddr_in6*)p_dest)->sin6_addr, p_data, p_size); + break; + case AF_PACKET: + memcpy(((struct sockaddr_ll*)p_dest)->sll_addr, p_data, p_size); + ((struct sockaddr_ll*)p_dest)->sll_halen = p_size; + break; + default: + memcpy(p_dest->sa_data, p_data, p_size); + break; + } + p_dest->sa_family = p_family; +} + +static void addToEnd(struct ifaddrs **p_resultList, struct ifaddrs *p_entry) +{ + if(!*p_resultList) + { + *p_resultList = p_entry; + } + else + { + struct ifaddrs *l_cur = *p_resultList; + while(l_cur->ifa_next) + { + l_cur = l_cur->ifa_next; + } + l_cur->ifa_next = p_entry; + } +} + +static int interpretLink(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList) +{ + struct ifaddrs *l_entry; + + char *l_index; + char *l_name; + char *l_addr; + char *l_data; + + struct ifinfomsg *l_info = (struct ifinfomsg *)NLMSG_DATA(p_hdr); + + size_t l_nameSize = 0; + size_t l_addrSize = 0; + size_t l_dataSize = 0; + + size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg)); + struct rtattr *l_rta; + for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) + { + size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); + switch(l_rta->rta_type) + { + case IFLA_ADDRESS: + case IFLA_BROADCAST: + l_addrSize += NLMSG_ALIGN(calcAddrLen(AF_PACKET, l_rtaDataSize)); + break; + case IFLA_IFNAME: + l_nameSize += NLMSG_ALIGN(l_rtaSize + 1); + break; + case IFLA_STATS: + l_dataSize += NLMSG_ALIGN(l_rtaSize); + break; + default: + break; + } + } + + l_entry = uv__malloc(sizeof(struct ifaddrs) + sizeof(int) + l_nameSize + l_addrSize + l_dataSize); + if (l_entry == NULL) + { + return -1; + } + memset(l_entry, 0, sizeof(struct ifaddrs)); + l_entry->ifa_name = ""; + + l_index = ((char *)l_entry) + sizeof(struct ifaddrs); + l_name = l_index + sizeof(int); + l_addr = l_name + l_nameSize; + l_data = l_addr + l_addrSize; + + /* Save the interface index so we can look it up when handling the + * addresses. + */ + memcpy(l_index, &l_info->ifi_index, sizeof(int)); + + l_entry->ifa_flags = l_info->ifi_flags; + + l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifinfomsg)); + for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) + { + void *l_rtaData = RTA_DATA(l_rta); + size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); + switch(l_rta->rta_type) + { + case IFLA_ADDRESS: + case IFLA_BROADCAST: + { + size_t l_addrLen = calcAddrLen(AF_PACKET, l_rtaDataSize); + makeSockaddr(AF_PACKET, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize); + ((struct sockaddr_ll *)l_addr)->sll_ifindex = l_info->ifi_index; + ((struct sockaddr_ll *)l_addr)->sll_hatype = l_info->ifi_type; + if(l_rta->rta_type == IFLA_ADDRESS) + { + l_entry->ifa_addr = (struct sockaddr *)l_addr; + } + else + { + l_entry->ifa_broadaddr = (struct sockaddr *)l_addr; + } + l_addr += NLMSG_ALIGN(l_addrLen); + break; + } + case IFLA_IFNAME: + strncpy(l_name, l_rtaData, l_rtaDataSize); + l_name[l_rtaDataSize] = '\0'; + l_entry->ifa_name = l_name; + break; + case IFLA_STATS: + memcpy(l_data, l_rtaData, l_rtaDataSize); + l_entry->ifa_data = l_data; + break; + default: + break; + } + } + + addToEnd(p_resultList, l_entry); + return 0; +} + +static struct ifaddrs *findInterface(int p_index, struct ifaddrs **p_links, int p_numLinks) +{ + int l_num = 0; + struct ifaddrs *l_cur = *p_links; + while(l_cur && l_num < p_numLinks) + { + char *l_indexPtr = ((char *)l_cur) + sizeof(struct ifaddrs); + int l_index; + memcpy(&l_index, l_indexPtr, sizeof(int)); + if(l_index == p_index) + { + return l_cur; + } + + l_cur = l_cur->ifa_next; + ++l_num; + } + return NULL; +} + +static int interpretAddr(struct nlmsghdr *p_hdr, struct ifaddrs **p_resultList, int p_numLinks) +{ + struct ifaddrmsg *l_info = (struct ifaddrmsg *)NLMSG_DATA(p_hdr); + struct ifaddrs *l_interface = findInterface(l_info->ifa_index, p_resultList, p_numLinks); + + size_t l_nameSize = 0; + size_t l_addrSize = 0; + + int l_addedNetmask = 0; + + size_t l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg)); + struct rtattr *l_rta; + struct ifaddrs *l_entry; + + char *l_name; + char *l_addr; + + for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) + { + size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); + if(l_info->ifa_family == AF_PACKET) + { + continue; + } + + switch(l_rta->rta_type) + { + case IFA_ADDRESS: + case IFA_LOCAL: + if((l_info->ifa_family == AF_INET || l_info->ifa_family == AF_INET6) && !l_addedNetmask) + { + /* Make room for netmask */ + l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize)); + l_addedNetmask = 1; + } + case IFA_BROADCAST: + l_addrSize += NLMSG_ALIGN(calcAddrLen(l_info->ifa_family, l_rtaDataSize)); + break; + case IFA_LABEL: + l_nameSize += NLMSG_ALIGN(l_rtaSize + 1); + break; + default: + break; + } + } + + l_entry = uv__malloc(sizeof(struct ifaddrs) + l_nameSize + l_addrSize); + if (l_entry == NULL) + { + return -1; + } + memset(l_entry, 0, sizeof(struct ifaddrs)); + l_entry->ifa_name = (l_interface ? l_interface->ifa_name : ""); + + l_name = ((char *)l_entry) + sizeof(struct ifaddrs); + l_addr = l_name + l_nameSize; + + l_entry->ifa_flags = l_info->ifa_flags; + if(l_interface) + { + l_entry->ifa_flags |= l_interface->ifa_flags; + } + + l_rtaSize = NLMSG_PAYLOAD(p_hdr, sizeof(struct ifaddrmsg)); + for(l_rta = IFLA_RTA(l_info); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize)) + { + void *l_rtaData = RTA_DATA(l_rta); + size_t l_rtaDataSize = RTA_PAYLOAD(l_rta); + switch(l_rta->rta_type) + { + case IFA_ADDRESS: + case IFA_BROADCAST: + case IFA_LOCAL: + { + size_t l_addrLen = calcAddrLen(l_info->ifa_family, l_rtaDataSize); + makeSockaddr(l_info->ifa_family, (struct sockaddr *)l_addr, l_rtaData, l_rtaDataSize); + if(l_info->ifa_family == AF_INET6) + { + if(IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)l_rtaData) || IN6_IS_ADDR_MC_LINKLOCAL((struct in6_addr *)l_rtaData)) + { + ((struct sockaddr_in6 *)l_addr)->sin6_scope_id = l_info->ifa_index; + } + } + + /* Apparently in a point-to-point network IFA_ADDRESS contains + * the dest address and IFA_LOCAL contains the local address + */ + if(l_rta->rta_type == IFA_ADDRESS) + { + if(l_entry->ifa_addr) + { + l_entry->ifa_dstaddr = (struct sockaddr *)l_addr; + } + else + { + l_entry->ifa_addr = (struct sockaddr *)l_addr; + } + } + else if(l_rta->rta_type == IFA_LOCAL) + { + if(l_entry->ifa_addr) + { + l_entry->ifa_dstaddr = l_entry->ifa_addr; + } + l_entry->ifa_addr = (struct sockaddr *)l_addr; + } + else + { + l_entry->ifa_broadaddr = (struct sockaddr *)l_addr; + } + l_addr += NLMSG_ALIGN(l_addrLen); + break; + } + case IFA_LABEL: + strncpy(l_name, l_rtaData, l_rtaDataSize); + l_name[l_rtaDataSize] = '\0'; + l_entry->ifa_name = l_name; + break; + default: + break; + } + } + + if(l_entry->ifa_addr && (l_entry->ifa_addr->sa_family == AF_INET || l_entry->ifa_addr->sa_family == AF_INET6)) + { + unsigned l_maxPrefix = (l_entry->ifa_addr->sa_family == AF_INET ? 32 : 128); + unsigned l_prefix = (l_info->ifa_prefixlen > l_maxPrefix ? l_maxPrefix : l_info->ifa_prefixlen); + char l_mask[16] = {0}; + unsigned i; + for(i=0; i<(l_prefix/8); ++i) + { + l_mask[i] = 0xff; + } + if(l_prefix % 8) + { + l_mask[i] = 0xff << (8 - (l_prefix % 8)); + } + + makeSockaddr(l_entry->ifa_addr->sa_family, (struct sockaddr *)l_addr, l_mask, l_maxPrefix / 8); + l_entry->ifa_netmask = (struct sockaddr *)l_addr; + } + + addToEnd(p_resultList, l_entry); + return 0; +} + +static int interpretLinks(int p_socket, NetlinkList *p_netlinkList, struct ifaddrs **p_resultList) +{ + + int l_numLinks = 0; + pid_t l_pid = getpid(); + for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next) + { + unsigned int l_nlsize = p_netlinkList->m_size; + struct nlmsghdr *l_hdr; + for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize)) + { + if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) + { + continue; + } + + if(l_hdr->nlmsg_type == NLMSG_DONE) + { + break; + } + + if(l_hdr->nlmsg_type == RTM_NEWLINK) + { + if(interpretLink(l_hdr, p_resultList) == -1) + { + return -1; + } + ++l_numLinks; + } + } + } + return l_numLinks; +} + +static int interpretAddrs(int p_socket, NetlinkList *p_netlinkList, struct ifaddrs **p_resultList, int p_numLinks) +{ + pid_t l_pid = getpid(); + for(; p_netlinkList; p_netlinkList = p_netlinkList->m_next) + { + unsigned int l_nlsize = p_netlinkList->m_size; + struct nlmsghdr *l_hdr; + for(l_hdr = p_netlinkList->m_data; NLMSG_OK(l_hdr, l_nlsize); l_hdr = NLMSG_NEXT(l_hdr, l_nlsize)) + { + if((pid_t)l_hdr->nlmsg_pid != l_pid || (int)l_hdr->nlmsg_seq != p_socket) + { + continue; + } + + if(l_hdr->nlmsg_type == NLMSG_DONE) + { + break; + } + + if(l_hdr->nlmsg_type == RTM_NEWADDR) + { + if (interpretAddr(l_hdr, p_resultList, p_numLinks) == -1) + { + return -1; + } + } + } + } + return 0; +} + +int getifaddrs(struct ifaddrs **ifap) +{ + int l_socket; + int l_result; + int l_numLinks; + NetlinkList *l_linkResults; + NetlinkList *l_addrResults; + + if(!ifap) + { + return -1; + } + *ifap = NULL; + + l_socket = netlink_socket(); + if(l_socket < 0) + { + return -1; + } + + l_linkResults = getResultList(l_socket, RTM_GETLINK); + if(!l_linkResults) + { + close(l_socket); + return -1; + } + + l_addrResults = getResultList(l_socket, RTM_GETADDR); + if(!l_addrResults) + { + close(l_socket); + freeResultList(l_linkResults); + return -1; + } + + l_result = 0; + l_numLinks = interpretLinks(l_socket, l_linkResults, ifap); + if(l_numLinks == -1 || interpretAddrs(l_socket, l_addrResults, ifap, l_numLinks) == -1) + { + l_result = -1; + } + + freeResultList(l_linkResults); + freeResultList(l_addrResults); + close(l_socket); + return l_result; +} + +void freeifaddrs(struct ifaddrs *ifa) +{ + struct ifaddrs *l_cur; + while(ifa) + { + l_cur = ifa; + ifa = ifa->ifa_next; + uv__free(l_cur); + } +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/async.c b/lib/ESPiLight/pilight/libs/libuv/unix/async.c new file mode 100644 index 0000000..45c088e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/async.c @@ -0,0 +1,269 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* This file contains both the uv__async internal infrastructure and the + * user-facing uv_async_t functions. + */ + +#include "uv.h" +#include "internal.h" +#include "atomic-ops.h" + +#include +#include /* snprintf() */ +#include +#include +#include +#include + +static void uv__async_send(uv_loop_t* loop); +static int uv__async_start(uv_loop_t* loop); +static int uv__async_eventfd(void); + + +int uv_async_init(uv_loop_t* loop, uv_async_t* handle, uv_async_cb async_cb) { + int err; + + err = uv__async_start(loop); + if (err) + return err; + + uv__handle_init(loop, (uv_handle_t*)handle, UV_ASYNC); + handle->async_cb = async_cb; + handle->pending = 0; + + QUEUE_INSERT_TAIL(&loop->async_handles, &handle->queue); + uv__handle_start(handle); + + return 0; +} + + +int uv_async_send(uv_async_t* handle) { + /* Do a cheap read first. */ + if (ACCESS_ONCE(int, handle->pending) != 0) + return 0; + + if (cmpxchgi(&handle->pending, 0, 1) == 0) + uv__async_send(handle->loop); + + return 0; +} + + +void uv__async_close(uv_async_t* handle) { + QUEUE_REMOVE(&handle->queue); + uv__handle_stop(handle); +} + + +static void uv__async_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { + char buf[1024]; + ssize_t r; + QUEUE queue; + QUEUE* q; + uv_async_t* h; + + assert(w == &loop->async_io_watcher); + + for (;;) { + r = read(w->fd, buf, sizeof(buf)); + + if (r == sizeof(buf)) + continue; + + if (r != -1) + break; + + if (errno == EAGAIN || errno == EWOULDBLOCK) + break; + + if (errno == EINTR) + continue; + + abort(); + } + + QUEUE_MOVE(&loop->async_handles, &queue); + while (!QUEUE_EMPTY(&queue)) { + q = QUEUE_HEAD(&queue); + h = QUEUE_DATA(q, uv_async_t, queue); + + QUEUE_REMOVE(q); + QUEUE_INSERT_TAIL(&loop->async_handles, q); + + if (cmpxchgi(&h->pending, 1, 0) == 0) + continue; + + if (h->async_cb == NULL) + continue; + + h->async_cb(h); + } +} + + +static void uv__async_send(uv_loop_t* loop) { + const void* buf; + ssize_t len; + int fd; + int r; + + buf = ""; + len = 1; + fd = loop->async_wfd; + +#if defined(__linux__) + if (fd == -1) { + static const uint64_t val = 1; + buf = &val; + len = sizeof(val); + fd = loop->async_io_watcher.fd; /* eventfd */ + } +#endif + + do + r = write(fd, buf, len); + while (r == -1 && errno == EINTR); + + if (r == len) + return; + + if (r == -1) + if (errno == EAGAIN || errno == EWOULDBLOCK) + return; + + abort(); +} + + +static int uv__async_start(uv_loop_t* loop) { + int pipefd[2]; + int err; + + if (loop->async_io_watcher.fd != -1) + return 0; + + err = uv__async_eventfd(); + if (err >= 0) { + pipefd[0] = err; + pipefd[1] = -1; + } + else if (err == -ENOSYS) { + err = uv__make_pipe(pipefd, UV__F_NONBLOCK); +#if defined(__linux__) + /* Save a file descriptor by opening one of the pipe descriptors as + * read/write through the procfs. That file descriptor can then + * function as both ends of the pipe. + */ + if (err == 0) { + char buf[32]; + int fd; + + snprintf(buf, sizeof(buf), "/proc/self/fd/%d", pipefd[0]); + fd = uv__open_cloexec(buf, O_RDWR); + if (fd >= 0) { + uv__close(pipefd[0]); + uv__close(pipefd[1]); + pipefd[0] = fd; + pipefd[1] = fd; + } + } +#endif + } + + if (err < 0) + return err; + + uv__io_init(&loop->async_io_watcher, uv__async_io, pipefd[0]); + uv__io_start(loop, &loop->async_io_watcher, POLLIN); + loop->async_wfd = pipefd[1]; + + return 0; +} + + +int uv__async_fork(uv_loop_t* loop) { + if (loop->async_io_watcher.fd == -1) /* never started */ + return 0; + + uv__async_stop(loop); + + return uv__async_start(loop); +} + + +void uv__async_stop(uv_loop_t* loop) { + if (loop->async_io_watcher.fd == -1) + return; + + if (loop->async_wfd != -1) { + if (loop->async_wfd != loop->async_io_watcher.fd) + uv__close(loop->async_wfd); + loop->async_wfd = -1; + } + + uv__io_stop(loop, &loop->async_io_watcher, POLLIN); + uv__close(loop->async_io_watcher.fd); + loop->async_io_watcher.fd = -1; +} + + +static int uv__async_eventfd(void) { +#if defined(__linux__) + static int no_eventfd2; + static int no_eventfd; + int fd; + + if (no_eventfd2) + goto skip_eventfd2; + + fd = uv__eventfd2(0, UV__EFD_CLOEXEC | UV__EFD_NONBLOCK); + if (fd != -1) + return fd; + + if (errno != ENOSYS) + return -errno; + + no_eventfd2 = 1; + +skip_eventfd2: + + if (no_eventfd) + goto skip_eventfd; + + fd = uv__eventfd(0); + if (fd != -1) { + uv__cloexec(fd, 1); + uv__nonblock(fd, 1); + return fd; + } + + if (errno != ENOSYS) + return -errno; + + no_eventfd = 1; + +skip_eventfd: + +#endif + + return -ENOSYS; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/atomic-ops.h b/lib/ESPiLight/pilight/libs/libuv/unix/atomic-ops.h new file mode 100644 index 0000000..9dac255 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/atomic-ops.h @@ -0,0 +1,97 @@ +/* Copyright (c) 2013, Ben Noordhuis + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef UV_ATOMIC_OPS_H_ +#define UV_ATOMIC_OPS_H_ + +#include "internal.h" /* UV_UNUSED */ + +#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) +#include +#define __sync_val_compare_and_swap(p, o, n) atomic_cas_ptr(p, o, n) +#endif + +UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval)); +UV_UNUSED(static long cmpxchgl(long* ptr, long oldval, long newval)); +UV_UNUSED(static void cpu_relax(void)); + +/* Prefer hand-rolled assembly over the gcc builtins because the latter also + * issue full memory barriers. + */ +UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval)) { +#if defined(__i386__) || defined(__x86_64__) + int out; + __asm__ __volatile__ ("lock; cmpxchg %2, %1;" + : "=a" (out), "+m" (*(volatile int*) ptr) + : "r" (newval), "0" (oldval) + : "memory"); + return out; +#elif defined(_AIX) && defined(__xlC__) + const int out = (*(volatile int*) ptr); + __compare_and_swap(ptr, &oldval, newval); + return out; +#elif defined(__MVS__) + unsigned int op4; + if (__plo_CSST(ptr, (unsigned int*) &oldval, newval, + (unsigned int*) ptr, *ptr, &op4)) + return oldval; + else + return op4; +#else + return __sync_val_compare_and_swap(ptr, oldval, newval); +#endif +} + +UV_UNUSED(static long cmpxchgl(long* ptr, long oldval, long newval)) { +#if defined(__i386__) || defined(__x86_64__) + long out; + __asm__ __volatile__ ("lock; cmpxchg %2, %1;" + : "=a" (out), "+m" (*(volatile long*) ptr) + : "r" (newval), "0" (oldval) + : "memory"); + return out; +#elif defined(_AIX) && defined(__xlC__) + const long out = (*(volatile int*) ptr); +# if defined(__64BIT__) + __compare_and_swaplp(ptr, &oldval, newval); +# else + __compare_and_swap(ptr, &oldval, newval); +# endif /* if defined(__64BIT__) */ + return out; +#elif defined (__MVS__) +#ifdef _LP64 + unsigned long long op4; + if (__plo_CSSTGR(ptr, (unsigned long long*) &oldval, newval, + (unsigned long long*) ptr, *ptr, &op4)) +#else + unsigned long op4; + if (__plo_CSST(ptr, (unsigned int*) &oldval, newval, + (unsigned int*) ptr, *ptr, &op4)) +#endif + return oldval; + else + return op4; +#else + return __sync_val_compare_and_swap(ptr, oldval, newval); +#endif +} + +UV_UNUSED(static void cpu_relax(void)) { +#if defined(__i386__) || defined(__x86_64__) + __asm__ __volatile__ ("rep; nop"); /* a.k.a. PAUSE */ +#endif +} + +#endif /* UV_ATOMIC_OPS_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/bsd-ifaddrs.c b/lib/ESPiLight/pilight/libs/libuv/unix/bsd-ifaddrs.c new file mode 100644 index 0000000..ffcf156 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/bsd-ifaddrs.c @@ -0,0 +1,146 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include + +#include +#include +#if !defined(__CYGWIN__) && !defined(__MSYS__) +#include +#endif + +static int uv__ifaddr_exclude(struct ifaddrs *ent, int exclude_type) { + if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING))) + return 1; + if (ent->ifa_addr == NULL) + return 1; + /* + * If `exclude_type` is `UV__EXCLUDE_IFPHYS`, just see whether `sa_family` + * equals to `AF_LINK` or not. Otherwise, the result depends on the operation + * system with `AF_LINK` or `PF_INET`. + */ + if (exclude_type == UV__EXCLUDE_IFPHYS) + return (ent->ifa_addr->sa_family != AF_LINK); +#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__) + /* + * On BSD getifaddrs returns information related to the raw underlying + * devices. We're not interested in this information. + */ + if (ent->ifa_addr->sa_family == AF_LINK) + return 1; +#elif defined(__NetBSD__) || defined(__OpenBSD__) + if (ent->ifa_addr->sa_family != PF_INET) + return 1; +#endif + return 0; +} + +int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { + struct ifaddrs* addrs; + struct ifaddrs* ent; + uv_interface_address_t* address; + int i; + + if (getifaddrs(&addrs) != 0) + return -errno; + + *count = 0; + + /* Count the number of interfaces */ + for (ent = addrs; ent != NULL; ent = ent->ifa_next) { + if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFADDR)) + continue; + (*count)++; + } + + *addresses = uv__malloc(*count * sizeof(**addresses)); + + if (*addresses == NULL) { + freeifaddrs(addrs); + return -ENOMEM; + } + + address = *addresses; + + for (ent = addrs; ent != NULL; ent = ent->ifa_next) { + if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFADDR)) + continue; + + address->name = uv__strdup(ent->ifa_name); + + if (ent->ifa_addr->sa_family == AF_INET6) { + address->address.address6 = *((struct sockaddr_in6*) ent->ifa_addr); + } else { + address->address.address4 = *((struct sockaddr_in*) ent->ifa_addr); + } + + if (ent->ifa_netmask->sa_family == AF_INET6) { + address->netmask.netmask6 = *((struct sockaddr_in6*) ent->ifa_netmask); + } else { + address->netmask.netmask4 = *((struct sockaddr_in*) ent->ifa_netmask); + } + + address->is_internal = !!(ent->ifa_flags & IFF_LOOPBACK); + + address++; + } + + /* Fill in physical addresses for each interface */ + for (ent = addrs; ent != NULL; ent = ent->ifa_next) { + if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFPHYS)) + continue; + + address = *addresses; + + for (i = 0; i < *count; i++) { + if (strcmp(address->name, ent->ifa_name) == 0) { +#if defined(__CYGWIN__) || defined(__MSYS__) + memset(address->phys_addr, 0, sizeof(address->phys_addr)); +#else + struct sockaddr_dl* sa_addr; + sa_addr = (struct sockaddr_dl*)(ent->ifa_addr); + memcpy(address->phys_addr, LLADDR(sa_addr), sizeof(address->phys_addr)); +#endif + } + address++; + } + } + + freeifaddrs(addrs); + + return 0; +} + + +void uv_free_interface_addresses(uv_interface_address_t* addresses, + int count) { + int i; + + for (i = 0; i < count; i++) { + uv__free(addresses[i].name); + } + + uv__free(addresses); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/core.c b/lib/ESPiLight/pilight/libs/libuv/unix/core.c new file mode 100644 index 0000000..07a1c19 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/core.c @@ -0,0 +1,1334 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include /* NULL */ +#include /* printf */ +#include +#include /* strerror */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* INT_MAX, PATH_MAX, IOV_MAX */ +#include /* writev */ +#include /* getrusage */ +#include + +#ifdef __sun +# include /* MAXHOSTNAMELEN on Solaris */ +# include +# include +# include +#endif + +#ifdef __APPLE__ +# include /* _NSGetExecutablePath */ +# include +# if defined(O_CLOEXEC) +# define UV__O_CLOEXEC O_CLOEXEC +# endif +#endif + +#if defined(__DragonFly__) || \ + defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) +# include +# include +# include +# define UV__O_CLOEXEC O_CLOEXEC +# if defined(__FreeBSD__) && __FreeBSD__ >= 10 +# define uv__accept4 accept4 +# define UV__SOCK_NONBLOCK SOCK_NONBLOCK +# define UV__SOCK_CLOEXEC SOCK_CLOEXEC +# endif +# if !defined(F_DUP2FD_CLOEXEC) && defined(_F_DUP2FD_CLOEXEC) +# define F_DUP2FD_CLOEXEC _F_DUP2FD_CLOEXEC +# endif +#endif + +#if defined(__ANDROID_API__) && __ANDROID_API__ < 21 +# include /* for dlsym */ +#endif + +#if defined(__MVS__) +#include +#endif + +#if !defined(__MVS__) +#include /* MAXHOSTNAMELEN on Linux and the BSDs */ +#endif + +/* Fallback for the maximum hostname length */ +#ifndef MAXHOSTNAMELEN +# define MAXHOSTNAMELEN 256 +#endif + +static int uv__run_pending(uv_loop_t* loop); + +/* Verify that uv_buf_t is ABI-compatible with struct iovec. */ +STATIC_ASSERT(sizeof(uv_buf_t) == sizeof(struct iovec)); +STATIC_ASSERT(sizeof(&((uv_buf_t*) 0)->base) == + sizeof(((struct iovec*) 0)->iov_base)); +STATIC_ASSERT(sizeof(&((uv_buf_t*) 0)->len) == + sizeof(((struct iovec*) 0)->iov_len)); +STATIC_ASSERT(offsetof(uv_buf_t, base) == offsetof(struct iovec, iov_base)); +STATIC_ASSERT(offsetof(uv_buf_t, len) == offsetof(struct iovec, iov_len)); + + +uint64_t uv_hrtime(void) { + return uv__hrtime(UV_CLOCK_PRECISE); +} + + +void uv_close(uv_handle_t* handle, uv_close_cb close_cb) { + assert(!uv__is_closing(handle)); + + handle->flags |= UV_CLOSING; + handle->close_cb = close_cb; + + switch (handle->type) { + case UV_NAMED_PIPE: + uv__pipe_close((uv_pipe_t*)handle); + break; + + case UV_TTY: + uv__stream_close((uv_stream_t*)handle); + break; + + case UV_TCP: + uv__tcp_close((uv_tcp_t*)handle); + break; + + case UV_UDP: + uv__udp_close((uv_udp_t*)handle); + break; + + case UV_PREPARE: + uv__prepare_close((uv_prepare_t*)handle); + break; + + case UV_CHECK: + uv__check_close((uv_check_t*)handle); + break; + + case UV_IDLE: + uv__idle_close((uv_idle_t*)handle); + break; + + case UV_ASYNC: + uv__async_close((uv_async_t*)handle); + break; + + case UV_TIMER: + uv__timer_close((uv_timer_t*)handle); + break; + + case UV_PROCESS: + uv__process_close((uv_process_t*)handle); + break; + + case UV_FS_EVENT: + uv__fs_event_close((uv_fs_event_t*)handle); + break; + + case UV_POLL: + uv__poll_close((uv_poll_t*)handle); + break; + + case UV_FS_POLL: + uv__fs_poll_close((uv_fs_poll_t*)handle); + break; + + case UV_SIGNAL: + uv__signal_close((uv_signal_t*) handle); + /* Signal handles may not be closed immediately. The signal code will */ + /* itself close uv__make_close_pending whenever appropriate. */ + return; + + default: + assert(0); + } + + uv__make_close_pending(handle); +} + +int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value) { + int r; + int fd; + socklen_t len; + + if (handle == NULL || value == NULL) + return -EINVAL; + + if (handle->type == UV_TCP || handle->type == UV_NAMED_PIPE) + fd = uv__stream_fd((uv_stream_t*) handle); + else if (handle->type == UV_UDP) + fd = ((uv_udp_t *) handle)->io_watcher.fd; + else + return -ENOTSUP; + + len = sizeof(*value); + + if (*value == 0) + r = getsockopt(fd, SOL_SOCKET, optname, value, &len); + else + r = setsockopt(fd, SOL_SOCKET, optname, (const void*) value, len); + + if (r < 0) + return -errno; + + return 0; +} + +void uv__make_close_pending(uv_handle_t* handle) { + assert(handle->flags & UV_CLOSING); + assert(!(handle->flags & UV_CLOSED)); + handle->next_closing = handle->loop->closing_handles; + handle->loop->closing_handles = handle; +} + +int uv__getiovmax(void) { +#if defined(IOV_MAX) + return IOV_MAX; +#elif defined(_SC_IOV_MAX) + static int iovmax = -1; + if (iovmax == -1) { + iovmax = sysconf(_SC_IOV_MAX); + /* On some embedded devices (arm-linux-uclibc based ip camera), + * sysconf(_SC_IOV_MAX) can not get the correct value. The return + * value is -1 and the errno is EINPROGRESS. Degrade the value to 1. + */ + if (iovmax == -1) iovmax = 1; + } + return iovmax; +#else + return 1024; +#endif +} + + +static void uv__finish_close(uv_handle_t* handle) { + /* Note: while the handle is in the UV_CLOSING state now, it's still possible + * for it to be active in the sense that uv__is_active() returns true. + * A good example is when the user calls uv_shutdown(), immediately followed + * by uv_close(). The handle is considered active at this point because the + * completion of the shutdown req is still pending. + */ + assert(handle->flags & UV_CLOSING); + assert(!(handle->flags & UV_CLOSED)); + handle->flags |= UV_CLOSED; + + switch (handle->type) { + case UV_PREPARE: + case UV_CHECK: + case UV_IDLE: + case UV_ASYNC: + case UV_TIMER: + case UV_PROCESS: + case UV_FS_EVENT: + case UV_FS_POLL: + case UV_POLL: + case UV_SIGNAL: + break; + + case UV_NAMED_PIPE: + case UV_TCP: + case UV_TTY: + uv__stream_destroy((uv_stream_t*)handle); + break; + + case UV_UDP: + uv__udp_finish_close((uv_udp_t*)handle); + break; + + default: + assert(0); + break; + } + + uv__handle_unref(handle); + QUEUE_REMOVE(&handle->handle_queue); + + if (handle->close_cb) { + handle->close_cb(handle); + } +} + + +static void uv__run_closing_handles(uv_loop_t* loop) { + uv_handle_t* p; + uv_handle_t* q; + + p = loop->closing_handles; + loop->closing_handles = NULL; + + while (p) { + q = p->next_closing; + uv__finish_close(p); + p = q; + } +} + + +int uv_is_closing(const uv_handle_t* handle) { + return uv__is_closing(handle); +} + + +int uv_backend_fd(const uv_loop_t* loop) { + return loop->backend_fd; +} + + +int uv_backend_timeout(const uv_loop_t* loop) { + if (loop->stop_flag != 0) + return 0; + + if (!uv__has_active_handles(loop) && !uv__has_active_reqs(loop)) + return 0; + + if (!QUEUE_EMPTY(&loop->idle_handles)) + return 0; + + if (!QUEUE_EMPTY(&loop->pending_queue)) + return 0; + + if (loop->closing_handles) + return 0; + + return uv__next_timeout(loop); +} + + +static int uv__loop_alive(const uv_loop_t* loop) { + return uv__has_active_handles(loop) || + uv__has_active_reqs(loop) || + loop->closing_handles != NULL; +} + + +int uv_loop_alive(const uv_loop_t* loop) { + return uv__loop_alive(loop); +} + + +int uv_run(uv_loop_t* loop, uv_run_mode mode) { + int timeout; + int r; + int ran_pending; + + r = uv__loop_alive(loop); + if (!r) + uv__update_time(loop); + + while (r != 0 && loop->stop_flag == 0) { + uv__update_time(loop); + uv__run_timers(loop); + ran_pending = uv__run_pending(loop); + uv__run_idle(loop); + uv__run_prepare(loop); + + timeout = 0; + if ((mode == UV_RUN_ONCE && !ran_pending) || mode == UV_RUN_DEFAULT) + timeout = uv_backend_timeout(loop); + + uv__io_poll(loop, timeout); + uv__run_check(loop); + uv__run_closing_handles(loop); + + if (mode == UV_RUN_ONCE) { + /* UV_RUN_ONCE implies forward progress: at least one callback must have + * been invoked when it returns. uv__io_poll() can return without doing + * I/O (meaning: no callbacks) when its timeout expires - which means we + * have pending timers that satisfy the forward progress constraint. + * + * UV_RUN_NOWAIT makes no guarantees about progress so it's omitted from + * the check. + */ + uv__update_time(loop); + uv__run_timers(loop); + } + + r = uv__loop_alive(loop); + if (mode == UV_RUN_ONCE || mode == UV_RUN_NOWAIT) + break; + } + + /* The if statement lets gcc compile it to a conditional store. Avoids + * dirtying a cache line. + */ + if (loop->stop_flag != 0) + loop->stop_flag = 0; + + return r; +} + + +void uv_update_time(uv_loop_t* loop) { + uv__update_time(loop); +} + + +int uv_is_active(const uv_handle_t* handle) { + return uv__is_active(handle); +} + + +/* Open a socket in non-blocking close-on-exec mode, atomically if possible. */ +int uv__socket(int domain, int type, int protocol) { + int sockfd; + int err; + +#if defined(SOCK_NONBLOCK) && defined(SOCK_CLOEXEC) + sockfd = socket(domain, type | SOCK_NONBLOCK | SOCK_CLOEXEC, protocol); + if (sockfd != -1) + return sockfd; + + if (errno != EINVAL) + return -errno; +#endif + + sockfd = socket(domain, type, protocol); + if (sockfd == -1) + return -errno; + + err = uv__nonblock(sockfd, 1); + if (err == 0) + err = uv__cloexec(sockfd, 1); + + if (err) { + uv__close(sockfd); + return err; + } + +#if defined(SO_NOSIGPIPE) + { + int on = 1; + setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on)); + } +#endif + + return sockfd; +} + +/* get a file pointer to a file in read-only and close-on-exec mode */ +FILE* uv__open_file(const char* path) { + int fd; + FILE* fp; + + fd = uv__open_cloexec(path, O_RDONLY); + if (fd < 0) + return NULL; + + fp = fdopen(fd, "r"); + if (fp == NULL) + uv__close(fd); + + return fp; +} + + +int uv__accept(int sockfd) { + int peerfd; + int err; + + assert(sockfd >= 0); + + while (1) { +#if defined(__linux__) || (defined(__FreeBSD__) && __FreeBSD__ >= 10) + static int no_accept4; + + if (no_accept4) + goto skip; + + peerfd = uv__accept4(sockfd, + NULL, + NULL, + UV__SOCK_NONBLOCK|UV__SOCK_CLOEXEC); + if (peerfd != -1) + return peerfd; + + if (errno == EINTR) + continue; + + if (errno != ENOSYS) + return -errno; + + no_accept4 = 1; +skip: +#endif + + peerfd = accept(sockfd, NULL, NULL); + if (peerfd == -1) { + if (errno == EINTR) + continue; + return -errno; + } + + err = uv__cloexec(peerfd, 1); + if (err == 0) + err = uv__nonblock(peerfd, 1); + + if (err) { + uv__close(peerfd); + return err; + } + + return peerfd; + } +} + + +int uv__close_nocheckstdio(int fd) { + int saved_errno; + int rc; + + assert(fd > -1); /* Catch uninitialized io_watcher.fd bugs. */ + + saved_errno = errno; + rc = close(fd); + if (rc == -1) { + rc = -errno; + if (rc == -EINTR || rc == -EINPROGRESS) + rc = 0; /* The close is in progress, not an error. */ + errno = saved_errno; + } + + return rc; +} + + +int uv__close(int fd) { + assert(fd > STDERR_FILENO); /* Catch stdio close bugs. */ +#if defined(__MVS__) + epoll_file_close(fd); +#endif + return uv__close_nocheckstdio(fd); +} + + +int uv__nonblock_ioctl(int fd, int set) { + int r; + + do + r = ioctl(fd, FIONBIO, &set); + while (r == -1 && errno == EINTR); + + if (r) + return -errno; + + return 0; +} + + +#if !defined(__CYGWIN__) && !defined(__MSYS__) +int uv__cloexec_ioctl(int fd, int set) { + int r; + + do + r = ioctl(fd, set ? FIOCLEX : FIONCLEX); + while (r == -1 && errno == EINTR); + + if (r) + return -errno; + + return 0; +} +#endif + + +int uv__nonblock_fcntl(int fd, int set) { + int flags; + int r; + + do + r = fcntl(fd, F_GETFL); + while (r == -1 && errno == EINTR); + + if (r == -1) + return -errno; + + /* Bail out now if already set/clear. */ + if (!!(r & O_NONBLOCK) == !!set) + return 0; + + if (set) + flags = r | O_NONBLOCK; + else + flags = r & ~O_NONBLOCK; + + do + r = fcntl(fd, F_SETFL, flags); + while (r == -1 && errno == EINTR); + + if (r) + return -errno; + + return 0; +} + + +int uv__cloexec_fcntl(int fd, int set) { + int flags; + int r; + + do + r = fcntl(fd, F_GETFD); + while (r == -1 && errno == EINTR); + + if (r == -1) + return -errno; + + /* Bail out now if already set/clear. */ + if (!!(r & FD_CLOEXEC) == !!set) + return 0; + + if (set) + flags = r | FD_CLOEXEC; + else + flags = r & ~FD_CLOEXEC; + + do + r = fcntl(fd, F_SETFD, flags); + while (r == -1 && errno == EINTR); + + if (r) + return -errno; + + return 0; +} + + +/* This function is not execve-safe, there is a race window + * between the call to dup() and fcntl(FD_CLOEXEC). + */ +int uv__dup(int fd) { + int err; + + fd = dup(fd); + + if (fd == -1) + return -errno; + + err = uv__cloexec(fd, 1); + if (err) { + uv__close(fd); + return err; + } + + return fd; +} + + +ssize_t uv__recvmsg(int fd, struct msghdr* msg, int flags) { + struct cmsghdr* cmsg; + ssize_t rc; + int* pfd; + int* end; +#if defined(__linux__) + static int no_msg_cmsg_cloexec; + if (no_msg_cmsg_cloexec == 0) { + rc = recvmsg(fd, msg, flags | 0x40000000); /* MSG_CMSG_CLOEXEC */ + if (rc != -1) + return rc; + if (errno != EINVAL) + return -errno; + rc = recvmsg(fd, msg, flags); + if (rc == -1) + return -errno; + no_msg_cmsg_cloexec = 1; + } else { + rc = recvmsg(fd, msg, flags); + } +#else + rc = recvmsg(fd, msg, flags); +#endif + if (rc == -1) + return -errno; + if (msg->msg_controllen == 0) + return rc; + for (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg)) + if (cmsg->cmsg_type == SCM_RIGHTS) + for (pfd = (int*) CMSG_DATA(cmsg), + end = (int*) ((char*) cmsg + cmsg->cmsg_len); + pfd < end; + pfd += 1) + uv__cloexec(*pfd, 1); + return rc; +} + + +int uv_cwd(char* buffer, size_t* size) { + if (buffer == NULL || size == NULL) + return -EINVAL; + + if (getcwd(buffer, *size) == NULL) + return -errno; + + *size = strlen(buffer); + if (*size > 1 && buffer[*size - 1] == '/') { + buffer[*size-1] = '\0'; + (*size)--; + } + + return 0; +} + + +int uv_chdir(const char* dir) { + if (chdir(dir)) + return -errno; + + return 0; +} + + +void uv_disable_stdio_inheritance(void) { + int fd; + + /* Set the CLOEXEC flag on all open descriptors. Unconditionally try the + * first 16 file descriptors. After that, bail out after the first error. + */ + for (fd = 0; ; fd++) + if (uv__cloexec(fd, 1) && fd > 15) + break; +} + + +int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd) { + int fd_out; + + switch (handle->type) { + case UV_TCP: + case UV_NAMED_PIPE: + case UV_TTY: + fd_out = uv__stream_fd((uv_stream_t*) handle); + break; + + case UV_UDP: + fd_out = ((uv_udp_t *) handle)->io_watcher.fd; + break; + + case UV_POLL: + fd_out = ((uv_poll_t *) handle)->io_watcher.fd; + break; + + default: + return -EINVAL; + } + + if (uv__is_closing(handle) || fd_out == -1) + return -EBADF; + + *fd = fd_out; + return 0; +} + + +static int uv__run_pending(uv_loop_t* loop) { + QUEUE* q; + QUEUE pq; + uv__io_t* w; + + if (QUEUE_EMPTY(&loop->pending_queue)) + return 0; + + QUEUE_MOVE(&loop->pending_queue, &pq); + + while (!QUEUE_EMPTY(&pq)) { + q = QUEUE_HEAD(&pq); + QUEUE_REMOVE(q); + QUEUE_INIT(q); + w = QUEUE_DATA(q, uv__io_t, pending_queue); + w->cb(loop, w, POLLOUT); + } + + return 1; +} + + +static unsigned int next_power_of_two(unsigned int val) { + val -= 1; + val |= val >> 1; + val |= val >> 2; + val |= val >> 4; + val |= val >> 8; + val |= val >> 16; + val += 1; + return val; +} + +static void maybe_resize(uv_loop_t* loop, unsigned int len) { + uv__io_t** watchers; + void* fake_watcher_list; + void* fake_watcher_count; + unsigned int nwatchers; + unsigned int i; + + if (len <= loop->nwatchers) + return; + + /* Preserve fake watcher list and count at the end of the watchers */ + if (loop->watchers != NULL) { + fake_watcher_list = loop->watchers[loop->nwatchers]; + fake_watcher_count = loop->watchers[loop->nwatchers + 1]; + } else { + fake_watcher_list = NULL; + fake_watcher_count = NULL; + } + + nwatchers = next_power_of_two(len + 2) - 2; + watchers = uv__realloc(loop->watchers, + (nwatchers + 2) * sizeof(loop->watchers[0])); + + if (watchers == NULL) + abort(); + for (i = loop->nwatchers; i < nwatchers; i++) + watchers[i] = NULL; + watchers[nwatchers] = fake_watcher_list; + watchers[nwatchers + 1] = fake_watcher_count; + + loop->watchers = watchers; + loop->nwatchers = nwatchers; +} + + +void uv__io_init(uv__io_t* w, uv__io_cb cb, int fd) { + assert(cb != NULL); + assert(fd >= -1); + QUEUE_INIT(&w->pending_queue); + QUEUE_INIT(&w->watcher_queue); + w->cb = cb; + w->fd = fd; + w->events = 0; + w->pevents = 0; + +// #if defined(UV_HAVE_KQUEUE) + // w->rcount = 0; + // w->wcount = 0; +// #endif /* defined(UV_HAVE_KQUEUE) */ +} + + +void uv__io_start(uv_loop_t* loop, uv__io_t* w, unsigned int events) { + assert(0 == (events & ~(POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI))); + assert(0 != events); + assert(w->fd >= 0); + assert(w->fd < INT_MAX); + + w->pevents |= events; + maybe_resize(loop, w->fd + 1); + +#if !defined(__sun) + /* The event ports backend needs to rearm all file descriptors on each and + * every tick of the event loop but the other backends allow us to + * short-circuit here if the event mask is unchanged. + */ + if (w->events == w->pevents) + return; +#endif + + if (QUEUE_EMPTY(&w->watcher_queue)) + QUEUE_INSERT_TAIL(&loop->watcher_queue, &w->watcher_queue); + + if (loop->watchers[w->fd] == NULL) { + loop->watchers[w->fd] = w; + loop->nfds++; + } +} + + +void uv__io_stop(uv_loop_t* loop, uv__io_t* w, unsigned int events) { + assert(0 == (events & ~(POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI))); + assert(0 != events); + + if (w->fd == -1) + return; + + assert(w->fd >= 0); + + /* Happens when uv__io_stop() is called on a handle that was never started. */ + if ((unsigned) w->fd >= loop->nwatchers) + return; + + w->pevents &= ~events; + + if (w->pevents == 0) { + QUEUE_REMOVE(&w->watcher_queue); + QUEUE_INIT(&w->watcher_queue); + + if (loop->watchers[w->fd] != NULL) { + assert(loop->watchers[w->fd] == w); + assert(loop->nfds > 0); + loop->watchers[w->fd] = NULL; + loop->nfds--; + w->events = 0; + } + } + else if (QUEUE_EMPTY(&w->watcher_queue)) + QUEUE_INSERT_TAIL(&loop->watcher_queue, &w->watcher_queue); +} + + +void uv__io_close(uv_loop_t* loop, uv__io_t* w) { + uv__io_stop(loop, w, POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI); + QUEUE_REMOVE(&w->pending_queue); + + /* Remove stale events for this file descriptor */ + uv__platform_invalidate_fd(loop, w->fd); +} + + +void uv__io_feed(uv_loop_t* loop, uv__io_t* w) { + if (QUEUE_EMPTY(&w->pending_queue)) + QUEUE_INSERT_TAIL(&loop->pending_queue, &w->pending_queue); +} + + +int uv__io_active(const uv__io_t* w, unsigned int events) { + assert(0 == (events & ~(POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI))); + assert(0 != events); + return 0 != (w->pevents & events); +} + + +int uv_getrusage(uv_rusage_t* rusage) { + struct rusage usage; + + if (getrusage(RUSAGE_SELF, &usage)) + return -errno; + + rusage->ru_utime.tv_sec = usage.ru_utime.tv_sec; + rusage->ru_utime.tv_usec = usage.ru_utime.tv_usec; + + rusage->ru_stime.tv_sec = usage.ru_stime.tv_sec; + rusage->ru_stime.tv_usec = usage.ru_stime.tv_usec; + +#if !defined(__MVS__) + rusage->ru_maxrss = usage.ru_maxrss; + rusage->ru_ixrss = usage.ru_ixrss; + rusage->ru_idrss = usage.ru_idrss; + rusage->ru_isrss = usage.ru_isrss; + rusage->ru_minflt = usage.ru_minflt; + rusage->ru_majflt = usage.ru_majflt; + rusage->ru_nswap = usage.ru_nswap; + rusage->ru_inblock = usage.ru_inblock; + rusage->ru_oublock = usage.ru_oublock; + rusage->ru_msgsnd = usage.ru_msgsnd; + rusage->ru_msgrcv = usage.ru_msgrcv; + rusage->ru_nsignals = usage.ru_nsignals; + rusage->ru_nvcsw = usage.ru_nvcsw; + rusage->ru_nivcsw = usage.ru_nivcsw; +#endif + + return 0; +} + + +int uv__open_cloexec(const char* path, int flags) { + int err; + int fd; + +#if defined(UV__O_CLOEXEC) + static int no_cloexec; + + if (!no_cloexec) { + fd = open(path, flags | UV__O_CLOEXEC); + if (fd != -1) + return fd; + + if (errno != EINVAL) + return -errno; + + /* O_CLOEXEC not supported. */ + no_cloexec = 1; + } +#endif + + fd = open(path, flags); + if (fd == -1) + return -errno; + + err = uv__cloexec(fd, 1); + if (err) { + uv__close(fd); + return err; + } + + return fd; +} + + +int uv__dup2_cloexec(int oldfd, int newfd) { + int r; +#if defined(__FreeBSD__) && __FreeBSD__ >= 10 + r = dup3(oldfd, newfd, O_CLOEXEC); + if (r == -1) + return -errno; + return r; +#elif defined(__FreeBSD__) && defined(F_DUP2FD_CLOEXEC) + r = fcntl(oldfd, F_DUP2FD_CLOEXEC, newfd); + if (r != -1) + return r; + if (errno != EINVAL) + return -errno; + /* Fall through. */ +#elif defined(__linux__) + static int no_dup3; + if (!no_dup3) { + do + r = uv__dup3(oldfd, newfd, UV__O_CLOEXEC); + while (r == -1 && errno == EBUSY); + if (r != -1) + return r; + if (errno != ENOSYS) + return -errno; + /* Fall through. */ + no_dup3 = 1; + } +#endif + { + int err; + do + r = dup2(oldfd, newfd); +#if defined(__linux__) + while (r == -1 && errno == EBUSY); +#else + while (0); /* Never retry. */ +#endif + + if (r == -1) + return -errno; + + err = uv__cloexec(newfd, 1); + if (err) { + uv__close(newfd); + return err; + } + + return r; + } +} + + +int uv_os_homedir(char* buffer, size_t* size) { + uv_passwd_t pwd; + char* buf; + size_t len; + int r; + + if (buffer == NULL || size == NULL || *size == 0) + return -EINVAL; + + /* Check if the HOME environment variable is set first */ + buf = getenv("HOME"); + + if (buf != NULL) { + len = strlen(buf); + + if (len >= *size) { + *size = len + 1; + return -ENOBUFS; + } + + memcpy(buffer, buf, len + 1); + *size = len; + + return 0; + } + + /* HOME is not set, so call uv__getpwuid_r() */ + r = uv__getpwuid_r(&pwd); + + if (r != 0) { + return r; + } + + len = strlen(pwd.homedir); + + if (len >= *size) { + *size = len + 1; + uv_os_free_passwd(&pwd); + return -ENOBUFS; + } + + memcpy(buffer, pwd.homedir, len + 1); + *size = len; + uv_os_free_passwd(&pwd); + + return 0; +} + + +int uv_os_tmpdir(char* buffer, size_t* size) { + const char* buf; + size_t len; + + if (buffer == NULL || size == NULL || *size == 0) + return -EINVAL; + +#define CHECK_ENV_VAR(name) \ + do { \ + buf = getenv(name); \ + if (buf != NULL) \ + goto return_buffer; \ + } \ + while (0) + + /* Check the TMPDIR, TMP, TEMP, and TEMPDIR environment variables in order */ + CHECK_ENV_VAR("TMPDIR"); + CHECK_ENV_VAR("TMP"); + CHECK_ENV_VAR("TEMP"); + CHECK_ENV_VAR("TEMPDIR"); + +#undef CHECK_ENV_VAR + + /* No temp environment variables defined */ + #if defined(__ANDROID__) + buf = "/data/local/tmp"; + #else + buf = "/tmp"; + #endif + +return_buffer: + len = strlen(buf); + + if (len >= *size) { + *size = len + 1; + return -ENOBUFS; + } + + /* The returned directory should not have a trailing slash. */ + if (len > 1 && buf[len - 1] == '/') { + len--; + } + + memcpy(buffer, buf, len + 1); + buffer[len] = '\0'; + *size = len; + + return 0; +} + + +int uv__getpwuid_r(uv_passwd_t* pwd) { + struct passwd pw; + struct passwd* result; + char* buf; + uid_t uid; + size_t bufsize; + size_t name_size; + size_t homedir_size; + size_t shell_size; + long initsize; + int r; +#if defined(__ANDROID_API__) && __ANDROID_API__ < 21 + int (*getpwuid_r)(uid_t, struct passwd*, char*, size_t, struct passwd**); + + getpwuid_r = dlsym(RTLD_DEFAULT, "getpwuid_r"); + if (getpwuid_r == NULL) + return -ENOSYS; +#endif + + if (pwd == NULL) + return -EINVAL; + + initsize = sysconf(_SC_GETPW_R_SIZE_MAX); + + if (initsize <= 0) + bufsize = 4096; + else + bufsize = (size_t) initsize; + + uid = geteuid(); + buf = NULL; + + for (;;) { + uv__free(buf); + buf = uv__malloc(bufsize); + + if (buf == NULL) + return -ENOMEM; + + r = getpwuid_r(uid, &pw, buf, bufsize, &result); + + if (r != ERANGE) + break; + + bufsize *= 2; + } + + if (r != 0) { + uv__free(buf); + return -r; + } + + if (result == NULL) { + uv__free(buf); + return -ENOENT; + } + + /* Allocate memory for the username, shell, and home directory */ + name_size = strlen(pw.pw_name) + 1; + homedir_size = strlen(pw.pw_dir) + 1; + shell_size = strlen(pw.pw_shell) + 1; + pwd->username = uv__malloc(name_size + homedir_size + shell_size); + + if (pwd->username == NULL) { + uv__free(buf); + return -ENOMEM; + } + + /* Copy the username */ + memcpy(pwd->username, pw.pw_name, name_size); + + /* Copy the home directory */ + pwd->homedir = pwd->username + name_size; + memcpy(pwd->homedir, pw.pw_dir, homedir_size); + + /* Copy the shell */ + pwd->shell = pwd->homedir + homedir_size; + memcpy(pwd->shell, pw.pw_shell, shell_size); + + /* Copy the uid and gid */ + pwd->uid = pw.pw_uid; + pwd->gid = pw.pw_gid; + + uv__free(buf); + + return 0; +} + + +void uv_os_free_passwd(uv_passwd_t* pwd) { + if (pwd == NULL) + return; + + /* + The memory for name, shell, and homedir are allocated in a single + uv__malloc() call. The base of the pointer is stored in pwd->username, so + that is the field that needs to be freed. + */ + uv__free(pwd->username); + pwd->username = NULL; + pwd->shell = NULL; + pwd->homedir = NULL; +} + + +int uv_os_get_passwd(uv_passwd_t* pwd) { + return uv__getpwuid_r(pwd); +} + + +int uv_translate_sys_error(int sys_errno) { + /* If < 0 then it's already a libuv error. */ + return sys_errno <= 0 ? sys_errno : -sys_errno; +} + + +int uv_os_getenv(const char* name, char* buffer, size_t* size) { + char* var; + size_t len; + + if (name == NULL || buffer == NULL || size == NULL || *size == 0) + return -EINVAL; + + var = getenv(name); + + if (var == NULL) + return -ENOENT; + + len = strlen(var); + + if (len >= *size) { + *size = len + 1; + return -ENOBUFS; + } + + memcpy(buffer, var, len + 1); + *size = len; + + return 0; +} + + +int uv_os_setenv(const char* name, const char* value) { + if (name == NULL || value == NULL) + return -EINVAL; + + if (setenv(name, value, 1) != 0) + return -errno; + + return 0; +} + + +int uv_os_unsetenv(const char* name) { + if (unsetenv(name) != 0) + return -errno; + + return 0; +} + + +int uv_os_gethostname(char* buffer, size_t* size) { + /* + On some platforms, if the input buffer is not large enough, gethostname() + succeeds, but truncates the result. libuv can detect this and return ENOBUFS + instead by creating a large enough buffer and comparing the hostname length + to the size input. + */ + char buf[MAXHOSTNAMELEN + 1]; + size_t len; + + if (buffer == NULL || size == NULL || *size == 0) + return -EINVAL; + + if (gethostname(buf, sizeof(buf)) != 0) + return -errno; + + buf[sizeof(buf) - 1] = '\0'; /* Null terminate, just to be safe. */ + len = strlen(buf); + + if (len >= *size) { + *size = len + 1; + return -ENOBUFS; + } + + memcpy(buffer, buf, len + 1); + *size = len; + return 0; +} + + +uv_os_fd_t uv_get_osfhandle(int fd) { + return fd; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/cygwin.c b/lib/ESPiLight/pilight/libs/libuv/unix/cygwin.c new file mode 100644 index 0000000..5a887dd --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/cygwin.c @@ -0,0 +1,54 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include + +int uv_uptime(double* uptime) { + struct sysinfo info; + + if (sysinfo(&info) < 0) + return -errno; + + *uptime = info.uptime; + return 0; +} + +int uv_resident_set_memory(size_t* rss) { + /* FIXME: read /proc/meminfo? */ + *rss = 0; + return UV_ENOSYS; +} + +int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { + /* FIXME: read /proc/stat? */ + *cpu_infos = NULL; + *count = 0; + return UV_ENOSYS; +} + +void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { + (void)cpu_infos; + (void)count; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/darwin-proctitle.c b/lib/ESPiLight/pilight/libs/libuv/unix/darwin-proctitle.c new file mode 100644 index 0000000..1142311 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/darwin-proctitle.c @@ -0,0 +1,206 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include + +#include + +#if !TARGET_OS_IPHONE +# include +# include +#endif + + +static int uv__pthread_setname_np(const char* name) { + int (*dynamic_pthread_setname_np)(const char* name); + char namebuf[64]; /* MAXTHREADNAMESIZE */ + int err; + + /* pthread_setname_np() first appeared in OS X 10.6 and iOS 3.2. */ + *(void **)(&dynamic_pthread_setname_np) = + dlsym(RTLD_DEFAULT, "pthread_setname_np"); + + if (dynamic_pthread_setname_np == NULL) + return -ENOSYS; + + strncpy(namebuf, name, sizeof(namebuf) - 1); + namebuf[sizeof(namebuf) - 1] = '\0'; + + err = dynamic_pthread_setname_np(namebuf); + if (err) + return -err; + + return 0; +} + + +int uv__set_process_title(const char* title) { +#if TARGET_OS_IPHONE + return uv__pthread_setname_np(title); +#else + CFStringRef (*pCFStringCreateWithCString)(CFAllocatorRef, + const char*, + CFStringEncoding); + CFBundleRef (*pCFBundleGetBundleWithIdentifier)(CFStringRef); + void *(*pCFBundleGetDataPointerForName)(CFBundleRef, CFStringRef); + void *(*pCFBundleGetFunctionPointerForName)(CFBundleRef, CFStringRef); + CFTypeRef (*pLSGetCurrentApplicationASN)(void); + OSStatus (*pLSSetApplicationInformationItem)(int, + CFTypeRef, + CFStringRef, + CFStringRef, + CFDictionaryRef*); + void* application_services_handle; + void* core_foundation_handle; + CFBundleRef launch_services_bundle; + CFStringRef* display_name_key; + CFDictionaryRef (*pCFBundleGetInfoDictionary)(CFBundleRef); + CFBundleRef (*pCFBundleGetMainBundle)(void); + CFBundleRef hi_services_bundle; + OSStatus (*pSetApplicationIsDaemon)(int); + CFDictionaryRef (*pLSApplicationCheckIn)(int, CFDictionaryRef); + void (*pLSSetApplicationLaunchServicesServerConnectionStatus)(uint64_t, + void*); + CFTypeRef asn; + int err; + + err = -ENOENT; + application_services_handle = dlopen("/System/Library/Frameworks/" + "ApplicationServices.framework/" + "Versions/A/ApplicationServices", + RTLD_LAZY | RTLD_LOCAL); + core_foundation_handle = dlopen("/System/Library/Frameworks/" + "CoreFoundation.framework/" + "Versions/A/CoreFoundation", + RTLD_LAZY | RTLD_LOCAL); + + if (application_services_handle == NULL || core_foundation_handle == NULL) + goto out; + + *(void **)(&pCFStringCreateWithCString) = + dlsym(core_foundation_handle, "CFStringCreateWithCString"); + *(void **)(&pCFBundleGetBundleWithIdentifier) = + dlsym(core_foundation_handle, "CFBundleGetBundleWithIdentifier"); + *(void **)(&pCFBundleGetDataPointerForName) = + dlsym(core_foundation_handle, "CFBundleGetDataPointerForName"); + *(void **)(&pCFBundleGetFunctionPointerForName) = + dlsym(core_foundation_handle, "CFBundleGetFunctionPointerForName"); + + if (pCFStringCreateWithCString == NULL || + pCFBundleGetBundleWithIdentifier == NULL || + pCFBundleGetDataPointerForName == NULL || + pCFBundleGetFunctionPointerForName == NULL) { + goto out; + } + +#define S(s) pCFStringCreateWithCString(NULL, (s), kCFStringEncodingUTF8) + + launch_services_bundle = + pCFBundleGetBundleWithIdentifier(S("com.apple.LaunchServices")); + + if (launch_services_bundle == NULL) + goto out; + + *(void **)(&pLSGetCurrentApplicationASN) = + pCFBundleGetFunctionPointerForName(launch_services_bundle, + S("_LSGetCurrentApplicationASN")); + + if (pLSGetCurrentApplicationASN == NULL) + goto out; + + *(void **)(&pLSSetApplicationInformationItem) = + pCFBundleGetFunctionPointerForName(launch_services_bundle, + S("_LSSetApplicationInformationItem")); + + if (pLSSetApplicationInformationItem == NULL) + goto out; + + display_name_key = pCFBundleGetDataPointerForName(launch_services_bundle, + S("_kLSDisplayNameKey")); + + if (display_name_key == NULL || *display_name_key == NULL) + goto out; + + *(void **)(&pCFBundleGetInfoDictionary) = dlsym(core_foundation_handle, + "CFBundleGetInfoDictionary"); + *(void **)(&pCFBundleGetMainBundle) = dlsym(core_foundation_handle, + "CFBundleGetMainBundle"); + if (pCFBundleGetInfoDictionary == NULL || pCFBundleGetMainBundle == NULL) + goto out; + + /* Black 10.9 magic, to remove (Not responding) mark in Activity Monitor */ + hi_services_bundle = + pCFBundleGetBundleWithIdentifier(S("com.apple.HIServices")); + err = -ENOENT; + if (hi_services_bundle == NULL) + goto out; + + *(void **)(&pSetApplicationIsDaemon) = pCFBundleGetFunctionPointerForName( + hi_services_bundle, + S("SetApplicationIsDaemon")); + *(void **)(&pLSApplicationCheckIn) = pCFBundleGetFunctionPointerForName( + launch_services_bundle, + S("_LSApplicationCheckIn")); + *(void **)(&pLSSetApplicationLaunchServicesServerConnectionStatus) = + pCFBundleGetFunctionPointerForName( + launch_services_bundle, + S("_LSSetApplicationLaunchServicesServerConnectionStatus")); + if (pSetApplicationIsDaemon == NULL || + pLSApplicationCheckIn == NULL || + pLSSetApplicationLaunchServicesServerConnectionStatus == NULL) { + goto out; + } + + if (pSetApplicationIsDaemon(1) != noErr) + goto out; + + pLSSetApplicationLaunchServicesServerConnectionStatus(0, NULL); + + /* Check into process manager?! */ + pLSApplicationCheckIn(-2, + pCFBundleGetInfoDictionary(pCFBundleGetMainBundle())); + + asn = pLSGetCurrentApplicationASN(); + + err = -EINVAL; + if (pLSSetApplicationInformationItem(-2, /* Magic value. */ + asn, + *display_name_key, + S(title), + NULL) != noErr) { + goto out; + } + + uv__pthread_setname_np(title); /* Don't care if it fails. */ + err = 0; + +out: + if (core_foundation_handle != NULL) + dlclose(core_foundation_handle); + + if (application_services_handle != NULL) + dlclose(application_services_handle); + + return err; +#endif /* !TARGET_OS_IPHONE */ +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/darwin.c b/lib/ESPiLight/pilight/libs/libuv/unix/darwin.c new file mode 100644 index 0000000..df6dd1c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/darwin.c @@ -0,0 +1,231 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include + +#include +#include +#include /* _NSGetExecutablePath */ +#include +#include +#include /* sysconf */ + + +int uv__platform_loop_init(uv_loop_t* loop) { + loop->cf_state = NULL; + + if (uv__kqueue_init(loop)) + return -errno; + + return 0; +} + + +void uv__platform_loop_delete(uv_loop_t* loop) { + uv__fsevents_loop_delete(loop); +} + + +uint64_t uv__hrtime(uv_clocktype_t type) { + static mach_timebase_info_data_t info; + + if ((ACCESS_ONCE(uint32_t, info.numer) == 0 || + ACCESS_ONCE(uint32_t, info.denom) == 0) && + mach_timebase_info(&info) != KERN_SUCCESS) + abort(); + + return mach_absolute_time() * info.numer / info.denom; +} + + +int uv_exepath(char* buffer, size_t* size) { + /* realpath(exepath) may be > PATH_MAX so double it to be on the safe side. */ + char abspath[PATH_MAX * 2 + 1]; + char exepath[PATH_MAX + 1]; + uint32_t exepath_size; + size_t abspath_size; + + if (buffer == NULL || size == NULL || *size == 0) + return -EINVAL; + + exepath_size = sizeof(exepath); + if (_NSGetExecutablePath(exepath, &exepath_size)) + return -EIO; + + if (realpath(exepath, abspath) != abspath) + return -errno; + + abspath_size = strlen(abspath); + if (abspath_size == 0) + return -EIO; + + *size -= 1; + if (*size > abspath_size) + *size = abspath_size; + + memcpy(buffer, abspath, *size); + buffer[*size] = '\0'; + + return 0; +} + + +uint64_t uv_get_free_memory(void) { + vm_statistics_data_t info; + mach_msg_type_number_t count = sizeof(info) / sizeof(integer_t); + + if (host_statistics(mach_host_self(), HOST_VM_INFO, + (host_info_t)&info, &count) != KERN_SUCCESS) { + return -EINVAL; /* FIXME(bnoordhuis) Translate error. */ + } + + return (uint64_t) info.free_count * sysconf(_SC_PAGESIZE); +} + + +uint64_t uv_get_total_memory(void) { + uint64_t info; + int which[] = {CTL_HW, HW_MEMSIZE}; + size_t size = sizeof(info); + + if (sysctl(which, 2, &info, &size, NULL, 0)) + return -errno; + + return (uint64_t) info; +} + + +void uv_loadavg(double avg[3]) { + struct loadavg info; + size_t size = sizeof(info); + int which[] = {CTL_VM, VM_LOADAVG}; + + if (sysctl(which, 2, &info, &size, NULL, 0) < 0) return; + + avg[0] = (double) info.ldavg[0] / info.fscale; + avg[1] = (double) info.ldavg[1] / info.fscale; + avg[2] = (double) info.ldavg[2] / info.fscale; +} + + +int uv_resident_set_memory(size_t* rss) { + mach_msg_type_number_t count; + task_basic_info_data_t info; + kern_return_t err; + + count = TASK_BASIC_INFO_COUNT; + err = task_info(mach_task_self(), + TASK_BASIC_INFO, + (task_info_t) &info, + &count); + (void) &err; + /* task_info(TASK_BASIC_INFO) cannot really fail. Anything other than + * KERN_SUCCESS implies a libuv bug. + */ + assert(err == KERN_SUCCESS); + *rss = info.resident_size; + + return 0; +} + + +int uv_uptime(double* uptime) { + time_t now; + struct timeval info; + size_t size = sizeof(info); + static int which[] = {CTL_KERN, KERN_BOOTTIME}; + + if (sysctl(which, 2, &info, &size, NULL, 0)) + return -errno; + + now = time(NULL); + *uptime = now - info.tv_sec; + + return 0; +} + +int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { + unsigned int ticks = (unsigned int)sysconf(_SC_CLK_TCK), + multiplier = ((uint64_t)1000L / ticks); + char model[512]; + uint64_t cpuspeed; + size_t size; + unsigned int i; + natural_t numcpus; + mach_msg_type_number_t msg_type; + processor_cpu_load_info_data_t *info; + uv_cpu_info_t* cpu_info; + + size = sizeof(model); + if (sysctlbyname("machdep.cpu.brand_string", &model, &size, NULL, 0) && + sysctlbyname("hw.model", &model, &size, NULL, 0)) { + return -errno; + } + + size = sizeof(cpuspeed); + if (sysctlbyname("hw.cpufrequency", &cpuspeed, &size, NULL, 0)) + return -errno; + + if (host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numcpus, + (processor_info_array_t*)&info, + &msg_type) != KERN_SUCCESS) { + return -EINVAL; /* FIXME(bnoordhuis) Translate error. */ + } + + *cpu_infos = uv__malloc(numcpus * sizeof(**cpu_infos)); + if (!(*cpu_infos)) { + vm_deallocate(mach_task_self(), (vm_address_t)info, msg_type); + return -ENOMEM; + } + + *count = numcpus; + + for (i = 0; i < numcpus; i++) { + cpu_info = &(*cpu_infos)[i]; + + cpu_info->cpu_times.user = (uint64_t)(info[i].cpu_ticks[0]) * multiplier; + cpu_info->cpu_times.nice = (uint64_t)(info[i].cpu_ticks[3]) * multiplier; + cpu_info->cpu_times.sys = (uint64_t)(info[i].cpu_ticks[1]) * multiplier; + cpu_info->cpu_times.idle = (uint64_t)(info[i].cpu_ticks[2]) * multiplier; + cpu_info->cpu_times.irq = 0; + + cpu_info->model = uv__strdup(model); + cpu_info->speed = cpuspeed/1000000; + } + vm_deallocate(mach_task_self(), (vm_address_t)info, msg_type); + + return 0; +} + + +void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { + int i; + + for (i = 0; i < count; i++) { + uv__free(cpu_infos[i].model); + } + + uv__free(cpu_infos); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/dl.c b/lib/ESPiLight/pilight/libs/libuv/unix/dl.c new file mode 100644 index 0000000..fc1c052 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/dl.c @@ -0,0 +1,80 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include +#include + +static int uv__dlerror(uv_lib_t* lib); + + +int uv_dlopen(const char* filename, uv_lib_t* lib) { + dlerror(); /* Reset error status. */ + lib->errmsg = NULL; + lib->handle = dlopen(filename, RTLD_LAZY); + return lib->handle ? 0 : uv__dlerror(lib); +} + + +void uv_dlclose(uv_lib_t* lib) { + uv__free(lib->errmsg); + lib->errmsg = NULL; + + if (lib->handle) { + /* Ignore errors. No good way to signal them without leaking memory. */ + dlclose(lib->handle); + lib->handle = NULL; + } +} + + +int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr) { + dlerror(); /* Reset error status. */ + *ptr = dlsym(lib->handle, name); + return uv__dlerror(lib); +} + + +const char* uv_dlerror(const uv_lib_t* lib) { + return lib->errmsg ? lib->errmsg : "no error"; +} + + +static int uv__dlerror(uv_lib_t* lib) { + const char* errmsg; + + uv__free(lib->errmsg); + + errmsg = dlerror(); + + if (errmsg) { + lib->errmsg = uv__strdup(errmsg); + return -1; + } + else { + lib->errmsg = NULL; + return 0; + } +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/freebsd.c b/lib/ESPiLight/pilight/libs/libuv/unix/freebsd.c new file mode 100644 index 0000000..e52ae99 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/freebsd.c @@ -0,0 +1,346 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include /* VM_LOADAVG */ +#include +#include +#include /* sysconf */ +#include + +#ifndef CPUSTATES +# define CPUSTATES 5U +#endif +#ifndef CP_USER +# define CP_USER 0 +# define CP_NICE 1 +# define CP_SYS 2 +# define CP_IDLE 3 +# define CP_INTR 4 +#endif + +static char *process_title; + + +int uv__platform_loop_init(uv_loop_t* loop) { + return uv__kqueue_init(loop); +} + + +void uv__platform_loop_delete(uv_loop_t* loop) { +} + + +#ifdef __DragonFly__ +int uv_exepath(char* buffer, size_t* size) { + char abspath[PATH_MAX * 2 + 1]; + ssize_t abspath_size; + + if (buffer == NULL || size == NULL || *size == 0) + return -EINVAL; + + abspath_size = readlink("/proc/curproc/file", abspath, sizeof(abspath)); + if (abspath_size < 0) + return -errno; + + assert(abspath_size > 0); + *size -= 1; + + if (*size > abspath_size) + *size = abspath_size; + + memcpy(buffer, abspath, *size); + buffer[*size] = '\0'; + + return 0; +} +#else +int uv_exepath(char* buffer, size_t* size) { + char abspath[PATH_MAX * 2 + 1]; + int mib[4]; + size_t abspath_size; + + if (buffer == NULL || size == NULL || *size == 0) + return -EINVAL; + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PATHNAME; + mib[3] = -1; + + abspath_size = sizeof abspath; + if (sysctl(mib, 4, abspath, &abspath_size, NULL, 0)) + return -errno; + + assert(abspath_size > 0); + abspath_size -= 1; + *size -= 1; + + if (*size > abspath_size) + *size = abspath_size; + + memcpy(buffer, abspath, *size); + buffer[*size] = '\0'; + + return 0; +} +#endif + +uint64_t uv_get_free_memory(void) { + int freecount; + size_t size = sizeof(freecount); + + if (sysctlbyname("vm.stats.vm.v_free_count", &freecount, &size, NULL, 0)) + return -errno; + + return (uint64_t) freecount * sysconf(_SC_PAGESIZE); + +} + + +uint64_t uv_get_total_memory(void) { + unsigned long info; + int which[] = {CTL_HW, HW_PHYSMEM}; + + size_t size = sizeof(info); + + if (sysctl(which, 2, &info, &size, NULL, 0)) + return -errno; + + return (uint64_t) info; +} + + +void uv_loadavg(double avg[3]) { + struct loadavg info; + size_t size = sizeof(info); + int which[] = {CTL_VM, VM_LOADAVG}; + + if (sysctl(which, 2, &info, &size, NULL, 0) < 0) return; + + avg[0] = (double) info.ldavg[0] / info.fscale; + avg[1] = (double) info.ldavg[1] / info.fscale; + avg[2] = (double) info.ldavg[2] / info.fscale; +} + + +char** uv_setup_args(int argc, char** argv) { + process_title = argc ? uv__strdup(argv[0]) : NULL; + return argv; +} + + +int uv_set_process_title(const char* title) { + int oid[4]; + + uv__free(process_title); + process_title = uv__strdup(title); + + oid[0] = CTL_KERN; + oid[1] = KERN_PROC; + oid[2] = KERN_PROC_ARGS; + oid[3] = getpid(); + + sysctl(oid, + ARRAY_SIZE(oid), + NULL, + NULL, + process_title, + strlen(process_title) + 1); + + return 0; +} + + +int uv_get_process_title(char* buffer, size_t size) { + size_t len; + + if (buffer == NULL || size == 0) + return -EINVAL; + + if (process_title) { + len = strlen(process_title) + 1; + + if (size < len) + return -ENOBUFS; + + memcpy(buffer, process_title, len); + } else { + len = 0; + } + + buffer[len] = '\0'; + + return 0; +} + + +int uv_resident_set_memory(size_t* rss) { + kvm_t *kd = NULL; + struct kinfo_proc *kinfo = NULL; + pid_t pid; + int nprocs; + size_t page_size = getpagesize(); + + pid = getpid(); + + kd = kvm_open(NULL, _PATH_DEVNULL, NULL, O_RDONLY, "kvm_open"); + if (kd == NULL) goto error; + + kinfo = kvm_getprocs(kd, KERN_PROC_PID, pid, &nprocs); + if (kinfo == NULL) goto error; + +#ifdef __DragonFly__ + *rss = kinfo->kp_vm_rssize * page_size; +#else + *rss = kinfo->ki_rssize * page_size; +#endif + + kvm_close(kd); + + return 0; + +error: + if (kd) kvm_close(kd); + return -EPERM; +} + + +int uv_uptime(double* uptime) { + int r; + struct timespec sp; + r = clock_gettime(CLOCK_MONOTONIC, &sp); + if (r) + return -errno; + + *uptime = sp.tv_sec; + return 0; +} + + +int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { + unsigned int ticks = (unsigned int)sysconf(_SC_CLK_TCK), + multiplier = ((uint64_t)1000L / ticks), cpuspeed, maxcpus, + cur = 0; + uv_cpu_info_t* cpu_info; + const char* maxcpus_key; + const char* cptimes_key; + char model[512]; + long* cp_times; + int numcpus; + size_t size; + int i; + +#if defined(__DragonFly__) + /* This is not quite correct but DragonFlyBSD doesn't seem to have anything + * comparable to kern.smp.maxcpus or kern.cp_times (kern.cp_time is a total, + * not per CPU). At least this stops uv_cpu_info() from failing completely. + */ + maxcpus_key = "hw.ncpu"; + cptimes_key = "kern.cp_time"; +#else + maxcpus_key = "kern.smp.maxcpus"; + cptimes_key = "kern.cp_times"; +#endif + + size = sizeof(model); + if (sysctlbyname("hw.model", &model, &size, NULL, 0)) + return -errno; + + size = sizeof(numcpus); + if (sysctlbyname("hw.ncpu", &numcpus, &size, NULL, 0)) + return -errno; + + *cpu_infos = uv__malloc(numcpus * sizeof(**cpu_infos)); + if (!(*cpu_infos)) + return -ENOMEM; + + *count = numcpus; + + size = sizeof(cpuspeed); + if (sysctlbyname("hw.clockrate", &cpuspeed, &size, NULL, 0)) { + uv__free(*cpu_infos); + return -errno; + } + + /* kern.cp_times on FreeBSD i386 gives an array up to maxcpus instead of + * ncpu. + */ + size = sizeof(maxcpus); + if (sysctlbyname(maxcpus_key, &maxcpus, &size, NULL, 0)) { + uv__free(*cpu_infos); + return -errno; + } + + size = maxcpus * CPUSTATES * sizeof(long); + + cp_times = uv__malloc(size); + if (cp_times == NULL) { + uv__free(*cpu_infos); + return -ENOMEM; + } + + if (sysctlbyname(cptimes_key, cp_times, &size, NULL, 0)) { + uv__free(cp_times); + uv__free(*cpu_infos); + return -errno; + } + + for (i = 0; i < numcpus; i++) { + cpu_info = &(*cpu_infos)[i]; + + cpu_info->cpu_times.user = (uint64_t)(cp_times[CP_USER+cur]) * multiplier; + cpu_info->cpu_times.nice = (uint64_t)(cp_times[CP_NICE+cur]) * multiplier; + cpu_info->cpu_times.sys = (uint64_t)(cp_times[CP_SYS+cur]) * multiplier; + cpu_info->cpu_times.idle = (uint64_t)(cp_times[CP_IDLE+cur]) * multiplier; + cpu_info->cpu_times.irq = (uint64_t)(cp_times[CP_INTR+cur]) * multiplier; + + cpu_info->model = uv__strdup(model); + cpu_info->speed = cpuspeed; + + cur+=CPUSTATES; + } + + uv__free(cp_times); + return 0; +} + + +void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { + int i; + + for (i = 0; i < count; i++) { + uv__free(cpu_infos[i].model); + } + + uv__free(cpu_infos); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/fs.c b/lib/ESPiLight/pilight/libs/libuv/unix/fs.c new file mode 100644 index 0000000..f9513ea --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/fs.c @@ -0,0 +1,1369 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* Caveat emptor: this file deviates from the libuv convention of returning + * negated errno codes. Most uv_fs_*() functions map directly to the system + * call of the same name. For more complex wrappers, it's easier to just + * return -1 with errno set. The dispatcher in uv__fs_work() takes care of + * getting the errno to the right place (req->result or as the return value.) + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include +#include +#include /* PATH_MAX */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__DragonFly__) || \ + defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel_) || \ + defined(__OpenBSD__) || \ + defined(__NetBSD__) +# define HAVE_PREADV 1 +#else +# define HAVE_PREADV 0 +#endif + +#if defined(__linux__) || defined(__sun) +# include +#endif + +#define INIT(subtype) \ + do { \ + req->type = UV_FS; \ + if (cb != NULL) \ + uv__req_init(loop, req, UV_FS); \ + req->fs_type = UV_FS_ ## subtype; \ + req->result = 0; \ + req->ptr = NULL; \ + req->loop = loop; \ + req->path = NULL; \ + req->new_path = NULL; \ + req->cb = cb; \ + } \ + while (0) + +#define PATH \ + do { \ + assert(path != NULL); \ + if (cb == NULL) { \ + req->path = path; \ + } else { \ + req->path = uv__strdup(path); \ + if (req->path == NULL) { \ + uv__req_unregister(loop, req); \ + return -ENOMEM; \ + } \ + } \ + } \ + while (0) + +#define PATH2 \ + do { \ + if (cb == NULL) { \ + req->path = path; \ + req->new_path = new_path; \ + } else { \ + size_t path_len; \ + size_t new_path_len; \ + path_len = strlen(path) + 1; \ + new_path_len = strlen(new_path) + 1; \ + req->path = uv__malloc(path_len + new_path_len); \ + if (req->path == NULL) { \ + uv__req_unregister(loop, req); \ + return -ENOMEM; \ + } \ + req->new_path = req->path + path_len; \ + memcpy((void*) req->path, path, path_len); \ + memcpy((void*) req->new_path, new_path, new_path_len); \ + } \ + } \ + while (0) + +#define POST \ + do { \ + if (cb != NULL) { \ + uv__work_submit(loop, &req->work_req, uv__fs_work, uv__fs_done); \ + return 0; \ + } \ + else { \ + uv__fs_work(&req->work_req); \ + return req->result; \ + } \ + } \ + while (0) + + +static ssize_t uv__fs_fdatasync(uv_fs_t* req) { +#if defined(__linux__) || defined(__sun) || defined(__NetBSD__) + return fdatasync(req->file); +#elif defined(__APPLE__) + /* Apple's fdatasync and fsync explicitly do NOT flush the drive write cache + * to the drive platters. This is in contrast to Linux's fdatasync and fsync + * which do, according to recent man pages. F_FULLFSYNC is Apple's equivalent + * for flushing buffered data to permanent storage. + */ + return fcntl(req->file, F_FULLFSYNC); +#else + return fsync(req->file); +#endif +} + + +static ssize_t uv__fs_fsync(uv_fs_t* req) { +#if defined(__APPLE__) + /* See the comment in uv__fs_fdatasync. */ + return fcntl(req->file, F_FULLFSYNC); +#else + return fsync(req->file); +#endif +} + + +static ssize_t uv__fs_futime(uv_fs_t* req) { +#if defined(__linux__) + /* utimesat() has nanosecond resolution but we stick to microseconds + * for the sake of consistency with other platforms. + */ + static int no_utimesat; + struct timespec ts[2]; + struct timeval tv[2]; + char path[sizeof("/proc/self/fd/") + 3 * sizeof(int)]; + int r; + + if (no_utimesat) + goto skip; + + ts[0].tv_sec = req->atime; + ts[0].tv_nsec = (uint64_t)(req->atime * 1000000) % 1000000 * 1000; + ts[1].tv_sec = req->mtime; + ts[1].tv_nsec = (uint64_t)(req->mtime * 1000000) % 1000000 * 1000; + + r = uv__utimesat(req->file, NULL, ts, 0); + if (r == 0) + return r; + + if (errno != ENOSYS) + return r; + + no_utimesat = 1; + +skip: + + tv[0].tv_sec = req->atime; + tv[0].tv_usec = (uint64_t)(req->atime * 1000000) % 1000000; + tv[1].tv_sec = req->mtime; + tv[1].tv_usec = (uint64_t)(req->mtime * 1000000) % 1000000; + snprintf(path, sizeof(path), "/proc/self/fd/%d", (int) req->file); + + r = utimes(path, tv); + if (r == 0) + return r; + + switch (errno) { + case ENOENT: + if (fcntl(req->file, F_GETFL) == -1 && errno == EBADF) + break; + /* Fall through. */ + + case EACCES: + case ENOTDIR: + errno = ENOSYS; + break; + } + + return r; + +#elif defined(__APPLE__) \ + || defined(__DragonFly__) \ + || defined(__FreeBSD__) \ + || defined(__FreeBSD_kernel__) \ + || defined(__NetBSD__) \ + || defined(__OpenBSD__) \ + || defined(__sun) + struct timeval tv[2]; + tv[0].tv_sec = req->atime; + tv[0].tv_usec = (uint64_t)(req->atime * 1000000) % 1000000; + tv[1].tv_sec = req->mtime; + tv[1].tv_usec = (uint64_t)(req->mtime * 1000000) % 1000000; +# if defined(__sun) + return futimesat(req->file, NULL, tv); +# else + return futimes(req->file, tv); +# endif +#elif defined(_AIX71) + struct timespec ts[2]; + ts[0].tv_sec = req->atime; + ts[0].tv_nsec = (uint64_t)(req->atime * 1000000) % 1000000 * 1000; + ts[1].tv_sec = req->mtime; + ts[1].tv_nsec = (uint64_t)(req->mtime * 1000000) % 1000000 * 1000; + return futimens(req->file, ts); +#elif defined(__MVS__) + attrib_t atr; + memset(&atr, 0, sizeof(atr)); + atr.att_mtimechg = 1; + atr.att_atimechg = 1; + atr.att_mtime = req->mtime; + atr.att_atime = req->atime; + return __fchattr(req->file, &atr, sizeof(atr)); +#else + errno = ENOSYS; + return -1; +#endif +} + + +static ssize_t uv__fs_mkdtemp(uv_fs_t* req) { + return mkdtemp((char*) req->path) ? 0 : -1; +} + + +static ssize_t uv__fs_open(uv_fs_t* req) { + static int no_cloexec_support; + int r; + + /* Try O_CLOEXEC before entering locks */ + if (no_cloexec_support == 0) { +#ifdef O_CLOEXEC + r = open(req->path, req->flags | O_CLOEXEC, req->mode); + if (r >= 0) + return r; + if (errno != EINVAL) + return r; + no_cloexec_support = 1; +#endif /* O_CLOEXEC */ + } + + if (req->cb != NULL) + uv_rwlock_rdlock(&req->loop->cloexec_lock); + + r = open(req->path, req->flags, req->mode); + + /* In case of failure `uv__cloexec` will leave error in `errno`, + * so it is enough to just set `r` to `-1`. + */ + if (r >= 0 && uv__cloexec(r, 1) != 0) { + r = uv__close(r); + if (r != 0) + abort(); + r = -1; + } + + if (req->cb != NULL) + uv_rwlock_rdunlock(&req->loop->cloexec_lock); + + return r; +} + + +static ssize_t uv__fs_read(uv_fs_t* req) { +#if defined(__linux__) + static int no_preadv; +#endif + ssize_t result; + +#if defined(_AIX) + struct stat buf; + if(fstat(req->file, &buf)) + return -1; + if(S_ISDIR(buf.st_mode)) { + errno = EISDIR; + return -1; + } +#endif /* defined(_AIX) */ + if (req->off < 0) { + if (req->nbufs == 1) + result = read(req->file, req->bufs[0].base, req->bufs[0].len); + else + result = readv(req->file, (struct iovec*) req->bufs, req->nbufs); + } else { + if (req->nbufs == 1) { + result = pread(req->file, req->bufs[0].base, req->bufs[0].len, req->off); + goto done; + } + +#if HAVE_PREADV + result = preadv(req->file, (struct iovec*) req->bufs, req->nbufs, req->off); +#else +# if defined(__linux__) + if (no_preadv) retry: +# endif + { + off_t nread; + size_t index; + + nread = 0; + index = 0; + result = 1; + do { + if (req->bufs[index].len > 0) { + result = pread(req->file, + req->bufs[index].base, + req->bufs[index].len, + req->off + nread); + if (result > 0) + nread += result; + } + index++; + } while (index < req->nbufs && result > 0); + if (nread > 0) + result = nread; + } +# if defined(__linux__) + else { + result = uv__preadv(req->file, + (struct iovec*)req->bufs, + req->nbufs, + req->off); + if (result == -1 && errno == ENOSYS) { + no_preadv = 1; + goto retry; + } + } +# endif +#endif + } + +done: + return result; +} + + +#if defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_8) +#define UV_CONST_DIRENT uv__dirent_t +#else +#define UV_CONST_DIRENT const uv__dirent_t +#endif + + +static int uv__fs_scandir_filter(UV_CONST_DIRENT* dent) { + return strcmp(dent->d_name, ".") != 0 && strcmp(dent->d_name, "..") != 0; +} + + +static int uv__fs_scandir_sort(UV_CONST_DIRENT** a, UV_CONST_DIRENT** b) { + return strcmp((*a)->d_name, (*b)->d_name); +} + + +static ssize_t uv__fs_scandir(uv_fs_t* req) { + uv__dirent_t **dents; + int n; + + dents = NULL; + n = scandir(req->path, &dents, uv__fs_scandir_filter, uv__fs_scandir_sort); + + /* NOTE: We will use nbufs as an index field */ + req->nbufs = 0; + + if (n == 0) { + /* OS X still needs to deallocate some memory. + * Memory was allocated using the system allocator, so use free() here. + */ + free(dents); + dents = NULL; + } else if (n == -1) { + return n; + } + + req->ptr = dents; + + return n; +} + + +static ssize_t uv__fs_pathmax_size(const char* path) { + ssize_t pathmax; + + pathmax = pathconf(path, _PC_PATH_MAX); + + if (pathmax == -1) { +#if defined(PATH_MAX) + return PATH_MAX; +#else +#error "PATH_MAX undefined in the current platform" +#endif + } + + return pathmax; +} + +static ssize_t uv__fs_readlink(uv_fs_t* req) { + ssize_t len; + char* buf; + + len = uv__fs_pathmax_size(req->path); + buf = uv__malloc(len + 1); + + if (buf == NULL) { + errno = ENOMEM; + return -1; + } + + len = readlink(req->path, buf, len); + + if (len == -1) { + uv__free(buf); + return -1; + } + + buf[len] = '\0'; + req->ptr = buf; + + return 0; +} + +static ssize_t uv__fs_realpath(uv_fs_t* req) { + ssize_t len; + char* buf; + + len = uv__fs_pathmax_size(req->path); + buf = uv__malloc(len + 1); + + if (buf == NULL) { + errno = ENOMEM; + return -1; + } + + if (realpath(req->path, buf) == NULL) { + uv__free(buf); + return -1; + } + + req->ptr = buf; + + return 0; +} + +static ssize_t uv__fs_sendfile_emul(uv_fs_t* req) { + struct pollfd pfd; + int use_pread; + off_t offset; + ssize_t nsent; + ssize_t nread; + ssize_t nwritten; + size_t buflen; + size_t len; + ssize_t n; + int in_fd; + int out_fd; + char buf[8192]; + + len = req->bufsml[0].len; + in_fd = req->flags; + out_fd = req->file; + offset = req->off; + use_pread = 1; + + /* Here are the rules regarding errors: + * + * 1. Read errors are reported only if nsent==0, otherwise we return nsent. + * The user needs to know that some data has already been sent, to stop + * them from sending it twice. + * + * 2. Write errors are always reported. Write errors are bad because they + * mean data loss: we've read data but now we can't write it out. + * + * We try to use pread() and fall back to regular read() if the source fd + * doesn't support positional reads, for example when it's a pipe fd. + * + * If we get EAGAIN when writing to the target fd, we poll() on it until + * it becomes writable again. + * + * FIXME: If we get a write error when use_pread==1, it should be safe to + * return the number of sent bytes instead of an error because pread() + * is, in theory, idempotent. However, special files in /dev or /proc + * may support pread() but not necessarily return the same data on + * successive reads. + * + * FIXME: There is no way now to signal that we managed to send *some* data + * before a write error. + */ + for (nsent = 0; (size_t) nsent < len; ) { + buflen = len - nsent; + + if (buflen > sizeof(buf)) + buflen = sizeof(buf); + + do + if (use_pread) + nread = pread(in_fd, buf, buflen, offset); + else + nread = read(in_fd, buf, buflen); + while (nread == -1 && errno == EINTR); + + if (nread == 0) + goto out; + + if (nread == -1) { + if (use_pread && nsent == 0 && (errno == EIO || errno == ESPIPE)) { + use_pread = 0; + continue; + } + + if (nsent == 0) + nsent = -1; + + goto out; + } + + for (nwritten = 0; nwritten < nread; ) { + do + n = write(out_fd, buf + nwritten, nread - nwritten); + while (n == -1 && errno == EINTR); + + if (n != -1) { + nwritten += n; + continue; + } + + if (errno != EAGAIN && errno != EWOULDBLOCK) { + nsent = -1; + goto out; + } + + pfd.fd = out_fd; + pfd.events = POLLOUT; + pfd.revents = 0; + + do + n = poll(&pfd, 1, -1); + while (n == -1 && errno == EINTR); + + if (n == -1 || (pfd.revents & ~POLLOUT) != 0) { + errno = EIO; + nsent = -1; + goto out; + } + } + + offset += nread; + nsent += nread; + } + +out: + if (nsent != -1) + req->off = offset; + + return nsent; +} + + +static ssize_t uv__fs_sendfile(uv_fs_t* req) { + int in_fd; + int out_fd; + + in_fd = req->flags; + out_fd = req->file; + +#if defined(__linux__) || defined(__sun) + { + off_t off; + ssize_t r; + + off = req->off; + r = sendfile(out_fd, in_fd, &off, req->bufsml[0].len); + + /* sendfile() on SunOS returns EINVAL if the target fd is not a socket but + * it still writes out data. Fortunately, we can detect it by checking if + * the offset has been updated. + */ + if (r != -1 || off > req->off) { + r = off - req->off; + req->off = off; + return r; + } + + if (errno == EINVAL || + errno == EIO || + errno == ENOTSOCK || + errno == EXDEV) { + errno = 0; + return uv__fs_sendfile_emul(req); + } + + return -1; + } +#elif defined(__APPLE__) || \ + defined(__DragonFly__) || \ + defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) + { + off_t len; + ssize_t r; + + /* sendfile() on FreeBSD and Darwin returns EAGAIN if the target fd is in + * non-blocking mode and not all data could be written. If a non-zero + * number of bytes have been sent, we don't consider it an error. + */ + +#if defined(__FreeBSD__) || defined(__DragonFly__) + len = 0; + r = sendfile(in_fd, out_fd, req->off, req->bufsml[0].len, NULL, &len, 0); +#elif defined(__FreeBSD_kernel__) + len = 0; + r = bsd_sendfile(in_fd, + out_fd, + req->off, + req->bufsml[0].len, + NULL, + &len, + 0); +#else + /* The darwin sendfile takes len as an input for the length to send, + * so make sure to initialize it with the caller's value. */ + len = req->bufsml[0].len; + r = sendfile(in_fd, out_fd, req->off, &len, NULL, 0); +#endif + + /* + * The man page for sendfile(2) on DragonFly states that `len` contains + * a meaningful value ONLY in case of EAGAIN and EINTR. + * Nothing is said about it's value in case of other errors, so better + * not depend on the potential wrong assumption that is was not modified + * by the syscall. + */ + if (r == 0 || ((errno == EAGAIN || errno == EINTR) && len != 0)) { + req->off += len; + return (ssize_t) len; + } + + if (errno == EINVAL || + errno == EIO || + errno == ENOTSOCK || + errno == EXDEV) { + errno = 0; + return uv__fs_sendfile_emul(req); + } + + return -1; + } +#else + /* Squelch compiler warnings. */ + (void) &in_fd; + (void) &out_fd; + + return uv__fs_sendfile_emul(req); +#endif +} + + +static ssize_t uv__fs_utime(uv_fs_t* req) { + struct utimbuf buf; + buf.actime = req->atime; + buf.modtime = req->mtime; + return utime(req->path, &buf); /* TODO use utimes() where available */ +} + + +static ssize_t uv__fs_write(uv_fs_t* req) { +#if defined(__linux__) + static int no_pwritev; +#endif + ssize_t r; + + /* Serialize writes on OS X, concurrent write() and pwrite() calls result in + * data loss. We can't use a per-file descriptor lock, the descriptor may be + * a dup(). + */ +#if defined(__APPLE__) + static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; + + if (pthread_mutex_lock(&lock)) + abort(); +#endif + + if (req->off < 0) { + if (req->nbufs == 1) + r = write(req->file, req->bufs[0].base, req->bufs[0].len); + else + r = writev(req->file, (struct iovec*) req->bufs, req->nbufs); + } else { + if (req->nbufs == 1) { + r = pwrite(req->file, req->bufs[0].base, req->bufs[0].len, req->off); + goto done; + } +#if HAVE_PREADV + r = pwritev(req->file, (struct iovec*) req->bufs, req->nbufs, req->off); +#else +# if defined(__linux__) + if (no_pwritev) retry: +# endif + { + off_t written; + size_t index; + + written = 0; + index = 0; + r = 0; + do { + if (req->bufs[index].len > 0) { + r = pwrite(req->file, + req->bufs[index].base, + req->bufs[index].len, + req->off + written); + if (r > 0) + written += r; + } + index++; + } while (index < req->nbufs && r >= 0); + if (written > 0) + r = written; + } +# if defined(__linux__) + else { + r = uv__pwritev(req->file, + (struct iovec*) req->bufs, + req->nbufs, + req->off); + if (r == -1 && errno == ENOSYS) { + no_pwritev = 1; + goto retry; + } + } +# endif +#endif + } + +done: +#if defined(__APPLE__) + if (pthread_mutex_unlock(&lock)) + abort(); +#endif + + return r; +} + +static void uv__to_stat(struct stat* src, uv_stat_t* dst) { + dst->st_dev = src->st_dev; + dst->st_mode = src->st_mode; + dst->st_nlink = src->st_nlink; + dst->st_uid = src->st_uid; + dst->st_gid = src->st_gid; + dst->st_rdev = src->st_rdev; + dst->st_ino = src->st_ino; + dst->st_size = src->st_size; + dst->st_blksize = src->st_blksize; + dst->st_blocks = src->st_blocks; + +#if defined(__APPLE__) + dst->st_atim.tv_sec = src->st_atimespec.tv_sec; + dst->st_atim.tv_nsec = src->st_atimespec.tv_nsec; + dst->st_mtim.tv_sec = src->st_mtimespec.tv_sec; + dst->st_mtim.tv_nsec = src->st_mtimespec.tv_nsec; + dst->st_ctim.tv_sec = src->st_ctimespec.tv_sec; + dst->st_ctim.tv_nsec = src->st_ctimespec.tv_nsec; + dst->st_birthtim.tv_sec = src->st_birthtimespec.tv_sec; + dst->st_birthtim.tv_nsec = src->st_birthtimespec.tv_nsec; + dst->st_flags = src->st_flags; + dst->st_gen = src->st_gen; +#elif defined(__ANDROID__) + dst->st_atim.tv_sec = src->st_atime; + dst->st_atim.tv_nsec = src->st_atimensec; + dst->st_mtim.tv_sec = src->st_mtime; + dst->st_mtim.tv_nsec = src->st_mtimensec; + dst->st_ctim.tv_sec = src->st_ctime; + dst->st_ctim.tv_nsec = src->st_ctimensec; + dst->st_birthtim.tv_sec = src->st_ctime; + dst->st_birthtim.tv_nsec = src->st_ctimensec; + dst->st_flags = 0; + dst->st_gen = 0; +#elif !defined(_AIX) && ( \ + defined(__DragonFly__) || \ + defined(__FreeBSD__) || \ + defined(__OpenBSD__) || \ + defined(__NetBSD__) || \ + defined(_GNU_SOURCE) || \ + defined(_BSD_SOURCE) || \ + defined(_SVID_SOURCE) || \ + defined(_XOPEN_SOURCE) || \ + defined(_DEFAULT_SOURCE)) + dst->st_atim.tv_sec = src->st_atim.tv_sec; + dst->st_atim.tv_nsec = src->st_atim.tv_nsec; + dst->st_mtim.tv_sec = src->st_mtim.tv_sec; + dst->st_mtim.tv_nsec = src->st_mtim.tv_nsec; + dst->st_ctim.tv_sec = src->st_ctim.tv_sec; + dst->st_ctim.tv_nsec = src->st_ctim.tv_nsec; +# if defined(__FreeBSD__) || \ + defined(__NetBSD__) + dst->st_birthtim.tv_sec = src->st_birthtim.tv_sec; + dst->st_birthtim.tv_nsec = src->st_birthtim.tv_nsec; + dst->st_flags = src->st_flags; + dst->st_gen = src->st_gen; +# else + dst->st_birthtim.tv_sec = src->st_ctim.tv_sec; + dst->st_birthtim.tv_nsec = src->st_ctim.tv_nsec; + dst->st_flags = 0; + dst->st_gen = 0; +# endif +#else + dst->st_atim.tv_sec = src->st_atime; + dst->st_atim.tv_nsec = 0; + dst->st_mtim.tv_sec = src->st_mtime; + dst->st_mtim.tv_nsec = 0; + dst->st_ctim.tv_sec = src->st_ctime; + dst->st_ctim.tv_nsec = 0; + dst->st_birthtim.tv_sec = src->st_ctime; + dst->st_birthtim.tv_nsec = 0; + dst->st_flags = 0; + dst->st_gen = 0; +#endif +} + + +static int uv__fs_stat(const char *path, uv_stat_t *buf) { + struct stat pbuf; + int ret; + + ret = stat(path, &pbuf); + if (ret == 0) + uv__to_stat(&pbuf, buf); + + return ret; +} + + +static int uv__fs_lstat(const char *path, uv_stat_t *buf) { + struct stat pbuf; + int ret; + + ret = lstat(path, &pbuf); + if (ret == 0) + uv__to_stat(&pbuf, buf); + + return ret; +} + + +static int uv__fs_fstat(int fd, uv_stat_t *buf) { + struct stat pbuf; + int ret; + + ret = fstat(fd, &pbuf); + if (ret == 0) + uv__to_stat(&pbuf, buf); + + return ret; +} + + +typedef ssize_t (*uv__fs_buf_iter_processor)(uv_fs_t* req); +static ssize_t uv__fs_buf_iter(uv_fs_t* req, uv__fs_buf_iter_processor process) { + unsigned int iovmax; + unsigned int nbufs; + uv_buf_t* bufs; + ssize_t total; + ssize_t result; + + iovmax = uv__getiovmax(); + nbufs = req->nbufs; + bufs = req->bufs; + total = 0; + + while (nbufs > 0) { + req->nbufs = nbufs; + if (req->nbufs > iovmax) + req->nbufs = iovmax; + + result = process(req); + if (result <= 0) { + if (total == 0) + total = result; + break; + } + + if (req->off >= 0) + req->off += result; + + req->bufs += req->nbufs; + nbufs -= req->nbufs; + total += result; + } + + if (errno == EINTR && total == -1) + return total; + + if (bufs != req->bufsml) + uv__free(bufs); + + req->bufs = NULL; + req->nbufs = 0; + + return total; +} + + +static void uv__fs_work(struct uv__work* w) { + int retry_on_eintr; + uv_fs_t* req; + ssize_t r; + + req = container_of(w, uv_fs_t, work_req); + retry_on_eintr = !(req->fs_type == UV_FS_CLOSE); + + do { + errno = 0; + +#define X(type, action) \ + case UV_FS_ ## type: \ + r = action; \ + break; + + switch (req->fs_type) { + X(ACCESS, access(req->path, req->flags)); + X(CHMOD, chmod(req->path, req->mode)); + X(CHOWN, chown(req->path, req->uid, req->gid)); + X(CLOSE, close(req->file)); + X(FCHMOD, fchmod(req->file, req->mode)); + X(FCHOWN, fchown(req->file, req->uid, req->gid)); + X(FDATASYNC, uv__fs_fdatasync(req)); + X(FSTAT, uv__fs_fstat(req->file, &req->statbuf)); + X(FSYNC, uv__fs_fsync(req)); + X(FTRUNCATE, ftruncate(req->file, req->off)); + X(FUTIME, uv__fs_futime(req)); + X(LSTAT, uv__fs_lstat(req->path, &req->statbuf)); + X(LINK, link(req->path, req->new_path)); + X(MKDIR, mkdir(req->path, req->mode)); + X(MKDTEMP, uv__fs_mkdtemp(req)); + X(OPEN, uv__fs_open(req)); + X(READ, uv__fs_buf_iter(req, uv__fs_read)); + X(SCANDIR, uv__fs_scandir(req)); + X(READLINK, uv__fs_readlink(req)); + X(REALPATH, uv__fs_realpath(req)); + X(RENAME, rename(req->path, req->new_path)); + X(RMDIR, rmdir(req->path)); + X(SENDFILE, uv__fs_sendfile(req)); + X(STAT, uv__fs_stat(req->path, &req->statbuf)); + X(SYMLINK, symlink(req->path, req->new_path)); + X(UNLINK, unlink(req->path)); + X(UTIME, uv__fs_utime(req)); + X(WRITE, uv__fs_buf_iter(req, uv__fs_write)); + default: abort(); + } +#undef X + } while (r == -1 && errno == EINTR && retry_on_eintr); + + if (r == -1) + req->result = -errno; + else + req->result = r; + + if (r == 0 && (req->fs_type == UV_FS_STAT || + req->fs_type == UV_FS_FSTAT || + req->fs_type == UV_FS_LSTAT)) { + req->ptr = &req->statbuf; + } +} + + +static void uv__fs_done(struct uv__work* w, int status) { + uv_fs_t* req; + + req = container_of(w, uv_fs_t, work_req); + uv__req_unregister(req->loop, req); + + if (status == -ECANCELED) { + assert(req->result == 0); + req->result = -ECANCELED; + } + + req->cb(req); +} + + +int uv_fs_access(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int flags, + uv_fs_cb cb) { + INIT(ACCESS); + PATH; + req->flags = flags; + POST; +} + + +int uv_fs_chmod(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int mode, + uv_fs_cb cb) { + INIT(CHMOD); + PATH; + req->mode = mode; + POST; +} + + +int uv_fs_chown(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_uid_t uid, + uv_gid_t gid, + uv_fs_cb cb) { + INIT(CHOWN); + PATH; + req->uid = uid; + req->gid = gid; + POST; +} + + +int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { + INIT(CLOSE); + req->file = file; + POST; +} + + +int uv_fs_fchmod(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + int mode, + uv_fs_cb cb) { + INIT(FCHMOD); + req->file = file; + req->mode = mode; + POST; +} + + +int uv_fs_fchown(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_uid_t uid, + uv_gid_t gid, + uv_fs_cb cb) { + INIT(FCHOWN); + req->file = file; + req->uid = uid; + req->gid = gid; + POST; +} + + +int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { + INIT(FDATASYNC); + req->file = file; + POST; +} + + +int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { + INIT(FSTAT); + req->file = file; + POST; +} + + +int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb) { + INIT(FSYNC); + req->file = file; + POST; +} + + +int uv_fs_ftruncate(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + int64_t off, + uv_fs_cb cb) { + INIT(FTRUNCATE); + req->file = file; + req->off = off; + POST; +} + + +int uv_fs_futime(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + double atime, + double mtime, + uv_fs_cb cb) { + INIT(FUTIME); + req->file = file; + req->atime = atime; + req->mtime = mtime; + POST; +} + + +int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { + INIT(LSTAT); + PATH; + POST; +} + + +int uv_fs_link(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + uv_fs_cb cb) { + INIT(LINK); + PATH2; + POST; +} + + +int uv_fs_mkdir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int mode, + uv_fs_cb cb) { + INIT(MKDIR); + PATH; + req->mode = mode; + POST; +} + + +int uv_fs_mkdtemp(uv_loop_t* loop, + uv_fs_t* req, + const char* tpl, + uv_fs_cb cb) { + INIT(MKDTEMP); + req->path = uv__strdup(tpl); + if (req->path == NULL) { + if (cb != NULL) + uv__req_unregister(loop, req); + return -ENOMEM; + } + POST; +} + + +int uv_fs_open(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int flags, + int mode, + uv_fs_cb cb) { + INIT(OPEN); + PATH; + req->flags = flags; + req->mode = mode; + POST; +} + + +int uv_fs_read(uv_loop_t* loop, uv_fs_t* req, + uv_file file, + const uv_buf_t bufs[], + unsigned int nbufs, + int64_t off, + uv_fs_cb cb) { + if (bufs == NULL || nbufs == 0) + return -EINVAL; + + INIT(READ); + req->file = file; + + req->nbufs = nbufs; + req->bufs = req->bufsml; + if (nbufs > ARRAY_SIZE(req->bufsml)) + req->bufs = uv__malloc(nbufs * sizeof(*bufs)); + + if (req->bufs == NULL) { + if (cb != NULL) + uv__req_unregister(loop, req); + return -ENOMEM; + } + + memcpy(req->bufs, bufs, nbufs * sizeof(*bufs)); + + req->off = off; + POST; +} + + +int uv_fs_scandir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int flags, + uv_fs_cb cb) { + INIT(SCANDIR); + PATH; + req->flags = flags; + POST; +} + + +int uv_fs_readlink(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb) { + INIT(READLINK); + PATH; + POST; +} + + +int uv_fs_realpath(uv_loop_t* loop, + uv_fs_t* req, + const char * path, + uv_fs_cb cb) { + INIT(REALPATH); + PATH; + POST; +} + + +int uv_fs_rename(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + uv_fs_cb cb) { + INIT(RENAME); + PATH2; + POST; +} + + +int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { + INIT(RMDIR); + PATH; + POST; +} + + +int uv_fs_sendfile(uv_loop_t* loop, + uv_fs_t* req, + uv_file out_fd, + uv_file in_fd, + int64_t off, + size_t len, + uv_fs_cb cb) { + INIT(SENDFILE); + req->flags = in_fd; /* hack */ + req->file = out_fd; + req->off = off; + req->bufsml[0].len = len; + POST; +} + + +int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { + INIT(STAT); + PATH; + POST; +} + + +int uv_fs_symlink(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + int flags, + uv_fs_cb cb) { + INIT(SYMLINK); + PATH2; + req->flags = flags; + POST; +} + + +int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { + INIT(UNLINK); + PATH; + POST; +} + + +int uv_fs_utime(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + double atime, + double mtime, + uv_fs_cb cb) { + INIT(UTIME); + PATH; + req->atime = atime; + req->mtime = mtime; + POST; +} + + +int uv_fs_write(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + const uv_buf_t bufs[], + unsigned int nbufs, + int64_t off, + uv_fs_cb cb) { + if (bufs == NULL || nbufs == 0) + return -EINVAL; + + INIT(WRITE); + req->file = file; + + req->nbufs = nbufs; + req->bufs = req->bufsml; + if (nbufs > ARRAY_SIZE(req->bufsml)) + req->bufs = uv__malloc(nbufs * sizeof(*bufs)); + + if (req->bufs == NULL) { + if (cb != NULL) + uv__req_unregister(loop, req); + return -ENOMEM; + } + + memcpy(req->bufs, bufs, nbufs * sizeof(*bufs)); + + req->off = off; + POST; +} + + +void uv_fs_req_cleanup(uv_fs_t* req) { + /* Only necessary for asychronous requests, i.e., requests with a callback. + * Synchronous ones don't copy their arguments and have req->path and + * req->new_path pointing to user-owned memory. UV_FS_MKDTEMP is the + * exception to the rule, it always allocates memory. + */ + if (req->path != NULL && (req->cb != NULL || req->fs_type == UV_FS_MKDTEMP)) + uv__free((void*) req->path); /* Memory is shared with req->new_path. */ + + req->path = NULL; + req->new_path = NULL; + + if (req->fs_type == UV_FS_SCANDIR && req->ptr != NULL) + uv__fs_scandir_cleanup(req); + + if (req->ptr != &req->statbuf) + uv__free(req->ptr); + req->ptr = NULL; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/fsevents.c b/lib/ESPiLight/pilight/libs/libuv/unix/fsevents.c new file mode 100644 index 0000000..643e233 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/fsevents.c @@ -0,0 +1,901 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#if TARGET_OS_IPHONE + +/* iOS (currently) doesn't provide the FSEvents-API (nor CoreServices) */ + +int uv__fsevents_init(uv_fs_event_t* handle) { + return 0; +} + + +int uv__fsevents_close(uv_fs_event_t* handle) { + return 0; +} + + +void uv__fsevents_loop_delete(uv_loop_t* loop) { +} + +#else /* TARGET_OS_IPHONE */ + +#include +#include +#include +#include + +#include +#include + +/* These are macros to avoid "initializer element is not constant" errors + * with old versions of gcc. + */ +#define kFSEventsModified (kFSEventStreamEventFlagItemFinderInfoMod | \ + kFSEventStreamEventFlagItemModified | \ + kFSEventStreamEventFlagItemInodeMetaMod | \ + kFSEventStreamEventFlagItemChangeOwner | \ + kFSEventStreamEventFlagItemXattrMod) + +#define kFSEventsRenamed (kFSEventStreamEventFlagItemCreated | \ + kFSEventStreamEventFlagItemRemoved | \ + kFSEventStreamEventFlagItemRenamed) + +#define kFSEventsSystem (kFSEventStreamEventFlagUserDropped | \ + kFSEventStreamEventFlagKernelDropped | \ + kFSEventStreamEventFlagEventIdsWrapped | \ + kFSEventStreamEventFlagHistoryDone | \ + kFSEventStreamEventFlagMount | \ + kFSEventStreamEventFlagUnmount | \ + kFSEventStreamEventFlagRootChanged) + +typedef struct uv__fsevents_event_s uv__fsevents_event_t; +typedef struct uv__cf_loop_signal_s uv__cf_loop_signal_t; +typedef struct uv__cf_loop_state_s uv__cf_loop_state_t; + +enum uv__cf_loop_signal_type_e { + kUVCFLoopSignalRegular, + kUVCFLoopSignalClosing +}; +typedef enum uv__cf_loop_signal_type_e uv__cf_loop_signal_type_t; + +struct uv__cf_loop_signal_s { + QUEUE member; + uv_fs_event_t* handle; + uv__cf_loop_signal_type_t type; +}; + +struct uv__fsevents_event_s { + QUEUE member; + int events; + char path[1]; +}; + +struct uv__cf_loop_state_s { + CFRunLoopRef loop; + CFRunLoopSourceRef signal_source; + int fsevent_need_reschedule; + FSEventStreamRef fsevent_stream; + uv_sem_t fsevent_sem; + uv_mutex_t fsevent_mutex; + void* fsevent_handles[2]; + unsigned int fsevent_handle_count; +}; + +/* Forward declarations */ +static void uv__cf_loop_cb(void* arg); +static void* uv__cf_loop_runner(void* arg); +static int uv__cf_loop_signal(uv_loop_t* loop, + uv_fs_event_t* handle, + uv__cf_loop_signal_type_t type); + +/* Lazy-loaded by uv__fsevents_global_init(). */ +static CFArrayRef (*pCFArrayCreate)(CFAllocatorRef, + const void**, + CFIndex, + const CFArrayCallBacks*); +static void (*pCFRelease)(CFTypeRef); +static void (*pCFRunLoopAddSource)(CFRunLoopRef, + CFRunLoopSourceRef, + CFStringRef); +static CFRunLoopRef (*pCFRunLoopGetCurrent)(void); +static void (*pCFRunLoopRemoveSource)(CFRunLoopRef, + CFRunLoopSourceRef, + CFStringRef); +static void (*pCFRunLoopRun)(void); +static CFRunLoopSourceRef (*pCFRunLoopSourceCreate)(CFAllocatorRef, + CFIndex, + CFRunLoopSourceContext*); +static void (*pCFRunLoopSourceSignal)(CFRunLoopSourceRef); +static void (*pCFRunLoopStop)(CFRunLoopRef); +static void (*pCFRunLoopWakeUp)(CFRunLoopRef); +static CFStringRef (*pCFStringCreateWithFileSystemRepresentation)( + CFAllocatorRef, + const char*); +static CFStringEncoding (*pCFStringGetSystemEncoding)(void); +static CFStringRef (*pkCFRunLoopDefaultMode); +static FSEventStreamRef (*pFSEventStreamCreate)(CFAllocatorRef, + FSEventStreamCallback, + FSEventStreamContext*, + CFArrayRef, + FSEventStreamEventId, + CFTimeInterval, + FSEventStreamCreateFlags); +static void (*pFSEventStreamFlushSync)(FSEventStreamRef); +static void (*pFSEventStreamInvalidate)(FSEventStreamRef); +static void (*pFSEventStreamRelease)(FSEventStreamRef); +static void (*pFSEventStreamScheduleWithRunLoop)(FSEventStreamRef, + CFRunLoopRef, + CFStringRef); +static Boolean (*pFSEventStreamStart)(FSEventStreamRef); +static void (*pFSEventStreamStop)(FSEventStreamRef); + +#define UV__FSEVENTS_PROCESS(handle, block) \ + do { \ + QUEUE events; \ + QUEUE* q; \ + uv__fsevents_event_t* event; \ + int err; \ + uv_mutex_lock(&(handle)->cf_mutex); \ + /* Split-off all events and empty original queue */ \ + QUEUE_MOVE(&(handle)->cf_events, &events); \ + /* Get error (if any) and zero original one */ \ + err = (handle)->cf_error; \ + (handle)->cf_error = 0; \ + uv_mutex_unlock(&(handle)->cf_mutex); \ + /* Loop through events, deallocating each after processing */ \ + while (!QUEUE_EMPTY(&events)) { \ + q = QUEUE_HEAD(&events); \ + event = QUEUE_DATA(q, uv__fsevents_event_t, member); \ + QUEUE_REMOVE(q); \ + /* NOTE: Checking uv__is_active() is required here, because handle \ + * callback may close handle and invoking it after it will lead to \ + * incorrect behaviour */ \ + if (!uv__is_closing((handle)) && uv__is_active((handle))) \ + block \ + /* Free allocated data */ \ + uv__free(event); \ + } \ + if (err != 0 && !uv__is_closing((handle)) && uv__is_active((handle))) \ + (handle)->cb((handle), NULL, 0, err); \ + } while (0) + + +/* Runs in UV loop's thread, when there're events to report to handle */ +static void uv__fsevents_cb(uv_async_t* cb) { + uv_fs_event_t* handle; + + handle = cb->data; + + UV__FSEVENTS_PROCESS(handle, { + handle->cb(handle, event->path[0] ? event->path : NULL, event->events, 0); + }); +} + + +/* Runs in CF thread, pushed event into handle's event list */ +static void uv__fsevents_push_event(uv_fs_event_t* handle, + QUEUE* events, + int err) { + assert(events != NULL || err != 0); + uv_mutex_lock(&handle->cf_mutex); + + /* Concatenate two queues */ + if (events != NULL) + QUEUE_ADD(&handle->cf_events, events); + + /* Propagate error */ + if (err != 0) + handle->cf_error = err; + uv_mutex_unlock(&handle->cf_mutex); + + uv_async_send(handle->cf_cb); +} + + +/* Runs in CF thread, when there're events in FSEventStream */ +static void uv__fsevents_event_cb(ConstFSEventStreamRef streamRef, + void* info, + size_t numEvents, + void* eventPaths, + const FSEventStreamEventFlags eventFlags[], + const FSEventStreamEventId eventIds[]) { + size_t i; + int len; + char** paths; + char* path; + char* pos; + uv_fs_event_t* handle; + QUEUE* q; + uv_loop_t* loop; + uv__cf_loop_state_t* state; + uv__fsevents_event_t* event; + QUEUE head; + + loop = info; + state = loop->cf_state; + assert(state != NULL); + paths = eventPaths; + + /* For each handle */ + uv_mutex_lock(&state->fsevent_mutex); + QUEUE_FOREACH(q, &state->fsevent_handles) { + handle = QUEUE_DATA(q, uv_fs_event_t, cf_member); + QUEUE_INIT(&head); + + /* Process and filter out events */ + for (i = 0; i < numEvents; i++) { + /* Ignore system events */ + if (eventFlags[i] & kFSEventsSystem) + continue; + + path = paths[i]; + len = strlen(path); + + /* Filter out paths that are outside handle's request */ + if (strncmp(path, handle->realpath, handle->realpath_len) != 0) + continue; + + if (handle->realpath_len > 1 || *handle->realpath != '/') { + path += handle->realpath_len; + len -= handle->realpath_len; + + /* Skip forward slash */ + if (*path != '\0') { + path++; + len--; + } + } + +#ifdef MAC_OS_X_VERSION_10_7 + /* Ignore events with path equal to directory itself */ + if (len == 0) + continue; +#endif /* MAC_OS_X_VERSION_10_7 */ + + /* Do not emit events from subdirectories (without option set) */ + if ((handle->cf_flags & UV_FS_EVENT_RECURSIVE) == 0 && *path != 0) { + pos = strchr(path + 1, '/'); + if (pos != NULL) + continue; + } + +#ifndef MAC_OS_X_VERSION_10_7 + path = ""; + len = 0; +#endif /* MAC_OS_X_VERSION_10_7 */ + + event = uv__malloc(sizeof(*event) + len); + if (event == NULL) + break; + + memset(event, 0, sizeof(*event)); + memcpy(event->path, path, len + 1); + + if ((eventFlags[i] & kFSEventsModified) != 0 && + (eventFlags[i] & kFSEventsRenamed) == 0) + event->events = UV_CHANGE; + else + event->events = UV_RENAME; + + QUEUE_INSERT_TAIL(&head, &event->member); + } + + if (!QUEUE_EMPTY(&head)) + uv__fsevents_push_event(handle, &head, 0); + } + uv_mutex_unlock(&state->fsevent_mutex); +} + + +/* Runs in CF thread */ +static int uv__fsevents_create_stream(uv_loop_t* loop, CFArrayRef paths) { + uv__cf_loop_state_t* state; + FSEventStreamContext ctx; + FSEventStreamRef ref; + CFAbsoluteTime latency; + FSEventStreamCreateFlags flags; + + /* Initialize context */ + ctx.version = 0; + ctx.info = loop; + ctx.retain = NULL; + ctx.release = NULL; + ctx.copyDescription = NULL; + + latency = 0.05; + + /* Explanation of selected flags: + * 1. NoDefer - without this flag, events that are happening continuously + * (i.e. each event is happening after time interval less than `latency`, + * counted from previous event), will be deferred and passed to callback + * once they'll either fill whole OS buffer, or when this continuous stream + * will stop (i.e. there'll be delay between events, bigger than + * `latency`). + * Specifying this flag will invoke callback after `latency` time passed + * since event. + * 2. FileEvents - fire callback for file changes too (by default it is firing + * it only for directory changes). + */ + flags = kFSEventStreamCreateFlagNoDefer | kFSEventStreamCreateFlagFileEvents; + + /* + * NOTE: It might sound like a good idea to remember last seen StreamEventId, + * but in reality one dir might have last StreamEventId less than, the other, + * that is being watched now. Which will cause FSEventStream API to report + * changes to files from the past. + */ + ref = pFSEventStreamCreate(NULL, + &uv__fsevents_event_cb, + &ctx, + paths, + kFSEventStreamEventIdSinceNow, + latency, + flags); + assert(ref != NULL); + + state = loop->cf_state; + pFSEventStreamScheduleWithRunLoop(ref, + state->loop, + *pkCFRunLoopDefaultMode); + if (!pFSEventStreamStart(ref)) { + pFSEventStreamInvalidate(ref); + pFSEventStreamRelease(ref); + return -EMFILE; + } + + state->fsevent_stream = ref; + return 0; +} + + +/* Runs in CF thread */ +static void uv__fsevents_destroy_stream(uv_loop_t* loop) { + uv__cf_loop_state_t* state; + + state = loop->cf_state; + + if (state->fsevent_stream == NULL) + return; + + /* Stop emitting events */ + pFSEventStreamStop(state->fsevent_stream); + + /* Release stream */ + pFSEventStreamInvalidate(state->fsevent_stream); + pFSEventStreamRelease(state->fsevent_stream); + state->fsevent_stream = NULL; +} + + +/* Runs in CF thread, when there're new fsevent handles to add to stream */ +static void uv__fsevents_reschedule(uv_fs_event_t* handle, + uv__cf_loop_signal_type_t type) { + uv__cf_loop_state_t* state; + QUEUE* q; + uv_fs_event_t* curr; + CFArrayRef cf_paths; + CFStringRef* paths; + unsigned int i; + int err; + unsigned int path_count; + + state = handle->loop->cf_state; + paths = NULL; + cf_paths = NULL; + err = 0; + /* NOTE: `i` is used in deallocation loop below */ + i = 0; + + /* Optimization to prevent O(n^2) time spent when starting to watch + * many files simultaneously + */ + uv_mutex_lock(&state->fsevent_mutex); + if (state->fsevent_need_reschedule == 0) { + uv_mutex_unlock(&state->fsevent_mutex); + goto final; + } + state->fsevent_need_reschedule = 0; + uv_mutex_unlock(&state->fsevent_mutex); + + /* Destroy previous FSEventStream */ + uv__fsevents_destroy_stream(handle->loop); + + /* Any failure below will be a memory failure */ + err = -ENOMEM; + + /* Create list of all watched paths */ + uv_mutex_lock(&state->fsevent_mutex); + path_count = state->fsevent_handle_count; + if (path_count != 0) { + paths = uv__malloc(sizeof(*paths) * path_count); + if (paths == NULL) { + uv_mutex_unlock(&state->fsevent_mutex); + goto final; + } + + q = &state->fsevent_handles; + for (; i < path_count; i++) { + q = QUEUE_NEXT(q); + assert(q != &state->fsevent_handles); + curr = QUEUE_DATA(q, uv_fs_event_t, cf_member); + + assert(curr->realpath != NULL); + paths[i] = + pCFStringCreateWithFileSystemRepresentation(NULL, curr->realpath); + if (paths[i] == NULL) { + uv_mutex_unlock(&state->fsevent_mutex); + goto final; + } + } + } + uv_mutex_unlock(&state->fsevent_mutex); + err = 0; + + if (path_count != 0) { + /* Create new FSEventStream */ + cf_paths = pCFArrayCreate(NULL, (const void**) paths, path_count, NULL); + if (cf_paths == NULL) { + err = -ENOMEM; + goto final; + } + err = uv__fsevents_create_stream(handle->loop, cf_paths); + } + +final: + /* Deallocate all paths in case of failure */ + if (err != 0) { + if (cf_paths == NULL) { + while (i != 0) + pCFRelease(paths[--i]); + uv__free(paths); + } else { + /* CFArray takes ownership of both strings and original C-array */ + pCFRelease(cf_paths); + } + + /* Broadcast error to all handles */ + uv_mutex_lock(&state->fsevent_mutex); + QUEUE_FOREACH(q, &state->fsevent_handles) { + curr = QUEUE_DATA(q, uv_fs_event_t, cf_member); + uv__fsevents_push_event(curr, NULL, err); + } + uv_mutex_unlock(&state->fsevent_mutex); + } + + /* + * Main thread will block until the removal of handle from the list, + * we must tell it when we're ready. + * + * NOTE: This is coupled with `uv_sem_wait()` in `uv__fsevents_close` + */ + if (type == kUVCFLoopSignalClosing) + uv_sem_post(&state->fsevent_sem); +} + + +static int uv__fsevents_global_init(void) { + static pthread_mutex_t global_init_mutex = PTHREAD_MUTEX_INITIALIZER; + static void* core_foundation_handle; + static void* core_services_handle; + int err; + + err = 0; + pthread_mutex_lock(&global_init_mutex); + if (core_foundation_handle != NULL) + goto out; + + /* The libraries are never unloaded because we currently don't have a good + * mechanism for keeping a reference count. It's unlikely to be an issue + * but if it ever becomes one, we can turn the dynamic library handles into + * per-event loop properties and have the dynamic linker keep track for us. + */ + err = -ENOSYS; + core_foundation_handle = dlopen("/System/Library/Frameworks/" + "CoreFoundation.framework/" + "Versions/A/CoreFoundation", + RTLD_LAZY | RTLD_LOCAL); + if (core_foundation_handle == NULL) + goto out; + + core_services_handle = dlopen("/System/Library/Frameworks/" + "CoreServices.framework/" + "Versions/A/CoreServices", + RTLD_LAZY | RTLD_LOCAL); + if (core_services_handle == NULL) + goto out; + + err = -ENOENT; +#define V(handle, symbol) \ + do { \ + *(void **)(&p ## symbol) = dlsym((handle), #symbol); \ + if (p ## symbol == NULL) \ + goto out; \ + } \ + while (0) + V(core_foundation_handle, CFArrayCreate); + V(core_foundation_handle, CFRelease); + V(core_foundation_handle, CFRunLoopAddSource); + V(core_foundation_handle, CFRunLoopGetCurrent); + V(core_foundation_handle, CFRunLoopRemoveSource); + V(core_foundation_handle, CFRunLoopRun); + V(core_foundation_handle, CFRunLoopSourceCreate); + V(core_foundation_handle, CFRunLoopSourceSignal); + V(core_foundation_handle, CFRunLoopStop); + V(core_foundation_handle, CFRunLoopWakeUp); + V(core_foundation_handle, CFStringCreateWithFileSystemRepresentation); + V(core_foundation_handle, CFStringGetSystemEncoding); + V(core_foundation_handle, kCFRunLoopDefaultMode); + V(core_services_handle, FSEventStreamCreate); + V(core_services_handle, FSEventStreamFlushSync); + V(core_services_handle, FSEventStreamInvalidate); + V(core_services_handle, FSEventStreamRelease); + V(core_services_handle, FSEventStreamScheduleWithRunLoop); + V(core_services_handle, FSEventStreamStart); + V(core_services_handle, FSEventStreamStop); +#undef V + err = 0; + +out: + if (err && core_services_handle != NULL) { + dlclose(core_services_handle); + core_services_handle = NULL; + } + + if (err && core_foundation_handle != NULL) { + dlclose(core_foundation_handle); + core_foundation_handle = NULL; + } + + pthread_mutex_unlock(&global_init_mutex); + return err; +} + + +/* Runs in UV loop */ +static int uv__fsevents_loop_init(uv_loop_t* loop) { + CFRunLoopSourceContext ctx; + uv__cf_loop_state_t* state; + pthread_attr_t attr_storage; + pthread_attr_t* attr; + int err; + + if (loop->cf_state != NULL) + return 0; + + err = uv__fsevents_global_init(); + if (err) + return err; + + state = uv__calloc(1, sizeof(*state)); + if (state == NULL) + return -ENOMEM; + + err = uv_mutex_init(&loop->cf_mutex); + if (err) + goto fail_mutex_init; + + err = uv_sem_init(&loop->cf_sem, 0); + if (err) + goto fail_sem_init; + + QUEUE_INIT(&loop->cf_signals); + + err = uv_sem_init(&state->fsevent_sem, 0); + if (err) + goto fail_fsevent_sem_init; + + err = uv_mutex_init(&state->fsevent_mutex); + if (err) + goto fail_fsevent_mutex_init; + + QUEUE_INIT(&state->fsevent_handles); + state->fsevent_need_reschedule = 0; + state->fsevent_handle_count = 0; + + memset(&ctx, 0, sizeof(ctx)); + ctx.info = loop; + ctx.perform = uv__cf_loop_cb; + state->signal_source = pCFRunLoopSourceCreate(NULL, 0, &ctx); + if (state->signal_source == NULL) { + err = -ENOMEM; + goto fail_signal_source_create; + } + + /* In the unlikely event that pthread_attr_init() fails, create the thread + * with the default stack size. We'll use a little more address space but + * that in itself is not a fatal error. + */ + attr = &attr_storage; + if (pthread_attr_init(attr)) + attr = NULL; + + if (attr != NULL) + if (pthread_attr_setstacksize(attr, 4 * PTHREAD_STACK_MIN)) + abort(); + + loop->cf_state = state; + + /* uv_thread_t is an alias for pthread_t. */ + err = -pthread_create(&loop->cf_thread, attr, uv__cf_loop_runner, loop); + + if (attr != NULL) + pthread_attr_destroy(attr); + + if (err) + goto fail_thread_create; + + /* Synchronize threads */ + uv_sem_wait(&loop->cf_sem); + return 0; + +fail_thread_create: + loop->cf_state = NULL; + +fail_signal_source_create: + uv_mutex_destroy(&state->fsevent_mutex); + +fail_fsevent_mutex_init: + uv_sem_destroy(&state->fsevent_sem); + +fail_fsevent_sem_init: + uv_sem_destroy(&loop->cf_sem); + +fail_sem_init: + uv_mutex_destroy(&loop->cf_mutex); + +fail_mutex_init: + uv__free(state); + return err; +} + + +/* Runs in UV loop */ +void uv__fsevents_loop_delete(uv_loop_t* loop) { + uv__cf_loop_signal_t* s; + uv__cf_loop_state_t* state; + QUEUE* q; + + if (loop->cf_state == NULL) + return; + + if (uv__cf_loop_signal(loop, NULL, kUVCFLoopSignalRegular) != 0) + abort(); + + uv_thread_join(&loop->cf_thread); + uv_sem_destroy(&loop->cf_sem); + uv_mutex_destroy(&loop->cf_mutex); + + /* Free any remaining data */ + while (!QUEUE_EMPTY(&loop->cf_signals)) { + q = QUEUE_HEAD(&loop->cf_signals); + s = QUEUE_DATA(q, uv__cf_loop_signal_t, member); + QUEUE_REMOVE(q); + uv__free(s); + } + + /* Destroy state */ + state = loop->cf_state; + uv_sem_destroy(&state->fsevent_sem); + uv_mutex_destroy(&state->fsevent_mutex); + pCFRelease(state->signal_source); + uv__free(state); + loop->cf_state = NULL; +} + + +/* Runs in CF thread. This is the CF loop's body */ +static void* uv__cf_loop_runner(void* arg) { + uv_loop_t* loop; + uv__cf_loop_state_t* state; + + loop = arg; + state = loop->cf_state; + state->loop = pCFRunLoopGetCurrent(); + + pCFRunLoopAddSource(state->loop, + state->signal_source, + *pkCFRunLoopDefaultMode); + + uv_sem_post(&loop->cf_sem); + + pCFRunLoopRun(); + pCFRunLoopRemoveSource(state->loop, + state->signal_source, + *pkCFRunLoopDefaultMode); + + return NULL; +} + + +/* Runs in CF thread, executed after `uv__cf_loop_signal()` */ +static void uv__cf_loop_cb(void* arg) { + uv_loop_t* loop; + uv__cf_loop_state_t* state; + QUEUE* item; + QUEUE split_head; + uv__cf_loop_signal_t* s; + + loop = arg; + state = loop->cf_state; + + uv_mutex_lock(&loop->cf_mutex); + QUEUE_MOVE(&loop->cf_signals, &split_head); + uv_mutex_unlock(&loop->cf_mutex); + + while (!QUEUE_EMPTY(&split_head)) { + item = QUEUE_HEAD(&split_head); + QUEUE_REMOVE(item); + + s = QUEUE_DATA(item, uv__cf_loop_signal_t, member); + + /* This was a termination signal */ + if (s->handle == NULL) + pCFRunLoopStop(state->loop); + else + uv__fsevents_reschedule(s->handle, s->type); + + uv__free(s); + } +} + + +/* Runs in UV loop to notify CF thread */ +int uv__cf_loop_signal(uv_loop_t* loop, + uv_fs_event_t* handle, + uv__cf_loop_signal_type_t type) { + uv__cf_loop_signal_t* item; + uv__cf_loop_state_t* state; + + item = uv__malloc(sizeof(*item)); + if (item == NULL) + return -ENOMEM; + + item->handle = handle; + item->type = type; + + uv_mutex_lock(&loop->cf_mutex); + QUEUE_INSERT_TAIL(&loop->cf_signals, &item->member); + uv_mutex_unlock(&loop->cf_mutex); + + state = loop->cf_state; + assert(state != NULL); + pCFRunLoopSourceSignal(state->signal_source); + pCFRunLoopWakeUp(state->loop); + + return 0; +} + + +/* Runs in UV loop to initialize handle */ +int uv__fsevents_init(uv_fs_event_t* handle) { + int err; + uv__cf_loop_state_t* state; + + err = uv__fsevents_loop_init(handle->loop); + if (err) + return err; + + /* Get absolute path to file */ + handle->realpath = realpath(handle->path, NULL); + if (handle->realpath == NULL) + return -errno; + handle->realpath_len = strlen(handle->realpath); + + /* Initialize event queue */ + QUEUE_INIT(&handle->cf_events); + handle->cf_error = 0; + + /* + * Events will occur in other thread. + * Initialize callback for getting them back into event loop's thread + */ + handle->cf_cb = uv__malloc(sizeof(*handle->cf_cb)); + if (handle->cf_cb == NULL) { + err = -ENOMEM; + goto fail_cf_cb_malloc; + } + + handle->cf_cb->data = handle; + uv_async_init(handle->loop, handle->cf_cb, uv__fsevents_cb); + handle->cf_cb->flags |= UV__HANDLE_INTERNAL; + uv_unref((uv_handle_t*) handle->cf_cb); + + err = uv_mutex_init(&handle->cf_mutex); + if (err) + goto fail_cf_mutex_init; + + /* Insert handle into the list */ + state = handle->loop->cf_state; + uv_mutex_lock(&state->fsevent_mutex); + QUEUE_INSERT_TAIL(&state->fsevent_handles, &handle->cf_member); + state->fsevent_handle_count++; + state->fsevent_need_reschedule = 1; + uv_mutex_unlock(&state->fsevent_mutex); + + /* Reschedule FSEventStream */ + assert(handle != NULL); + err = uv__cf_loop_signal(handle->loop, handle, kUVCFLoopSignalRegular); + if (err) + goto fail_loop_signal; + + return 0; + +fail_loop_signal: + uv_mutex_destroy(&handle->cf_mutex); + +fail_cf_mutex_init: + uv__free(handle->cf_cb); + handle->cf_cb = NULL; + +fail_cf_cb_malloc: + uv__free(handle->realpath); + handle->realpath = NULL; + handle->realpath_len = 0; + + return err; +} + + +/* Runs in UV loop to de-initialize handle */ +int uv__fsevents_close(uv_fs_event_t* handle) { + int err; + uv__cf_loop_state_t* state; + + if (handle->cf_cb == NULL) + return -EINVAL; + + /* Remove handle from the list */ + state = handle->loop->cf_state; + uv_mutex_lock(&state->fsevent_mutex); + QUEUE_REMOVE(&handle->cf_member); + state->fsevent_handle_count--; + state->fsevent_need_reschedule = 1; + uv_mutex_unlock(&state->fsevent_mutex); + + /* Reschedule FSEventStream */ + assert(handle != NULL); + err = uv__cf_loop_signal(handle->loop, handle, kUVCFLoopSignalClosing); + if (err) + return -err; + + /* Wait for deinitialization */ + uv_sem_wait(&state->fsevent_sem); + + uv_close((uv_handle_t*) handle->cf_cb, (uv_close_cb) uv__free); + handle->cf_cb = NULL; + + /* Free data in queue */ + UV__FSEVENTS_PROCESS(handle, { + /* NOP */ + }); + + uv_mutex_destroy(&handle->cf_mutex); + uv__free(handle->realpath); + handle->realpath = NULL; + handle->realpath_len = 0; + + return 0; +} + +#endif /* TARGET_OS_IPHONE */ diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/getaddrinfo.c b/lib/ESPiLight/pilight/libs/libuv/unix/getaddrinfo.c new file mode 100644 index 0000000..2049aea --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/getaddrinfo.c @@ -0,0 +1,202 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* Expose glibc-specific EAI_* error codes. Needs to be defined before we + * include any headers. + */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + +#include "uv.h" +#include "internal.h" + +#include +#include /* NULL */ +#include +#include + +/* EAI_* constants. */ +#include + + +int uv__getaddrinfo_translate_error(int sys_err) { + switch (sys_err) { + case 0: return 0; +#if defined(EAI_ADDRFAMILY) + case EAI_ADDRFAMILY: return UV_EAI_ADDRFAMILY; +#endif +#if defined(EAI_AGAIN) + case EAI_AGAIN: return UV_EAI_AGAIN; +#endif +#if defined(EAI_BADFLAGS) + case EAI_BADFLAGS: return UV_EAI_BADFLAGS; +#endif +#if defined(EAI_BADHINTS) + case EAI_BADHINTS: return UV_EAI_BADHINTS; +#endif +#if defined(EAI_CANCELED) + case EAI_CANCELED: return UV_EAI_CANCELED; +#endif +#if defined(EAI_FAIL) + case EAI_FAIL: return UV_EAI_FAIL; +#endif +#if defined(EAI_FAMILY) + case EAI_FAMILY: return UV_EAI_FAMILY; +#endif +#if defined(EAI_MEMORY) + case EAI_MEMORY: return UV_EAI_MEMORY; +#endif +#if defined(EAI_NODATA) + case EAI_NODATA: return UV_EAI_NODATA; +#endif +#if defined(EAI_NONAME) +# if !defined(EAI_NODATA) || EAI_NODATA != EAI_NONAME + case EAI_NONAME: return UV_EAI_NONAME; +# endif +#endif +#if defined(EAI_OVERFLOW) + case EAI_OVERFLOW: return UV_EAI_OVERFLOW; +#endif +#if defined(EAI_PROTOCOL) + case EAI_PROTOCOL: return UV_EAI_PROTOCOL; +#endif +#if defined(EAI_SERVICE) + case EAI_SERVICE: return UV_EAI_SERVICE; +#endif +#if defined(EAI_SOCKTYPE) + case EAI_SOCKTYPE: return UV_EAI_SOCKTYPE; +#endif +#if defined(EAI_SYSTEM) + case EAI_SYSTEM: return -errno; +#endif + } + assert(!"unknown EAI_* error code"); + abort(); + return 0; /* Pacify compiler. */ +} + + +static void uv__getaddrinfo_work(struct uv__work* w) { + uv_getaddrinfo_t* req; + int err; + + req = container_of(w, uv_getaddrinfo_t, work_req); + err = getaddrinfo(req->hostname, req->service, req->hints, &req->addrinfo); + req->retcode = uv__getaddrinfo_translate_error(err); +} + + +static void uv__getaddrinfo_done(struct uv__work* w, int status) { + uv_getaddrinfo_t* req; + + req = container_of(w, uv_getaddrinfo_t, work_req); + uv__req_unregister(req->loop, req); + + /* See initialization in uv_getaddrinfo(). */ + if (req->hints) + uv__free(req->hints); + else if (req->service) + uv__free(req->service); + else if (req->hostname) + uv__free(req->hostname); + else + assert(0); + + req->hints = NULL; + req->service = NULL; + req->hostname = NULL; + + if (status == -ECANCELED) { + assert(req->retcode == 0); + req->retcode = UV_EAI_CANCELED; + } + + if (req->cb) + req->cb(req, req->retcode, req->addrinfo); +} + + +int uv_getaddrinfo(uv_loop_t* loop, + uv_getaddrinfo_t* req, + uv_getaddrinfo_cb cb, + const char* hostname, + const char* service, + const struct addrinfo* hints) { + size_t hostname_len; + size_t service_len; + size_t hints_len; + size_t len; + char* buf; + + if (req == NULL || (hostname == NULL && service == NULL)) + return -EINVAL; + + hostname_len = hostname ? strlen(hostname) + 1 : 0; + service_len = service ? strlen(service) + 1 : 0; + hints_len = hints ? sizeof(*hints) : 0; + buf = uv__malloc(hostname_len + service_len + hints_len); + + if (buf == NULL) + return -ENOMEM; + + uv__req_init(loop, req, UV_GETADDRINFO); + req->loop = loop; + req->cb = cb; + req->addrinfo = NULL; + req->hints = NULL; + req->service = NULL; + req->hostname = NULL; + req->retcode = 0; + + /* order matters, see uv_getaddrinfo_done() */ + len = 0; + + if (hints) { + req->hints = memcpy(buf + len, hints, sizeof(*hints)); + len += sizeof(*hints); + } + + if (service) { + req->service = memcpy(buf + len, service, service_len); + len += service_len; + } + + if (hostname) + req->hostname = memcpy(buf + len, hostname, hostname_len); + + if (cb) { + uv__work_submit(loop, + &req->work_req, + uv__getaddrinfo_work, + uv__getaddrinfo_done); + return 0; + } else { + uv__getaddrinfo_work(&req->work_req); + uv__getaddrinfo_done(&req->work_req, 0); + return req->retcode; + } +} + + +void uv_freeaddrinfo(struct addrinfo* ai) { + if (ai) + freeaddrinfo(ai); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/getnameinfo.c b/lib/ESPiLight/pilight/libs/libuv/unix/getnameinfo.c new file mode 100644 index 0000000..daa798a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/getnameinfo.c @@ -0,0 +1,120 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to +* deal in the Software without restriction, including without limitation the +* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +* sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +* IN THE SOFTWARE. +*/ + +#include +#include +#include +#include + +#include "uv.h" +#include "internal.h" + + +static void uv__getnameinfo_work(struct uv__work* w) { + uv_getnameinfo_t* req; + int err; + socklen_t salen; + + req = container_of(w, uv_getnameinfo_t, work_req); + + if (req->storage.ss_family == AF_INET) + salen = sizeof(struct sockaddr_in); + else if (req->storage.ss_family == AF_INET6) + salen = sizeof(struct sockaddr_in6); + else + abort(); + + err = getnameinfo((struct sockaddr*) &req->storage, + salen, + req->host, + sizeof(req->host), + req->service, + sizeof(req->service), + req->flags); + req->retcode = uv__getaddrinfo_translate_error(err); +} + +static void uv__getnameinfo_done(struct uv__work* w, int status) { + uv_getnameinfo_t* req; + char* host; + char* service; + + req = container_of(w, uv_getnameinfo_t, work_req); + uv__req_unregister(req->loop, req); + host = service = NULL; + + if (status == -ECANCELED) { + assert(req->retcode == 0); + req->retcode = UV_EAI_CANCELED; + } else if (req->retcode == 0) { + host = req->host; + service = req->service; + } + + if (req->getnameinfo_cb) + req->getnameinfo_cb(req, req->retcode, host, service); +} + +/* +* Entry point for getnameinfo +* return 0 if a callback will be made +* return error code if validation fails +*/ +int uv_getnameinfo(uv_loop_t* loop, + uv_getnameinfo_t* req, + uv_getnameinfo_cb getnameinfo_cb, + const struct sockaddr* addr, + int flags) { + if (req == NULL || addr == NULL) + return UV_EINVAL; + + if (addr->sa_family == AF_INET) { + memcpy(&req->storage, + addr, + sizeof(struct sockaddr_in)); + } else if (addr->sa_family == AF_INET6) { + memcpy(&req->storage, + addr, + sizeof(struct sockaddr_in6)); + } else { + return UV_EINVAL; + } + + uv__req_init(loop, (uv_req_t*)req, UV_GETNAMEINFO); + + req->getnameinfo_cb = getnameinfo_cb; + req->flags = flags; + req->type = UV_GETNAMEINFO; + req->loop = loop; + req->retcode = 0; + + if (getnameinfo_cb) { + uv__work_submit(loop, + &req->work_req, + uv__getnameinfo_work, + uv__getnameinfo_done); + return 0; + } else { + uv__getnameinfo_work(&req->work_req); + uv__getnameinfo_done(&req->work_req, 0); + return req->retcode; + } +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/internal.h b/lib/ESPiLight/pilight/libs/libuv/unix/internal.h new file mode 100644 index 0000000..c0898d9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/internal.h @@ -0,0 +1,338 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_UNIX_INTERNAL_H_ +#define UV_UNIX_INTERNAL_H_ + +#include "uv-common.h" + +#include +#include /* abort */ +#include /* strrchr */ +#include /* O_CLOEXEC, may be */ +#include + +#if defined(__STRICT_ANSI__) +# define inline __inline +#endif + +#if defined(__linux__) +# include "linux-syscalls.h" +#endif /* __linux__ */ + +#if defined(__MVS__) +# include "os390-syscalls.h" +#endif /* __MVS__ */ + +#if defined(__sun) +# include +# include +#endif /* __sun */ + +#if defined(_AIX) +# define reqevents events +# define rtnevents revents +# include +#else +# include +#endif /* _AIX */ + +#if defined(__APPLE__) && !TARGET_OS_IPHONE +# include +#endif + +#if defined(__ANDROID__) +int uv__pthread_sigmask(int how, const sigset_t* set, sigset_t* oset); +# ifdef pthread_sigmask +# undef pthread_sigmask +# endif +# define pthread_sigmask(how, set, oldset) uv__pthread_sigmask(how, set, oldset) +#endif + +#define ACCESS_ONCE(type, var) \ + (*(volatile type*) &(var)) + +#define ROUND_UP(a, b) \ + ((a) % (b) ? ((a) + (b)) - ((a) % (b)) : (a)) + +#define UNREACHABLE() \ + do { \ + assert(0 && "unreachable code"); \ + abort(); \ + } \ + while (0) + +#define SAVE_ERRNO(block) \ + do { \ + int _saved_errno = errno; \ + do { block; } while (0); \ + errno = _saved_errno; \ + } \ + while (0) + +/* The __clang__ and __INTEL_COMPILER checks are superfluous because they + * define __GNUC__. They are here to convey to you, dear reader, that these + * macros are enabled when compiling with clang or icc. + */ +#if defined(__clang__) || \ + defined(__GNUC__) || \ + defined(__INTEL_COMPILER) || \ + defined(__SUNPRO_C) +# define UV_DESTRUCTOR(declaration) __attribute__((destructor)) declaration +# define UV_UNUSED(declaration) __attribute__((unused)) declaration +#else +# define UV_DESTRUCTOR(declaration) declaration +# define UV_UNUSED(declaration) declaration +#endif + +/* Leans on the fact that, on Linux, POLLRDHUP == EPOLLRDHUP. */ +#ifdef POLLRDHUP +# define UV__POLLRDHUP POLLRDHUP +#else +# define UV__POLLRDHUP 0x2000 +#endif + +#ifdef POLLPRI +# define UV__POLLPRI POLLPRI +#else +# define UV__POLLPRI 0 +#endif + +#if !defined(O_CLOEXEC) && defined(__FreeBSD__) +/* + * It may be that we are just missing `__POSIX_VISIBLE >= 200809`. + * Try using fixed value const and give up, if it doesn't work + */ +# define O_CLOEXEC 0x00100000 +#endif + +typedef struct uv__stream_queued_fds_s uv__stream_queued_fds_t; + +/* handle flags */ +enum { + UV_CLOSING = 0x01, /* uv_close() called but not finished. */ + UV_CLOSED = 0x02, /* close(2) finished. */ + UV_STREAM_READING = 0x04, /* uv_read_start() called. */ + UV_STREAM_SHUTTING = 0x08, /* uv_shutdown() called but not complete. */ + UV_STREAM_SHUT = 0x10, /* Write side closed. */ + UV_STREAM_READABLE = 0x20, /* The stream is readable */ + UV_STREAM_WRITABLE = 0x40, /* The stream is writable */ + UV_STREAM_BLOCKING = 0x80, /* Synchronous writes. */ + UV_STREAM_READ_PARTIAL = 0x100, /* read(2) read less than requested. */ + UV_STREAM_READ_EOF = 0x200, /* read(2) read EOF. */ + UV_TCP_NODELAY = 0x400, /* Disable Nagle. */ + UV_TCP_KEEPALIVE = 0x800, /* Turn on keep-alive. */ + UV_TCP_SINGLE_ACCEPT = 0x1000, /* Only accept() when idle. */ + UV_HANDLE_IPV6 = 0x10000, /* Handle is bound to a IPv6 socket. */ + UV_UDP_PROCESSING = 0x20000, /* Handle is running the send callback queue. */ + UV_HANDLE_BOUND = 0x40000 /* Handle is bound to an address and port */ +}; + +/* loop flags */ +enum { + UV_LOOP_BLOCK_SIGPROF = 1 +}; + +/* flags of excluding ifaddr */ +enum { + UV__EXCLUDE_IFPHYS, + UV__EXCLUDE_IFADDR +}; + +typedef enum { + UV_CLOCK_PRECISE = 0, /* Use the highest resolution clock available. */ + UV_CLOCK_FAST = 1 /* Use the fastest clock with <= 1ms granularity. */ +} uv_clocktype_t; + +struct uv__stream_queued_fds_s { + unsigned int size; + unsigned int offset; + int fds[1]; +}; + + +#if defined(_AIX) || \ + defined(__APPLE__) || \ + defined(__DragonFly__) || \ + defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) || \ + defined(__linux__) || \ + defined(__OpenBSD__) +#define uv__cloexec uv__cloexec_ioctl +#define uv__nonblock uv__nonblock_ioctl +#else +#define uv__cloexec uv__cloexec_fcntl +#define uv__nonblock uv__nonblock_fcntl +#endif + +/* core */ +int uv__cloexec_ioctl(int fd, int set); +int uv__cloexec_fcntl(int fd, int set); +int uv__nonblock_ioctl(int fd, int set); +int uv__nonblock_fcntl(int fd, int set); +int uv__close(int fd); +int uv__close_nocheckstdio(int fd); +int uv__socket(int domain, int type, int protocol); +int uv__dup(int fd); +ssize_t uv__recvmsg(int fd, struct msghdr *msg, int flags); +void uv__make_close_pending(uv_handle_t* handle); +int uv__getiovmax(void); + +void uv__io_init(uv__io_t* w, uv__io_cb cb, int fd); +void uv__io_start(uv_loop_t* loop, uv__io_t* w, unsigned int events); +void uv__io_stop(uv_loop_t* loop, uv__io_t* w, unsigned int events); +void uv__io_close(uv_loop_t* loop, uv__io_t* w); +void uv__io_feed(uv_loop_t* loop, uv__io_t* w); +int uv__io_active(const uv__io_t* w, unsigned int events); +int uv__io_check_fd(uv_loop_t* loop, int fd); +void uv__io_poll(uv_loop_t* loop, int timeout); /* in milliseconds or -1 */ +int uv__io_fork(uv_loop_t* loop); + +/* async */ +void uv__async_stop(uv_loop_t* loop); +int uv__async_fork(uv_loop_t* loop); + + +/* loop */ +void uv__run_idle(uv_loop_t* loop); +void uv__run_check(uv_loop_t* loop); +void uv__run_prepare(uv_loop_t* loop); + +/* stream */ +void uv__stream_init(uv_loop_t* loop, uv_stream_t* stream, + uv_handle_type type); +int uv__stream_open(uv_stream_t*, int fd, int flags); +void uv__stream_destroy(uv_stream_t* stream); +#if defined(__APPLE__) +int uv__stream_try_select(uv_stream_t* stream, int* fd); +#endif /* defined(__APPLE__) */ +void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events); +int uv__accept(int sockfd); +int uv__dup2_cloexec(int oldfd, int newfd); +int uv__open_cloexec(const char* path, int flags); + +/* tcp */ +int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb); +int uv__tcp_nodelay(int fd, int on); +int uv__tcp_keepalive(int fd, int on, unsigned int delay); + +/* pipe */ +int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb); + +/* timer */ +void uv__run_timers(uv_loop_t* loop); +int uv__next_timeout(const uv_loop_t* loop); + +/* signal */ +void uv__signal_close(uv_signal_t* handle); +void uv__signal_global_once_init(void); +void uv__signal_loop_cleanup(uv_loop_t* loop); +int uv__signal_loop_fork(uv_loop_t* loop); + +/* platform specific */ +uint64_t uv__hrtime(uv_clocktype_t type); +int uv__kqueue_init(uv_loop_t* loop); +int uv__platform_loop_init(uv_loop_t* loop); +void uv__platform_loop_delete(uv_loop_t* loop); +void uv__platform_invalidate_fd(uv_loop_t* loop, int fd); + +/* various */ +void uv__async_close(uv_async_t* handle); +void uv__check_close(uv_check_t* handle); +void uv__fs_event_close(uv_fs_event_t* handle); +void uv__idle_close(uv_idle_t* handle); +void uv__pipe_close(uv_pipe_t* handle); +void uv__poll_close(uv_poll_t* handle); +void uv__prepare_close(uv_prepare_t* handle); +void uv__process_close(uv_process_t* handle); +void uv__stream_close(uv_stream_t* handle); +void uv__tcp_close(uv_tcp_t* handle); +void uv__timer_close(uv_timer_t* handle); +void uv__udp_close(uv_udp_t* handle); +void uv__udp_finish_close(uv_udp_t* handle); +uv_handle_type uv__handle_type(int fd); +FILE* uv__open_file(const char* path); +int uv__getpwuid_r(uv_passwd_t* pwd); + + +#if defined(__APPLE__) +int uv___stream_fd(const uv_stream_t* handle); +#define uv__stream_fd(handle) (uv___stream_fd((const uv_stream_t*) (handle))) +#else +#define uv__stream_fd(handle) ((handle)->io_watcher.fd) +#endif /* defined(__APPLE__) */ + +#ifdef UV__O_NONBLOCK +# define UV__F_NONBLOCK UV__O_NONBLOCK +#else +# define UV__F_NONBLOCK 1 +#endif + +int uv__make_socketpair(int fds[2], int flags); +int uv__make_pipe(int fds[2], int flags); + +#if defined(__APPLE__) + +int uv__fsevents_init(uv_fs_event_t* handle); +int uv__fsevents_close(uv_fs_event_t* handle); +void uv__fsevents_loop_delete(uv_loop_t* loop); + +/* OSX < 10.7 has no file events, polyfill them */ +#ifndef MAC_OS_X_VERSION_10_7 + +static const int kFSEventStreamCreateFlagFileEvents = 0x00000010; +static const int kFSEventStreamEventFlagItemCreated = 0x00000100; +static const int kFSEventStreamEventFlagItemRemoved = 0x00000200; +static const int kFSEventStreamEventFlagItemInodeMetaMod = 0x00000400; +static const int kFSEventStreamEventFlagItemRenamed = 0x00000800; +static const int kFSEventStreamEventFlagItemModified = 0x00001000; +static const int kFSEventStreamEventFlagItemFinderInfoMod = 0x00002000; +static const int kFSEventStreamEventFlagItemChangeOwner = 0x00004000; +static const int kFSEventStreamEventFlagItemXattrMod = 0x00008000; +static const int kFSEventStreamEventFlagItemIsFile = 0x00010000; +static const int kFSEventStreamEventFlagItemIsDir = 0x00020000; +static const int kFSEventStreamEventFlagItemIsSymlink = 0x00040000; + +#endif /* __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070 */ + +#endif /* defined(__APPLE__) */ + +UV_UNUSED(static void uv__update_time(uv_loop_t* loop)) { + /* Use a fast time source if available. We only need millisecond precision. + */ + loop->time = uv__hrtime(UV_CLOCK_FAST) / 1000000; +} + +UV_UNUSED(static char* uv__basename_r(const char* path)) { + char* s; + + s = strrchr(path, '/'); + if (s == NULL) + return (char*) path; + + return s + 1; +} + +#if defined(__linux__) +int uv__inotify_fork(uv_loop_t* loop, void* old_watchers); +#endif + +#endif /* UV_UNIX_INTERNAL_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/kqueue.c b/lib/ESPiLight/pilight/libs/libuv/unix/kqueue.c new file mode 100644 index 0000000..300bac0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/kqueue.c @@ -0,0 +1,532 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +/* + * Required on + * - Until at least FreeBSD 11.0 + * - Older versions of Mac OS X + * + * http://www.boost.org/doc/libs/1_61_0/boost/asio/detail/kqueue_reactor.hpp + */ +#ifndef EV_OOBAND +#define EV_OOBAND EV_FLAG1 +#endif + +static void uv__fs_event(uv_loop_t* loop, uv__io_t* w, unsigned int fflags); + + +int uv__kqueue_init(uv_loop_t* loop) { + loop->backend_fd = kqueue(); + if (loop->backend_fd == -1) + return -errno; + + uv__cloexec(loop->backend_fd, 1); + + return 0; +} + + +static int uv__has_forked_with_cfrunloop; + +int uv__io_fork(uv_loop_t* loop) { + int err; + uv__close(loop->backend_fd); + loop->backend_fd = -1; + err = uv__kqueue_init(loop); + if (err) + return err; + +#if defined(__APPLE__) + if (loop->cf_state != NULL) { + /* We cannot start another CFRunloop and/or thread in the child + process; CF aborts if you try or if you try to touch the thread + at all to kill it. So the best we can do is ignore it from now + on. This means we can't watch directories in the same way + anymore (like other BSDs). It also means we cannot properly + clean up the allocated resources; calling + uv__fsevents_loop_delete from uv_loop_close will crash the + process. So we sidestep the issue by pretending like we never + started it in the first place. + */ + uv__has_forked_with_cfrunloop = 1; + uv__free(loop->cf_state); + loop->cf_state = NULL; + } +#endif + return err; +} + + +int uv__io_check_fd(uv_loop_t* loop, int fd) { + struct kevent ev; + int rc; + + rc = 0; + EV_SET(&ev, fd, EVFILT_READ, EV_ADD, 0, 0, 0); + if (kevent(loop->backend_fd, &ev, 1, NULL, 0, NULL)) + rc = -errno; + + EV_SET(&ev, fd, EVFILT_READ, EV_DELETE, 0, 0, 0); + if (rc == 0) + if (kevent(loop->backend_fd, &ev, 1, NULL, 0, NULL)) + abort(); + + return rc; +} + + +void uv__io_poll(uv_loop_t* loop, int timeout) { + struct kevent events[1024]; + struct kevent* ev; + struct timespec spec; + unsigned int nevents; + unsigned int revents; + QUEUE* q; + uv__io_t* w; + sigset_t* pset; + sigset_t set; + uint64_t base; + uint64_t diff; + int have_signals; + int filter; + int fflags; + int count; + int nfds; + int fd; + int op; + int i; + + if (loop->nfds == 0) { + assert(QUEUE_EMPTY(&loop->watcher_queue)); + return; + } + + nevents = 0; + + while (!QUEUE_EMPTY(&loop->watcher_queue)) { + q = QUEUE_HEAD(&loop->watcher_queue); + QUEUE_REMOVE(q); + QUEUE_INIT(q); + + w = QUEUE_DATA(q, uv__io_t, watcher_queue); + assert(w->pevents != 0); + assert(w->fd >= 0); + assert(w->fd < (int) loop->nwatchers); + + if ((w->events & POLLIN) == 0 && (w->pevents & POLLIN) != 0) { + filter = EVFILT_READ; + fflags = 0; + op = EV_ADD; + + if (w->cb == uv__fs_event) { + filter = EVFILT_VNODE; + fflags = NOTE_ATTRIB | NOTE_WRITE | NOTE_RENAME + | NOTE_DELETE | NOTE_EXTEND | NOTE_REVOKE; + op = EV_ADD | EV_ONESHOT; /* Stop the event from firing repeatedly. */ + } + + EV_SET(events + nevents, w->fd, filter, op, fflags, 0, 0); + + if (++nevents == ARRAY_SIZE(events)) { + if (kevent(loop->backend_fd, events, nevents, NULL, 0, NULL)) + abort(); + nevents = 0; + } + } + + if ((w->events & POLLOUT) == 0 && (w->pevents & POLLOUT) != 0) { + EV_SET(events + nevents, w->fd, EVFILT_WRITE, EV_ADD, 0, 0, 0); + + if (++nevents == ARRAY_SIZE(events)) { + if (kevent(loop->backend_fd, events, nevents, NULL, 0, NULL)) + abort(); + nevents = 0; + } + } + + if ((w->events & UV__POLLPRI) == 0 && (w->pevents & UV__POLLPRI) != 0) { + EV_SET(events + nevents, w->fd, EV_OOBAND, EV_ADD, 0, 0, 0); + + if (++nevents == ARRAY_SIZE(events)) { + if (kevent(loop->backend_fd, events, nevents, NULL, 0, NULL)) + abort(); + nevents = 0; + } + } + + w->events = w->pevents; + } + + pset = NULL; + if (loop->flags & UV_LOOP_BLOCK_SIGPROF) { + pset = &set; + sigemptyset(pset); + sigaddset(pset, SIGPROF); + } + + assert(timeout >= -1); + base = loop->time; + count = 48; /* Benchmarks suggest this gives the best throughput. */ + + for (;; nevents = 0) { + if (timeout != -1) { + spec.tv_sec = timeout / 1000; + spec.tv_nsec = (timeout % 1000) * 1000000; + } + + if (pset != NULL) + pthread_sigmask(SIG_BLOCK, pset, NULL); + + nfds = kevent(loop->backend_fd, + events, + nevents, + events, + ARRAY_SIZE(events), + timeout == -1 ? NULL : &spec); + + if (pset != NULL) + pthread_sigmask(SIG_UNBLOCK, pset, NULL); + + /* Update loop->time unconditionally. It's tempting to skip the update when + * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the + * operating system didn't reschedule our process while in the syscall. + */ + SAVE_ERRNO(uv__update_time(loop)); + + if (nfds == 0) { + assert(timeout != -1); + return; + } + + if (nfds == -1) { + if (errno != EINTR) + abort(); + + if (timeout == 0) + return; + + if (timeout == -1) + continue; + + /* Interrupted by a signal. Update timeout and poll again. */ + goto update_timeout; + } + + have_signals = 0; + nevents = 0; + + assert(loop->watchers != NULL); + loop->watchers[loop->nwatchers] = (void*) events; + loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds; + for (i = 0; i < nfds; i++) { + ev = events + i; + fd = ev->ident; + /* Skip invalidated events, see uv__platform_invalidate_fd */ + if (fd == -1) + continue; + w = loop->watchers[fd]; + + if (w == NULL) { + /* File descriptor that we've stopped watching, disarm it. */ + /* TODO batch up */ + struct kevent events[1]; + + EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0); + if (kevent(loop->backend_fd, events, 1, NULL, 0, NULL)) + if (errno != EBADF && errno != ENOENT) + abort(); + + continue; + } + + if (ev->filter == EVFILT_VNODE) { + assert(w->events == POLLIN); + assert(w->pevents == POLLIN); + w->cb(loop, w, ev->fflags); /* XXX always uv__fs_event() */ + nevents++; + continue; + } + + revents = 0; + + if (ev->filter == EVFILT_READ) { + if (w->pevents & POLLIN) { + revents |= POLLIN; + w->rcount = ev->data; + } else { + /* TODO batch up */ + struct kevent events[1]; + EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0); + if (kevent(loop->backend_fd, events, 1, NULL, 0, NULL)) + if (errno != ENOENT) + abort(); + } + } + + if (ev->filter == EV_OOBAND) { + if (w->pevents & UV__POLLPRI) { + revents |= UV__POLLPRI; + w->rcount = ev->data; + } else { + /* TODO batch up */ + struct kevent events[1]; + EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0); + if (kevent(loop->backend_fd, events, 1, NULL, 0, NULL)) + if (errno != ENOENT) + abort(); + } + } + + if (ev->filter == EVFILT_WRITE) { + if (w->pevents & POLLOUT) { + revents |= POLLOUT; + w->wcount = ev->data; + } else { + /* TODO batch up */ + struct kevent events[1]; + EV_SET(events + 0, fd, ev->filter, EV_DELETE, 0, 0, 0); + if (kevent(loop->backend_fd, events, 1, NULL, 0, NULL)) + if (errno != ENOENT) + abort(); + } + } + + if (ev->flags & EV_ERROR) + revents |= POLLERR; + + if ((ev->flags & EV_EOF) && (w->pevents & UV__POLLRDHUP)) + revents |= UV__POLLRDHUP; + + if (revents == 0) + continue; + + /* Run signal watchers last. This also affects child process watchers + * because those are implemented in terms of signal watchers. + */ + if (w == &loop->signal_io_watcher) + have_signals = 1; + else + w->cb(loop, w, revents); + + nevents++; + } + + if (have_signals != 0) + loop->signal_io_watcher.cb(loop, &loop->signal_io_watcher, POLLIN); + + loop->watchers[loop->nwatchers] = NULL; + loop->watchers[loop->nwatchers + 1] = NULL; + + if (have_signals != 0) + return; /* Event loop should cycle now so don't poll again. */ + + if (nevents != 0) { + if (nfds == ARRAY_SIZE(events) && --count != 0) { + /* Poll for more events but don't block this time. */ + timeout = 0; + continue; + } + return; + } + + if (timeout == 0) + return; + + if (timeout == -1) + continue; + +update_timeout: + assert(timeout > 0); + + diff = loop->time - base; + if (diff >= (uint64_t) timeout) + return; + + timeout -= diff; + } +} + + +void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { + struct kevent* events; + uintptr_t i; + uintptr_t nfds; + + assert(loop->watchers != NULL); + + events = (struct kevent*) loop->watchers[loop->nwatchers]; + nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1]; + if (events == NULL) + return; + + /* Invalidate events with same file descriptor */ + for (i = 0; i < nfds; i++) + if ((int) events[i].ident == fd) + events[i].ident = -1; +} + + +static void uv__fs_event(uv_loop_t* loop, uv__io_t* w, unsigned int fflags) { + uv_fs_event_t* handle; + struct kevent ev; + int events; + const char* path; +#if defined(F_GETPATH) + /* MAXPATHLEN == PATH_MAX but the former is what XNU calls it internally. */ + char pathbuf[MAXPATHLEN]; +#endif + + handle = container_of(w, uv_fs_event_t, event_watcher); + + if (fflags & (NOTE_ATTRIB | NOTE_EXTEND)) + events = UV_CHANGE; + else + events = UV_RENAME; + + path = NULL; +#if defined(F_GETPATH) + /* Also works when the file has been unlinked from the file system. Passing + * in the path when the file has been deleted is arguably a little strange + * but it's consistent with what the inotify backend does. + */ + if (fcntl(handle->event_watcher.fd, F_GETPATH, pathbuf) == 0) + path = uv__basename_r(pathbuf); +#endif + handle->cb(handle, path, events, 0); + + if (handle->event_watcher.fd == -1) + return; + + /* Watcher operates in one-shot mode, re-arm it. */ + fflags = NOTE_ATTRIB | NOTE_WRITE | NOTE_RENAME + | NOTE_DELETE | NOTE_EXTEND | NOTE_REVOKE; + + EV_SET(&ev, w->fd, EVFILT_VNODE, EV_ADD | EV_ONESHOT, fflags, 0, 0); + + if (kevent(loop->backend_fd, &ev, 1, NULL, 0, NULL)) + abort(); +} + + +int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { + uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); + return 0; +} + + +int uv_fs_event_start(uv_fs_event_t* handle, + uv_fs_event_cb cb, + const char* path, + unsigned int flags) { +#if defined(__APPLE__) + struct stat statbuf; +#endif /* defined(__APPLE__) */ + int fd; + + if (uv__is_active(handle)) + return -EINVAL; + + /* TODO open asynchronously - but how do we report back errors? */ + fd = open(path, O_RDONLY); + if (fd == -1) + return -errno; + + uv__handle_start(handle); + uv__io_init(&handle->event_watcher, uv__fs_event, fd); + handle->path = uv__strdup(path); + handle->cb = cb; + +#if defined(__APPLE__) + if (uv__has_forked_with_cfrunloop) + goto fallback; + + /* Nullify field to perform checks later */ + handle->cf_cb = NULL; + handle->realpath = NULL; + handle->realpath_len = 0; + handle->cf_flags = flags; + + if (fstat(fd, &statbuf)) + goto fallback; + /* FSEvents works only with directories */ + if (!(statbuf.st_mode & S_IFDIR)) + goto fallback; + + /* The fallback fd is no longer needed */ + uv__close(fd); + handle->event_watcher.fd = -1; + + return uv__fsevents_init(handle); + +fallback: +#endif /* defined(__APPLE__) */ + + uv__io_start(handle->loop, &handle->event_watcher, POLLIN); + + return 0; +} + + +int uv_fs_event_stop(uv_fs_event_t* handle) { + if (!uv__is_active(handle)) + return 0; + + uv__handle_stop(handle); + +#if defined(__APPLE__) + if (uv__has_forked_with_cfrunloop || uv__fsevents_close(handle)) +#endif /* defined(__APPLE__) */ + { + uv__io_close(handle->loop, &handle->event_watcher); + } + + uv__free(handle->path); + handle->path = NULL; + + if (handle->event_watcher.fd != -1) { + /* When FSEvents is used, we don't use the event_watcher's fd under certain + * confitions. (see uv_fs_event_start) */ + uv__close(handle->event_watcher.fd); + handle->event_watcher.fd = -1; + } + + return 0; +} + + +void uv__fs_event_close(uv_fs_event_t* handle) { + uv_fs_event_stop(handle); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/linux-core.c b/lib/ESPiLight/pilight/libs/libuv/unix/linux-core.c new file mode 100644 index 0000000..52b468a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/linux-core.c @@ -0,0 +1,951 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* We lean on the fact that POLL{IN,OUT,ERR,HUP} correspond with their + * EPOLL* counterparts. We use the POLL* variants in this file because that + * is what libuv uses elsewhere and it avoids a dependency on . + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#define HAVE_IFADDRS_H 1 + +#ifdef __UCLIBC__ +# if __UCLIBC_MAJOR__ < 0 && __UCLIBC_MINOR__ < 9 && __UCLIBC_SUBLEVEL__ < 32 +# undef HAVE_IFADDRS_H +# endif +#endif + +#ifdef HAVE_IFADDRS_H +# if defined(__ANDROID__) +# include "android-ifaddrs.h" +# else +# include +# endif +# include +# include +# include +#endif /* HAVE_IFADDRS_H */ + +/* Available from 2.6.32 onwards. */ +#ifndef CLOCK_MONOTONIC_COARSE +# define CLOCK_MONOTONIC_COARSE 6 +#endif + +/* This is rather annoying: CLOCK_BOOTTIME lives in but we can't + * include that file because it conflicts with . We'll just have to + * define it ourselves. + */ +#ifndef CLOCK_BOOTTIME +# define CLOCK_BOOTTIME 7 +#endif + +static int read_models(unsigned int numcpus, uv_cpu_info_t* ci); +static int read_times(FILE* statfile_fp, + unsigned int numcpus, + uv_cpu_info_t* ci); +static void read_speeds(unsigned int numcpus, uv_cpu_info_t* ci); +static unsigned long read_cpufreq(unsigned int cpunum); + + +int uv__platform_loop_init(uv_loop_t* loop) { + int fd; + + fd = uv__epoll_create1(UV__EPOLL_CLOEXEC); + + /* epoll_create1() can fail either because it's not implemented (old kernel) + * or because it doesn't understand the EPOLL_CLOEXEC flag. + */ + if (fd == -1 && (errno == ENOSYS || errno == EINVAL)) { + fd = uv__epoll_create(256); + + if (fd != -1) + uv__cloexec(fd, 1); + } + + loop->backend_fd = fd; + loop->inotify_fd = -1; + loop->inotify_watchers = NULL; + + if (fd == -1) + return -errno; + + return 0; +} + + +int uv__io_fork(uv_loop_t* loop) { + int err; + void* old_watchers; + + old_watchers = loop->inotify_watchers; + + uv__close(loop->backend_fd); + loop->backend_fd = -1; + uv__platform_loop_delete(loop); + + err = uv__platform_loop_init(loop); + if (err) + return err; + + return uv__inotify_fork(loop, old_watchers); +} + + +void uv__platform_loop_delete(uv_loop_t* loop) { + if (loop->inotify_fd == -1) return; + uv__io_stop(loop, &loop->inotify_read_watcher, POLLIN); + uv__close(loop->inotify_fd); + loop->inotify_fd = -1; +} + + +void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { + struct uv__epoll_event* events; + struct uv__epoll_event dummy; + uintptr_t i; + uintptr_t nfds; + + assert(loop->watchers != NULL); + + events = (struct uv__epoll_event*) loop->watchers[loop->nwatchers]; + nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1]; + if (events != NULL) + /* Invalidate events with same file descriptor */ + for (i = 0; i < nfds; i++) + if ((int) events[i].data == fd) + events[i].data = -1; + + /* Remove the file descriptor from the epoll. + * This avoids a problem where the same file description remains open + * in another process, causing repeated junk epoll events. + * + * We pass in a dummy epoll_event, to work around a bug in old kernels. + */ + if (loop->backend_fd >= 0) { + /* Work around a bug in kernels 3.10 to 3.19 where passing a struct that + * has the EPOLLWAKEUP flag set generates spurious audit syslog warnings. + */ + memset(&dummy, 0, sizeof(dummy)); + uv__epoll_ctl(loop->backend_fd, UV__EPOLL_CTL_DEL, fd, &dummy); + } +} + + +int uv__io_check_fd(uv_loop_t* loop, int fd) { + struct uv__epoll_event e; + int rc; + + e.events = POLLIN; + e.data = -1; + + rc = 0; + if (uv__epoll_ctl(loop->backend_fd, UV__EPOLL_CTL_ADD, fd, &e)) + if (errno != EEXIST) + rc = -errno; + + if (rc == 0) + if (uv__epoll_ctl(loop->backend_fd, UV__EPOLL_CTL_DEL, fd, &e)) + abort(); + + return rc; +} + + +void uv__io_poll(uv_loop_t* loop, int timeout) { + /* A bug in kernels < 2.6.37 makes timeouts larger than ~30 minutes + * effectively infinite on 32 bits architectures. To avoid blocking + * indefinitely, we cap the timeout and poll again if necessary. + * + * Note that "30 minutes" is a simplification because it depends on + * the value of CONFIG_HZ. The magic constant assumes CONFIG_HZ=1200, + * that being the largest value I have seen in the wild (and only once.) + */ + static const int max_safe_timeout = 1789569; + static int no_epoll_pwait; + static int no_epoll_wait; + struct uv__epoll_event events[1024]; + struct uv__epoll_event* pe; + struct uv__epoll_event e; + int real_timeout; + QUEUE* q; + uv__io_t* w; + sigset_t sigset; + uint64_t sigmask; + uint64_t base; + int have_signals; + int nevents; + int count; + int nfds; + int fd; + int op; + int i; + + if (loop->nfds == 0) { + assert(QUEUE_EMPTY(&loop->watcher_queue)); + return; + } + + while (!QUEUE_EMPTY(&loop->watcher_queue)) { + q = QUEUE_HEAD(&loop->watcher_queue); + QUEUE_REMOVE(q); + QUEUE_INIT(q); + + w = QUEUE_DATA(q, uv__io_t, watcher_queue); + assert(w->pevents != 0); + assert(w->fd >= 0); + assert(w->fd < (int) loop->nwatchers); + + e.events = w->pevents; + e.data = w->fd; + + if (w->events == 0) + op = UV__EPOLL_CTL_ADD; + else + op = UV__EPOLL_CTL_MOD; + + /* XXX Future optimization: do EPOLL_CTL_MOD lazily if we stop watching + * events, skip the syscall and squelch the events after epoll_wait(). + */ + if (uv__epoll_ctl(loop->backend_fd, op, w->fd, &e)) { + if (errno != EEXIST) + abort(); + + assert(op == UV__EPOLL_CTL_ADD); + + /* We've reactivated a file descriptor that's been watched before. */ + if (uv__epoll_ctl(loop->backend_fd, UV__EPOLL_CTL_MOD, w->fd, &e)) + abort(); + } + + w->events = w->pevents; + } + + sigmask = 0; + if (loop->flags & UV_LOOP_BLOCK_SIGPROF) { + sigemptyset(&sigset); + sigaddset(&sigset, SIGPROF); + sigmask |= 1 << (SIGPROF - 1); + } + + assert(timeout >= -1); + base = loop->time; + count = 48; /* Benchmarks suggest this gives the best throughput. */ + real_timeout = timeout; + + for (;;) { + /* See the comment for max_safe_timeout for an explanation of why + * this is necessary. Executive summary: kernel bug workaround. + */ + if (sizeof(int32_t) == sizeof(long) && timeout >= max_safe_timeout) + timeout = max_safe_timeout; + + if (sigmask != 0 && no_epoll_pwait != 0) + if (pthread_sigmask(SIG_BLOCK, &sigset, NULL)) + abort(); + + if (no_epoll_wait != 0 || (sigmask != 0 && no_epoll_pwait == 0)) { + nfds = uv__epoll_pwait(loop->backend_fd, + events, + ARRAY_SIZE(events), + timeout, + sigmask); + if (nfds == -1 && errno == ENOSYS) + no_epoll_pwait = 1; + } else { + nfds = uv__epoll_wait(loop->backend_fd, + events, + ARRAY_SIZE(events), + timeout); + if (nfds == -1 && errno == ENOSYS) + no_epoll_wait = 1; + } + + if (sigmask != 0 && no_epoll_pwait != 0) + if (pthread_sigmask(SIG_UNBLOCK, &sigset, NULL)) + abort(); + + /* Update loop->time unconditionally. It's tempting to skip the update when + * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the + * operating system didn't reschedule our process while in the syscall. + */ + SAVE_ERRNO(uv__update_time(loop)); + + if (nfds == 0) { + assert(timeout != -1); + + if (timeout == 0) + return; + + /* We may have been inside the system call for longer than |timeout| + * milliseconds so we need to update the timestamp to avoid drift. + */ + goto update_timeout; + } + + if (nfds == -1) { + if (errno == ENOSYS) { + /* epoll_wait() or epoll_pwait() failed, try the other system call. */ + assert(no_epoll_wait == 0 || no_epoll_pwait == 0); + continue; + } + + if (errno != EINTR) + abort(); + + if (timeout == -1) + continue; + + if (timeout == 0) + return; + + /* Interrupted by a signal. Update timeout and poll again. */ + goto update_timeout; + } + + have_signals = 0; + nevents = 0; + + assert(loop->watchers != NULL); + loop->watchers[loop->nwatchers] = (void*) events; + loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds; + for (i = 0; i < nfds; i++) { + pe = events + i; + fd = pe->data; + + /* Skip invalidated events, see uv__platform_invalidate_fd */ + if (fd == -1) + continue; + + assert(fd >= 0); + assert((unsigned) fd < loop->nwatchers); + + w = loop->watchers[fd]; + + if (w == NULL) { + /* File descriptor that we've stopped watching, disarm it. + * + * Ignore all errors because we may be racing with another thread + * when the file descriptor is closed. + */ + uv__epoll_ctl(loop->backend_fd, UV__EPOLL_CTL_DEL, fd, pe); + continue; + } + + /* Give users only events they're interested in. Prevents spurious + * callbacks when previous callback invocation in this loop has stopped + * the current watcher. Also, filters out events that users has not + * requested us to watch. + */ + pe->events &= w->pevents | POLLERR | POLLHUP; + + /* Work around an epoll quirk where it sometimes reports just the + * EPOLLERR or EPOLLHUP event. In order to force the event loop to + * move forward, we merge in the read/write events that the watcher + * is interested in; uv__read() and uv__write() will then deal with + * the error or hangup in the usual fashion. + * + * Note to self: happens when epoll reports EPOLLIN|EPOLLHUP, the user + * reads the available data, calls uv_read_stop(), then sometime later + * calls uv_read_start() again. By then, libuv has forgotten about the + * hangup and the kernel won't report EPOLLIN again because there's + * nothing left to read. If anything, libuv is to blame here. The + * current hack is just a quick bandaid; to properly fix it, libuv + * needs to remember the error/hangup event. We should get that for + * free when we switch over to edge-triggered I/O. + */ + if (pe->events == POLLERR || pe->events == POLLHUP) + pe->events |= w->pevents & (POLLIN | POLLOUT | UV__POLLPRI); + + if (pe->events != 0) { + /* Run signal watchers last. This also affects child process watchers + * because those are implemented in terms of signal watchers. + */ + if (w == &loop->signal_io_watcher) + have_signals = 1; + else + w->cb(loop, w, pe->events); + + nevents++; + } + } + + if (have_signals != 0) + loop->signal_io_watcher.cb(loop, &loop->signal_io_watcher, POLLIN); + + loop->watchers[loop->nwatchers] = NULL; + loop->watchers[loop->nwatchers + 1] = NULL; + + if (have_signals != 0) + return; /* Event loop should cycle now so don't poll again. */ + + if (nevents != 0) { + if (nfds == ARRAY_SIZE(events) && --count != 0) { + /* Poll for more events but don't block this time. */ + timeout = 0; + continue; + } + return; + } + + if (timeout == 0) + return; + + if (timeout == -1) + continue; + +update_timeout: + assert(timeout > 0); + + real_timeout -= (loop->time - base); + if (real_timeout <= 0) + return; + + timeout = real_timeout; + } +} + + +uint64_t uv__hrtime(uv_clocktype_t type) { + static clock_t fast_clock_id = -1; + struct timespec t; + clock_t clock_id; + + /* Prefer CLOCK_MONOTONIC_COARSE if available but only when it has + * millisecond granularity or better. CLOCK_MONOTONIC_COARSE is + * serviced entirely from the vDSO, whereas CLOCK_MONOTONIC may + * decide to make a costly system call. + */ + /* TODO(bnoordhuis) Use CLOCK_MONOTONIC_COARSE for UV_CLOCK_PRECISE + * when it has microsecond granularity or better (unlikely). + */ + if (type == UV_CLOCK_FAST && fast_clock_id == -1) { + if (clock_getres(CLOCK_MONOTONIC_COARSE, &t) == 0 && + t.tv_nsec <= 1 * 1000 * 1000) { + fast_clock_id = CLOCK_MONOTONIC_COARSE; + } else { + fast_clock_id = CLOCK_MONOTONIC; + } + } + + clock_id = CLOCK_MONOTONIC; + if (type == UV_CLOCK_FAST) + clock_id = fast_clock_id; + + if (clock_gettime(clock_id, &t)) + return 0; /* Not really possible. */ + + return t.tv_sec * (uint64_t) 1e9 + t.tv_nsec; +} + + +int uv_resident_set_memory(size_t* rss) { + char buf[1024]; + const char* s; + ssize_t n; + long val; + int fd; + int i; + + do + fd = open("/proc/self/stat", O_RDONLY); + while (fd == -1 && errno == EINTR); + + if (fd == -1) + return -errno; + + do + n = read(fd, buf, sizeof(buf) - 1); + while (n == -1 && errno == EINTR); + + uv__close(fd); + if (n == -1) + return -errno; + buf[n] = '\0'; + + s = strchr(buf, ' '); + if (s == NULL) + goto err; + + s += 1; + if (*s != '(') + goto err; + + s = strchr(s, ')'); + if (s == NULL) + goto err; + + for (i = 1; i <= 22; i++) { + s = strchr(s + 1, ' '); + if (s == NULL) + goto err; + } + + errno = 0; + val = strtol(s, NULL, 10); + if (errno != 0) + goto err; + if (val < 0) + goto err; + + *rss = val * getpagesize(); + return 0; + +err: + return -EINVAL; +} + + +int uv_uptime(double* uptime) { + static volatile int no_clock_boottime; + struct timespec now; + int r; + + /* Try CLOCK_BOOTTIME first, fall back to CLOCK_MONOTONIC if not available + * (pre-2.6.39 kernels). CLOCK_MONOTONIC doesn't increase when the system + * is suspended. + */ + if (no_clock_boottime) { + retry: r = clock_gettime(CLOCK_MONOTONIC, &now); + } + else if ((r = clock_gettime(CLOCK_BOOTTIME, &now)) && errno == EINVAL) { + no_clock_boottime = 1; + goto retry; + } + + if (r) + return -errno; + + *uptime = now.tv_sec; + return 0; +} + + +static int uv__cpu_num(FILE* statfile_fp, unsigned int* numcpus) { + unsigned int num; + char buf[1024]; + + if (!fgets(buf, sizeof(buf), statfile_fp)) + return -EIO; + + num = 0; + while (fgets(buf, sizeof(buf), statfile_fp)) { + if (strncmp(buf, "cpu", 3)) + break; + num++; + } + + if (num == 0) + return -EIO; + + *numcpus = num; + return 0; +} + + +int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { + unsigned int numcpus; + uv_cpu_info_t* ci; + int err; + FILE* statfile_fp; + + *cpu_infos = NULL; + *count = 0; + + statfile_fp = uv__open_file("/proc/stat"); + if (statfile_fp == NULL) + return -errno; + + err = uv__cpu_num(statfile_fp, &numcpus); + if (err < 0) + goto out; + + err = -ENOMEM; + ci = uv__calloc(numcpus, sizeof(*ci)); + if (ci == NULL) + goto out; + + err = read_models(numcpus, ci); + if (err == 0) + err = read_times(statfile_fp, numcpus, ci); + + if (err) { + uv_free_cpu_info(ci, numcpus); + goto out; + } + + /* read_models() on x86 also reads the CPU speed from /proc/cpuinfo. + * We don't check for errors here. Worst case, the field is left zero. + */ + if (ci[0].speed == 0) + read_speeds(numcpus, ci); + + *cpu_infos = ci; + *count = numcpus; + err = 0; + +out: + + if (fclose(statfile_fp)) + if (errno != EINTR && errno != EINPROGRESS) + abort(); + + return err; +} + + +static void read_speeds(unsigned int numcpus, uv_cpu_info_t* ci) { + unsigned int num; + + for (num = 0; num < numcpus; num++) + ci[num].speed = read_cpufreq(num) / 1000; +} + + +/* Also reads the CPU frequency on x86. The other architectures only have + * a BogoMIPS field, which may not be very accurate. + * + * Note: Simply returns on error, uv_cpu_info() takes care of the cleanup. + */ +static int read_models(unsigned int numcpus, uv_cpu_info_t* ci) { + static const char model_marker[] = "model name\t: "; + static const char speed_marker[] = "cpu MHz\t\t: "; + const char* inferred_model; + unsigned int model_idx; + unsigned int speed_idx; + char buf[1024]; + char* model; + FILE* fp; + + /* Most are unused on non-ARM, non-MIPS and non-x86 architectures. */ + (void) &model_marker; + (void) &speed_marker; + (void) &speed_idx; + (void) &model; + (void) &buf; + (void) &fp; + + model_idx = 0; + speed_idx = 0; + +#if defined(__arm__) || \ + defined(__i386__) || \ + defined(__mips__) || \ + defined(__x86_64__) + fp = uv__open_file("/proc/cpuinfo"); + if (fp == NULL) + return -errno; + + while (fgets(buf, sizeof(buf), fp)) { + if (model_idx < numcpus) { + if (strncmp(buf, model_marker, sizeof(model_marker) - 1) == 0) { + model = buf + sizeof(model_marker) - 1; + model = uv__strndup(model, strlen(model) - 1); /* Strip newline. */ + if (model == NULL) { + fclose(fp); + return -ENOMEM; + } + ci[model_idx++].model = model; + continue; + } + } +#if defined(__arm__) || defined(__mips__) + if (model_idx < numcpus) { +#if defined(__arm__) + /* Fallback for pre-3.8 kernels. */ + static const char model_marker[] = "Processor\t: "; +#else /* defined(__mips__) */ + static const char model_marker[] = "cpu model\t\t: "; +#endif + if (strncmp(buf, model_marker, sizeof(model_marker) - 1) == 0) { + model = buf + sizeof(model_marker) - 1; + model = uv__strndup(model, strlen(model) - 1); /* Strip newline. */ + if (model == NULL) { + fclose(fp); + return -ENOMEM; + } + ci[model_idx++].model = model; + continue; + } + } +#else /* !__arm__ && !__mips__ */ + if (speed_idx < numcpus) { + if (strncmp(buf, speed_marker, sizeof(speed_marker) - 1) == 0) { + ci[speed_idx++].speed = atoi(buf + sizeof(speed_marker) - 1); + continue; + } + } +#endif /* __arm__ || __mips__ */ + } + + fclose(fp); +#endif /* __arm__ || __i386__ || __mips__ || __x86_64__ */ + + /* Now we want to make sure that all the models contain *something* because + * it's not safe to leave them as null. Copy the last entry unless there + * isn't one, in that case we simply put "unknown" into everything. + */ + inferred_model = "unknown"; + if (model_idx > 0) + inferred_model = ci[model_idx - 1].model; + + while (model_idx < numcpus) { + model = uv__strndup(inferred_model, strlen(inferred_model)); + if (model == NULL) + return -ENOMEM; + ci[model_idx++].model = model; + } + + return 0; +} + + +static int read_times(FILE* statfile_fp, + unsigned int numcpus, + uv_cpu_info_t* ci) { + unsigned long clock_ticks; + struct uv_cpu_times_s ts; + unsigned long user; + unsigned long nice; + unsigned long sys; + unsigned long idle; + unsigned long dummy; + unsigned long irq; + unsigned int num; + unsigned int len; + char buf[1024]; + + clock_ticks = sysconf(_SC_CLK_TCK); + assert(clock_ticks != (unsigned long) -1); + assert(clock_ticks != 0); + + rewind(statfile_fp); + + if (!fgets(buf, sizeof(buf), statfile_fp)) + abort(); + + num = 0; + + while (fgets(buf, sizeof(buf), statfile_fp)) { + if (num >= numcpus) + break; + + if (strncmp(buf, "cpu", 3)) + break; + + /* skip "cpu " marker */ + { + unsigned int n; + int r = sscanf(buf, "cpu%u ", &n); + assert(r == 1); + (void) r; /* silence build warning */ + for (len = sizeof("cpu0"); n /= 10; len++); + } + + /* Line contains user, nice, system, idle, iowait, irq, softirq, steal, + * guest, guest_nice but we're only interested in the first four + irq. + * + * Don't use %*s to skip fields or %ll to read straight into the uint64_t + * fields, they're not allowed in C89 mode. + */ + if (6 != sscanf(buf + len, + "%lu %lu %lu %lu %lu %lu", + &user, + &nice, + &sys, + &idle, + &dummy, + &irq)) + abort(); + + ts.user = clock_ticks * user; + ts.nice = clock_ticks * nice; + ts.sys = clock_ticks * sys; + ts.idle = clock_ticks * idle; + ts.irq = clock_ticks * irq; + ci[num++].cpu_times = ts; + } + assert(num == numcpus); + + return 0; +} + + +static unsigned long read_cpufreq(unsigned int cpunum) { + unsigned long val; + char buf[1024]; + FILE* fp; + + snprintf(buf, + sizeof(buf), + "/sys/devices/system/cpu/cpu%u/cpufreq/scaling_cur_freq", + cpunum); + + fp = uv__open_file(buf); + if (fp == NULL) + return 0; + + if (fscanf(fp, "%lu", &val) != 1) + val = 0; + + fclose(fp); + + return val; +} + + +void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { + int i; + + for (i = 0; i < count; i++) { + uv__free(cpu_infos[i].model); + } + + uv__free(cpu_infos); +} + +static int uv__ifaddr_exclude(struct ifaddrs *ent, int exclude_type) { + if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING))) + return 1; + if (ent->ifa_addr == NULL) + return 1; + /* + * On Linux getifaddrs returns information related to the raw underlying + * devices. We're not interested in this information yet. + */ + if (ent->ifa_addr->sa_family == PF_PACKET) + return exclude_type; + return !exclude_type; +} + +int uv_interface_addresses(uv_interface_address_t** addresses, + int* count) { +#ifndef HAVE_IFADDRS_H + return -ENOSYS; +#else + struct ifaddrs *addrs, *ent; + uv_interface_address_t* address; + int i; + struct sockaddr_ll *sll; + + if (getifaddrs(&addrs)) + return -errno; + + *count = 0; + *addresses = NULL; + + /* Count the number of interfaces */ + for (ent = addrs; ent != NULL; ent = ent->ifa_next) { + if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFADDR)) + continue; + + (*count)++; + } + + if (*count == 0) + return 0; + + *addresses = uv__malloc(*count * sizeof(**addresses)); + if (!(*addresses)) { + freeifaddrs(addrs); + return -ENOMEM; + } + + address = *addresses; + + for (ent = addrs; ent != NULL; ent = ent->ifa_next) { + if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFADDR)) + continue; + + address->name = uv__strdup(ent->ifa_name); + + if (ent->ifa_addr->sa_family == AF_INET6) { + address->address.address6 = *((struct sockaddr_in6*) ent->ifa_addr); + } else { + address->address.address4 = *((struct sockaddr_in*) ent->ifa_addr); + } + + if (ent->ifa_netmask->sa_family == AF_INET6) { + address->netmask.netmask6 = *((struct sockaddr_in6*) ent->ifa_netmask); + } else { + address->netmask.netmask4 = *((struct sockaddr_in*) ent->ifa_netmask); + } + + address->is_internal = !!(ent->ifa_flags & IFF_LOOPBACK); + + address++; + } + + /* Fill in physical addresses for each interface */ + for (ent = addrs; ent != NULL; ent = ent->ifa_next) { + if (uv__ifaddr_exclude(ent, UV__EXCLUDE_IFPHYS)) + continue; + + address = *addresses; + + for (i = 0; i < (*count); i++) { + if (strcmp(address->name, ent->ifa_name) == 0) { + sll = (struct sockaddr_ll*)ent->ifa_addr; + memcpy(address->phys_addr, sll->sll_addr, sizeof(address->phys_addr)); + } + address++; + } + } + + freeifaddrs(addrs); + + return 0; +#endif +} + + +void uv_free_interface_addresses(uv_interface_address_t* addresses, + int count) { + int i; + + for (i = 0; i < count; i++) { + uv__free(addresses[i].name); + } + + uv__free(addresses); +} + + +void uv__set_process_title(const char* title) { +#if defined(PR_SET_NAME) + prctl(PR_SET_NAME, title); /* Only copies first 16 characters. */ +#endif +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/linux-inotify.c b/lib/ESPiLight/pilight/libs/libuv/unix/linux-inotify.c new file mode 100644 index 0000000..5934c5d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/linux-inotify.c @@ -0,0 +1,352 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "tree.h" +#include "internal.h" + +#include +#include +#include +#include +#include +#include + +#include +#include + +struct watcher_list { + RB_ENTRY(watcher_list) entry; + QUEUE watchers; + int iterating; + char* path; + int wd; +}; + +struct watcher_root { + struct watcher_list* rbh_root; +}; +#define CAST(p) ((struct watcher_root*)(p)) + + +static int compare_watchers(const struct watcher_list* a, + const struct watcher_list* b) { + if (a->wd < b->wd) return -1; + if (a->wd > b->wd) return 1; + return 0; +} + + +RB_GENERATE_STATIC(watcher_root, watcher_list, entry, compare_watchers) + + +static void uv__inotify_read(uv_loop_t* loop, + uv__io_t* w, + unsigned int revents); + +static void maybe_free_watcher_list(struct watcher_list* w, + uv_loop_t* loop); + +static int new_inotify_fd(void) { + int err; + int fd; + + fd = uv__inotify_init1(UV__IN_NONBLOCK | UV__IN_CLOEXEC); + if (fd != -1) + return fd; + + if (errno != ENOSYS) + return -errno; + + fd = uv__inotify_init(); + if (fd == -1) + return -errno; + + err = uv__cloexec(fd, 1); + if (err == 0) + err = uv__nonblock(fd, 1); + + if (err) { + uv__close(fd); + return err; + } + + return fd; +} + + +static int init_inotify(uv_loop_t* loop) { + int err; + + if (loop->inotify_fd != -1) + return 0; + + err = new_inotify_fd(); + if (err < 0) + return err; + + loop->inotify_fd = err; + uv__io_init(&loop->inotify_read_watcher, uv__inotify_read, loop->inotify_fd); + uv__io_start(loop, &loop->inotify_read_watcher, POLLIN); + + return 0; +} + + +int uv__inotify_fork(uv_loop_t* loop, void* old_watchers) { + /* Open the inotify_fd, and re-arm all the inotify watchers. */ + int err; + struct watcher_list* tmp_watcher_list_iter; + struct watcher_list* watcher_list; + struct watcher_list tmp_watcher_list; + QUEUE queue; + QUEUE* q; + uv_fs_event_t* handle; + char* tmp_path; + + if (old_watchers != NULL) { + /* We must restore the old watcher list to be able to close items + * out of it. + */ + loop->inotify_watchers = old_watchers; + + QUEUE_INIT(&tmp_watcher_list.watchers); + /* Note that the queue we use is shared with the start and stop() + * functions, making QUEUE_FOREACH unsafe to use. So we use the + * QUEUE_MOVE trick to safely iterate. Also don't free the watcher + * list until we're done iterating. c.f. uv__inotify_read. + */ + RB_FOREACH_SAFE(watcher_list, watcher_root, + CAST(&old_watchers), tmp_watcher_list_iter) { + watcher_list->iterating = 1; + QUEUE_MOVE(&watcher_list->watchers, &queue); + while (!QUEUE_EMPTY(&queue)) { + q = QUEUE_HEAD(&queue); + handle = QUEUE_DATA(q, uv_fs_event_t, watchers); + /* It's critical to keep a copy of path here, because it + * will be set to NULL by stop() and then deallocated by + * maybe_free_watcher_list + */ + tmp_path = uv__strdup(handle->path); + assert(tmp_path != NULL); + QUEUE_REMOVE(q); + QUEUE_INSERT_TAIL(&watcher_list->watchers, q); + uv_fs_event_stop(handle); + + QUEUE_INSERT_TAIL(&tmp_watcher_list.watchers, &handle->watchers); + handle->path = tmp_path; + } + watcher_list->iterating = 0; + maybe_free_watcher_list(watcher_list, loop); + } + + QUEUE_MOVE(&tmp_watcher_list.watchers, &queue); + while (!QUEUE_EMPTY(&queue)) { + q = QUEUE_HEAD(&queue); + QUEUE_REMOVE(q); + handle = QUEUE_DATA(q, uv_fs_event_t, watchers); + tmp_path = handle->path; + handle->path = NULL; + err = uv_fs_event_start(handle, handle->cb, tmp_path, 0); + uv__free(tmp_path); + if (err) + return err; + } + } + + return 0; +} + + +static struct watcher_list* find_watcher(uv_loop_t* loop, int wd) { + struct watcher_list w; + w.wd = wd; + return RB_FIND(watcher_root, CAST(&loop->inotify_watchers), &w); +} + +static void maybe_free_watcher_list(struct watcher_list* w, uv_loop_t* loop) { + /* if the watcher_list->watchers is being iterated over, we can't free it. */ + if ((!w->iterating) && QUEUE_EMPTY(&w->watchers)) { + /* No watchers left for this path. Clean up. */ + RB_REMOVE(watcher_root, CAST(&loop->inotify_watchers), w); + uv__inotify_rm_watch(loop->inotify_fd, w->wd); + uv__free(w); + } +} + +static void uv__inotify_read(uv_loop_t* loop, + uv__io_t* dummy, + unsigned int events) { + const struct uv__inotify_event* e; + struct watcher_list* w; + uv_fs_event_t* h; + QUEUE queue; + QUEUE* q; + const char* path; + ssize_t size; + const char *p; + /* needs to be large enough for sizeof(inotify_event) + strlen(path) */ + char buf[4096]; + + while (1) { + do + size = read(loop->inotify_fd, buf, sizeof(buf)); + while (size == -1 && errno == EINTR); + + if (size == -1) { + assert(errno == EAGAIN || errno == EWOULDBLOCK); + break; + } + + assert(size > 0); /* pre-2.6.21 thing, size=0 == read buffer too small */ + + /* Now we have one or more inotify_event structs. */ + for (p = buf; p < buf + size; p += sizeof(*e) + e->len) { + e = (const struct uv__inotify_event*)p; + + events = 0; + if (e->mask & (UV__IN_ATTRIB|UV__IN_MODIFY)) + events |= UV_CHANGE; + if (e->mask & ~(UV__IN_ATTRIB|UV__IN_MODIFY)) + events |= UV_RENAME; + + w = find_watcher(loop, e->wd); + if (w == NULL) + continue; /* Stale event, no watchers left. */ + + /* inotify does not return the filename when monitoring a single file + * for modifications. Repurpose the filename for API compatibility. + * I'm not convinced this is a good thing, maybe it should go. + */ + path = e->len ? (const char*) (e + 1) : uv__basename_r(w->path); + + /* We're about to iterate over the queue and call user's callbacks. + * What can go wrong? + * A callback could call uv_fs_event_stop() + * and the queue can change under our feet. + * So, we use QUEUE_MOVE() trick to safely iterate over the queue. + * And we don't free the watcher_list until we're done iterating. + * + * First, + * tell uv_fs_event_stop() (that could be called from a user's callback) + * not to free watcher_list. + */ + w->iterating = 1; + QUEUE_MOVE(&w->watchers, &queue); + while (!QUEUE_EMPTY(&queue)) { + q = QUEUE_HEAD(&queue); + h = QUEUE_DATA(q, uv_fs_event_t, watchers); + + QUEUE_REMOVE(q); + QUEUE_INSERT_TAIL(&w->watchers, q); + + h->cb(h, path, events, 0); + } + /* done iterating, time to (maybe) free empty watcher_list */ + w->iterating = 0; + maybe_free_watcher_list(w, loop); + } + } +} + + +int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { + uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); + return 0; +} + + +int uv_fs_event_start(uv_fs_event_t* handle, + uv_fs_event_cb cb, + const char* path, + unsigned int flags) { + struct watcher_list* w; + int events; + int err; + int wd; + + if (uv__is_active(handle)) + return -EINVAL; + + err = init_inotify(handle->loop); + if (err) + return err; + + events = UV__IN_ATTRIB + | UV__IN_CREATE + | UV__IN_MODIFY + | UV__IN_DELETE + | UV__IN_DELETE_SELF + | UV__IN_MOVE_SELF + | UV__IN_MOVED_FROM + | UV__IN_MOVED_TO; + + wd = uv__inotify_add_watch(handle->loop->inotify_fd, path, events); + if (wd == -1) + return -errno; + + w = find_watcher(handle->loop, wd); + if (w) + goto no_insert; + + w = uv__malloc(sizeof(*w) + strlen(path) + 1); + if (w == NULL) + return -ENOMEM; + + w->wd = wd; + w->path = strcpy((char*)(w + 1), path); + QUEUE_INIT(&w->watchers); + w->iterating = 0; + RB_INSERT(watcher_root, CAST(&handle->loop->inotify_watchers), w); + +no_insert: + uv__handle_start(handle); + QUEUE_INSERT_TAIL(&w->watchers, &handle->watchers); + handle->path = w->path; + handle->cb = cb; + handle->wd = wd; + + return 0; +} + + +int uv_fs_event_stop(uv_fs_event_t* handle) { + struct watcher_list* w; + + if (!uv__is_active(handle)) + return 0; + + w = find_watcher(handle->loop, handle->wd); + assert(w != NULL); + + handle->wd = -1; + handle->path = NULL; + uv__handle_stop(handle); + QUEUE_REMOVE(&handle->watchers); + + maybe_free_watcher_list(w, handle->loop); + + return 0; +} + + +void uv__fs_event_close(uv_fs_event_t* handle) { + uv_fs_event_stop(handle); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/linux-syscalls.c b/lib/ESPiLight/pilight/libs/libuv/unix/linux-syscalls.c new file mode 100644 index 0000000..89998de --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/linux-syscalls.c @@ -0,0 +1,471 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "linux-syscalls.h" +#include +#include +#include +#include +#include + +#if defined(__has_feature) +# if __has_feature(memory_sanitizer) +# define MSAN_ACTIVE 1 +# include +# endif +#endif + +#if defined(__i386__) +# ifndef __NR_socketcall +# define __NR_socketcall 102 +# endif +#endif + +#if defined(__arm__) +# if defined(__thumb__) || defined(__ARM_EABI__) +# define UV_SYSCALL_BASE 0 +# else +# define UV_SYSCALL_BASE 0x900000 +# endif +#endif /* __arm__ */ + +#ifndef __NR_accept4 +# if defined(__x86_64__) +# define __NR_accept4 288 +# elif defined(__i386__) + /* Nothing. Handled through socketcall(). */ +# elif defined(__arm__) +# define __NR_accept4 (UV_SYSCALL_BASE + 366) +# endif +#endif /* __NR_accept4 */ + +#ifndef __NR_eventfd +# if defined(__x86_64__) +# define __NR_eventfd 284 +# elif defined(__i386__) +# define __NR_eventfd 323 +# elif defined(__arm__) +# define __NR_eventfd (UV_SYSCALL_BASE + 351) +# endif +#endif /* __NR_eventfd */ + +#ifndef __NR_eventfd2 +# if defined(__x86_64__) +# define __NR_eventfd2 290 +# elif defined(__i386__) +# define __NR_eventfd2 328 +# elif defined(__arm__) +# define __NR_eventfd2 (UV_SYSCALL_BASE + 356) +# endif +#endif /* __NR_eventfd2 */ + +#ifndef __NR_epoll_create +# if defined(__x86_64__) +# define __NR_epoll_create 213 +# elif defined(__i386__) +# define __NR_epoll_create 254 +# elif defined(__arm__) +# define __NR_epoll_create (UV_SYSCALL_BASE + 250) +# endif +#endif /* __NR_epoll_create */ + +#ifndef __NR_epoll_create1 +# if defined(__x86_64__) +# define __NR_epoll_create1 291 +# elif defined(__i386__) +# define __NR_epoll_create1 329 +# elif defined(__arm__) +# define __NR_epoll_create1 (UV_SYSCALL_BASE + 357) +# endif +#endif /* __NR_epoll_create1 */ + +#ifndef __NR_epoll_ctl +# if defined(__x86_64__) +# define __NR_epoll_ctl 233 /* used to be 214 */ +# elif defined(__i386__) +# define __NR_epoll_ctl 255 +# elif defined(__arm__) +# define __NR_epoll_ctl (UV_SYSCALL_BASE + 251) +# endif +#endif /* __NR_epoll_ctl */ + +#ifndef __NR_epoll_wait +# if defined(__x86_64__) +# define __NR_epoll_wait 232 /* used to be 215 */ +# elif defined(__i386__) +# define __NR_epoll_wait 256 +# elif defined(__arm__) +# define __NR_epoll_wait (UV_SYSCALL_BASE + 252) +# endif +#endif /* __NR_epoll_wait */ + +#ifndef __NR_epoll_pwait +# if defined(__x86_64__) +# define __NR_epoll_pwait 281 +# elif defined(__i386__) +# define __NR_epoll_pwait 319 +# elif defined(__arm__) +# define __NR_epoll_pwait (UV_SYSCALL_BASE + 346) +# endif +#endif /* __NR_epoll_pwait */ + +#ifndef __NR_inotify_init +# if defined(__x86_64__) +# define __NR_inotify_init 253 +# elif defined(__i386__) +# define __NR_inotify_init 291 +# elif defined(__arm__) +# define __NR_inotify_init (UV_SYSCALL_BASE + 316) +# endif +#endif /* __NR_inotify_init */ + +#ifndef __NR_inotify_init1 +# if defined(__x86_64__) +# define __NR_inotify_init1 294 +# elif defined(__i386__) +# define __NR_inotify_init1 332 +# elif defined(__arm__) +# define __NR_inotify_init1 (UV_SYSCALL_BASE + 360) +# endif +#endif /* __NR_inotify_init1 */ + +#ifndef __NR_inotify_add_watch +# if defined(__x86_64__) +# define __NR_inotify_add_watch 254 +# elif defined(__i386__) +# define __NR_inotify_add_watch 292 +# elif defined(__arm__) +# define __NR_inotify_add_watch (UV_SYSCALL_BASE + 317) +# endif +#endif /* __NR_inotify_add_watch */ + +#ifndef __NR_inotify_rm_watch +# if defined(__x86_64__) +# define __NR_inotify_rm_watch 255 +# elif defined(__i386__) +# define __NR_inotify_rm_watch 293 +# elif defined(__arm__) +# define __NR_inotify_rm_watch (UV_SYSCALL_BASE + 318) +# endif +#endif /* __NR_inotify_rm_watch */ + +#ifndef __NR_pipe2 +# if defined(__x86_64__) +# define __NR_pipe2 293 +# elif defined(__i386__) +# define __NR_pipe2 331 +# elif defined(__arm__) +# define __NR_pipe2 (UV_SYSCALL_BASE + 359) +# endif +#endif /* __NR_pipe2 */ + +#ifndef __NR_recvmmsg +# if defined(__x86_64__) +# define __NR_recvmmsg 299 +# elif defined(__i386__) +# define __NR_recvmmsg 337 +# elif defined(__arm__) +# define __NR_recvmmsg (UV_SYSCALL_BASE + 365) +# endif +#endif /* __NR_recvmsg */ + +#ifndef __NR_sendmmsg +# if defined(__x86_64__) +# define __NR_sendmmsg 307 +# elif defined(__i386__) +# define __NR_sendmmsg 345 +# elif defined(__arm__) +# define __NR_sendmmsg (UV_SYSCALL_BASE + 374) +# endif +#endif /* __NR_sendmmsg */ + +#ifndef __NR_utimensat +# if defined(__x86_64__) +# define __NR_utimensat 280 +# elif defined(__i386__) +# define __NR_utimensat 320 +# elif defined(__arm__) +# define __NR_utimensat (UV_SYSCALL_BASE + 348) +# endif +#endif /* __NR_utimensat */ + +#ifndef __NR_preadv +# if defined(__x86_64__) +# define __NR_preadv 295 +# elif defined(__i386__) +# define __NR_preadv 333 +# elif defined(__arm__) +# define __NR_preadv (UV_SYSCALL_BASE + 361) +# endif +#endif /* __NR_preadv */ + +#ifndef __NR_pwritev +# if defined(__x86_64__) +# define __NR_pwritev 296 +# elif defined(__i386__) +# define __NR_pwritev 334 +# elif defined(__arm__) +# define __NR_pwritev (UV_SYSCALL_BASE + 362) +# endif +#endif /* __NR_pwritev */ + +#ifndef __NR_dup3 +# if defined(__x86_64__) +# define __NR_dup3 292 +# elif defined(__i386__) +# define __NR_dup3 330 +# elif defined(__arm__) +# define __NR_dup3 (UV_SYSCALL_BASE + 358) +# endif +#endif /* __NR_pwritev */ + + +int uv__accept4(int fd, struct sockaddr* addr, socklen_t* addrlen, int flags) { +#if defined(__i386__) + unsigned long args[4]; + int r; + + args[0] = (unsigned long) fd; + args[1] = (unsigned long) addr; + args[2] = (unsigned long) addrlen; + args[3] = (unsigned long) flags; + + r = syscall(__NR_socketcall, 18 /* SYS_ACCEPT4 */, args); + + /* socketcall() raises EINVAL when SYS_ACCEPT4 is not supported but so does + * a bad flags argument. Try to distinguish between the two cases. + */ + if (r == -1) + if (errno == EINVAL) + if ((flags & ~(UV__SOCK_CLOEXEC|UV__SOCK_NONBLOCK)) == 0) + errno = ENOSYS; + + return r; +#elif defined(__NR_accept4) + return syscall(__NR_accept4, fd, addr, addrlen, flags); +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__eventfd(unsigned int count) { +#if defined(__NR_eventfd) + return syscall(__NR_eventfd, count); +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__eventfd2(unsigned int count, int flags) { +#if defined(__NR_eventfd2) + return syscall(__NR_eventfd2, count, flags); +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__epoll_create(int size) { +#if defined(__NR_epoll_create) + return syscall(__NR_epoll_create, size); +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__epoll_create1(int flags) { +#if defined(__NR_epoll_create1) + return syscall(__NR_epoll_create1, flags); +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__epoll_ctl(int epfd, int op, int fd, struct uv__epoll_event* events) { +#if defined(__NR_epoll_ctl) + return syscall(__NR_epoll_ctl, epfd, op, fd, events); +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__epoll_wait(int epfd, + struct uv__epoll_event* events, + int nevents, + int timeout) { +#if defined(__NR_epoll_wait) + int result; + result = syscall(__NR_epoll_wait, epfd, events, nevents, timeout); +#if MSAN_ACTIVE + if (result > 0) + __msan_unpoison(events, sizeof(events[0]) * result); +#endif + return result; +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__epoll_pwait(int epfd, + struct uv__epoll_event* events, + int nevents, + int timeout, + uint64_t sigmask) { +#if defined(__NR_epoll_pwait) + int result; + result = syscall(__NR_epoll_pwait, + epfd, + events, + nevents, + timeout, + &sigmask, + sizeof(sigmask)); +#if MSAN_ACTIVE + if (result > 0) + __msan_unpoison(events, sizeof(events[0]) * result); +#endif + return result; +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__inotify_init(void) { +#if defined(__NR_inotify_init) + return syscall(__NR_inotify_init); +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__inotify_init1(int flags) { +#if defined(__NR_inotify_init1) + return syscall(__NR_inotify_init1, flags); +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__inotify_add_watch(int fd, const char* path, uint32_t mask) { +#if defined(__NR_inotify_add_watch) + return syscall(__NR_inotify_add_watch, fd, path, mask); +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__inotify_rm_watch(int fd, int32_t wd) { +#if defined(__NR_inotify_rm_watch) + return syscall(__NR_inotify_rm_watch, fd, wd); +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__pipe2(int pipefd[2], int flags) { +#if defined(__NR_pipe2) + int result; + result = syscall(__NR_pipe2, pipefd, flags); +#if MSAN_ACTIVE + if (!result) + __msan_unpoison(pipefd, sizeof(int[2])); +#endif + return result; +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__sendmmsg(int fd, + struct uv__mmsghdr* mmsg, + unsigned int vlen, + unsigned int flags) { +#if defined(__NR_sendmmsg) + return syscall(__NR_sendmmsg, fd, mmsg, vlen, flags); +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__recvmmsg(int fd, + struct uv__mmsghdr* mmsg, + unsigned int vlen, + unsigned int flags, + struct timespec* timeout) { +#if defined(__NR_recvmmsg) + return syscall(__NR_recvmmsg, fd, mmsg, vlen, flags, timeout); +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__utimesat(int dirfd, + const char* path, + const struct timespec times[2], + int flags) +{ +#if defined(__NR_utimensat) + return syscall(__NR_utimensat, dirfd, path, times, flags); +#else + return errno = ENOSYS, -1; +#endif +} + + +ssize_t uv__preadv(int fd, const struct iovec *iov, int iovcnt, int64_t offset) { +#if defined(__NR_preadv) + return syscall(__NR_preadv, fd, iov, iovcnt, (long)offset, (long)(offset >> 32)); +#else + return errno = ENOSYS, -1; +#endif +} + + +ssize_t uv__pwritev(int fd, const struct iovec *iov, int iovcnt, int64_t offset) { +#if defined(__NR_pwritev) + return syscall(__NR_pwritev, fd, iov, iovcnt, (long)offset, (long)(offset >> 32)); +#else + return errno = ENOSYS, -1; +#endif +} + + +int uv__dup3(int oldfd, int newfd, int flags) { +#if defined(__NR_dup3) + return syscall(__NR_dup3, oldfd, newfd, flags); +#else + return errno = ENOSYS, -1; +#endif +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/linux-syscalls.h b/lib/ESPiLight/pilight/libs/libuv/unix/linux-syscalls.h new file mode 100644 index 0000000..4c095e9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/linux-syscalls.h @@ -0,0 +1,151 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_LINUX_SYSCALL_H_ +#define UV_LINUX_SYSCALL_H_ + +#undef _GNU_SOURCE +#define _GNU_SOURCE + +#include +#include +#include +#include +#include + +#if defined(__alpha__) +# define UV__O_CLOEXEC 0x200000 +#elif defined(__hppa__) +# define UV__O_CLOEXEC 0x200000 +#elif defined(__sparc__) +# define UV__O_CLOEXEC 0x400000 +#else +# define UV__O_CLOEXEC 0x80000 +#endif + +#if defined(__alpha__) +# define UV__O_NONBLOCK 0x4 +#elif defined(__hppa__) +# define UV__O_NONBLOCK O_NONBLOCK +#elif defined(__mips__) +# define UV__O_NONBLOCK 0x80 +#elif defined(__sparc__) +# define UV__O_NONBLOCK 0x4000 +#else +# define UV__O_NONBLOCK 0x800 +#endif + +#define UV__EFD_CLOEXEC UV__O_CLOEXEC +#define UV__EFD_NONBLOCK UV__O_NONBLOCK + +#define UV__IN_CLOEXEC UV__O_CLOEXEC +#define UV__IN_NONBLOCK UV__O_NONBLOCK + +#define UV__SOCK_CLOEXEC UV__O_CLOEXEC +#if defined(SOCK_NONBLOCK) +# define UV__SOCK_NONBLOCK SOCK_NONBLOCK +#else +# define UV__SOCK_NONBLOCK UV__O_NONBLOCK +#endif + +/* epoll flags */ +#define UV__EPOLL_CLOEXEC UV__O_CLOEXEC +#define UV__EPOLL_CTL_ADD 1 +#define UV__EPOLL_CTL_DEL 2 +#define UV__EPOLL_CTL_MOD 3 + +/* inotify flags */ +#define UV__IN_ACCESS 0x001 +#define UV__IN_MODIFY 0x002 +#define UV__IN_ATTRIB 0x004 +#define UV__IN_CLOSE_WRITE 0x008 +#define UV__IN_CLOSE_NOWRITE 0x010 +#define UV__IN_OPEN 0x020 +#define UV__IN_MOVED_FROM 0x040 +#define UV__IN_MOVED_TO 0x080 +#define UV__IN_CREATE 0x100 +#define UV__IN_DELETE 0x200 +#define UV__IN_DELETE_SELF 0x400 +#define UV__IN_MOVE_SELF 0x800 + +#if defined(__x86_64__) +struct uv__epoll_event { + uint32_t events; + uint64_t data; +} __attribute__((packed)); +#else +struct uv__epoll_event { + uint32_t events; + uint64_t data; +}; +#endif + +struct uv__inotify_event { + int32_t wd; + uint32_t mask; + uint32_t cookie; + uint32_t len; + /* char name[0]; */ +}; + +struct uv__mmsghdr { + struct msghdr msg_hdr; + unsigned int msg_len; +}; + +int uv__accept4(int fd, struct sockaddr* addr, socklen_t* addrlen, int flags); +int uv__eventfd(unsigned int count); +int uv__epoll_create(int size); +int uv__epoll_create1(int flags); +int uv__epoll_ctl(int epfd, int op, int fd, struct uv__epoll_event *ev); +int uv__epoll_wait(int epfd, + struct uv__epoll_event* events, + int nevents, + int timeout); +int uv__epoll_pwait(int epfd, + struct uv__epoll_event* events, + int nevents, + int timeout, + uint64_t sigmask); +int uv__eventfd2(unsigned int count, int flags); +int uv__inotify_init(void); +int uv__inotify_init1(int flags); +int uv__inotify_add_watch(int fd, const char* path, uint32_t mask); +int uv__inotify_rm_watch(int fd, int32_t wd); +int uv__pipe2(int pipefd[2], int flags); +int uv__recvmmsg(int fd, + struct uv__mmsghdr* mmsg, + unsigned int vlen, + unsigned int flags, + struct timespec* timeout); +int uv__sendmmsg(int fd, + struct uv__mmsghdr* mmsg, + unsigned int vlen, + unsigned int flags); +int uv__utimesat(int dirfd, + const char* path, + const struct timespec times[2], + int flags); +ssize_t uv__preadv(int fd, const struct iovec *iov, int iovcnt, int64_t offset); +ssize_t uv__pwritev(int fd, const struct iovec *iov, int iovcnt, int64_t offset); +int uv__dup3(int oldfd, int newfd, int flags); + +#endif /* UV_LINUX_SYSCALL_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/loop-watcher.c b/lib/ESPiLight/pilight/libs/libuv/unix/loop-watcher.c new file mode 100644 index 0000000..340bb0d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/loop-watcher.c @@ -0,0 +1,68 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#define UV_LOOP_WATCHER_DEFINE(name, type) \ + int uv_##name##_init(uv_loop_t* loop, uv_##name##_t* handle) { \ + uv__handle_init(loop, (uv_handle_t*)handle, UV_##type); \ + handle->name##_cb = NULL; \ + return 0; \ + } \ + \ + int uv_##name##_start(uv_##name##_t* handle, uv_##name##_cb cb) { \ + if (uv__is_active(handle)) return 0; \ + if (cb == NULL) return -EINVAL; \ + QUEUE_INSERT_HEAD(&handle->loop->name##_handles, &handle->queue); \ + handle->name##_cb = cb; \ + uv__handle_start(handle); \ + return 0; \ + } \ + \ + int uv_##name##_stop(uv_##name##_t* handle) { \ + if (!uv__is_active(handle)) return 0; \ + QUEUE_REMOVE(&handle->queue); \ + uv__handle_stop(handle); \ + return 0; \ + } \ + \ + void uv__run_##name(uv_loop_t* loop) { \ + uv_##name##_t* h; \ + QUEUE queue; \ + QUEUE* q; \ + QUEUE_MOVE(&loop->name##_handles, &queue); \ + while (!QUEUE_EMPTY(&queue)) { \ + q = QUEUE_HEAD(&queue); \ + h = QUEUE_DATA(q, uv_##name##_t, queue); \ + QUEUE_REMOVE(q); \ + QUEUE_INSERT_TAIL(&loop->name##_handles, q); \ + h->name##_cb(h); \ + } \ + } \ + \ + void uv__##name##_close(uv_##name##_t* handle) { \ + uv_##name##_stop(handle); \ + } + +UV_LOOP_WATCHER_DEFINE(prepare, PREPARE) +UV_LOOP_WATCHER_DEFINE(check, CHECK) +UV_LOOP_WATCHER_DEFINE(idle, IDLE) diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/loop.c b/lib/ESPiLight/pilight/libs/libuv/unix/loop.c new file mode 100644 index 0000000..bcd4924 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/loop.c @@ -0,0 +1,193 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "tree.h" +#include "internal.h" +#include "heap-inl.h" +#include +#include +#include + +int uv_loop_init(uv_loop_t* loop) { + void* saved_data; + int err; + + uv__signal_global_once_init(); + + saved_data = loop->data; + memset(loop, 0, sizeof(*loop)); + loop->data = saved_data; + + heap_init((struct heap*) &loop->timer_heap); + QUEUE_INIT(&loop->wq); + QUEUE_INIT(&loop->active_reqs); + QUEUE_INIT(&loop->idle_handles); + QUEUE_INIT(&loop->async_handles); + QUEUE_INIT(&loop->check_handles); + QUEUE_INIT(&loop->prepare_handles); + QUEUE_INIT(&loop->handle_queue); + + loop->nfds = 0; + loop->watchers = NULL; + loop->nwatchers = 0; + QUEUE_INIT(&loop->pending_queue); + QUEUE_INIT(&loop->watcher_queue); + + loop->closing_handles = NULL; + uv__update_time(loop); + loop->async_io_watcher.fd = -1; + loop->async_wfd = -1; + loop->signal_pipefd[0] = -1; + loop->signal_pipefd[1] = -1; + loop->backend_fd = -1; + loop->emfile_fd = -1; + + loop->timer_counter = 0; + loop->stop_flag = 0; + + err = uv__platform_loop_init(loop); + if (err) + return err; + + err = uv_signal_init(loop, &loop->child_watcher); + if (err) + goto fail_signal_init; + + uv__handle_unref(&loop->child_watcher); + loop->child_watcher.flags |= UV__HANDLE_INTERNAL; + QUEUE_INIT(&loop->process_handles); + + err = uv_rwlock_init(&loop->cloexec_lock); + if (err) + goto fail_rwlock_init; + + err = uv_mutex_init(&loop->wq_mutex); + if (err) + goto fail_mutex_init; + + err = uv_async_init(loop, &loop->wq_async, uv__work_done); + if (err) + goto fail_async_init; + + uv__handle_unref(&loop->wq_async); + loop->wq_async.flags |= UV__HANDLE_INTERNAL; + + return 0; + +fail_async_init: + uv_mutex_destroy(&loop->wq_mutex); + +fail_mutex_init: + uv_rwlock_destroy(&loop->cloexec_lock); + +fail_rwlock_init: + uv__signal_loop_cleanup(loop); + +fail_signal_init: + uv__platform_loop_delete(loop); + + return err; +} + + +int uv_loop_fork(uv_loop_t* loop) { + int err; + unsigned int i; + uv__io_t* w; + + err = uv__io_fork(loop); + if (err) + return err; + + err = uv__async_fork(loop); + if (err) + return err; + + err = uv__signal_loop_fork(loop); + if (err) + return err; + + /* Rearm all the watchers that aren't re-queued by the above. */ + for (i = 0; i < loop->nwatchers; i++) { + w = loop->watchers[i]; + if (w == NULL) + continue; + + if (w->pevents != 0 && QUEUE_EMPTY(&w->watcher_queue)) { + w->events = 0; /* Force re-registration in uv__io_poll. */ + QUEUE_INSERT_TAIL(&loop->watcher_queue, &w->watcher_queue); + } + } + + return 0; +} + + +void uv__loop_close(uv_loop_t* loop) { + uv__signal_loop_cleanup(loop); + uv__platform_loop_delete(loop); + uv__async_stop(loop); + + if (loop->emfile_fd != -1) { + uv__close(loop->emfile_fd); + loop->emfile_fd = -1; + } + + if (loop->backend_fd != -1) { + uv__close(loop->backend_fd); + loop->backend_fd = -1; + } + + uv_mutex_lock(&loop->wq_mutex); + assert(QUEUE_EMPTY(&loop->wq) && "thread pool work queue not empty!"); + assert(!uv__has_active_reqs(loop)); + uv_mutex_unlock(&loop->wq_mutex); + uv_mutex_destroy(&loop->wq_mutex); + + /* + * Note that all thread pool stuff is finished at this point and + * it is safe to just destroy rw lock + */ + uv_rwlock_destroy(&loop->cloexec_lock); + +#if 0 + assert(QUEUE_EMPTY(&loop->pending_queue)); + assert(QUEUE_EMPTY(&loop->watcher_queue)); + assert(loop->nfds == 0); +#endif + + uv__free(loop->watchers); + loop->watchers = NULL; + loop->nwatchers = 0; +} + + +int uv__loop_configure(uv_loop_t* loop, uv_loop_option option, va_list ap) { + if (option != UV_LOOP_BLOCK_SIGNAL) + return UV_ENOSYS; + + if (va_arg(ap, int) != SIGPROF) + return UV_EINVAL; + + loop->flags |= UV_LOOP_BLOCK_SIGPROF; + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/netbsd.c b/lib/ESPiLight/pilight/libs/libuv/unix/netbsd.c new file mode 100644 index 0000000..9b5546b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/netbsd.c @@ -0,0 +1,272 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +static char *process_title; + + +int uv__platform_loop_init(uv_loop_t* loop) { + return uv__kqueue_init(loop); +} + + +void uv__platform_loop_delete(uv_loop_t* loop) { +} + + +void uv_loadavg(double avg[3]) { + struct loadavg info; + size_t size = sizeof(info); + int which[] = {CTL_VM, VM_LOADAVG}; + + if (sysctl(which, 2, &info, &size, NULL, 0) == -1) return; + + avg[0] = (double) info.ldavg[0] / info.fscale; + avg[1] = (double) info.ldavg[1] / info.fscale; + avg[2] = (double) info.ldavg[2] / info.fscale; +} + + +int uv_exepath(char* buffer, size_t* size) { + int mib[4]; + size_t cb; + pid_t mypid; + + if (buffer == NULL || size == NULL || *size == 0) + return -EINVAL; + + mypid = getpid(); + mib[0] = CTL_KERN; + mib[1] = KERN_PROC_ARGS; + mib[2] = mypid; + mib[3] = KERN_PROC_ARGV; + + cb = *size; + if (sysctl(mib, 4, buffer, &cb, NULL, 0)) + return -errno; + *size = strlen(buffer); + + return 0; +} + + +uint64_t uv_get_free_memory(void) { + struct uvmexp info; + size_t size = sizeof(info); + int which[] = {CTL_VM, VM_UVMEXP}; + + if (sysctl(which, 2, &info, &size, NULL, 0)) + return -errno; + + return (uint64_t) info.free * sysconf(_SC_PAGESIZE); +} + + +uint64_t uv_get_total_memory(void) { +#if defined(HW_PHYSMEM64) + uint64_t info; + int which[] = {CTL_HW, HW_PHYSMEM64}; +#else + unsigned int info; + int which[] = {CTL_HW, HW_PHYSMEM}; +#endif + size_t size = sizeof(info); + + if (sysctl(which, 2, &info, &size, NULL, 0)) + return -errno; + + return (uint64_t) info; +} + + +char** uv_setup_args(int argc, char** argv) { + process_title = argc ? uv__strdup(argv[0]) : NULL; + return argv; +} + + +int uv_set_process_title(const char* title) { + if (process_title) uv__free(process_title); + + process_title = uv__strdup(title); + setproctitle("%s", title); + + return 0; +} + + +int uv_get_process_title(char* buffer, size_t size) { + size_t len; + + if (buffer == NULL || size == 0) + return -EINVAL; + + if (process_title) { + len = strlen(process_title) + 1; + + if (size < len) + return -ENOBUFS; + + memcpy(buffer, process_title, len); + } else { + len = 0; + } + + buffer[len] = '\0'; + + return 0; +} + + +int uv_resident_set_memory(size_t* rss) { + kvm_t *kd = NULL; + struct kinfo_proc2 *kinfo = NULL; + pid_t pid; + int nprocs; + int max_size = sizeof(struct kinfo_proc2); + int page_size; + + page_size = getpagesize(); + pid = getpid(); + + kd = kvm_open(NULL, NULL, NULL, KVM_NO_FILES, "kvm_open"); + + if (kd == NULL) goto error; + + kinfo = kvm_getproc2(kd, KERN_PROC_PID, pid, max_size, &nprocs); + if (kinfo == NULL) goto error; + + *rss = kinfo->p_vm_rssize * page_size; + + kvm_close(kd); + + return 0; + +error: + if (kd) kvm_close(kd); + return -EPERM; +} + + +int uv_uptime(double* uptime) { + time_t now; + struct timeval info; + size_t size = sizeof(info); + static int which[] = {CTL_KERN, KERN_BOOTTIME}; + + if (sysctl(which, 2, &info, &size, NULL, 0)) + return -errno; + + now = time(NULL); + + *uptime = (double)(now - info.tv_sec); + return 0; +} + + +int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { + unsigned int ticks = (unsigned int)sysconf(_SC_CLK_TCK); + unsigned int multiplier = ((uint64_t)1000L / ticks); + unsigned int cur = 0; + uv_cpu_info_t* cpu_info; + u_int64_t* cp_times; + char model[512]; + u_int64_t cpuspeed; + int numcpus; + size_t size; + int i; + + size = sizeof(model); + if (sysctlbyname("machdep.cpu_brand", &model, &size, NULL, 0) && + sysctlbyname("hw.model", &model, &size, NULL, 0)) { + return -errno; + } + + size = sizeof(numcpus); + if (sysctlbyname("hw.ncpu", &numcpus, &size, NULL, 0)) + return -errno; + *count = numcpus; + + /* Only i386 and amd64 have machdep.tsc_freq */ + size = sizeof(cpuspeed); + if (sysctlbyname("machdep.tsc_freq", &cpuspeed, &size, NULL, 0)) + cpuspeed = 0; + + size = numcpus * CPUSTATES * sizeof(*cp_times); + cp_times = uv__malloc(size); + if (cp_times == NULL) + return -ENOMEM; + + if (sysctlbyname("kern.cp_time", cp_times, &size, NULL, 0)) + return -errno; + + *cpu_infos = uv__malloc(numcpus * sizeof(**cpu_infos)); + if (!(*cpu_infos)) { + uv__free(cp_times); + uv__free(*cpu_infos); + return -ENOMEM; + } + + for (i = 0; i < numcpus; i++) { + cpu_info = &(*cpu_infos)[i]; + cpu_info->cpu_times.user = (uint64_t)(cp_times[CP_USER+cur]) * multiplier; + cpu_info->cpu_times.nice = (uint64_t)(cp_times[CP_NICE+cur]) * multiplier; + cpu_info->cpu_times.sys = (uint64_t)(cp_times[CP_SYS+cur]) * multiplier; + cpu_info->cpu_times.idle = (uint64_t)(cp_times[CP_IDLE+cur]) * multiplier; + cpu_info->cpu_times.irq = (uint64_t)(cp_times[CP_INTR+cur]) * multiplier; + cpu_info->model = uv__strdup(model); + cpu_info->speed = (int)(cpuspeed/(uint64_t) 1e6); + cur += CPUSTATES; + } + uv__free(cp_times); + return 0; +} + + +void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { + int i; + + for (i = 0; i < count; i++) { + uv__free(cpu_infos[i].model); + } + + uv__free(cpu_infos); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/no-fsevents.c b/lib/ESPiLight/pilight/libs/libuv/unix/no-fsevents.c new file mode 100644 index 0000000..38fb6ab --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/no-fsevents.c @@ -0,0 +1,42 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include + +int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { + return -ENOSYS; +} + +int uv_fs_event_start(uv_fs_event_t* handle, uv_fs_event_cb cb, + const char* filename, unsigned int flags) { + return -ENOSYS; +} + +int uv_fs_event_stop(uv_fs_event_t* handle) { + return -ENOSYS; +} + +void uv__fs_event_close(uv_fs_event_t* handle) { + UNREACHABLE(); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/no-proctitle.c b/lib/ESPiLight/pilight/libs/libuv/unix/no-proctitle.c new file mode 100644 index 0000000..a5c19fb --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/no-proctitle.c @@ -0,0 +1,42 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include + +char** uv_setup_args(int argc, char** argv) { + return argv; +} + +int uv_set_process_title(const char* title) { + return 0; +} + +int uv_get_process_title(char* buffer, size_t size) { + if (buffer == NULL || size == 0) + return -EINVAL; + + buffer[0] = '\0'; + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/openbsd.c b/lib/ESPiLight/pilight/libs/libuv/unix/openbsd.c new file mode 100644 index 0000000..56f0af1 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/openbsd.c @@ -0,0 +1,284 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +static char *process_title; + + +int uv__platform_loop_init(uv_loop_t* loop) { + return uv__kqueue_init(loop); +} + + +void uv__platform_loop_delete(uv_loop_t* loop) { +} + + +void uv_loadavg(double avg[3]) { + struct loadavg info; + size_t size = sizeof(info); + int which[] = {CTL_VM, VM_LOADAVG}; + + if (sysctl(which, 2, &info, &size, NULL, 0) < 0) return; + + avg[0] = (double) info.ldavg[0] / info.fscale; + avg[1] = (double) info.ldavg[1] / info.fscale; + avg[2] = (double) info.ldavg[2] / info.fscale; +} + + +int uv_exepath(char* buffer, size_t* size) { + int mib[4]; + char **argsbuf = NULL; + char **argsbuf_tmp; + size_t argsbuf_size = 100U; + size_t exepath_size; + pid_t mypid; + int err; + + if (buffer == NULL || size == NULL || *size == 0) + return -EINVAL; + + mypid = getpid(); + for (;;) { + err = -ENOMEM; + argsbuf_tmp = uv__realloc(argsbuf, argsbuf_size); + if (argsbuf_tmp == NULL) + goto out; + argsbuf = argsbuf_tmp; + mib[0] = CTL_KERN; + mib[1] = KERN_PROC_ARGS; + mib[2] = mypid; + mib[3] = KERN_PROC_ARGV; + if (sysctl(mib, 4, argsbuf, &argsbuf_size, NULL, 0) == 0) { + break; + } + if (errno != ENOMEM) { + err = -errno; + goto out; + } + argsbuf_size *= 2U; + } + + if (argsbuf[0] == NULL) { + err = -EINVAL; /* FIXME(bnoordhuis) More appropriate error. */ + goto out; + } + + *size -= 1; + exepath_size = strlen(argsbuf[0]); + if (*size > exepath_size) + *size = exepath_size; + + memcpy(buffer, argsbuf[0], *size); + buffer[*size] = '\0'; + err = 0; + +out: + uv__free(argsbuf); + + return err; +} + + +uint64_t uv_get_free_memory(void) { + struct uvmexp info; + size_t size = sizeof(info); + int which[] = {CTL_VM, VM_UVMEXP}; + + if (sysctl(which, 2, &info, &size, NULL, 0)) + return -errno; + + return (uint64_t) info.free * sysconf(_SC_PAGESIZE); +} + + +uint64_t uv_get_total_memory(void) { + uint64_t info; + int which[] = {CTL_HW, HW_PHYSMEM64}; + size_t size = sizeof(info); + + if (sysctl(which, 2, &info, &size, NULL, 0)) + return -errno; + + return (uint64_t) info; +} + + +char** uv_setup_args(int argc, char** argv) { + process_title = argc ? uv__strdup(argv[0]) : NULL; + return argv; +} + + +int uv_set_process_title(const char* title) { + uv__free(process_title); + process_title = uv__strdup(title); + setproctitle("%s", title); + return 0; +} + + +int uv_get_process_title(char* buffer, size_t size) { + size_t len; + + if (buffer == NULL || size == 0) + return -EINVAL; + + if (process_title) { + len = strlen(process_title) + 1; + + if (size < len) + return -ENOBUFS; + + memcpy(buffer, process_title, len); + } else { + len = 0; + } + + buffer[len] = '\0'; + + return 0; +} + + +int uv_resident_set_memory(size_t* rss) { + struct kinfo_proc kinfo; + size_t page_size = getpagesize(); + size_t size = sizeof(struct kinfo_proc); + int mib[6]; + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + mib[4] = sizeof(struct kinfo_proc); + mib[5] = 1; + + if (sysctl(mib, 6, &kinfo, &size, NULL, 0) < 0) + return -errno; + + *rss = kinfo.p_vm_rssize * page_size; + return 0; +} + + +int uv_uptime(double* uptime) { + time_t now; + struct timeval info; + size_t size = sizeof(info); + static int which[] = {CTL_KERN, KERN_BOOTTIME}; + + if (sysctl(which, 2, &info, &size, NULL, 0)) + return -errno; + + now = time(NULL); + + *uptime = (double)(now - info.tv_sec); + return 0; +} + + +int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { + unsigned int ticks = (unsigned int)sysconf(_SC_CLK_TCK), + multiplier = ((uint64_t)1000L / ticks), cpuspeed; + uint64_t info[CPUSTATES]; + char model[512]; + int numcpus = 1; + int which[] = {CTL_HW,HW_MODEL,0}; + size_t size; + int i; + uv_cpu_info_t* cpu_info; + + size = sizeof(model); + if (sysctl(which, 2, &model, &size, NULL, 0)) + return -errno; + + which[1] = HW_NCPU; + size = sizeof(numcpus); + if (sysctl(which, 2, &numcpus, &size, NULL, 0)) + return -errno; + + *cpu_infos = uv__malloc(numcpus * sizeof(**cpu_infos)); + if (!(*cpu_infos)) + return -ENOMEM; + + *count = numcpus; + + which[1] = HW_CPUSPEED; + size = sizeof(cpuspeed); + if (sysctl(which, 2, &cpuspeed, &size, NULL, 0)) { + uv__free(*cpu_infos); + return -errno; + } + + size = sizeof(info); + which[0] = CTL_KERN; + which[1] = KERN_CPTIME2; + for (i = 0; i < numcpus; i++) { + which[2] = i; + size = sizeof(info); + if (sysctl(which, 3, &info, &size, NULL, 0)) { + uv__free(*cpu_infos); + return -errno; + } + + cpu_info = &(*cpu_infos)[i]; + + cpu_info->cpu_times.user = (uint64_t)(info[CP_USER]) * multiplier; + cpu_info->cpu_times.nice = (uint64_t)(info[CP_NICE]) * multiplier; + cpu_info->cpu_times.sys = (uint64_t)(info[CP_SYS]) * multiplier; + cpu_info->cpu_times.idle = (uint64_t)(info[CP_IDLE]) * multiplier; + cpu_info->cpu_times.irq = (uint64_t)(info[CP_INTR]) * multiplier; + + cpu_info->model = uv__strdup(model); + cpu_info->speed = cpuspeed; + } + + return 0; +} + + +void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { + int i; + + for (i = 0; i < count; i++) { + uv__free(cpu_infos[i].model); + } + + uv__free(cpu_infos); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/os390-syscalls.c b/lib/ESPiLight/pilight/libs/libuv/unix/os390-syscalls.c new file mode 100644 index 0000000..7edf235 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/os390-syscalls.c @@ -0,0 +1,334 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + + +#include "os390-syscalls.h" +#include +#include +#include +#include + +#define CW_CONDVAR 32 + +#pragma linkage(BPX4CTW, OS) +#pragma linkage(BPX1CTW, OS) + +static int number_of_epolls; +static QUEUE global_epoll_queue; +static uv_mutex_t global_epoll_lock; +static uv_once_t once = UV_ONCE_INIT; + +int scandir(const char* maindir, struct dirent*** namelist, + int (*filter)(const struct dirent*), + int (*compar)(const struct dirent**, + const struct dirent **)) { + struct dirent** nl; + struct dirent* dirent; + unsigned count; + size_t allocated; + DIR* mdir; + + nl = NULL; + count = 0; + allocated = 0; + mdir = opendir(maindir); + if (!mdir) + return -1; + + while (1) { + dirent = readdir(mdir); + if (!dirent) + break; + if (!filter || filter(dirent)) { + struct dirent* copy; + copy = uv__malloc(sizeof(*copy)); + if (!copy) { + while (count) { + dirent = nl[--count]; + uv__free(dirent); + } + uv__free(nl); + closedir(mdir); + errno = ENOMEM; + return -1; + } + memcpy(copy, dirent, sizeof(*copy)); + + nl = uv__realloc(nl, sizeof(*copy) * (count + 1)); + nl[count++] = copy; + } + } + + qsort(nl, count, sizeof(struct dirent *), + (int (*)(const void *, const void *)) compar); + + closedir(mdir); + + *namelist = nl; + return count; +} + + +static unsigned int next_power_of_two(unsigned int val) { + val -= 1; + val |= val >> 1; + val |= val >> 2; + val |= val >> 4; + val |= val >> 8; + val |= val >> 16; + val += 1; + return val; +} + + +static void maybe_resize(uv__os390_epoll* lst, unsigned int len) { + unsigned int newsize; + unsigned int i; + struct pollfd* newlst; + + if (len <= lst->size) + return; + + newsize = next_power_of_two(len); + newlst = uv__realloc(lst->items, newsize * sizeof(lst->items[0])); + + if (newlst == NULL) + abort(); + for (i = lst->size; i < newsize; ++i) + newlst[i].fd = -1; + + lst->items = newlst; + lst->size = newsize; +} + + +static void epoll_init(void) { + QUEUE_INIT(&global_epoll_queue); + if (uv_mutex_init(&global_epoll_lock)) + abort(); +} + + +uv__os390_epoll* epoll_create1(int flags) { + uv__os390_epoll* lst; + + uv_once(&once, epoll_init); + uv_mutex_lock(&global_epoll_lock); + lst = uv__malloc(sizeof(*lst)); + if (lst == -1) + return NULL; + QUEUE_INSERT_TAIL(&global_epoll_queue, &lst->member); + uv_mutex_unlock(&global_epoll_lock); + + /* initialize list */ + lst->size = 0; + lst->items = NULL; + return lst; +} + + +int epoll_ctl(uv__os390_epoll* lst, + int op, + int fd, + struct epoll_event *event) { + if(op == EPOLL_CTL_DEL) { + if (fd >= lst->size || lst->items[fd].fd == -1) { + errno = ENOENT; + return -1; + } + lst->items[fd].fd = -1; + } else if(op == EPOLL_CTL_ADD) { + maybe_resize(lst, fd + 1); + if (lst->items[fd].fd != -1) { + errno = EEXIST; + return -1; + } + lst->items[fd].fd = fd; + lst->items[fd].events = event->events; + } else if(op == EPOLL_CTL_MOD) { + if (fd >= lst->size || lst->items[fd].fd == -1) { + errno = ENOENT; + return -1; + } + lst->items[fd].events = event->events; + } else + abort(); + + return 0; +} + + +int epoll_wait(uv__os390_epoll* lst, struct epoll_event* events, + int maxevents, int timeout) { + size_t size; + struct pollfd* pfds; + int pollret; + int reventcount; + + uv_mutex_lock(&global_epoll_lock); + uv_mutex_unlock(&global_epoll_lock); + size = lst->size; + pfds = lst->items; + pollret = poll(pfds, size, timeout); + if(pollret == -1) + return pollret; + + reventcount = 0; + for (int i = 0; i < lst->size && i < maxevents; ++i) { + struct epoll_event ev; + + ev.events = 0; + ev.fd = pfds[i].fd; + if(!pfds[i].revents) + continue; + + if(pfds[i].revents & POLLRDNORM) + ev.events = ev.events | POLLIN; + + if(pfds[i].revents & POLLWRNORM) + ev.events = ev.events | POLLOUT; + + if(pfds[i].revents & POLLHUP) + ev.events = ev.events | POLLHUP; + + pfds[i].revents = 0; + events[reventcount++] = ev; + } + + return reventcount; +} + + +int epoll_file_close(int fd) { + QUEUE* q; + + uv_once(&once, epoll_init); + uv_mutex_lock(&global_epoll_lock); + QUEUE_FOREACH(q, &global_epoll_queue) { + uv__os390_epoll* lst; + + lst = QUEUE_DATA(q, uv__os390_epoll, member); + if (fd < lst->size && lst->items != NULL && lst->items[fd].fd != -1) + lst->items[fd].fd = -1; + } + + uv_mutex_unlock(&global_epoll_lock); + return 0; +} + +void epoll_queue_close(uv__os390_epoll* lst) { + uv_mutex_lock(&global_epoll_lock); + QUEUE_REMOVE(&lst->member); + uv_mutex_unlock(&global_epoll_lock); + uv__free(lst->items); + lst->items = NULL; +} + + +int nanosleep(const struct timespec* req, struct timespec* rem) { + unsigned nano; + unsigned seconds; + unsigned events; + unsigned secrem; + unsigned nanorem; + int rv; + int rc; + int rsn; + + nano = (int)req->tv_nsec; + seconds = req->tv_sec; + events = CW_CONDVAR; + +#if defined(_LP64) + BPX4CTW(&seconds, &nano, &events, &secrem, &nanorem, &rv, &rc, &rsn); +#else + BPX1CTW(&seconds, &nano, &events, &secrem, &nanorem, &rv, &rc, &rsn); +#endif + + assert(rv == -1 && errno == EAGAIN); + + if(rem != NULL) { + rem->tv_nsec = nanorem; + rem->tv_sec = secrem; + } + + return 0; +} + + +char* mkdtemp(char* path) { + static const char* tempchars = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + static const size_t num_chars = 62; + static const size_t num_x = 6; + char *ep, *cp; + unsigned int tries, i; + size_t len; + uint64_t v; + int fd; + int retval; + int saved_errno; + + len = strlen(path); + ep = path + len; + if (len < num_x || strncmp(ep - num_x, "XXXXXX", num_x)) { + errno = EINVAL; + return NULL; + } + + fd = open("/dev/urandom", O_RDONLY); + if (fd == -1) + return NULL; + + tries = TMP_MAX; + retval = -1; + do { + if (read(fd, &v, sizeof(v)) != sizeof(v)) + break; + + cp = ep - num_x; + for (i = 0; i < num_x; i++) { + *cp++ = tempchars[v % num_chars]; + v /= num_chars; + } + + if (mkdir(path, S_IRWXU) == 0) { + retval = 0; + break; + } + else if (errno != EEXIST) + break; + } while (--tries); + + saved_errno = errno; + uv__close(fd); + if (tries == 0) { + errno = EEXIST; + return NULL; + } + + if (retval == -1) { + errno = saved_errno; + return NULL; + } + + return path; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/os390-syscalls.h b/lib/ESPiLight/pilight/libs/libuv/unix/os390-syscalls.h new file mode 100644 index 0000000..61a7cee --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/os390-syscalls.h @@ -0,0 +1,69 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + + +#ifndef UV_OS390_SYSCALL_H_ +#define UV_OS390_SYSCALL_H_ + +#include "uv.h" +#include "internal.h" +#include +#include +#include + +#define EPOLL_CTL_ADD 1 +#define EPOLL_CTL_DEL 2 +#define EPOLL_CTL_MOD 3 +#define MAX_EPOLL_INSTANCES 256 +#define MAX_ITEMS_PER_EPOLL 1024 + +#define UV__O_CLOEXEC 0x80000 +#define UV__EPOLL_CLOEXEC UV__O_CLOEXEC +#define UV__EPOLL_CTL_ADD EPOLL_CTL_ADD +#define UV__EPOLL_CTL_DEL EPOLL_CTL_DEL +#define UV__EPOLL_CTL_MOD EPOLL_CTL_MOD + +struct epoll_event { + int events; + int fd; +}; + +typedef struct { + QUEUE member; + struct pollfd* items; + unsigned long size; +} uv__os390_epoll; + +/* epoll api */ +uv__os390_epoll* epoll_create1(int flags); +int epoll_ctl(uv__os390_epoll* ep, int op, int fd, struct epoll_event *event); +int epoll_wait(uv__os390_epoll* ep, struct epoll_event *events, int maxevents, int timeout); +int epoll_file_close(int fd); + +/* utility functions */ +int nanosleep(const struct timespec* req, struct timespec* rem); +int scandir(const char* maindir, struct dirent*** namelist, + int (*filter)(const struct dirent *), + int (*compar)(const struct dirent **, + const struct dirent **)); +char *mkdtemp(char* path); + +#endif /* UV_OS390_SYSCALL_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/os390.c b/lib/ESPiLight/pilight/libs/libuv/unix/os390.c new file mode 100644 index 0000000..2ba5abf --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/os390.c @@ -0,0 +1,849 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "internal.h" +#include +#include +#include +#include +#include +#if defined(__clang__) +#include "csrsic.h" +#else +#include "//'SYS1.SAMPLIB(CSRSIC)'" +#endif + +#define CVT_PTR 0x10 +#define CSD_OFFSET 0x294 + +/* + Long-term average CPU service used by this logical partition, + in millions of service units per hour. If this value is above + the partition's defined capacity, the partition will be capped. + It is calculated using the physical CPU adjustment factor + (RCTPCPUA) so it may not match other measures of service which + are based on the logical CPU adjustment factor. It is available + if the hardware supports LPAR cluster. +*/ +#define RCTLACS_OFFSET 0xC4 + +/* 32-bit count of alive CPUs. This includes both CPs and IFAs */ +#define CSD_NUMBER_ONLINE_CPUS 0xD4 + +/* Address of system resources manager (SRM) control table */ +#define CVTOPCTP_OFFSET 0x25C + +/* Address of the RCT table */ +#define RMCTRCT_OFFSET 0xE4 + +/* Address of the rsm control and enumeration area. */ +#define CVTRCEP_OFFSET 0x490 + +/* + Number of frames currently available to system. + Excluded are frames backing perm storage, frames offline, and bad frames. +*/ +#define RCEPOOL_OFFSET 0x004 + +/* Total number of frames currently on all available frame queues. */ +#define RCEAFC_OFFSET 0x088 + +/* CPC model length from the CSRSI Service. */ +#define CPCMODEL_LENGTH 16 + +/* Thread Entry constants */ +#define PGTH_CURRENT 1 +#define PGTH_LEN 26 +#define PGTHAPATH 0x20 +#pragma linkage(BPX4GTH, OS) +#pragma linkage(BPX1GTH, OS) + +typedef unsigned data_area_ptr_assign_type; + +typedef union { + struct { +#if defined(_LP64) + data_area_ptr_assign_type lower; +#endif + data_area_ptr_assign_type assign; + }; + char* deref; +} data_area_ptr; + + +void uv_loadavg(double avg[3]) { + /* TODO: implement the following */ + avg[0] = 0; + avg[1] = 0; + avg[2] = 0; +} + + +int uv__platform_loop_init(uv_loop_t* loop) { + uv__os390_epoll* ep; + + ep = epoll_create1(UV__EPOLL_CLOEXEC); + loop->ep = ep; + if (ep == NULL) + return -errno; + + return 0; +} + + +void uv__platform_loop_delete(uv_loop_t* loop) { + if (loop->ep != NULL) { + epoll_queue_close(loop->ep); + loop->ep = NULL; + } +} + + +uint64_t uv__hrtime(uv_clocktype_t type) { + struct timeval time; + gettimeofday(&time, NULL); + return (uint64_t) time.tv_sec * 1e9 + time.tv_usec * 1e3; +} + + +/* + Get the exe path using the thread entry information + in the address space. +*/ +static int getexe(const int pid, char* buf, size_t len) { + struct { + int pid; + int thid[2]; + char accesspid; + char accessthid; + char asid[2]; + char loginname[8]; + char flag; + char len; + } Input_data; + + union { + struct { + char gthb[4]; + int pid; + int thid[2]; + char accesspid; + char accessthid[3]; + int lenused; + int offsetProcess; + int offsetConTTY; + int offsetPath; + int offsetCommand; + int offsetFileData; + int offsetThread; + } Output_data; + char buf[2048]; + } Output_buf; + + struct Output_path_type { + char gthe[4]; + short int len; + char path[1024]; + }; + + int Input_length; + int Output_length; + void* Input_address; + void* Output_address; + struct Output_path_type* Output_path; + int rv; + int rc; + int rsn; + + Input_length = PGTH_LEN; + Output_length = sizeof(Output_buf); + Output_address = &Output_buf; + Input_address = &Input_data; + memset(&Input_data, 0, sizeof Input_data); + Input_data.flag |= PGTHAPATH; + Input_data.pid = pid; + Input_data.accesspid = PGTH_CURRENT; + +#ifdef _LP64 + BPX4GTH(&Input_length, + &Input_address, + &Output_length, + &Output_address, + &rv, + &rc, + &rsn); +#else + BPX1GTH(&Input_length, + &Input_address, + &Output_length, + &Output_address, + &rv, + &rc, + &rsn); +#endif + + if (rv == -1) { + errno = rc; + return -1; + } + + /* Check highest byte to ensure data availability */ + assert(((Output_buf.Output_data.offsetPath >>24) & 0xFF) == 'A'); + + /* Get the offset from the lowest 3 bytes */ + Output_path = (char*)(&Output_buf) + + (Output_buf.Output_data.offsetPath & 0x00FFFFFF); + + if (Output_path->len >= len) { + errno = ENOBUFS; + return -1; + } + + strncpy(buf, Output_path->path, len); + + return 0; +} + + +/* + * We could use a static buffer for the path manipulations that we need outside + * of the function, but this function could be called by multiple consumers and + * we don't want to potentially create a race condition in the use of snprintf. + * There is no direct way of getting the exe path in zOS - either through /procfs + * or through some libc APIs. The below approach is to parse the argv[0]'s pattern + * and use it in conjunction with PATH environment variable to craft one. + */ +int uv_exepath(char* buffer, size_t* size) { + int res; + char args[PATH_MAX]; + char abspath[PATH_MAX]; + size_t abspath_size; + int pid; + + if (buffer == NULL || size == NULL || *size == 0) + return -EINVAL; + + pid = getpid(); + res = getexe(pid, args, sizeof(args)); + if (res < 0) + return -EINVAL; + + /* + * Possibilities for args: + * i) an absolute path such as: /home/user/myprojects/nodejs/node + * ii) a relative path such as: ./node or ../myprojects/nodejs/node + * iii) a bare filename such as "node", after exporting PATH variable + * to its location. + */ + + /* Case i) and ii) absolute or relative paths */ + if (strchr(args, '/') != NULL) { + if (realpath(args, abspath) != abspath) + return -errno; + + abspath_size = strlen(abspath); + + *size -= 1; + if (*size > abspath_size) + *size = abspath_size; + + memcpy(buffer, abspath, *size); + buffer[*size] = '\0'; + + return 0; + } else { + /* Case iii). Search PATH environment variable */ + char trypath[PATH_MAX]; + char* clonedpath = NULL; + char* token = NULL; + char* path = getenv("PATH"); + + if (path == NULL) + return -EINVAL; + + clonedpath = uv__strdup(path); + if (clonedpath == NULL) + return -ENOMEM; + + token = strtok(clonedpath, ":"); + while (token != NULL) { + snprintf(trypath, sizeof(trypath) - 1, "%s/%s", token, args); + if (realpath(trypath, abspath) == abspath) { + /* Check the match is executable */ + if (access(abspath, X_OK) == 0) { + abspath_size = strlen(abspath); + + *size -= 1; + if (*size > abspath_size) + *size = abspath_size; + + memcpy(buffer, abspath, *size); + buffer[*size] = '\0'; + + uv__free(clonedpath); + return 0; + } + } + token = strtok(NULL, ":"); + } + uv__free(clonedpath); + + /* Out of tokens (path entries), and no match found */ + return -EINVAL; + } +} + + +uint64_t uv_get_free_memory(void) { + uint64_t freeram; + + data_area_ptr cvt = {0}; + data_area_ptr rcep = {0}; + cvt.assign = *(data_area_ptr_assign_type*)(CVT_PTR); + rcep.assign = *(data_area_ptr_assign_type*)(cvt.deref + CVTRCEP_OFFSET); + freeram = *((uint64_t*)(rcep.deref + RCEAFC_OFFSET)) * 4; + return freeram; +} + + +uint64_t uv_get_total_memory(void) { + uint64_t totalram; + + data_area_ptr cvt = {0}; + data_area_ptr rcep = {0}; + cvt.assign = *(data_area_ptr_assign_type*)(CVT_PTR); + rcep.assign = *(data_area_ptr_assign_type*)(cvt.deref + CVTRCEP_OFFSET); + totalram = *((uint64_t*)(rcep.deref + RCEPOOL_OFFSET)) * 4; + return totalram; +} + + +int uv_resident_set_memory(size_t* rss) { + W_PSPROC buf; + + memset(&buf, 0, sizeof(buf)); + if (w_getpsent(0, &buf, sizeof(W_PSPROC)) == -1) + return -EINVAL; + + *rss = buf.ps_size; + return 0; +} + + +int uv_uptime(double* uptime) { + struct utmpx u ; + struct utmpx *v; + time64_t t; + + u.ut_type = BOOT_TIME; + v = getutxid(&u); + if (v == NULL) + return -1; + *uptime = difftime64(time64(&t), v->ut_tv.tv_sec); + return 0; +} + + +int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { + uv_cpu_info_t* cpu_info; + int result; + int idx; + siv1v2 info; + data_area_ptr cvt = {0}; + data_area_ptr csd = {0}; + data_area_ptr rmctrct = {0}; + data_area_ptr cvtopctp = {0}; + int cpu_usage_avg; + + cvt.assign = *(data_area_ptr_assign_type*)(CVT_PTR); + + csd.assign = *((data_area_ptr_assign_type *) (cvt.deref + CSD_OFFSET)); + cvtopctp.assign = *((data_area_ptr_assign_type *) (cvt.deref + CVTOPCTP_OFFSET)); + rmctrct.assign = *((data_area_ptr_assign_type *) (cvtopctp.deref + RMCTRCT_OFFSET)); + + *count = *((int*) (csd.deref + CSD_NUMBER_ONLINE_CPUS)); + cpu_usage_avg = *((unsigned short int*) (rmctrct.deref + RCTLACS_OFFSET)); + + *cpu_infos = uv__malloc(*count * sizeof(uv_cpu_info_t)); + if (!*cpu_infos) + return -ENOMEM; + + cpu_info = *cpu_infos; + idx = 0; + while (idx < *count) { + cpu_info->speed = *(int*)(info.siv1v2si22v1.si22v1cpucapability); + cpu_info->model = uv__malloc(CPCMODEL_LENGTH + 1); + memset(cpu_info->model, '\0', CPCMODEL_LENGTH + 1); + memcpy(cpu_info->model, info.siv1v2si11v1.si11v1cpcmodel, CPCMODEL_LENGTH); + cpu_info->cpu_times.user = cpu_usage_avg; + /* TODO: implement the following */ + cpu_info->cpu_times.sys = 0; + cpu_info->cpu_times.idle = 0; + cpu_info->cpu_times.irq = 0; + cpu_info->cpu_times.nice = 0; + ++cpu_info; + ++idx; + } + + return 0; +} + + +void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { + for (int i = 0; i < count; ++i) + uv__free(cpu_infos[i].model); + uv__free(cpu_infos); +} + + +static int uv__interface_addresses_v6(uv_interface_address_t** addresses, + int* count) { + uv_interface_address_t* address; + int sockfd; + int maxsize; + __net_ifconf6header_t ifc; + __net_ifconf6entry_t* ifr; + __net_ifconf6entry_t* p; + __net_ifconf6entry_t flg; + + *count = 0; + /* Assume maximum buffer size allowable */ + maxsize = 16384; + + if (0 > (sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP))) + return -errno; + + ifc.__nif6h_version = 1; + ifc.__nif6h_buflen = maxsize; + ifc.__nif6h_buffer = uv__calloc(1, maxsize);; + + if (ioctl(sockfd, SIOCGIFCONF6, &ifc) == -1) { + uv__close(sockfd); + return -errno; + } + + + *count = 0; + ifr = (__net_ifconf6entry_t*)(ifc.__nif6h_buffer); + while ((char*)ifr < (char*)ifc.__nif6h_buffer + ifc.__nif6h_buflen) { + p = ifr; + ifr = (__net_ifconf6entry_t*)((char*)ifr + ifc.__nif6h_entrylen); + + if (!(p->__nif6e_addr.sin6_family == AF_INET6 || + p->__nif6e_addr.sin6_family == AF_INET)) + continue; + + if (!(p->__nif6e_flags & _NIF6E_FLAGS_ON_LINK_ACTIVE)) + continue; + + ++(*count); + } + + /* Alloc the return interface structs */ + *addresses = uv__malloc(*count * sizeof(uv_interface_address_t)); + if (!(*addresses)) { + uv__close(sockfd); + return -ENOMEM; + } + address = *addresses; + + ifr = (__net_ifconf6entry_t*)(ifc.__nif6h_buffer); + while ((char*)ifr < (char*)ifc.__nif6h_buffer + ifc.__nif6h_buflen) { + p = ifr; + ifr = (__net_ifconf6entry_t*)((char*)ifr + ifc.__nif6h_entrylen); + + if (!(p->__nif6e_addr.sin6_family == AF_INET6 || + p->__nif6e_addr.sin6_family == AF_INET)) + continue; + + if (!(p->__nif6e_flags & _NIF6E_FLAGS_ON_LINK_ACTIVE)) + continue; + + /* All conditions above must match count loop */ + + address->name = uv__strdup(p->__nif6e_name); + + if (p->__nif6e_addr.sin6_family == AF_INET6) + address->address.address6 = *((struct sockaddr_in6*) &p->__nif6e_addr); + else + address->address.address4 = *((struct sockaddr_in*) &p->__nif6e_addr); + + /* TODO: Retrieve netmask using SIOCGIFNETMASK ioctl */ + + address->is_internal = flg.__nif6e_flags & _NIF6E_FLAGS_LOOPBACK ? 1 : 0; + + address++; + } + + uv__close(sockfd); + return 0; +} + + +int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { + uv_interface_address_t* address; + int sockfd; + int maxsize; + struct ifconf ifc; + struct ifreq flg; + struct ifreq* ifr; + struct ifreq* p; + int count_v6; + + /* get the ipv6 addresses first */ + uv_interface_address_t* addresses_v6; + uv__interface_addresses_v6(&addresses_v6, &count_v6); + + /* now get the ipv4 addresses */ + *count = 0; + + /* Assume maximum buffer size allowable */ + maxsize = 16384; + + sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); + if (0 > sockfd) + return -errno; + + ifc.ifc_req = uv__calloc(1, maxsize); + ifc.ifc_len = maxsize; + if (ioctl(sockfd, SIOCGIFCONF, &ifc) == -1) { + uv__close(sockfd); + return -errno; + } + +#define MAX(a,b) (((a)>(b))?(a):(b)) +#define ADDR_SIZE(p) MAX((p).sa_len, sizeof(p)) + + /* Count all up and running ipv4/ipv6 addresses */ + ifr = ifc.ifc_req; + while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) { + p = ifr; + ifr = (struct ifreq*) + ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr)); + + if (!(p->ifr_addr.sa_family == AF_INET6 || + p->ifr_addr.sa_family == AF_INET)) + continue; + + memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name)); + if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) { + uv__close(sockfd); + return -errno; + } + + if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING)) + continue; + + (*count)++; + } + + /* Alloc the return interface structs */ + *addresses = uv__malloc((*count + count_v6) * + sizeof(uv_interface_address_t)); + + if (!(*addresses)) { + uv__close(sockfd); + return -ENOMEM; + } + address = *addresses; + + /* copy over the ipv6 addresses */ + memcpy(address, addresses_v6, count_v6 * sizeof(uv_interface_address_t)); + address += count_v6; + *count += count_v6; + uv__free(addresses_v6); + + ifr = ifc.ifc_req; + while ((char*)ifr < (char*)ifc.ifc_req + ifc.ifc_len) { + p = ifr; + ifr = (struct ifreq*) + ((char*)ifr + sizeof(ifr->ifr_name) + ADDR_SIZE(ifr->ifr_addr)); + + if (!(p->ifr_addr.sa_family == AF_INET6 || + p->ifr_addr.sa_family == AF_INET)) + continue; + + memcpy(flg.ifr_name, p->ifr_name, sizeof(flg.ifr_name)); + if (ioctl(sockfd, SIOCGIFFLAGS, &flg) == -1) { + uv__close(sockfd); + return -ENOSYS; + } + + if (!(flg.ifr_flags & IFF_UP && flg.ifr_flags & IFF_RUNNING)) + continue; + + /* All conditions above must match count loop */ + + address->name = uv__strdup(p->ifr_name); + + if (p->ifr_addr.sa_family == AF_INET6) { + address->address.address6 = *((struct sockaddr_in6*) &p->ifr_addr); + } else { + address->address.address4 = *((struct sockaddr_in*) &p->ifr_addr); + } + + address->is_internal = flg.ifr_flags & IFF_LOOPBACK ? 1 : 0; + address++; + } + +#undef ADDR_SIZE +#undef MAX + + uv__close(sockfd); + return 0; +} + + +void uv_free_interface_addresses(uv_interface_address_t* addresses, + int count) { + int i; + for (i = 0; i < count; ++i) + uv__free(addresses[i].name); + uv__free(addresses); +} + + +void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { + struct epoll_event* events; + struct epoll_event dummy; + uintptr_t i; + uintptr_t nfds; + + assert(loop->watchers != NULL); + + events = (struct epoll_event*) loop->watchers[loop->nwatchers]; + nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1]; + if (events != NULL) + /* Invalidate events with same file descriptor */ + for (i = 0; i < nfds; i++) + if ((int) events[i].fd == fd) + events[i].fd = -1; + + /* Remove the file descriptor from the epoll. */ + if (loop->ep != NULL) + epoll_ctl(loop->ep, UV__EPOLL_CTL_DEL, fd, &dummy); +} + + +int uv__io_check_fd(uv_loop_t* loop, int fd) { + struct pollfd p[1]; + int rv; + + p[0].fd = fd; + p[0].events = POLLIN; + + do + rv = poll(p, 1, 0); + while (rv == -1 && errno == EINTR); + + if (rv == -1) + abort(); + + if (p[0].revents & POLLNVAL) + return -1; + + return 0; +} + +void uv__io_poll(uv_loop_t* loop, int timeout) { + static const int max_safe_timeout = 1789569; + struct epoll_event events[1024]; + struct epoll_event* pe; + struct epoll_event e; + int real_timeout; + QUEUE* q; + uv__io_t* w; + uint64_t base; + int count; + int nfds; + int fd; + int op; + int i; + + if (loop->nfds == 0) { + assert(QUEUE_EMPTY(&loop->watcher_queue)); + return; + } + + while (!QUEUE_EMPTY(&loop->watcher_queue)) { + uv_stream_t* stream; + + q = QUEUE_HEAD(&loop->watcher_queue); + QUEUE_REMOVE(q); + QUEUE_INIT(q); + w = QUEUE_DATA(q, uv__io_t, watcher_queue); + + assert(w->pevents != 0); + assert(w->fd >= 0); + + stream= container_of(w, uv_stream_t, io_watcher); + + assert(w->fd < (int) loop->nwatchers); + + e.events = w->pevents; + e.fd = w->fd; + + if (w->events == 0) + op = UV__EPOLL_CTL_ADD; + else + op = UV__EPOLL_CTL_MOD; + + /* XXX Future optimization: do EPOLL_CTL_MOD lazily if we stop watching + * events, skip the syscall and squelch the events after epoll_wait(). + */ + if (epoll_ctl(loop->ep, op, w->fd, &e)) { + if (errno != EEXIST) + abort(); + + assert(op == UV__EPOLL_CTL_ADD); + + /* We've reactivated a file descriptor that's been watched before. */ + if (epoll_ctl(loop->ep, UV__EPOLL_CTL_MOD, w->fd, &e)) + abort(); + } + + w->events = w->pevents; + } + + assert(timeout >= -1); + base = loop->time; + count = 48; /* Benchmarks suggest this gives the best throughput. */ + real_timeout = timeout; + int nevents = 0; + + nfds = 0; + for (;;) { + if (sizeof(int32_t) == sizeof(long) && timeout >= max_safe_timeout) + timeout = max_safe_timeout; + + nfds = epoll_wait(loop->ep, events, + ARRAY_SIZE(events), timeout); + + /* Update loop->time unconditionally. It's tempting to skip the update when + * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the + * operating system didn't reschedule our process while in the syscall. + */ + base = loop->time; + SAVE_ERRNO(uv__update_time(loop)); + if (nfds == 0) { + assert(timeout != -1); + timeout = real_timeout - timeout; + if (timeout > 0) + continue; + + return; + } + + if (nfds == -1) { + + if (errno != EINTR) + abort(); + + if (timeout == -1) + continue; + + if (timeout == 0) + return; + + /* Interrupted by a signal. Update timeout and poll again. */ + goto update_timeout; + } + + + assert(loop->watchers != NULL); + loop->watchers[loop->nwatchers] = (void*) events; + loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds; + for (i = 0; i < nfds; i++) { + pe = events + i; + fd = pe->fd; + + /* Skip invalidated events, see uv__platform_invalidate_fd */ + if (fd == -1) + continue; + + assert(fd >= 0); + assert((unsigned) fd < loop->nwatchers); + + w = loop->watchers[fd]; + + if (w == NULL) { + /* File descriptor that we've stopped watching, disarm it. + * + * Ignore all errors because we may be racing with another thread + * when the file descriptor is closed. + */ + epoll_ctl(loop->ep, UV__EPOLL_CTL_DEL, fd, pe); + continue; + } + + /* Give users only events they're interested in. Prevents spurious + * callbacks when previous callback invocation in this loop has stopped + * the current watcher. Also, filters out events that users has not + * requested us to watch. + */ + pe->events &= w->pevents | POLLERR | POLLHUP; + + if (pe->events == POLLERR || pe->events == POLLHUP) + pe->events |= w->pevents & (POLLIN | POLLOUT); + + if (pe->events != 0) { + w->cb(loop, w, pe->events); + nevents++; + } + } + loop->watchers[loop->nwatchers] = NULL; + loop->watchers[loop->nwatchers + 1] = NULL; + + if (nevents != 0) { + if (nfds == ARRAY_SIZE(events) && --count != 0) { + /* Poll for more events but don't block this time. */ + timeout = 0; + continue; + } + return; + } + + if (timeout == 0) + return; + + if (timeout == -1) + continue; + +update_timeout: + assert(timeout > 0); + + real_timeout -= (loop->time - base); + if (real_timeout <= 0) + return; + + timeout = real_timeout; + } +} + +void uv__set_process_title(const char* title) { + /* do nothing */ +} + +int uv__io_fork(uv_loop_t* loop) { + uv__platform_loop_delete(loop); + + return uv__platform_loop_init(loop); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/pipe.c b/lib/ESPiLight/pilight/libs/libuv/unix/pipe.c new file mode 100644 index 0000000..4a81295 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/pipe.c @@ -0,0 +1,304 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include +#include +#include +#include + + +int uv_pipe_init(uv_loop_t* loop, uv_pipe_t* handle, int ipc) { + uv__stream_init(loop, (uv_stream_t*)handle, UV_NAMED_PIPE); + handle->shutdown_req = NULL; + handle->connect_req = NULL; + handle->pipe_fname = NULL; + handle->ipc = ipc; + return 0; +} + + +int uv_pipe_bind(uv_pipe_t* handle, const char* name) { + struct sockaddr_un saddr; + const char* pipe_fname; + int sockfd; + int err; + + pipe_fname = NULL; + + /* Already bound? */ + if (uv__stream_fd(handle) >= 0) + return -EINVAL; + + /* Make a copy of the file name, it outlives this function's scope. */ + pipe_fname = uv__strdup(name); + if (pipe_fname == NULL) + return -ENOMEM; + + /* We've got a copy, don't touch the original any more. */ + name = NULL; + + err = uv__socket(AF_UNIX, SOCK_STREAM, 0); + if (err < 0) + goto err_socket; + sockfd = err; + + memset(&saddr, 0, sizeof saddr); + strncpy(saddr.sun_path, pipe_fname, sizeof(saddr.sun_path) - 1); + saddr.sun_path[sizeof(saddr.sun_path) - 1] = '\0'; + saddr.sun_family = AF_UNIX; + + if (bind(sockfd, (struct sockaddr*)&saddr, sizeof saddr)) { + err = -errno; + /* Convert ENOENT to EACCES for compatibility with Windows. */ + if (err == -ENOENT) + err = -EACCES; + + uv__close(sockfd); + goto err_socket; + } + + /* Success. */ + handle->flags |= UV_HANDLE_BOUND; + handle->pipe_fname = pipe_fname; /* Is a strdup'ed copy. */ + handle->io_watcher.fd = sockfd; + return 0; + +err_socket: + uv__free((void*)pipe_fname); + return err; +} + + +int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) { + if (uv__stream_fd(handle) == -1) + return -EINVAL; + +#if defined(__MVS__) + /* On zOS, backlog=0 has undefined behaviour */ + if (backlog == 0) + backlog = 1; + else if (backlog < 0) + backlog = SOMAXCONN; +#endif + + if (listen(uv__stream_fd(handle), backlog)) + return -errno; + + handle->connection_cb = cb; + handle->io_watcher.cb = uv__server_io; + uv__io_start(handle->loop, &handle->io_watcher, POLLIN); + return 0; +} + + +void uv__pipe_close(uv_pipe_t* handle) { + if (handle->pipe_fname) { + /* + * Unlink the file system entity before closing the file descriptor. + * Doing it the other way around introduces a race where our process + * unlinks a socket with the same name that's just been created by + * another thread or process. + */ + unlink(handle->pipe_fname); + uv__free((void*)handle->pipe_fname); + handle->pipe_fname = NULL; + } + + uv__stream_close((uv_stream_t*)handle); +} + + +int uv_pipe_open(uv_pipe_t* handle, uv_file fd) { + int err; + + err = uv__nonblock(fd, 1); + if (err) + return err; + +#if defined(__APPLE__) + err = uv__stream_try_select((uv_stream_t*) handle, &fd); + if (err) + return err; +#endif /* defined(__APPLE__) */ + + return uv__stream_open((uv_stream_t*)handle, + fd, + UV_STREAM_READABLE | UV_STREAM_WRITABLE); +} + + +void uv_pipe_connect(uv_connect_t* req, + uv_pipe_t* handle, + const char* name, + uv_connect_cb cb) { + struct sockaddr_un saddr; + int new_sock; + int err; + int r; + + new_sock = (uv__stream_fd(handle) == -1); + + if (new_sock) { + err = uv__socket(AF_UNIX, SOCK_STREAM, 0); + if (err < 0) + goto out; + handle->io_watcher.fd = err; + } + + memset(&saddr, 0, sizeof saddr); + strncpy(saddr.sun_path, name, sizeof(saddr.sun_path) - 1); + saddr.sun_path[sizeof(saddr.sun_path) - 1] = '\0'; + saddr.sun_family = AF_UNIX; + + do { + r = connect(uv__stream_fd(handle), + (struct sockaddr*)&saddr, sizeof saddr); + } + while (r == -1 && errno == EINTR); + + if (r == -1 && errno != EINPROGRESS) { + err = -errno; +#if defined(__CYGWIN__) || defined(__MSYS__) + /* EBADF is supposed to mean that the socket fd is bad, but + Cygwin reports EBADF instead of ENOTSOCK when the file is + not a socket. We do not expect to see a bad fd here + (e.g. due to new_sock), so translate the error. */ + if (err == -EBADF) + err = -ENOTSOCK; +#endif + goto out; + } + + err = 0; + if (new_sock) { + err = uv__stream_open((uv_stream_t*)handle, + uv__stream_fd(handle), + UV_STREAM_READABLE | UV_STREAM_WRITABLE); + } + + if (err == 0) + uv__io_start(handle->loop, &handle->io_watcher, POLLIN | POLLOUT); + +out: + handle->delayed_error = err; + handle->connect_req = req; + + uv__req_init(handle->loop, req, UV_CONNECT); + req->handle = (uv_stream_t*)handle; + req->cb = cb; + QUEUE_INIT(&req->queue); + + /* Force callback to run on next tick in case of error. */ + if (err) + uv__io_feed(handle->loop, &handle->io_watcher); + +} + + +typedef int (*uv__peersockfunc)(int, struct sockaddr*, socklen_t*); + + +static int uv__pipe_getsockpeername(const uv_pipe_t* handle, + uv__peersockfunc func, + char* buffer, + size_t* size) { + struct sockaddr_un sa; + socklen_t addrlen; + int err; + + addrlen = sizeof(sa); + memset(&sa, 0, addrlen); + err = func(uv__stream_fd(handle), (struct sockaddr*) &sa, &addrlen); + if (err < 0) { + *size = 0; + return -errno; + } + +#if defined(__linux__) + if (sa.sun_path[0] == 0) + /* Linux abstract namespace */ + addrlen -= offsetof(struct sockaddr_un, sun_path); + else +#endif + addrlen = strlen(sa.sun_path); + + + if (addrlen >= *size) { + *size = addrlen + 1; + return UV_ENOBUFS; + } + + memcpy(buffer, sa.sun_path, addrlen); + *size = addrlen; + + /* only null-terminate if it's not an abstract socket */ + if (buffer[0] != '\0') + buffer[addrlen] = '\0'; + + return 0; +} + + +int uv_pipe_getsockname(const uv_pipe_t* handle, char* buffer, size_t* size) { + return uv__pipe_getsockpeername(handle, getsockname, buffer, size); +} + + +int uv_pipe_getpeername(const uv_pipe_t* handle, char* buffer, size_t* size) { + return uv__pipe_getsockpeername(handle, getpeername, buffer, size); +} + + +void uv_pipe_pending_instances(uv_pipe_t* handle, int count) { +} + + +int uv_pipe_pending_count(uv_pipe_t* handle) { + uv__stream_queued_fds_t* queued_fds; + + if (!handle->ipc) + return 0; + + if (handle->accepted_fd == -1) + return 0; + + if (handle->queued_fds == NULL) + return 1; + + queued_fds = handle->queued_fds; + return queued_fds->offset + 1; +} + + +uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) { + if (!handle->ipc) + return UV_UNKNOWN_HANDLE; + + if (handle->accepted_fd == -1) + return UV_UNKNOWN_HANDLE; + else + return uv__handle_type(handle->accepted_fd); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/poll.c b/lib/ESPiLight/pilight/libs/libuv/unix/poll.c new file mode 100644 index 0000000..2001fc8 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/poll.c @@ -0,0 +1,146 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include + + +static void uv__poll_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { + uv_poll_t* handle; + int pevents; + + handle = container_of(w, uv_poll_t, io_watcher); + + /* + * As documented in the kernel source fs/kernfs/file.c #780 + * poll will return POLLERR|POLLPRI in case of sysfs + * polling. This does not happen in case of out-of-band + * TCP messages. + * + * The above is the case on (at least) FreeBSD and Linux. + * + * So to properly determine a POLLPRI or a POLLERR we need + * to check for both. + */ + if ((events & POLLERR) && !(events & UV__POLLPRI)) { + uv__io_stop(loop, w, POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI); + uv__handle_stop(handle); + handle->poll_cb(handle, -EBADF, 0); + return; + } + + pevents = 0; + if (events & POLLIN) + pevents |= UV_READABLE; + if (events & UV__POLLPRI) + pevents |= UV_PRIORITIZED; + if (events & POLLOUT) + pevents |= UV_WRITABLE; + if (events & UV__POLLRDHUP) + pevents |= UV_DISCONNECT; + + handle->poll_cb(handle, 0, pevents); +} + + +int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd) { + int err; + + err = uv__io_check_fd(loop, fd); + if (err) + return err; + + /* If ioctl(FIONBIO) reports ENOTTY, try fcntl(F_GETFL) + fcntl(F_SETFL). + * Workaround for e.g. kqueue fds not supporting ioctls. + */ + err = uv__nonblock(fd, 1); + if (err == -ENOTTY) + if (uv__nonblock == uv__nonblock_ioctl) + err = uv__nonblock_fcntl(fd, 1); + + if (err) + return err; + + uv__handle_init(loop, (uv_handle_t*) handle, UV_POLL); + uv__io_init(&handle->io_watcher, uv__poll_io, fd); + handle->poll_cb = NULL; + return 0; +} + + +int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle, + uv_os_sock_t socket) { + return uv_poll_init(loop, handle, socket); +} + + +static void uv__poll_stop(uv_poll_t* handle) { + uv__io_stop(handle->loop, + &handle->io_watcher, + POLLIN | POLLOUT | UV__POLLRDHUP | UV__POLLPRI); + uv__handle_stop(handle); +} + + +int uv_poll_stop(uv_poll_t* handle) { + assert(!uv__is_closing(handle)); + uv__poll_stop(handle); + return 0; +} + + +int uv_poll_start(uv_poll_t* handle, int pevents, uv_poll_cb poll_cb) { + int events; + + assert((pevents & ~(UV_READABLE | UV_WRITABLE | UV_DISCONNECT | + UV_PRIORITIZED)) == 0); + assert(!uv__is_closing(handle)); + + uv__poll_stop(handle); + + if (pevents == 0) + return 0; + + events = 0; + if (pevents & UV_READABLE) + events |= POLLIN; + if (pevents & UV_PRIORITIZED) + events |= UV__POLLPRI; + if (pevents & UV_WRITABLE) + events |= POLLOUT; + if (pevents & UV_DISCONNECT) + events |= UV__POLLRDHUP; + + uv__io_start(handle->loop, &handle->io_watcher, events); + uv__handle_start(handle); + handle->poll_cb = poll_cb; + + return 0; +} + + +void uv__poll_close(uv_poll_t* handle) { + uv__poll_stop(handle); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/posix-hrtime.c b/lib/ESPiLight/pilight/libs/libuv/unix/posix-hrtime.c new file mode 100644 index 0000000..323dfc2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/posix-hrtime.c @@ -0,0 +1,35 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include + +#undef NANOSEC +#define NANOSEC ((uint64_t) 1e9) + +uint64_t uv__hrtime(uv_clocktype_t type) { + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (((uint64_t) ts.tv_sec) * NANOSEC + ts.tv_nsec); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/posix-poll.c b/lib/ESPiLight/pilight/libs/libuv/unix/posix-poll.c new file mode 100644 index 0000000..c80d43f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/posix-poll.c @@ -0,0 +1,357 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +/* POSIX defines poll() as a portable way to wait on file descriptors. + * Here we maintain a dynamically sized array of file descriptors and + * events to pass as the first argument to poll(). + */ + +#include +#include +#include +#include +#include + +int uv__platform_loop_init(uv_loop_t* loop) { + loop->poll_fds = NULL; + loop->poll_fds_used = 0; + loop->poll_fds_size = 0; + loop->poll_fds_iterating = 0; + return 0; +} + +void uv__platform_loop_delete(uv_loop_t* loop) { + uv__free(loop->poll_fds); + loop->poll_fds = NULL; +} + +int uv__io_fork(uv_loop_t* loop) { + uv__platform_loop_delete(loop); + return uv__platform_loop_init(loop); +} + +/* Allocate or dynamically resize our poll fds array. */ +static void uv__pollfds_maybe_resize(uv_loop_t* loop) { + size_t i; + size_t n; + struct pollfd* p; + + if (loop->poll_fds_used < loop->poll_fds_size) + return; + + n = loop->poll_fds_size ? loop->poll_fds_size * 2 : 64; + p = uv__realloc(loop->poll_fds, n * sizeof(*loop->poll_fds)); + if (p == NULL) + abort(); + + loop->poll_fds = p; + for (i = loop->poll_fds_size; i < n; i++) { + loop->poll_fds[i].fd = -1; + loop->poll_fds[i].events = 0; + loop->poll_fds[i].revents = 0; + } + loop->poll_fds_size = n; +} + +/* Primitive swap operation on poll fds array elements. */ +static void uv__pollfds_swap(uv_loop_t* loop, size_t l, size_t r) { + struct pollfd pfd; + pfd = loop->poll_fds[l]; + loop->poll_fds[l] = loop->poll_fds[r]; + loop->poll_fds[r] = pfd; +} + +/* Add a watcher's fd to our poll fds array with its pending events. */ +static void uv__pollfds_add(uv_loop_t* loop, uv__io_t* w) { + size_t i; + struct pollfd* pe; + + /* If the fd is already in the set just update its events. */ + assert(!loop->poll_fds_iterating); + for (i = 0; i < loop->poll_fds_used; ++i) { + if (loop->poll_fds[i].fd == w->fd) { + loop->poll_fds[i].events = w->pevents; + return; + } + } + + /* Otherwise, allocate a new slot in the set for the fd. */ + uv__pollfds_maybe_resize(loop); + pe = &loop->poll_fds[loop->poll_fds_used++]; + pe->fd = w->fd; + pe->events = w->pevents; +} + +/* Remove a watcher's fd from our poll fds array. */ +static void uv__pollfds_del(uv_loop_t* loop, int fd) { + size_t i; + assert(!loop->poll_fds_iterating); + for (i = 0; i < loop->poll_fds_used; ++i) { + if (loop->poll_fds[i].fd == fd) { + /* swap to last position and remove */ + --loop->poll_fds_used; + uv__pollfds_swap(loop, i, loop->poll_fds_used); + loop->poll_fds[loop->poll_fds_used].fd = -1; + loop->poll_fds[loop->poll_fds_used].events = 0; + loop->poll_fds[loop->poll_fds_used].revents = 0; + return; + } + } +} + + +void uv__io_poll(uv_loop_t* loop, int timeout) { + sigset_t* pset; + sigset_t set; + uint64_t time_base; + uint64_t time_diff; + QUEUE* q; + uv__io_t* w; + size_t i; + unsigned int nevents; + int nfds; + int have_signals; + struct pollfd* pe; + int fd; + + if (loop->nfds == 0) { + assert(QUEUE_EMPTY(&loop->watcher_queue)); + return; + } + + /* Take queued watchers and add their fds to our poll fds array. */ + while (!QUEUE_EMPTY(&loop->watcher_queue)) { + q = QUEUE_HEAD(&loop->watcher_queue); + QUEUE_REMOVE(q); + QUEUE_INIT(q); + + w = QUEUE_DATA(q, uv__io_t, watcher_queue); + assert(w->pevents != 0); + assert(w->fd >= 0); + assert(w->fd < (int) loop->nwatchers); + + uv__pollfds_add(loop, w); + + w->events = w->pevents; + } + + /* Prepare a set of signals to block around poll(), if any. */ + pset = NULL; + if (loop->flags & UV_LOOP_BLOCK_SIGPROF) { + pset = &set; + sigemptyset(pset); + sigaddset(pset, SIGPROF); + } + + assert(timeout >= -1); + time_base = loop->time; + + /* Loop calls to poll() and processing of results. If we get some + * results from poll() but they turn out not to be interesting to + * our caller then we need to loop around and poll() again. + */ + for (;;) { + if (pset != NULL) + if (pthread_sigmask(SIG_BLOCK, pset, NULL)) + abort(); + nfds = poll(loop->poll_fds, (nfds_t)loop->poll_fds_used, timeout); + if (pset != NULL) + if (pthread_sigmask(SIG_UNBLOCK, pset, NULL)) + abort(); + + /* Update loop->time unconditionally. It's tempting to skip the update when + * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the + * operating system didn't reschedule our process while in the syscall. + */ + SAVE_ERRNO(uv__update_time(loop)); + + if (nfds == 0) { + assert(timeout != -1); + return; + } + + if (nfds == -1) { + if (errno != EINTR) + abort(); + + if (timeout == -1) + continue; + + if (timeout == 0) + return; + + /* Interrupted by a signal. Update timeout and poll again. */ + goto update_timeout; + } + + /* Tell uv__platform_invalidate_fd not to manipulate our array + * while we are iterating over it. + */ + loop->poll_fds_iterating = 1; + + /* Initialize a count of events that we care about. */ + nevents = 0; + have_signals = 0; + + /* Loop over the entire poll fds array looking for returned events. */ + for (i = 0; i < loop->poll_fds_used; i++) { + pe = loop->poll_fds + i; + fd = pe->fd; + + /* Skip invalidated events, see uv__platform_invalidate_fd. */ + if (fd == -1) + continue; + + assert(fd >= 0); + assert((unsigned) fd < loop->nwatchers); + + w = loop->watchers[fd]; + + if (w == NULL) { + /* File descriptor that we've stopped watching, ignore. */ + uv__platform_invalidate_fd(loop, fd); + continue; + } + + /* Filter out events that user has not requested us to watch + * (e.g. POLLNVAL). + */ + pe->revents &= w->pevents | POLLERR | POLLHUP; + + if (pe->revents != 0) { + /* Run signal watchers last. */ + if (w == &loop->signal_io_watcher) { + have_signals = 1; + } else { + w->cb(loop, w, pe->revents); + } + + nevents++; + } + } + + if (have_signals != 0) + loop->signal_io_watcher.cb(loop, &loop->signal_io_watcher, POLLIN); + + loop->poll_fds_iterating = 0; + + /* Purge invalidated fds from our poll fds array. */ + uv__pollfds_del(loop, -1); + + if (have_signals != 0) + return; /* Event loop should cycle now so don't poll again. */ + + if (nevents != 0) + return; + + if (timeout == 0) + return; + + if (timeout == -1) + continue; + +update_timeout: + assert(timeout > 0); + + time_diff = loop->time - time_base; + if (time_diff >= (uint64_t) timeout) + return; + + timeout -= time_diff; + } +} + +/* Remove the given fd from our poll fds array because no one + * is interested in its events anymore. + */ +void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { + size_t i; + + if (loop->poll_fds_iterating) { + /* uv__io_poll is currently iterating. Just invalidate fd. */ + for (i = 0; i < loop->poll_fds_used; i++) + if (loop->poll_fds[i].fd == fd) { + loop->poll_fds[i].fd = -1; + loop->poll_fds[i].events = 0; + loop->poll_fds[i].revents = 0; + } + } else { + /* uv__io_poll is not iterating. Delete fd from the set. */ + uv__pollfds_del(loop, fd); + } +} + +/* Check whether the given fd is supported by poll(). */ +int uv__io_check_fd(uv_loop_t* loop, int fd) { + struct pollfd p[1]; + int rv; + + p[0].fd = fd; + p[0].events = POLLIN; + + do + rv = poll(p, 1, 0); + while (rv == -1 && (errno == EINTR || errno == EAGAIN)); + + if (rv == -1) + return -errno; + + if (p[0].revents & POLLNVAL) + return -EINVAL; + + return 0; +} + +/* + * NEW + */ +int uv_fs_event_stop(uv_fs_event_t* handle) { + if (!uv__is_active(handle)) + return 0; + + uv__handle_stop(handle); + +#if defined(__APPLE__) + if (uv__has_forked_with_cfrunloop || uv__fsevents_close(handle)) +#endif /* defined(__APPLE__) */ + { + uv__io_close(handle->loop, &handle->event_watcher); + } + + uv__free(handle->path); + handle->path = NULL; + + if (handle->event_watcher.fd != -1) { + /* When FSEvents is used, we don't use the event_watcher's fd under certain + * confitions. (see uv_fs_event_start) */ + uv__close(handle->event_watcher.fd); + handle->event_watcher.fd = -1; + } + + return 0; +} + +void uv__fs_event_close(uv_fs_event_t* handle) { + uv_fs_event_stop(handle); +} \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/process.c b/lib/ESPiLight/pilight/libs/libuv/unix/process.c new file mode 100644 index 0000000..f2fe305 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/process.c @@ -0,0 +1,563 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#if defined(__APPLE__) && !TARGET_OS_IPHONE +# include +# define environ (*_NSGetEnviron()) +#else +extern char **environ; +#endif + +#if defined(__linux__) || defined(__GLIBC__) +# include +#endif + + +static void uv__chld(uv_signal_t* handle, int signum) { + uv_process_t* process; + uv_loop_t* loop; + int exit_status; + int term_signal; + int status; + pid_t pid; + QUEUE pending; + QUEUE* q; + QUEUE* h; + + assert(signum == SIGCHLD); + + QUEUE_INIT(&pending); + loop = handle->loop; + + h = &loop->process_handles; + q = QUEUE_HEAD(h); + while (q != h) { + process = QUEUE_DATA(q, uv_process_t, queue); + q = QUEUE_NEXT(q); + + do + pid = waitpid(process->pid, &status, WNOHANG); + while (pid == -1 && errno == EINTR); + + if (pid == 0) + continue; + + if (pid == -1) { + if (errno != ECHILD) + abort(); + continue; + } + + process->status = status; + QUEUE_REMOVE(&process->queue); + QUEUE_INSERT_TAIL(&pending, &process->queue); + } + + h = &pending; + q = QUEUE_HEAD(h); + while (q != h) { + process = QUEUE_DATA(q, uv_process_t, queue); + q = QUEUE_NEXT(q); + + QUEUE_REMOVE(&process->queue); + QUEUE_INIT(&process->queue); + uv__handle_stop(process); + + if (process->exit_cb == NULL) + continue; + + exit_status = 0; + if (WIFEXITED(process->status)) + exit_status = WEXITSTATUS(process->status); + + term_signal = 0; + if (WIFSIGNALED(process->status)) + term_signal = WTERMSIG(process->status); + + process->exit_cb(process, exit_status, term_signal); + } + assert(QUEUE_EMPTY(&pending)); +} + + +int uv__make_socketpair(int fds[2], int flags) { +#if defined(__linux__) + static int no_cloexec; + + if (no_cloexec) + goto skip; + + if (socketpair(AF_UNIX, SOCK_STREAM | UV__SOCK_CLOEXEC | flags, 0, fds) == 0) + return 0; + + /* Retry on EINVAL, it means SOCK_CLOEXEC is not supported. + * Anything else is a genuine error. + */ + if (errno != EINVAL) + return -errno; + + no_cloexec = 1; + +skip: +#endif + + if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds)) + return -errno; + + uv__cloexec(fds[0], 1); + uv__cloexec(fds[1], 1); + + if (flags & UV__F_NONBLOCK) { + uv__nonblock(fds[0], 1); + uv__nonblock(fds[1], 1); + } + + return 0; +} + + +int uv__make_pipe(int fds[2], int flags) { +#if defined(__linux__) + static int no_pipe2; + + if (no_pipe2) + goto skip; + + if (uv__pipe2(fds, flags | UV__O_CLOEXEC) == 0) + return 0; + + if (errno != ENOSYS) + return -errno; + + no_pipe2 = 1; + +skip: +#endif + + if (pipe(fds)) + return -errno; + + uv__cloexec(fds[0], 1); + uv__cloexec(fds[1], 1); + + if (flags & UV__F_NONBLOCK) { + uv__nonblock(fds[0], 1); + uv__nonblock(fds[1], 1); + } + + return 0; +} + + +/* + * Used for initializing stdio streams like options.stdin_stream. Returns + * zero on success. See also the cleanup section in uv_spawn(). + */ +static int uv__process_init_stdio(uv_stdio_container_t* container, int fds[2]) { + int mask; + int fd; + + mask = UV_IGNORE | UV_CREATE_PIPE | UV_INHERIT_FD | UV_INHERIT_STREAM; + + switch (container->flags & mask) { + case UV_IGNORE: + return 0; + + case UV_CREATE_PIPE: + assert(container->data.stream != NULL); + if (container->data.stream->type != UV_NAMED_PIPE) + return -EINVAL; + else + return uv__make_socketpair(fds, 0); + + case UV_INHERIT_FD: + case UV_INHERIT_STREAM: + if (container->flags & UV_INHERIT_FD) + fd = container->data.fd; + else + fd = uv__stream_fd(container->data.stream); + + if (fd == -1) + return -EINVAL; + + fds[1] = fd; + return 0; + + default: + assert(0 && "Unexpected flags"); + return -EINVAL; + } +} + + +static int uv__process_open_stream(uv_stdio_container_t* container, + int pipefds[2], + int writable) { + int flags; + int err; + + if (!(container->flags & UV_CREATE_PIPE) || pipefds[0] < 0) + return 0; + + err = uv__close(pipefds[1]); + if (err != 0) + abort(); + + pipefds[1] = -1; + uv__nonblock(pipefds[0], 1); + + if (container->data.stream->type == UV_NAMED_PIPE && + ((uv_pipe_t*)container->data.stream)->ipc) + flags = UV_STREAM_READABLE | UV_STREAM_WRITABLE; + else if (writable) + flags = UV_STREAM_WRITABLE; + else + flags = UV_STREAM_READABLE; + + return uv__stream_open(container->data.stream, pipefds[0], flags); +} + + +static void uv__process_close_stream(uv_stdio_container_t* container) { + if (!(container->flags & UV_CREATE_PIPE)) return; + uv__stream_close((uv_stream_t*)container->data.stream); +} + + +static void uv__write_int(int fd, int val) { + ssize_t n; + + do + n = write(fd, &val, sizeof(val)); + while (n == -1 && errno == EINTR); + + if (n == -1 && errno == EPIPE) + return; /* parent process has quit */ + + assert(n == sizeof(val)); +} + + +#if !(defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH)) +/* execvp is marked __WATCHOS_PROHIBITED __TVOS_PROHIBITED, so must be + * avoided. Since this isn't called on those targets, the function + * doesn't even need to be defined for them. + */ +static void uv__process_child_init(const uv_process_options_t* options, + int stdio_count, + int (*pipes)[2], + int error_fd) { + int close_fd; + int use_fd; + int fd; + + if (options->flags & UV_PROCESS_DETACHED) + setsid(); + + /* First duplicate low numbered fds, since it's not safe to duplicate them, + * they could get replaced. Example: swapping stdout and stderr; without + * this fd 2 (stderr) would be duplicated into fd 1, thus making both + * stdout and stderr go to the same fd, which was not the intention. */ + for (fd = 0; fd < stdio_count; fd++) { + use_fd = pipes[fd][1]; + if (use_fd < 0 || use_fd >= fd) + continue; + pipes[fd][1] = fcntl(use_fd, F_DUPFD, stdio_count); + if (pipes[fd][1] == -1) { + uv__write_int(error_fd, -errno); + _exit(127); + } + } + + for (fd = 0; fd < stdio_count; fd++) { + close_fd = pipes[fd][0]; + use_fd = pipes[fd][1]; + + if (use_fd < 0) { + if (fd >= 3) + continue; + else { + /* redirect stdin, stdout and stderr to /dev/null even if UV_IGNORE is + * set + */ + use_fd = open("/dev/null", fd == 0 ? O_RDONLY : O_RDWR); + close_fd = use_fd; + + if (use_fd == -1) { + uv__write_int(error_fd, -errno); + _exit(127); + } + } + } + + if (fd == use_fd) + uv__cloexec_fcntl(use_fd, 0); + else + fd = dup2(use_fd, fd); + + if (fd == -1) { + uv__write_int(error_fd, -errno); + _exit(127); + } + + if (fd <= 2) + uv__nonblock_fcntl(fd, 0); + + if (close_fd >= stdio_count) + uv__close(close_fd); + } + + for (fd = 0; fd < stdio_count; fd++) { + use_fd = pipes[fd][1]; + + if (use_fd >= stdio_count) + uv__close(use_fd); + } + + if (options->cwd != NULL && chdir(options->cwd)) { + uv__write_int(error_fd, -errno); + _exit(127); + } + + if (options->flags & (UV_PROCESS_SETUID | UV_PROCESS_SETGID)) { + /* When dropping privileges from root, the `setgroups` call will + * remove any extraneous groups. If we don't call this, then + * even though our uid has dropped, we may still have groups + * that enable us to do super-user things. This will fail if we + * aren't root, so don't bother checking the return value, this + * is just done as an optimistic privilege dropping function. + */ + SAVE_ERRNO(setgroups(0, NULL)); + } + + if ((options->flags & UV_PROCESS_SETGID) && setgid(options->gid)) { + uv__write_int(error_fd, -errno); + _exit(127); + } + + if ((options->flags & UV_PROCESS_SETUID) && setuid(options->uid)) { + uv__write_int(error_fd, -errno); + _exit(127); + } + + if (options->env != NULL) { + environ = options->env; + } + + execvp(options->file, options->args); + uv__write_int(error_fd, -errno); + _exit(127); +} +#endif + + +int uv_spawn(uv_loop_t* loop, + uv_process_t* process, + const uv_process_options_t* options) { +#if defined(__APPLE__) && (TARGET_OS_TV || TARGET_OS_WATCH) + /* fork is marked __WATCHOS_PROHIBITED __TVOS_PROHIBITED. */ + return -ENOSYS; +#else + int signal_pipe[2] = { -1, -1 }; + int (*pipes)[2]; + int stdio_count; + ssize_t r; + pid_t pid; + int err; + int exec_errorno; + int i; + int status; + + assert(options->file != NULL); + assert(!(options->flags & ~(UV_PROCESS_DETACHED | + UV_PROCESS_SETGID | + UV_PROCESS_SETUID | + UV_PROCESS_WINDOWS_HIDE | + UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS))); + + uv__handle_init(loop, (uv_handle_t*)process, UV_PROCESS); + QUEUE_INIT(&process->queue); + + stdio_count = options->stdio_count; + if (stdio_count < 3) + stdio_count = 3; + + err = -ENOMEM; + pipes = uv__malloc(stdio_count * sizeof(*pipes)); + if (pipes == NULL) + goto error; + + for (i = 0; i < stdio_count; i++) { + pipes[i][0] = -1; + pipes[i][1] = -1; + } + + for (i = 0; i < options->stdio_count; i++) { + err = uv__process_init_stdio(options->stdio + i, pipes[i]); + if (err) + goto error; + } + + /* This pipe is used by the parent to wait until + * the child has called `execve()`. We need this + * to avoid the following race condition: + * + * if ((pid = fork()) > 0) { + * kill(pid, SIGTERM); + * } + * else if (pid == 0) { + * execve("/bin/cat", argp, envp); + * } + * + * The parent sends a signal immediately after forking. + * Since the child may not have called `execve()` yet, + * there is no telling what process receives the signal, + * our fork or /bin/cat. + * + * To avoid ambiguity, we create a pipe with both ends + * marked close-on-exec. Then, after the call to `fork()`, + * the parent polls the read end until it EOFs or errors with EPIPE. + */ + err = uv__make_pipe(signal_pipe, 0); + if (err) + goto error; + + uv_signal_start(&loop->child_watcher, uv__chld, SIGCHLD); + + /* Acquire write lock to prevent opening new fds in worker threads */ + uv_rwlock_wrlock(&loop->cloexec_lock); + pid = fork(); + + if (pid == -1) { + err = -errno; + uv_rwlock_wrunlock(&loop->cloexec_lock); + uv__close(signal_pipe[0]); + uv__close(signal_pipe[1]); + goto error; + } + + if (pid == 0) { + uv__process_child_init(options, stdio_count, pipes, signal_pipe[1]); + abort(); + } + + /* Release lock in parent process */ + uv_rwlock_wrunlock(&loop->cloexec_lock); + uv__close(signal_pipe[1]); + + process->status = 0; + exec_errorno = 0; + do + r = read(signal_pipe[0], &exec_errorno, sizeof(exec_errorno)); + while (r == -1 && errno == EINTR); + + if (r == 0) + ; /* okay, EOF */ + else if (r == sizeof(exec_errorno)) { + do + err = waitpid(pid, &status, 0); /* okay, read errorno */ + while (err == -1 && errno == EINTR); + assert(err == pid); + } else if (r == -1 && errno == EPIPE) { + do + err = waitpid(pid, &status, 0); /* okay, got EPIPE */ + while (err == -1 && errno == EINTR); + assert(err == pid); + } else + abort(); + + uv__close_nocheckstdio(signal_pipe[0]); + + for (i = 0; i < options->stdio_count; i++) { + err = uv__process_open_stream(options->stdio + i, pipes[i], i == 0); + if (err == 0) + continue; + + while (i--) + uv__process_close_stream(options->stdio + i); + + goto error; + } + + /* Only activate this handle if exec() happened successfully */ + if (exec_errorno == 0) { + QUEUE_INSERT_TAIL(&loop->process_handles, &process->queue); + uv__handle_start(process); + } + + process->pid = pid; + process->exit_cb = options->exit_cb; + + uv__free(pipes); + return exec_errorno; + +error: + if (pipes != NULL) { + for (i = 0; i < stdio_count; i++) { + if (i < options->stdio_count) + if (options->stdio[i].flags & (UV_INHERIT_FD | UV_INHERIT_STREAM)) + continue; + if (pipes[i][0] != -1) + uv__close_nocheckstdio(pipes[i][0]); + if (pipes[i][1] != -1) + uv__close_nocheckstdio(pipes[i][1]); + } + uv__free(pipes); + } + + return err; +#endif +} + + +int uv_process_kill(uv_process_t* process, int signum) { + return uv_kill(process->pid, signum); +} + + +int uv_kill(int pid, int signum) { + if (kill(pid, signum)) + return -errno; + else + return 0; +} + + +void uv__process_close(uv_process_t* handle) { + QUEUE_REMOVE(&handle->queue); + uv__handle_stop(handle); + if (QUEUE_EMPTY(&handle->loop->process_handles)) + uv_signal_stop(&handle->loop->child_watcher); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/procfs-exepath.c b/lib/ESPiLight/pilight/libs/libuv/unix/procfs-exepath.c new file mode 100644 index 0000000..5fdb611 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/procfs-exepath.c @@ -0,0 +1,45 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include + +int uv_exepath(char* buffer, size_t* size) { + ssize_t n; + + if (buffer == NULL || size == NULL || *size == 0) + return -EINVAL; + + n = *size - 1; + if (n > 0) + n = readlink("/proc/self/exe", buffer, n); + + if (n == -1) + return -errno; + + buffer[n] = '\0'; + *size = n; + + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/proctitle.c b/lib/ESPiLight/pilight/libs/libuv/unix/proctitle.c new file mode 100644 index 0000000..2ed0b21 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/proctitle.c @@ -0,0 +1,113 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include + +extern void uv__set_process_title(const char* title); + +static void* args_mem; + +static struct { + char* str; + size_t len; +} process_title; + + +char** uv_setup_args(int argc, char** argv) { + char** new_argv; + size_t size; + char* s; + int i; + + if (argc <= 0) + return argv; + + /* Calculate how much memory we need for the argv strings. */ + size = 0; + for (i = 0; i < argc; i++) + size += strlen(argv[i]) + 1; + +#if defined(__MVS__) + /* argv is not adjacent. So just use argv[0] */ + process_title.str = argv[0]; + process_title.len = strlen(argv[0]); +#else + process_title.str = argv[0]; + process_title.len = argv[argc - 1] + strlen(argv[argc - 1]) - argv[0]; + assert(process_title.len + 1 == size); /* argv memory should be adjacent. */ +#endif + + /* Add space for the argv pointers. */ + size += (argc + 1) * sizeof(char*); + + new_argv = uv__malloc(size); + if (new_argv == NULL) + return argv; + args_mem = new_argv; + + /* Copy over the strings and set up the pointer table. */ + s = (char*) &new_argv[argc + 1]; + for (i = 0; i < argc; i++) { + size = strlen(argv[i]) + 1; + memcpy(s, argv[i], size); + new_argv[i] = s; + s += size; + } + new_argv[i] = NULL; + + return new_argv; +} + + +int uv_set_process_title(const char* title) { + if (process_title.len == 0) + return 0; + + /* No need to terminate, byte after is always '\0'. */ + strncpy(process_title.str, title, process_title.len); + uv__set_process_title(title); + + return 0; +} + + +int uv_get_process_title(char* buffer, size_t size) { + if (buffer == NULL || size == 0) + return -EINVAL; + else if (size <= process_title.len) + return -ENOBUFS; + + if (process_title.len != 0) + memcpy(buffer, process_title.str, process_title.len + 1); + + buffer[process_title.len] = '\0'; + + return 0; +} + + +UV_DESTRUCTOR(static void free_args_mem(void)) { + uv__free(args_mem); /* Keep valgrind happy. */ + args_mem = NULL; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/pthread-barrier.c b/lib/ESPiLight/pilight/libs/libuv/unix/pthread-barrier.c new file mode 100644 index 0000000..b6e604d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/pthread-barrier.c @@ -0,0 +1,121 @@ +/* +Copyright (c) 2016, Kari Tristan Helgason + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +#include "uv-common.h" +#include "pthread-barrier.h" + +#include +#include + +/* TODO: support barrier_attr */ +int pthread_barrier_init(pthread_barrier_t* barrier, + const void* barrier_attr, + unsigned count) { + int rc; + _uv_barrier* b; + + if (barrier == NULL || count == 0) + return EINVAL; + + if (barrier_attr != NULL) + return ENOTSUP; + + b = uv__malloc(sizeof(*b)); + if (b == NULL) + return ENOMEM; + + b->in = 0; + b->out = 0; + b->threshold = count; + + if ((rc = pthread_mutex_init(&b->mutex, NULL)) != 0) + goto error2; + if ((rc = pthread_cond_init(&b->cond, NULL)) != 0) + goto error; + + barrier->b = b; + return 0; + +error: + pthread_mutex_destroy(&b->mutex); +error2: + uv__free(b); + return rc; +} + +int pthread_barrier_wait(pthread_barrier_t* barrier) { + int rc; + _uv_barrier* b; + + if (barrier == NULL || barrier->b == NULL) + return EINVAL; + + b = barrier->b; + /* Lock the mutex*/ + if ((rc = pthread_mutex_lock(&b->mutex)) != 0) + return rc; + + /* Increment the count. If this is the first thread to reach the threshold, + wake up waiters, unlock the mutex, then return + PTHREAD_BARRIER_SERIAL_THREAD. */ + if (++b->in == b->threshold) { + b->in = 0; + b->out = b->threshold - 1; + rc = pthread_cond_signal(&b->cond); + assert(rc == 0); + + pthread_mutex_unlock(&b->mutex); + return PTHREAD_BARRIER_SERIAL_THREAD; + } + /* Otherwise, wait for other threads until in is set to 0, + then return 0 to indicate this is not the first thread. */ + do { + if ((rc = pthread_cond_wait(&b->cond, &b->mutex)) != 0) + break; + } while (b->in != 0); + + /* mark thread exit */ + b->out--; + pthread_cond_signal(&b->cond); + pthread_mutex_unlock(&b->mutex); + return rc; +} + +int pthread_barrier_destroy(pthread_barrier_t* barrier) { + int rc; + _uv_barrier* b; + + if (barrier == NULL || barrier->b == NULL) + return EINVAL; + + b = barrier->b; + + if ((rc = pthread_mutex_lock(&b->mutex)) != 0) + return rc; + + if (b->in > 0 || b->out > 0) + rc = EBUSY; + + pthread_mutex_unlock(&b->mutex); + + if (rc) + return rc; + + pthread_cond_destroy(&b->cond); + pthread_mutex_destroy(&b->mutex); + uv__free(barrier->b); + barrier->b = NULL; + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/pthread-fixes.c b/lib/ESPiLight/pilight/libs/libuv/unix/pthread-fixes.c new file mode 100644 index 0000000..fb17995 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/pthread-fixes.c @@ -0,0 +1,56 @@ +/* Copyright (c) 2013, Sony Mobile Communications AB + * Copyright (c) 2012, Google Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* Android versions < 4.1 have a broken pthread_sigmask. */ +#include +#include +#include + +int uv__pthread_sigmask(int how, const sigset_t* set, sigset_t* oset) { + static int workaround; + int err; + + if (workaround) { + return sigprocmask(how, set, oset); + } else { + err = pthread_sigmask(how, set, oset); + if (err) { + if (err == EINVAL && sigprocmask(how, set, oset) == 0) { + workaround = 1; + return 0; + } else { + return -1; + } + } + } + + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/signal.c b/lib/ESPiLight/pilight/libs/libuv/unix/signal.c new file mode 100644 index 0000000..cb09ead --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/signal.c @@ -0,0 +1,559 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include +#include +#include +#include + + +typedef struct { + uv_signal_t* handle; + int signum; +} uv__signal_msg_t; + +RB_HEAD(uv__signal_tree_s, uv_signal_s); + + +static int uv__signal_unlock(void); +static int uv__signal_start(uv_signal_t* handle, + uv_signal_cb signal_cb, + int signum, + int oneshot); +static void uv__signal_event(uv_loop_t* loop, uv__io_t* w, unsigned int events); +static int uv__signal_compare(uv_signal_t* w1, uv_signal_t* w2); +static void uv__signal_stop(uv_signal_t* handle); +static void uv__signal_unregister_handler(int signum); + + +static uv_once_t uv__signal_global_init_guard = UV_ONCE_INIT; +static struct uv__signal_tree_s uv__signal_tree = + RB_INITIALIZER(uv__signal_tree); +static int uv__signal_lock_pipefd[2]; + + +RB_GENERATE_STATIC(uv__signal_tree_s, + uv_signal_s, tree_entry, + uv__signal_compare) + +static void uv__signal_global_reinit(void); + +static void uv__signal_global_init(void) { + if (!uv__signal_lock_pipefd[0]) + /* pthread_atfork can register before and after handlers, one + * for each child. This only registers one for the child. That + * state is both persistent and cumulative, so if we keep doing + * it the handler functions will be called multiple times. Thus + * we only want to do it once. + */ + if (pthread_atfork(NULL, NULL, &uv__signal_global_reinit)) + abort(); + + if (uv__make_pipe(uv__signal_lock_pipefd, 0)) + abort(); + + if (uv__signal_unlock()) + abort(); +} + + +static void uv__signal_global_reinit(void) { + /* We can only use signal-safe functions here. + * That includes read/write and close, fortunately. + * We do all of this directly here instead of resetting + * uv__signal_global_init_guard because + * uv__signal_global_once_init is only called from uv_loop_init + * and this needs to function in existing loops. + */ + uv__close(uv__signal_lock_pipefd[0]); + uv__signal_lock_pipefd[0] = -1; + uv__close(uv__signal_lock_pipefd[1]); + uv__signal_lock_pipefd[1] = -1; + uv__signal_global_init(); +} + + +void uv__signal_global_once_init(void) { + uv_once(&uv__signal_global_init_guard, uv__signal_global_init); +} + + + +static int uv__signal_lock(void) { + int r; + char data; + + do { + r = read(uv__signal_lock_pipefd[0], &data, sizeof data); + } while (r < 0 && errno == EINTR); + + return (r < 0) ? -1 : 0; +} + + +static int uv__signal_unlock(void) { + int r; + char data = 42; + + do { + r = write(uv__signal_lock_pipefd[1], &data, sizeof data); + } while (r < 0 && errno == EINTR); + + return (r < 0) ? -1 : 0; +} + + +static void uv__signal_block_and_lock(sigset_t* saved_sigmask) { + sigset_t new_mask; + + if (sigfillset(&new_mask)) + abort(); + + if (pthread_sigmask(SIG_SETMASK, &new_mask, saved_sigmask)) + abort(); + + if (uv__signal_lock()) + abort(); +} + + +static void uv__signal_unlock_and_unblock(sigset_t* saved_sigmask) { + if (uv__signal_unlock()) + abort(); + + if (pthread_sigmask(SIG_SETMASK, saved_sigmask, NULL)) + abort(); +} + + +static uv_signal_t* uv__signal_first_handle(int signum) { + /* This function must be called with the signal lock held. */ + uv_signal_t lookup; + uv_signal_t* handle; + + lookup.signum = signum; + lookup.flags = 0; + lookup.loop = NULL; + + handle = RB_NFIND(uv__signal_tree_s, &uv__signal_tree, &lookup); + + if (handle != NULL && handle->signum == signum) + return handle; + + return NULL; +} + + +static void uv__signal_handler(int signum) { + uv__signal_msg_t msg; + uv_signal_t* handle; + int saved_errno; + + saved_errno = errno; + memset(&msg, 0, sizeof msg); + + if (uv__signal_lock()) { + errno = saved_errno; + return; + } + + for (handle = uv__signal_first_handle(signum); + handle != NULL && handle->signum == signum; + handle = RB_NEXT(uv__signal_tree_s, &uv__signal_tree, handle)) { + int r; + + msg.signum = signum; + msg.handle = handle; + + /* write() should be atomic for small data chunks, so the entire message + * should be written at once. In theory the pipe could become full, in + * which case the user is out of luck. + */ + do { + r = write(handle->loop->signal_pipefd[1], &msg, sizeof msg); + } while (r == -1 && errno == EINTR); + + assert(r == sizeof msg || + (r == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))); + + if (r != -1) + handle->caught_signals++; + } + + uv__signal_unlock(); + errno = saved_errno; +} + + +static int uv__signal_register_handler(int signum, int oneshot) { + /* When this function is called, the signal lock must be held. */ + struct sigaction sa; + + /* XXX use a separate signal stack? */ + memset(&sa, 0, sizeof(sa)); + if (sigfillset(&sa.sa_mask)) + abort(); + sa.sa_handler = uv__signal_handler; + sa.sa_flags = oneshot ? SA_RESETHAND : 0; + + /* XXX save old action so we can restore it later on? */ + if (sigaction(signum, &sa, NULL)) + return -errno; + + return 0; +} + + +static void uv__signal_unregister_handler(int signum) { + /* When this function is called, the signal lock must be held. */ + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = SIG_DFL; + + /* sigaction can only fail with EINVAL or EFAULT; an attempt to deregister a + * signal implies that it was successfully registered earlier, so EINVAL + * should never happen. + */ + if (sigaction(signum, &sa, NULL)) + abort(); +} + + +static int uv__signal_loop_once_init(uv_loop_t* loop) { + int err; + + /* Return if already initialized. */ + if (loop->signal_pipefd[0] != -1) + return 0; + + err = uv__make_pipe(loop->signal_pipefd, UV__F_NONBLOCK); + if (err) + return err; + + uv__io_init(&loop->signal_io_watcher, + uv__signal_event, + loop->signal_pipefd[0]); + uv__io_start(loop, &loop->signal_io_watcher, POLLIN); + + return 0; +} + + +int uv__signal_loop_fork(uv_loop_t* loop) { + uv__io_stop(loop, &loop->signal_io_watcher, POLLIN); + uv__close(loop->signal_pipefd[0]); + uv__close(loop->signal_pipefd[1]); + loop->signal_pipefd[0] = -1; + loop->signal_pipefd[1] = -1; + return uv__signal_loop_once_init(loop); +} + + +void uv__signal_loop_cleanup(uv_loop_t* loop) { + QUEUE* q; + + /* Stop all the signal watchers that are still attached to this loop. This + * ensures that the (shared) signal tree doesn't contain any invalid entries + * entries, and that signal handlers are removed when appropriate. + * It's safe to use QUEUE_FOREACH here because the handles and the handle + * queue are not modified by uv__signal_stop(). + */ + QUEUE_FOREACH(q, &loop->handle_queue) { + uv_handle_t* handle = QUEUE_DATA(q, uv_handle_t, handle_queue); + + if (handle->type == UV_SIGNAL) + uv__signal_stop((uv_signal_t*) handle); + } + + if (loop->signal_pipefd[0] != -1) { + uv__close(loop->signal_pipefd[0]); + loop->signal_pipefd[0] = -1; + } + + if (loop->signal_pipefd[1] != -1) { + uv__close(loop->signal_pipefd[1]); + loop->signal_pipefd[1] = -1; + } +} + + +int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle) { + int err; + + err = uv__signal_loop_once_init(loop); + if (err) + return err; + + uv__handle_init(loop, (uv_handle_t*) handle, UV_SIGNAL); + handle->signum = 0; + handle->caught_signals = 0; + handle->dispatched_signals = 0; + + return 0; +} + + +void uv__signal_close(uv_signal_t* handle) { + + uv__signal_stop(handle); + + /* If there are any caught signals "trapped" in the signal pipe, we can't + * call the close callback yet. Otherwise, add the handle to the finish_close + * queue. + */ + if (handle->caught_signals == handle->dispatched_signals) { + uv__make_close_pending((uv_handle_t*) handle); + } +} + + +int uv_signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum) { + return uv__signal_start(handle, signal_cb, signum, 0); +} + + +int uv_signal_start_oneshot(uv_signal_t* handle, + uv_signal_cb signal_cb, + int signum) { + return uv__signal_start(handle, signal_cb, signum, 1); +} + + +static int uv__signal_start(uv_signal_t* handle, + uv_signal_cb signal_cb, + int signum, + int oneshot) { + sigset_t saved_sigmask; + int err; + uv_signal_t* first_handle; + + assert(!uv__is_closing(handle)); + + /* If the user supplies signum == 0, then return an error already. If the + * signum is otherwise invalid then uv__signal_register will find out + * eventually. + */ + if (signum == 0) + return -EINVAL; + + /* Short circuit: if the signal watcher is already watching {signum} don't + * go through the process of deregistering and registering the handler. + * Additionally, this avoids pending signals getting lost in the small time + * time frame that handle->signum == 0. + */ + if (signum == handle->signum) { + handle->signal_cb = signal_cb; + return 0; + } + + /* If the signal handler was already active, stop it first. */ + if (handle->signum != 0) { + uv__signal_stop(handle); + } + + uv__signal_block_and_lock(&saved_sigmask); + + /* If at this point there are no active signal watchers for this signum (in + * any of the loops), it's time to try and register a handler for it here. + * Also in case there's only one-shot handlers and a regular handler comes in. + */ + first_handle = uv__signal_first_handle(signum); + if (first_handle == NULL || + (!oneshot && (first_handle->flags & UV__SIGNAL_ONE_SHOT))) { + err = uv__signal_register_handler(signum, oneshot); + if (err) { + /* Registering the signal handler failed. Must be an invalid signal. */ + uv__signal_unlock_and_unblock(&saved_sigmask); + return err; + } + } + + handle->signum = signum; + if (oneshot) + handle->flags |= UV__SIGNAL_ONE_SHOT; + + RB_INSERT(uv__signal_tree_s, &uv__signal_tree, handle); + + uv__signal_unlock_and_unblock(&saved_sigmask); + + handle->signal_cb = signal_cb; + uv__handle_start(handle); + + return 0; +} + + +static void uv__signal_event(uv_loop_t* loop, + uv__io_t* w, + unsigned int events) { + uv__signal_msg_t* msg; + uv_signal_t* handle; + char buf[sizeof(uv__signal_msg_t) * 32]; + size_t bytes, end, i; + int r; + + bytes = 0; + end = 0; + + do { + r = read(loop->signal_pipefd[0], buf + bytes, sizeof(buf) - bytes); + + if (r == -1 && errno == EINTR) + continue; + + if (r == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { + /* If there are bytes in the buffer already (which really is extremely + * unlikely if possible at all) we can't exit the function here. We'll + * spin until more bytes are read instead. + */ + if (bytes > 0) + continue; + + /* Otherwise, there was nothing there. */ + return; + } + + /* Other errors really should never happen. */ + if (r == -1) + abort(); + + bytes += r; + + /* `end` is rounded down to a multiple of sizeof(uv__signal_msg_t). */ + end = (bytes / sizeof(uv__signal_msg_t)) * sizeof(uv__signal_msg_t); + + for (i = 0; i < end; i += sizeof(uv__signal_msg_t)) { + msg = (uv__signal_msg_t*) (buf + i); + handle = msg->handle; + + if (msg->signum == handle->signum) { + assert(!(handle->flags & UV_CLOSING)); + handle->signal_cb(handle, handle->signum); + } + + handle->dispatched_signals++; + + if (handle->flags & UV__SIGNAL_ONE_SHOT) + uv__signal_stop(handle); + + /* If uv_close was called while there were caught signals that were not + * yet dispatched, the uv__finish_close was deferred. Make close pending + * now if this has happened. + */ + if ((handle->flags & UV_CLOSING) && + (handle->caught_signals == handle->dispatched_signals)) { + uv__make_close_pending((uv_handle_t*) handle); + } + } + + bytes -= end; + + /* If there are any "partial" messages left, move them to the start of the + * the buffer, and spin. This should not happen. + */ + if (bytes) { + memmove(buf, buf + end, bytes); + continue; + } + } while (end == sizeof buf); +} + + +static int uv__signal_compare(uv_signal_t* w1, uv_signal_t* w2) { + int f1; + int f2; + /* Compare signums first so all watchers with the same signnum end up + * adjacent. + */ + if (w1->signum < w2->signum) return -1; + if (w1->signum > w2->signum) return 1; + + /* Handlers without UV__SIGNAL_ONE_SHOT set will come first, so if the first + * handler returned is a one-shot handler, the rest will be too. + */ + f1 = w1->flags & UV__SIGNAL_ONE_SHOT; + f2 = w2->flags & UV__SIGNAL_ONE_SHOT; + if (f1 < f2) return -1; + if (f1 > f2) return 1; + + /* Sort by loop pointer, so we can easily look up the first item after + * { .signum = x, .loop = NULL }. + */ + if (w1->loop < w2->loop) return -1; + if (w1->loop > w2->loop) return 1; + + if (w1 < w2) return -1; + if (w1 > w2) return 1; + + return 0; +} + + +int uv_signal_stop(uv_signal_t* handle) { + assert(!uv__is_closing(handle)); + uv__signal_stop(handle); + return 0; +} + + +static void uv__signal_stop(uv_signal_t* handle) { + uv_signal_t* removed_handle; + sigset_t saved_sigmask; + uv_signal_t* first_handle; + int rem_oneshot; + int first_oneshot; + int ret; + + /* If the watcher wasn't started, this is a no-op. */ + if (handle->signum == 0) + return; + + uv__signal_block_and_lock(&saved_sigmask); + + removed_handle = RB_REMOVE(uv__signal_tree_s, &uv__signal_tree, handle); + assert(removed_handle == handle); + (void) removed_handle; + + /* Check if there are other active signal watchers observing this signal. If + * not, unregister the signal handler. + */ + first_handle = uv__signal_first_handle(handle->signum); + if (first_handle == NULL) { + uv__signal_unregister_handler(handle->signum); + } else { + rem_oneshot = handle->flags & UV__SIGNAL_ONE_SHOT; + first_oneshot = first_handle->flags & UV__SIGNAL_ONE_SHOT; + if (first_oneshot && !rem_oneshot) { + ret = uv__signal_register_handler(handle->signum, 1); + assert(ret == 0); + } + } + + uv__signal_unlock_and_unblock(&saved_sigmask); + + handle->signum = 0; + uv__handle_stop(handle); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/spinlock.h b/lib/ESPiLight/pilight/libs/libuv/unix/spinlock.h new file mode 100644 index 0000000..a20c83c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/spinlock.h @@ -0,0 +1,53 @@ +/* Copyright (c) 2013, Ben Noordhuis + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef UV_SPINLOCK_H_ +#define UV_SPINLOCK_H_ + +#include "internal.h" /* ACCESS_ONCE, UV_UNUSED */ +#include "atomic-ops.h" + +#define UV_SPINLOCK_INITIALIZER { 0 } + +typedef struct { + int lock; +} uv_spinlock_t; + +UV_UNUSED(static void uv_spinlock_init(uv_spinlock_t* spinlock)); +UV_UNUSED(static void uv_spinlock_lock(uv_spinlock_t* spinlock)); +UV_UNUSED(static void uv_spinlock_unlock(uv_spinlock_t* spinlock)); +UV_UNUSED(static int uv_spinlock_trylock(uv_spinlock_t* spinlock)); + +UV_UNUSED(static void uv_spinlock_init(uv_spinlock_t* spinlock)) { + ACCESS_ONCE(int, spinlock->lock) = 0; +} + +UV_UNUSED(static void uv_spinlock_lock(uv_spinlock_t* spinlock)) { + while (!uv_spinlock_trylock(spinlock)) cpu_relax(); +} + +UV_UNUSED(static void uv_spinlock_unlock(uv_spinlock_t* spinlock)) { + ACCESS_ONCE(int, spinlock->lock) = 0; +} + +UV_UNUSED(static int uv_spinlock_trylock(uv_spinlock_t* spinlock)) { + /* TODO(bnoordhuis) Maybe change to a ticket lock to guarantee fair queueing. + * Not really critical until we have locks that are (frequently) contended + * for by several threads. + */ + return 0 == cmpxchgi(&spinlock->lock, 0, 1); +} + +#endif /* UV_SPINLOCK_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/stream.c b/lib/ESPiLight/pilight/libs/libuv/unix/stream.c new file mode 100644 index 0000000..657e018 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/stream.c @@ -0,0 +1,1689 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include /* IOV_MAX */ + +#if defined(__APPLE__) +# include +# include +# include + +/* Forward declaration */ +typedef struct uv__stream_select_s uv__stream_select_t; + +struct uv__stream_select_s { + uv_stream_t* stream; + uv_thread_t thread; + uv_sem_t close_sem; + uv_sem_t async_sem; + uv_async_t async; + int events; + int fake_fd; + int int_fd; + int fd; + fd_set* sread; + size_t sread_sz; + fd_set* swrite; + size_t swrite_sz; +}; +#endif /* defined(__APPLE__) */ + +static void uv__stream_connect(uv_stream_t*); +static void uv__write(uv_stream_t* stream); +static void uv__read(uv_stream_t* stream); +static void uv__stream_io(uv_loop_t* loop, uv__io_t* w, unsigned int events); +static void uv__write_callbacks(uv_stream_t* stream); +static size_t uv__write_req_size(uv_write_t* req); + + +void uv__stream_init(uv_loop_t* loop, + uv_stream_t* stream, + uv_handle_type type) { + int err; + + uv__handle_init(loop, (uv_handle_t*)stream, type); + stream->read_cb = NULL; + stream->alloc_cb = NULL; + stream->close_cb = NULL; + stream->connection_cb = NULL; + stream->connect_req = NULL; + stream->shutdown_req = NULL; + stream->accepted_fd = -1; + stream->queued_fds = NULL; + stream->delayed_error = 0; + QUEUE_INIT(&stream->write_queue); + QUEUE_INIT(&stream->write_completed_queue); + stream->write_queue_size = 0; + + if (loop->emfile_fd == -1) { + err = uv__open_cloexec("/dev/null", O_RDONLY); + if (err < 0) + /* In the rare case that "/dev/null" isn't mounted open "/" + * instead. + */ + err = uv__open_cloexec("/", O_RDONLY); + if (err >= 0) + loop->emfile_fd = err; + } + +#if defined(__APPLE__) + stream->select = NULL; +#endif /* defined(__APPLE_) */ + + uv__io_init(&stream->io_watcher, uv__stream_io, -1); +} + + +static void uv__stream_osx_interrupt_select(uv_stream_t* stream) { +#if defined(__APPLE__) + /* Notify select() thread about state change */ + uv__stream_select_t* s; + int r; + + s = stream->select; + if (s == NULL) + return; + + /* Interrupt select() loop + * NOTE: fake_fd and int_fd are socketpair(), thus writing to one will + * emit read event on other side + */ + do + r = write(s->fake_fd, "x", 1); + while (r == -1 && errno == EINTR); + + assert(r == 1); +#else /* !defined(__APPLE__) */ + /* No-op on any other platform */ +#endif /* !defined(__APPLE__) */ +} + + +#if defined(__APPLE__) +static void uv__stream_osx_select(void* arg) { + uv_stream_t* stream; + uv__stream_select_t* s; + char buf[1024]; + int events; + int fd; + int r; + int max_fd; + + stream = arg; + s = stream->select; + fd = s->fd; + + if (fd > s->int_fd) + max_fd = fd; + else + max_fd = s->int_fd; + + while (1) { + /* Terminate on semaphore */ + if (uv_sem_trywait(&s->close_sem) == 0) + break; + + /* Watch fd using select(2) */ + memset(s->sread, 0, s->sread_sz); + memset(s->swrite, 0, s->swrite_sz); + + if (uv__io_active(&stream->io_watcher, POLLIN)) + FD_SET(fd, s->sread); + if (uv__io_active(&stream->io_watcher, POLLOUT)) + FD_SET(fd, s->swrite); + FD_SET(s->int_fd, s->sread); + + /* Wait indefinitely for fd events */ + r = select(max_fd + 1, s->sread, s->swrite, NULL, NULL); + if (r == -1) { + if (errno == EINTR) + continue; + + /* XXX: Possible?! */ + abort(); + } + + /* Ignore timeouts */ + if (r == 0) + continue; + + /* Empty socketpair's buffer in case of interruption */ + if (FD_ISSET(s->int_fd, s->sread)) + while (1) { + r = read(s->int_fd, buf, sizeof(buf)); + + if (r == sizeof(buf)) + continue; + + if (r != -1) + break; + + if (errno == EAGAIN || errno == EWOULDBLOCK) + break; + + if (errno == EINTR) + continue; + + abort(); + } + + /* Handle events */ + events = 0; + if (FD_ISSET(fd, s->sread)) + events |= POLLIN; + if (FD_ISSET(fd, s->swrite)) + events |= POLLOUT; + + assert(events != 0 || FD_ISSET(s->int_fd, s->sread)); + if (events != 0) { + ACCESS_ONCE(int, s->events) = events; + + uv_async_send(&s->async); + uv_sem_wait(&s->async_sem); + + /* Should be processed at this stage */ + assert((s->events == 0) || (stream->flags & UV_CLOSING)); + } + } +} + + +static void uv__stream_osx_select_cb(uv_async_t* handle) { + uv__stream_select_t* s; + uv_stream_t* stream; + int events; + + s = container_of(handle, uv__stream_select_t, async); + stream = s->stream; + + /* Get and reset stream's events */ + events = s->events; + ACCESS_ONCE(int, s->events) = 0; + + assert(events != 0); + assert(events == (events & (POLLIN | POLLOUT))); + + /* Invoke callback on event-loop */ + if ((events & POLLIN) && uv__io_active(&stream->io_watcher, POLLIN)) + uv__stream_io(stream->loop, &stream->io_watcher, POLLIN); + + if ((events & POLLOUT) && uv__io_active(&stream->io_watcher, POLLOUT)) + uv__stream_io(stream->loop, &stream->io_watcher, POLLOUT); + + if (stream->flags & UV_CLOSING) + return; + + /* NOTE: It is important to do it here, otherwise `select()` might be called + * before the actual `uv__read()`, leading to the blocking syscall + */ + uv_sem_post(&s->async_sem); +} + + +static void uv__stream_osx_cb_close(uv_handle_t* async) { + uv__stream_select_t* s; + + s = container_of(async, uv__stream_select_t, async); + uv__free(s); +} + + +int uv__stream_try_select(uv_stream_t* stream, int* fd) { + /* + * kqueue doesn't work with some files from /dev mount on osx. + * select(2) in separate thread for those fds + */ + + struct kevent filter[1]; + struct kevent events[1]; + struct timespec timeout; + uv__stream_select_t* s; + int fds[2]; + int err; + int ret; + int kq; + int old_fd; + int max_fd; + size_t sread_sz; + size_t swrite_sz; + + kq = kqueue(); + if (kq == -1) { + perror("(libuv) kqueue()"); + return -errno; + } + + EV_SET(&filter[0], *fd, EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, 0); + + /* Use small timeout, because we only want to capture EINVALs */ + timeout.tv_sec = 0; + timeout.tv_nsec = 1; + + do + ret = kevent(kq, filter, 1, events, 1, &timeout); + while (ret == -1 && errno == EINTR); + + uv__close(kq); + + if (ret == -1) + return -errno; + + if (ret == 0 || (events[0].flags & EV_ERROR) == 0 || events[0].data != EINVAL) + return 0; + + /* At this point we definitely know that this fd won't work with kqueue */ + + /* + * Create fds for io watcher and to interrupt the select() loop. + * NOTE: do it ahead of malloc below to allocate enough space for fd_sets + */ + if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds)) + return -errno; + + max_fd = *fd; + if (fds[1] > max_fd) + max_fd = fds[1]; + + sread_sz = ROUND_UP(max_fd + 1, sizeof(uint32_t) * NBBY) / NBBY; + swrite_sz = sread_sz; + + s = uv__malloc(sizeof(*s) + sread_sz + swrite_sz); + if (s == NULL) { + err = -ENOMEM; + goto failed_malloc; + } + + s->events = 0; + s->fd = *fd; + s->sread = (fd_set*) ((char*) s + sizeof(*s)); + s->sread_sz = sread_sz; + s->swrite = (fd_set*) ((char*) s->sread + sread_sz); + s->swrite_sz = swrite_sz; + + err = uv_async_init(stream->loop, &s->async, uv__stream_osx_select_cb); + if (err) + goto failed_async_init; + + s->async.flags |= UV__HANDLE_INTERNAL; + uv__handle_unref(&s->async); + + err = uv_sem_init(&s->close_sem, 0); + if (err != 0) + goto failed_close_sem_init; + + err = uv_sem_init(&s->async_sem, 0); + if (err != 0) + goto failed_async_sem_init; + + s->fake_fd = fds[0]; + s->int_fd = fds[1]; + + old_fd = *fd; + s->stream = stream; + stream->select = s; + *fd = s->fake_fd; + + err = uv_thread_create(&s->thread, uv__stream_osx_select, stream); + if (err != 0) + goto failed_thread_create; + + return 0; + +failed_thread_create: + s->stream = NULL; + stream->select = NULL; + *fd = old_fd; + + uv_sem_destroy(&s->async_sem); + +failed_async_sem_init: + uv_sem_destroy(&s->close_sem); + +failed_close_sem_init: + uv__close(fds[0]); + uv__close(fds[1]); + uv_close((uv_handle_t*) &s->async, uv__stream_osx_cb_close); + return err; + +failed_async_init: + uv__free(s); + +failed_malloc: + uv__close(fds[0]); + uv__close(fds[1]); + + return err; +} +#endif /* defined(__APPLE__) */ + + +int uv__stream_open(uv_stream_t* stream, int fd, int flags) { +#if defined(__APPLE__) + int enable; +#endif + + if (!(stream->io_watcher.fd == -1 || stream->io_watcher.fd == fd)) + return -EBUSY; + + assert(fd >= 0); + stream->flags |= flags; + + if (stream->type == UV_TCP) { + if ((stream->flags & UV_TCP_NODELAY) && uv__tcp_nodelay(fd, 1)) + return -errno; + + /* TODO Use delay the user passed in. */ + if ((stream->flags & UV_TCP_KEEPALIVE) && uv__tcp_keepalive(fd, 1, 60)) + return -errno; + } + +#if defined(__APPLE__) + enable = 1; + if (setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, &enable, sizeof(enable)) && + errno != ENOTSOCK && + errno != EINVAL) { + return -errno; + } +#endif + + stream->io_watcher.fd = fd; + + return 0; +} + + +void uv__stream_flush_write_queue(uv_stream_t* stream, int error) { + uv_write_t* req; + QUEUE* q; + while (!QUEUE_EMPTY(&stream->write_queue)) { + q = QUEUE_HEAD(&stream->write_queue); + QUEUE_REMOVE(q); + + req = QUEUE_DATA(q, uv_write_t, queue); + req->error = error; + + QUEUE_INSERT_TAIL(&stream->write_completed_queue, &req->queue); + } +} + + +void uv__stream_destroy(uv_stream_t* stream) { + assert(!uv__io_active(&stream->io_watcher, POLLIN | POLLOUT)); + assert(stream->flags & UV_CLOSED); + + if (stream->connect_req) { + uv__req_unregister(stream->loop, stream->connect_req); + stream->connect_req->cb(stream->connect_req, -ECANCELED); + stream->connect_req = NULL; + } + + uv__stream_flush_write_queue(stream, -ECANCELED); + uv__write_callbacks(stream); + + if (stream->shutdown_req) { + /* The ECANCELED error code is a lie, the shutdown(2) syscall is a + * fait accompli at this point. Maybe we should revisit this in v0.11. + * A possible reason for leaving it unchanged is that it informs the + * callee that the handle has been destroyed. + */ + uv__req_unregister(stream->loop, stream->shutdown_req); + stream->shutdown_req->cb(stream->shutdown_req, -ECANCELED); + stream->shutdown_req = NULL; + } + + assert(stream->write_queue_size == 0); +} + + +/* Implements a best effort approach to mitigating accept() EMFILE errors. + * We have a spare file descriptor stashed away that we close to get below + * the EMFILE limit. Next, we accept all pending connections and close them + * immediately to signal the clients that we're overloaded - and we are, but + * we still keep on trucking. + * + * There is one caveat: it's not reliable in a multi-threaded environment. + * The file descriptor limit is per process. Our party trick fails if another + * thread opens a file or creates a socket in the time window between us + * calling close() and accept(). + */ +static int uv__emfile_trick(uv_loop_t* loop, int accept_fd) { + int err; + int emfile_fd; + + if (loop->emfile_fd == -1) + return -EMFILE; + + uv__close(loop->emfile_fd); + loop->emfile_fd = -1; + + do { + err = uv__accept(accept_fd); + if (err >= 0) + uv__close(err); + } while (err >= 0 || err == -EINTR); + + emfile_fd = uv__open_cloexec("/", O_RDONLY); + if (emfile_fd >= 0) + loop->emfile_fd = emfile_fd; + + return err; +} + + +// #if defined(UV_HAVE_KQUEUE) +// # define UV_DEC_BACKLOG(w) w->rcount--; +// #else +# define UV_DEC_BACKLOG(w) /* no-op */ +// #endif /* defined(UV_HAVE_KQUEUE) */ + + +void uv__server_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { + uv_stream_t* stream; + int err; + + stream = container_of(w, uv_stream_t, io_watcher); + assert(events == POLLIN); + assert(stream->accepted_fd == -1); + assert(!(stream->flags & UV_CLOSING)); + + uv__io_start(stream->loop, &stream->io_watcher, POLLIN); + + /* connection_cb can close the server socket while we're + * in the loop so check it on each iteration. + */ + while (uv__stream_fd(stream) != -1) { + assert(stream->accepted_fd == -1); + +// #if defined(UV_HAVE_KQUEUE) + // if (w->rcount <= 0) + // return; +// #endif /* defined(UV_HAVE_KQUEUE) */ + + err = uv__accept(uv__stream_fd(stream)); + if (err < 0) { + if (err == -EAGAIN || err == -EWOULDBLOCK) + return; /* Not an error. */ + + if (err == -ECONNABORTED) + continue; /* Ignore. Nothing we can do about that. */ + + if (err == -EMFILE || err == -ENFILE) { + err = uv__emfile_trick(loop, uv__stream_fd(stream)); + if (err == -EAGAIN || err == -EWOULDBLOCK) + break; + } + + stream->connection_cb(stream, err); + continue; + } + + UV_DEC_BACKLOG(w) + stream->accepted_fd = err; + stream->connection_cb(stream, 0); + + if (stream->accepted_fd != -1) { + /* The user hasn't yet accepted called uv_accept() */ + uv__io_stop(loop, &stream->io_watcher, POLLIN); + return; + } + + if (stream->type == UV_TCP && (stream->flags & UV_TCP_SINGLE_ACCEPT)) { + /* Give other processes a chance to accept connections. */ + struct timespec timeout = { 0, 1 }; + nanosleep(&timeout, NULL); + } + } +} + + +#undef UV_DEC_BACKLOG + + +int uv_accept(uv_stream_t* server, uv_stream_t* client) { + int err; + + assert(server->loop == client->loop); + + if (server->accepted_fd == -1) + return -EAGAIN; + + switch (client->type) { + case UV_NAMED_PIPE: + case UV_TCP: + err = uv__stream_open(client, + server->accepted_fd, + UV_STREAM_READABLE | UV_STREAM_WRITABLE); + if (err) { + /* TODO handle error */ + uv__close(server->accepted_fd); + goto done; + } + break; + + case UV_UDP: + err = uv_udp_open((uv_udp_t*) client, server->accepted_fd); + if (err) { + uv__close(server->accepted_fd); + goto done; + } + break; + + default: + return -EINVAL; + } + + client->flags |= UV_HANDLE_BOUND; + +done: + /* Process queued fds */ + if (server->queued_fds != NULL) { + uv__stream_queued_fds_t* queued_fds; + + queued_fds = server->queued_fds; + + /* Read first */ + server->accepted_fd = queued_fds->fds[0]; + + /* All read, free */ + assert(queued_fds->offset > 0); + if (--queued_fds->offset == 0) { + uv__free(queued_fds); + server->queued_fds = NULL; + } else { + /* Shift rest */ + memmove(queued_fds->fds, + queued_fds->fds + 1, + queued_fds->offset * sizeof(*queued_fds->fds)); + } + } else { + server->accepted_fd = -1; + if (err == 0) + uv__io_start(server->loop, &server->io_watcher, POLLIN); + } + return err; +} + + +int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) { + int err; + + switch (stream->type) { + case UV_TCP: + err = uv_tcp_listen((uv_tcp_t*)stream, backlog, cb); + break; + + case UV_NAMED_PIPE: + err = uv_pipe_listen((uv_pipe_t*)stream, backlog, cb); + break; + + default: + err = -EINVAL; + } + + if (err == 0) + uv__handle_start(stream); + + return err; +} + + +static void uv__drain(uv_stream_t* stream) { + uv_shutdown_t* req; + int err; + + assert(QUEUE_EMPTY(&stream->write_queue)); + uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT); + uv__stream_osx_interrupt_select(stream); + + /* Shutdown? */ + if ((stream->flags & UV_STREAM_SHUTTING) && + !(stream->flags & UV_CLOSING) && + !(stream->flags & UV_STREAM_SHUT)) { + assert(stream->shutdown_req); + + req = stream->shutdown_req; + stream->shutdown_req = NULL; + stream->flags &= ~UV_STREAM_SHUTTING; + uv__req_unregister(stream->loop, req); + + err = 0; + if (shutdown(uv__stream_fd(stream), SHUT_WR)) + err = -errno; + + if (err == 0) + stream->flags |= UV_STREAM_SHUT; + + if (req->cb != NULL) + req->cb(req, err); + } +} + + +static size_t uv__write_req_size(uv_write_t* req) { + size_t size; + + assert(req->bufs != NULL); + size = uv__count_bufs(req->bufs + req->write_index, + req->nbufs - req->write_index); + assert(req->handle->write_queue_size >= size); + + return size; +} + + +static void uv__write_req_finish(uv_write_t* req) { + uv_stream_t* stream = req->handle; + + /* Pop the req off tcp->write_queue. */ + QUEUE_REMOVE(&req->queue); + + /* Only free when there was no error. On error, we touch up write_queue_size + * right before making the callback. The reason we don't do that right away + * is that a write_queue_size > 0 is our only way to signal to the user that + * they should stop writing - which they should if we got an error. Something + * to revisit in future revisions of the libuv API. + */ + if (req->error == 0) { + if (req->bufs != req->bufsml) + uv__free(req->bufs); + req->bufs = NULL; + } + + /* Add it to the write_completed_queue where it will have its + * callback called in the near future. + */ + QUEUE_INSERT_TAIL(&stream->write_completed_queue, &req->queue); + uv__io_feed(stream->loop, &stream->io_watcher); +} + + +static int uv__handle_fd(uv_handle_t* handle) { + switch (handle->type) { + case UV_NAMED_PIPE: + case UV_TCP: + return ((uv_stream_t*) handle)->io_watcher.fd; + + case UV_UDP: + return ((uv_udp_t*) handle)->io_watcher.fd; + + default: + return -1; + } +} + +static void uv__write(uv_stream_t* stream) { + struct iovec* iov; + QUEUE* q; + uv_write_t* req; + int iovmax; + int iovcnt; + ssize_t n; + int err; + +start: + + assert(uv__stream_fd(stream) >= 0); + + if (QUEUE_EMPTY(&stream->write_queue)) + return; + + q = QUEUE_HEAD(&stream->write_queue); + req = QUEUE_DATA(q, uv_write_t, queue); + assert(req->handle == stream); + + /* + * Cast to iovec. We had to have our own uv_buf_t instead of iovec + * because Windows's WSABUF is not an iovec. + */ + assert(sizeof(uv_buf_t) == sizeof(struct iovec)); + iov = (struct iovec*) &(req->bufs[req->write_index]); + iovcnt = req->nbufs - req->write_index; + + iovmax = uv__getiovmax(); + + /* Limit iov count to avoid EINVALs from writev() */ + if (iovcnt > iovmax) + iovcnt = iovmax; + + /* + * Now do the actual writev. Note that we've been updating the pointers + * inside the iov each time we write. So there is no need to offset it. + */ + + if (req->send_handle) { + int fd_to_send; + struct msghdr msg; + struct cmsghdr *cmsg; + union { + char data[64]; + struct cmsghdr alias; + } scratch; + + if (uv__is_closing(req->send_handle)) { + err = -EBADF; + goto error; + } + + fd_to_send = uv__handle_fd((uv_handle_t*) req->send_handle); + + memset(&scratch, 0, sizeof(scratch)); + + assert(fd_to_send >= 0); + + msg.msg_name = NULL; + msg.msg_namelen = 0; + msg.msg_iov = iov; + msg.msg_iovlen = iovcnt; + msg.msg_flags = 0; + + msg.msg_control = &scratch.alias; + msg.msg_controllen = CMSG_SPACE(sizeof(fd_to_send)); + + cmsg = CMSG_FIRSTHDR(&msg); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_RIGHTS; + cmsg->cmsg_len = CMSG_LEN(sizeof(fd_to_send)); + + /* silence aliasing warning */ + { + void* pv = CMSG_DATA(cmsg); + int* pi = pv; + *pi = fd_to_send; + } + + do { + n = sendmsg(uv__stream_fd(stream), &msg, 0); + } +#if defined(__APPLE__) + /* + * Due to a possible kernel bug at least in OS X 10.10 "Yosemite", + * EPROTOTYPE can be returned while trying to write to a socket that is + * shutting down. If we retry the write, we should get the expected EPIPE + * instead. + */ + while (n == -1 && (errno == EINTR || errno == EPROTOTYPE)); +#else + while (n == -1 && errno == EINTR); +#endif + } else { + do { + if (iovcnt == 1) { + n = write(uv__stream_fd(stream), iov[0].iov_base, iov[0].iov_len); + } else { + n = writev(uv__stream_fd(stream), iov, iovcnt); + } + } +#if defined(__APPLE__) + /* + * Due to a possible kernel bug at least in OS X 10.10 "Yosemite", + * EPROTOTYPE can be returned while trying to write to a socket that is + * shutting down. If we retry the write, we should get the expected EPIPE + * instead. + */ + while (n == -1 && (errno == EINTR || errno == EPROTOTYPE)); +#else + while (n == -1 && errno == EINTR); +#endif + } + + if (n < 0) { + if (errno != EAGAIN && errno != EWOULDBLOCK) { + err = -errno; + goto error; + } else if (stream->flags & UV_STREAM_BLOCKING) { + /* If this is a blocking stream, try again. */ + goto start; + } + } else { + /* Successful write */ + + while (n >= 0) { + uv_buf_t* buf = &(req->bufs[req->write_index]); + size_t len = buf->len; + + assert(req->write_index < req->nbufs); + + if ((size_t)n < len) { + buf->base += n; + buf->len -= n; + stream->write_queue_size -= n; + n = 0; + + /* There is more to write. */ + if (stream->flags & UV_STREAM_BLOCKING) { + /* + * If we're blocking then we should not be enabling the write + * watcher - instead we need to try again. + */ + goto start; + } else { + /* Break loop and ensure the watcher is pending. */ + break; + } + + } else { + /* Finished writing the buf at index req->write_index. */ + req->write_index++; + + assert((size_t)n >= len); + n -= len; + + assert(stream->write_queue_size >= len); + stream->write_queue_size -= len; + + if (req->write_index == req->nbufs) { + /* Then we're done! */ + assert(n == 0); + uv__write_req_finish(req); + /* TODO: start trying to write the next request. */ + return; + } + } + } + } + + /* Either we've counted n down to zero or we've got EAGAIN. */ + assert(n == 0 || n == -1); + + /* Only non-blocking streams should use the write_watcher. */ + assert(!(stream->flags & UV_STREAM_BLOCKING)); + + /* We're not done. */ + uv__io_start(stream->loop, &stream->io_watcher, POLLOUT); + + /* Notify select() thread about state change */ + uv__stream_osx_interrupt_select(stream); + + return; + +error: + req->error = err; + uv__write_req_finish(req); + uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT); + if (!uv__io_active(&stream->io_watcher, POLLIN)) + uv__handle_stop(stream); + uv__stream_osx_interrupt_select(stream); +} + + +static void uv__write_callbacks(uv_stream_t* stream) { + uv_write_t* req; + QUEUE* q; + + while (!QUEUE_EMPTY(&stream->write_completed_queue)) { + /* Pop a req off write_completed_queue. */ + q = QUEUE_HEAD(&stream->write_completed_queue); + req = QUEUE_DATA(q, uv_write_t, queue); + QUEUE_REMOVE(q); + uv__req_unregister(stream->loop, req); + + if (req->bufs != NULL) { + stream->write_queue_size -= uv__write_req_size(req); + if (req->bufs != req->bufsml) + uv__free(req->bufs); + req->bufs = NULL; + } + + /* NOTE: call callback AFTER freeing the request data. */ + if (req->cb) + req->cb(req, req->error); + } + + assert(QUEUE_EMPTY(&stream->write_completed_queue)); +} + + +uv_handle_type uv__handle_type(int fd) { + struct sockaddr_storage ss; + socklen_t sslen; + socklen_t len; + int type; + + memset(&ss, 0, sizeof(ss)); + sslen = sizeof(ss); + + if (getsockname(fd, (struct sockaddr*)&ss, &sslen)) + return UV_UNKNOWN_HANDLE; + + len = sizeof type; + + if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &len)) + return UV_UNKNOWN_HANDLE; + + if (type == SOCK_STREAM) { +#if defined(_AIX) || defined(__DragonFly__) + /* on AIX/DragonFly the getsockname call returns an empty sa structure + * for sockets of type AF_UNIX. For all other types it will + * return a properly filled in structure. + */ + if (sslen == 0) + return UV_NAMED_PIPE; +#endif + switch (ss.ss_family) { + case AF_UNIX: + return UV_NAMED_PIPE; + case AF_INET: + case AF_INET6: + return UV_TCP; + } + } + + if (type == SOCK_DGRAM && + (ss.ss_family == AF_INET || ss.ss_family == AF_INET6)) + return UV_UDP; + + return UV_UNKNOWN_HANDLE; +} + + +static void uv__stream_eof(uv_stream_t* stream, const uv_buf_t* buf) { + stream->flags |= UV_STREAM_READ_EOF; + uv__io_stop(stream->loop, &stream->io_watcher, POLLIN); + if (!uv__io_active(&stream->io_watcher, POLLOUT)) + uv__handle_stop(stream); + uv__stream_osx_interrupt_select(stream); + stream->read_cb(stream, UV_EOF, buf); + stream->flags &= ~UV_STREAM_READING; +} + + +static int uv__stream_queue_fd(uv_stream_t* stream, int fd) { + uv__stream_queued_fds_t* queued_fds; + unsigned int queue_size; + + queued_fds = stream->queued_fds; + if (queued_fds == NULL) { + queue_size = 8; + queued_fds = uv__malloc((queue_size - 1) * sizeof(*queued_fds->fds) + + sizeof(*queued_fds)); + if (queued_fds == NULL) + return -ENOMEM; + queued_fds->size = queue_size; + queued_fds->offset = 0; + stream->queued_fds = queued_fds; + + /* Grow */ + } else if (queued_fds->size == queued_fds->offset) { + queue_size = queued_fds->size + 8; + queued_fds = uv__realloc(queued_fds, + (queue_size - 1) * sizeof(*queued_fds->fds) + + sizeof(*queued_fds)); + + /* + * Allocation failure, report back. + * NOTE: if it is fatal - sockets will be closed in uv__stream_close + */ + if (queued_fds == NULL) + return -ENOMEM; + queued_fds->size = queue_size; + stream->queued_fds = queued_fds; + } + + /* Put fd in a queue */ + queued_fds->fds[queued_fds->offset++] = fd; + + return 0; +} + + +#define UV__CMSG_FD_COUNT 64 +#define UV__CMSG_FD_SIZE (UV__CMSG_FD_COUNT * sizeof(int)) + + +static int uv__stream_recv_cmsg(uv_stream_t* stream, struct msghdr* msg) { + struct cmsghdr* cmsg; + + for (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg)) { + char* start; + char* end; + int err; + void* pv; + int* pi; + unsigned int i; + unsigned int count; + + if (cmsg->cmsg_type != SCM_RIGHTS) { + fprintf(stderr, "ignoring non-SCM_RIGHTS ancillary data: %d\n", + cmsg->cmsg_type); + continue; + } + + /* silence aliasing warning */ + pv = CMSG_DATA(cmsg); + pi = pv; + + /* Count available fds */ + start = (char*) cmsg; + end = (char*) cmsg + cmsg->cmsg_len; + count = 0; + while (start + CMSG_LEN(count * sizeof(*pi)) < end) + count++; + assert(start + CMSG_LEN(count * sizeof(*pi)) == end); + + for (i = 0; i < count; i++) { + /* Already has accepted fd, queue now */ + if (stream->accepted_fd != -1) { + err = uv__stream_queue_fd(stream, pi[i]); + if (err != 0) { + /* Close rest */ + for (; i < count; i++) + uv__close(pi[i]); + return err; + } + } else { + stream->accepted_fd = pi[i]; + } + } + } + + return 0; +} + + +#ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wgnu-folding-constant" +#endif + +static void uv__read(uv_stream_t* stream) { + uv_buf_t buf; + ssize_t nread; + struct msghdr msg; + char cmsg_space[CMSG_SPACE(UV__CMSG_FD_SIZE)]; + int count; + int err; + int is_ipc; + + stream->flags &= ~UV_STREAM_READ_PARTIAL; + + /* Prevent loop starvation when the data comes in as fast as (or faster than) + * we can read it. XXX Need to rearm fd if we switch to edge-triggered I/O. + */ + count = 32; + + is_ipc = stream->type == UV_NAMED_PIPE && ((uv_pipe_t*) stream)->ipc; + + /* XXX: Maybe instead of having UV_STREAM_READING we just test if + * tcp->read_cb is NULL or not? + */ + while (stream->read_cb + && (stream->flags & UV_STREAM_READING) + && (count-- > 0)) { + assert(stream->alloc_cb != NULL); + + buf = uv_buf_init(NULL, 0); + stream->alloc_cb((uv_handle_t*)stream, 64 * 1024, &buf); + if (buf.base == NULL || buf.len == 0) { + /* User indicates it can't or won't handle the read. */ + stream->read_cb(stream, UV_ENOBUFS, &buf); + return; + } + + assert(buf.base != NULL); + assert(uv__stream_fd(stream) >= 0); + + if (!is_ipc) { + do { + nread = read(uv__stream_fd(stream), buf.base, buf.len); + } + while (nread < 0 && errno == EINTR); + } else { + /* ipc uses recvmsg */ + msg.msg_flags = 0; + msg.msg_iov = (struct iovec*) &buf; + msg.msg_iovlen = 1; + msg.msg_name = NULL; + msg.msg_namelen = 0; + /* Set up to receive a descriptor even if one isn't in the message */ + msg.msg_controllen = sizeof(cmsg_space); + msg.msg_control = cmsg_space; + + do { + nread = uv__recvmsg(uv__stream_fd(stream), &msg, 0); + } + while (nread < 0 && errno == EINTR); + } + + if (nread < 0) { + /* Error */ + if (errno == EAGAIN || errno == EWOULDBLOCK) { + /* Wait for the next one. */ + if (stream->flags & UV_STREAM_READING) { + uv__io_start(stream->loop, &stream->io_watcher, POLLIN); + uv__stream_osx_interrupt_select(stream); + } + stream->read_cb(stream, 0, &buf); +#if defined(__CYGWIN__) || defined(__MSYS__) + } else if (errno == ECONNRESET && stream->type == UV_NAMED_PIPE) { + uv__stream_eof(stream, &buf); + return; +#endif + } else { + /* Error. User should call uv_close(). */ + stream->read_cb(stream, -errno, &buf); + if (stream->flags & UV_STREAM_READING) { + stream->flags &= ~UV_STREAM_READING; + uv__io_stop(stream->loop, &stream->io_watcher, POLLIN); + if (!uv__io_active(&stream->io_watcher, POLLOUT)) + uv__handle_stop(stream); + uv__stream_osx_interrupt_select(stream); + } + } + return; + } else if (nread == 0) { + uv__stream_eof(stream, &buf); + return; + } else { + /* Successful read */ + ssize_t buflen = buf.len; + + if (is_ipc) { + err = uv__stream_recv_cmsg(stream, &msg); + if (err != 0) { + stream->read_cb(stream, err, &buf); + return; + } + } + +#if defined(__MVS__) + if (is_ipc && msg.msg_controllen > 0) { + uv_buf_t blankbuf; + int nread; + struct iovec *old; + + blankbuf.base = 0; + blankbuf.len = 0; + old = msg.msg_iov; + msg.msg_iov = (struct iovec*) &blankbuf; + nread = 0; + do { + nread = uv__recvmsg(uv__stream_fd(stream), &msg, 0); + err = uv__stream_recv_cmsg(stream, &msg); + if (err != 0) { + stream->read_cb(stream, err, &buf); + msg.msg_iov = old; + return; + } + } while (nread == 0 && msg.msg_controllen > 0); + msg.msg_iov = old; + } +#endif + stream->read_cb(stream, nread, &buf); + + /* Return if we didn't fill the buffer, there is no more data to read. */ + if (nread < buflen) { + stream->flags |= UV_STREAM_READ_PARTIAL; + return; + } + } + } +} + + +#ifdef __clang__ +# pragma clang diagnostic pop +#endif + +#undef UV__CMSG_FD_COUNT +#undef UV__CMSG_FD_SIZE + + +int uv_shutdown(uv_shutdown_t* req, uv_stream_t* stream, uv_shutdown_cb cb) { + assert((stream->type == UV_TCP || stream->type == UV_NAMED_PIPE) && + "uv_shutdown (unix) only supports uv_handle_t right now"); + + if (!(stream->flags & UV_STREAM_WRITABLE) || + stream->flags & UV_STREAM_SHUT || + stream->flags & UV_STREAM_SHUTTING || + uv__is_closing(stream)) { + return -ENOTCONN; + } + + assert(uv__stream_fd(stream) >= 0); + + /* Initialize request */ + uv__req_init(stream->loop, req, UV_SHUTDOWN); + req->handle = stream; + req->cb = cb; + stream->shutdown_req = req; + stream->flags |= UV_STREAM_SHUTTING; + + uv__io_start(stream->loop, &stream->io_watcher, POLLOUT); + uv__stream_osx_interrupt_select(stream); + + return 0; +} + + +static void uv__stream_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { + uv_stream_t* stream; + + stream = container_of(w, uv_stream_t, io_watcher); + + assert(stream->type == UV_TCP || + stream->type == UV_NAMED_PIPE || + stream->type == UV_TTY); + assert(!(stream->flags & UV_CLOSING)); + + if (stream->connect_req) { + uv__stream_connect(stream); + return; + } + + assert(uv__stream_fd(stream) >= 0); + + /* Ignore POLLHUP here. Even it it's set, there may still be data to read. */ + if (events & (POLLIN | POLLERR | POLLHUP)) + uv__read(stream); + + if (uv__stream_fd(stream) == -1) + return; /* read_cb closed stream. */ + + /* Short-circuit iff POLLHUP is set, the user is still interested in read + * events and uv__read() reported a partial read but not EOF. If the EOF + * flag is set, uv__read() called read_cb with err=UV_EOF and we don't + * have to do anything. If the partial read flag is not set, we can't + * report the EOF yet because there is still data to read. + */ + if ((events & POLLHUP) && + (stream->flags & UV_STREAM_READING) && + (stream->flags & UV_STREAM_READ_PARTIAL) && + !(stream->flags & UV_STREAM_READ_EOF)) { + uv_buf_t buf = { NULL, 0 }; + uv__stream_eof(stream, &buf); + } + + if (uv__stream_fd(stream) == -1) + return; /* read_cb closed stream. */ + + if (events & (POLLOUT | POLLERR | POLLHUP)) { + uv__write(stream); + uv__write_callbacks(stream); + + /* Write queue drained. */ + if (QUEUE_EMPTY(&stream->write_queue)) + uv__drain(stream); + } +} + + +/** + * We get called here from directly following a call to connect(2). + * In order to determine if we've errored out or succeeded must call + * getsockopt. + */ +static void uv__stream_connect(uv_stream_t* stream) { + int error; + uv_connect_t* req = stream->connect_req; + socklen_t errorsize = sizeof(int); + + assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE); + assert(req); + + if (stream->delayed_error) { + /* To smooth over the differences between unixes errors that + * were reported synchronously on the first connect can be delayed + * until the next tick--which is now. + */ + error = stream->delayed_error; + stream->delayed_error = 0; + } else { + /* Normal situation: we need to get the socket error from the kernel. */ + assert(uv__stream_fd(stream) >= 0); + getsockopt(uv__stream_fd(stream), + SOL_SOCKET, + SO_ERROR, + &error, + &errorsize); + error = -error; + } + + if (error == -EINPROGRESS) + return; + + stream->connect_req = NULL; + uv__req_unregister(stream->loop, req); + + if (error < 0 || QUEUE_EMPTY(&stream->write_queue)) { + uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT); + } + + if (req->cb) + req->cb(req, error); + + if (uv__stream_fd(stream) == -1) + return; + + if (error < 0) { + uv__stream_flush_write_queue(stream, -ECANCELED); + uv__write_callbacks(stream); + } +} + + +int uv_write2(uv_write_t* req, + uv_stream_t* stream, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_stream_t* send_handle, + uv_write_cb cb) { + int empty_queue; + + assert(nbufs > 0); + assert((stream->type == UV_TCP || + stream->type == UV_NAMED_PIPE || + stream->type == UV_TTY) && + "uv_write (unix) does not yet support other types of streams"); + + if (uv__stream_fd(stream) < 0) + return -EBADF; + + if (send_handle) { + if (stream->type != UV_NAMED_PIPE || !((uv_pipe_t*)stream)->ipc) + return -EINVAL; + + /* XXX We abuse uv_write2() to send over UDP handles to child processes. + * Don't call uv__stream_fd() on those handles, it's a macro that on OS X + * evaluates to a function that operates on a uv_stream_t with a couple of + * OS X specific fields. On other Unices it does (handle)->io_watcher.fd, + * which works but only by accident. + */ + if (uv__handle_fd((uv_handle_t*) send_handle) < 0) + return -EBADF; + +#if defined(__CYGWIN__) || defined(__MSYS__) + /* Cygwin recvmsg always sets msg_controllen to zero, so we cannot send it. + See https://github.com/mirror/newlib-cygwin/blob/86fc4bf0/winsup/cygwin/fhandler_socket.cc#L1736-L1743 */ + return -ENOSYS; +#endif + } + + /* It's legal for write_queue_size > 0 even when the write_queue is empty; + * it means there are error-state requests in the write_completed_queue that + * will touch up write_queue_size later, see also uv__write_req_finish(). + * We could check that write_queue is empty instead but that implies making + * a write() syscall when we know that the handle is in error mode. + */ + empty_queue = (stream->write_queue_size == 0); + + /* Initialize the req */ + uv__req_init(stream->loop, req, UV_WRITE); + req->cb = cb; + req->handle = stream; + req->error = 0; + req->send_handle = send_handle; + QUEUE_INIT(&req->queue); + + req->bufs = req->bufsml; + if (nbufs > ARRAY_SIZE(req->bufsml)) + req->bufs = uv__malloc(nbufs * sizeof(bufs[0])); + + if (req->bufs == NULL) + return -ENOMEM; + + memcpy(req->bufs, bufs, nbufs * sizeof(bufs[0])); + req->nbufs = nbufs; + req->write_index = 0; + stream->write_queue_size += uv__count_bufs(bufs, nbufs); + + /* Append the request to write_queue. */ + QUEUE_INSERT_TAIL(&stream->write_queue, &req->queue); + + /* If the queue was empty when this function began, we should attempt to + * do the write immediately. Otherwise start the write_watcher and wait + * for the fd to become writable. + */ + if (stream->connect_req) { + /* Still connecting, do nothing. */ + } + else if (empty_queue) { + uv__write(stream); + } + else { + /* + * blocking streams should never have anything in the queue. + * if this assert fires then somehow the blocking stream isn't being + * sufficiently flushed in uv__write. + */ + assert(!(stream->flags & UV_STREAM_BLOCKING)); + uv__io_start(stream->loop, &stream->io_watcher, POLLOUT); + uv__stream_osx_interrupt_select(stream); + } + + return 0; +} + + +/* The buffers to be written must remain valid until the callback is called. + * This is not required for the uv_buf_t array. + */ +int uv_write(uv_write_t* req, + uv_stream_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_write_cb cb) { + return uv_write2(req, handle, bufs, nbufs, NULL, cb); +} + + +void uv_try_write_cb(uv_write_t* req, int status) { + /* Should not be called */ + abort(); +} + + +int uv_try_write(uv_stream_t* stream, + const uv_buf_t bufs[], + unsigned int nbufs) { + int r; + int has_pollout; + size_t written; + size_t req_size; + uv_write_t req; + + /* Connecting or already writing some data */ + if (stream->connect_req != NULL || stream->write_queue_size != 0) + return -EAGAIN; + + has_pollout = uv__io_active(&stream->io_watcher, POLLOUT); + + r = uv_write(&req, stream, bufs, nbufs, uv_try_write_cb); + if (r != 0) + return r; + + /* Remove not written bytes from write queue size */ + written = uv__count_bufs(bufs, nbufs); + if (req.bufs != NULL) + req_size = uv__write_req_size(&req); + else + req_size = 0; + written -= req_size; + stream->write_queue_size -= req_size; + + /* Unqueue request, regardless of immediateness */ + QUEUE_REMOVE(&req.queue); + uv__req_unregister(stream->loop, &req); + if (req.bufs != req.bufsml) + uv__free(req.bufs); + req.bufs = NULL; + + /* Do not poll for writable, if we wasn't before calling this */ + if (!has_pollout) { + uv__io_stop(stream->loop, &stream->io_watcher, POLLOUT); + uv__stream_osx_interrupt_select(stream); + } + + if (written == 0 && req_size != 0) + return -EAGAIN; + else + return written; +} + + +int uv_read_start(uv_stream_t* stream, + uv_alloc_cb alloc_cb, + uv_read_cb read_cb) { + assert(stream->type == UV_TCP || stream->type == UV_NAMED_PIPE || + stream->type == UV_TTY); + + if (stream->flags & UV_CLOSING) + return -EINVAL; + + /* The UV_STREAM_READING flag is irrelevant of the state of the tcp - it just + * expresses the desired state of the user. + */ + stream->flags |= UV_STREAM_READING; + + /* TODO: try to do the read inline? */ + /* TODO: keep track of tcp state. If we've gotten a EOF then we should + * not start the IO watcher. + */ + assert(uv__stream_fd(stream) >= 0); + assert(alloc_cb); + + stream->read_cb = read_cb; + stream->alloc_cb = alloc_cb; + + uv__io_start(stream->loop, &stream->io_watcher, POLLIN); + uv__handle_start(stream); + uv__stream_osx_interrupt_select(stream); + + return 0; +} + + +int uv_read_stop(uv_stream_t* stream) { + if (!(stream->flags & UV_STREAM_READING)) + return 0; + + stream->flags &= ~UV_STREAM_READING; + uv__io_stop(stream->loop, &stream->io_watcher, POLLIN); + if (!uv__io_active(&stream->io_watcher, POLLOUT)) + uv__handle_stop(stream); + uv__stream_osx_interrupt_select(stream); + + stream->read_cb = NULL; + stream->alloc_cb = NULL; + return 0; +} + + +int uv_is_readable(const uv_stream_t* stream) { + return !!(stream->flags & UV_STREAM_READABLE); +} + + +int uv_is_writable(const uv_stream_t* stream) { + return !!(stream->flags & UV_STREAM_WRITABLE); +} + + +#if defined(__APPLE__) +int uv___stream_fd(const uv_stream_t* handle) { + const uv__stream_select_t* s; + + assert(handle->type == UV_TCP || + handle->type == UV_TTY || + handle->type == UV_NAMED_PIPE); + + s = handle->select; + if (s != NULL) + return s->fd; + + return handle->io_watcher.fd; +} +#endif /* defined(__APPLE__) */ + + +void uv__stream_close(uv_stream_t* handle) { + unsigned int i; + uv__stream_queued_fds_t* queued_fds; + +#if defined(__APPLE__) + /* Terminate select loop first */ + if (handle->select != NULL) { + uv__stream_select_t* s; + + s = handle->select; + + uv_sem_post(&s->close_sem); + uv_sem_post(&s->async_sem); + uv__stream_osx_interrupt_select(handle); + uv_thread_join(&s->thread); + uv_sem_destroy(&s->close_sem); + uv_sem_destroy(&s->async_sem); + uv__close(s->fake_fd); + uv__close(s->int_fd); + uv_close((uv_handle_t*) &s->async, uv__stream_osx_cb_close); + + handle->select = NULL; + } +#endif /* defined(__APPLE__) */ + + uv__io_close(handle->loop, &handle->io_watcher); + uv_read_stop(handle); + uv__handle_stop(handle); + + if (handle->io_watcher.fd != -1) { + /* Don't close stdio file descriptors. Nothing good comes from it. */ + if (handle->io_watcher.fd > STDERR_FILENO) + uv__close(handle->io_watcher.fd); + handle->io_watcher.fd = -1; + } + + if (handle->accepted_fd != -1) { + uv__close(handle->accepted_fd); + handle->accepted_fd = -1; + } + + /* Close all queued fds */ + if (handle->queued_fds != NULL) { + queued_fds = handle->queued_fds; + for (i = 0; i < queued_fds->offset; i++) + uv__close(queued_fds->fds[i]); + uv__free(handle->queued_fds); + handle->queued_fds = NULL; + } + + assert(!uv__io_active(&handle->io_watcher, POLLIN | POLLOUT)); +} + + +int uv_stream_set_blocking(uv_stream_t* handle, int blocking) { + /* Don't need to check the file descriptor, uv__nonblock() + * will fail with EBADF if it's not valid. + */ + return uv__nonblock(uv__stream_fd(handle), !blocking); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/sunos.c b/lib/ESPiLight/pilight/libs/libuv/unix/sunos.c new file mode 100644 index 0000000..2dc02ae --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/sunos.c @@ -0,0 +1,821 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include +#include +#include +#include + +#ifndef SUNOS_NO_IFADDRS +# include +#endif +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#define PORT_FIRED 0x69 +#define PORT_UNUSED 0x0 +#define PORT_LOADED 0x99 +#define PORT_DELETED -1 + +#if (!defined(_LP64)) && (_FILE_OFFSET_BITS - 0 == 64) +#define PROCFS_FILE_OFFSET_BITS_HACK 1 +#undef _FILE_OFFSET_BITS +#else +#define PROCFS_FILE_OFFSET_BITS_HACK 0 +#endif + +#include + +#if (PROCFS_FILE_OFFSET_BITS_HACK - 0 == 1) +#define _FILE_OFFSET_BITS 64 +#endif + + +int uv__platform_loop_init(uv_loop_t* loop) { + int err; + int fd; + + loop->fs_fd = -1; + loop->backend_fd = -1; + + fd = port_create(); + if (fd == -1) + return -errno; + + err = uv__cloexec(fd, 1); + if (err) { + uv__close(fd); + return err; + } + loop->backend_fd = fd; + + return 0; +} + + +void uv__platform_loop_delete(uv_loop_t* loop) { + if (loop->fs_fd != -1) { + uv__close(loop->fs_fd); + loop->fs_fd = -1; + } + + if (loop->backend_fd != -1) { + uv__close(loop->backend_fd); + loop->backend_fd = -1; + } +} + + +int uv__io_fork(uv_loop_t* loop) { +#if defined(PORT_SOURCE_FILE) + if (loop->fs_fd != -1) { + /* stop the watcher before we blow away its fileno */ + uv__io_stop(loop, &loop->fs_event_watcher, POLLIN); + } +#endif + uv__platform_loop_delete(loop); + return uv__platform_loop_init(loop); +} + + +void uv__platform_invalidate_fd(uv_loop_t* loop, int fd) { + struct port_event* events; + uintptr_t i; + uintptr_t nfds; + + assert(loop->watchers != NULL); + + events = (struct port_event*) loop->watchers[loop->nwatchers]; + nfds = (uintptr_t) loop->watchers[loop->nwatchers + 1]; + if (events == NULL) + return; + + /* Invalidate events with same file descriptor */ + for (i = 0; i < nfds; i++) + if ((int) events[i].portev_object == fd) + events[i].portev_object = -1; +} + + +int uv__io_check_fd(uv_loop_t* loop, int fd) { + if (port_associate(loop->backend_fd, PORT_SOURCE_FD, fd, POLLIN, 0)) + return -errno; + + if (port_dissociate(loop->backend_fd, PORT_SOURCE_FD, fd)) + abort(); + + return 0; +} + + +void uv__io_poll(uv_loop_t* loop, int timeout) { + struct port_event events[1024]; + struct port_event* pe; + struct timespec spec; + QUEUE* q; + uv__io_t* w; + sigset_t* pset; + sigset_t set; + uint64_t base; + uint64_t diff; + unsigned int nfds; + unsigned int i; + int saved_errno; + int have_signals; + int nevents; + int count; + int err; + int fd; + + if (loop->nfds == 0) { + assert(QUEUE_EMPTY(&loop->watcher_queue)); + return; + } + + while (!QUEUE_EMPTY(&loop->watcher_queue)) { + q = QUEUE_HEAD(&loop->watcher_queue); + QUEUE_REMOVE(q); + QUEUE_INIT(q); + + w = QUEUE_DATA(q, uv__io_t, watcher_queue); + assert(w->pevents != 0); + + if (port_associate(loop->backend_fd, PORT_SOURCE_FD, w->fd, w->pevents, 0)) + abort(); + + w->events = w->pevents; + } + + pset = NULL; + if (loop->flags & UV_LOOP_BLOCK_SIGPROF) { + pset = &set; + sigemptyset(pset); + sigaddset(pset, SIGPROF); + } + + assert(timeout >= -1); + base = loop->time; + count = 48; /* Benchmarks suggest this gives the best throughput. */ + + for (;;) { + if (timeout != -1) { + spec.tv_sec = timeout / 1000; + spec.tv_nsec = (timeout % 1000) * 1000000; + } + + /* Work around a kernel bug where nfds is not updated. */ + events[0].portev_source = 0; + + nfds = 1; + saved_errno = 0; + + if (pset != NULL) + pthread_sigmask(SIG_BLOCK, pset, NULL); + + err = port_getn(loop->backend_fd, + events, + ARRAY_SIZE(events), + &nfds, + timeout == -1 ? NULL : &spec); + + if (pset != NULL) + pthread_sigmask(SIG_UNBLOCK, pset, NULL); + + if (err) { + /* Work around another kernel bug: port_getn() may return events even + * on error. + */ + if (errno == EINTR || errno == ETIME) + saved_errno = errno; + else + abort(); + } + + /* Update loop->time unconditionally. It's tempting to skip the update when + * timeout == 0 (i.e. non-blocking poll) but there is no guarantee that the + * operating system didn't reschedule our process while in the syscall. + */ + SAVE_ERRNO(uv__update_time(loop)); + + if (events[0].portev_source == 0) { + if (timeout == 0) + return; + + if (timeout == -1) + continue; + + goto update_timeout; + } + + if (nfds == 0) { + assert(timeout != -1); + return; + } + + have_signals = 0; + nevents = 0; + + assert(loop->watchers != NULL); + loop->watchers[loop->nwatchers] = (void*) events; + loop->watchers[loop->nwatchers + 1] = (void*) (uintptr_t) nfds; + for (i = 0; i < nfds; i++) { + pe = events + i; + fd = pe->portev_object; + + /* Skip invalidated events, see uv__platform_invalidate_fd */ + if (fd == -1) + continue; + + assert(fd >= 0); + assert((unsigned) fd < loop->nwatchers); + + w = loop->watchers[fd]; + + /* File descriptor that we've stopped watching, ignore. */ + if (w == NULL) + continue; + + /* Run signal watchers last. This also affects child process watchers + * because those are implemented in terms of signal watchers. + */ + if (w == &loop->signal_io_watcher) + have_signals = 1; + else + w->cb(loop, w, pe->portev_events); + + nevents++; + + if (w != loop->watchers[fd]) + continue; /* Disabled by callback. */ + + /* Events Ports operates in oneshot mode, rearm timer on next run. */ + if (w->pevents != 0 && QUEUE_EMPTY(&w->watcher_queue)) + QUEUE_INSERT_TAIL(&loop->watcher_queue, &w->watcher_queue); + } + + if (have_signals != 0) + loop->signal_io_watcher.cb(loop, &loop->signal_io_watcher, POLLIN); + + loop->watchers[loop->nwatchers] = NULL; + loop->watchers[loop->nwatchers + 1] = NULL; + + if (have_signals != 0) + return; /* Event loop should cycle now so don't poll again. */ + + if (nevents != 0) { + if (nfds == ARRAY_SIZE(events) && --count != 0) { + /* Poll for more events but don't block this time. */ + timeout = 0; + continue; + } + return; + } + + if (saved_errno == ETIME) { + assert(timeout != -1); + return; + } + + if (timeout == 0) + return; + + if (timeout == -1) + continue; + +update_timeout: + assert(timeout > 0); + + diff = loop->time - base; + if (diff >= (uint64_t) timeout) + return; + + timeout -= diff; + } +} + + +uint64_t uv__hrtime(uv_clocktype_t type) { + return gethrtime(); +} + + +/* + * We could use a static buffer for the path manipulations that we need outside + * of the function, but this function could be called by multiple consumers and + * we don't want to potentially create a race condition in the use of snprintf. + */ +int uv_exepath(char* buffer, size_t* size) { + ssize_t res; + char buf[128]; + + if (buffer == NULL || size == NULL || *size == 0) + return -EINVAL; + + snprintf(buf, sizeof(buf), "/proc/%lu/path/a.out", (unsigned long) getpid()); + + res = *size - 1; + if (res > 0) + res = readlink(buf, buffer, res); + + if (res == -1) + return -errno; + + buffer[res] = '\0'; + *size = res; + return 0; +} + + +uint64_t uv_get_free_memory(void) { + return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_AVPHYS_PAGES); +} + + +uint64_t uv_get_total_memory(void) { + return (uint64_t) sysconf(_SC_PAGESIZE) * sysconf(_SC_PHYS_PAGES); +} + + +void uv_loadavg(double avg[3]) { + (void) getloadavg(avg, 3); +} + + +#if defined(PORT_SOURCE_FILE) + +static int uv__fs_event_rearm(uv_fs_event_t *handle) { + if (handle->fd == -1) + return -EBADF; + + if (port_associate(handle->loop->fs_fd, + PORT_SOURCE_FILE, + (uintptr_t) &handle->fo, + FILE_ATTRIB | FILE_MODIFIED, + handle) == -1) { + return -errno; + } + handle->fd = PORT_LOADED; + + return 0; +} + + +static void uv__fs_event_read(uv_loop_t* loop, + uv__io_t* w, + unsigned int revents) { + uv_fs_event_t *handle = NULL; + timespec_t timeout; + port_event_t pe; + int events; + int r; + + (void) w; + (void) revents; + + do { + uint_t n = 1; + + /* + * Note that our use of port_getn() here (and not port_get()) is deliberate: + * there is a bug in event ports (Sun bug 6456558) whereby a zeroed timeout + * causes port_get() to return success instead of ETIME when there aren't + * actually any events (!); by using port_getn() in lieu of port_get(), + * we can at least workaround the bug by checking for zero returned events + * and treating it as we would ETIME. + */ + do { + memset(&timeout, 0, sizeof timeout); + r = port_getn(loop->fs_fd, &pe, 1, &n, &timeout); + } + while (r == -1 && errno == EINTR); + + if ((r == -1 && errno == ETIME) || n == 0) + break; + + handle = (uv_fs_event_t*) pe.portev_user; + assert((r == 0) && "unexpected port_get() error"); + + events = 0; + if (pe.portev_events & (FILE_ATTRIB | FILE_MODIFIED)) + events |= UV_CHANGE; + if (pe.portev_events & ~(FILE_ATTRIB | FILE_MODIFIED)) + events |= UV_RENAME; + assert(events != 0); + handle->fd = PORT_FIRED; + handle->cb(handle, NULL, events, 0); + + if (handle->fd != PORT_DELETED) { + r = uv__fs_event_rearm(handle); + if (r != 0) + handle->cb(handle, NULL, 0, r); + } + } + while (handle->fd != PORT_DELETED); +} + + +int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { + uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); + return 0; +} + + +int uv_fs_event_start(uv_fs_event_t* handle, + uv_fs_event_cb cb, + const char* path, + unsigned int flags) { + int portfd; + int first_run; + int err; + + if (uv__is_active(handle)) + return -EINVAL; + + first_run = 0; + if (handle->loop->fs_fd == -1) { + portfd = port_create(); + if (portfd == -1) + return -errno; + handle->loop->fs_fd = portfd; + first_run = 1; + } + + uv__handle_start(handle); + handle->path = uv__strdup(path); + handle->fd = PORT_UNUSED; + handle->cb = cb; + + memset(&handle->fo, 0, sizeof handle->fo); + handle->fo.fo_name = handle->path; + err = uv__fs_event_rearm(handle); + if (err != 0) { + uv_fs_event_stop(handle); + return err; + } + + if (first_run) { + uv__io_init(&handle->loop->fs_event_watcher, uv__fs_event_read, portfd); + uv__io_start(handle->loop, &handle->loop->fs_event_watcher, POLLIN); + } + + return 0; +} + + +int uv_fs_event_stop(uv_fs_event_t* handle) { + if (!uv__is_active(handle)) + return 0; + + if (handle->fd == PORT_FIRED || handle->fd == PORT_LOADED) { + port_dissociate(handle->loop->fs_fd, + PORT_SOURCE_FILE, + (uintptr_t) &handle->fo); + } + + handle->fd = PORT_DELETED; + uv__free(handle->path); + handle->path = NULL; + handle->fo.fo_name = NULL; + uv__handle_stop(handle); + + return 0; +} + +void uv__fs_event_close(uv_fs_event_t* handle) { + uv_fs_event_stop(handle); +} + +#else /* !defined(PORT_SOURCE_FILE) */ + +int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { + return -ENOSYS; +} + + +int uv_fs_event_start(uv_fs_event_t* handle, + uv_fs_event_cb cb, + const char* filename, + unsigned int flags) { + return -ENOSYS; +} + + +int uv_fs_event_stop(uv_fs_event_t* handle) { + return -ENOSYS; +} + + +void uv__fs_event_close(uv_fs_event_t* handle) { + UNREACHABLE(); +} + +#endif /* defined(PORT_SOURCE_FILE) */ + + +int uv_resident_set_memory(size_t* rss) { + psinfo_t psinfo; + int err; + int fd; + + fd = open("/proc/self/psinfo", O_RDONLY); + if (fd == -1) + return -errno; + + /* FIXME(bnoordhuis) Handle EINTR. */ + err = -EINVAL; + if (read(fd, &psinfo, sizeof(psinfo)) == sizeof(psinfo)) { + *rss = (size_t)psinfo.pr_rssize * 1024; + err = 0; + } + uv__close(fd); + + return err; +} + + +int uv_uptime(double* uptime) { + kstat_ctl_t *kc; + kstat_t *ksp; + kstat_named_t *knp; + + long hz = sysconf(_SC_CLK_TCK); + + kc = kstat_open(); + if (kc == NULL) + return -EPERM; + + ksp = kstat_lookup(kc, (char*) "unix", 0, (char*) "system_misc"); + if (kstat_read(kc, ksp, NULL) == -1) { + *uptime = -1; + } else { + knp = (kstat_named_t*) kstat_data_lookup(ksp, (char*) "clk_intr"); + *uptime = knp->value.ul / hz; + } + kstat_close(kc); + + return 0; +} + + +int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { + int lookup_instance; + kstat_ctl_t *kc; + kstat_t *ksp; + kstat_named_t *knp; + uv_cpu_info_t* cpu_info; + + kc = kstat_open(); + if (kc == NULL) + return -EPERM; + + /* Get count of cpus */ + lookup_instance = 0; + while ((ksp = kstat_lookup(kc, (char*) "cpu_info", lookup_instance, NULL))) { + lookup_instance++; + } + + *cpu_infos = uv__malloc(lookup_instance * sizeof(**cpu_infos)); + if (!(*cpu_infos)) { + kstat_close(kc); + return -ENOMEM; + } + + *count = lookup_instance; + + cpu_info = *cpu_infos; + lookup_instance = 0; + while ((ksp = kstat_lookup(kc, (char*) "cpu_info", lookup_instance, NULL))) { + if (kstat_read(kc, ksp, NULL) == -1) { + cpu_info->speed = 0; + cpu_info->model = NULL; + } else { + knp = kstat_data_lookup(ksp, (char*) "clock_MHz"); + assert(knp->data_type == KSTAT_DATA_INT32 || + knp->data_type == KSTAT_DATA_INT64); + cpu_info->speed = (knp->data_type == KSTAT_DATA_INT32) ? knp->value.i32 + : knp->value.i64; + + knp = kstat_data_lookup(ksp, (char*) "brand"); + assert(knp->data_type == KSTAT_DATA_STRING); + cpu_info->model = uv__strdup(KSTAT_NAMED_STR_PTR(knp)); + } + + lookup_instance++; + cpu_info++; + } + + cpu_info = *cpu_infos; + lookup_instance = 0; + for (;;) { + ksp = kstat_lookup(kc, (char*) "cpu", lookup_instance, (char*) "sys"); + + if (ksp == NULL) + break; + + if (kstat_read(kc, ksp, NULL) == -1) { + cpu_info->cpu_times.user = 0; + cpu_info->cpu_times.nice = 0; + cpu_info->cpu_times.sys = 0; + cpu_info->cpu_times.idle = 0; + cpu_info->cpu_times.irq = 0; + } else { + knp = kstat_data_lookup(ksp, (char*) "cpu_ticks_user"); + assert(knp->data_type == KSTAT_DATA_UINT64); + cpu_info->cpu_times.user = knp->value.ui64; + + knp = kstat_data_lookup(ksp, (char*) "cpu_ticks_kernel"); + assert(knp->data_type == KSTAT_DATA_UINT64); + cpu_info->cpu_times.sys = knp->value.ui64; + + knp = kstat_data_lookup(ksp, (char*) "cpu_ticks_idle"); + assert(knp->data_type == KSTAT_DATA_UINT64); + cpu_info->cpu_times.idle = knp->value.ui64; + + knp = kstat_data_lookup(ksp, (char*) "intr"); + assert(knp->data_type == KSTAT_DATA_UINT64); + cpu_info->cpu_times.irq = knp->value.ui64; + cpu_info->cpu_times.nice = 0; + } + + lookup_instance++; + cpu_info++; + } + + kstat_close(kc); + + return 0; +} + + +void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { + int i; + + for (i = 0; i < count; i++) { + uv__free(cpu_infos[i].model); + } + + uv__free(cpu_infos); +} + +#ifdef SUNOS_NO_IFADDRS +int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { + return -ENOSYS; +} +#else /* SUNOS_NO_IFADDRS */ +/* + * Inspired By: + * https://blogs.oracle.com/paulie/entry/retrieving_mac_address_in_solaris + * http://www.pauliesworld.org/project/getmac.c + */ +static int uv__set_phys_addr(uv_interface_address_t* address, + struct ifaddrs* ent) { + + struct sockaddr_dl* sa_addr; + int sockfd; + int i; + struct arpreq arpreq; + + /* This appears to only work as root */ + sa_addr = (struct sockaddr_dl*)(ent->ifa_addr); + memcpy(address->phys_addr, LLADDR(sa_addr), sizeof(address->phys_addr)); + for (i = 0; i < sizeof(address->phys_addr); i++) { + if (address->phys_addr[i] != 0) + return 0; + } + memset(&arpreq, 0, sizeof(arpreq)); + if (address->address.address4.sin_family == AF_INET) { + struct sockaddr_in* sin = ((struct sockaddr_in*)&arpreq.arp_pa); + sin->sin_addr.s_addr = address->address.address4.sin_addr.s_addr; + } else if (address->address.address4.sin_family == AF_INET6) { + struct sockaddr_in6* sin = ((struct sockaddr_in6*)&arpreq.arp_pa); + memcpy(sin->sin6_addr.s6_addr, + address->address.address6.sin6_addr.s6_addr, + sizeof(address->address.address6.sin6_addr.s6_addr)); + } else { + return 0; + } + + sockfd = socket(AF_INET, SOCK_DGRAM, 0); + if (sockfd < 0) + return -errno; + + if (ioctl(sockfd, SIOCGARP, (char*)&arpreq) == -1) { + uv__close(sockfd); + return -errno; + } + memcpy(address->phys_addr, arpreq.arp_ha.sa_data, sizeof(address->phys_addr)); + uv__close(sockfd); + return 0; +} + + +static int uv__ifaddr_exclude(struct ifaddrs *ent) { + if (!((ent->ifa_flags & IFF_UP) && (ent->ifa_flags & IFF_RUNNING))) + return 1; + if (ent->ifa_addr == NULL) + return 1; + if (ent->ifa_addr->sa_family == PF_PACKET) + return 1; + return 0; +} + +int uv_interface_addresses(uv_interface_address_t** addresses, int* count) { + uv_interface_address_t* address; + struct ifaddrs* addrs; + struct ifaddrs* ent; + int i; + + if (getifaddrs(&addrs)) + return -errno; + + *count = 0; + + /* Count the number of interfaces */ + for (ent = addrs; ent != NULL; ent = ent->ifa_next) { + if (uv__ifaddr_exclude(ent)) + continue; + (*count)++; + } + + *addresses = uv__malloc(*count * sizeof(**addresses)); + if (!(*addresses)) { + freeifaddrs(addrs); + return -ENOMEM; + } + + address = *addresses; + + for (ent = addrs; ent != NULL; ent = ent->ifa_next) { + if (uv__ifaddr_exclude(ent)) + continue; + + address->name = uv__strdup(ent->ifa_name); + + if (ent->ifa_addr->sa_family == AF_INET6) { + address->address.address6 = *((struct sockaddr_in6*) ent->ifa_addr); + } else { + address->address.address4 = *((struct sockaddr_in*) ent->ifa_addr); + } + + if (ent->ifa_netmask->sa_family == AF_INET6) { + address->netmask.netmask6 = *((struct sockaddr_in6*) ent->ifa_netmask); + } else { + address->netmask.netmask4 = *((struct sockaddr_in*) ent->ifa_netmask); + } + + address->is_internal = !!((ent->ifa_flags & IFF_PRIVATE) || + (ent->ifa_flags & IFF_LOOPBACK)); + + uv__set_phys_addr(address, ent); + address++; + } + + freeifaddrs(addrs); + + return 0; +} +#endif /* SUNOS_NO_IFADDRS */ + +void uv_free_interface_addresses(uv_interface_address_t* addresses, + int count) { + int i; + + for (i = 0; i < count; i++) { + uv__free(addresses[i].name); + } + + uv__free(addresses); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/sysinfo-loadavg.c b/lib/ESPiLight/pilight/libs/libuv/unix/sysinfo-loadavg.c new file mode 100644 index 0000000..ebad0e8 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/sysinfo-loadavg.c @@ -0,0 +1,36 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include + +void uv_loadavg(double avg[3]) { + struct sysinfo info; + + if (sysinfo(&info) < 0) return; + + avg[0] = (double) info.loads[0] / 65536.0; + avg[1] = (double) info.loads[1] / 65536.0; + avg[2] = (double) info.loads[2] / 65536.0; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/sysinfo-memory.c b/lib/ESPiLight/pilight/libs/libuv/unix/sysinfo-memory.c new file mode 100644 index 0000000..23b4fc6 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/sysinfo-memory.c @@ -0,0 +1,42 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include + +uint64_t uv_get_free_memory(void) { + struct sysinfo info; + + if (sysinfo(&info) == 0) + return (uint64_t) info.freeram * info.mem_unit; + return 0; +} + +uint64_t uv_get_total_memory(void) { + struct sysinfo info; + + if (sysinfo(&info) == 0) + return (uint64_t) info.totalram * info.mem_unit; + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/tcp.c b/lib/ESPiLight/pilight/libs/libuv/unix/tcp.c new file mode 100644 index 0000000..c423dcb --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/tcp.c @@ -0,0 +1,395 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include +#include + + +static int maybe_new_socket(uv_tcp_t* handle, int domain, int flags) { + int sockfd; + int err; + + if (domain == AF_UNSPEC || uv__stream_fd(handle) != -1) { + handle->flags |= flags; + return 0; + } + + err = uv__socket(domain, SOCK_STREAM, 0); + if (err < 0) + return err; + sockfd = err; + + err = uv__stream_open((uv_stream_t*) handle, sockfd, flags); + if (err) { + uv__close(sockfd); + return err; + } + + return 0; +} + + +int uv_tcp_init_ex(uv_loop_t* loop, uv_tcp_t* tcp, unsigned int flags) { + int domain; + + /* Use the lower 8 bits for the domain */ + domain = flags & 0xFF; + if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC) + return -EINVAL; + + if (flags & ~0xFF) + return -EINVAL; + + uv__stream_init(loop, (uv_stream_t*)tcp, UV_TCP); + + /* If anything fails beyond this point we need to remove the handle from + * the handle queue, since it was added by uv__handle_init in uv_stream_init. + */ + + if (domain != AF_UNSPEC) { + int err = maybe_new_socket(tcp, domain, 0); + if (err) { + QUEUE_REMOVE(&tcp->handle_queue); + return err; + } + } + + return 0; +} + + +int uv_tcp_init(uv_loop_t* loop, uv_tcp_t* tcp) { + return uv_tcp_init_ex(loop, tcp, AF_UNSPEC); +} + + +int uv__tcp_bind(uv_tcp_t* tcp, + const struct sockaddr* addr, + unsigned int addrlen, + unsigned int flags) { + int err; + int on; + + /* Cannot set IPv6-only mode on non-IPv6 socket. */ + if ((flags & UV_TCP_IPV6ONLY) && addr->sa_family != AF_INET6) + return -EINVAL; + + err = maybe_new_socket(tcp, + addr->sa_family, + UV_STREAM_READABLE | UV_STREAM_WRITABLE); + if (err) + return err; + + on = 1; + if (setsockopt(tcp->io_watcher.fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) + return -errno; + +#ifdef IPV6_V6ONLY + if (addr->sa_family == AF_INET6) { + on = (flags & UV_TCP_IPV6ONLY) != 0; + if (setsockopt(tcp->io_watcher.fd, + IPPROTO_IPV6, + IPV6_V6ONLY, + &on, + sizeof on) == -1) { +#if defined(__MVS__) + if (errno == EOPNOTSUPP) + return -EINVAL; +#endif + return -errno; + } + } +#endif + + errno = 0; + if (bind(tcp->io_watcher.fd, addr, addrlen) && errno != EADDRINUSE) { + if (errno == EAFNOSUPPORT) + /* OSX, other BSDs and SunoS fail with EAFNOSUPPORT when binding a + * socket created with AF_INET to an AF_INET6 address or vice versa. */ + return -EINVAL; + return -errno; + } + tcp->delayed_error = -errno; + + tcp->flags |= UV_HANDLE_BOUND; + if (addr->sa_family == AF_INET6) + tcp->flags |= UV_HANDLE_IPV6; + + return 0; +} + + +int uv__tcp_connect(uv_connect_t* req, + uv_tcp_t* handle, + const struct sockaddr* addr, + unsigned int addrlen, + uv_connect_cb cb) { + int err; + int r; + + assert(handle->type == UV_TCP); + + if (handle->connect_req != NULL) + return -EALREADY; /* FIXME(bnoordhuis) -EINVAL or maybe -EBUSY. */ + + err = maybe_new_socket(handle, + addr->sa_family, + UV_STREAM_READABLE | UV_STREAM_WRITABLE); + if (err) + return err; + + handle->delayed_error = 0; + + do { + errno = 0; + r = connect(uv__stream_fd(handle), addr, addrlen); + } while (r == -1 && errno == EINTR); + + /* We not only check the return value, but also check the errno != 0. + * Because in rare cases connect() will return -1 but the errno + * is 0 (for example, on Android 4.3, OnePlus phone A0001_12_150227) + * and actually the tcp three-way handshake is completed. + */ + if (r == -1 && errno != 0) { + if (errno == EINPROGRESS) + ; /* not an error */ + else if (errno == ECONNREFUSED) + /* If we get a ECONNREFUSED wait until the next tick to report the + * error. Solaris wants to report immediately--other unixes want to + * wait. + */ + handle->delayed_error = -errno; + else + return -errno; + } + + uv__req_init(handle->loop, req, UV_CONNECT); + req->cb = cb; + req->handle = (uv_stream_t*) handle; + QUEUE_INIT(&req->queue); + handle->connect_req = req; + + uv__io_start(handle->loop, &handle->io_watcher, POLLOUT); + + if (handle->delayed_error) + uv__io_feed(handle->loop, &handle->io_watcher); + + return 0; +} + + +int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock) { + int err; + + err = uv__nonblock(sock, 1); + if (err) + return err; + + return uv__stream_open((uv_stream_t*)handle, + sock, + UV_STREAM_READABLE | UV_STREAM_WRITABLE); +} + + +int uv_tcp_getsockname(const uv_tcp_t* handle, + struct sockaddr* name, + int* namelen) { + socklen_t socklen; + + if (handle->delayed_error) + return handle->delayed_error; + + if (uv__stream_fd(handle) < 0) + return -EINVAL; /* FIXME(bnoordhuis) -EBADF */ + + /* sizeof(socklen_t) != sizeof(int) on some systems. */ + socklen = (socklen_t) *namelen; + + if (getsockname(uv__stream_fd(handle), name, &socklen)) + return -errno; + + *namelen = (int) socklen; + return 0; +} + + +int uv_tcp_getpeername(const uv_tcp_t* handle, + struct sockaddr* name, + int* namelen) { + socklen_t socklen; + + if (handle->delayed_error) + return handle->delayed_error; + + if (uv__stream_fd(handle) < 0) + return -EINVAL; /* FIXME(bnoordhuis) -EBADF */ + + /* sizeof(socklen_t) != sizeof(int) on some systems. */ + socklen = (socklen_t) *namelen; + + if (getpeername(uv__stream_fd(handle), name, &socklen)) + return -errno; + + *namelen = (int) socklen; + return 0; +} + + +int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) { + static int single_accept = -1; + int err; + + if (tcp->delayed_error) + return tcp->delayed_error; + + if (single_accept == -1) { + const char* val = getenv("UV_TCP_SINGLE_ACCEPT"); + single_accept = (val != NULL && atoi(val) != 0); /* Off by default. */ + } + + if (single_accept) + tcp->flags |= UV_TCP_SINGLE_ACCEPT; + + err = maybe_new_socket(tcp, AF_INET, UV_STREAM_READABLE); + if (err) + return err; + +#ifdef __MVS__ + /* on zOS the listen call does not bind automatically + if the socket is unbound. Hence the manual binding to + an arbitrary port is required to be done manually + */ + + if (!(tcp->flags & UV_HANDLE_BOUND)) { + struct sockaddr_storage saddr; + socklen_t slen = sizeof(saddr); + memset(&saddr, 0, sizeof(saddr)); + + if (getsockname(tcp->io_watcher.fd, (struct sockaddr*) &saddr, &slen)) + return -errno; + + if (bind(tcp->io_watcher.fd, (struct sockaddr*) &saddr, slen)) + return -errno; + + tcp->flags |= UV_HANDLE_BOUND; + } +#endif + + if (listen(tcp->io_watcher.fd, backlog)) + return -errno; + + tcp->connection_cb = cb; + tcp->flags |= UV_HANDLE_BOUND; + + /* Start listening for connections. */ + tcp->io_watcher.cb = uv__server_io; + uv__io_start(tcp->loop, &tcp->io_watcher, POLLIN); + + return 0; +} + + +int uv__tcp_nodelay(int fd, int on) { + if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on))) + return -errno; + return 0; +} + + +int uv__tcp_keepalive(int fd, int on, unsigned int delay) { + if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on))) + return -errno; + +#ifdef TCP_KEEPIDLE + if (on && setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &delay, sizeof(delay))) + return -errno; +#endif + + /* Solaris/SmartOS, if you don't support keep-alive, + * then don't advertise it in your system headers... + */ + /* FIXME(bnoordhuis) That's possibly because sizeof(delay) should be 1. */ +#if defined(TCP_KEEPALIVE) && !defined(__sun) + if (on && setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, &delay, sizeof(delay))) + return -errno; +#endif + + return 0; +} + + +int uv_tcp_nodelay(uv_tcp_t* handle, int on) { + int err; + + if (uv__stream_fd(handle) != -1) { + err = uv__tcp_nodelay(uv__stream_fd(handle), on); + if (err) + return err; + } + + if (on) + handle->flags |= UV_TCP_NODELAY; + else + handle->flags &= ~UV_TCP_NODELAY; + + return 0; +} + + +int uv_tcp_keepalive(uv_tcp_t* handle, int on, unsigned int delay) { + int err; + + if (uv__stream_fd(handle) != -1) { + err =uv__tcp_keepalive(uv__stream_fd(handle), on, delay); + if (err) + return err; + } + + if (on) + handle->flags |= UV_TCP_KEEPALIVE; + else + handle->flags &= ~UV_TCP_KEEPALIVE; + + /* TODO Store delay if uv__stream_fd(handle) == -1 but don't want to enlarge + * uv_tcp_t with an int that's almost never used... + */ + + return 0; +} + + +int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable) { + if (enable) + handle->flags &= ~UV_TCP_SINGLE_ACCEPT; + else + handle->flags |= UV_TCP_SINGLE_ACCEPT; + return 0; +} + + +void uv__tcp_close(uv_tcp_t* handle) { + uv__stream_close((uv_stream_t*)handle); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/thread.c b/lib/ESPiLight/pilight/libs/libuv/unix/thread.c new file mode 100644 index 0000000..a9b5e4c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/thread.c @@ -0,0 +1,575 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include + +#include +#include /* getrlimit() */ +#include /* getpagesize() */ + +#include + +#ifdef __MVS__ +#include +#include +#endif + +#undef NANOSEC +#define NANOSEC ((uint64_t) 1e9) + + +int uv_thread_create(uv_thread_t *tid, void (*entry)(void *arg), void *arg) { + int err; + pthread_attr_t* attr; +#if defined(__APPLE__) + pthread_attr_t attr_storage; + struct rlimit lim; +#endif + + /* On OSX threads other than the main thread are created with a reduced stack + * size by default, adjust it to RLIMIT_STACK. + */ +#if defined(__APPLE__) + if (getrlimit(RLIMIT_STACK, &lim)) + abort(); + + attr = &attr_storage; + if (pthread_attr_init(attr)) + abort(); + + if (lim.rlim_cur != RLIM_INFINITY) { + /* pthread_attr_setstacksize() expects page-aligned values. */ + lim.rlim_cur -= lim.rlim_cur % (rlim_t) getpagesize(); + + if (lim.rlim_cur >= PTHREAD_STACK_MIN) + if (pthread_attr_setstacksize(attr, lim.rlim_cur)) + abort(); + } +#else + attr = NULL; +#endif + + err = pthread_create(tid, attr, (void*(*)(void*)) entry, arg); + + if (attr != NULL) + pthread_attr_destroy(attr); + + return -err; +} + + +uv_thread_t uv_thread_self(void) { + return pthread_self(); +} + +int uv_thread_join(uv_thread_t *tid) { + return -pthread_join(*tid, NULL); +} + + +int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2) { + return pthread_equal(*t1, *t2); +} + + +int uv_mutex_init(uv_mutex_t* mutex) { +#if defined(NDEBUG) || !defined(PTHREAD_MUTEX_ERRORCHECK) + return -pthread_mutex_init(mutex, NULL); +#else + pthread_mutexattr_t attr; + int err; + + if (pthread_mutexattr_init(&attr)) + abort(); + + if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK)) + abort(); + + err = pthread_mutex_init(mutex, &attr); + + if (pthread_mutexattr_destroy(&attr)) + abort(); + + return -err; +#endif +} + + +void uv_mutex_destroy(uv_mutex_t* mutex) { + if (pthread_mutex_destroy(mutex)) + abort(); +} + + +void uv_mutex_lock(uv_mutex_t* mutex) { + if (pthread_mutex_lock(mutex)) + abort(); +} + + +int uv_mutex_trylock(uv_mutex_t* mutex) { + int err; + + err = pthread_mutex_trylock(mutex); + if (err) { + if (err != EBUSY && err != EAGAIN) + abort(); + return -EBUSY; + } + + return 0; +} + + +void uv_mutex_unlock(uv_mutex_t* mutex) { + if (pthread_mutex_unlock(mutex)) + abort(); +} + + +int uv_rwlock_init(uv_rwlock_t* rwlock) { + return -pthread_rwlock_init(rwlock, NULL); +} + + +void uv_rwlock_destroy(uv_rwlock_t* rwlock) { + if (pthread_rwlock_destroy(rwlock)) + abort(); +} + + +void uv_rwlock_rdlock(uv_rwlock_t* rwlock) { + if (pthread_rwlock_rdlock(rwlock)) + abort(); +} + + +int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock) { + int err; + + err = pthread_rwlock_tryrdlock(rwlock); + if (err) { + if (err != EBUSY && err != EAGAIN) + abort(); + return -EBUSY; + } + + return 0; +} + + +void uv_rwlock_rdunlock(uv_rwlock_t* rwlock) { + if (pthread_rwlock_unlock(rwlock)) + abort(); +} + + +void uv_rwlock_wrlock(uv_rwlock_t* rwlock) { + if (pthread_rwlock_wrlock(rwlock)) + abort(); +} + + +int uv_rwlock_trywrlock(uv_rwlock_t* rwlock) { + int err; + + err = pthread_rwlock_trywrlock(rwlock); + if (err) { + if (err != EBUSY && err != EAGAIN) + abort(); + return -EBUSY; + } + + return 0; +} + + +void uv_rwlock_wrunlock(uv_rwlock_t* rwlock) { + if (pthread_rwlock_unlock(rwlock)) + abort(); +} + + +void uv_once(uv_once_t* guard, void (*callback)(void)) { + if (pthread_once(guard, callback)) + abort(); +} + +#if defined(__APPLE__) && defined(__MACH__) + +int uv_sem_init(uv_sem_t* sem, unsigned int value) { + kern_return_t err; + + err = semaphore_create(mach_task_self(), sem, SYNC_POLICY_FIFO, value); + if (err == KERN_SUCCESS) + return 0; + if (err == KERN_INVALID_ARGUMENT) + return -EINVAL; + if (err == KERN_RESOURCE_SHORTAGE) + return -ENOMEM; + + abort(); + return -EINVAL; /* Satisfy the compiler. */ +} + + +void uv_sem_destroy(uv_sem_t* sem) { + if (semaphore_destroy(mach_task_self(), *sem)) + abort(); +} + + +void uv_sem_post(uv_sem_t* sem) { + if (semaphore_signal(*sem)) + abort(); +} + + +void uv_sem_wait(uv_sem_t* sem) { + int r; + + do + r = semaphore_wait(*sem); + while (r == KERN_ABORTED); + + if (r != KERN_SUCCESS) + abort(); +} + + +int uv_sem_trywait(uv_sem_t* sem) { + mach_timespec_t interval; + kern_return_t err; + + interval.tv_sec = 0; + interval.tv_nsec = 0; + + err = semaphore_timedwait(*sem, interval); + if (err == KERN_SUCCESS) + return 0; + if (err == KERN_OPERATION_TIMED_OUT) + return -EAGAIN; + + abort(); + return -EINVAL; /* Satisfy the compiler. */ +} + +#elif defined(__MVS__) + +int uv_sem_init(uv_sem_t* sem, unsigned int value) { + uv_sem_t semid; + struct sembuf buf; + int err; + + buf.sem_num = 0; + buf.sem_op = value; + buf.sem_flg = 0; + + semid = semget(IPC_PRIVATE, 1, S_IRUSR | S_IWUSR); + if (semid == -1) + return -errno; + + if (-1 == semop(semid, &buf, 1)) { + err = errno; + if (-1 == semctl(*sem, 0, IPC_RMID)) + abort(); + return -err; + } + + *sem = semid; + return 0; +} + +void uv_sem_destroy(uv_sem_t* sem) { + if (-1 == semctl(*sem, 0, IPC_RMID)) + abort(); +} + +void uv_sem_post(uv_sem_t* sem) { + struct sembuf buf; + + buf.sem_num = 0; + buf.sem_op = 1; + buf.sem_flg = 0; + + if (-1 == semop(*sem, &buf, 1)) + abort(); +} + +void uv_sem_wait(uv_sem_t* sem) { + struct sembuf buf; + int op_status; + + buf.sem_num = 0; + buf.sem_op = -1; + buf.sem_flg = 0; + + do + op_status = semop(*sem, &buf, 1); + while (op_status == -1 && errno == EINTR); + + if (op_status) + abort(); +} + +int uv_sem_trywait(uv_sem_t* sem) { + struct sembuf buf; + int op_status; + + buf.sem_num = 0; + buf.sem_op = -1; + buf.sem_flg = IPC_NOWAIT; + + do + op_status = semop(*sem, &buf, 1); + while (op_status == -1 && errno == EINTR); + + if (op_status) { + if (errno == EAGAIN) + return -EAGAIN; + abort(); + } + + return 0; +} + +#else /* !(defined(__APPLE__) && defined(__MACH__)) */ + +int uv_sem_init(uv_sem_t* sem, unsigned int value) { + if (sem_init(sem, 0, value)) + return -errno; + return 0; +} + + +void uv_sem_destroy(uv_sem_t* sem) { + if (sem_destroy(sem)) + abort(); +} + + +void uv_sem_post(uv_sem_t* sem) { + if (sem_post(sem)) + abort(); +} + + +void uv_sem_wait(uv_sem_t* sem) { + int r; + + do + r = sem_wait(sem); + while (r == -1 && errno == EINTR); + + if (r) + abort(); +} + + +int uv_sem_trywait(uv_sem_t* sem) { + int r; + + do + r = sem_trywait(sem); + while (r == -1 && errno == EINTR); + + if (r) { + if (errno == EAGAIN) + return -EAGAIN; + abort(); + } + + return 0; +} + +#endif /* defined(__APPLE__) && defined(__MACH__) */ + + +#if defined(__APPLE__) && defined(__MACH__) || defined(__MVS__) + +int uv_cond_init(uv_cond_t* cond) { + return -pthread_cond_init(cond, NULL); +} + +#else /* !(defined(__APPLE__) && defined(__MACH__)) */ + +int uv_cond_init(uv_cond_t* cond) { + pthread_condattr_t attr; + int err; + + err = pthread_condattr_init(&attr); + if (err) + return -err; + +#if !(defined(__ANDROID__) && defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC)) + err = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); + if (err) + goto error2; +#endif + + err = pthread_cond_init(cond, &attr); + if (err) + goto error2; + + err = pthread_condattr_destroy(&attr); + if (err) + goto error; + + return 0; + +error: + pthread_cond_destroy(cond); +error2: + pthread_condattr_destroy(&attr); + return -err; +} + +#endif /* defined(__APPLE__) && defined(__MACH__) */ + +void uv_cond_destroy(uv_cond_t* cond) { +#if defined(__APPLE__) && defined(__MACH__) + /* It has been reported that destroying condition variables that have been + * signalled but not waited on can sometimes result in application crashes. + * See https://codereview.chromium.org/1323293005. + */ + pthread_mutex_t mutex; + struct timespec ts; + int err; + + if (pthread_mutex_init(&mutex, NULL)) + abort(); + + if (pthread_mutex_lock(&mutex)) + abort(); + + ts.tv_sec = 0; + ts.tv_nsec = 1; + + err = pthread_cond_timedwait_relative_np(cond, &mutex, &ts); + if (err != 0 && err != ETIMEDOUT) + abort(); + + if (pthread_mutex_unlock(&mutex)) + abort(); + + if (pthread_mutex_destroy(&mutex)) + abort(); +#endif /* defined(__APPLE__) && defined(__MACH__) */ + + if (pthread_cond_destroy(cond)) + abort(); +} + +void uv_cond_signal(uv_cond_t* cond) { + if (pthread_cond_signal(cond)) + abort(); +} + +void uv_cond_broadcast(uv_cond_t* cond) { + if (pthread_cond_broadcast(cond)) + abort(); +} + +void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex) { + if (pthread_cond_wait(cond, mutex)) + abort(); +} + + +int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, uint64_t timeout) { + int r; + struct timespec ts; + +#if defined(__APPLE__) && defined(__MACH__) + ts.tv_sec = timeout / NANOSEC; + ts.tv_nsec = timeout % NANOSEC; + r = pthread_cond_timedwait_relative_np(cond, mutex, &ts); +#else + timeout += uv__hrtime(UV_CLOCK_PRECISE); + ts.tv_sec = timeout / NANOSEC; + ts.tv_nsec = timeout % NANOSEC; +#if defined(__ANDROID__) && defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC) + /* + * The bionic pthread implementation doesn't support CLOCK_MONOTONIC, + * but has this alternative function instead. + */ + r = pthread_cond_timedwait_monotonic_np(cond, mutex, &ts); +#else + r = pthread_cond_timedwait(cond, mutex, &ts); +#endif /* __ANDROID__ */ +#endif + + + if (r == 0) + return 0; + + if (r == ETIMEDOUT) + return -ETIMEDOUT; + + abort(); + return -EINVAL; /* Satisfy the compiler. */ +} + + +int uv_barrier_init(uv_barrier_t* barrier, unsigned int count) { + return -pthread_barrier_init(barrier, NULL, count); +} + + +void uv_barrier_destroy(uv_barrier_t* barrier) { + if (pthread_barrier_destroy(barrier)) + abort(); +} + + +int uv_barrier_wait(uv_barrier_t* barrier) { + int r = pthread_barrier_wait(barrier); + if (r && r != PTHREAD_BARRIER_SERIAL_THREAD) + abort(); + return r == PTHREAD_BARRIER_SERIAL_THREAD; +} + + +int uv_key_create(uv_key_t* key) { + return -pthread_key_create(key, NULL); +} + + +void uv_key_delete(uv_key_t* key) { + if (pthread_key_delete(*key)) + abort(); +} + + +void* uv_key_get(uv_key_t* key) { + return pthread_getspecific(*key); +} + + +void uv_key_set(uv_key_t* key, void* value) { + if (pthread_setspecific(*key, value)) + abort(); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/timer.c b/lib/ESPiLight/pilight/libs/libuv/unix/timer.c new file mode 100644 index 0000000..f46bdf4 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/timer.c @@ -0,0 +1,172 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" +#include "heap-inl.h" + +#include +#include + + +static int timer_less_than(const struct heap_node* ha, + const struct heap_node* hb) { + const uv_timer_t* a; + const uv_timer_t* b; + + a = container_of(ha, uv_timer_t, heap_node); + b = container_of(hb, uv_timer_t, heap_node); + + if (a->timeout < b->timeout) + return 1; + if (b->timeout < a->timeout) + return 0; + + /* Compare start_id when both have the same timeout. start_id is + * allocated with loop->timer_counter in uv_timer_start(). + */ + if (a->start_id < b->start_id) + return 1; + if (b->start_id < a->start_id) + return 0; + + return 0; +} + + +int uv_timer_init(uv_loop_t* loop, uv_timer_t* handle) { + uv__handle_init(loop, (uv_handle_t*)handle, UV_TIMER); + handle->timer_cb = NULL; + handle->repeat = 0; + return 0; +} + + +int uv_timer_start(uv_timer_t* handle, + uv_timer_cb cb, + uint64_t timeout, + uint64_t repeat) { + uint64_t clamped_timeout; + + if (cb == NULL) + return -EINVAL; + + if (uv__is_active(handle)) + uv_timer_stop(handle); + + clamped_timeout = handle->loop->time + timeout; + if (clamped_timeout < timeout) + clamped_timeout = (uint64_t) -1; + + handle->timer_cb = cb; + handle->timeout = clamped_timeout; + handle->repeat = repeat; + /* start_id is the second index to be compared in uv__timer_cmp() */ + handle->start_id = handle->loop->timer_counter++; + + heap_insert((struct heap*) &handle->loop->timer_heap, + (struct heap_node*) &handle->heap_node, + timer_less_than); + uv__handle_start(handle); + + return 0; +} + + +int uv_timer_stop(uv_timer_t* handle) { + if (!uv__is_active(handle)) + return 0; + + heap_remove((struct heap*) &handle->loop->timer_heap, + (struct heap_node*) &handle->heap_node, + timer_less_than); + uv__handle_stop(handle); + + return 0; +} + + +int uv_timer_again(uv_timer_t* handle) { + if (handle->timer_cb == NULL) + return -EINVAL; + + if (handle->repeat) { + uv_timer_stop(handle); + uv_timer_start(handle, handle->timer_cb, handle->repeat, handle->repeat); + } + + return 0; +} + + +void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat) { + handle->repeat = repeat; +} + + +uint64_t uv_timer_get_repeat(const uv_timer_t* handle) { + return handle->repeat; +} + + +int uv__next_timeout(const uv_loop_t* loop) { + const struct heap_node* heap_node; + const uv_timer_t* handle; + uint64_t diff; + + heap_node = heap_min((const struct heap*) &loop->timer_heap); + if (heap_node == NULL) + return -1; /* block indefinitely */ + + handle = container_of(heap_node, uv_timer_t, heap_node); + if (handle->timeout <= loop->time) + return 0; + + diff = handle->timeout - loop->time; + if (diff > INT_MAX) + diff = INT_MAX; + + return diff; +} + + +void uv__run_timers(uv_loop_t* loop) { + struct heap_node* heap_node; + uv_timer_t* handle; + + for (;;) { + heap_node = heap_min((struct heap*) &loop->timer_heap); + if (heap_node == NULL) + break; + + handle = container_of(heap_node, uv_timer_t, heap_node); + if (handle->timeout > loop->time) + break; + + uv_timer_stop(handle); + uv_timer_again(handle); + handle->timer_cb(handle); + } +} + + +void uv__timer_close(uv_timer_t* handle) { + uv_timer_stop(handle); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/tty.c b/lib/ESPiLight/pilight/libs/libuv/unix/tty.c new file mode 100644 index 0000000..b2d37f4 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/tty.c @@ -0,0 +1,336 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" +#include "spinlock.h" + +#include +#include +#include +#include +#include +#include + +#if defined(__MVS__) && !defined(IMAXBEL) +#define IMAXBEL 0 +#endif + +static int orig_termios_fd = -1; +static struct termios orig_termios; +static uv_spinlock_t termios_spinlock = UV_SPINLOCK_INITIALIZER; + +static int uv__tty_is_slave(const int fd) { + int result; +#if defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + int dummy; + + result = ioctl(fd, TIOCGPTN, &dummy) != 0; +#elif defined(__APPLE__) + char dummy[256]; + + result = ioctl(fd, TIOCPTYGNAME, &dummy) != 0; +#else + /* Fallback to ptsname + */ + result = ptsname(fd) == NULL; +#endif + return result; +} + +int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, int fd, int readable) { + uv_handle_type type; + int flags; + int newfd; + int r; + int saved_flags; + char path[256]; + + /* File descriptors that refer to files cannot be monitored with epoll. + * That restriction also applies to character devices like /dev/random + * (but obviously not /dev/tty.) + */ + type = uv_guess_handle(fd); + if (type == UV_FILE || type == UV_UNKNOWN_HANDLE) + return -EINVAL; + + flags = 0; + newfd = -1; + + /* Reopen the file descriptor when it refers to a tty. This lets us put the + * tty in non-blocking mode without affecting other processes that share it + * with us. + * + * Example: `node | cat` - if we put our fd 0 in non-blocking mode, it also + * affects fd 1 of `cat` because both file descriptors refer to the same + * struct file in the kernel. When we reopen our fd 0, it points to a + * different struct file, hence changing its properties doesn't affect + * other processes. + */ + if (type == UV_TTY) { + /* Reopening a pty in master mode won't work either because the reopened + * pty will be in slave mode (*BSD) or reopening will allocate a new + * master/slave pair (Linux). Therefore check if the fd points to a + * slave device. + */ + if (uv__tty_is_slave(fd) && ttyname_r(fd, path, sizeof(path)) == 0) + r = uv__open_cloexec(path, O_RDWR); + else + r = -1; + + if (r < 0) { + /* fallback to using blocking writes */ + if (!readable) + flags |= UV_STREAM_BLOCKING; + goto skip; + } + + newfd = r; + + r = uv__dup2_cloexec(newfd, fd); + if (r < 0 && r != -EINVAL) { + /* EINVAL means newfd == fd which could conceivably happen if another + * thread called close(fd) between our calls to isatty() and open(). + * That's a rather unlikely event but let's handle it anyway. + */ + uv__close(newfd); + return r; + } + + fd = newfd; + } + +#if defined(__APPLE__) + /* Save the fd flags in case we need to restore them due to an error. */ + do + saved_flags = fcntl(fd, F_GETFL); + while (saved_flags == -1 && errno == EINTR); + + if (saved_flags == -1) { + if (newfd != -1) + uv__close(newfd); + return -errno; + } +#endif + + /* Pacify the compiler. */ + (void) &saved_flags; + +skip: + uv__stream_init(loop, (uv_stream_t*) tty, UV_TTY); + + /* If anything fails beyond this point we need to remove the handle from + * the handle queue, since it was added by uv__handle_init in uv_stream_init. + */ + + if (!(flags & UV_STREAM_BLOCKING)) + uv__nonblock(fd, 1); + +#if defined(__APPLE__) + r = uv__stream_try_select((uv_stream_t*) tty, &fd); + if (r) { + int rc = r; + if (newfd != -1) + uv__close(newfd); + QUEUE_REMOVE(&tty->handle_queue); + do + r = fcntl(fd, F_SETFL, saved_flags); + while (r == -1 && errno == EINTR); + return rc; + } +#endif + + if (readable) + flags |= UV_STREAM_READABLE; + else + flags |= UV_STREAM_WRITABLE; + + uv__stream_open((uv_stream_t*) tty, fd, flags); + tty->mode = UV_TTY_MODE_NORMAL; + + return 0; +} + +static void uv__tty_make_raw(struct termios* tio) { + assert(tio != NULL); + +#if defined __sun || defined __MVS__ + /* + * This implementation of cfmakeraw for Solaris and derivatives is taken from + * http://www.perkin.org.uk/posts/solaris-portability-cfmakeraw.html. + */ + tio->c_iflag &= ~(IMAXBEL | IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | + IGNCR | ICRNL | IXON); + tio->c_oflag &= ~OPOST; + tio->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); + tio->c_cflag &= ~(CSIZE | PARENB); + tio->c_cflag |= CS8; +#else + cfmakeraw(tio); +#endif /* #ifdef __sun */ +} + +int uv_tty_set_mode(uv_tty_t* tty, uv_tty_mode_t mode) { + struct termios tmp; + int fd; + + if (tty->mode == (int) mode) + return 0; + + fd = uv__stream_fd(tty); + if (tty->mode == UV_TTY_MODE_NORMAL && mode != UV_TTY_MODE_NORMAL) { + if (tcgetattr(fd, &tty->orig_termios)) + return -errno; + + /* This is used for uv_tty_reset_mode() */ + uv_spinlock_lock(&termios_spinlock); + if (orig_termios_fd == -1) { + orig_termios = tty->orig_termios; + orig_termios_fd = fd; + } + uv_spinlock_unlock(&termios_spinlock); + } + + tmp = tty->orig_termios; + switch (mode) { + case UV_TTY_MODE_NORMAL: + break; + case UV_TTY_MODE_RAW: + tmp.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON); + tmp.c_oflag |= (ONLCR); + tmp.c_cflag |= (CS8); + tmp.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG); + tmp.c_cc[VMIN] = 1; + tmp.c_cc[VTIME] = 0; + break; + case UV_TTY_MODE_IO: + uv__tty_make_raw(&tmp); + break; + } + + /* Apply changes after draining */ + if (tcsetattr(fd, TCSADRAIN, &tmp)) + return -errno; + + tty->mode = mode; + return 0; +} + + +int uv_tty_get_winsize(uv_tty_t* tty, int* width, int* height) { + struct winsize ws; + int err; + + do + err = ioctl(uv__stream_fd(tty), TIOCGWINSZ, &ws); + while (err == -1 && errno == EINTR); + + if (err == -1) + return -errno; + + *width = ws.ws_col; + *height = ws.ws_row; + + return 0; +} + + +uv_handle_type uv_guess_handle(uv_file file) { + struct sockaddr sa; + struct stat s; + socklen_t len; + int type; + + if (file < 0) + return UV_UNKNOWN_HANDLE; + + if (isatty(file)) + return UV_TTY; + + if (fstat(file, &s)) + return UV_UNKNOWN_HANDLE; + + if (S_ISREG(s.st_mode)) + return UV_FILE; + + if (S_ISCHR(s.st_mode)) + return UV_FILE; /* XXX UV_NAMED_PIPE? */ + + if (S_ISFIFO(s.st_mode)) + return UV_NAMED_PIPE; + + if (!S_ISSOCK(s.st_mode)) + return UV_UNKNOWN_HANDLE; + + len = sizeof(type); + if (getsockopt(file, SOL_SOCKET, SO_TYPE, &type, &len)) + return UV_UNKNOWN_HANDLE; + + len = sizeof(sa); + if (getsockname(file, &sa, &len)) + return UV_UNKNOWN_HANDLE; + + if (type == SOCK_DGRAM) + if (sa.sa_family == AF_INET || sa.sa_family == AF_INET6) + return UV_UDP; + + if (type == SOCK_STREAM) { +#if defined(_AIX) || defined(__DragonFly__) + /* on AIX/DragonFly the getsockname call returns an empty sa structure + * for sockets of type AF_UNIX. For all other types it will + * return a properly filled in structure. + */ + if (len == 0) + return UV_NAMED_PIPE; +#endif /* defined(_AIX) || defined(__DragonFly__) */ + + if (sa.sa_family == AF_INET || sa.sa_family == AF_INET6) + return UV_TCP; + if (sa.sa_family == AF_UNIX) + return UV_NAMED_PIPE; + } + + return UV_UNKNOWN_HANDLE; +} + + +/* This function is async signal-safe, meaning that it's safe to call from + * inside a signal handler _unless_ execution was inside uv_tty_set_mode()'s + * critical section when the signal was raised. + */ +int uv_tty_reset_mode(void) { + int saved_errno; + int err; + + saved_errno = errno; + if (!uv_spinlock_trylock(&termios_spinlock)) + return -EBUSY; /* In uv_tty_set_mode(). */ + + err = 0; + if (orig_termios_fd != -1) + if (tcsetattr(orig_termios_fd, TCSANOW, &orig_termios)) + err = -errno; + + uv_spinlock_unlock(&termios_spinlock); + errno = saved_errno; + + return err; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/unix/udp.c b/lib/ESPiLight/pilight/libs/libuv/unix/udp.c new file mode 100644 index 0000000..c556325 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/unix/udp.c @@ -0,0 +1,900 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +#include +#include +#include +#include +#include +#if defined(__MVS__) +#include +#endif + +#if defined(IPV6_JOIN_GROUP) && !defined(IPV6_ADD_MEMBERSHIP) +# define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP +#endif + +#if defined(IPV6_LEAVE_GROUP) && !defined(IPV6_DROP_MEMBERSHIP) +# define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP +#endif + + +static void uv__udp_run_completed(uv_udp_t* handle); +static void uv__udp_io(uv_loop_t* loop, uv__io_t* w, unsigned int revents); +static void uv__udp_recvmsg(uv_udp_t* handle); +static void uv__udp_sendmsg(uv_udp_t* handle); +static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, + int domain, + unsigned int flags); + + +void uv__udp_close(uv_udp_t* handle) { + uv__io_close(handle->loop, &handle->io_watcher); + uv__handle_stop(handle); + + if (handle->io_watcher.fd != -1) { + uv__close(handle->io_watcher.fd); + handle->io_watcher.fd = -1; + } +} + + +void uv__udp_finish_close(uv_udp_t* handle) { + uv_udp_send_t* req; + QUEUE* q; + + assert(!uv__io_active(&handle->io_watcher, POLLIN | POLLOUT)); + assert(handle->io_watcher.fd == -1); + + while (!QUEUE_EMPTY(&handle->write_queue)) { + q = QUEUE_HEAD(&handle->write_queue); + QUEUE_REMOVE(q); + + req = QUEUE_DATA(q, uv_udp_send_t, queue); + req->status = -ECANCELED; + QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue); + } + + uv__udp_run_completed(handle); + + assert(handle->send_queue_size == 0); + assert(handle->send_queue_count == 0); + + /* Now tear down the handle. */ + handle->recv_cb = NULL; + handle->alloc_cb = NULL; + /* but _do not_ touch close_cb */ +} + + +static void uv__udp_run_completed(uv_udp_t* handle) { + uv_udp_send_t* req; + QUEUE* q; + + assert(!(handle->flags & UV_UDP_PROCESSING)); + handle->flags |= UV_UDP_PROCESSING; + + while (!QUEUE_EMPTY(&handle->write_completed_queue)) { + q = QUEUE_HEAD(&handle->write_completed_queue); + QUEUE_REMOVE(q); + + req = QUEUE_DATA(q, uv_udp_send_t, queue); + uv__req_unregister(handle->loop, req); + + handle->send_queue_size -= uv__count_bufs(req->bufs, req->nbufs); + handle->send_queue_count--; + + if (req->bufs != req->bufsml) + uv__free(req->bufs); + req->bufs = NULL; + + if (req->send_cb == NULL) + continue; + + /* req->status >= 0 == bytes written + * req->status < 0 == errno + */ + if (req->status >= 0) + req->send_cb(req, 0); + else + req->send_cb(req, req->status); + } + + if (QUEUE_EMPTY(&handle->write_queue)) { + /* Pending queue and completion queue empty, stop watcher. */ + uv__io_stop(handle->loop, &handle->io_watcher, POLLOUT); + if (!uv__io_active(&handle->io_watcher, POLLIN)) + uv__handle_stop(handle); + } + + handle->flags &= ~UV_UDP_PROCESSING; +} + + +static void uv__udp_io(uv_loop_t* loop, uv__io_t* w, unsigned int revents) { + uv_udp_t* handle; + + handle = container_of(w, uv_udp_t, io_watcher); + assert(handle->type == UV_UDP); + + if (revents & POLLIN) + uv__udp_recvmsg(handle); + + if (revents & POLLOUT) { + uv__udp_sendmsg(handle); + uv__udp_run_completed(handle); + } +} + + +static void uv__udp_recvmsg(uv_udp_t* handle) { + struct sockaddr_storage peer; + struct msghdr h; + ssize_t nread; + uv_buf_t buf; + int flags; + int count; + + assert(handle->recv_cb != NULL); + assert(handle->alloc_cb != NULL); + + /* Prevent loop starvation when the data comes in as fast as (or faster than) + * we can read it. XXX Need to rearm fd if we switch to edge-triggered I/O. + */ + count = 32; + + memset(&h, 0, sizeof(h)); + h.msg_name = &peer; + + do { + buf = uv_buf_init(NULL, 0); + handle->alloc_cb((uv_handle_t*) handle, 64 * 1024, &buf); + if (buf.base == NULL || buf.len == 0) { + handle->recv_cb(handle, UV_ENOBUFS, &buf, NULL, 0); + return; + } + assert(buf.base != NULL); + + h.msg_namelen = sizeof(peer); + h.msg_iov = (void*) &buf; + h.msg_iovlen = 1; + + do { + nread = recvmsg(handle->io_watcher.fd, &h, 0); + } + while (nread == -1 && errno == EINTR); + + if (nread == -1) { + if (errno == EAGAIN || errno == EWOULDBLOCK) + handle->recv_cb(handle, 0, &buf, NULL, 0); + else + handle->recv_cb(handle, -errno, &buf, NULL, 0); + } + else { + const struct sockaddr *addr; + if (h.msg_namelen == 0) + addr = NULL; + else + addr = (const struct sockaddr*) &peer; + + flags = 0; + if (h.msg_flags & MSG_TRUNC) + flags |= UV_UDP_PARTIAL; + + handle->recv_cb(handle, nread, &buf, addr, flags); + } + } + /* recv_cb callback may decide to pause or close the handle */ + while (nread != -1 + && count-- > 0 + && handle->io_watcher.fd != -1 + && handle->recv_cb != NULL); +} + + +static void uv__udp_sendmsg(uv_udp_t* handle) { + uv_udp_send_t* req; + QUEUE* q; + struct msghdr h; + ssize_t size; + + while (!QUEUE_EMPTY(&handle->write_queue)) { + q = QUEUE_HEAD(&handle->write_queue); + assert(q != NULL); + + req = QUEUE_DATA(q, uv_udp_send_t, queue); + assert(req != NULL); + + memset(&h, 0, sizeof h); + h.msg_name = &req->addr; + h.msg_namelen = (req->addr.ss_family == AF_INET6 ? + sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)); + h.msg_iov = (struct iovec*) req->bufs; + h.msg_iovlen = req->nbufs; + + do { + size = sendmsg(handle->io_watcher.fd, &h, 0); + } while (size == -1 && errno == EINTR); + + if (size == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) + break; + + req->status = (size == -1 ? -errno : size); + + /* Sending a datagram is an atomic operation: either all data + * is written or nothing is (and EMSGSIZE is raised). That is + * why we don't handle partial writes. Just pop the request + * off the write queue and onto the completed queue, done. + */ + QUEUE_REMOVE(&req->queue); + QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue); + uv__io_feed(handle->loop, &handle->io_watcher); + } +} + + +/* On the BSDs, SO_REUSEPORT implies SO_REUSEADDR but with some additional + * refinements for programs that use multicast. + * + * Linux as of 3.9 has a SO_REUSEPORT socket option but with semantics that + * are different from the BSDs: it _shares_ the port rather than steal it + * from the current listener. While useful, it's not something we can emulate + * on other platforms so we don't enable it. + */ +static int uv__set_reuse(int fd) { + int yes; + +#if defined(SO_REUSEPORT) && !defined(__linux__) + yes = 1; + if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes))) + return -errno; +#else + yes = 1; + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes))) + return -errno; +#endif + + return 0; +} + + +int uv__udp_bind(uv_udp_t* handle, + const struct sockaddr* addr, + unsigned int addrlen, + unsigned int flags) { + int err; + int yes; + int fd; + + /* Check for bad flags. */ + if (flags & ~(UV_UDP_IPV6ONLY | UV_UDP_REUSEADDR)) + return -EINVAL; + + /* Cannot set IPv6-only mode on non-IPv6 socket. */ + if ((flags & UV_UDP_IPV6ONLY) && addr->sa_family != AF_INET6) + return -EINVAL; + + fd = handle->io_watcher.fd; + if (fd == -1) { + err = uv__socket(addr->sa_family, SOCK_DGRAM, 0); + if (err < 0) + return err; + fd = err; + handle->io_watcher.fd = fd; + } + + if (flags & UV_UDP_REUSEADDR) { + err = uv__set_reuse(fd); + if (err) + return err; + } + + if (flags & UV_UDP_IPV6ONLY) { +#ifdef IPV6_V6ONLY + yes = 1; + if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof yes) == -1) { + err = -errno; + return err; + } +#else + err = -ENOTSUP; + return err; +#endif + } + + if (bind(fd, addr, addrlen)) { + err = -errno; + if (errno == EAFNOSUPPORT) + /* OSX, other BSDs and SunoS fail with EAFNOSUPPORT when binding a + * socket created with AF_INET to an AF_INET6 address or vice versa. */ + err = -EINVAL; + return err; + } + + if (addr->sa_family == AF_INET6) + handle->flags |= UV_HANDLE_IPV6; + + handle->flags |= UV_HANDLE_BOUND; + return 0; +} + + +static int uv__udp_maybe_deferred_bind(uv_udp_t* handle, + int domain, + unsigned int flags) { + union { + struct sockaddr_in6 in6; + struct sockaddr_in in; + struct sockaddr addr; + } taddr; + socklen_t addrlen; + + if (handle->io_watcher.fd != -1) + return 0; + + switch (domain) { + case AF_INET: + { + struct sockaddr_in* addr = &taddr.in; + memset(addr, 0, sizeof *addr); + addr->sin_family = AF_INET; + addr->sin_addr.s_addr = INADDR_ANY; + addrlen = sizeof *addr; + break; + } + case AF_INET6: + { + struct sockaddr_in6* addr = &taddr.in6; + memset(addr, 0, sizeof *addr); + addr->sin6_family = AF_INET6; + addr->sin6_addr = in6addr_any; + addrlen = sizeof *addr; + break; + } + default: + assert(0 && "unsupported address family"); + abort(); + } + + return uv__udp_bind(handle, &taddr.addr, addrlen, flags); +} + + +int uv__udp_send(uv_udp_send_t* req, + uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr, + unsigned int addrlen, + uv_udp_send_cb send_cb) { + int err; + int empty_queue; + + assert(nbufs > 0); + + err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0); + if (err) + return err; + + /* It's legal for send_queue_count > 0 even when the write_queue is empty; + * it means there are error-state requests in the write_completed_queue that + * will touch up send_queue_size/count later. + */ + empty_queue = (handle->send_queue_count == 0); + + uv__req_init(handle->loop, req, UV_UDP_SEND); + assert(addrlen <= sizeof(req->addr)); + memcpy(&req->addr, addr, addrlen); + req->send_cb = send_cb; + req->handle = handle; + req->nbufs = nbufs; + + req->bufs = req->bufsml; + if (nbufs > ARRAY_SIZE(req->bufsml)) + req->bufs = uv__malloc(nbufs * sizeof(bufs[0])); + + if (req->bufs == NULL) { + uv__req_unregister(handle->loop, req); + return -ENOMEM; + } + + memcpy(req->bufs, bufs, nbufs * sizeof(bufs[0])); + handle->send_queue_size += uv__count_bufs(req->bufs, req->nbufs); + handle->send_queue_count++; + QUEUE_INSERT_TAIL(&handle->write_queue, &req->queue); + uv__handle_start(handle); + + if (empty_queue && !(handle->flags & UV_UDP_PROCESSING)) { + uv__udp_sendmsg(handle); + + /* `uv__udp_sendmsg` may not be able to do non-blocking write straight + * away. In such cases the `io_watcher` has to be queued for asynchronous + * write. + */ + if (!QUEUE_EMPTY(&handle->write_queue)) + uv__io_start(handle->loop, &handle->io_watcher, POLLOUT); + } else { + uv__io_start(handle->loop, &handle->io_watcher, POLLOUT); + } + + return 0; +} + + +int uv__udp_try_send(uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr, + unsigned int addrlen) { + int err; + struct msghdr h; + ssize_t size; + + assert(nbufs > 0); + + /* already sending a message */ + if (handle->send_queue_count != 0) + return -EAGAIN; + + err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0); + if (err) + return err; + + memset(&h, 0, sizeof h); + h.msg_name = (struct sockaddr*) addr; + h.msg_namelen = addrlen; + h.msg_iov = (struct iovec*) bufs; + h.msg_iovlen = nbufs; + + do { + size = sendmsg(handle->io_watcher.fd, &h, 0); + } while (size == -1 && errno == EINTR); + + if (size == -1) { + if (errno == EAGAIN || errno == EWOULDBLOCK) + return -EAGAIN; + else + return -errno; + } + + return size; +} + + +static int uv__udp_set_membership4(uv_udp_t* handle, + const struct sockaddr_in* multicast_addr, + const char* interface_addr, + uv_membership membership) { + struct ip_mreq mreq; + int optname; + int err; + + memset(&mreq, 0, sizeof mreq); + + if (interface_addr) { + err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr); + if (err) + return err; + } else { + mreq.imr_interface.s_addr = htonl(INADDR_ANY); + } + + mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr; + + switch (membership) { + case UV_JOIN_GROUP: + optname = IP_ADD_MEMBERSHIP; + break; + case UV_LEAVE_GROUP: + optname = IP_DROP_MEMBERSHIP; + break; + default: + return -EINVAL; + } + + if (setsockopt(handle->io_watcher.fd, + IPPROTO_IP, + optname, + &mreq, + sizeof(mreq))) { +#if defined(__MVS__) + if (errno == ENXIO) + return -ENODEV; +#endif + return -errno; + } + + return 0; +} + + +static int uv__udp_set_membership6(uv_udp_t* handle, + const struct sockaddr_in6* multicast_addr, + const char* interface_addr, + uv_membership membership) { + int optname; + struct ipv6_mreq mreq; + struct sockaddr_in6 addr6; + + memset(&mreq, 0, sizeof mreq); + + if (interface_addr) { + if (uv_ip6_addr(interface_addr, 0, &addr6)) + return -EINVAL; + mreq.ipv6mr_interface = addr6.sin6_scope_id; + } else { + mreq.ipv6mr_interface = 0; + } + + mreq.ipv6mr_multiaddr = multicast_addr->sin6_addr; + + switch (membership) { + case UV_JOIN_GROUP: + optname = IPV6_ADD_MEMBERSHIP; + break; + case UV_LEAVE_GROUP: + optname = IPV6_DROP_MEMBERSHIP; + break; + default: + return -EINVAL; + } + + if (setsockopt(handle->io_watcher.fd, + IPPROTO_IPV6, + optname, + &mreq, + sizeof(mreq))) { +#if defined(__MVS__) + if (errno == ENXIO) + return -ENODEV; +#endif + return -errno; + } + + return 0; +} + + +int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned int flags) { + int domain; + int err; + int fd; + + /* Use the lower 8 bits for the domain */ + domain = flags & 0xFF; + if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC) + return -EINVAL; + + if (flags & ~0xFF) + return -EINVAL; + + if (domain != AF_UNSPEC) { + err = uv__socket(domain, SOCK_DGRAM, 0); + if (err < 0) + return err; + fd = err; + } else { + fd = -1; + } + + uv__handle_init(loop, (uv_handle_t*)handle, UV_UDP); + handle->alloc_cb = NULL; + handle->recv_cb = NULL; + handle->send_queue_size = 0; + handle->send_queue_count = 0; + uv__io_init(&handle->io_watcher, uv__udp_io, fd); + QUEUE_INIT(&handle->write_queue); + QUEUE_INIT(&handle->write_completed_queue); + return 0; +} + + +int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) { + return uv_udp_init_ex(loop, handle, AF_UNSPEC); +} + + +int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) { + int err; + + /* Check for already active socket. */ + if (handle->io_watcher.fd != -1) + return -EBUSY; + + err = uv__nonblock(sock, 1); + if (err) + return err; + + err = uv__set_reuse(sock); + if (err) + return err; + + handle->io_watcher.fd = sock; + return 0; +} + + +int uv_udp_set_membership(uv_udp_t* handle, + const char* multicast_addr, + const char* interface_addr, + uv_membership membership) { + int err; + struct sockaddr_in addr4; + struct sockaddr_in6 addr6; + + if (uv_ip4_addr(multicast_addr, 0, &addr4) == 0) { + err = uv__udp_maybe_deferred_bind(handle, AF_INET, UV_UDP_REUSEADDR); + if (err) + return err; + return uv__udp_set_membership4(handle, &addr4, interface_addr, membership); + } else if (uv_ip6_addr(multicast_addr, 0, &addr6) == 0) { + err = uv__udp_maybe_deferred_bind(handle, AF_INET6, UV_UDP_REUSEADDR); + if (err) + return err; + return uv__udp_set_membership6(handle, &addr6, interface_addr, membership); + } else { + return -EINVAL; + } +} + +static int uv__setsockopt(uv_udp_t* handle, + int option4, + int option6, + const void* val, + size_t size) { + int r; + + if (handle->flags & UV_HANDLE_IPV6) + r = setsockopt(handle->io_watcher.fd, + IPPROTO_IPV6, + option6, + val, + size); + else + r = setsockopt(handle->io_watcher.fd, + IPPROTO_IP, + option4, + val, + size); + if (r) + return -errno; + + return 0; +} + +static int uv__setsockopt_maybe_char(uv_udp_t* handle, + int option4, + int option6, + int val) { +#if defined(__sun) || defined(_AIX) || defined(__MVS__) + char arg = val; +#elif defined(__OpenBSD__) + unsigned char arg = val; +#else + int arg = val; +#endif + + if (val < 0 || val > 255) + return -EINVAL; + + return uv__setsockopt(handle, option4, option6, &arg, sizeof(arg)); +} + + +int uv_udp_set_broadcast(uv_udp_t* handle, int on) { + if (setsockopt(handle->io_watcher.fd, + SOL_SOCKET, + SO_BROADCAST, + &on, + sizeof(on))) { + return -errno; + } + + return 0; +} + + +int uv_udp_set_ttl(uv_udp_t* handle, int ttl) { + if (ttl < 1 || ttl > 255) + return -EINVAL; + +#if defined(__MVS__) + if (!(handle->flags & UV_HANDLE_IPV6)) + return -ENOTSUP; /* zOS does not support setting ttl for IPv4 */ +#endif + +/* + * On Solaris and derivatives such as SmartOS, the length of socket options + * is sizeof(int) for IP_TTL and IPV6_UNICAST_HOPS, + * so hardcode the size of these options on this platform, + * and use the general uv__setsockopt_maybe_char call on other platforms. + */ +#if defined(__sun) || defined(_AIX) || defined(__OpenBSD__) || \ + defined(__MVS__) + + return uv__setsockopt(handle, + IP_TTL, + IPV6_UNICAST_HOPS, + &ttl, + sizeof(ttl)); +#endif /* defined(__sun) || defined(_AIX) || defined (__OpenBSD__) || + defined(__MVS__) */ + + return uv__setsockopt_maybe_char(handle, + IP_TTL, + IPV6_UNICAST_HOPS, + ttl); +} + + +int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl) { +/* + * On Solaris and derivatives such as SmartOS, the length of socket options + * is sizeof(int) for IPV6_MULTICAST_HOPS and sizeof(char) for + * IP_MULTICAST_TTL, so hardcode the size of the option in the IPv6 case, + * and use the general uv__setsockopt_maybe_char call otherwise. + */ +#if defined(__sun) || defined(_AIX) || defined(__MVS__) + if (handle->flags & UV_HANDLE_IPV6) + return uv__setsockopt(handle, + IP_MULTICAST_TTL, + IPV6_MULTICAST_HOPS, + &ttl, + sizeof(ttl)); +#endif /* defined(__sun) || defined(_AIX) || defined(__MVS__) */ + + return uv__setsockopt_maybe_char(handle, + IP_MULTICAST_TTL, + IPV6_MULTICAST_HOPS, + ttl); +} + + +int uv_udp_set_multicast_loop(uv_udp_t* handle, int on) { +/* + * On Solaris and derivatives such as SmartOS, the length of socket options + * is sizeof(int) for IPV6_MULTICAST_LOOP and sizeof(char) for + * IP_MULTICAST_LOOP, so hardcode the size of the option in the IPv6 case, + * and use the general uv__setsockopt_maybe_char call otherwise. + */ +#if defined(__sun) || defined(_AIX) || defined(__MVS__) + if (handle->flags & UV_HANDLE_IPV6) + return uv__setsockopt(handle, + IP_MULTICAST_LOOP, + IPV6_MULTICAST_LOOP, + &on, + sizeof(on)); +#endif /* defined(__sun) || defined(_AIX) || defined(__MVS__) */ + + return uv__setsockopt_maybe_char(handle, + IP_MULTICAST_LOOP, + IPV6_MULTICAST_LOOP, + on); +} + +int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr) { + struct sockaddr_storage addr_st; + struct sockaddr_in* addr4; + struct sockaddr_in6* addr6; + + addr4 = (struct sockaddr_in*) &addr_st; + addr6 = (struct sockaddr_in6*) &addr_st; + + if (!interface_addr) { + memset(&addr_st, 0, sizeof addr_st); + if (handle->flags & UV_HANDLE_IPV6) { + addr_st.ss_family = AF_INET6; + addr6->sin6_scope_id = 0; + } else { + addr_st.ss_family = AF_INET; + addr4->sin_addr.s_addr = htonl(INADDR_ANY); + } + } else if (uv_ip4_addr(interface_addr, 0, addr4) == 0) { + /* nothing, address was parsed */ + } else if (uv_ip6_addr(interface_addr, 0, addr6) == 0) { + /* nothing, address was parsed */ + } else { + return -EINVAL; + } + + if (addr_st.ss_family == AF_INET) { + if (setsockopt(handle->io_watcher.fd, + IPPROTO_IP, + IP_MULTICAST_IF, + (void*) &addr4->sin_addr, + sizeof(addr4->sin_addr)) == -1) { + return -errno; + } + } else if (addr_st.ss_family == AF_INET6) { + if (setsockopt(handle->io_watcher.fd, + IPPROTO_IPV6, + IPV6_MULTICAST_IF, + &addr6->sin6_scope_id, + sizeof(addr6->sin6_scope_id)) == -1) { + return -errno; + } + } else { + assert(0 && "unexpected address family"); + abort(); + } + + return 0; +} + + +int uv_udp_getsockname(const uv_udp_t* handle, + struct sockaddr* name, + int* namelen) { + socklen_t socklen; + + if (handle->io_watcher.fd == -1) + return -EINVAL; /* FIXME(bnoordhuis) -EBADF */ + + /* sizeof(socklen_t) != sizeof(int) on some systems. */ + socklen = (socklen_t) *namelen; + + if (getsockname(handle->io_watcher.fd, name, &socklen)) + return -errno; + + *namelen = (int) socklen; + return 0; +} + + +int uv__udp_recv_start(uv_udp_t* handle, + uv_alloc_cb alloc_cb, + uv_udp_recv_cb recv_cb) { + int err; + + if (alloc_cb == NULL || recv_cb == NULL) + return -EINVAL; + + if (uv__io_active(&handle->io_watcher, POLLIN)) + return -EALREADY; /* FIXME(bnoordhuis) Should be -EBUSY. */ + + err = uv__udp_maybe_deferred_bind(handle, AF_INET, 0); + if (err) + return err; + + handle->alloc_cb = alloc_cb; + handle->recv_cb = recv_cb; + + uv__io_start(handle->loop, &handle->io_watcher, POLLIN); + uv__handle_start(handle); + + return 0; +} + + +int uv__udp_recv_stop(uv_udp_t* handle) { + uv__io_stop(handle->loop, &handle->io_watcher, POLLIN); + + if (!uv__io_active(&handle->io_watcher, POLLOUT)) + uv__handle_stop(handle); + + handle->alloc_cb = NULL; + handle->recv_cb = NULL; + + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-aix.h b/lib/ESPiLight/pilight/libs/libuv/uv-aix.h new file mode 100644 index 0000000..7dc992f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-aix.h @@ -0,0 +1,32 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_AIX_H +#define UV_AIX_H + +#define UV_PLATFORM_LOOP_FIELDS \ + int fs_fd; \ + +#define UV_PLATFORM_FS_EVENT_FIELDS \ + uv__io_t event_watcher; \ + char *dir_filename; \ + +#endif /* UV_AIX_H */ diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-bsd.h b/lib/ESPiLight/pilight/libs/libuv/uv-bsd.h new file mode 100644 index 0000000..914d717 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-bsd.h @@ -0,0 +1,46 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_BSD_H +#define UV_BSD_H + +#define UV_PLATFORM_FS_EVENT_FIELDS \ + uv__io_t event_watcher; \ + +#define UV_IO_PRIVATE_PLATFORM_FIELDS \ + int rcount; \ + int wcount; \ + +/* + * NEW + */ +#define UV_PLATFORM_LOOP_FIELDS \ + struct pollfd* poll_fds; \ + size_t poll_fds_used; \ + size_t poll_fds_size; \ + unsigned char poll_fds_iterating; \ +/* + * + */ + +#define UV_HAVE_KQUEUE 1 + +#endif /* UV_BSD_H */ diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-common.c b/lib/ESPiLight/pilight/libs/libuv/uv-common.c new file mode 100644 index 0000000..bc7d137 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-common.c @@ -0,0 +1,664 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "uv-common.h" + +#include +#include +#include +#include /* NULL */ +#include +#include /* malloc */ +#include /* memset */ + +#if defined(_WIN32) +# include /* malloc */ +#else +# include /* if_nametoindex */ +#endif + + +typedef struct { + uv_malloc_func local_malloc; + uv_realloc_func local_realloc; + uv_calloc_func local_calloc; + uv_free_func local_free; +} uv__allocator_t; + +static uv__allocator_t uv__allocator = { + malloc, + realloc, + calloc, + free, +}; + +char* uv__strdup(const char* s) { + size_t len = strlen(s) + 1; + char* m = uv__malloc(len); + if (m == NULL) + return NULL; + return memcpy(m, s, len); +} + +char* uv__strndup(const char* s, size_t n) { + char* m; + size_t len = strlen(s); + if (n < len) + len = n; + m = uv__malloc(len + 1); + if (m == NULL) + return NULL; + m[len] = '\0'; + return memcpy(m, s, len); +} + +void* uv__malloc(size_t size) { + return uv__allocator.local_malloc(size); +} + +void uv__free(void* ptr) { + int saved_errno; + + /* Libuv expects that free() does not clobber errno. The system allocator + * honors that assumption but custom allocators may not be so careful. + */ + saved_errno = errno; + uv__allocator.local_free(ptr); + errno = saved_errno; +} + +void* uv__calloc(size_t count, size_t size) { + return uv__allocator.local_calloc(count, size); +} + +void* uv__realloc(void* ptr, size_t size) { + return uv__allocator.local_realloc(ptr, size); +} + +int uv_replace_allocator(uv_malloc_func malloc_func, + uv_realloc_func realloc_func, + uv_calloc_func calloc_func, + uv_free_func free_func) { + if (malloc_func == NULL || realloc_func == NULL || + calloc_func == NULL || free_func == NULL) { + return UV_EINVAL; + } + + uv__allocator.local_malloc = malloc_func; + uv__allocator.local_realloc = realloc_func; + uv__allocator.local_calloc = calloc_func; + uv__allocator.local_free = free_func; + + return 0; +} + +#define XX(uc, lc) case UV_##uc: return sizeof(uv_##lc##_t); + +size_t uv_handle_size(uv_handle_type type) { + switch (type) { + UV_HANDLE_TYPE_MAP(XX) + default: + return -1; + } +} + +size_t uv_req_size(uv_req_type type) { + switch(type) { + UV_REQ_TYPE_MAP(XX) + default: + return -1; + } +} + +#undef XX + + +size_t uv_loop_size(void) { + return sizeof(uv_loop_t); +} + + +uv_buf_t uv_buf_init(char* base, unsigned int len) { + uv_buf_t buf; + buf.base = base; + buf.len = len; + return buf; +} + + +static const char* uv__unknown_err_code(int err) { + char buf[32]; + char* copy; + + snprintf(buf, sizeof(buf), "Unknown system error %d", err); + copy = uv__strdup(buf); + + return copy != NULL ? copy : "Unknown system error"; +} + + +#define UV_ERR_NAME_GEN(name, _) case UV_ ## name: return #name; +const char* uv_err_name(int err) { + switch (err) { + UV_ERRNO_MAP(UV_ERR_NAME_GEN) + } + return uv__unknown_err_code(err); +} +#undef UV_ERR_NAME_GEN + + +#define UV_STRERROR_GEN(name, msg) case UV_ ## name: return msg; +const char* uv_strerror(int err) { + switch (err) { + UV_ERRNO_MAP(UV_STRERROR_GEN) + } + return uv__unknown_err_code(err); +} +#undef UV_STRERROR_GEN + + +int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr) { + memset(addr, 0, sizeof(*addr)); + addr->sin_family = AF_INET; + addr->sin_port = htons(port); + return uv_inet_pton(AF_INET, ip, &(addr->sin_addr.s_addr)); +} + + +int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr) { + char address_part[40]; + size_t address_part_size; + const char* zone_index; + + memset(addr, 0, sizeof(*addr)); + addr->sin6_family = AF_INET6; + addr->sin6_port = htons(port); + + zone_index = strchr(ip, '%'); + if (zone_index != NULL) { + address_part_size = zone_index - ip; + if (address_part_size >= sizeof(address_part)) + address_part_size = sizeof(address_part) - 1; + + memcpy(address_part, ip, address_part_size); + address_part[address_part_size] = '\0'; + ip = address_part; + + zone_index++; /* skip '%' */ + /* NOTE: unknown interface (id=0) is silently ignored */ +#ifdef _WIN32 + addr->sin6_scope_id = atoi(zone_index); +#else + addr->sin6_scope_id = if_nametoindex(zone_index); +#endif + } + + return uv_inet_pton(AF_INET6, ip, &addr->sin6_addr); +} + + +int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size) { + return uv_inet_ntop(AF_INET, &src->sin_addr, dst, size); +} + + +int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size) { + return uv_inet_ntop(AF_INET6, &src->sin6_addr, dst, size); +} + + +int uv_tcp_bind(uv_tcp_t* handle, + const struct sockaddr* addr, + unsigned int flags) { + unsigned int addrlen; + + if (handle->type != UV_TCP) + return UV_EINVAL; + + if (addr->sa_family == AF_INET) + addrlen = sizeof(struct sockaddr_in); + else if (addr->sa_family == AF_INET6) + addrlen = sizeof(struct sockaddr_in6); + else + return UV_EINVAL; + + return uv__tcp_bind(handle, addr, addrlen, flags); +} + + +int uv_udp_bind(uv_udp_t* handle, + const struct sockaddr* addr, + unsigned int flags) { + unsigned int addrlen; + + if (handle->type != UV_UDP) + return UV_EINVAL; + + if (addr->sa_family == AF_INET) + addrlen = sizeof(struct sockaddr_in); + else if (addr->sa_family == AF_INET6) + addrlen = sizeof(struct sockaddr_in6); + else + return UV_EINVAL; + + return uv__udp_bind(handle, addr, addrlen, flags); +} + + +int uv_tcp_connect(uv_connect_t* req, + uv_tcp_t* handle, + const struct sockaddr* addr, + uv_connect_cb cb) { + unsigned int addrlen; + + if (handle->type != UV_TCP) + return UV_EINVAL; + + if (addr->sa_family == AF_INET) + addrlen = sizeof(struct sockaddr_in); + else if (addr->sa_family == AF_INET6) + addrlen = sizeof(struct sockaddr_in6); + else + return UV_EINVAL; + + return uv__tcp_connect(req, handle, addr, addrlen, cb); +} + + +int uv_udp_send(uv_udp_send_t* req, + uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr, + uv_udp_send_cb send_cb) { + unsigned int addrlen; + + if (handle->type != UV_UDP) + return UV_EINVAL; + + if (addr->sa_family == AF_INET) + addrlen = sizeof(struct sockaddr_in); + else if (addr->sa_family == AF_INET6) + addrlen = sizeof(struct sockaddr_in6); + else + return UV_EINVAL; + + return uv__udp_send(req, handle, bufs, nbufs, addr, addrlen, send_cb); +} + + +int uv_udp_try_send(uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr) { + unsigned int addrlen; + + if (handle->type != UV_UDP) + return UV_EINVAL; + + if (addr->sa_family == AF_INET) + addrlen = sizeof(struct sockaddr_in); + else if (addr->sa_family == AF_INET6) + addrlen = sizeof(struct sockaddr_in6); + else + return UV_EINVAL; + + return uv__udp_try_send(handle, bufs, nbufs, addr, addrlen); +} + + +int uv_udp_recv_start(uv_udp_t* handle, + uv_alloc_cb alloc_cb, + uv_udp_recv_cb recv_cb) { + if (handle->type != UV_UDP || alloc_cb == NULL || recv_cb == NULL) + return UV_EINVAL; + else + return uv__udp_recv_start(handle, alloc_cb, recv_cb); +} + + +int uv_udp_recv_stop(uv_udp_t* handle) { + if (handle->type != UV_UDP) + return UV_EINVAL; + else + return uv__udp_recv_stop(handle); +} + + +void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg) { + QUEUE queue; + QUEUE* q; + uv_handle_t* h; + + QUEUE_MOVE(&loop->handle_queue, &queue); + while (!QUEUE_EMPTY(&queue)) { + q = QUEUE_HEAD(&queue); + h = QUEUE_DATA(q, uv_handle_t, handle_queue); + + QUEUE_REMOVE(q); + QUEUE_INSERT_TAIL(&loop->handle_queue, q); + + if (h->flags & UV__HANDLE_INTERNAL) continue; + walk_cb(h, arg); + } +} + + +static void uv__print_handles(uv_loop_t* loop, int only_active, FILE* stream) { + const char* type; + QUEUE* q; + uv_handle_t* h; + + if (loop == NULL) + loop = uv_default_loop(); + + QUEUE_FOREACH(q, &loop->handle_queue) { + h = QUEUE_DATA(q, uv_handle_t, handle_queue); + + if (only_active && !uv__is_active(h)) + continue; + + switch (h->type) { +#define X(uc, lc) case UV_##uc: type = #lc; break; + UV_HANDLE_TYPE_MAP(X) +#undef X + default: type = ""; + } + + fprintf(stream, + "[%c%c%c] %-8s %p\n", + "R-"[!(h->flags & UV__HANDLE_REF)], + "A-"[!(h->flags & UV__HANDLE_ACTIVE)], + "I-"[!(h->flags & UV__HANDLE_INTERNAL)], + type, + (void*)h); + } +} + + +void uv_print_all_handles(uv_loop_t* loop, FILE* stream) { + uv__print_handles(loop, 0, stream); +} + + +void uv_print_active_handles(uv_loop_t* loop, FILE* stream) { + uv__print_handles(loop, 1, stream); +} + + +void uv_ref(uv_handle_t* handle) { + uv__handle_ref(handle); +} + + +void uv_unref(uv_handle_t* handle) { + uv__handle_unref(handle); +} + + +int uv_has_ref(const uv_handle_t* handle) { + return uv__has_ref(handle); +} + + +void uv_stop(uv_loop_t* loop) { + loop->stop_flag = 1; +} + + +uint64_t uv_now(const uv_loop_t* loop) { + return loop->time; +} + + + +size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs) { + unsigned int i; + size_t bytes; + + bytes = 0; + for (i = 0; i < nbufs; i++) + bytes += (size_t) bufs[i].len; + + return bytes; +} + +int uv_recv_buffer_size(uv_handle_t* handle, int* value) { + return uv__socket_sockopt(handle, SO_RCVBUF, value); +} + +int uv_send_buffer_size(uv_handle_t* handle, int *value) { + return uv__socket_sockopt(handle, SO_SNDBUF, value); +} + +int uv_fs_event_getpath(uv_fs_event_t* handle, char* buffer, size_t* size) { + size_t required_len; + + if (!uv__is_active(handle)) { + *size = 0; + return UV_EINVAL; + } + + required_len = strlen(handle->path); + if (required_len >= *size) { + *size = required_len + 1; + return UV_ENOBUFS; + } + + memcpy(buffer, handle->path, required_len); + *size = required_len; + buffer[required_len] = '\0'; + + return 0; +} + +/* The windows implementation does not have the same structure layout as + * the unix implementation (nbufs is not directly inside req but is + * contained in a nested union/struct) so this function locates it. +*/ +static unsigned int* uv__get_nbufs(uv_fs_t* req) { +#ifdef _WIN32 + return &req->fs.info.nbufs; +#else + return &req->nbufs; +#endif +} + +/* uv_fs_scandir() uses the system allocator to allocate memory on non-Windows + * systems. So, the memory should be released using free(). On Windows, + * uv__malloc() is used, so use uv__free() to free memory. +*/ +#ifdef _WIN32 +# define uv__fs_scandir_free uv__free +#else +# define uv__fs_scandir_free free +#endif + +void uv__fs_scandir_cleanup(uv_fs_t* req) { + uv__dirent_t** dents; + + unsigned int* nbufs = uv__get_nbufs(req); + + dents = req->ptr; + if (*nbufs > 0 && *nbufs != (unsigned int) req->result) + (*nbufs)--; + for (; *nbufs < (unsigned int) req->result; (*nbufs)++) + uv__fs_scandir_free(dents[*nbufs]); + + uv__fs_scandir_free(req->ptr); + req->ptr = NULL; +} + + +int uv_fs_scandir_next(uv_fs_t* req, uv_dirent_t* ent) { + uv__dirent_t** dents; + uv__dirent_t* dent; + unsigned int* nbufs; + + /* Check to see if req passed */ + if (req->result < 0) + return req->result; + + /* Ptr will be null if req was canceled or no files found */ + if (!req->ptr) + return UV_EOF; + + nbufs = uv__get_nbufs(req); + assert(nbufs); + + dents = req->ptr; + + /* Free previous entity */ + if (*nbufs > 0) + uv__fs_scandir_free(dents[*nbufs - 1]); + + /* End was already reached */ + if (*nbufs == (unsigned int) req->result) { + uv__fs_scandir_free(dents); + req->ptr = NULL; + return UV_EOF; + } + + dent = dents[(*nbufs)++]; + + ent->name = dent->d_name; +#ifdef HAVE_DIRENT_TYPES + switch (dent->d_type) { + case UV__DT_DIR: + ent->type = UV_DIRENT_DIR; + break; + case UV__DT_FILE: + ent->type = UV_DIRENT_FILE; + break; + case UV__DT_LINK: + ent->type = UV_DIRENT_LINK; + break; + case UV__DT_FIFO: + ent->type = UV_DIRENT_FIFO; + break; + case UV__DT_SOCKET: + ent->type = UV_DIRENT_SOCKET; + break; + case UV__DT_CHAR: + ent->type = UV_DIRENT_CHAR; + break; + case UV__DT_BLOCK: + ent->type = UV_DIRENT_BLOCK; + break; + default: + ent->type = UV_DIRENT_UNKNOWN; + } +#else + ent->type = UV_DIRENT_UNKNOWN; +#endif + + return 0; +} + + +int uv_loop_configure(uv_loop_t* loop, uv_loop_option option, ...) { + va_list ap; + int err; + + va_start(ap, option); + /* Any platform-agnostic options should be handled here. */ + err = uv__loop_configure(loop, option, ap); + va_end(ap); + + return err; +} + + +static uv_loop_t default_loop_struct; +static uv_loop_t* default_loop_ptr; + + +uv_loop_t* uv_default_loop(void) { + if (default_loop_ptr != NULL) + return default_loop_ptr; + + if (uv_loop_init(&default_loop_struct)) + return NULL; + + default_loop_ptr = &default_loop_struct; + return default_loop_ptr; +} + + +uv_loop_t* uv_loop_new(void) { + uv_loop_t* loop; + + loop = uv__malloc(sizeof(*loop)); + if (loop == NULL) + return NULL; + + if (uv_loop_init(loop)) { + uv__free(loop); + return NULL; + } + + return loop; +} + + +int uv_loop_close(uv_loop_t* loop) { + QUEUE* q; + uv_handle_t* h; +#ifndef NDEBUG + void* saved_data; +#endif + + if (!QUEUE_EMPTY(&(loop)->active_reqs)) + return UV_EBUSY; + + QUEUE_FOREACH(q, &loop->handle_queue) { + h = QUEUE_DATA(q, uv_handle_t, handle_queue); + if (!(h->flags & UV__HANDLE_INTERNAL)) + return UV_EBUSY; + } + + uv__loop_close(loop); + +#ifndef NDEBUG + saved_data = loop->data; + memset(loop, -1, sizeof(*loop)); + loop->data = saved_data; +#endif + if (loop == default_loop_ptr) + default_loop_ptr = NULL; + + return 0; +} + + +void uv_loop_delete(uv_loop_t* loop) { + uv_loop_t* default_loop; + int err; + + default_loop = default_loop_ptr; + + err = uv_loop_close(loop); + (void) err; /* Squelch compiler warnings. */ + assert(err == 0); + if (loop != default_loop) + uv__free(loop); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-common.h b/lib/ESPiLight/pilight/libs/libuv/uv-common.h new file mode 100644 index 0000000..781a855 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-common.h @@ -0,0 +1,254 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* + * This file is private to libuv. It provides common functionality to both + * Windows and Unix backends. + */ + +#ifndef UV_COMMON_H_ +#define UV_COMMON_H_ + +#include +#include +#include + +#if defined(_MSC_VER) && _MSC_VER < 1600 +# include "stdint-msvc2008.h" +#else +# include +#endif + +#include "uv.h" +#include "tree.h" +#include "queue.h" + +#if !defined(snprintf) && defined(_MSC_VER) && _MSC_VER < 1900 +extern int snprintf(char*, size_t, const char*, ...); +#endif + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) + +#define container_of(ptr, type, member) \ + ((type *) ((char *) (ptr) - offsetof(type, member))) + +#define STATIC_ASSERT(expr) \ + void uv__static_assert(int static_assert_failed[1 - 2 * !(expr)]) + +#ifndef _WIN32 +enum { + UV__SIGNAL_ONE_SHOT = 0x80000, /* On signal reception remove sighandler */ + UV__HANDLE_INTERNAL = 0x8000, + UV__HANDLE_ACTIVE = 0x4000, + UV__HANDLE_REF = 0x2000, + UV__HANDLE_CLOSING = 0 /* no-op on unix */ +}; +#else +# define UV__SIGNAL_ONE_SHOT_DISPATCHED 0x200 +# define UV__SIGNAL_ONE_SHOT 0x100 +# define UV__HANDLE_INTERNAL 0x80 +# define UV__HANDLE_ACTIVE 0x40 +# define UV__HANDLE_REF 0x20 +# define UV__HANDLE_CLOSING 0x01 +#endif + +int uv__loop_configure(uv_loop_t* loop, uv_loop_option option, va_list ap); + +void uv__loop_close(uv_loop_t* loop); + +int uv__tcp_bind(uv_tcp_t* tcp, + const struct sockaddr* addr, + unsigned int addrlen, + unsigned int flags); + +int uv__tcp_connect(uv_connect_t* req, + uv_tcp_t* handle, + const struct sockaddr* addr, + unsigned int addrlen, + uv_connect_cb cb); + +int uv__udp_bind(uv_udp_t* handle, + const struct sockaddr* addr, + unsigned int addrlen, + unsigned int flags); + +int uv__udp_send(uv_udp_send_t* req, + uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr, + unsigned int addrlen, + uv_udp_send_cb send_cb); + +int uv__udp_try_send(uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr, + unsigned int addrlen); + +int uv__udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloccb, + uv_udp_recv_cb recv_cb); + +int uv__udp_recv_stop(uv_udp_t* handle); + +void uv__fs_poll_close(uv_fs_poll_t* handle); + +int uv__getaddrinfo_translate_error(int sys_err); /* EAI_* error. */ + +void uv__work_submit(uv_loop_t* loop, + struct uv__work *w, + void (*work)(struct uv__work *w), + void (*done)(struct uv__work *w, int status)); + +void uv__work_done(uv_async_t* handle); + +size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs); + +int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value); + +void uv__fs_scandir_cleanup(uv_fs_t* req); + +#define uv__has_active_reqs(loop) \ + (QUEUE_EMPTY(&(loop)->active_reqs) == 0) + +#define uv__req_register(loop, req) \ + do { \ + QUEUE_INSERT_TAIL(&(loop)->active_reqs, &(req)->active_queue); \ + } \ + while (0) + +#define uv__req_unregister(loop, req) \ + do { \ + assert(uv__has_active_reqs(loop)); \ + QUEUE_REMOVE(&(req)->active_queue); \ + } \ + while (0) + +#define uv__has_active_handles(loop) \ + ((loop)->active_handles > 0) + +#define uv__active_handle_add(h) \ + do { \ + (h)->loop->active_handles++; \ + } \ + while (0) + +#define uv__active_handle_rm(h) \ + do { \ + (h)->loop->active_handles--; \ + } \ + while (0) + +#define uv__is_active(h) \ + (((h)->flags & UV__HANDLE_ACTIVE) != 0) + +#define uv__is_closing(h) \ + (((h)->flags & (UV_CLOSING | UV_CLOSED)) != 0) + +#define uv__handle_start(h) \ + do { \ + assert(((h)->flags & UV__HANDLE_CLOSING) == 0); \ + if (((h)->flags & UV__HANDLE_ACTIVE) != 0) break; \ + (h)->flags |= UV__HANDLE_ACTIVE; \ + if (((h)->flags & UV__HANDLE_REF) != 0) uv__active_handle_add(h); \ + } \ + while (0) + +#define uv__handle_stop(h) \ + do { \ + assert(((h)->flags & UV__HANDLE_CLOSING) == 0); \ + if (((h)->flags & UV__HANDLE_ACTIVE) == 0) break; \ + (h)->flags &= ~UV__HANDLE_ACTIVE; \ + if (((h)->flags & UV__HANDLE_REF) != 0) uv__active_handle_rm(h); \ + } \ + while (0) + +#define uv__handle_ref(h) \ + do { \ + if (((h)->flags & UV__HANDLE_REF) != 0) break; \ + (h)->flags |= UV__HANDLE_REF; \ + if (((h)->flags & UV__HANDLE_CLOSING) != 0) break; \ + if (((h)->flags & UV__HANDLE_ACTIVE) != 0) uv__active_handle_add(h); \ + } \ + while (0) + +#define uv__handle_unref(h) \ + do { \ + if (((h)->flags & UV__HANDLE_REF) == 0) break; \ + (h)->flags &= ~UV__HANDLE_REF; \ + if (((h)->flags & UV__HANDLE_CLOSING) != 0) break; \ + if (((h)->flags & UV__HANDLE_ACTIVE) != 0) uv__active_handle_rm(h); \ + } \ + while (0) + +#define uv__has_ref(h) \ + (((h)->flags & UV__HANDLE_REF) != 0) + +#if defined(_WIN32) +# define uv__handle_platform_init(h) ((h)->u.fd = -1) +#else +# define uv__handle_platform_init(h) ((h)->next_closing = NULL) +#endif + +#define uv__handle_init(loop_, h, type_) \ + do { \ + (h)->loop = (loop_); \ + (h)->type = (type_); \ + (h)->flags = UV__HANDLE_REF; /* Ref the loop when active. */ \ + QUEUE_INSERT_TAIL(&(loop_)->handle_queue, &(h)->handle_queue); \ + uv__handle_platform_init(h); \ + } \ + while (0) + +/* Note: uses an open-coded version of SET_REQ_SUCCESS() because of + * a circular dependency between src/uv-common.h and src/win/internal.h. + */ +#if defined(_WIN32) +# define UV_REQ_INIT(req, typ) \ + do { \ + (req)->type = (typ); \ + (req)->u.io.overlapped.Internal = 0; /* SET_REQ_SUCCESS() */ \ + } \ + while (0) +#else +# define UV_REQ_INIT(req, typ) \ + do { \ + (req)->type = (typ); \ + } \ + while (0) +#endif + +#define uv__req_init(loop, req, typ) \ + do { \ + UV_REQ_INIT(req, typ); \ + uv__req_register(loop, req); \ + } \ + while (0) + +/* Allocator prototypes */ +void *uv__calloc(size_t count, size_t size); +char *uv__strdup(const char* s); +char *uv__strndup(const char* s, size_t n); +void* uv__malloc(size_t size); +void uv__free(void* ptr); +void* uv__realloc(void* ptr, size_t size); + +#endif /* UV_COMMON_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-darwin.h b/lib/ESPiLight/pilight/libs/libuv/uv-darwin.h new file mode 100644 index 0000000..d226415 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-darwin.h @@ -0,0 +1,61 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_DARWIN_H +#define UV_DARWIN_H + +#if defined(__APPLE__) && defined(__MACH__) +# include +# include +# include +# include +# define UV_PLATFORM_SEM_T semaphore_t +#endif + +#define UV_IO_PRIVATE_PLATFORM_FIELDS \ + int rcount; \ + int wcount; \ + +#define UV_PLATFORM_LOOP_FIELDS \ + uv_thread_t cf_thread; \ + void* _cf_reserved; \ + void* cf_state; \ + uv_mutex_t cf_mutex; \ + uv_sem_t cf_sem; \ + void* cf_signals[2]; \ + +#define UV_PLATFORM_FS_EVENT_FIELDS \ + uv__io_t event_watcher; \ + char* realpath; \ + int realpath_len; \ + int cf_flags; \ + uv_async_t* cf_cb; \ + void* cf_events[2]; \ + void* cf_member[2]; \ + int cf_error; \ + uv_mutex_t cf_mutex; \ + +#define UV_STREAM_PRIVATE_PLATFORM_FIELDS \ + void* select; \ + +#define UV_HAVE_KQUEUE 1 + +#endif /* UV_DARWIN_H */ diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-errno.h b/lib/ESPiLight/pilight/libs/libuv/uv-errno.h new file mode 100644 index 0000000..f137151 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-errno.h @@ -0,0 +1,419 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_ERRNO_H_ +#define UV_ERRNO_H_ + +#include + +#define UV__EOF (-4095) +#define UV__UNKNOWN (-4094) + +#define UV__EAI_ADDRFAMILY (-3000) +#define UV__EAI_AGAIN (-3001) +#define UV__EAI_BADFLAGS (-3002) +#define UV__EAI_CANCELED (-3003) +#define UV__EAI_FAIL (-3004) +#define UV__EAI_FAMILY (-3005) +#define UV__EAI_MEMORY (-3006) +#define UV__EAI_NODATA (-3007) +#define UV__EAI_NONAME (-3008) +#define UV__EAI_OVERFLOW (-3009) +#define UV__EAI_SERVICE (-3010) +#define UV__EAI_SOCKTYPE (-3011) +#define UV__EAI_BADHINTS (-3013) +#define UV__EAI_PROTOCOL (-3014) + +/* Only map to the system errno on non-Windows platforms. It's apparently + * a fairly common practice for Windows programmers to redefine errno codes. + */ +#if defined(E2BIG) && !defined(_WIN32) +# define UV__E2BIG (-E2BIG) +#else +# define UV__E2BIG (-4093) +#endif + +#if defined(EACCES) && !defined(_WIN32) +# define UV__EACCES (-EACCES) +#else +# define UV__EACCES (-4092) +#endif + +#if defined(EADDRINUSE) && !defined(_WIN32) +# define UV__EADDRINUSE (-EADDRINUSE) +#else +# define UV__EADDRINUSE (-4091) +#endif + +#if defined(EADDRNOTAVAIL) && !defined(_WIN32) +# define UV__EADDRNOTAVAIL (-EADDRNOTAVAIL) +#else +# define UV__EADDRNOTAVAIL (-4090) +#endif + +#if defined(EAFNOSUPPORT) && !defined(_WIN32) +# define UV__EAFNOSUPPORT (-EAFNOSUPPORT) +#else +# define UV__EAFNOSUPPORT (-4089) +#endif + +#if defined(EAGAIN) && !defined(_WIN32) +# define UV__EAGAIN (-EAGAIN) +#else +# define UV__EAGAIN (-4088) +#endif + +#if defined(EALREADY) && !defined(_WIN32) +# define UV__EALREADY (-EALREADY) +#else +# define UV__EALREADY (-4084) +#endif + +#if defined(EBADF) && !defined(_WIN32) +# define UV__EBADF (-EBADF) +#else +# define UV__EBADF (-4083) +#endif + +#if defined(EBUSY) && !defined(_WIN32) +# define UV__EBUSY (-EBUSY) +#else +# define UV__EBUSY (-4082) +#endif + +#if defined(ECANCELED) && !defined(_WIN32) +# define UV__ECANCELED (-ECANCELED) +#else +# define UV__ECANCELED (-4081) +#endif + +#if defined(ECHARSET) && !defined(_WIN32) +# define UV__ECHARSET (-ECHARSET) +#else +# define UV__ECHARSET (-4080) +#endif + +#if defined(ECONNABORTED) && !defined(_WIN32) +# define UV__ECONNABORTED (-ECONNABORTED) +#else +# define UV__ECONNABORTED (-4079) +#endif + +#if defined(ECONNREFUSED) && !defined(_WIN32) +# define UV__ECONNREFUSED (-ECONNREFUSED) +#else +# define UV__ECONNREFUSED (-4078) +#endif + +#if defined(ECONNRESET) && !defined(_WIN32) +# define UV__ECONNRESET (-ECONNRESET) +#else +# define UV__ECONNRESET (-4077) +#endif + +#if defined(EDESTADDRREQ) && !defined(_WIN32) +# define UV__EDESTADDRREQ (-EDESTADDRREQ) +#else +# define UV__EDESTADDRREQ (-4076) +#endif + +#if defined(EEXIST) && !defined(_WIN32) +# define UV__EEXIST (-EEXIST) +#else +# define UV__EEXIST (-4075) +#endif + +#if defined(EFAULT) && !defined(_WIN32) +# define UV__EFAULT (-EFAULT) +#else +# define UV__EFAULT (-4074) +#endif + +#if defined(EHOSTUNREACH) && !defined(_WIN32) +# define UV__EHOSTUNREACH (-EHOSTUNREACH) +#else +# define UV__EHOSTUNREACH (-4073) +#endif + +#if defined(EINTR) && !defined(_WIN32) +# define UV__EINTR (-EINTR) +#else +# define UV__EINTR (-4072) +#endif + +#if defined(EINVAL) && !defined(_WIN32) +# define UV__EINVAL (-EINVAL) +#else +# define UV__EINVAL (-4071) +#endif + +#if defined(EIO) && !defined(_WIN32) +# define UV__EIO (-EIO) +#else +# define UV__EIO (-4070) +#endif + +#if defined(EISCONN) && !defined(_WIN32) +# define UV__EISCONN (-EISCONN) +#else +# define UV__EISCONN (-4069) +#endif + +#if defined(EISDIR) && !defined(_WIN32) +# define UV__EISDIR (-EISDIR) +#else +# define UV__EISDIR (-4068) +#endif + +#if defined(ELOOP) && !defined(_WIN32) +# define UV__ELOOP (-ELOOP) +#else +# define UV__ELOOP (-4067) +#endif + +#if defined(EMFILE) && !defined(_WIN32) +# define UV__EMFILE (-EMFILE) +#else +# define UV__EMFILE (-4066) +#endif + +#if defined(EMSGSIZE) && !defined(_WIN32) +# define UV__EMSGSIZE (-EMSGSIZE) +#else +# define UV__EMSGSIZE (-4065) +#endif + +#if defined(ENAMETOOLONG) && !defined(_WIN32) +# define UV__ENAMETOOLONG (-ENAMETOOLONG) +#else +# define UV__ENAMETOOLONG (-4064) +#endif + +#if defined(ENETDOWN) && !defined(_WIN32) +# define UV__ENETDOWN (-ENETDOWN) +#else +# define UV__ENETDOWN (-4063) +#endif + +#if defined(ENETUNREACH) && !defined(_WIN32) +# define UV__ENETUNREACH (-ENETUNREACH) +#else +# define UV__ENETUNREACH (-4062) +#endif + +#if defined(ENFILE) && !defined(_WIN32) +# define UV__ENFILE (-ENFILE) +#else +# define UV__ENFILE (-4061) +#endif + +#if defined(ENOBUFS) && !defined(_WIN32) +# define UV__ENOBUFS (-ENOBUFS) +#else +# define UV__ENOBUFS (-4060) +#endif + +#if defined(ENODEV) && !defined(_WIN32) +# define UV__ENODEV (-ENODEV) +#else +# define UV__ENODEV (-4059) +#endif + +#if defined(ENOENT) && !defined(_WIN32) +# define UV__ENOENT (-ENOENT) +#else +# define UV__ENOENT (-4058) +#endif + +#if defined(ENOMEM) && !defined(_WIN32) +# define UV__ENOMEM (-ENOMEM) +#else +# define UV__ENOMEM (-4057) +#endif + +#if defined(ENONET) && !defined(_WIN32) +# define UV__ENONET (-ENONET) +#else +# define UV__ENONET (-4056) +#endif + +#if defined(ENOSPC) && !defined(_WIN32) +# define UV__ENOSPC (-ENOSPC) +#else +# define UV__ENOSPC (-4055) +#endif + +#if defined(ENOSYS) && !defined(_WIN32) +# define UV__ENOSYS (-ENOSYS) +#else +# define UV__ENOSYS (-4054) +#endif + +#if defined(ENOTCONN) && !defined(_WIN32) +# define UV__ENOTCONN (-ENOTCONN) +#else +# define UV__ENOTCONN (-4053) +#endif + +#if defined(ENOTDIR) && !defined(_WIN32) +# define UV__ENOTDIR (-ENOTDIR) +#else +# define UV__ENOTDIR (-4052) +#endif + +#if defined(ENOTEMPTY) && !defined(_WIN32) +# define UV__ENOTEMPTY (-ENOTEMPTY) +#else +# define UV__ENOTEMPTY (-4051) +#endif + +#if defined(ENOTSOCK) && !defined(_WIN32) +# define UV__ENOTSOCK (-ENOTSOCK) +#else +# define UV__ENOTSOCK (-4050) +#endif + +#if defined(ENOTSUP) && !defined(_WIN32) +# define UV__ENOTSUP (-ENOTSUP) +#else +# define UV__ENOTSUP (-4049) +#endif + +#if defined(EPERM) && !defined(_WIN32) +# define UV__EPERM (-EPERM) +#else +# define UV__EPERM (-4048) +#endif + +#if defined(EPIPE) && !defined(_WIN32) +# define UV__EPIPE (-EPIPE) +#else +# define UV__EPIPE (-4047) +#endif + +#if defined(EPROTO) && !defined(_WIN32) +# define UV__EPROTO (-EPROTO) +#else +# define UV__EPROTO (-4046) +#endif + +#if defined(EPROTONOSUPPORT) && !defined(_WIN32) +# define UV__EPROTONOSUPPORT (-EPROTONOSUPPORT) +#else +# define UV__EPROTONOSUPPORT (-4045) +#endif + +#if defined(EPROTOTYPE) && !defined(_WIN32) +# define UV__EPROTOTYPE (-EPROTOTYPE) +#else +# define UV__EPROTOTYPE (-4044) +#endif + +#if defined(EROFS) && !defined(_WIN32) +# define UV__EROFS (-EROFS) +#else +# define UV__EROFS (-4043) +#endif + +#if defined(ESHUTDOWN) && !defined(_WIN32) +# define UV__ESHUTDOWN (-ESHUTDOWN) +#else +# define UV__ESHUTDOWN (-4042) +#endif + +#if defined(ESPIPE) && !defined(_WIN32) +# define UV__ESPIPE (-ESPIPE) +#else +# define UV__ESPIPE (-4041) +#endif + +#if defined(ESRCH) && !defined(_WIN32) +# define UV__ESRCH (-ESRCH) +#else +# define UV__ESRCH (-4040) +#endif + +#if defined(ETIMEDOUT) && !defined(_WIN32) +# define UV__ETIMEDOUT (-ETIMEDOUT) +#else +# define UV__ETIMEDOUT (-4039) +#endif + +#if defined(ETXTBSY) && !defined(_WIN32) +# define UV__ETXTBSY (-ETXTBSY) +#else +# define UV__ETXTBSY (-4038) +#endif + +#if defined(EXDEV) && !defined(_WIN32) +# define UV__EXDEV (-EXDEV) +#else +# define UV__EXDEV (-4037) +#endif + +#if defined(EFBIG) && !defined(_WIN32) +# define UV__EFBIG (-EFBIG) +#else +# define UV__EFBIG (-4036) +#endif + +#if defined(ENOPROTOOPT) && !defined(_WIN32) +# define UV__ENOPROTOOPT (-ENOPROTOOPT) +#else +# define UV__ENOPROTOOPT (-4035) +#endif + +#if defined(ERANGE) && !defined(_WIN32) +# define UV__ERANGE (-ERANGE) +#else +# define UV__ERANGE (-4034) +#endif + +#if defined(ENXIO) && !defined(_WIN32) +# define UV__ENXIO (-ENXIO) +#else +# define UV__ENXIO (-4033) +#endif + +#if defined(EMLINK) && !defined(_WIN32) +# define UV__EMLINK (-EMLINK) +#else +# define UV__EMLINK (-4032) +#endif + +/* EHOSTDOWN is not visible on BSD-like systems when _POSIX_C_SOURCE is + * defined. Fortunately, its value is always 64 so it's possible albeit + * icky to hard-code it. + */ +#if defined(EHOSTDOWN) && !defined(_WIN32) +# define UV__EHOSTDOWN (-EHOSTDOWN) +#elif defined(__APPLE__) || \ + defined(__DragonFly__) || \ + defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) || \ + defined(__NetBSD__) || \ + defined(__OpenBSD__) +# define UV__EHOSTDOWN (-64) +#else +# define UV__EHOSTDOWN (-4031) +#endif + +#endif /* UV_ERRNO_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-linux.h b/lib/ESPiLight/pilight/libs/libuv/uv-linux.h new file mode 100644 index 0000000..9b38405 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-linux.h @@ -0,0 +1,34 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_LINUX_H +#define UV_LINUX_H + +#define UV_PLATFORM_LOOP_FIELDS \ + uv__io_t inotify_read_watcher; \ + void* inotify_watchers; \ + int inotify_fd; \ + +#define UV_PLATFORM_FS_EVENT_FIELDS \ + void* watchers[2]; \ + int wd; \ + +#endif /* UV_LINUX_H */ diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-os390.h b/lib/ESPiLight/pilight/libs/libuv/uv-os390.h new file mode 100644 index 0000000..58f9261 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-os390.h @@ -0,0 +1,30 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_MVS_H +#define UV_MVS_H + +#define UV_PLATFORM_SEM_T int + +#define UV_PLATFORM_LOOP_FIELDS \ + void* ep; \ + +#endif /* UV_MVS_H */ diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-posix.h b/lib/ESPiLight/pilight/libs/libuv/uv-posix.h new file mode 100644 index 0000000..9a96634 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-posix.h @@ -0,0 +1,31 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_POSIX_H +#define UV_POSIX_H + +#define UV_PLATFORM_LOOP_FIELDS \ + struct pollfd* poll_fds; \ + size_t poll_fds_used; \ + size_t poll_fds_size; \ + unsigned char poll_fds_iterating; \ + +#endif /* UV_POSIX_H */ diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-sunos.h b/lib/ESPiLight/pilight/libs/libuv/uv-sunos.h new file mode 100644 index 0000000..0421664 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-sunos.h @@ -0,0 +1,44 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_SUNOS_H +#define UV_SUNOS_H + +#include +#include + +/* For the sake of convenience and reduced #ifdef-ery in src/unix/sunos.c, + * add the fs_event fields even when this version of SunOS doesn't support + * file watching. + */ +#define UV_PLATFORM_LOOP_FIELDS \ + uv__io_t fs_event_watcher; \ + int fs_fd; \ + +#if defined(PORT_SOURCE_FILE) + +# define UV_PLATFORM_FS_EVENT_FIELDS \ + file_obj_t fo; \ + int fd; \ + +#endif /* defined(PORT_SOURCE_FILE) */ + +#endif /* UV_SUNOS_H */ diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-threadpool.h b/lib/ESPiLight/pilight/libs/libuv/uv-threadpool.h new file mode 100644 index 0000000..8fd2301 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-threadpool.h @@ -0,0 +1,38 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* + * This file is private to libuv. It provides common functionality to both + * Windows and Unix backends. + */ + +#ifndef UV_THREADPOOL_H_ +#define UV_THREADPOOL_H_ + +struct uv__work { + char *name; + void (*work)(struct uv__work *w); + void (*done)(struct uv__work *w, int status); + struct uv_loop_s* loop; + void* wq[2]; +}; + +#endif /* UV_THREADPOOL_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-threadpool.h.ori b/lib/ESPiLight/pilight/libs/libuv/uv-threadpool.h.ori new file mode 100644 index 0000000..9708ebd --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-threadpool.h.ori @@ -0,0 +1,37 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* + * This file is private to libuv. It provides common functionality to both + * Windows and Unix backends. + */ + +#ifndef UV_THREADPOOL_H_ +#define UV_THREADPOOL_H_ + +struct uv__work { + void (*work)(struct uv__work *w); + void (*done)(struct uv__work *w, int status); + struct uv_loop_s* loop; + void* wq[2]; +}; + +#endif /* UV_THREADPOOL_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-unix.h b/lib/ESPiLight/pilight/libs/libuv/uv-unix.h new file mode 100644 index 0000000..d775450 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-unix.h @@ -0,0 +1,368 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_UNIX_H +#define UV_UNIX_H + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#if !defined(__MVS__) +#include +#endif +#include +#include + +#include "uv-threadpool.h" + +#if defined(__linux__) +# include "uv-linux.h" +#elif defined (__MVS__) +# include "uv-os390.h" +#elif defined(_AIX) +# include "uv-aix.h" +#elif defined(__sun) +# include "uv-sunos.h" +#elif defined(__APPLE__) +# include "uv-darwin.h" +#elif defined(__DragonFly__) || \ + defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) || \ + defined(__OpenBSD__) || \ + defined(__NetBSD__) +# include "uv-bsd.h" +#elif defined(__CYGWIN__) || defined(__MSYS__) +# include "uv-posix.h" +#endif + +#ifndef PTHREAD_BARRIER_SERIAL_THREAD +# include "pthread-barrier.h" +#endif + +#ifndef NI_MAXHOST +# define NI_MAXHOST 1025 +#endif + +#ifndef NI_MAXSERV +# define NI_MAXSERV 32 +#endif + +#ifndef UV_IO_PRIVATE_PLATFORM_FIELDS +# define UV_IO_PRIVATE_PLATFORM_FIELDS /* empty */ +#endif + +struct uv__io_s; +struct uv_loop_s; + +typedef void (*uv__io_cb)(struct uv_loop_s* loop, + struct uv__io_s* w, + unsigned int events); +typedef struct uv__io_s uv__io_t; + +struct uv__io_s { + uv__io_cb cb; + void* pending_queue[2]; + void* watcher_queue[2]; + unsigned int pevents; /* Pending event mask i.e. mask at next tick. */ + unsigned int events; /* Current event mask. */ + int fd; + UV_IO_PRIVATE_PLATFORM_FIELDS +}; + +#ifndef UV_PLATFORM_SEM_T +# define UV_PLATFORM_SEM_T sem_t +#endif + +#ifndef UV_PLATFORM_LOOP_FIELDS +# define UV_PLATFORM_LOOP_FIELDS /* empty */ +#endif + +#ifndef UV_PLATFORM_FS_EVENT_FIELDS +# define UV_PLATFORM_FS_EVENT_FIELDS /* empty */ +#endif + +#ifndef UV_STREAM_PRIVATE_PLATFORM_FIELDS +# define UV_STREAM_PRIVATE_PLATFORM_FIELDS /* empty */ +#endif + +/* Note: May be cast to struct iovec. See writev(2). */ +typedef struct uv_buf_t { + char* base; + size_t len; +} uv_buf_t; + +typedef int uv_file; +typedef int uv_os_sock_t; +typedef int uv_os_fd_t; + +#define UV_ONCE_INIT PTHREAD_ONCE_INIT + +typedef pthread_once_t uv_once_t; +typedef pthread_t uv_thread_t; +typedef pthread_mutex_t uv_mutex_t; +typedef pthread_rwlock_t uv_rwlock_t; +typedef UV_PLATFORM_SEM_T uv_sem_t; +typedef pthread_cond_t uv_cond_t; +typedef pthread_key_t uv_key_t; +typedef pthread_barrier_t uv_barrier_t; + + +/* Platform-specific definitions for uv_spawn support. */ +typedef gid_t uv_gid_t; +typedef uid_t uv_uid_t; + +typedef struct dirent uv__dirent_t; + +#if defined(DT_UNKNOWN) +# define HAVE_DIRENT_TYPES +# if defined(DT_REG) +# define UV__DT_FILE DT_REG +# else +# define UV__DT_FILE -1 +# endif +# if defined(DT_DIR) +# define UV__DT_DIR DT_DIR +# else +# define UV__DT_DIR -2 +# endif +# if defined(DT_LNK) +# define UV__DT_LINK DT_LNK +# else +# define UV__DT_LINK -3 +# endif +# if defined(DT_FIFO) +# define UV__DT_FIFO DT_FIFO +# else +# define UV__DT_FIFO -4 +# endif +# if defined(DT_SOCK) +# define UV__DT_SOCKET DT_SOCK +# else +# define UV__DT_SOCKET -5 +# endif +# if defined(DT_CHR) +# define UV__DT_CHAR DT_CHR +# else +# define UV__DT_CHAR -6 +# endif +# if defined(DT_BLK) +# define UV__DT_BLOCK DT_BLK +# else +# define UV__DT_BLOCK -7 +# endif +#endif + +/* Platform-specific definitions for uv_dlopen support. */ +#define UV_DYNAMIC /* empty */ + +typedef struct { + void* handle; + char* errmsg; +} uv_lib_t; + +#define UV_LOOP_PRIVATE_FIELDS \ + unsigned long flags; \ + int backend_fd; \ + void* pending_queue[2]; \ + void* watcher_queue[2]; \ + uv__io_t** watchers; \ + unsigned int nwatchers; \ + unsigned int nfds; \ + void* wq[2]; \ + uv_mutex_t wq_mutex; \ + uv_async_t wq_async; \ + uv_rwlock_t cloexec_lock; \ + uv_handle_t* closing_handles; \ + void* process_handles[2]; \ + void* prepare_handles[2]; \ + void* check_handles[2]; \ + void* idle_handles[2]; \ + void* async_handles[2]; \ + void (*async_unused)(void); /* TODO(bnoordhuis) Remove in libuv v2. */ \ + uv__io_t async_io_watcher; \ + int async_wfd; \ + struct { \ + void* min; \ + unsigned int nelts; \ + } timer_heap; \ + uint64_t timer_counter; \ + uint64_t time; \ + int signal_pipefd[2]; \ + uv__io_t signal_io_watcher; \ + uv_signal_t child_watcher; \ + int emfile_fd; \ + UV_PLATFORM_LOOP_FIELDS \ + +#define UV_REQ_TYPE_PRIVATE /* empty */ + +#define UV_REQ_PRIVATE_FIELDS /* empty */ + +#define UV_PRIVATE_REQ_TYPES /* empty */ + +#define UV_WRITE_PRIVATE_FIELDS \ + void* queue[2]; \ + unsigned int write_index; \ + uv_buf_t* bufs; \ + unsigned int nbufs; \ + int error; \ + uv_buf_t bufsml[4]; \ + +#define UV_CONNECT_PRIVATE_FIELDS \ + void* queue[2]; \ + +#define UV_SHUTDOWN_PRIVATE_FIELDS /* empty */ + +#define UV_UDP_SEND_PRIVATE_FIELDS \ + void* queue[2]; \ + struct sockaddr_storage addr; \ + unsigned int nbufs; \ + uv_buf_t* bufs; \ + ssize_t status; \ + uv_udp_send_cb send_cb; \ + uv_buf_t bufsml[4]; \ + +#define UV_HANDLE_PRIVATE_FIELDS \ + uv_handle_t* next_closing; \ + unsigned int flags; \ + +#define UV_STREAM_PRIVATE_FIELDS \ + uv_connect_t *connect_req; \ + uv_shutdown_t *shutdown_req; \ + uv__io_t io_watcher; \ + void* write_queue[2]; \ + void* write_completed_queue[2]; \ + uv_connection_cb connection_cb; \ + int delayed_error; \ + int accepted_fd; \ + void* queued_fds; \ + UV_STREAM_PRIVATE_PLATFORM_FIELDS \ + +#define UV_TCP_PRIVATE_FIELDS /* empty */ + +#define UV_UDP_PRIVATE_FIELDS \ + uv_alloc_cb alloc_cb; \ + uv_udp_recv_cb recv_cb; \ + uv__io_t io_watcher; \ + void* write_queue[2]; \ + void* write_completed_queue[2]; \ + +#define UV_PIPE_PRIVATE_FIELDS \ + const char* pipe_fname; /* strdup'ed */ + +#define UV_POLL_PRIVATE_FIELDS \ + uv__io_t io_watcher; + +#define UV_PREPARE_PRIVATE_FIELDS \ + uv_prepare_cb prepare_cb; \ + void* queue[2]; \ + +#define UV_CHECK_PRIVATE_FIELDS \ + uv_check_cb check_cb; \ + void* queue[2]; \ + +#define UV_IDLE_PRIVATE_FIELDS \ + uv_idle_cb idle_cb; \ + void* queue[2]; \ + +#define UV_ASYNC_PRIVATE_FIELDS \ + uv_async_cb async_cb; \ + void* queue[2]; \ + int pending; \ + +#define UV_TIMER_PRIVATE_FIELDS \ + uv_timer_cb timer_cb; \ + void* heap_node[3]; \ + uint64_t timeout; \ + uint64_t repeat; \ + uint64_t start_id; + +#define UV_GETADDRINFO_PRIVATE_FIELDS \ + struct uv__work work_req; \ + uv_getaddrinfo_cb cb; \ + struct addrinfo* hints; \ + char* hostname; \ + char* service; \ + struct addrinfo* addrinfo; \ + int retcode; + +#define UV_GETNAMEINFO_PRIVATE_FIELDS \ + struct uv__work work_req; \ + uv_getnameinfo_cb getnameinfo_cb; \ + struct sockaddr_storage storage; \ + int flags; \ + char host[NI_MAXHOST]; \ + char service[NI_MAXSERV]; \ + int retcode; + +#define UV_PROCESS_PRIVATE_FIELDS \ + void* queue[2]; \ + int status; \ + +#define UV_FS_PRIVATE_FIELDS \ + const char *new_path; \ + uv_file file; \ + int flags; \ + mode_t mode; \ + unsigned int nbufs; \ + uv_buf_t* bufs; \ + off_t off; \ + uv_uid_t uid; \ + uv_gid_t gid; \ + double atime; \ + double mtime; \ + struct uv__work work_req; \ + uv_buf_t bufsml[4]; \ + +#define UV_WORK_PRIVATE_FIELDS \ + struct uv__work work_req; + +#define UV_TTY_PRIVATE_FIELDS \ + struct termios orig_termios; \ + int mode; + +#define UV_SIGNAL_PRIVATE_FIELDS \ + /* RB_ENTRY(uv_signal_s) tree_entry; */ \ + struct { \ + struct uv_signal_s* rbe_left; \ + struct uv_signal_s* rbe_right; \ + struct uv_signal_s* rbe_parent; \ + int rbe_color; \ + } tree_entry; \ + /* Use two counters here so we don have to fiddle with atomics. */ \ + unsigned int caught_signals; \ + unsigned int dispatched_signals; + +#define UV_FS_EVENT_PRIVATE_FIELDS \ + uv_fs_event_cb cb; \ + UV_PLATFORM_FS_EVENT_FIELDS \ + +#endif /* UV_UNIX_H */ diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-version.h b/lib/ESPiLight/pilight/libs/libuv/uv-version.h new file mode 100644 index 0000000..77bd262 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-version.h @@ -0,0 +1,43 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_VERSION_H +#define UV_VERSION_H + + /* + * Versions with the same major number are ABI stable. API is allowed to + * evolve between minor releases, but only in a backwards compatible way. + * Make sure you update the -soname directives in configure.ac + * and uv.gyp whenever you bump UV_VERSION_MAJOR or UV_VERSION_MINOR (but + * not UV_VERSION_PATCH.) + */ + +#define UV_VERSION_MAJOR 1 +#define UV_VERSION_MINOR 12 +#define UV_VERSION_PATCH 1 +#define UV_VERSION_IS_RELEASE 0 +#define UV_VERSION_SUFFIX "dev" + +#define UV_VERSION_HEX ((UV_VERSION_MAJOR << 16) | \ + (UV_VERSION_MINOR << 8) | \ + (UV_VERSION_PATCH)) + +#endif /* UV_VERSION_H */ diff --git a/lib/ESPiLight/pilight/libs/libuv/uv-win.h b/lib/ESPiLight/pilight/libs/libuv/uv-win.h new file mode 100644 index 0000000..9677ff1 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv-win.h @@ -0,0 +1,650 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef _WIN32_WINNT +# define _WIN32_WINNT 0x0502 +#endif + +#if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED) +typedef intptr_t ssize_t; +# define _SSIZE_T_ +# define _SSIZE_T_DEFINED +#endif + +#include + +#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) +typedef struct pollfd { + SOCKET fd; + short events; + short revents; +} WSAPOLLFD, *PWSAPOLLFD, *LPWSAPOLLFD; +#endif + +#ifndef LOCALE_INVARIANT +# define LOCALE_INVARIANT 0x007f +#endif + +#include +#include +#include + +#include +#include +#include +#include + +#if defined(_MSC_VER) && _MSC_VER < 1600 +# include "stdint-msvc2008.h" +#else +# include +#endif + +#include "tree.h" +#include "uv-threadpool.h" + +#define MAX_PIPENAME_LEN 256 + +#ifndef S_IFLNK +# define S_IFLNK 0xA000 +#endif + +/* Additional signals supported by uv_signal and or uv_kill. The CRT defines + * the following signals already: + * + * #define SIGINT 2 + * #define SIGILL 4 + * #define SIGABRT_COMPAT 6 + * #define SIGFPE 8 + * #define SIGSEGV 11 + * #define SIGTERM 15 + * #define SIGBREAK 21 + * #define SIGABRT 22 + * + * The additional signals have values that are common on other Unix + * variants (Linux and Darwin) + */ +#define SIGHUP 1 +#define SIGKILL 9 +#define SIGWINCH 28 + +/* The CRT defines SIGABRT_COMPAT as 6, which equals SIGABRT on many */ +/* unix-like platforms. However MinGW doesn't define it, so we do. */ +#ifndef SIGABRT_COMPAT +# define SIGABRT_COMPAT 6 +#endif + +/* + * Guids and typedefs for winsock extension functions + * Mingw32 doesn't have these :-( + */ +#ifndef WSAID_ACCEPTEX +# define WSAID_ACCEPTEX \ + {0xb5367df1, 0xcbac, 0x11cf, \ + {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} + +# define WSAID_CONNECTEX \ + {0x25a207b9, 0xddf3, 0x4660, \ + {0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}} + +# define WSAID_GETACCEPTEXSOCKADDRS \ + {0xb5367df2, 0xcbac, 0x11cf, \ + {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} + +# define WSAID_DISCONNECTEX \ + {0x7fda2e11, 0x8630, 0x436f, \ + {0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}} + +# define WSAID_TRANSMITFILE \ + {0xb5367df0, 0xcbac, 0x11cf, \ + {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} + + typedef BOOL (PASCAL *LPFN_ACCEPTEX) + (SOCKET sListenSocket, + SOCKET sAcceptSocket, + PVOID lpOutputBuffer, + DWORD dwReceiveDataLength, + DWORD dwLocalAddressLength, + DWORD dwRemoteAddressLength, + LPDWORD lpdwBytesReceived, + LPOVERLAPPED lpOverlapped); + + typedef BOOL (PASCAL *LPFN_CONNECTEX) + (SOCKET s, + const struct sockaddr* name, + int namelen, + PVOID lpSendBuffer, + DWORD dwSendDataLength, + LPDWORD lpdwBytesSent, + LPOVERLAPPED lpOverlapped); + + typedef void (PASCAL *LPFN_GETACCEPTEXSOCKADDRS) + (PVOID lpOutputBuffer, + DWORD dwReceiveDataLength, + DWORD dwLocalAddressLength, + DWORD dwRemoteAddressLength, + LPSOCKADDR* LocalSockaddr, + LPINT LocalSockaddrLength, + LPSOCKADDR* RemoteSockaddr, + LPINT RemoteSockaddrLength); + + typedef BOOL (PASCAL *LPFN_DISCONNECTEX) + (SOCKET hSocket, + LPOVERLAPPED lpOverlapped, + DWORD dwFlags, + DWORD reserved); + + typedef BOOL (PASCAL *LPFN_TRANSMITFILE) + (SOCKET hSocket, + HANDLE hFile, + DWORD nNumberOfBytesToWrite, + DWORD nNumberOfBytesPerSend, + LPOVERLAPPED lpOverlapped, + LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, + DWORD dwFlags); + + typedef PVOID RTL_SRWLOCK; + typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK; +#endif + +typedef int (WSAAPI* LPFN_WSARECV) + (SOCKET socket, + LPWSABUF buffers, + DWORD buffer_count, + LPDWORD bytes, + LPDWORD flags, + LPWSAOVERLAPPED overlapped, + LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); + +typedef int (WSAAPI* LPFN_WSARECVFROM) + (SOCKET socket, + LPWSABUF buffers, + DWORD buffer_count, + LPDWORD bytes, + LPDWORD flags, + struct sockaddr* addr, + LPINT addr_len, + LPWSAOVERLAPPED overlapped, + LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); + +#ifndef _NTDEF_ + typedef LONG NTSTATUS; + typedef NTSTATUS *PNTSTATUS; +#endif + +#ifndef RTL_CONDITION_VARIABLE_INIT + typedef PVOID CONDITION_VARIABLE, *PCONDITION_VARIABLE; +#endif + +typedef struct _AFD_POLL_HANDLE_INFO { + HANDLE Handle; + ULONG Events; + NTSTATUS Status; +} AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO; + +typedef struct _AFD_POLL_INFO { + LARGE_INTEGER Timeout; + ULONG NumberOfHandles; + ULONG Exclusive; + AFD_POLL_HANDLE_INFO Handles[1]; +} AFD_POLL_INFO, *PAFD_POLL_INFO; + +#define UV_MSAFD_PROVIDER_COUNT 3 + + +/** + * It should be possible to cast uv_buf_t[] to WSABUF[] + * see http://msdn.microsoft.com/en-us/library/ms741542(v=vs.85).aspx + */ +typedef struct uv_buf_t { + ULONG len; + char* base; +} uv_buf_t; + +typedef int uv_file; +typedef SOCKET uv_os_sock_t; +typedef HANDLE uv_os_fd_t; + +typedef HANDLE uv_thread_t; + +typedef HANDLE uv_sem_t; + +typedef CRITICAL_SECTION uv_mutex_t; + +/* This condition variable implementation is based on the SetEvent solution + * (section 3.2) at http://www.cs.wustl.edu/~schmidt/win32-cv-1.html + * We could not use the SignalObjectAndWait solution (section 3.4) because + * it want the 2nd argument (type uv_mutex_t) of uv_cond_wait() and + * uv_cond_timedwait() to be HANDLEs, but we use CRITICAL_SECTIONs. + */ + +typedef union { + CONDITION_VARIABLE cond_var; + struct { + unsigned int waiters_count; + CRITICAL_SECTION waiters_count_lock; + HANDLE signal_event; + HANDLE broadcast_event; + } fallback; +} uv_cond_t; + +typedef union { + struct { + unsigned int num_readers_; + CRITICAL_SECTION num_readers_lock_; + HANDLE write_semaphore_; + } state_; + /* TODO: remove me in v2.x. */ + struct { + SRWLOCK unused_; + } unused1_; + /* TODO: remove me in v2.x. */ + struct { + uv_mutex_t unused1_; + uv_mutex_t unused2_; + } unused2_; +} uv_rwlock_t; + +typedef struct { + unsigned int n; + unsigned int count; + uv_mutex_t mutex; + uv_sem_t turnstile1; + uv_sem_t turnstile2; +} uv_barrier_t; + +typedef struct { + DWORD tls_index; +} uv_key_t; + +#define UV_ONCE_INIT { 0, NULL } + +typedef struct uv_once_s { + unsigned char ran; + HANDLE event; +} uv_once_t; + +/* Platform-specific definitions for uv_spawn support. */ +typedef unsigned char uv_uid_t; +typedef unsigned char uv_gid_t; + +typedef struct uv__dirent_s { + int d_type; + char d_name[1]; +} uv__dirent_t; + +#define HAVE_DIRENT_TYPES +#define UV__DT_DIR UV_DIRENT_DIR +#define UV__DT_FILE UV_DIRENT_FILE +#define UV__DT_LINK UV_DIRENT_LINK +#define UV__DT_FIFO UV_DIRENT_FIFO +#define UV__DT_SOCKET UV_DIRENT_SOCKET +#define UV__DT_CHAR UV_DIRENT_CHAR +#define UV__DT_BLOCK UV_DIRENT_BLOCK + +/* Platform-specific definitions for uv_dlopen support. */ +#define UV_DYNAMIC FAR WINAPI +typedef struct { + HMODULE handle; + char* errmsg; +} uv_lib_t; + +RB_HEAD(uv_timer_tree_s, uv_timer_s); + +#define UV_LOOP_PRIVATE_FIELDS \ + /* The loop's I/O completion port */ \ + HANDLE iocp; \ + /* The current time according to the event loop. in msecs. */ \ + uint64_t time; \ + /* Tail of a single-linked circular queue of pending reqs. If the queue */ \ + /* is empty, tail_ is NULL. If there is only one item, */ \ + /* tail_->next_req == tail_ */ \ + uv_req_t* pending_reqs_tail; \ + /* Head of a single-linked list of closed handles */ \ + uv_handle_t* endgame_handles; \ + /* The head of the timers tree */ \ + struct uv_timer_tree_s timers; \ + /* Lists of active loop (prepare / check / idle) watchers */ \ + uv_prepare_t* prepare_handles; \ + uv_check_t* check_handles; \ + uv_idle_t* idle_handles; \ + /* This pointer will refer to the prepare/check/idle handle whose */ \ + /* callback is scheduled to be called next. This is needed to allow */ \ + /* safe removal from one of the lists above while that list being */ \ + /* iterated over. */ \ + uv_prepare_t* next_prepare_handle; \ + uv_check_t* next_check_handle; \ + uv_idle_t* next_idle_handle; \ + /* This handle holds the peer sockets for the fast variant of uv_poll_t */ \ + SOCKET poll_peer_sockets[UV_MSAFD_PROVIDER_COUNT]; \ + /* Counter to keep track of active tcp streams */ \ + unsigned int active_tcp_streams; \ + /* Counter to keep track of active udp streams */ \ + unsigned int active_udp_streams; \ + /* Counter to started timer */ \ + uint64_t timer_counter; \ + /* Threadpool */ \ + void* wq[2]; \ + uv_mutex_t wq_mutex; \ + uv_async_t wq_async; + +#define UV_REQ_TYPE_PRIVATE \ + /* TODO: remove the req suffix */ \ + UV_ACCEPT, \ + UV_FS_EVENT_REQ, \ + UV_POLL_REQ, \ + UV_PROCESS_EXIT, \ + UV_READ, \ + UV_UDP_RECV, \ + UV_WAKEUP, \ + UV_SIGNAL_REQ, + +#define UV_REQ_PRIVATE_FIELDS \ + union { \ + /* Used by I/O operations */ \ + struct { \ + OVERLAPPED overlapped; \ + size_t queued_bytes; \ + } io; \ + } u; \ + struct uv_req_s* next_req; + +#define UV_WRITE_PRIVATE_FIELDS \ + int ipc_header; \ + uv_buf_t write_buffer; \ + HANDLE event_handle; \ + HANDLE wait_handle; + +#define UV_CONNECT_PRIVATE_FIELDS \ + /* empty */ + +#define UV_SHUTDOWN_PRIVATE_FIELDS \ + /* empty */ + +#define UV_UDP_SEND_PRIVATE_FIELDS \ + /* empty */ + +#define UV_PRIVATE_REQ_TYPES \ + typedef struct uv_pipe_accept_s { \ + UV_REQ_FIELDS \ + HANDLE pipeHandle; \ + struct uv_pipe_accept_s* next_pending; \ + } uv_pipe_accept_t; \ + \ + typedef struct uv_tcp_accept_s { \ + UV_REQ_FIELDS \ + SOCKET accept_socket; \ + char accept_buffer[sizeof(struct sockaddr_storage) * 2 + 32]; \ + HANDLE event_handle; \ + HANDLE wait_handle; \ + struct uv_tcp_accept_s* next_pending; \ + } uv_tcp_accept_t; \ + \ + typedef struct uv_read_s { \ + UV_REQ_FIELDS \ + HANDLE event_handle; \ + HANDLE wait_handle; \ + } uv_read_t; + +#define uv_stream_connection_fields \ + unsigned int write_reqs_pending; \ + uv_shutdown_t* shutdown_req; + +#define uv_stream_server_fields \ + uv_connection_cb connection_cb; + +#define UV_STREAM_PRIVATE_FIELDS \ + unsigned int reqs_pending; \ + int activecnt; \ + uv_read_t read_req; \ + union { \ + struct { uv_stream_connection_fields } conn; \ + struct { uv_stream_server_fields } serv; \ + } stream; + +#define uv_tcp_server_fields \ + uv_tcp_accept_t* accept_reqs; \ + unsigned int processed_accepts; \ + uv_tcp_accept_t* pending_accepts; \ + LPFN_ACCEPTEX func_acceptex; + +#define uv_tcp_connection_fields \ + uv_buf_t read_buffer; \ + LPFN_CONNECTEX func_connectex; + +#define UV_TCP_PRIVATE_FIELDS \ + SOCKET socket; \ + int delayed_error; \ + union { \ + struct { uv_tcp_server_fields } serv; \ + struct { uv_tcp_connection_fields } conn; \ + } tcp; + +#define UV_UDP_PRIVATE_FIELDS \ + SOCKET socket; \ + unsigned int reqs_pending; \ + int activecnt; \ + uv_req_t recv_req; \ + uv_buf_t recv_buffer; \ + struct sockaddr_storage recv_from; \ + int recv_from_len; \ + uv_udp_recv_cb recv_cb; \ + uv_alloc_cb alloc_cb; \ + LPFN_WSARECV func_wsarecv; \ + LPFN_WSARECVFROM func_wsarecvfrom; + +#define uv_pipe_server_fields \ + int pending_instances; \ + uv_pipe_accept_t* accept_reqs; \ + uv_pipe_accept_t* pending_accepts; + +#define uv_pipe_connection_fields \ + uv_timer_t* eof_timer; \ + uv_write_t ipc_header_write_req; \ + int ipc_pid; \ + uint64_t remaining_ipc_rawdata_bytes; \ + struct { \ + void* queue[2]; \ + int queue_len; \ + } pending_ipc_info; \ + uv_write_t* non_overlapped_writes_tail; \ + uv_mutex_t readfile_mutex; \ + volatile HANDLE readfile_thread; + +#define UV_PIPE_PRIVATE_FIELDS \ + HANDLE handle; \ + WCHAR* name; \ + union { \ + struct { uv_pipe_server_fields } serv; \ + struct { uv_pipe_connection_fields } conn; \ + } pipe; + +/* TODO: put the parser states in an union - TTY handles are always */ +/* half-duplex so read-state can safely overlap write-state. */ +#define UV_TTY_PRIVATE_FIELDS \ + HANDLE handle; \ + union { \ + struct { \ + /* Used for readable TTY handles */ \ + /* TODO: remove me in v2.x. */ \ + HANDLE unused_; \ + uv_buf_t read_line_buffer; \ + HANDLE read_raw_wait; \ + /* Fields used for translating win keystrokes into vt100 characters */ \ + char last_key[8]; \ + unsigned char last_key_offset; \ + unsigned char last_key_len; \ + WCHAR last_utf16_high_surrogate; \ + INPUT_RECORD last_input_record; \ + } rd; \ + struct { \ + /* Used for writable TTY handles */ \ + /* utf8-to-utf16 conversion state */ \ + unsigned int utf8_codepoint; \ + unsigned char utf8_bytes_left; \ + /* eol conversion state */ \ + unsigned char previous_eol; \ + /* ansi parser state */ \ + unsigned char ansi_parser_state; \ + unsigned char ansi_csi_argc; \ + unsigned short ansi_csi_argv[4]; \ + COORD saved_position; \ + WORD saved_attributes; \ + } wr; \ + } tty; + +#define UV_POLL_PRIVATE_FIELDS \ + SOCKET socket; \ + /* Used in fast mode */ \ + SOCKET peer_socket; \ + AFD_POLL_INFO afd_poll_info_1; \ + AFD_POLL_INFO afd_poll_info_2; \ + /* Used in fast and slow mode. */ \ + uv_req_t poll_req_1; \ + uv_req_t poll_req_2; \ + unsigned char submitted_events_1; \ + unsigned char submitted_events_2; \ + unsigned char mask_events_1; \ + unsigned char mask_events_2; \ + unsigned char events; + +#define UV_TIMER_PRIVATE_FIELDS \ + RB_ENTRY(uv_timer_s) tree_entry; \ + uint64_t due; \ + uint64_t repeat; \ + uint64_t start_id; \ + uv_timer_cb timer_cb; + +#define UV_ASYNC_PRIVATE_FIELDS \ + struct uv_req_s async_req; \ + uv_async_cb async_cb; \ + /* char to avoid alignment issues */ \ + char volatile async_sent; + +#define UV_PREPARE_PRIVATE_FIELDS \ + uv_prepare_t* prepare_prev; \ + uv_prepare_t* prepare_next; \ + uv_prepare_cb prepare_cb; + +#define UV_CHECK_PRIVATE_FIELDS \ + uv_check_t* check_prev; \ + uv_check_t* check_next; \ + uv_check_cb check_cb; + +#define UV_IDLE_PRIVATE_FIELDS \ + uv_idle_t* idle_prev; \ + uv_idle_t* idle_next; \ + uv_idle_cb idle_cb; + +#define UV_HANDLE_PRIVATE_FIELDS \ + uv_handle_t* endgame_next; \ + unsigned int flags; + +#define UV_GETADDRINFO_PRIVATE_FIELDS \ + struct uv__work work_req; \ + uv_getaddrinfo_cb getaddrinfo_cb; \ + void* alloc; \ + WCHAR* node; \ + WCHAR* service; \ + /* The addrinfoW field is used to store a pointer to the hints, and */ \ + /* later on to store the result of GetAddrInfoW. The final result will */ \ + /* be converted to struct addrinfo* and stored in the addrinfo field. */ \ + struct addrinfoW* addrinfow; \ + struct addrinfo* addrinfo; \ + int retcode; + +#define UV_GETNAMEINFO_PRIVATE_FIELDS \ + struct uv__work work_req; \ + uv_getnameinfo_cb getnameinfo_cb; \ + struct sockaddr_storage storage; \ + int flags; \ + char host[NI_MAXHOST]; \ + char service[NI_MAXSERV]; \ + int retcode; + +#define UV_PROCESS_PRIVATE_FIELDS \ + struct uv_process_exit_s { \ + UV_REQ_FIELDS \ + } exit_req; \ + BYTE* child_stdio_buffer; \ + int exit_signal; \ + HANDLE wait_handle; \ + HANDLE process_handle; \ + volatile char exit_cb_pending; + +#define UV_FS_PRIVATE_FIELDS \ + struct uv__work work_req; \ + int flags; \ + DWORD sys_errno_; \ + union { \ + /* TODO: remove me in 0.9. */ \ + WCHAR* pathw; \ + int fd; \ + } file; \ + union { \ + struct { \ + int mode; \ + WCHAR* new_pathw; \ + int file_flags; \ + int fd_out; \ + unsigned int nbufs; \ + uv_buf_t* bufs; \ + int64_t offset; \ + uv_buf_t bufsml[4]; \ + } info; \ + struct { \ + double atime; \ + double mtime; \ + } time; \ + } fs; + +#define UV_WORK_PRIVATE_FIELDS \ + struct uv__work work_req; + +#define UV_FS_EVENT_PRIVATE_FIELDS \ + struct uv_fs_event_req_s { \ + UV_REQ_FIELDS \ + } req; \ + HANDLE dir_handle; \ + int req_pending; \ + uv_fs_event_cb cb; \ + WCHAR* filew; \ + WCHAR* short_filew; \ + WCHAR* dirw; \ + char* buffer; + +#define UV_SIGNAL_PRIVATE_FIELDS \ + RB_ENTRY(uv_signal_s) tree_entry; \ + struct uv_req_s signal_req; \ + unsigned long pending_signum; + +#ifndef F_OK +#define F_OK 0 +#endif +#ifndef R_OK +#define R_OK 4 +#endif +#ifndef W_OK +#define W_OK 2 +#endif +#ifndef X_OK +#define X_OK 1 +#endif diff --git a/lib/ESPiLight/pilight/libs/libuv/uv.h b/lib/ESPiLight/pilight/libs/libuv/uv.h new file mode 100644 index 0000000..1f8f4d7 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv.h @@ -0,0 +1,1510 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* See https://github.com/libuv/libuv#documentation for documentation. */ + +#ifndef UV_H +#define UV_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _WIN32 + /* Windows - set up dll import/export decorators. */ +# if defined(BUILDING_UV_SHARED) + /* Building shared library. */ +# define UV_EXTERN __declspec(dllexport) +# elif defined(USING_UV_SHARED) + /* Using shared library. */ +# define UV_EXTERN __declspec(dllimport) +# else + /* Building static library. */ +# define UV_EXTERN /* nothing */ +# endif +#elif __GNUC__ >= 4 +# define UV_EXTERN __attribute__((visibility("default"))) +#else +# define UV_EXTERN /* nothing */ +#endif + +#include "uv-errno.h" +#include "uv-version.h" +#include +#include + +#if defined(_MSC_VER) && _MSC_VER < 1600 +# include "stdint-msvc2008.h" +#else +# include +#endif + +#if defined(_WIN32) +# include "uv-win.h" +#else +# include "uv-unix.h" +#endif + +/* Expand this list if necessary. */ +#define UV_ERRNO_MAP(XX) \ + XX(E2BIG, "argument list too long") \ + XX(EACCES, "permission denied") \ + XX(EADDRINUSE, "address already in use") \ + XX(EADDRNOTAVAIL, "address not available") \ + XX(EAFNOSUPPORT, "address family not supported") \ + XX(EAGAIN, "resource temporarily unavailable") \ + XX(EAI_ADDRFAMILY, "address family not supported") \ + XX(EAI_AGAIN, "temporary failure") \ + XX(EAI_BADFLAGS, "bad ai_flags value") \ + XX(EAI_BADHINTS, "invalid value for hints") \ + XX(EAI_CANCELED, "request canceled") \ + XX(EAI_FAIL, "permanent failure") \ + XX(EAI_FAMILY, "ai_family not supported") \ + XX(EAI_MEMORY, "out of memory") \ + XX(EAI_NODATA, "no address") \ + XX(EAI_NONAME, "unknown node or service") \ + XX(EAI_OVERFLOW, "argument buffer overflow") \ + XX(EAI_PROTOCOL, "resolved protocol is unknown") \ + XX(EAI_SERVICE, "service not available for socket type") \ + XX(EAI_SOCKTYPE, "socket type not supported") \ + XX(EALREADY, "connection already in progress") \ + XX(EBADF, "bad file descriptor") \ + XX(EBUSY, "resource busy or locked") \ + XX(ECANCELED, "operation canceled") \ + XX(ECHARSET, "invalid Unicode character") \ + XX(ECONNABORTED, "software caused connection abort") \ + XX(ECONNREFUSED, "connection refused") \ + XX(ECONNRESET, "connection reset by peer") \ + XX(EDESTADDRREQ, "destination address required") \ + XX(EEXIST, "file already exists") \ + XX(EFAULT, "bad address in system call argument") \ + XX(EFBIG, "file too large") \ + XX(EHOSTUNREACH, "host is unreachable") \ + XX(EINTR, "interrupted system call") \ + XX(EINVAL, "invalid argument") \ + XX(EIO, "i/o error") \ + XX(EISCONN, "socket is already connected") \ + XX(EISDIR, "illegal operation on a directory") \ + XX(ELOOP, "too many symbolic links encountered") \ + XX(EMFILE, "too many open files") \ + XX(EMSGSIZE, "message too long") \ + XX(ENAMETOOLONG, "name too long") \ + XX(ENETDOWN, "network is down") \ + XX(ENETUNREACH, "network is unreachable") \ + XX(ENFILE, "file table overflow") \ + XX(ENOBUFS, "no buffer space available") \ + XX(ENODEV, "no such device") \ + XX(ENOENT, "no such file or directory") \ + XX(ENOMEM, "not enough memory") \ + XX(ENONET, "machine is not on the network") \ + XX(ENOPROTOOPT, "protocol not available") \ + XX(ENOSPC, "no space left on device") \ + XX(ENOSYS, "function not implemented") \ + XX(ENOTCONN, "socket is not connected") \ + XX(ENOTDIR, "not a directory") \ + XX(ENOTEMPTY, "directory not empty") \ + XX(ENOTSOCK, "socket operation on non-socket") \ + XX(ENOTSUP, "operation not supported on socket") \ + XX(EPERM, "operation not permitted") \ + XX(EPIPE, "broken pipe") \ + XX(EPROTO, "protocol error") \ + XX(EPROTONOSUPPORT, "protocol not supported") \ + XX(EPROTOTYPE, "protocol wrong type for socket") \ + XX(ERANGE, "result too large") \ + XX(EROFS, "read-only file system") \ + XX(ESHUTDOWN, "cannot send after transport endpoint shutdown") \ + XX(ESPIPE, "invalid seek") \ + XX(ESRCH, "no such process") \ + XX(ETIMEDOUT, "connection timed out") \ + XX(ETXTBSY, "text file is busy") \ + XX(EXDEV, "cross-device link not permitted") \ + XX(UNKNOWN, "unknown error") \ + XX(EOF, "end of file") \ + XX(ENXIO, "no such device or address") \ + XX(EMLINK, "too many links") \ + XX(EHOSTDOWN, "host is down") \ + +#define UV_HANDLE_TYPE_MAP(XX) \ + XX(ASYNC, async) \ + XX(CHECK, check) \ + XX(FS_EVENT, fs_event) \ + XX(FS_POLL, fs_poll) \ + XX(HANDLE, handle) \ + XX(IDLE, idle) \ + XX(NAMED_PIPE, pipe) \ + XX(POLL, poll) \ + XX(PREPARE, prepare) \ + XX(PROCESS, process) \ + XX(STREAM, stream) \ + XX(TCP, tcp) \ + XX(TIMER, timer) \ + XX(TTY, tty) \ + XX(UDP, udp) \ + XX(SIGNAL, signal) \ + +#define UV_REQ_TYPE_MAP(XX) \ + XX(REQ, req) \ + XX(CONNECT, connect) \ + XX(WRITE, write) \ + XX(SHUTDOWN, shutdown) \ + XX(UDP_SEND, udp_send) \ + XX(FS, fs) \ + XX(WORK, work) \ + XX(GETADDRINFO, getaddrinfo) \ + XX(GETNAMEINFO, getnameinfo) \ + +typedef enum { +#define XX(code, _) UV_ ## code = UV__ ## code, + UV_ERRNO_MAP(XX) +#undef XX + UV_ERRNO_MAX = UV__EOF - 1 +} uv_errno_t; + +typedef enum { + UV_UNKNOWN_HANDLE = 0, +#define XX(uc, lc) UV_##uc, + UV_HANDLE_TYPE_MAP(XX) +#undef XX + UV_FILE, + UV_HANDLE_TYPE_MAX +} uv_handle_type; + +typedef enum { + UV_UNKNOWN_REQ = 0, +#define XX(uc, lc) UV_##uc, + UV_REQ_TYPE_MAP(XX) +#undef XX + UV_REQ_TYPE_PRIVATE + UV_REQ_TYPE_MAX +} uv_req_type; + + +/* Handle types. */ +typedef struct uv_loop_s uv_loop_t; +typedef struct uv_handle_s uv_handle_t; +typedef struct uv_stream_s uv_stream_t; +typedef struct uv_tcp_s uv_tcp_t; +typedef struct uv_udp_s uv_udp_t; +typedef struct uv_pipe_s uv_pipe_t; +typedef struct uv_tty_s uv_tty_t; +typedef struct uv_poll_s uv_poll_t; +typedef struct uv_timer_s uv_timer_t; +typedef struct uv_prepare_s uv_prepare_t; +typedef struct uv_check_s uv_check_t; +typedef struct uv_idle_s uv_idle_t; +typedef struct uv_async_s uv_async_t; +typedef struct uv_process_s uv_process_t; +typedef struct uv_fs_event_s uv_fs_event_t; +typedef struct uv_fs_poll_s uv_fs_poll_t; +typedef struct uv_signal_s uv_signal_t; + +/* Request types. */ +typedef struct uv_req_s uv_req_t; +typedef struct uv_getaddrinfo_s uv_getaddrinfo_t; +typedef struct uv_getnameinfo_s uv_getnameinfo_t; +typedef struct uv_shutdown_s uv_shutdown_t; +typedef struct uv_write_s uv_write_t; +typedef struct uv_connect_s uv_connect_t; +typedef struct uv_udp_send_s uv_udp_send_t; +typedef struct uv_fs_s uv_fs_t; +typedef struct uv_work_s uv_work_t; + +/* None of the above. */ +typedef struct uv_cpu_info_s uv_cpu_info_t; +typedef struct uv_interface_address_s uv_interface_address_t; +typedef struct uv_dirent_s uv_dirent_t; +typedef struct uv_passwd_s uv_passwd_t; + +typedef enum { + UV_LOOP_BLOCK_SIGNAL +} uv_loop_option; + +typedef enum { + UV_RUN_DEFAULT = 0, + UV_RUN_ONCE, + UV_RUN_NOWAIT +} uv_run_mode; + + +UV_EXTERN unsigned int uv_version(void); +UV_EXTERN const char* uv_version_string(void); + +typedef void* (*uv_malloc_func)(size_t size); +typedef void* (*uv_realloc_func)(void* ptr, size_t size); +typedef void* (*uv_calloc_func)(size_t count, size_t size); +typedef void (*uv_free_func)(void* ptr); + +UV_EXTERN int uv_replace_allocator(uv_malloc_func malloc_func, + uv_realloc_func realloc_func, + uv_calloc_func calloc_func, + uv_free_func free_func); + +UV_EXTERN uv_loop_t* uv_default_loop(void); +UV_EXTERN int uv_loop_init(uv_loop_t* loop); +UV_EXTERN int uv_loop_close(uv_loop_t* loop); +/* + * NOTE: + * This function is DEPRECATED (to be removed after 0.12), users should + * allocate the loop manually and use uv_loop_init instead. + */ +UV_EXTERN uv_loop_t* uv_loop_new(void); +/* + * NOTE: + * This function is DEPRECATED (to be removed after 0.12). Users should use + * uv_loop_close and free the memory manually instead. + */ +UV_EXTERN void uv_loop_delete(uv_loop_t*); +UV_EXTERN size_t uv_loop_size(void); +UV_EXTERN int uv_loop_alive(const uv_loop_t* loop); +UV_EXTERN int uv_loop_configure(uv_loop_t* loop, uv_loop_option option, ...); +UV_EXTERN int uv_loop_fork(uv_loop_t* loop); + +UV_EXTERN int uv_run(uv_loop_t*, uv_run_mode mode); +UV_EXTERN void uv_stop(uv_loop_t*); + +UV_EXTERN void uv_ref(uv_handle_t*); +UV_EXTERN void uv_unref(uv_handle_t*); +UV_EXTERN int uv_has_ref(const uv_handle_t*); + +UV_EXTERN void uv_update_time(uv_loop_t*); +UV_EXTERN uint64_t uv_now(const uv_loop_t*); + +UV_EXTERN int uv_backend_fd(const uv_loop_t*); +UV_EXTERN int uv_backend_timeout(const uv_loop_t*); + +typedef void (*uv_alloc_cb)(uv_handle_t* handle, + size_t suggested_size, + uv_buf_t* buf); +typedef void (*uv_read_cb)(uv_stream_t* stream, + ssize_t nread, + const uv_buf_t* buf); +typedef void (*uv_write_cb)(uv_write_t* req, int status); +typedef void (*uv_connect_cb)(uv_connect_t* req, int status); +typedef void (*uv_shutdown_cb)(uv_shutdown_t* req, int status); +typedef void (*uv_connection_cb)(uv_stream_t* server, int status); +typedef void (*uv_close_cb)(uv_handle_t* handle); +typedef void (*uv_poll_cb)(uv_poll_t* handle, int status, int events); +typedef void (*uv_timer_cb)(uv_timer_t* handle); +typedef void (*uv_async_cb)(uv_async_t* handle); +typedef void (*uv_prepare_cb)(uv_prepare_t* handle); +typedef void (*uv_check_cb)(uv_check_t* handle); +typedef void (*uv_idle_cb)(uv_idle_t* handle); +typedef void (*uv_exit_cb)(uv_process_t*, int64_t exit_status, int term_signal); +typedef void (*uv_walk_cb)(uv_handle_t* handle, void* arg); +typedef void (*uv_fs_cb)(uv_fs_t* req); +typedef void (*uv_work_cb)(uv_work_t* req); +typedef void (*uv_after_work_cb)(uv_work_t* req, int status); +typedef void (*uv_getaddrinfo_cb)(uv_getaddrinfo_t* req, + int status, + struct addrinfo* res); +typedef void (*uv_getnameinfo_cb)(uv_getnameinfo_t* req, + int status, + const char* hostname, + const char* service); + +typedef struct { + long tv_sec; + long tv_nsec; +} uv_timespec_t; + + +typedef struct { + uint64_t st_dev; + uint64_t st_mode; + uint64_t st_nlink; + uint64_t st_uid; + uint64_t st_gid; + uint64_t st_rdev; + uint64_t st_ino; + uint64_t st_size; + uint64_t st_blksize; + uint64_t st_blocks; + uint64_t st_flags; + uint64_t st_gen; + uv_timespec_t st_atim; + uv_timespec_t st_mtim; + uv_timespec_t st_ctim; + uv_timespec_t st_birthtim; +} uv_stat_t; + + +typedef void (*uv_fs_event_cb)(uv_fs_event_t* handle, + const char* filename, + int events, + int status); + +typedef void (*uv_fs_poll_cb)(uv_fs_poll_t* handle, + int status, + const uv_stat_t* prev, + const uv_stat_t* curr); + +typedef void (*uv_signal_cb)(uv_signal_t* handle, int signum); + + +typedef enum { + UV_LEAVE_GROUP = 0, + UV_JOIN_GROUP +} uv_membership; + + +UV_EXTERN int uv_translate_sys_error(int sys_errno); + +UV_EXTERN const char* uv_strerror(int err); +UV_EXTERN const char* uv_err_name(int err); + + +#define UV_REQ_FIELDS \ + /* public */ \ + void* data; \ + /* read-only */ \ + uv_req_type type; \ + /* private */ \ + void* active_queue[2]; \ + void* reserved[4]; \ + UV_REQ_PRIVATE_FIELDS \ + +/* Abstract base class of all requests. */ +struct uv_req_s { + UV_REQ_FIELDS +}; + + +/* Platform-specific request types. */ +UV_PRIVATE_REQ_TYPES + + +UV_EXTERN int uv_shutdown(uv_shutdown_t* req, + uv_stream_t* handle, + uv_shutdown_cb cb); + +struct uv_shutdown_s { + UV_REQ_FIELDS + uv_stream_t* handle; + uv_shutdown_cb cb; + UV_SHUTDOWN_PRIVATE_FIELDS +}; + + +#define UV_HANDLE_FIELDS \ + /* public */ \ + void* data; \ + /* read-only */ \ + uv_loop_t* loop; \ + uv_handle_type type; \ + /* private */ \ + uv_close_cb close_cb; \ + void* handle_queue[2]; \ + union { \ + int fd; \ + void* reserved[4]; \ + } u; \ + UV_HANDLE_PRIVATE_FIELDS \ + +/* The abstract base class of all handles. */ +struct uv_handle_s { + UV_HANDLE_FIELDS +}; + +UV_EXTERN size_t uv_handle_size(uv_handle_type type); +UV_EXTERN size_t uv_req_size(uv_req_type type); + +UV_EXTERN int uv_is_active(const uv_handle_t* handle); + +UV_EXTERN void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg); + +/* Helpers for ad hoc debugging, no API/ABI stability guaranteed. */ +UV_EXTERN void uv_print_all_handles(uv_loop_t* loop, FILE* stream); +UV_EXTERN void uv_print_active_handles(uv_loop_t* loop, FILE* stream); + +UV_EXTERN void uv_close(uv_handle_t* handle, uv_close_cb close_cb); + +UV_EXTERN int uv_send_buffer_size(uv_handle_t* handle, int* value); +UV_EXTERN int uv_recv_buffer_size(uv_handle_t* handle, int* value); + +UV_EXTERN int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd); + +UV_EXTERN uv_buf_t uv_buf_init(char* base, unsigned int len); + + +#define UV_STREAM_FIELDS \ + /* number of bytes queued for writing */ \ + size_t write_queue_size; \ + uv_alloc_cb alloc_cb; \ + uv_read_cb read_cb; \ + /* private */ \ + UV_STREAM_PRIVATE_FIELDS + +/* + * uv_stream_t is a subclass of uv_handle_t. + * + * uv_stream is an abstract class. + * + * uv_stream_t is the parent class of uv_tcp_t, uv_pipe_t and uv_tty_t. + */ +struct uv_stream_s { + UV_HANDLE_FIELDS + UV_STREAM_FIELDS +}; + +UV_EXTERN int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb); +UV_EXTERN int uv_accept(uv_stream_t* server, uv_stream_t* client); + +UV_EXTERN int uv_read_start(uv_stream_t*, + uv_alloc_cb alloc_cb, + uv_read_cb read_cb); +UV_EXTERN int uv_read_stop(uv_stream_t*); + +UV_EXTERN int uv_write(uv_write_t* req, + uv_stream_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_write_cb cb); +UV_EXTERN int uv_write2(uv_write_t* req, + uv_stream_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_stream_t* send_handle, + uv_write_cb cb); +UV_EXTERN int uv_try_write(uv_stream_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs); + +/* uv_write_t is a subclass of uv_req_t. */ +struct uv_write_s { + UV_REQ_FIELDS + uv_write_cb cb; + uv_stream_t* send_handle; + uv_stream_t* handle; + UV_WRITE_PRIVATE_FIELDS +}; + + +UV_EXTERN int uv_is_readable(const uv_stream_t* handle); +UV_EXTERN int uv_is_writable(const uv_stream_t* handle); + +UV_EXTERN int uv_stream_set_blocking(uv_stream_t* handle, int blocking); + +UV_EXTERN int uv_is_closing(const uv_handle_t* handle); + + +/* + * uv_tcp_t is a subclass of uv_stream_t. + * + * Represents a TCP stream or TCP server. + */ +struct uv_tcp_s { + UV_HANDLE_FIELDS + UV_STREAM_FIELDS + UV_TCP_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_tcp_init(uv_loop_t*, uv_tcp_t* handle); +UV_EXTERN int uv_tcp_init_ex(uv_loop_t*, uv_tcp_t* handle, unsigned int flags); +UV_EXTERN int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock); +UV_EXTERN int uv_tcp_nodelay(uv_tcp_t* handle, int enable); +UV_EXTERN int uv_tcp_keepalive(uv_tcp_t* handle, + int enable, + unsigned int delay); +UV_EXTERN int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable); + +enum uv_tcp_flags { + /* Used with uv_tcp_bind, when an IPv6 address is used. */ + UV_TCP_IPV6ONLY = 1 +}; + +UV_EXTERN int uv_tcp_bind(uv_tcp_t* handle, + const struct sockaddr* addr, + unsigned int flags); +UV_EXTERN int uv_tcp_getsockname(const uv_tcp_t* handle, + struct sockaddr* name, + int* namelen); +UV_EXTERN int uv_tcp_getpeername(const uv_tcp_t* handle, + struct sockaddr* name, + int* namelen); +UV_EXTERN int uv_tcp_connect(uv_connect_t* req, + uv_tcp_t* handle, + const struct sockaddr* addr, + uv_connect_cb cb); + +/* uv_connect_t is a subclass of uv_req_t. */ +struct uv_connect_s { + UV_REQ_FIELDS + uv_connect_cb cb; + uv_stream_t* handle; + UV_CONNECT_PRIVATE_FIELDS +}; + + +/* + * UDP support. + */ + +enum uv_udp_flags { + /* Disables dual stack mode. */ + UV_UDP_IPV6ONLY = 1, + /* + * Indicates message was truncated because read buffer was too small. The + * remainder was discarded by the OS. Used in uv_udp_recv_cb. + */ + UV_UDP_PARTIAL = 2, + /* + * Indicates if SO_REUSEADDR will be set when binding the handle. + * This sets the SO_REUSEPORT socket flag on the BSDs and OS X. On other + * Unix platforms, it sets the SO_REUSEADDR flag. What that means is that + * multiple threads or processes can bind to the same address without error + * (provided they all set the flag) but only the last one to bind will receive + * any traffic, in effect "stealing" the port from the previous listener. + */ + UV_UDP_REUSEADDR = 4 +}; + +typedef void (*uv_udp_send_cb)(uv_udp_send_t* req, int status); +typedef void (*uv_udp_recv_cb)(uv_udp_t* handle, + ssize_t nread, + const uv_buf_t* buf, + const struct sockaddr* addr, + unsigned flags); + +/* uv_udp_t is a subclass of uv_handle_t. */ +struct uv_udp_s { + UV_HANDLE_FIELDS + /* read-only */ + /* + * Number of bytes queued for sending. This field strictly shows how much + * information is currently queued. + */ + size_t send_queue_size; + /* + * Number of send requests currently in the queue awaiting to be processed. + */ + size_t send_queue_count; + UV_UDP_PRIVATE_FIELDS +}; + +/* uv_udp_send_t is a subclass of uv_req_t. */ +struct uv_udp_send_s { + UV_REQ_FIELDS + uv_udp_t* handle; + uv_udp_send_cb cb; + UV_UDP_SEND_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_udp_init(uv_loop_t*, uv_udp_t* handle); +UV_EXTERN int uv_udp_init_ex(uv_loop_t*, uv_udp_t* handle, unsigned int flags); +UV_EXTERN int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock); +UV_EXTERN int uv_udp_bind(uv_udp_t* handle, + const struct sockaddr* addr, + unsigned int flags); + +UV_EXTERN int uv_udp_getsockname(const uv_udp_t* handle, + struct sockaddr* name, + int* namelen); +UV_EXTERN int uv_udp_set_membership(uv_udp_t* handle, + const char* multicast_addr, + const char* interface_addr, + uv_membership membership); +UV_EXTERN int uv_udp_set_multicast_loop(uv_udp_t* handle, int on); +UV_EXTERN int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl); +UV_EXTERN int uv_udp_set_multicast_interface(uv_udp_t* handle, + const char* interface_addr); +UV_EXTERN int uv_udp_set_broadcast(uv_udp_t* handle, int on); +UV_EXTERN int uv_udp_set_ttl(uv_udp_t* handle, int ttl); +UV_EXTERN int uv_udp_send(uv_udp_send_t* req, + uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr, + uv_udp_send_cb send_cb); +UV_EXTERN int uv_udp_try_send(uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr); +UV_EXTERN int uv_udp_recv_start(uv_udp_t* handle, + uv_alloc_cb alloc_cb, + uv_udp_recv_cb recv_cb); +UV_EXTERN int uv_udp_recv_stop(uv_udp_t* handle); + + +/* + * uv_tty_t is a subclass of uv_stream_t. + * + * Representing a stream for the console. + */ +struct uv_tty_s { + UV_HANDLE_FIELDS + UV_STREAM_FIELDS + UV_TTY_PRIVATE_FIELDS +}; + +typedef enum { + /* Initial/normal terminal mode */ + UV_TTY_MODE_NORMAL, + /* Raw input mode (On Windows, ENABLE_WINDOW_INPUT is also enabled) */ + UV_TTY_MODE_RAW, + /* Binary-safe I/O mode for IPC (Unix-only) */ + UV_TTY_MODE_IO +} uv_tty_mode_t; + +UV_EXTERN int uv_tty_init(uv_loop_t*, uv_tty_t*, uv_file fd, int readable); +UV_EXTERN int uv_tty_set_mode(uv_tty_t*, uv_tty_mode_t mode); +UV_EXTERN int uv_tty_reset_mode(void); +UV_EXTERN int uv_tty_get_winsize(uv_tty_t*, int* width, int* height); + +#ifdef __cplusplus +extern "C++" { + +inline int uv_tty_set_mode(uv_tty_t* handle, int mode) { + return uv_tty_set_mode(handle, static_cast(mode)); +} + +} +#endif + +UV_EXTERN uv_handle_type uv_guess_handle(uv_file file); + +/* + * uv_pipe_t is a subclass of uv_stream_t. + * + * Representing a pipe stream or pipe server. On Windows this is a Named + * Pipe. On Unix this is a Unix domain socket. + */ +struct uv_pipe_s { + UV_HANDLE_FIELDS + UV_STREAM_FIELDS + int ipc; /* non-zero if this pipe is used for passing handles */ + UV_PIPE_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_pipe_init(uv_loop_t*, uv_pipe_t* handle, int ipc); +UV_EXTERN int uv_pipe_open(uv_pipe_t*, uv_file file); +UV_EXTERN int uv_pipe_bind(uv_pipe_t* handle, const char* name); +UV_EXTERN void uv_pipe_connect(uv_connect_t* req, + uv_pipe_t* handle, + const char* name, + uv_connect_cb cb); +UV_EXTERN int uv_pipe_getsockname(const uv_pipe_t* handle, + char* buffer, + size_t* size); +UV_EXTERN int uv_pipe_getpeername(const uv_pipe_t* handle, + char* buffer, + size_t* size); +UV_EXTERN void uv_pipe_pending_instances(uv_pipe_t* handle, int count); +UV_EXTERN int uv_pipe_pending_count(uv_pipe_t* handle); +UV_EXTERN uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle); + + +struct uv_poll_s { + UV_HANDLE_FIELDS + uv_poll_cb poll_cb; + UV_POLL_PRIVATE_FIELDS +}; + +enum uv_poll_event { + UV_READABLE = 1, + UV_WRITABLE = 2, + UV_DISCONNECT = 4, + UV_PRIORITIZED = 8 +}; + +UV_EXTERN int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd); +UV_EXTERN int uv_poll_init_socket(uv_loop_t* loop, + uv_poll_t* handle, + uv_os_sock_t socket); +UV_EXTERN int uv_poll_start(uv_poll_t* handle, int events, uv_poll_cb cb); +UV_EXTERN int uv_poll_stop(uv_poll_t* handle); + + +struct uv_prepare_s { + UV_HANDLE_FIELDS + UV_PREPARE_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_prepare_init(uv_loop_t*, uv_prepare_t* prepare); +UV_EXTERN int uv_prepare_start(uv_prepare_t* prepare, uv_prepare_cb cb); +UV_EXTERN int uv_prepare_stop(uv_prepare_t* prepare); + + +struct uv_check_s { + UV_HANDLE_FIELDS + UV_CHECK_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_check_init(uv_loop_t*, uv_check_t* check); +UV_EXTERN int uv_check_start(uv_check_t* check, uv_check_cb cb); +UV_EXTERN int uv_check_stop(uv_check_t* check); + + +struct uv_idle_s { + UV_HANDLE_FIELDS + UV_IDLE_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_idle_init(uv_loop_t*, uv_idle_t* idle); +UV_EXTERN int uv_idle_start(uv_idle_t* idle, uv_idle_cb cb); +UV_EXTERN int uv_idle_stop(uv_idle_t* idle); + + +struct uv_async_s { + UV_HANDLE_FIELDS + UV_ASYNC_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_async_init(uv_loop_t*, + uv_async_t* async, + uv_async_cb async_cb); +UV_EXTERN int uv_async_send(uv_async_t* async); + + +/* + * uv_timer_t is a subclass of uv_handle_t. + * + * Used to get woken up at a specified time in the future. + */ +struct uv_timer_s { + UV_HANDLE_FIELDS + UV_TIMER_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_timer_init(uv_loop_t*, uv_timer_t* handle); +UV_EXTERN int uv_timer_start(uv_timer_t* handle, + uv_timer_cb cb, + uint64_t timeout, + uint64_t repeat); +UV_EXTERN int uv_timer_stop(uv_timer_t* handle); +UV_EXTERN int uv_timer_again(uv_timer_t* handle); +UV_EXTERN void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat); +UV_EXTERN uint64_t uv_timer_get_repeat(const uv_timer_t* handle); + + +/* + * uv_getaddrinfo_t is a subclass of uv_req_t. + * + * Request object for uv_getaddrinfo. + */ +struct uv_getaddrinfo_s { + UV_REQ_FIELDS + /* read-only */ + uv_loop_t* loop; + /* struct addrinfo* addrinfo is marked as private, but it really isn't. */ + UV_GETADDRINFO_PRIVATE_FIELDS +}; + + +UV_EXTERN int uv_getaddrinfo(uv_loop_t* loop, + uv_getaddrinfo_t* req, + uv_getaddrinfo_cb getaddrinfo_cb, + const char* node, + const char* service, + const struct addrinfo* hints); +UV_EXTERN void uv_freeaddrinfo(struct addrinfo* ai); + + +/* +* uv_getnameinfo_t is a subclass of uv_req_t. +* +* Request object for uv_getnameinfo. +*/ +struct uv_getnameinfo_s { + UV_REQ_FIELDS + /* read-only */ + uv_loop_t* loop; + /* host and service are marked as private, but they really aren't. */ + UV_GETNAMEINFO_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_getnameinfo(uv_loop_t* loop, + uv_getnameinfo_t* req, + uv_getnameinfo_cb getnameinfo_cb, + const struct sockaddr* addr, + int flags); + + +/* uv_spawn() options. */ +typedef enum { + UV_IGNORE = 0x00, + UV_CREATE_PIPE = 0x01, + UV_INHERIT_FD = 0x02, + UV_INHERIT_STREAM = 0x04, + + /* + * When UV_CREATE_PIPE is specified, UV_READABLE_PIPE and UV_WRITABLE_PIPE + * determine the direction of flow, from the child process' perspective. Both + * flags may be specified to create a duplex data stream. + */ + UV_READABLE_PIPE = 0x10, + UV_WRITABLE_PIPE = 0x20 +} uv_stdio_flags; + +typedef struct uv_stdio_container_s { + uv_stdio_flags flags; + + union { + uv_stream_t* stream; + int fd; + } data; +} uv_stdio_container_t; + +typedef struct uv_process_options_s { + uv_exit_cb exit_cb; /* Called after the process exits. */ + const char* file; /* Path to program to execute. */ + /* + * Command line arguments. args[0] should be the path to the program. On + * Windows this uses CreateProcess which concatenates the arguments into a + * string this can cause some strange errors. See the note at + * windows_verbatim_arguments. + */ + char** args; + /* + * This will be set as the environ variable in the subprocess. If this is + * NULL then the parents environ will be used. + */ + char** env; + /* + * If non-null this represents a directory the subprocess should execute + * in. Stands for current working directory. + */ + const char* cwd; + /* + * Various flags that control how uv_spawn() behaves. See the definition of + * `enum uv_process_flags` below. + */ + unsigned int flags; + /* + * The `stdio` field points to an array of uv_stdio_container_t structs that + * describe the file descriptors that will be made available to the child + * process. The convention is that stdio[0] points to stdin, fd 1 is used for + * stdout, and fd 2 is stderr. + * + * Note that on windows file descriptors greater than 2 are available to the + * child process only if the child processes uses the MSVCRT runtime. + */ + int stdio_count; + uv_stdio_container_t* stdio; + /* + * Libuv can change the child process' user/group id. This happens only when + * the appropriate bits are set in the flags fields. This is not supported on + * windows; uv_spawn() will fail and set the error to UV_ENOTSUP. + */ + uv_uid_t uid; + uv_gid_t gid; +} uv_process_options_t; + +/* + * These are the flags that can be used for the uv_process_options.flags field. + */ +enum uv_process_flags { + /* + * Set the child process' user id. The user id is supplied in the `uid` field + * of the options struct. This does not work on windows; setting this flag + * will cause uv_spawn() to fail. + */ + UV_PROCESS_SETUID = (1 << 0), + /* + * Set the child process' group id. The user id is supplied in the `gid` + * field of the options struct. This does not work on windows; setting this + * flag will cause uv_spawn() to fail. + */ + UV_PROCESS_SETGID = (1 << 1), + /* + * Do not wrap any arguments in quotes, or perform any other escaping, when + * converting the argument list into a command line string. This option is + * only meaningful on Windows systems. On Unix it is silently ignored. + */ + UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS = (1 << 2), + /* + * Spawn the child process in a detached state - this will make it a process + * group leader, and will effectively enable the child to keep running after + * the parent exits. Note that the child process will still keep the + * parent's event loop alive unless the parent process calls uv_unref() on + * the child's process handle. + */ + UV_PROCESS_DETACHED = (1 << 3), + /* + * Hide the subprocess console window that would normally be created. This + * option is only meaningful on Windows systems. On Unix it is silently + * ignored. + */ + UV_PROCESS_WINDOWS_HIDE = (1 << 4) +}; + +/* + * uv_process_t is a subclass of uv_handle_t. + */ +struct uv_process_s { + UV_HANDLE_FIELDS + uv_exit_cb exit_cb; + int pid; + UV_PROCESS_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_spawn(uv_loop_t* loop, + uv_process_t* handle, + const uv_process_options_t* options); +UV_EXTERN int uv_process_kill(uv_process_t*, int signum); +UV_EXTERN int uv_kill(int pid, int signum); + + +/* + * uv_work_t is a subclass of uv_req_t. + */ +struct uv_work_s { + UV_REQ_FIELDS + uv_loop_t* loop; + uv_work_cb work_cb; + uv_after_work_cb after_work_cb; + UV_WORK_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_queue_work(uv_loop_t* loop, + uv_work_t* req, + char *name, + uv_work_cb work_cb, + uv_after_work_cb after_work_cb); + +UV_EXTERN int uv_cancel(uv_req_t* req); + + +struct uv_cpu_info_s { + char* model; + int speed; + struct uv_cpu_times_s { + uint64_t user; + uint64_t nice; + uint64_t sys; + uint64_t idle; + uint64_t irq; + } cpu_times; +}; + +struct uv_interface_address_s { + char* name; + char phys_addr[6]; + int is_internal; + union { + struct sockaddr_in address4; + struct sockaddr_in6 address6; + } address; + union { + struct sockaddr_in netmask4; + struct sockaddr_in6 netmask6; + } netmask; +}; + +struct uv_passwd_s { + char* username; + long uid; + long gid; + char* shell; + char* homedir; +}; + +typedef enum { + UV_DIRENT_UNKNOWN, + UV_DIRENT_FILE, + UV_DIRENT_DIR, + UV_DIRENT_LINK, + UV_DIRENT_FIFO, + UV_DIRENT_SOCKET, + UV_DIRENT_CHAR, + UV_DIRENT_BLOCK +} uv_dirent_type_t; + +struct uv_dirent_s { + const char* name; + uv_dirent_type_t type; +}; + +UV_EXTERN char** uv_setup_args(int argc, char** argv); +UV_EXTERN int uv_get_process_title(char* buffer, size_t size); +UV_EXTERN int uv_set_process_title(const char* title); +UV_EXTERN int uv_resident_set_memory(size_t* rss); +UV_EXTERN int uv_uptime(double* uptime); +UV_EXTERN uv_os_fd_t uv_get_osfhandle(int fd); + +typedef struct { + long tv_sec; + long tv_usec; +} uv_timeval_t; + +typedef struct { + uv_timeval_t ru_utime; /* user CPU time used */ + uv_timeval_t ru_stime; /* system CPU time used */ + uint64_t ru_maxrss; /* maximum resident set size */ + uint64_t ru_ixrss; /* integral shared memory size */ + uint64_t ru_idrss; /* integral unshared data size */ + uint64_t ru_isrss; /* integral unshared stack size */ + uint64_t ru_minflt; /* page reclaims (soft page faults) */ + uint64_t ru_majflt; /* page faults (hard page faults) */ + uint64_t ru_nswap; /* swaps */ + uint64_t ru_inblock; /* block input operations */ + uint64_t ru_oublock; /* block output operations */ + uint64_t ru_msgsnd; /* IPC messages sent */ + uint64_t ru_msgrcv; /* IPC messages received */ + uint64_t ru_nsignals; /* signals received */ + uint64_t ru_nvcsw; /* voluntary context switches */ + uint64_t ru_nivcsw; /* involuntary context switches */ +} uv_rusage_t; + +UV_EXTERN int uv_getrusage(uv_rusage_t* rusage); + +UV_EXTERN int uv_os_homedir(char* buffer, size_t* size); +UV_EXTERN int uv_os_tmpdir(char* buffer, size_t* size); +UV_EXTERN int uv_os_get_passwd(uv_passwd_t* pwd); +UV_EXTERN void uv_os_free_passwd(uv_passwd_t* pwd); + +UV_EXTERN int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count); +UV_EXTERN void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count); + +UV_EXTERN int uv_interface_addresses(uv_interface_address_t** addresses, + int* count); +UV_EXTERN void uv_free_interface_addresses(uv_interface_address_t* addresses, + int count); + +UV_EXTERN int uv_os_getenv(const char* name, char* buffer, size_t* size); +UV_EXTERN int uv_os_setenv(const char* name, const char* value); +UV_EXTERN int uv_os_unsetenv(const char* name); + +UV_EXTERN int uv_os_gethostname(char* buffer, size_t* size); + + +typedef enum { + UV_FS_UNKNOWN = -1, + UV_FS_CUSTOM, + UV_FS_OPEN, + UV_FS_CLOSE, + UV_FS_READ, + UV_FS_WRITE, + UV_FS_SENDFILE, + UV_FS_STAT, + UV_FS_LSTAT, + UV_FS_FSTAT, + UV_FS_FTRUNCATE, + UV_FS_UTIME, + UV_FS_FUTIME, + UV_FS_ACCESS, + UV_FS_CHMOD, + UV_FS_FCHMOD, + UV_FS_FSYNC, + UV_FS_FDATASYNC, + UV_FS_UNLINK, + UV_FS_RMDIR, + UV_FS_MKDIR, + UV_FS_MKDTEMP, + UV_FS_RENAME, + UV_FS_SCANDIR, + UV_FS_LINK, + UV_FS_SYMLINK, + UV_FS_READLINK, + UV_FS_CHOWN, + UV_FS_FCHOWN, + UV_FS_REALPATH +} uv_fs_type; + +/* uv_fs_t is a subclass of uv_req_t. */ +struct uv_fs_s { + UV_REQ_FIELDS + uv_fs_type fs_type; + uv_loop_t* loop; + uv_fs_cb cb; + ssize_t result; + void* ptr; + const char* path; + uv_stat_t statbuf; /* Stores the result of uv_fs_stat() and uv_fs_fstat(). */ + UV_FS_PRIVATE_FIELDS +}; + +UV_EXTERN void uv_fs_req_cleanup(uv_fs_t* req); +UV_EXTERN int uv_fs_close(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_open(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int flags, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_read(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + const uv_buf_t bufs[], + unsigned int nbufs, + int64_t offset, + uv_fs_cb cb); +UV_EXTERN int uv_fs_unlink(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_write(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + const uv_buf_t bufs[], + unsigned int nbufs, + int64_t offset, + uv_fs_cb cb); +UV_EXTERN int uv_fs_mkdir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_mkdtemp(uv_loop_t* loop, + uv_fs_t* req, + const char* tpl, + uv_fs_cb cb); +UV_EXTERN int uv_fs_rmdir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_scandir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int flags, + uv_fs_cb cb); +UV_EXTERN int uv_fs_scandir_next(uv_fs_t* req, + uv_dirent_t* ent); +UV_EXTERN int uv_fs_stat(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fstat(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_rename(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fsync(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fdatasync(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_ftruncate(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + int64_t offset, + uv_fs_cb cb); +UV_EXTERN int uv_fs_sendfile(uv_loop_t* loop, + uv_fs_t* req, + uv_file out_fd, + uv_file in_fd, + int64_t in_offset, + size_t length, + uv_fs_cb cb); +UV_EXTERN int uv_fs_access(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_chmod(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_utime(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + double atime, + double mtime, + uv_fs_cb cb); +UV_EXTERN int uv_fs_futime(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + double atime, + double mtime, + uv_fs_cb cb); +UV_EXTERN int uv_fs_lstat(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_link(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + uv_fs_cb cb); + +/* + * This flag can be used with uv_fs_symlink() on Windows to specify whether + * path argument points to a directory. + */ +#define UV_FS_SYMLINK_DIR 0x0001 + +/* + * This flag can be used with uv_fs_symlink() on Windows to specify whether + * the symlink is to be created using junction points. + */ +#define UV_FS_SYMLINK_JUNCTION 0x0002 + +UV_EXTERN int uv_fs_symlink(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + int flags, + uv_fs_cb cb); +UV_EXTERN int uv_fs_readlink(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_realpath(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fchmod(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_chown(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_uid_t uid, + uv_gid_t gid, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fchown(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_uid_t uid, + uv_gid_t gid, + uv_fs_cb cb); + + +enum uv_fs_event { + UV_RENAME = 1, + UV_CHANGE = 2 +}; + + +struct uv_fs_event_s { + UV_HANDLE_FIELDS + /* private */ + char* path; + UV_FS_EVENT_PRIVATE_FIELDS +}; + + +/* + * uv_fs_stat() based polling file watcher. + */ +struct uv_fs_poll_s { + UV_HANDLE_FIELDS + /* Private, don't touch. */ + void* poll_ctx; +}; + +UV_EXTERN int uv_fs_poll_init(uv_loop_t* loop, uv_fs_poll_t* handle); +UV_EXTERN int uv_fs_poll_start(uv_fs_poll_t* handle, + uv_fs_poll_cb poll_cb, + const char* path, + unsigned int interval); +UV_EXTERN int uv_fs_poll_stop(uv_fs_poll_t* handle); +UV_EXTERN int uv_fs_poll_getpath(uv_fs_poll_t* handle, + char* buffer, + size_t* size); + + +struct uv_signal_s { + UV_HANDLE_FIELDS + uv_signal_cb signal_cb; + int signum; + UV_SIGNAL_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle); +UV_EXTERN int uv_signal_start(uv_signal_t* handle, + uv_signal_cb signal_cb, + int signum); +UV_EXTERN int uv_signal_start_oneshot(uv_signal_t* handle, + uv_signal_cb signal_cb, + int signum); +UV_EXTERN int uv_signal_stop(uv_signal_t* handle); + +UV_EXTERN void uv_loadavg(double avg[3]); + + +/* + * Flags to be passed to uv_fs_event_start(). + */ +enum uv_fs_event_flags { + /* + * By default, if the fs event watcher is given a directory name, we will + * watch for all events in that directory. This flags overrides this behavior + * and makes fs_event report only changes to the directory entry itself. This + * flag does not affect individual files watched. + * This flag is currently not implemented yet on any backend. + */ + UV_FS_EVENT_WATCH_ENTRY = 1, + + /* + * By default uv_fs_event will try to use a kernel interface such as inotify + * or kqueue to detect events. This may not work on remote filesystems such + * as NFS mounts. This flag makes fs_event fall back to calling stat() on a + * regular interval. + * This flag is currently not implemented yet on any backend. + */ + UV_FS_EVENT_STAT = 2, + + /* + * By default, event watcher, when watching directory, is not registering + * (is ignoring) changes in it's subdirectories. + * This flag will override this behaviour on platforms that support it. + */ + UV_FS_EVENT_RECURSIVE = 4 +}; + + +UV_EXTERN int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle); +UV_EXTERN int uv_fs_event_start(uv_fs_event_t* handle, + uv_fs_event_cb cb, + const char* path, + unsigned int flags); +UV_EXTERN int uv_fs_event_stop(uv_fs_event_t* handle); +UV_EXTERN int uv_fs_event_getpath(uv_fs_event_t* handle, + char* buffer, + size_t* size); + +UV_EXTERN int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr); +UV_EXTERN int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr); + +UV_EXTERN int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size); +UV_EXTERN int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size); + +UV_EXTERN int uv_inet_ntop(int af, const void* src, char* dst, size_t size); +UV_EXTERN int uv_inet_pton(int af, const char* src, void* dst); + +UV_EXTERN int uv_exepath(char* buffer, size_t* size); + +UV_EXTERN int uv_cwd(char* buffer, size_t* size); + +UV_EXTERN int uv_chdir(const char* dir); + +UV_EXTERN uint64_t uv_get_free_memory(void); +UV_EXTERN uint64_t uv_get_total_memory(void); + +UV_EXTERN uint64_t uv_hrtime(void); + +UV_EXTERN void uv_disable_stdio_inheritance(void); + +UV_EXTERN int uv_dlopen(const char* filename, uv_lib_t* lib); +UV_EXTERN void uv_dlclose(uv_lib_t* lib); +UV_EXTERN int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr); +UV_EXTERN const char* uv_dlerror(const uv_lib_t* lib); + +UV_EXTERN int uv_mutex_init(uv_mutex_t* handle); +UV_EXTERN void uv_mutex_destroy(uv_mutex_t* handle); +UV_EXTERN void uv_mutex_lock(uv_mutex_t* handle); +UV_EXTERN int uv_mutex_trylock(uv_mutex_t* handle); +UV_EXTERN void uv_mutex_unlock(uv_mutex_t* handle); + +UV_EXTERN int uv_rwlock_init(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_destroy(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_rdlock(uv_rwlock_t* rwlock); +UV_EXTERN int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_rdunlock(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_wrlock(uv_rwlock_t* rwlock); +UV_EXTERN int uv_rwlock_trywrlock(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_wrunlock(uv_rwlock_t* rwlock); + +UV_EXTERN int uv_sem_init(uv_sem_t* sem, unsigned int value); +UV_EXTERN void uv_sem_destroy(uv_sem_t* sem); +UV_EXTERN void uv_sem_post(uv_sem_t* sem); +UV_EXTERN void uv_sem_wait(uv_sem_t* sem); +UV_EXTERN int uv_sem_trywait(uv_sem_t* sem); + +UV_EXTERN int uv_cond_init(uv_cond_t* cond); +UV_EXTERN void uv_cond_destroy(uv_cond_t* cond); +UV_EXTERN void uv_cond_signal(uv_cond_t* cond); +UV_EXTERN void uv_cond_broadcast(uv_cond_t* cond); + +UV_EXTERN int uv_barrier_init(uv_barrier_t* barrier, unsigned int count); +UV_EXTERN void uv_barrier_destroy(uv_barrier_t* barrier); +UV_EXTERN int uv_barrier_wait(uv_barrier_t* barrier); + +UV_EXTERN void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex); +UV_EXTERN int uv_cond_timedwait(uv_cond_t* cond, + uv_mutex_t* mutex, + uint64_t timeout); + +UV_EXTERN void uv_once(uv_once_t* guard, void (*callback)(void)); + +UV_EXTERN int uv_key_create(uv_key_t* key); +UV_EXTERN void uv_key_delete(uv_key_t* key); +UV_EXTERN void* uv_key_get(uv_key_t* key); +UV_EXTERN void uv_key_set(uv_key_t* key, void* value); + +typedef void (*uv_thread_cb)(void* arg); + +UV_EXTERN int uv_thread_create(uv_thread_t* tid, uv_thread_cb entry, void* arg); +UV_EXTERN uv_thread_t uv_thread_self(void); +UV_EXTERN int uv_thread_join(uv_thread_t *tid); +UV_EXTERN int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2); + +/* The presence of these unions force similar struct layout. */ +#define XX(_, name) uv_ ## name ## _t name; +union uv_any_handle { + UV_HANDLE_TYPE_MAP(XX) +}; + +union uv_any_req { + UV_REQ_TYPE_MAP(XX) +}; +#undef XX + + +struct uv_loop_s { + /* User data - use this for whatever. */ + void* data; + /* Loop reference counting. */ + unsigned int active_handles; + void* handle_queue[2]; + void* active_reqs[2]; + /* Internal flag to signal loop stop. */ + unsigned int stop_flag; + UV_LOOP_PRIVATE_FIELDS +}; + + +/* Don't export the private CPP symbols. */ +#undef UV_HANDLE_TYPE_PRIVATE +#undef UV_REQ_TYPE_PRIVATE +#undef UV_REQ_PRIVATE_FIELDS +#undef UV_STREAM_PRIVATE_FIELDS +#undef UV_TCP_PRIVATE_FIELDS +#undef UV_PREPARE_PRIVATE_FIELDS +#undef UV_CHECK_PRIVATE_FIELDS +#undef UV_IDLE_PRIVATE_FIELDS +#undef UV_ASYNC_PRIVATE_FIELDS +#undef UV_TIMER_PRIVATE_FIELDS +#undef UV_GETADDRINFO_PRIVATE_FIELDS +#undef UV_GETNAMEINFO_PRIVATE_FIELDS +#undef UV_FS_REQ_PRIVATE_FIELDS +#undef UV_WORK_PRIVATE_FIELDS +#undef UV_FS_EVENT_PRIVATE_FIELDS +#undef UV_SIGNAL_PRIVATE_FIELDS +#undef UV_LOOP_PRIVATE_FIELDS +#undef UV_LOOP_PRIVATE_PLATFORM_FIELDS + +#ifdef __cplusplus +} +#endif +#endif /* UV_H */ diff --git a/lib/ESPiLight/pilight/libs/libuv/uv.h.ori b/lib/ESPiLight/pilight/libs/libuv/uv.h.ori new file mode 100644 index 0000000..af500cb --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/uv.h.ori @@ -0,0 +1,1509 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* See https://github.com/libuv/libuv#documentation for documentation. */ + +#ifndef UV_H +#define UV_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _WIN32 + /* Windows - set up dll import/export decorators. */ +# if defined(BUILDING_UV_SHARED) + /* Building shared library. */ +# define UV_EXTERN __declspec(dllexport) +# elif defined(USING_UV_SHARED) + /* Using shared library. */ +# define UV_EXTERN __declspec(dllimport) +# else + /* Building static library. */ +# define UV_EXTERN /* nothing */ +# endif +#elif __GNUC__ >= 4 +# define UV_EXTERN __attribute__((visibility("default"))) +#else +# define UV_EXTERN /* nothing */ +#endif + +#include "uv-errno.h" +#include "uv-version.h" +#include +#include + +#if defined(_MSC_VER) && _MSC_VER < 1600 +# include "stdint-msvc2008.h" +#else +# include +#endif + +#if defined(_WIN32) +# include "uv-win.h" +#else +# include "uv-unix.h" +#endif + +/* Expand this list if necessary. */ +#define UV_ERRNO_MAP(XX) \ + XX(E2BIG, "argument list too long") \ + XX(EACCES, "permission denied") \ + XX(EADDRINUSE, "address already in use") \ + XX(EADDRNOTAVAIL, "address not available") \ + XX(EAFNOSUPPORT, "address family not supported") \ + XX(EAGAIN, "resource temporarily unavailable") \ + XX(EAI_ADDRFAMILY, "address family not supported") \ + XX(EAI_AGAIN, "temporary failure") \ + XX(EAI_BADFLAGS, "bad ai_flags value") \ + XX(EAI_BADHINTS, "invalid value for hints") \ + XX(EAI_CANCELED, "request canceled") \ + XX(EAI_FAIL, "permanent failure") \ + XX(EAI_FAMILY, "ai_family not supported") \ + XX(EAI_MEMORY, "out of memory") \ + XX(EAI_NODATA, "no address") \ + XX(EAI_NONAME, "unknown node or service") \ + XX(EAI_OVERFLOW, "argument buffer overflow") \ + XX(EAI_PROTOCOL, "resolved protocol is unknown") \ + XX(EAI_SERVICE, "service not available for socket type") \ + XX(EAI_SOCKTYPE, "socket type not supported") \ + XX(EALREADY, "connection already in progress") \ + XX(EBADF, "bad file descriptor") \ + XX(EBUSY, "resource busy or locked") \ + XX(ECANCELED, "operation canceled") \ + XX(ECHARSET, "invalid Unicode character") \ + XX(ECONNABORTED, "software caused connection abort") \ + XX(ECONNREFUSED, "connection refused") \ + XX(ECONNRESET, "connection reset by peer") \ + XX(EDESTADDRREQ, "destination address required") \ + XX(EEXIST, "file already exists") \ + XX(EFAULT, "bad address in system call argument") \ + XX(EFBIG, "file too large") \ + XX(EHOSTUNREACH, "host is unreachable") \ + XX(EINTR, "interrupted system call") \ + XX(EINVAL, "invalid argument") \ + XX(EIO, "i/o error") \ + XX(EISCONN, "socket is already connected") \ + XX(EISDIR, "illegal operation on a directory") \ + XX(ELOOP, "too many symbolic links encountered") \ + XX(EMFILE, "too many open files") \ + XX(EMSGSIZE, "message too long") \ + XX(ENAMETOOLONG, "name too long") \ + XX(ENETDOWN, "network is down") \ + XX(ENETUNREACH, "network is unreachable") \ + XX(ENFILE, "file table overflow") \ + XX(ENOBUFS, "no buffer space available") \ + XX(ENODEV, "no such device") \ + XX(ENOENT, "no such file or directory") \ + XX(ENOMEM, "not enough memory") \ + XX(ENONET, "machine is not on the network") \ + XX(ENOPROTOOPT, "protocol not available") \ + XX(ENOSPC, "no space left on device") \ + XX(ENOSYS, "function not implemented") \ + XX(ENOTCONN, "socket is not connected") \ + XX(ENOTDIR, "not a directory") \ + XX(ENOTEMPTY, "directory not empty") \ + XX(ENOTSOCK, "socket operation on non-socket") \ + XX(ENOTSUP, "operation not supported on socket") \ + XX(EPERM, "operation not permitted") \ + XX(EPIPE, "broken pipe") \ + XX(EPROTO, "protocol error") \ + XX(EPROTONOSUPPORT, "protocol not supported") \ + XX(EPROTOTYPE, "protocol wrong type for socket") \ + XX(ERANGE, "result too large") \ + XX(EROFS, "read-only file system") \ + XX(ESHUTDOWN, "cannot send after transport endpoint shutdown") \ + XX(ESPIPE, "invalid seek") \ + XX(ESRCH, "no such process") \ + XX(ETIMEDOUT, "connection timed out") \ + XX(ETXTBSY, "text file is busy") \ + XX(EXDEV, "cross-device link not permitted") \ + XX(UNKNOWN, "unknown error") \ + XX(EOF, "end of file") \ + XX(ENXIO, "no such device or address") \ + XX(EMLINK, "too many links") \ + XX(EHOSTDOWN, "host is down") \ + +#define UV_HANDLE_TYPE_MAP(XX) \ + XX(ASYNC, async) \ + XX(CHECK, check) \ + XX(FS_EVENT, fs_event) \ + XX(FS_POLL, fs_poll) \ + XX(HANDLE, handle) \ + XX(IDLE, idle) \ + XX(NAMED_PIPE, pipe) \ + XX(POLL, poll) \ + XX(PREPARE, prepare) \ + XX(PROCESS, process) \ + XX(STREAM, stream) \ + XX(TCP, tcp) \ + XX(TIMER, timer) \ + XX(TTY, tty) \ + XX(UDP, udp) \ + XX(SIGNAL, signal) \ + +#define UV_REQ_TYPE_MAP(XX) \ + XX(REQ, req) \ + XX(CONNECT, connect) \ + XX(WRITE, write) \ + XX(SHUTDOWN, shutdown) \ + XX(UDP_SEND, udp_send) \ + XX(FS, fs) \ + XX(WORK, work) \ + XX(GETADDRINFO, getaddrinfo) \ + XX(GETNAMEINFO, getnameinfo) \ + +typedef enum { +#define XX(code, _) UV_ ## code = UV__ ## code, + UV_ERRNO_MAP(XX) +#undef XX + UV_ERRNO_MAX = UV__EOF - 1 +} uv_errno_t; + +typedef enum { + UV_UNKNOWN_HANDLE = 0, +#define XX(uc, lc) UV_##uc, + UV_HANDLE_TYPE_MAP(XX) +#undef XX + UV_FILE, + UV_HANDLE_TYPE_MAX +} uv_handle_type; + +typedef enum { + UV_UNKNOWN_REQ = 0, +#define XX(uc, lc) UV_##uc, + UV_REQ_TYPE_MAP(XX) +#undef XX + UV_REQ_TYPE_PRIVATE + UV_REQ_TYPE_MAX +} uv_req_type; + + +/* Handle types. */ +typedef struct uv_loop_s uv_loop_t; +typedef struct uv_handle_s uv_handle_t; +typedef struct uv_stream_s uv_stream_t; +typedef struct uv_tcp_s uv_tcp_t; +typedef struct uv_udp_s uv_udp_t; +typedef struct uv_pipe_s uv_pipe_t; +typedef struct uv_tty_s uv_tty_t; +typedef struct uv_poll_s uv_poll_t; +typedef struct uv_timer_s uv_timer_t; +typedef struct uv_prepare_s uv_prepare_t; +typedef struct uv_check_s uv_check_t; +typedef struct uv_idle_s uv_idle_t; +typedef struct uv_async_s uv_async_t; +typedef struct uv_process_s uv_process_t; +typedef struct uv_fs_event_s uv_fs_event_t; +typedef struct uv_fs_poll_s uv_fs_poll_t; +typedef struct uv_signal_s uv_signal_t; + +/* Request types. */ +typedef struct uv_req_s uv_req_t; +typedef struct uv_getaddrinfo_s uv_getaddrinfo_t; +typedef struct uv_getnameinfo_s uv_getnameinfo_t; +typedef struct uv_shutdown_s uv_shutdown_t; +typedef struct uv_write_s uv_write_t; +typedef struct uv_connect_s uv_connect_t; +typedef struct uv_udp_send_s uv_udp_send_t; +typedef struct uv_fs_s uv_fs_t; +typedef struct uv_work_s uv_work_t; + +/* None of the above. */ +typedef struct uv_cpu_info_s uv_cpu_info_t; +typedef struct uv_interface_address_s uv_interface_address_t; +typedef struct uv_dirent_s uv_dirent_t; +typedef struct uv_passwd_s uv_passwd_t; + +typedef enum { + UV_LOOP_BLOCK_SIGNAL +} uv_loop_option; + +typedef enum { + UV_RUN_DEFAULT = 0, + UV_RUN_ONCE, + UV_RUN_NOWAIT +} uv_run_mode; + + +UV_EXTERN unsigned int uv_version(void); +UV_EXTERN const char* uv_version_string(void); + +typedef void* (*uv_malloc_func)(size_t size); +typedef void* (*uv_realloc_func)(void* ptr, size_t size); +typedef void* (*uv_calloc_func)(size_t count, size_t size); +typedef void (*uv_free_func)(void* ptr); + +UV_EXTERN int uv_replace_allocator(uv_malloc_func malloc_func, + uv_realloc_func realloc_func, + uv_calloc_func calloc_func, + uv_free_func free_func); + +UV_EXTERN uv_loop_t* uv_default_loop(void); +UV_EXTERN int uv_loop_init(uv_loop_t* loop); +UV_EXTERN int uv_loop_close(uv_loop_t* loop); +/* + * NOTE: + * This function is DEPRECATED (to be removed after 0.12), users should + * allocate the loop manually and use uv_loop_init instead. + */ +UV_EXTERN uv_loop_t* uv_loop_new(void); +/* + * NOTE: + * This function is DEPRECATED (to be removed after 0.12). Users should use + * uv_loop_close and free the memory manually instead. + */ +UV_EXTERN void uv_loop_delete(uv_loop_t*); +UV_EXTERN size_t uv_loop_size(void); +UV_EXTERN int uv_loop_alive(const uv_loop_t* loop); +UV_EXTERN int uv_loop_configure(uv_loop_t* loop, uv_loop_option option, ...); +UV_EXTERN int uv_loop_fork(uv_loop_t* loop); + +UV_EXTERN int uv_run(uv_loop_t*, uv_run_mode mode); +UV_EXTERN void uv_stop(uv_loop_t*); + +UV_EXTERN void uv_ref(uv_handle_t*); +UV_EXTERN void uv_unref(uv_handle_t*); +UV_EXTERN int uv_has_ref(const uv_handle_t*); + +UV_EXTERN void uv_update_time(uv_loop_t*); +UV_EXTERN uint64_t uv_now(const uv_loop_t*); + +UV_EXTERN int uv_backend_fd(const uv_loop_t*); +UV_EXTERN int uv_backend_timeout(const uv_loop_t*); + +typedef void (*uv_alloc_cb)(uv_handle_t* handle, + size_t suggested_size, + uv_buf_t* buf); +typedef void (*uv_read_cb)(uv_stream_t* stream, + ssize_t nread, + const uv_buf_t* buf); +typedef void (*uv_write_cb)(uv_write_t* req, int status); +typedef void (*uv_connect_cb)(uv_connect_t* req, int status); +typedef void (*uv_shutdown_cb)(uv_shutdown_t* req, int status); +typedef void (*uv_connection_cb)(uv_stream_t* server, int status); +typedef void (*uv_close_cb)(uv_handle_t* handle); +typedef void (*uv_poll_cb)(uv_poll_t* handle, int status, int events); +typedef void (*uv_timer_cb)(uv_timer_t* handle); +typedef void (*uv_async_cb)(uv_async_t* handle); +typedef void (*uv_prepare_cb)(uv_prepare_t* handle); +typedef void (*uv_check_cb)(uv_check_t* handle); +typedef void (*uv_idle_cb)(uv_idle_t* handle); +typedef void (*uv_exit_cb)(uv_process_t*, int64_t exit_status, int term_signal); +typedef void (*uv_walk_cb)(uv_handle_t* handle, void* arg); +typedef void (*uv_fs_cb)(uv_fs_t* req); +typedef void (*uv_work_cb)(uv_work_t* req); +typedef void (*uv_after_work_cb)(uv_work_t* req, int status); +typedef void (*uv_getaddrinfo_cb)(uv_getaddrinfo_t* req, + int status, + struct addrinfo* res); +typedef void (*uv_getnameinfo_cb)(uv_getnameinfo_t* req, + int status, + const char* hostname, + const char* service); + +typedef struct { + long tv_sec; + long tv_nsec; +} uv_timespec_t; + + +typedef struct { + uint64_t st_dev; + uint64_t st_mode; + uint64_t st_nlink; + uint64_t st_uid; + uint64_t st_gid; + uint64_t st_rdev; + uint64_t st_ino; + uint64_t st_size; + uint64_t st_blksize; + uint64_t st_blocks; + uint64_t st_flags; + uint64_t st_gen; + uv_timespec_t st_atim; + uv_timespec_t st_mtim; + uv_timespec_t st_ctim; + uv_timespec_t st_birthtim; +} uv_stat_t; + + +typedef void (*uv_fs_event_cb)(uv_fs_event_t* handle, + const char* filename, + int events, + int status); + +typedef void (*uv_fs_poll_cb)(uv_fs_poll_t* handle, + int status, + const uv_stat_t* prev, + const uv_stat_t* curr); + +typedef void (*uv_signal_cb)(uv_signal_t* handle, int signum); + + +typedef enum { + UV_LEAVE_GROUP = 0, + UV_JOIN_GROUP +} uv_membership; + + +UV_EXTERN int uv_translate_sys_error(int sys_errno); + +UV_EXTERN const char* uv_strerror(int err); +UV_EXTERN const char* uv_err_name(int err); + + +#define UV_REQ_FIELDS \ + /* public */ \ + void* data; \ + /* read-only */ \ + uv_req_type type; \ + /* private */ \ + void* active_queue[2]; \ + void* reserved[4]; \ + UV_REQ_PRIVATE_FIELDS \ + +/* Abstract base class of all requests. */ +struct uv_req_s { + UV_REQ_FIELDS +}; + + +/* Platform-specific request types. */ +UV_PRIVATE_REQ_TYPES + + +UV_EXTERN int uv_shutdown(uv_shutdown_t* req, + uv_stream_t* handle, + uv_shutdown_cb cb); + +struct uv_shutdown_s { + UV_REQ_FIELDS + uv_stream_t* handle; + uv_shutdown_cb cb; + UV_SHUTDOWN_PRIVATE_FIELDS +}; + + +#define UV_HANDLE_FIELDS \ + /* public */ \ + void* data; \ + /* read-only */ \ + uv_loop_t* loop; \ + uv_handle_type type; \ + /* private */ \ + uv_close_cb close_cb; \ + void* handle_queue[2]; \ + union { \ + int fd; \ + void* reserved[4]; \ + } u; \ + UV_HANDLE_PRIVATE_FIELDS \ + +/* The abstract base class of all handles. */ +struct uv_handle_s { + UV_HANDLE_FIELDS +}; + +UV_EXTERN size_t uv_handle_size(uv_handle_type type); +UV_EXTERN size_t uv_req_size(uv_req_type type); + +UV_EXTERN int uv_is_active(const uv_handle_t* handle); + +UV_EXTERN void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg); + +/* Helpers for ad hoc debugging, no API/ABI stability guaranteed. */ +UV_EXTERN void uv_print_all_handles(uv_loop_t* loop, FILE* stream); +UV_EXTERN void uv_print_active_handles(uv_loop_t* loop, FILE* stream); + +UV_EXTERN void uv_close(uv_handle_t* handle, uv_close_cb close_cb); + +UV_EXTERN int uv_send_buffer_size(uv_handle_t* handle, int* value); +UV_EXTERN int uv_recv_buffer_size(uv_handle_t* handle, int* value); + +UV_EXTERN int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd); + +UV_EXTERN uv_buf_t uv_buf_init(char* base, unsigned int len); + + +#define UV_STREAM_FIELDS \ + /* number of bytes queued for writing */ \ + size_t write_queue_size; \ + uv_alloc_cb alloc_cb; \ + uv_read_cb read_cb; \ + /* private */ \ + UV_STREAM_PRIVATE_FIELDS + +/* + * uv_stream_t is a subclass of uv_handle_t. + * + * uv_stream is an abstract class. + * + * uv_stream_t is the parent class of uv_tcp_t, uv_pipe_t and uv_tty_t. + */ +struct uv_stream_s { + UV_HANDLE_FIELDS + UV_STREAM_FIELDS +}; + +UV_EXTERN int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb); +UV_EXTERN int uv_accept(uv_stream_t* server, uv_stream_t* client); + +UV_EXTERN int uv_read_start(uv_stream_t*, + uv_alloc_cb alloc_cb, + uv_read_cb read_cb); +UV_EXTERN int uv_read_stop(uv_stream_t*); + +UV_EXTERN int uv_write(uv_write_t* req, + uv_stream_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_write_cb cb); +UV_EXTERN int uv_write2(uv_write_t* req, + uv_stream_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_stream_t* send_handle, + uv_write_cb cb); +UV_EXTERN int uv_try_write(uv_stream_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs); + +/* uv_write_t is a subclass of uv_req_t. */ +struct uv_write_s { + UV_REQ_FIELDS + uv_write_cb cb; + uv_stream_t* send_handle; + uv_stream_t* handle; + UV_WRITE_PRIVATE_FIELDS +}; + + +UV_EXTERN int uv_is_readable(const uv_stream_t* handle); +UV_EXTERN int uv_is_writable(const uv_stream_t* handle); + +UV_EXTERN int uv_stream_set_blocking(uv_stream_t* handle, int blocking); + +UV_EXTERN int uv_is_closing(const uv_handle_t* handle); + + +/* + * uv_tcp_t is a subclass of uv_stream_t. + * + * Represents a TCP stream or TCP server. + */ +struct uv_tcp_s { + UV_HANDLE_FIELDS + UV_STREAM_FIELDS + UV_TCP_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_tcp_init(uv_loop_t*, uv_tcp_t* handle); +UV_EXTERN int uv_tcp_init_ex(uv_loop_t*, uv_tcp_t* handle, unsigned int flags); +UV_EXTERN int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock); +UV_EXTERN int uv_tcp_nodelay(uv_tcp_t* handle, int enable); +UV_EXTERN int uv_tcp_keepalive(uv_tcp_t* handle, + int enable, + unsigned int delay); +UV_EXTERN int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable); + +enum uv_tcp_flags { + /* Used with uv_tcp_bind, when an IPv6 address is used. */ + UV_TCP_IPV6ONLY = 1 +}; + +UV_EXTERN int uv_tcp_bind(uv_tcp_t* handle, + const struct sockaddr* addr, + unsigned int flags); +UV_EXTERN int uv_tcp_getsockname(const uv_tcp_t* handle, + struct sockaddr* name, + int* namelen); +UV_EXTERN int uv_tcp_getpeername(const uv_tcp_t* handle, + struct sockaddr* name, + int* namelen); +UV_EXTERN int uv_tcp_connect(uv_connect_t* req, + uv_tcp_t* handle, + const struct sockaddr* addr, + uv_connect_cb cb); + +/* uv_connect_t is a subclass of uv_req_t. */ +struct uv_connect_s { + UV_REQ_FIELDS + uv_connect_cb cb; + uv_stream_t* handle; + UV_CONNECT_PRIVATE_FIELDS +}; + + +/* + * UDP support. + */ + +enum uv_udp_flags { + /* Disables dual stack mode. */ + UV_UDP_IPV6ONLY = 1, + /* + * Indicates message was truncated because read buffer was too small. The + * remainder was discarded by the OS. Used in uv_udp_recv_cb. + */ + UV_UDP_PARTIAL = 2, + /* + * Indicates if SO_REUSEADDR will be set when binding the handle. + * This sets the SO_REUSEPORT socket flag on the BSDs and OS X. On other + * Unix platforms, it sets the SO_REUSEADDR flag. What that means is that + * multiple threads or processes can bind to the same address without error + * (provided they all set the flag) but only the last one to bind will receive + * any traffic, in effect "stealing" the port from the previous listener. + */ + UV_UDP_REUSEADDR = 4 +}; + +typedef void (*uv_udp_send_cb)(uv_udp_send_t* req, int status); +typedef void (*uv_udp_recv_cb)(uv_udp_t* handle, + ssize_t nread, + const uv_buf_t* buf, + const struct sockaddr* addr, + unsigned flags); + +/* uv_udp_t is a subclass of uv_handle_t. */ +struct uv_udp_s { + UV_HANDLE_FIELDS + /* read-only */ + /* + * Number of bytes queued for sending. This field strictly shows how much + * information is currently queued. + */ + size_t send_queue_size; + /* + * Number of send requests currently in the queue awaiting to be processed. + */ + size_t send_queue_count; + UV_UDP_PRIVATE_FIELDS +}; + +/* uv_udp_send_t is a subclass of uv_req_t. */ +struct uv_udp_send_s { + UV_REQ_FIELDS + uv_udp_t* handle; + uv_udp_send_cb cb; + UV_UDP_SEND_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_udp_init(uv_loop_t*, uv_udp_t* handle); +UV_EXTERN int uv_udp_init_ex(uv_loop_t*, uv_udp_t* handle, unsigned int flags); +UV_EXTERN int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock); +UV_EXTERN int uv_udp_bind(uv_udp_t* handle, + const struct sockaddr* addr, + unsigned int flags); + +UV_EXTERN int uv_udp_getsockname(const uv_udp_t* handle, + struct sockaddr* name, + int* namelen); +UV_EXTERN int uv_udp_set_membership(uv_udp_t* handle, + const char* multicast_addr, + const char* interface_addr, + uv_membership membership); +UV_EXTERN int uv_udp_set_multicast_loop(uv_udp_t* handle, int on); +UV_EXTERN int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl); +UV_EXTERN int uv_udp_set_multicast_interface(uv_udp_t* handle, + const char* interface_addr); +UV_EXTERN int uv_udp_set_broadcast(uv_udp_t* handle, int on); +UV_EXTERN int uv_udp_set_ttl(uv_udp_t* handle, int ttl); +UV_EXTERN int uv_udp_send(uv_udp_send_t* req, + uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr, + uv_udp_send_cb send_cb); +UV_EXTERN int uv_udp_try_send(uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr); +UV_EXTERN int uv_udp_recv_start(uv_udp_t* handle, + uv_alloc_cb alloc_cb, + uv_udp_recv_cb recv_cb); +UV_EXTERN int uv_udp_recv_stop(uv_udp_t* handle); + + +/* + * uv_tty_t is a subclass of uv_stream_t. + * + * Representing a stream for the console. + */ +struct uv_tty_s { + UV_HANDLE_FIELDS + UV_STREAM_FIELDS + UV_TTY_PRIVATE_FIELDS +}; + +typedef enum { + /* Initial/normal terminal mode */ + UV_TTY_MODE_NORMAL, + /* Raw input mode (On Windows, ENABLE_WINDOW_INPUT is also enabled) */ + UV_TTY_MODE_RAW, + /* Binary-safe I/O mode for IPC (Unix-only) */ + UV_TTY_MODE_IO +} uv_tty_mode_t; + +UV_EXTERN int uv_tty_init(uv_loop_t*, uv_tty_t*, uv_file fd, int readable); +UV_EXTERN int uv_tty_set_mode(uv_tty_t*, uv_tty_mode_t mode); +UV_EXTERN int uv_tty_reset_mode(void); +UV_EXTERN int uv_tty_get_winsize(uv_tty_t*, int* width, int* height); + +#ifdef __cplusplus +extern "C++" { + +inline int uv_tty_set_mode(uv_tty_t* handle, int mode) { + return uv_tty_set_mode(handle, static_cast(mode)); +} + +} +#endif + +UV_EXTERN uv_handle_type uv_guess_handle(uv_file file); + +/* + * uv_pipe_t is a subclass of uv_stream_t. + * + * Representing a pipe stream or pipe server. On Windows this is a Named + * Pipe. On Unix this is a Unix domain socket. + */ +struct uv_pipe_s { + UV_HANDLE_FIELDS + UV_STREAM_FIELDS + int ipc; /* non-zero if this pipe is used for passing handles */ + UV_PIPE_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_pipe_init(uv_loop_t*, uv_pipe_t* handle, int ipc); +UV_EXTERN int uv_pipe_open(uv_pipe_t*, uv_file file); +UV_EXTERN int uv_pipe_bind(uv_pipe_t* handle, const char* name); +UV_EXTERN void uv_pipe_connect(uv_connect_t* req, + uv_pipe_t* handle, + const char* name, + uv_connect_cb cb); +UV_EXTERN int uv_pipe_getsockname(const uv_pipe_t* handle, + char* buffer, + size_t* size); +UV_EXTERN int uv_pipe_getpeername(const uv_pipe_t* handle, + char* buffer, + size_t* size); +UV_EXTERN void uv_pipe_pending_instances(uv_pipe_t* handle, int count); +UV_EXTERN int uv_pipe_pending_count(uv_pipe_t* handle); +UV_EXTERN uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle); + + +struct uv_poll_s { + UV_HANDLE_FIELDS + uv_poll_cb poll_cb; + UV_POLL_PRIVATE_FIELDS +}; + +enum uv_poll_event { + UV_READABLE = 1, + UV_WRITABLE = 2, + UV_DISCONNECT = 4, + UV_PRIORITIZED = 8 +}; + +UV_EXTERN int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd); +UV_EXTERN int uv_poll_init_socket(uv_loop_t* loop, + uv_poll_t* handle, + uv_os_sock_t socket); +UV_EXTERN int uv_poll_start(uv_poll_t* handle, int events, uv_poll_cb cb); +UV_EXTERN int uv_poll_stop(uv_poll_t* handle); + + +struct uv_prepare_s { + UV_HANDLE_FIELDS + UV_PREPARE_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_prepare_init(uv_loop_t*, uv_prepare_t* prepare); +UV_EXTERN int uv_prepare_start(uv_prepare_t* prepare, uv_prepare_cb cb); +UV_EXTERN int uv_prepare_stop(uv_prepare_t* prepare); + + +struct uv_check_s { + UV_HANDLE_FIELDS + UV_CHECK_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_check_init(uv_loop_t*, uv_check_t* check); +UV_EXTERN int uv_check_start(uv_check_t* check, uv_check_cb cb); +UV_EXTERN int uv_check_stop(uv_check_t* check); + + +struct uv_idle_s { + UV_HANDLE_FIELDS + UV_IDLE_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_idle_init(uv_loop_t*, uv_idle_t* idle); +UV_EXTERN int uv_idle_start(uv_idle_t* idle, uv_idle_cb cb); +UV_EXTERN int uv_idle_stop(uv_idle_t* idle); + + +struct uv_async_s { + UV_HANDLE_FIELDS + UV_ASYNC_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_async_init(uv_loop_t*, + uv_async_t* async, + uv_async_cb async_cb); +UV_EXTERN int uv_async_send(uv_async_t* async); + + +/* + * uv_timer_t is a subclass of uv_handle_t. + * + * Used to get woken up at a specified time in the future. + */ +struct uv_timer_s { + UV_HANDLE_FIELDS + UV_TIMER_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_timer_init(uv_loop_t*, uv_timer_t* handle); +UV_EXTERN int uv_timer_start(uv_timer_t* handle, + uv_timer_cb cb, + uint64_t timeout, + uint64_t repeat); +UV_EXTERN int uv_timer_stop(uv_timer_t* handle); +UV_EXTERN int uv_timer_again(uv_timer_t* handle); +UV_EXTERN void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat); +UV_EXTERN uint64_t uv_timer_get_repeat(const uv_timer_t* handle); + + +/* + * uv_getaddrinfo_t is a subclass of uv_req_t. + * + * Request object for uv_getaddrinfo. + */ +struct uv_getaddrinfo_s { + UV_REQ_FIELDS + /* read-only */ + uv_loop_t* loop; + /* struct addrinfo* addrinfo is marked as private, but it really isn't. */ + UV_GETADDRINFO_PRIVATE_FIELDS +}; + + +UV_EXTERN int uv_getaddrinfo(uv_loop_t* loop, + uv_getaddrinfo_t* req, + uv_getaddrinfo_cb getaddrinfo_cb, + const char* node, + const char* service, + const struct addrinfo* hints); +UV_EXTERN void uv_freeaddrinfo(struct addrinfo* ai); + + +/* +* uv_getnameinfo_t is a subclass of uv_req_t. +* +* Request object for uv_getnameinfo. +*/ +struct uv_getnameinfo_s { + UV_REQ_FIELDS + /* read-only */ + uv_loop_t* loop; + /* host and service are marked as private, but they really aren't. */ + UV_GETNAMEINFO_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_getnameinfo(uv_loop_t* loop, + uv_getnameinfo_t* req, + uv_getnameinfo_cb getnameinfo_cb, + const struct sockaddr* addr, + int flags); + + +/* uv_spawn() options. */ +typedef enum { + UV_IGNORE = 0x00, + UV_CREATE_PIPE = 0x01, + UV_INHERIT_FD = 0x02, + UV_INHERIT_STREAM = 0x04, + + /* + * When UV_CREATE_PIPE is specified, UV_READABLE_PIPE and UV_WRITABLE_PIPE + * determine the direction of flow, from the child process' perspective. Both + * flags may be specified to create a duplex data stream. + */ + UV_READABLE_PIPE = 0x10, + UV_WRITABLE_PIPE = 0x20 +} uv_stdio_flags; + +typedef struct uv_stdio_container_s { + uv_stdio_flags flags; + + union { + uv_stream_t* stream; + int fd; + } data; +} uv_stdio_container_t; + +typedef struct uv_process_options_s { + uv_exit_cb exit_cb; /* Called after the process exits. */ + const char* file; /* Path to program to execute. */ + /* + * Command line arguments. args[0] should be the path to the program. On + * Windows this uses CreateProcess which concatenates the arguments into a + * string this can cause some strange errors. See the note at + * windows_verbatim_arguments. + */ + char** args; + /* + * This will be set as the environ variable in the subprocess. If this is + * NULL then the parents environ will be used. + */ + char** env; + /* + * If non-null this represents a directory the subprocess should execute + * in. Stands for current working directory. + */ + const char* cwd; + /* + * Various flags that control how uv_spawn() behaves. See the definition of + * `enum uv_process_flags` below. + */ + unsigned int flags; + /* + * The `stdio` field points to an array of uv_stdio_container_t structs that + * describe the file descriptors that will be made available to the child + * process. The convention is that stdio[0] points to stdin, fd 1 is used for + * stdout, and fd 2 is stderr. + * + * Note that on windows file descriptors greater than 2 are available to the + * child process only if the child processes uses the MSVCRT runtime. + */ + int stdio_count; + uv_stdio_container_t* stdio; + /* + * Libuv can change the child process' user/group id. This happens only when + * the appropriate bits are set in the flags fields. This is not supported on + * windows; uv_spawn() will fail and set the error to UV_ENOTSUP. + */ + uv_uid_t uid; + uv_gid_t gid; +} uv_process_options_t; + +/* + * These are the flags that can be used for the uv_process_options.flags field. + */ +enum uv_process_flags { + /* + * Set the child process' user id. The user id is supplied in the `uid` field + * of the options struct. This does not work on windows; setting this flag + * will cause uv_spawn() to fail. + */ + UV_PROCESS_SETUID = (1 << 0), + /* + * Set the child process' group id. The user id is supplied in the `gid` + * field of the options struct. This does not work on windows; setting this + * flag will cause uv_spawn() to fail. + */ + UV_PROCESS_SETGID = (1 << 1), + /* + * Do not wrap any arguments in quotes, or perform any other escaping, when + * converting the argument list into a command line string. This option is + * only meaningful on Windows systems. On Unix it is silently ignored. + */ + UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS = (1 << 2), + /* + * Spawn the child process in a detached state - this will make it a process + * group leader, and will effectively enable the child to keep running after + * the parent exits. Note that the child process will still keep the + * parent's event loop alive unless the parent process calls uv_unref() on + * the child's process handle. + */ + UV_PROCESS_DETACHED = (1 << 3), + /* + * Hide the subprocess console window that would normally be created. This + * option is only meaningful on Windows systems. On Unix it is silently + * ignored. + */ + UV_PROCESS_WINDOWS_HIDE = (1 << 4) +}; + +/* + * uv_process_t is a subclass of uv_handle_t. + */ +struct uv_process_s { + UV_HANDLE_FIELDS + uv_exit_cb exit_cb; + int pid; + UV_PROCESS_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_spawn(uv_loop_t* loop, + uv_process_t* handle, + const uv_process_options_t* options); +UV_EXTERN int uv_process_kill(uv_process_t*, int signum); +UV_EXTERN int uv_kill(int pid, int signum); + + +/* + * uv_work_t is a subclass of uv_req_t. + */ +struct uv_work_s { + UV_REQ_FIELDS + uv_loop_t* loop; + uv_work_cb work_cb; + uv_after_work_cb after_work_cb; + UV_WORK_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_queue_work(uv_loop_t* loop, + uv_work_t* req, + uv_work_cb work_cb, + uv_after_work_cb after_work_cb); + +UV_EXTERN int uv_cancel(uv_req_t* req); + + +struct uv_cpu_info_s { + char* model; + int speed; + struct uv_cpu_times_s { + uint64_t user; + uint64_t nice; + uint64_t sys; + uint64_t idle; + uint64_t irq; + } cpu_times; +}; + +struct uv_interface_address_s { + char* name; + char phys_addr[6]; + int is_internal; + union { + struct sockaddr_in address4; + struct sockaddr_in6 address6; + } address; + union { + struct sockaddr_in netmask4; + struct sockaddr_in6 netmask6; + } netmask; +}; + +struct uv_passwd_s { + char* username; + long uid; + long gid; + char* shell; + char* homedir; +}; + +typedef enum { + UV_DIRENT_UNKNOWN, + UV_DIRENT_FILE, + UV_DIRENT_DIR, + UV_DIRENT_LINK, + UV_DIRENT_FIFO, + UV_DIRENT_SOCKET, + UV_DIRENT_CHAR, + UV_DIRENT_BLOCK +} uv_dirent_type_t; + +struct uv_dirent_s { + const char* name; + uv_dirent_type_t type; +}; + +UV_EXTERN char** uv_setup_args(int argc, char** argv); +UV_EXTERN int uv_get_process_title(char* buffer, size_t size); +UV_EXTERN int uv_set_process_title(const char* title); +UV_EXTERN int uv_resident_set_memory(size_t* rss); +UV_EXTERN int uv_uptime(double* uptime); +UV_EXTERN uv_os_fd_t uv_get_osfhandle(int fd); + +typedef struct { + long tv_sec; + long tv_usec; +} uv_timeval_t; + +typedef struct { + uv_timeval_t ru_utime; /* user CPU time used */ + uv_timeval_t ru_stime; /* system CPU time used */ + uint64_t ru_maxrss; /* maximum resident set size */ + uint64_t ru_ixrss; /* integral shared memory size */ + uint64_t ru_idrss; /* integral unshared data size */ + uint64_t ru_isrss; /* integral unshared stack size */ + uint64_t ru_minflt; /* page reclaims (soft page faults) */ + uint64_t ru_majflt; /* page faults (hard page faults) */ + uint64_t ru_nswap; /* swaps */ + uint64_t ru_inblock; /* block input operations */ + uint64_t ru_oublock; /* block output operations */ + uint64_t ru_msgsnd; /* IPC messages sent */ + uint64_t ru_msgrcv; /* IPC messages received */ + uint64_t ru_nsignals; /* signals received */ + uint64_t ru_nvcsw; /* voluntary context switches */ + uint64_t ru_nivcsw; /* involuntary context switches */ +} uv_rusage_t; + +UV_EXTERN int uv_getrusage(uv_rusage_t* rusage); + +UV_EXTERN int uv_os_homedir(char* buffer, size_t* size); +UV_EXTERN int uv_os_tmpdir(char* buffer, size_t* size); +UV_EXTERN int uv_os_get_passwd(uv_passwd_t* pwd); +UV_EXTERN void uv_os_free_passwd(uv_passwd_t* pwd); + +UV_EXTERN int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count); +UV_EXTERN void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count); + +UV_EXTERN int uv_interface_addresses(uv_interface_address_t** addresses, + int* count); +UV_EXTERN void uv_free_interface_addresses(uv_interface_address_t* addresses, + int count); + +UV_EXTERN int uv_os_getenv(const char* name, char* buffer, size_t* size); +UV_EXTERN int uv_os_setenv(const char* name, const char* value); +UV_EXTERN int uv_os_unsetenv(const char* name); + +UV_EXTERN int uv_os_gethostname(char* buffer, size_t* size); + + +typedef enum { + UV_FS_UNKNOWN = -1, + UV_FS_CUSTOM, + UV_FS_OPEN, + UV_FS_CLOSE, + UV_FS_READ, + UV_FS_WRITE, + UV_FS_SENDFILE, + UV_FS_STAT, + UV_FS_LSTAT, + UV_FS_FSTAT, + UV_FS_FTRUNCATE, + UV_FS_UTIME, + UV_FS_FUTIME, + UV_FS_ACCESS, + UV_FS_CHMOD, + UV_FS_FCHMOD, + UV_FS_FSYNC, + UV_FS_FDATASYNC, + UV_FS_UNLINK, + UV_FS_RMDIR, + UV_FS_MKDIR, + UV_FS_MKDTEMP, + UV_FS_RENAME, + UV_FS_SCANDIR, + UV_FS_LINK, + UV_FS_SYMLINK, + UV_FS_READLINK, + UV_FS_CHOWN, + UV_FS_FCHOWN, + UV_FS_REALPATH +} uv_fs_type; + +/* uv_fs_t is a subclass of uv_req_t. */ +struct uv_fs_s { + UV_REQ_FIELDS + uv_fs_type fs_type; + uv_loop_t* loop; + uv_fs_cb cb; + ssize_t result; + void* ptr; + const char* path; + uv_stat_t statbuf; /* Stores the result of uv_fs_stat() and uv_fs_fstat(). */ + UV_FS_PRIVATE_FIELDS +}; + +UV_EXTERN void uv_fs_req_cleanup(uv_fs_t* req); +UV_EXTERN int uv_fs_close(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_open(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int flags, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_read(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + const uv_buf_t bufs[], + unsigned int nbufs, + int64_t offset, + uv_fs_cb cb); +UV_EXTERN int uv_fs_unlink(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_write(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + const uv_buf_t bufs[], + unsigned int nbufs, + int64_t offset, + uv_fs_cb cb); +UV_EXTERN int uv_fs_mkdir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_mkdtemp(uv_loop_t* loop, + uv_fs_t* req, + const char* tpl, + uv_fs_cb cb); +UV_EXTERN int uv_fs_rmdir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_scandir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int flags, + uv_fs_cb cb); +UV_EXTERN int uv_fs_scandir_next(uv_fs_t* req, + uv_dirent_t* ent); +UV_EXTERN int uv_fs_stat(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fstat(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_rename(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fsync(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fdatasync(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_ftruncate(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + int64_t offset, + uv_fs_cb cb); +UV_EXTERN int uv_fs_sendfile(uv_loop_t* loop, + uv_fs_t* req, + uv_file out_fd, + uv_file in_fd, + int64_t in_offset, + size_t length, + uv_fs_cb cb); +UV_EXTERN int uv_fs_access(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_chmod(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_utime(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + double atime, + double mtime, + uv_fs_cb cb); +UV_EXTERN int uv_fs_futime(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + double atime, + double mtime, + uv_fs_cb cb); +UV_EXTERN int uv_fs_lstat(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_link(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + uv_fs_cb cb); + +/* + * This flag can be used with uv_fs_symlink() on Windows to specify whether + * path argument points to a directory. + */ +#define UV_FS_SYMLINK_DIR 0x0001 + +/* + * This flag can be used with uv_fs_symlink() on Windows to specify whether + * the symlink is to be created using junction points. + */ +#define UV_FS_SYMLINK_JUNCTION 0x0002 + +UV_EXTERN int uv_fs_symlink(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + int flags, + uv_fs_cb cb); +UV_EXTERN int uv_fs_readlink(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_realpath(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fchmod(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_chown(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_uid_t uid, + uv_gid_t gid, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fchown(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_uid_t uid, + uv_gid_t gid, + uv_fs_cb cb); + + +enum uv_fs_event { + UV_RENAME = 1, + UV_CHANGE = 2 +}; + + +struct uv_fs_event_s { + UV_HANDLE_FIELDS + /* private */ + char* path; + UV_FS_EVENT_PRIVATE_FIELDS +}; + + +/* + * uv_fs_stat() based polling file watcher. + */ +struct uv_fs_poll_s { + UV_HANDLE_FIELDS + /* Private, don't touch. */ + void* poll_ctx; +}; + +UV_EXTERN int uv_fs_poll_init(uv_loop_t* loop, uv_fs_poll_t* handle); +UV_EXTERN int uv_fs_poll_start(uv_fs_poll_t* handle, + uv_fs_poll_cb poll_cb, + const char* path, + unsigned int interval); +UV_EXTERN int uv_fs_poll_stop(uv_fs_poll_t* handle); +UV_EXTERN int uv_fs_poll_getpath(uv_fs_poll_t* handle, + char* buffer, + size_t* size); + + +struct uv_signal_s { + UV_HANDLE_FIELDS + uv_signal_cb signal_cb; + int signum; + UV_SIGNAL_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle); +UV_EXTERN int uv_signal_start(uv_signal_t* handle, + uv_signal_cb signal_cb, + int signum); +UV_EXTERN int uv_signal_start_oneshot(uv_signal_t* handle, + uv_signal_cb signal_cb, + int signum); +UV_EXTERN int uv_signal_stop(uv_signal_t* handle); + +UV_EXTERN void uv_loadavg(double avg[3]); + + +/* + * Flags to be passed to uv_fs_event_start(). + */ +enum uv_fs_event_flags { + /* + * By default, if the fs event watcher is given a directory name, we will + * watch for all events in that directory. This flags overrides this behavior + * and makes fs_event report only changes to the directory entry itself. This + * flag does not affect individual files watched. + * This flag is currently not implemented yet on any backend. + */ + UV_FS_EVENT_WATCH_ENTRY = 1, + + /* + * By default uv_fs_event will try to use a kernel interface such as inotify + * or kqueue to detect events. This may not work on remote filesystems such + * as NFS mounts. This flag makes fs_event fall back to calling stat() on a + * regular interval. + * This flag is currently not implemented yet on any backend. + */ + UV_FS_EVENT_STAT = 2, + + /* + * By default, event watcher, when watching directory, is not registering + * (is ignoring) changes in it's subdirectories. + * This flag will override this behaviour on platforms that support it. + */ + UV_FS_EVENT_RECURSIVE = 4 +}; + + +UV_EXTERN int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle); +UV_EXTERN int uv_fs_event_start(uv_fs_event_t* handle, + uv_fs_event_cb cb, + const char* path, + unsigned int flags); +UV_EXTERN int uv_fs_event_stop(uv_fs_event_t* handle); +UV_EXTERN int uv_fs_event_getpath(uv_fs_event_t* handle, + char* buffer, + size_t* size); + +UV_EXTERN int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr); +UV_EXTERN int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr); + +UV_EXTERN int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size); +UV_EXTERN int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size); + +UV_EXTERN int uv_inet_ntop(int af, const void* src, char* dst, size_t size); +UV_EXTERN int uv_inet_pton(int af, const char* src, void* dst); + +UV_EXTERN int uv_exepath(char* buffer, size_t* size); + +UV_EXTERN int uv_cwd(char* buffer, size_t* size); + +UV_EXTERN int uv_chdir(const char* dir); + +UV_EXTERN uint64_t uv_get_free_memory(void); +UV_EXTERN uint64_t uv_get_total_memory(void); + +UV_EXTERN uint64_t uv_hrtime(void); + +UV_EXTERN void uv_disable_stdio_inheritance(void); + +UV_EXTERN int uv_dlopen(const char* filename, uv_lib_t* lib); +UV_EXTERN void uv_dlclose(uv_lib_t* lib); +UV_EXTERN int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr); +UV_EXTERN const char* uv_dlerror(const uv_lib_t* lib); + +UV_EXTERN int uv_mutex_init(uv_mutex_t* handle); +UV_EXTERN void uv_mutex_destroy(uv_mutex_t* handle); +UV_EXTERN void uv_mutex_lock(uv_mutex_t* handle); +UV_EXTERN int uv_mutex_trylock(uv_mutex_t* handle); +UV_EXTERN void uv_mutex_unlock(uv_mutex_t* handle); + +UV_EXTERN int uv_rwlock_init(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_destroy(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_rdlock(uv_rwlock_t* rwlock); +UV_EXTERN int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_rdunlock(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_wrlock(uv_rwlock_t* rwlock); +UV_EXTERN int uv_rwlock_trywrlock(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_wrunlock(uv_rwlock_t* rwlock); + +UV_EXTERN int uv_sem_init(uv_sem_t* sem, unsigned int value); +UV_EXTERN void uv_sem_destroy(uv_sem_t* sem); +UV_EXTERN void uv_sem_post(uv_sem_t* sem); +UV_EXTERN void uv_sem_wait(uv_sem_t* sem); +UV_EXTERN int uv_sem_trywait(uv_sem_t* sem); + +UV_EXTERN int uv_cond_init(uv_cond_t* cond); +UV_EXTERN void uv_cond_destroy(uv_cond_t* cond); +UV_EXTERN void uv_cond_signal(uv_cond_t* cond); +UV_EXTERN void uv_cond_broadcast(uv_cond_t* cond); + +UV_EXTERN int uv_barrier_init(uv_barrier_t* barrier, unsigned int count); +UV_EXTERN void uv_barrier_destroy(uv_barrier_t* barrier); +UV_EXTERN int uv_barrier_wait(uv_barrier_t* barrier); + +UV_EXTERN void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex); +UV_EXTERN int uv_cond_timedwait(uv_cond_t* cond, + uv_mutex_t* mutex, + uint64_t timeout); + +UV_EXTERN void uv_once(uv_once_t* guard, void (*callback)(void)); + +UV_EXTERN int uv_key_create(uv_key_t* key); +UV_EXTERN void uv_key_delete(uv_key_t* key); +UV_EXTERN void* uv_key_get(uv_key_t* key); +UV_EXTERN void uv_key_set(uv_key_t* key, void* value); + +typedef void (*uv_thread_cb)(void* arg); + +UV_EXTERN int uv_thread_create(uv_thread_t* tid, uv_thread_cb entry, void* arg); +UV_EXTERN uv_thread_t uv_thread_self(void); +UV_EXTERN int uv_thread_join(uv_thread_t *tid); +UV_EXTERN int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2); + +/* The presence of these unions force similar struct layout. */ +#define XX(_, name) uv_ ## name ## _t name; +union uv_any_handle { + UV_HANDLE_TYPE_MAP(XX) +}; + +union uv_any_req { + UV_REQ_TYPE_MAP(XX) +}; +#undef XX + + +struct uv_loop_s { + /* User data - use this for whatever. */ + void* data; + /* Loop reference counting. */ + unsigned int active_handles; + void* handle_queue[2]; + void* active_reqs[2]; + /* Internal flag to signal loop stop. */ + unsigned int stop_flag; + UV_LOOP_PRIVATE_FIELDS +}; + + +/* Don't export the private CPP symbols. */ +#undef UV_HANDLE_TYPE_PRIVATE +#undef UV_REQ_TYPE_PRIVATE +#undef UV_REQ_PRIVATE_FIELDS +#undef UV_STREAM_PRIVATE_FIELDS +#undef UV_TCP_PRIVATE_FIELDS +#undef UV_PREPARE_PRIVATE_FIELDS +#undef UV_CHECK_PRIVATE_FIELDS +#undef UV_IDLE_PRIVATE_FIELDS +#undef UV_ASYNC_PRIVATE_FIELDS +#undef UV_TIMER_PRIVATE_FIELDS +#undef UV_GETADDRINFO_PRIVATE_FIELDS +#undef UV_GETNAMEINFO_PRIVATE_FIELDS +#undef UV_FS_REQ_PRIVATE_FIELDS +#undef UV_WORK_PRIVATE_FIELDS +#undef UV_FS_EVENT_PRIVATE_FIELDS +#undef UV_SIGNAL_PRIVATE_FIELDS +#undef UV_LOOP_PRIVATE_FIELDS +#undef UV_LOOP_PRIVATE_PLATFORM_FIELDS + +#ifdef __cplusplus +} +#endif +#endif /* UV_H */ diff --git a/lib/ESPiLight/pilight/libs/libuv/version.c b/lib/ESPiLight/pilight/libs/libuv/version.c new file mode 100644 index 0000000..686dedd --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/version.c @@ -0,0 +1,45 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" + +#define UV_STRINGIFY(v) UV_STRINGIFY_HELPER(v) +#define UV_STRINGIFY_HELPER(v) #v + +#define UV_VERSION_STRING_BASE UV_STRINGIFY(UV_VERSION_MAJOR) "." \ + UV_STRINGIFY(UV_VERSION_MINOR) "." \ + UV_STRINGIFY(UV_VERSION_PATCH) + +#if UV_VERSION_IS_RELEASE +# define UV_VERSION_STRING UV_VERSION_STRING_BASE +#else +# define UV_VERSION_STRING UV_VERSION_STRING_BASE "-" UV_VERSION_SUFFIX +#endif + + +unsigned int uv_version(void) { + return UV_VERSION_HEX; +} + + +const char* uv_version_string(void) { + return UV_VERSION_STRING; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/async.c b/lib/ESPiLight/pilight/libs/libuv/win/async.c new file mode 100644 index 0000000..0b636ed --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/async.c @@ -0,0 +1,98 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include + +#include "uv.h" +#include "internal.h" +#include "atomicops-inl.h" +#include "handle-inl.h" +#include "req-inl.h" + + +void uv_async_endgame(uv_loop_t* loop, uv_async_t* handle) { + if (handle->flags & UV__HANDLE_CLOSING && + !handle->async_sent) { + assert(!(handle->flags & UV_HANDLE_CLOSED)); + uv__handle_close(handle); + } +} + + +int uv_async_init(uv_loop_t* loop, uv_async_t* handle, uv_async_cb async_cb) { + uv_req_t* req; + + uv__handle_init(loop, (uv_handle_t*) handle, UV_ASYNC); + handle->async_sent = 0; + handle->async_cb = async_cb; + + req = &handle->async_req; + UV_REQ_INIT(req, UV_WAKEUP); + req->data = handle; + + uv__handle_start(handle); + + return 0; +} + + +void uv_async_close(uv_loop_t* loop, uv_async_t* handle) { + if (!((uv_async_t*)handle)->async_sent) { + uv_want_endgame(loop, (uv_handle_t*) handle); + } + + uv__handle_closing(handle); +} + + +int uv_async_send(uv_async_t* handle) { + uv_loop_t* loop = handle->loop; + + if (handle->type != UV_ASYNC) { + /* Can't set errno because that's not thread-safe. */ + return -1; + } + + /* The user should make sure never to call uv_async_send to a closing */ + /* or closed handle. */ + assert(!(handle->flags & UV__HANDLE_CLOSING)); + + if (!uv__atomic_exchange_set(&handle->async_sent)) { + POST_COMPLETION_FOR_REQ(loop, &handle->async_req); + } + + return 0; +} + + +void uv_process_async_wakeup_req(uv_loop_t* loop, uv_async_t* handle, + uv_req_t* req) { + assert(handle->type == UV_ASYNC); + assert(req->type == UV_WAKEUP); + + handle->async_sent = 0; + + if (handle->flags & UV__HANDLE_CLOSING) { + uv_want_endgame(loop, (uv_handle_t*)handle); + } else if (handle->async_cb != NULL) { + handle->async_cb(handle); + } +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/atomicops-inl.h b/lib/ESPiLight/pilight/libs/libuv/win/atomicops-inl.h new file mode 100644 index 0000000..6d8126f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/atomicops-inl.h @@ -0,0 +1,57 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_WIN_ATOMICOPS_INL_H_ +#define UV_WIN_ATOMICOPS_INL_H_ + +#include "uv.h" +#include "internal.h" + + +/* Atomic set operation on char */ +#ifdef _MSC_VER /* MSVC */ + +/* _InterlockedOr8 is supported by MSVC on x32 and x64. It is slightly less */ +/* efficient than InterlockedExchange, but InterlockedExchange8 does not */ +/* exist, and interlocked operations on larger targets might require the */ +/* target to be aligned. */ +#pragma intrinsic(_InterlockedOr8) + +static char INLINE uv__atomic_exchange_set(char volatile* target) { + return _InterlockedOr8(target, 1); +} + +#else /* GCC */ + +/* Mingw-32 version, hopefully this works for 64-bit gcc as well. */ +static inline char uv__atomic_exchange_set(char volatile* target) { + const char one = 1; + char old_value; + __asm__ __volatile__ ("lock xchgb %0, %1\n\t" + : "=r"(old_value), "=m"(*target) + : "0"(one), "m"(*target) + : "memory"); + return old_value; +} + +#endif + +#endif /* UV_WIN_ATOMICOPS_INL_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/win/core.c b/lib/ESPiLight/pilight/libs/libuv/win/core.c new file mode 100644 index 0000000..9ed4e82 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/core.c @@ -0,0 +1,605 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#if defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR) +#include +#endif + +#include "uv.h" +#include "internal.h" +#include "queue.h" +#include "handle-inl.h" +#include "req-inl.h" + +/* uv_once initialization guards */ +static uv_once_t uv_init_guard_ = UV_ONCE_INIT; + + +#if defined(_DEBUG) && (defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR)) +/* Our crt debug report handler allows us to temporarily disable asserts + * just for the current thread. + */ + +UV_THREAD_LOCAL int uv__crt_assert_enabled = TRUE; + +static int uv__crt_dbg_report_handler(int report_type, char *message, int *ret_val) { + if (uv__crt_assert_enabled || report_type != _CRT_ASSERT) + return FALSE; + + if (ret_val) { + /* Set ret_val to 0 to continue with normal execution. + * Set ret_val to 1 to trigger a breakpoint. + */ + + if(IsDebuggerPresent()) + *ret_val = 1; + else + *ret_val = 0; + } + + /* Don't call _CrtDbgReport. */ + return TRUE; +} +#else +UV_THREAD_LOCAL int uv__crt_assert_enabled = FALSE; +#endif + + +#if !defined(__MINGW32__) || __MSVCRT_VERSION__ >= 0x800 +static void uv__crt_invalid_parameter_handler(const wchar_t* expression, + const wchar_t* function, const wchar_t * file, unsigned int line, + uintptr_t reserved) { + /* No-op. */ +} +#endif + +static uv_loop_t** uv__loops; +static int uv__loops_size; +static int uv__loops_capacity; +#define UV__LOOPS_CHUNK_SIZE 8 +static uv_mutex_t uv__loops_lock; + +static void uv__loops_init(void) { + uv_mutex_init(&uv__loops_lock); +} + +static int uv__loops_add(uv_loop_t* loop) { + uv_loop_t** new_loops; + int new_capacity, i; + + uv_mutex_lock(&uv__loops_lock); + + if (uv__loops_size == uv__loops_capacity) { + new_capacity = uv__loops_capacity + UV__LOOPS_CHUNK_SIZE; + new_loops = uv__realloc(uv__loops, sizeof(uv_loop_t*) * new_capacity); + if (!new_loops) + goto failed_loops_realloc; + uv__loops = new_loops; + for (i = uv__loops_capacity; i < new_capacity; ++i) + uv__loops[i] = NULL; + uv__loops_capacity = new_capacity; + } + uv__loops[uv__loops_size] = loop; + ++uv__loops_size; + + uv_mutex_unlock(&uv__loops_lock); + return 0; + +failed_loops_realloc: + uv_mutex_unlock(&uv__loops_lock); + return ERROR_OUTOFMEMORY; +} + +static void uv__loops_remove(uv_loop_t* loop) { + int loop_index; + int smaller_capacity; + uv_loop_t** new_loops; + + uv_mutex_lock(&uv__loops_lock); + + for (loop_index = 0; loop_index < uv__loops_size; ++loop_index) { + if (uv__loops[loop_index] == loop) + break; + } + /* If loop was not found, ignore */ + if (loop_index == uv__loops_size) + goto loop_removed; + + uv__loops[loop_index] = uv__loops[uv__loops_size - 1]; + uv__loops[uv__loops_size - 1] = NULL; + --uv__loops_size; + + if (uv__loops_size == 0) { + uv__loops_capacity = 0; + uv__free(uv__loops); + uv__loops = NULL; + goto loop_removed; + } + + /* If we didn't grow to big skip downsizing */ + if (uv__loops_capacity < 4 * UV__LOOPS_CHUNK_SIZE) + goto loop_removed; + + /* Downsize only if more than half of buffer is free */ + smaller_capacity = uv__loops_capacity / 2; + if (uv__loops_size >= smaller_capacity) + goto loop_removed; + new_loops = uv__realloc(uv__loops, sizeof(uv_loop_t*) * smaller_capacity); + if (!new_loops) + goto loop_removed; + uv__loops = new_loops; + uv__loops_capacity = smaller_capacity; + +loop_removed: + uv_mutex_unlock(&uv__loops_lock); +} + +void uv__wake_all_loops(void) { + int i; + uv_loop_t* loop; + + uv_mutex_lock(&uv__loops_lock); + for (i = 0; i < uv__loops_size; ++i) { + loop = uv__loops[i]; + assert(loop); + if (loop->iocp != INVALID_HANDLE_VALUE) + PostQueuedCompletionStatus(loop->iocp, 0, 0, NULL); + } + uv_mutex_unlock(&uv__loops_lock); +} + +static void uv_init(void) { + /* Tell Windows that we will handle critical errors. */ + SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | + SEM_NOOPENFILEERRORBOX); + + /* Tell the CRT to not exit the application when an invalid parameter is + * passed. The main issue is that invalid FDs will trigger this behavior. + */ +#if !defined(__MINGW32__) || __MSVCRT_VERSION__ >= 0x800 + _set_invalid_parameter_handler(uv__crt_invalid_parameter_handler); +#endif + + /* We also need to setup our debug report handler because some CRT + * functions (eg _get_osfhandle) raise an assert when called with invalid + * FDs even though they return the proper error code in the release build. + */ +#if defined(_DEBUG) && (defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR)) + _CrtSetReportHook(uv__crt_dbg_report_handler); +#endif + + /* Initialize tracking of all uv loops */ + uv__loops_init(); + + /* Fetch winapi function pointers. This must be done first because other + * initialization code might need these function pointers to be loaded. + */ + uv_winapi_init(); + + /* Initialize winsock */ + uv_winsock_init(); + + /* Initialize FS */ + uv_fs_init(); + + /* Initialize signal stuff */ + uv_signals_init(); + + /* Initialize console */ + uv_console_init(); + + /* Initialize utilities */ + uv__util_init(); + + /* Initialize system wakeup detection */ + uv__init_detect_system_wakeup(); +} + + +int uv_loop_init(uv_loop_t* loop) { + int err; + + /* Initialize libuv itself first */ + uv__once_init(); + + /* Create an I/O completion port */ + loop->iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1); + if (loop->iocp == NULL) + return uv_translate_sys_error(GetLastError()); + + /* To prevent uninitialized memory access, loop->time must be initialized + * to zero before calling uv_update_time for the first time. + */ + loop->time = 0; + uv_update_time(loop); + + QUEUE_INIT(&loop->wq); + QUEUE_INIT(&loop->handle_queue); + QUEUE_INIT(&loop->active_reqs); + loop->active_handles = 0; + + loop->pending_reqs_tail = NULL; + + loop->endgame_handles = NULL; + + RB_INIT(&loop->timers); + + loop->check_handles = NULL; + loop->prepare_handles = NULL; + loop->idle_handles = NULL; + + loop->next_prepare_handle = NULL; + loop->next_check_handle = NULL; + loop->next_idle_handle = NULL; + + memset(&loop->poll_peer_sockets, 0, sizeof loop->poll_peer_sockets); + + loop->active_tcp_streams = 0; + loop->active_udp_streams = 0; + + loop->timer_counter = 0; + loop->stop_flag = 0; + + err = uv_mutex_init(&loop->wq_mutex); + if (err) + goto fail_mutex_init; + + err = uv_async_init(loop, &loop->wq_async, uv__work_done); + if (err) + goto fail_async_init; + + uv__handle_unref(&loop->wq_async); + loop->wq_async.flags |= UV__HANDLE_INTERNAL; + + err = uv__loops_add(loop); + if (err) + goto fail_async_init; + + return 0; + +fail_async_init: + uv_mutex_destroy(&loop->wq_mutex); + +fail_mutex_init: + CloseHandle(loop->iocp); + loop->iocp = INVALID_HANDLE_VALUE; + + return err; +} + + +void uv__once_init(void) { + uv_once(&uv_init_guard_, uv_init); +} + + +void uv__loop_close(uv_loop_t* loop) { + size_t i; + + uv__loops_remove(loop); + + /* close the async handle without needing an extra loop iteration */ + assert(!loop->wq_async.async_sent); + loop->wq_async.close_cb = NULL; + uv__handle_closing(&loop->wq_async); + uv__handle_close(&loop->wq_async); + + for (i = 0; i < ARRAY_SIZE(loop->poll_peer_sockets); i++) { + SOCKET sock = loop->poll_peer_sockets[i]; + if (sock != 0 && sock != INVALID_SOCKET) + closesocket(sock); + } + + uv_mutex_lock(&loop->wq_mutex); + assert(QUEUE_EMPTY(&loop->wq) && "thread pool work queue not empty!"); + assert(!uv__has_active_reqs(loop)); + uv_mutex_unlock(&loop->wq_mutex); + uv_mutex_destroy(&loop->wq_mutex); + + CloseHandle(loop->iocp); +} + + +int uv__loop_configure(uv_loop_t* loop, uv_loop_option option, va_list ap) { + return UV_ENOSYS; +} + + +int uv_backend_fd(const uv_loop_t* loop) { + return -1; +} + + +int uv_loop_fork(uv_loop_t* loop) { + return UV_ENOSYS; +} + + +int uv_backend_timeout(const uv_loop_t* loop) { + if (loop->stop_flag != 0) + return 0; + + if (!uv__has_active_handles(loop) && !uv__has_active_reqs(loop)) + return 0; + + if (loop->pending_reqs_tail) + return 0; + + if (loop->endgame_handles) + return 0; + + if (loop->idle_handles) + return 0; + + return uv__next_timeout(loop); +} + + +static void uv_poll(uv_loop_t* loop, DWORD timeout) { + DWORD bytes; + ULONG_PTR key; + OVERLAPPED* overlapped; + uv_req_t* req; + int repeat; + uint64_t timeout_time; + + timeout_time = loop->time + timeout; + + for (repeat = 0; ; repeat++) { + GetQueuedCompletionStatus(loop->iocp, + &bytes, + &key, + &overlapped, + timeout); + + if (overlapped) { + /* Package was dequeued */ + req = uv_overlapped_to_req(overlapped); + uv_insert_pending_req(loop, req); + + /* Some time might have passed waiting for I/O, + * so update the loop time here. + */ + uv_update_time(loop); + } else if (GetLastError() != WAIT_TIMEOUT) { + /* Serious error */ + uv_fatal_error(GetLastError(), "GetQueuedCompletionStatus"); + } else if (timeout > 0) { + /* GetQueuedCompletionStatus can occasionally return a little early. + * Make sure that the desired timeout target time is reached. + */ + uv_update_time(loop); + if (timeout_time > loop->time) { + timeout = (DWORD)(timeout_time - loop->time); + /* The first call to GetQueuedCompletionStatus should return very + * close to the target time and the second should reach it, but + * this is not stated in the documentation. To make sure a busy + * loop cannot happen, the timeout is increased exponentially + * starting on the third round. + */ + timeout += repeat ? (1 << (repeat - 1)) : 0; + continue; + } + } + break; + } +} + + +static void uv_poll_ex(uv_loop_t* loop, DWORD timeout) { + BOOL success; + uv_req_t* req; + OVERLAPPED_ENTRY overlappeds[128]; + ULONG count; + ULONG i; + int repeat; + uint64_t timeout_time; + + timeout_time = loop->time + timeout; + + for (repeat = 0; ; repeat++) { + success = pGetQueuedCompletionStatusEx(loop->iocp, + overlappeds, + ARRAY_SIZE(overlappeds), + &count, + timeout, + FALSE); + + if (success) { + for (i = 0; i < count; i++) { + /* Package was dequeued, but see if it is not a empty package + * meant only to wake us up. + */ + if (overlappeds[i].lpOverlapped) { + req = uv_overlapped_to_req(overlappeds[i].lpOverlapped); + uv_insert_pending_req(loop, req); + } + } + + /* Some time might have passed waiting for I/O, + * so update the loop time here. + */ + uv_update_time(loop); + } else if (GetLastError() != WAIT_TIMEOUT) { + /* Serious error */ + uv_fatal_error(GetLastError(), "GetQueuedCompletionStatusEx"); + } else if (timeout > 0) { + /* GetQueuedCompletionStatus can occasionally return a little early. + * Make sure that the desired timeout target time is reached. + */ + uv_update_time(loop); + if (timeout_time > loop->time) { + timeout = (DWORD)(timeout_time - loop->time); + /* The first call to GetQueuedCompletionStatus should return very + * close to the target time and the second should reach it, but + * this is not stated in the documentation. To make sure a busy + * loop cannot happen, the timeout is increased exponentially + * starting on the third round. + */ + timeout += repeat ? (1 << (repeat - 1)) : 0; + continue; + } + } + break; + } +} + + +static int uv__loop_alive(const uv_loop_t* loop) { + return loop->active_handles > 0 || + !QUEUE_EMPTY(&loop->active_reqs) || + loop->endgame_handles != NULL; +} + + +int uv_loop_alive(const uv_loop_t* loop) { + return uv__loop_alive(loop); +} + + +int uv_run(uv_loop_t *loop, uv_run_mode mode) { + DWORD timeout; + int r; + int ran_pending; + void (*poll)(uv_loop_t* loop, DWORD timeout); + + if (pGetQueuedCompletionStatusEx) + poll = &uv_poll_ex; + else + poll = &uv_poll; + + r = uv__loop_alive(loop); + if (!r) + uv_update_time(loop); + + while (r != 0 && loop->stop_flag == 0) { + uv_update_time(loop); + uv_process_timers(loop); + + ran_pending = uv_process_reqs(loop); + uv_idle_invoke(loop); + uv_prepare_invoke(loop); + + timeout = 0; + if ((mode == UV_RUN_ONCE && !ran_pending) || mode == UV_RUN_DEFAULT) + timeout = uv_backend_timeout(loop); + + (*poll)(loop, timeout); + + uv_check_invoke(loop); + uv_process_endgames(loop); + + if (mode == UV_RUN_ONCE) { + /* UV_RUN_ONCE implies forward progress: at least one callback must have + * been invoked when it returns. uv__io_poll() can return without doing + * I/O (meaning: no callbacks) when its timeout expires - which means we + * have pending timers that satisfy the forward progress constraint. + * + * UV_RUN_NOWAIT makes no guarantees about progress so it's omitted from + * the check. + */ + uv_process_timers(loop); + } + + r = uv__loop_alive(loop); + if (mode == UV_RUN_ONCE || mode == UV_RUN_NOWAIT) + break; + } + + /* The if statement lets the compiler compile it to a conditional store. + * Avoids dirtying a cache line. + */ + if (loop->stop_flag != 0) + loop->stop_flag = 0; + + return r; +} + + +int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd) { + uv_os_fd_t fd_out; + + switch (handle->type) { + case UV_TCP: + fd_out = (uv_os_fd_t)((uv_tcp_t*) handle)->socket; + break; + + case UV_NAMED_PIPE: + fd_out = ((uv_pipe_t*) handle)->handle; + break; + + case UV_TTY: + fd_out = ((uv_tty_t*) handle)->handle; + break; + + case UV_UDP: + fd_out = (uv_os_fd_t)((uv_udp_t*) handle)->socket; + break; + + case UV_POLL: + fd_out = (uv_os_fd_t)((uv_poll_t*) handle)->socket; + break; + + default: + return UV_EINVAL; + } + + if (uv_is_closing(handle) || fd_out == INVALID_HANDLE_VALUE) + return UV_EBADF; + + *fd = fd_out; + return 0; +} + + +int uv__socket_sockopt(uv_handle_t* handle, int optname, int* value) { + int r; + int len; + SOCKET socket; + + if (handle == NULL || value == NULL) + return UV_EINVAL; + + if (handle->type == UV_TCP) + socket = ((uv_tcp_t*) handle)->socket; + else if (handle->type == UV_UDP) + socket = ((uv_udp_t*) handle)->socket; + else + return UV_ENOTSUP; + + len = sizeof(*value); + + if (*value == 0) + r = getsockopt(socket, SOL_SOCKET, optname, (char*) value, &len); + else + r = setsockopt(socket, SOL_SOCKET, optname, (const char*) value, len); + + if (r == SOCKET_ERROR) + return uv_translate_sys_error(WSAGetLastError()); + + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/detect-wakeup.c b/lib/ESPiLight/pilight/libs/libuv/win/detect-wakeup.c new file mode 100644 index 0000000..72dfb7a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/detect-wakeup.c @@ -0,0 +1,35 @@ +#include "uv.h" +#include "internal.h" +#include "winapi.h" + +static void uv__register_system_resume_callback(void); + +void uv__init_detect_system_wakeup(void) { + /* Try registering system power event callback. This is the cleanest + * method, but it will only work on Win8 and above. + */ + uv__register_system_resume_callback(); +} + +static ULONG CALLBACK uv__system_resume_callback(PVOID Context, + ULONG Type, + PVOID Setting) { + if (Type == PBT_APMRESUMESUSPEND || Type == PBT_APMRESUMEAUTOMATIC) + uv__wake_all_loops(); + + return 0; +} + +static void uv__register_system_resume_callback(void) { + _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS recipient; + _HPOWERNOTIFY registration_handle; + + if (pPowerRegisterSuspendResumeNotification == NULL) + return; + + recipient.Callback = uv__system_resume_callback; + recipient.Context = NULL; + (*pPowerRegisterSuspendResumeNotification)(DEVICE_NOTIFY_CALLBACK, + &recipient, + ®istration_handle); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/dl.c b/lib/ESPiLight/pilight/libs/libuv/win/dl.c new file mode 100644 index 0000000..39e400a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/dl.c @@ -0,0 +1,118 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "uv.h" +#include "internal.h" + +static int uv__dlerror(uv_lib_t* lib, int errorno); + + +int uv_dlopen(const char* filename, uv_lib_t* lib) { + WCHAR filename_w[32768]; + + lib->handle = NULL; + lib->errmsg = NULL; + + if (!MultiByteToWideChar(CP_UTF8, + 0, + filename, + -1, + filename_w, + ARRAY_SIZE(filename_w))) { + return uv__dlerror(lib, GetLastError()); + } + + lib->handle = LoadLibraryExW(filename_w, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + if (lib->handle == NULL) { + return uv__dlerror(lib, GetLastError()); + } + + return 0; +} + + +void uv_dlclose(uv_lib_t* lib) { + if (lib->errmsg) { + LocalFree((void*)lib->errmsg); + lib->errmsg = NULL; + } + + if (lib->handle) { + /* Ignore errors. No good way to signal them without leaking memory. */ + FreeLibrary(lib->handle); + lib->handle = NULL; + } +} + + +int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr) { + *ptr = (void*) GetProcAddress(lib->handle, name); + return uv__dlerror(lib, *ptr ? 0 : GetLastError()); +} + + +const char* uv_dlerror(const uv_lib_t* lib) { + return lib->errmsg ? lib->errmsg : "no error"; +} + + +static void uv__format_fallback_error(uv_lib_t* lib, int errorno){ + DWORD_PTR args[1] = { (DWORD_PTR) errorno }; + LPSTR fallback_error = "error: %1!d!"; + + FormatMessageA(FORMAT_MESSAGE_FROM_STRING | + FORMAT_MESSAGE_ARGUMENT_ARRAY | + FORMAT_MESSAGE_ALLOCATE_BUFFER, + fallback_error, 0, 0, + (LPSTR) &lib->errmsg, + 0, (va_list*) args); +} + + + +static int uv__dlerror(uv_lib_t* lib, int errorno) { + DWORD res; + + if (lib->errmsg) { + LocalFree((void*)lib->errmsg); + lib->errmsg = NULL; + } + + if (errorno) { + res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, + MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), + (LPSTR) &lib->errmsg, 0, NULL); + if (!res && GetLastError() == ERROR_MUI_FILE_NOT_FOUND) { + res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, + 0, (LPSTR) &lib->errmsg, 0, NULL); + } + + if (!res) { + uv__format_fallback_error(lib, errorno); + } + } + + return errorno ? -1 : 0; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/error.c b/lib/ESPiLight/pilight/libs/libuv/win/error.c new file mode 100644 index 0000000..642d111 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/error.c @@ -0,0 +1,171 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include + +#include "uv.h" +#include "internal.h" + + +/* + * Display an error message and abort the event loop. + */ +void uv_fatal_error(const int errorno, const char* syscall) { + char* buf = NULL; + const char* errmsg; + + FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&buf, 0, NULL); + + if (buf) { + errmsg = buf; + } else { + errmsg = "Unknown error"; + } + + /* FormatMessage messages include a newline character already, */ + /* so don't add another. */ + if (syscall) { + fprintf(stderr, "%s: (%d) %s", syscall, errorno, errmsg); + } else { + fprintf(stderr, "(%d) %s", errorno, errmsg); + } + + if (buf) { + LocalFree(buf); + } + + *((char*)NULL) = 0xff; /* Force debug break */ + abort(); +} + + +int uv_translate_sys_error(int sys_errno) { + if (sys_errno <= 0) { + return sys_errno; /* If < 0 then it's already a libuv error. */ + } + + switch (sys_errno) { + case ERROR_NOACCESS: return UV_EACCES; + case WSAEACCES: return UV_EACCES; + case ERROR_ELEVATION_REQUIRED: return UV_EACCES; + case ERROR_ADDRESS_ALREADY_ASSOCIATED: return UV_EADDRINUSE; + case WSAEADDRINUSE: return UV_EADDRINUSE; + case WSAEADDRNOTAVAIL: return UV_EADDRNOTAVAIL; + case WSAEAFNOSUPPORT: return UV_EAFNOSUPPORT; + case WSAEWOULDBLOCK: return UV_EAGAIN; + case WSAEALREADY: return UV_EALREADY; + case ERROR_INVALID_FLAGS: return UV_EBADF; + case ERROR_INVALID_HANDLE: return UV_EBADF; + case ERROR_LOCK_VIOLATION: return UV_EBUSY; + case ERROR_PIPE_BUSY: return UV_EBUSY; + case ERROR_SHARING_VIOLATION: return UV_EBUSY; + case ERROR_OPERATION_ABORTED: return UV_ECANCELED; + case WSAEINTR: return UV_ECANCELED; + case ERROR_NO_UNICODE_TRANSLATION: return UV_ECHARSET; + case ERROR_CONNECTION_ABORTED: return UV_ECONNABORTED; + case WSAECONNABORTED: return UV_ECONNABORTED; + case ERROR_CONNECTION_REFUSED: return UV_ECONNREFUSED; + case WSAECONNREFUSED: return UV_ECONNREFUSED; + case ERROR_NETNAME_DELETED: return UV_ECONNRESET; + case WSAECONNRESET: return UV_ECONNRESET; + case ERROR_ALREADY_EXISTS: return UV_EEXIST; + case ERROR_FILE_EXISTS: return UV_EEXIST; + case ERROR_BUFFER_OVERFLOW: return UV_EFAULT; + case WSAEFAULT: return UV_EFAULT; + case ERROR_HOST_UNREACHABLE: return UV_EHOSTUNREACH; + case WSAEHOSTUNREACH: return UV_EHOSTUNREACH; + case ERROR_INSUFFICIENT_BUFFER: return UV_EINVAL; + case ERROR_INVALID_DATA: return UV_EINVAL; + case ERROR_INVALID_PARAMETER: return UV_EINVAL; + case ERROR_SYMLINK_NOT_SUPPORTED: return UV_EINVAL; + case WSAEINVAL: return UV_EINVAL; + case WSAEPFNOSUPPORT: return UV_EINVAL; + case WSAESOCKTNOSUPPORT: return UV_EINVAL; + case ERROR_BEGINNING_OF_MEDIA: return UV_EIO; + case ERROR_BUS_RESET: return UV_EIO; + case ERROR_CRC: return UV_EIO; + case ERROR_DEVICE_DOOR_OPEN: return UV_EIO; + case ERROR_DEVICE_REQUIRES_CLEANING: return UV_EIO; + case ERROR_DISK_CORRUPT: return UV_EIO; + case ERROR_EOM_OVERFLOW: return UV_EIO; + case ERROR_FILEMARK_DETECTED: return UV_EIO; + case ERROR_GEN_FAILURE: return UV_EIO; + case ERROR_INVALID_BLOCK_LENGTH: return UV_EIO; + case ERROR_IO_DEVICE: return UV_EIO; + case ERROR_NO_DATA_DETECTED: return UV_EIO; + case ERROR_NO_SIGNAL_SENT: return UV_EIO; + case ERROR_OPEN_FAILED: return UV_EIO; + case ERROR_SETMARK_DETECTED: return UV_EIO; + case ERROR_SIGNAL_REFUSED: return UV_EIO; + case WSAEISCONN: return UV_EISCONN; + case ERROR_CANT_RESOLVE_FILENAME: return UV_ELOOP; + case ERROR_TOO_MANY_OPEN_FILES: return UV_EMFILE; + case WSAEMFILE: return UV_EMFILE; + case WSAEMSGSIZE: return UV_EMSGSIZE; + case ERROR_FILENAME_EXCED_RANGE: return UV_ENAMETOOLONG; + case ERROR_NETWORK_UNREACHABLE: return UV_ENETUNREACH; + case WSAENETUNREACH: return UV_ENETUNREACH; + case WSAENOBUFS: return UV_ENOBUFS; + case ERROR_BAD_PATHNAME: return UV_ENOENT; + case ERROR_DIRECTORY: return UV_ENOENT; + case ERROR_FILE_NOT_FOUND: return UV_ENOENT; + case ERROR_INVALID_NAME: return UV_ENOENT; + case ERROR_INVALID_DRIVE: return UV_ENOENT; + case ERROR_INVALID_REPARSE_DATA: return UV_ENOENT; + case ERROR_MOD_NOT_FOUND: return UV_ENOENT; + case ERROR_PATH_NOT_FOUND: return UV_ENOENT; + case WSAHOST_NOT_FOUND: return UV_ENOENT; + case WSANO_DATA: return UV_ENOENT; + case ERROR_NOT_ENOUGH_MEMORY: return UV_ENOMEM; + case ERROR_OUTOFMEMORY: return UV_ENOMEM; + case ERROR_CANNOT_MAKE: return UV_ENOSPC; + case ERROR_DISK_FULL: return UV_ENOSPC; + case ERROR_EA_TABLE_FULL: return UV_ENOSPC; + case ERROR_END_OF_MEDIA: return UV_ENOSPC; + case ERROR_HANDLE_DISK_FULL: return UV_ENOSPC; + case ERROR_NOT_CONNECTED: return UV_ENOTCONN; + case WSAENOTCONN: return UV_ENOTCONN; + case ERROR_DIR_NOT_EMPTY: return UV_ENOTEMPTY; + case WSAENOTSOCK: return UV_ENOTSOCK; + case ERROR_NOT_SUPPORTED: return UV_ENOTSUP; + case ERROR_BROKEN_PIPE: return UV_EOF; + case ERROR_ACCESS_DENIED: return UV_EPERM; + case ERROR_PRIVILEGE_NOT_HELD: return UV_EPERM; + case ERROR_BAD_PIPE: return UV_EPIPE; + case ERROR_NO_DATA: return UV_EPIPE; + case ERROR_PIPE_NOT_CONNECTED: return UV_EPIPE; + case WSAESHUTDOWN: return UV_EPIPE; + case WSAEPROTONOSUPPORT: return UV_EPROTONOSUPPORT; + case ERROR_WRITE_PROTECT: return UV_EROFS; + case ERROR_SEM_TIMEOUT: return UV_ETIMEDOUT; + case WSAETIMEDOUT: return UV_ETIMEDOUT; + case ERROR_NOT_SAME_DEVICE: return UV_EXDEV; + case ERROR_INVALID_FUNCTION: return UV_EISDIR; + case ERROR_META_EXPANSION_TOO_LONG: return UV_E2BIG; + default: return UV_UNKNOWN; + } +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/fs-event.c b/lib/ESPiLight/pilight/libs/libuv/win/fs-event.c new file mode 100644 index 0000000..95f843a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/fs-event.c @@ -0,0 +1,561 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include + +#include "uv.h" +#include "internal.h" +#include "handle-inl.h" +#include "req-inl.h" + + +const unsigned int uv_directory_watcher_buffer_size = 4096; + + +static void uv_fs_event_queue_readdirchanges(uv_loop_t* loop, + uv_fs_event_t* handle) { + assert(handle->dir_handle != INVALID_HANDLE_VALUE); + assert(!handle->req_pending); + + memset(&(handle->req.u.io.overlapped), 0, + sizeof(handle->req.u.io.overlapped)); + if (!ReadDirectoryChangesW(handle->dir_handle, + handle->buffer, + uv_directory_watcher_buffer_size, + (handle->flags & UV_FS_EVENT_RECURSIVE) ? TRUE : FALSE, + FILE_NOTIFY_CHANGE_FILE_NAME | + FILE_NOTIFY_CHANGE_DIR_NAME | + FILE_NOTIFY_CHANGE_ATTRIBUTES | + FILE_NOTIFY_CHANGE_SIZE | + FILE_NOTIFY_CHANGE_LAST_WRITE | + FILE_NOTIFY_CHANGE_LAST_ACCESS | + FILE_NOTIFY_CHANGE_CREATION | + FILE_NOTIFY_CHANGE_SECURITY, + NULL, + &handle->req.u.io.overlapped, + NULL)) { + /* Make this req pending reporting an error. */ + SET_REQ_ERROR(&handle->req, GetLastError()); + uv_insert_pending_req(loop, (uv_req_t*)&handle->req); + } + + handle->req_pending = 1; +} + +static void uv_relative_path(const WCHAR* filename, + const WCHAR* dir, + WCHAR** relpath) { + size_t relpathlen; + size_t filenamelen = wcslen(filename); + size_t dirlen = wcslen(dir); + if (dirlen > 0 && dir[dirlen - 1] == '\\') + dirlen--; + relpathlen = filenamelen - dirlen - 1; + *relpath = uv__malloc((relpathlen + 1) * sizeof(WCHAR)); + if (!*relpath) + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + wcsncpy(*relpath, filename + dirlen + 1, relpathlen); + (*relpath)[relpathlen] = L'\0'; +} + +static int uv_split_path(const WCHAR* filename, WCHAR** dir, + WCHAR** file) { + size_t len, i; + + if (filename == NULL) { + if (dir != NULL) + *dir = NULL; + *file = NULL; + return 0; + } + + len = wcslen(filename); + i = len; + while (i > 0 && filename[--i] != '\\' && filename[i] != '/'); + + if (i == 0) { + if (dir) { + *dir = (WCHAR*)uv__malloc((MAX_PATH + 1) * sizeof(WCHAR)); + if (!*dir) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + + if (!GetCurrentDirectoryW(MAX_PATH, *dir)) { + uv__free(*dir); + *dir = NULL; + return -1; + } + } + + *file = wcsdup(filename); + } else { + if (dir) { + *dir = (WCHAR*)uv__malloc((i + 2) * sizeof(WCHAR)); + if (!*dir) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + wcsncpy(*dir, filename, i + 1); + (*dir)[i + 1] = L'\0'; + } + + *file = (WCHAR*)uv__malloc((len - i) * sizeof(WCHAR)); + if (!*file) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + wcsncpy(*file, filename + i + 1, len - i - 1); + (*file)[len - i - 1] = L'\0'; + } + + return 0; +} + + +int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle) { + uv__handle_init(loop, (uv_handle_t*) handle, UV_FS_EVENT); + handle->dir_handle = INVALID_HANDLE_VALUE; + handle->buffer = NULL; + handle->req_pending = 0; + handle->filew = NULL; + handle->short_filew = NULL; + handle->dirw = NULL; + + UV_REQ_INIT(&handle->req, UV_FS_EVENT_REQ); + handle->req.data = handle; + + return 0; +} + + +int uv_fs_event_start(uv_fs_event_t* handle, + uv_fs_event_cb cb, + const char* path, + unsigned int flags) { + int name_size, is_path_dir; + DWORD attr, last_error; + WCHAR* dir = NULL, *dir_to_watch, *pathw = NULL; + WCHAR short_path_buffer[MAX_PATH]; + WCHAR* short_path; + + if (uv__is_active(handle)) + return UV_EINVAL; + + handle->cb = cb; + handle->path = uv__strdup(path); + if (!handle->path) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + + uv__handle_start(handle); + + /* Convert name to UTF16. */ + + name_size = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0) * + sizeof(WCHAR); + pathw = (WCHAR*)uv__malloc(name_size); + if (!pathw) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + + if (!MultiByteToWideChar(CP_UTF8, + 0, + path, + -1, + pathw, + name_size / sizeof(WCHAR))) { + return uv_translate_sys_error(GetLastError()); + } + + /* Determine whether path is a file or a directory. */ + attr = GetFileAttributesW(pathw); + if (attr == INVALID_FILE_ATTRIBUTES) { + last_error = GetLastError(); + goto error; + } + + is_path_dir = (attr & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0; + + if (is_path_dir) { + /* path is a directory, so that's the directory that we will watch. */ + dir_to_watch = pathw; + } else { + /* + * path is a file. So we split path into dir & file parts, and + * watch the dir directory. + */ + + /* Convert to short path. */ + short_path = short_path_buffer; + if (!GetShortPathNameW(pathw, short_path, ARRAY_SIZE(short_path))) { + short_path = NULL; + } + + if (uv_split_path(pathw, &dir, &handle->filew) != 0) { + last_error = GetLastError(); + goto error; + } + + if (uv_split_path(short_path, NULL, &handle->short_filew) != 0) { + last_error = GetLastError(); + goto error; + } + + dir_to_watch = dir; + uv__free(pathw); + pathw = NULL; + } + + handle->dir_handle = CreateFileW(dir_to_watch, + FILE_LIST_DIRECTORY, + FILE_SHARE_READ | FILE_SHARE_DELETE | + FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | + FILE_FLAG_OVERLAPPED, + NULL); + + if (dir) { + uv__free(dir); + dir = NULL; + } + + if (handle->dir_handle == INVALID_HANDLE_VALUE) { + last_error = GetLastError(); + goto error; + } + + if (CreateIoCompletionPort(handle->dir_handle, + handle->loop->iocp, + (ULONG_PTR)handle, + 0) == NULL) { + last_error = GetLastError(); + goto error; + } + + if (!handle->buffer) { + handle->buffer = (char*)uv__malloc(uv_directory_watcher_buffer_size); + } + if (!handle->buffer) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + + memset(&(handle->req.u.io.overlapped), 0, + sizeof(handle->req.u.io.overlapped)); + + if (!ReadDirectoryChangesW(handle->dir_handle, + handle->buffer, + uv_directory_watcher_buffer_size, + (flags & UV_FS_EVENT_RECURSIVE) ? TRUE : FALSE, + FILE_NOTIFY_CHANGE_FILE_NAME | + FILE_NOTIFY_CHANGE_DIR_NAME | + FILE_NOTIFY_CHANGE_ATTRIBUTES | + FILE_NOTIFY_CHANGE_SIZE | + FILE_NOTIFY_CHANGE_LAST_WRITE | + FILE_NOTIFY_CHANGE_LAST_ACCESS | + FILE_NOTIFY_CHANGE_CREATION | + FILE_NOTIFY_CHANGE_SECURITY, + NULL, + &handle->req.u.io.overlapped, + NULL)) { + last_error = GetLastError(); + goto error; + } + + assert(is_path_dir ? pathw != NULL : pathw == NULL); + handle->dirw = pathw; + handle->req_pending = 1; + return 0; + +error: + if (handle->path) { + uv__free(handle->path); + handle->path = NULL; + } + + if (handle->filew) { + uv__free(handle->filew); + handle->filew = NULL; + } + + if (handle->short_filew) { + uv__free(handle->short_filew); + handle->short_filew = NULL; + } + + uv__free(pathw); + + if (handle->dir_handle != INVALID_HANDLE_VALUE) { + CloseHandle(handle->dir_handle); + handle->dir_handle = INVALID_HANDLE_VALUE; + } + + if (handle->buffer) { + uv__free(handle->buffer); + handle->buffer = NULL; + } + + if (uv__is_active(handle)) + uv__handle_stop(handle); + + return uv_translate_sys_error(last_error); +} + + +int uv_fs_event_stop(uv_fs_event_t* handle) { + if (!uv__is_active(handle)) + return 0; + + if (handle->dir_handle != INVALID_HANDLE_VALUE) { + CloseHandle(handle->dir_handle); + handle->dir_handle = INVALID_HANDLE_VALUE; + } + + uv__handle_stop(handle); + + if (handle->filew) { + uv__free(handle->filew); + handle->filew = NULL; + } + + if (handle->short_filew) { + uv__free(handle->short_filew); + handle->short_filew = NULL; + } + + if (handle->path) { + uv__free(handle->path); + handle->path = NULL; + } + + if (handle->dirw) { + uv__free(handle->dirw); + handle->dirw = NULL; + } + + return 0; +} + + +static int file_info_cmp(WCHAR* str, WCHAR* file_name, size_t file_name_len) { + size_t str_len; + + if (str == NULL) + return -1; + + str_len = wcslen(str); + + /* + Since we only care about equality, return early if the strings + aren't the same length + */ + if (str_len != (file_name_len / sizeof(WCHAR))) + return -1; + + return _wcsnicmp(str, file_name, str_len); +} + + +void uv_process_fs_event_req(uv_loop_t* loop, uv_req_t* req, + uv_fs_event_t* handle) { + FILE_NOTIFY_INFORMATION* file_info; + int err, sizew, size; + char* filename = NULL; + WCHAR* filenamew = NULL; + WCHAR* long_filenamew = NULL; + DWORD offset = 0; + + assert(req->type == UV_FS_EVENT_REQ); + assert(handle->req_pending); + handle->req_pending = 0; + + /* Don't report any callbacks if: + * - We're closing, just push the handle onto the endgame queue + * - We are not active, just ignore the callback + */ + if (!uv__is_active(handle)) { + if (handle->flags & UV__HANDLE_CLOSING) { + uv_want_endgame(loop, (uv_handle_t*) handle); + } + return; + } + + file_info = (FILE_NOTIFY_INFORMATION*)(handle->buffer + offset); + + if (REQ_SUCCESS(req)) { + if (req->u.io.overlapped.InternalHigh > 0) { + do { + file_info = (FILE_NOTIFY_INFORMATION*)((char*)file_info + offset); + assert(!filename); + assert(!filenamew); + assert(!long_filenamew); + + /* + * Fire the event only if we were asked to watch a directory, + * or if the filename filter matches. + */ + if (handle->dirw || + file_info_cmp(handle->filew, + file_info->FileName, + file_info->FileNameLength) == 0 || + file_info_cmp(handle->short_filew, + file_info->FileName, + file_info->FileNameLength) == 0) { + + if (handle->dirw) { + /* + * We attempt to resolve the long form of the file name explicitly. + * We only do this for file names that might still exist on disk. + * If this fails, we use the name given by ReadDirectoryChangesW. + * This may be the long form or the 8.3 short name in some cases. + */ + if (file_info->Action != FILE_ACTION_REMOVED && + file_info->Action != FILE_ACTION_RENAMED_OLD_NAME) { + /* Construct a full path to the file. */ + size = wcslen(handle->dirw) + + file_info->FileNameLength / sizeof(WCHAR) + 2; + + filenamew = (WCHAR*)uv__malloc(size * sizeof(WCHAR)); + if (!filenamew) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + + _snwprintf(filenamew, size, L"%s\\%.*s", handle->dirw, + file_info->FileNameLength / (DWORD)sizeof(WCHAR), + file_info->FileName); + + filenamew[size - 1] = L'\0'; + + /* Convert to long name. */ + size = GetLongPathNameW(filenamew, NULL, 0); + + if (size) { + long_filenamew = (WCHAR*)uv__malloc(size * sizeof(WCHAR)); + if (!long_filenamew) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + + size = GetLongPathNameW(filenamew, long_filenamew, size); + if (size) { + long_filenamew[size] = '\0'; + } else { + uv__free(long_filenamew); + long_filenamew = NULL; + } + } + + uv__free(filenamew); + + if (long_filenamew) { + /* Get the file name out of the long path. */ + uv_relative_path(long_filenamew, + handle->dirw, + &filenamew); + uv__free(long_filenamew); + long_filenamew = filenamew; + sizew = -1; + } else { + /* We couldn't get the long filename, use the one reported. */ + filenamew = file_info->FileName; + sizew = file_info->FileNameLength / sizeof(WCHAR); + } + } else { + /* + * Removed or renamed events cannot be resolved to the long form. + * We therefore use the name given by ReadDirectoryChangesW. + * This may be the long form or the 8.3 short name in some cases. + */ + filenamew = file_info->FileName; + sizew = file_info->FileNameLength / sizeof(WCHAR); + } + } else { + /* We already have the long name of the file, so just use it. */ + filenamew = handle->filew; + sizew = -1; + } + + /* Convert the filename to utf8. */ + uv__convert_utf16_to_utf8(filenamew, sizew, &filename); + + switch (file_info->Action) { + case FILE_ACTION_ADDED: + case FILE_ACTION_REMOVED: + case FILE_ACTION_RENAMED_OLD_NAME: + case FILE_ACTION_RENAMED_NEW_NAME: + handle->cb(handle, filename, UV_RENAME, 0); + break; + + case FILE_ACTION_MODIFIED: + handle->cb(handle, filename, UV_CHANGE, 0); + break; + } + + uv__free(filename); + filename = NULL; + uv__free(long_filenamew); + long_filenamew = NULL; + filenamew = NULL; + } + + offset = file_info->NextEntryOffset; + } while (offset && !(handle->flags & UV__HANDLE_CLOSING)); + } else { + handle->cb(handle, NULL, UV_CHANGE, 0); + } + } else { + err = GET_REQ_ERROR(req); + handle->cb(handle, NULL, 0, uv_translate_sys_error(err)); + } + + if (!(handle->flags & UV__HANDLE_CLOSING)) { + uv_fs_event_queue_readdirchanges(loop, handle); + } else { + uv_want_endgame(loop, (uv_handle_t*)handle); + } +} + + +void uv_fs_event_close(uv_loop_t* loop, uv_fs_event_t* handle) { + uv_fs_event_stop(handle); + + uv__handle_closing(handle); + + if (!handle->req_pending) { + uv_want_endgame(loop, (uv_handle_t*)handle); + } + +} + + +void uv_fs_event_endgame(uv_loop_t* loop, uv_fs_event_t* handle) { + if ((handle->flags & UV__HANDLE_CLOSING) && !handle->req_pending) { + assert(!(handle->flags & UV_HANDLE_CLOSED)); + + if (handle->buffer) { + uv__free(handle->buffer); + handle->buffer = NULL; + } + + uv__handle_close(handle); + } +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/fs.c b/lib/ESPiLight/pilight/libs/libuv/win/fs.c new file mode 100644 index 0000000..8223d6f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/fs.c @@ -0,0 +1,2516 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "uv.h" +#include "internal.h" +#include "req-inl.h" +#include "handle-inl.h" + +#include + + +#define UV_FS_FREE_PATHS 0x0002 +#define UV_FS_FREE_PTR 0x0008 +#define UV_FS_CLEANEDUP 0x0010 + + +#define QUEUE_FS_TP_JOB(loop, req) \ + do { \ + uv__req_register(loop, req); \ + uv__work_submit((loop), &(req)->work_req, uv__fs_work, uv__fs_done); \ + } while (0) + +#define SET_REQ_RESULT(req, result_value) \ + do { \ + req->result = (result_value); \ + if (req->result == -1) { \ + req->sys_errno_ = _doserrno; \ + req->result = uv_translate_sys_error(req->sys_errno_); \ + } \ + } while (0) + +#define SET_REQ_WIN32_ERROR(req, sys_errno) \ + do { \ + req->sys_errno_ = (sys_errno); \ + req->result = uv_translate_sys_error(req->sys_errno_); \ + } while (0) + +#define SET_REQ_UV_ERROR(req, uv_errno, sys_errno) \ + do { \ + req->result = (uv_errno); \ + req->sys_errno_ = (sys_errno); \ + } while (0) + +#define VERIFY_FD(fd, req) \ + if (fd == -1) { \ + req->result = UV_EBADF; \ + req->sys_errno_ = ERROR_INVALID_HANDLE; \ + return; \ + } + +#define FILETIME_TO_UINT(filetime) \ + (*((uint64_t*) &(filetime)) - 116444736000000000ULL) + +#define FILETIME_TO_TIME_T(filetime) \ + (FILETIME_TO_UINT(filetime) / 10000000ULL) + +#define FILETIME_TO_TIME_NS(filetime, secs) \ + ((FILETIME_TO_UINT(filetime) - (secs * 10000000ULL)) * 100) + +#define FILETIME_TO_TIMESPEC(ts, filetime) \ + do { \ + (ts).tv_sec = (long) FILETIME_TO_TIME_T(filetime); \ + (ts).tv_nsec = (long) FILETIME_TO_TIME_NS(filetime, (ts).tv_sec); \ + } while(0) + +#define TIME_T_TO_FILETIME(time, filetime_ptr) \ + do { \ + uint64_t bigtime = ((uint64_t) ((time) * 10000000ULL)) + \ + 116444736000000000ULL; \ + (filetime_ptr)->dwLowDateTime = bigtime & 0xFFFFFFFF; \ + (filetime_ptr)->dwHighDateTime = bigtime >> 32; \ + } while(0) + +#define IS_SLASH(c) ((c) == L'\\' || (c) == L'/') +#define IS_LETTER(c) (((c) >= L'a' && (c) <= L'z') || \ + ((c) >= L'A' && (c) <= L'Z')) + +const WCHAR JUNCTION_PREFIX[] = L"\\??\\"; +const WCHAR JUNCTION_PREFIX_LEN = 4; + +const WCHAR LONG_PATH_PREFIX[] = L"\\\\?\\"; +const WCHAR LONG_PATH_PREFIX_LEN = 4; + +const WCHAR UNC_PATH_PREFIX[] = L"\\\\?\\UNC\\"; +const WCHAR UNC_PATH_PREFIX_LEN = 8; + + +void uv_fs_init(void) { + _fmode = _O_BINARY; +} + + +INLINE static int fs__capture_path(uv_fs_t* req, const char* path, + const char* new_path, const int copy_path) { + char* buf; + char* pos; + ssize_t buf_sz = 0, path_len = 0, pathw_len = 0, new_pathw_len = 0; + + /* new_path can only be set if path is also set. */ + assert(new_path == NULL || path != NULL); + + if (path != NULL) { + pathw_len = MultiByteToWideChar(CP_UTF8, + 0, + path, + -1, + NULL, + 0); + if (pathw_len == 0) { + return GetLastError(); + } + + buf_sz += pathw_len * sizeof(WCHAR); + } + + if (path != NULL && copy_path) { + path_len = 1 + strlen(path); + buf_sz += path_len; + } + + if (new_path != NULL) { + new_pathw_len = MultiByteToWideChar(CP_UTF8, + 0, + new_path, + -1, + NULL, + 0); + if (new_pathw_len == 0) { + return GetLastError(); + } + + buf_sz += new_pathw_len * sizeof(WCHAR); + } + + + if (buf_sz == 0) { + req->file.pathw = NULL; + req->fs.info.new_pathw = NULL; + req->path = NULL; + return 0; + } + + buf = (char*) uv__malloc(buf_sz); + if (buf == NULL) { + return ERROR_OUTOFMEMORY; + } + + pos = buf; + + if (path != NULL) { + DWORD r = MultiByteToWideChar(CP_UTF8, + 0, + path, + -1, + (WCHAR*) pos, + pathw_len); + assert(r == (DWORD) pathw_len); + req->file.pathw = (WCHAR*) pos; + pos += r * sizeof(WCHAR); + } else { + req->file.pathw = NULL; + } + + if (new_path != NULL) { + DWORD r = MultiByteToWideChar(CP_UTF8, + 0, + new_path, + -1, + (WCHAR*) pos, + new_pathw_len); + assert(r == (DWORD) new_pathw_len); + req->fs.info.new_pathw = (WCHAR*) pos; + pos += r * sizeof(WCHAR); + } else { + req->fs.info.new_pathw = NULL; + } + + req->path = path; + if (path != NULL && copy_path) { + memcpy(pos, path, path_len); + assert(path_len == buf_sz - (pos - buf)); + req->path = pos; + } + + req->flags |= UV_FS_FREE_PATHS; + + return 0; +} + + + +INLINE static void uv_fs_req_init(uv_loop_t* loop, uv_fs_t* req, + uv_fs_type fs_type, const uv_fs_cb cb) { + UV_REQ_INIT(req, UV_FS); + req->loop = loop; + req->flags = 0; + req->fs_type = fs_type; + req->result = 0; + req->ptr = NULL; + req->path = NULL; + req->cb = cb; + memset(&req->fs, 0, sizeof(req->fs)); +} + + +static int fs__wide_to_utf8(WCHAR* w_source_ptr, + DWORD w_source_len, + char** target_ptr, + uint64_t* target_len_ptr) { + int r; + int target_len; + char* target; + target_len = WideCharToMultiByte(CP_UTF8, + 0, + w_source_ptr, + w_source_len, + NULL, + 0, + NULL, + NULL); + + if (target_len == 0) { + return -1; + } + + if (target_len_ptr != NULL) { + *target_len_ptr = target_len; + } + + if (target_ptr == NULL) { + return 0; + } + + target = uv__malloc(target_len + 1); + if (target == NULL) { + SetLastError(ERROR_OUTOFMEMORY); + return -1; + } + + r = WideCharToMultiByte(CP_UTF8, + 0, + w_source_ptr, + w_source_len, + target, + target_len, + NULL, + NULL); + assert(r == target_len); + target[target_len] = '\0'; + *target_ptr = target; + return 0; +} + + +INLINE static int fs__readlink_handle(HANDLE handle, char** target_ptr, + uint64_t* target_len_ptr) { + char buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE]; + REPARSE_DATA_BUFFER* reparse_data = (REPARSE_DATA_BUFFER*) buffer; + WCHAR* w_target; + DWORD w_target_len; + DWORD bytes; + + if (!DeviceIoControl(handle, + FSCTL_GET_REPARSE_POINT, + NULL, + 0, + buffer, + sizeof buffer, + &bytes, + NULL)) { + return -1; + } + + if (reparse_data->ReparseTag == IO_REPARSE_TAG_SYMLINK) { + /* Real symlink */ + w_target = reparse_data->SymbolicLinkReparseBuffer.PathBuffer + + (reparse_data->SymbolicLinkReparseBuffer.SubstituteNameOffset / + sizeof(WCHAR)); + w_target_len = + reparse_data->SymbolicLinkReparseBuffer.SubstituteNameLength / + sizeof(WCHAR); + + /* Real symlinks can contain pretty much everything, but the only thing */ + /* we really care about is undoing the implicit conversion to an NT */ + /* namespaced path that CreateSymbolicLink will perform on absolute */ + /* paths. If the path is win32-namespaced then the user must have */ + /* explicitly made it so, and we better just return the unmodified */ + /* reparse data. */ + if (w_target_len >= 4 && + w_target[0] == L'\\' && + w_target[1] == L'?' && + w_target[2] == L'?' && + w_target[3] == L'\\') { + /* Starts with \??\ */ + if (w_target_len >= 6 && + ((w_target[4] >= L'A' && w_target[4] <= L'Z') || + (w_target[4] >= L'a' && w_target[4] <= L'z')) && + w_target[5] == L':' && + (w_target_len == 6 || w_target[6] == L'\\')) { + /* \??\:\ */ + w_target += 4; + w_target_len -= 4; + + } else if (w_target_len >= 8 && + (w_target[4] == L'U' || w_target[4] == L'u') && + (w_target[5] == L'N' || w_target[5] == L'n') && + (w_target[6] == L'C' || w_target[6] == L'c') && + w_target[7] == L'\\') { + /* \??\UNC\\\ - make sure the final path looks like */ + /* \\\\ */ + w_target += 6; + w_target[0] = L'\\'; + w_target_len -= 6; + } + } + + } else if (reparse_data->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) { + /* Junction. */ + w_target = reparse_data->MountPointReparseBuffer.PathBuffer + + (reparse_data->MountPointReparseBuffer.SubstituteNameOffset / + sizeof(WCHAR)); + w_target_len = reparse_data->MountPointReparseBuffer.SubstituteNameLength / + sizeof(WCHAR); + + /* Only treat junctions that look like \??\:\ as symlink. */ + /* Junctions can also be used as mount points, like \??\Volume{}, */ + /* but that's confusing for programs since they wouldn't be able to */ + /* actually understand such a path when returned by uv_readlink(). */ + /* UNC paths are never valid for junctions so we don't care about them. */ + if (!(w_target_len >= 6 && + w_target[0] == L'\\' && + w_target[1] == L'?' && + w_target[2] == L'?' && + w_target[3] == L'\\' && + ((w_target[4] >= L'A' && w_target[4] <= L'Z') || + (w_target[4] >= L'a' && w_target[4] <= L'z')) && + w_target[5] == L':' && + (w_target_len == 6 || w_target[6] == L'\\'))) { + SetLastError(ERROR_SYMLINK_NOT_SUPPORTED); + return -1; + } + + /* Remove leading \??\ */ + w_target += 4; + w_target_len -= 4; + + } else { + /* Reparse tag does not indicate a symlink. */ + SetLastError(ERROR_SYMLINK_NOT_SUPPORTED); + return -1; + } + + return fs__wide_to_utf8(w_target, w_target_len, target_ptr, target_len_ptr); +} + + +void fs__open(uv_fs_t* req) { + DWORD access; + DWORD share; + DWORD disposition; + DWORD attributes = 0; + HANDLE file; + int fd, current_umask; + int flags = req->fs.info.file_flags; + + /* Obtain the active umask. umask() never fails and returns the previous */ + /* umask. */ + current_umask = umask(0); + umask(current_umask); + + /* convert flags and mode to CreateFile parameters */ + switch (flags & (_O_RDONLY | _O_WRONLY | _O_RDWR)) { + case _O_RDONLY: + access = FILE_GENERIC_READ; + break; + case _O_WRONLY: + access = FILE_GENERIC_WRITE; + break; + case _O_RDWR: + access = FILE_GENERIC_READ | FILE_GENERIC_WRITE; + break; + default: + goto einval; + } + + if (flags & _O_APPEND) { + access &= ~FILE_WRITE_DATA; + access |= FILE_APPEND_DATA; + } + + /* + * Here is where we deviate significantly from what CRT's _open() + * does. We indiscriminately use all the sharing modes, to match + * UNIX semantics. In particular, this ensures that the file can + * be deleted even whilst it's open, fixing issue #1449. + */ + share = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; + + switch (flags & (_O_CREAT | _O_EXCL | _O_TRUNC)) { + case 0: + case _O_EXCL: + disposition = OPEN_EXISTING; + break; + case _O_CREAT: + disposition = OPEN_ALWAYS; + break; + case _O_CREAT | _O_EXCL: + case _O_CREAT | _O_TRUNC | _O_EXCL: + disposition = CREATE_NEW; + break; + case _O_TRUNC: + case _O_TRUNC | _O_EXCL: + disposition = TRUNCATE_EXISTING; + break; + case _O_CREAT | _O_TRUNC: + disposition = CREATE_ALWAYS; + break; + default: + goto einval; + } + + attributes |= FILE_ATTRIBUTE_NORMAL; + if (flags & _O_CREAT) { + if (!((req->fs.info.mode & ~current_umask) & _S_IWRITE)) { + attributes |= FILE_ATTRIBUTE_READONLY; + } + } + + if (flags & _O_TEMPORARY ) { + attributes |= FILE_FLAG_DELETE_ON_CLOSE | FILE_ATTRIBUTE_TEMPORARY; + access |= DELETE; + } + + if (flags & _O_SHORT_LIVED) { + attributes |= FILE_ATTRIBUTE_TEMPORARY; + } + + switch (flags & (_O_SEQUENTIAL | _O_RANDOM)) { + case 0: + break; + case _O_SEQUENTIAL: + attributes |= FILE_FLAG_SEQUENTIAL_SCAN; + break; + case _O_RANDOM: + attributes |= FILE_FLAG_RANDOM_ACCESS; + break; + default: + goto einval; + } + + /* Setting this flag makes it possible to open a directory. */ + attributes |= FILE_FLAG_BACKUP_SEMANTICS; + + file = CreateFileW(req->file.pathw, + access, + share, + NULL, + disposition, + attributes, + NULL); + if (file == INVALID_HANDLE_VALUE) { + DWORD error = GetLastError(); + if (error == ERROR_FILE_EXISTS && (flags & _O_CREAT) && + !(flags & _O_EXCL)) { + /* Special case: when ERROR_FILE_EXISTS happens and O_CREAT was */ + /* specified, it means the path referred to a directory. */ + SET_REQ_UV_ERROR(req, UV_EISDIR, error); + } else { + SET_REQ_WIN32_ERROR(req, GetLastError()); + } + return; + } + + fd = _open_osfhandle((intptr_t) file, flags); + if (fd < 0) { + /* The only known failure mode for _open_osfhandle() is EMFILE, in which + * case GetLastError() will return zero. However we'll try to handle other + * errors as well, should they ever occur. + */ + if (errno == EMFILE) + SET_REQ_UV_ERROR(req, UV_EMFILE, ERROR_TOO_MANY_OPEN_FILES); + else if (GetLastError() != ERROR_SUCCESS) + SET_REQ_WIN32_ERROR(req, GetLastError()); + else + SET_REQ_WIN32_ERROR(req, UV_UNKNOWN); + CloseHandle(file); + return; + } + + SET_REQ_RESULT(req, fd); + return; + + einval: + SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_INVALID_PARAMETER); +} + +void fs__close(uv_fs_t* req) { + int fd = req->file.fd; + int result; + + VERIFY_FD(fd, req); + + if (fd > 2) + result = _close(fd); + else + result = 0; + + /* _close doesn't set _doserrno on failure, but it does always set errno + * to EBADF on failure. + */ + if (result == -1) { + assert(errno == EBADF); + SET_REQ_UV_ERROR(req, UV_EBADF, ERROR_INVALID_HANDLE); + } else { + req->result = 0; + } +} + + +void fs__read(uv_fs_t* req) { + int fd = req->file.fd; + int64_t offset = req->fs.info.offset; + HANDLE handle; + OVERLAPPED overlapped, *overlapped_ptr; + LARGE_INTEGER offset_; + DWORD bytes; + DWORD error; + int result; + unsigned int index; + LARGE_INTEGER original_position; + LARGE_INTEGER zero_offset; + int restore_position; + + VERIFY_FD(fd, req); + + zero_offset.QuadPart = 0; + restore_position = 0; + handle = uv__get_osfhandle(fd); + + if (handle == INVALID_HANDLE_VALUE) { + SET_REQ_WIN32_ERROR(req, ERROR_INVALID_HANDLE); + return; + } + + if (offset != -1) { + memset(&overlapped, 0, sizeof overlapped); + overlapped_ptr = &overlapped; + if (SetFilePointerEx(handle, zero_offset, &original_position, + FILE_CURRENT)) { + restore_position = 1; + } + } else { + overlapped_ptr = NULL; + } + + index = 0; + bytes = 0; + do { + DWORD incremental_bytes; + + if (offset != -1) { + offset_.QuadPart = offset + bytes; + overlapped.Offset = offset_.LowPart; + overlapped.OffsetHigh = offset_.HighPart; + } + + result = ReadFile(handle, + req->fs.info.bufs[index].base, + req->fs.info.bufs[index].len, + &incremental_bytes, + overlapped_ptr); + bytes += incremental_bytes; + ++index; + } while (result && index < req->fs.info.nbufs); + + if (restore_position) + SetFilePointerEx(handle, original_position, NULL, FILE_BEGIN); + + if (result || bytes > 0) { + SET_REQ_RESULT(req, bytes); + } else { + error = GetLastError(); + if (error == ERROR_HANDLE_EOF) { + SET_REQ_RESULT(req, bytes); + } else { + SET_REQ_WIN32_ERROR(req, error); + } + } +} + + +void fs__write(uv_fs_t* req) { + int fd = req->file.fd; + int64_t offset = req->fs.info.offset; + HANDLE handle; + OVERLAPPED overlapped, *overlapped_ptr; + LARGE_INTEGER offset_; + DWORD bytes; + int result; + unsigned int index; + LARGE_INTEGER original_position; + LARGE_INTEGER zero_offset; + int restore_position; + + VERIFY_FD(fd, req); + + zero_offset.QuadPart = 0; + restore_position = 0; + handle = uv__get_osfhandle(fd); + if (handle == INVALID_HANDLE_VALUE) { + SET_REQ_WIN32_ERROR(req, ERROR_INVALID_HANDLE); + return; + } + + if (offset != -1) { + memset(&overlapped, 0, sizeof overlapped); + overlapped_ptr = &overlapped; + if (SetFilePointerEx(handle, zero_offset, &original_position, + FILE_CURRENT)) { + restore_position = 1; + } + } else { + overlapped_ptr = NULL; + } + + index = 0; + bytes = 0; + do { + DWORD incremental_bytes; + + if (offset != -1) { + offset_.QuadPart = offset + bytes; + overlapped.Offset = offset_.LowPart; + overlapped.OffsetHigh = offset_.HighPart; + } + + result = WriteFile(handle, + req->fs.info.bufs[index].base, + req->fs.info.bufs[index].len, + &incremental_bytes, + overlapped_ptr); + bytes += incremental_bytes; + ++index; + } while (result && index < req->fs.info.nbufs); + + if (restore_position) + SetFilePointerEx(handle, original_position, NULL, FILE_BEGIN); + + if (result || bytes > 0) { + SET_REQ_RESULT(req, bytes); + } else { + SET_REQ_WIN32_ERROR(req, GetLastError()); + } +} + + +void fs__rmdir(uv_fs_t* req) { + int result = _wrmdir(req->file.pathw); + SET_REQ_RESULT(req, result); +} + + +void fs__unlink(uv_fs_t* req) { + const WCHAR* pathw = req->file.pathw; + HANDLE handle; + BY_HANDLE_FILE_INFORMATION info; + FILE_DISPOSITION_INFORMATION disposition; + IO_STATUS_BLOCK iosb; + NTSTATUS status; + + handle = CreateFileW(pathw, + FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | DELETE, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, + NULL); + + if (handle == INVALID_HANDLE_VALUE) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + return; + } + + if (!GetFileInformationByHandle(handle, &info)) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + CloseHandle(handle); + return; + } + + if (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + /* Do not allow deletion of directories, unless it is a symlink. When */ + /* the path refers to a non-symlink directory, report EPERM as mandated */ + /* by POSIX.1. */ + + /* Check if it is a reparse point. If it's not, it's a normal directory. */ + if (!(info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) { + SET_REQ_WIN32_ERROR(req, ERROR_ACCESS_DENIED); + CloseHandle(handle); + return; + } + + /* Read the reparse point and check if it is a valid symlink. */ + /* If not, don't unlink. */ + if (fs__readlink_handle(handle, NULL, NULL) < 0) { + DWORD error = GetLastError(); + if (error == ERROR_SYMLINK_NOT_SUPPORTED) + error = ERROR_ACCESS_DENIED; + SET_REQ_WIN32_ERROR(req, error); + CloseHandle(handle); + return; + } + } + + if (info.dwFileAttributes & FILE_ATTRIBUTE_READONLY) { + /* Remove read-only attribute */ + FILE_BASIC_INFORMATION basic = { 0 }; + + basic.FileAttributes = info.dwFileAttributes & ~(FILE_ATTRIBUTE_READONLY); + + status = pNtSetInformationFile(handle, + &iosb, + &basic, + sizeof basic, + FileBasicInformation); + if (!NT_SUCCESS(status)) { + SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(status)); + CloseHandle(handle); + return; + } + } + + /* Try to set the delete flag. */ + disposition.DeleteFile = TRUE; + status = pNtSetInformationFile(handle, + &iosb, + &disposition, + sizeof disposition, + FileDispositionInformation); + if (NT_SUCCESS(status)) { + SET_REQ_SUCCESS(req); + } else { + SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(status)); + } + + CloseHandle(handle); +} + + +void fs__mkdir(uv_fs_t* req) { + /* TODO: use req->mode. */ + int result = _wmkdir(req->file.pathw); + SET_REQ_RESULT(req, result); +} + + +/* OpenBSD original: lib/libc/stdio/mktemp.c */ +void fs__mkdtemp(uv_fs_t* req) { + static const WCHAR *tempchars = + L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + static const size_t num_chars = 62; + static const size_t num_x = 6; + WCHAR *cp, *ep; + unsigned int tries, i; + size_t len; + HCRYPTPROV h_crypt_prov; + uint64_t v; + BOOL released; + + len = wcslen(req->file.pathw); + ep = req->file.pathw + len; + if (len < num_x || wcsncmp(ep - num_x, L"XXXXXX", num_x)) { + SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_INVALID_PARAMETER); + return; + } + + if (!CryptAcquireContext(&h_crypt_prov, NULL, NULL, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT)) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + return; + } + + tries = TMP_MAX; + do { + if (!CryptGenRandom(h_crypt_prov, sizeof(v), (BYTE*) &v)) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + break; + } + + cp = ep - num_x; + for (i = 0; i < num_x; i++) { + *cp++ = tempchars[v % num_chars]; + v /= num_chars; + } + + if (_wmkdir(req->file.pathw) == 0) { + len = strlen(req->path); + wcstombs((char*) req->path + len - num_x, ep - num_x, num_x); + SET_REQ_RESULT(req, 0); + break; + } else if (errno != EEXIST) { + SET_REQ_RESULT(req, -1); + break; + } + } while (--tries); + + released = CryptReleaseContext(h_crypt_prov, 0); + assert(released); + if (tries == 0) { + SET_REQ_RESULT(req, -1); + } +} + + +void fs__scandir(uv_fs_t* req) { + static const size_t dirents_initial_size = 32; + + HANDLE dir_handle = INVALID_HANDLE_VALUE; + + uv__dirent_t** dirents = NULL; + size_t dirents_size = 0; + size_t dirents_used = 0; + + IO_STATUS_BLOCK iosb; + NTSTATUS status; + + /* Buffer to hold directory entries returned by NtQueryDirectoryFile. + * It's important that this buffer can hold at least one entry, regardless + * of the length of the file names present in the enumerated directory. + * A file name is at most 256 WCHARs long. + * According to MSDN, the buffer must be aligned at an 8-byte boundary. + */ +#if _MSC_VER + __declspec(align(8)) char buffer[8192]; +#else + __attribute__ ((aligned (8))) char buffer[8192]; +#endif + + STATIC_ASSERT(sizeof buffer >= + sizeof(FILE_DIRECTORY_INFORMATION) + 256 * sizeof(WCHAR)); + + /* Open the directory. */ + dir_handle = + CreateFileW(req->file.pathw, + FILE_LIST_DIRECTORY | SYNCHRONIZE, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + NULL); + if (dir_handle == INVALID_HANDLE_VALUE) + goto win32_error; + + /* Read the first chunk. */ + status = pNtQueryDirectoryFile(dir_handle, + NULL, + NULL, + NULL, + &iosb, + &buffer, + sizeof buffer, + FileDirectoryInformation, + FALSE, + NULL, + TRUE); + + /* If the handle is not a directory, we'll get STATUS_INVALID_PARAMETER. + * This should be reported back as UV_ENOTDIR. + */ + if (status == STATUS_INVALID_PARAMETER) + goto not_a_directory_error; + + while (NT_SUCCESS(status)) { + char* position = buffer; + size_t next_entry_offset = 0; + + do { + FILE_DIRECTORY_INFORMATION* info; + uv__dirent_t* dirent; + + size_t wchar_len; + size_t utf8_len; + + /* Obtain a pointer to the current directory entry. */ + position += next_entry_offset; + info = (FILE_DIRECTORY_INFORMATION*) position; + + /* Fetch the offset to the next directory entry. */ + next_entry_offset = info->NextEntryOffset; + + /* Compute the length of the filename in WCHARs. */ + wchar_len = info->FileNameLength / sizeof info->FileName[0]; + + /* Skip over '.' and '..' entries. It has been reported that + * the SharePoint driver includes the terminating zero byte in + * the filename length. Strip those first. + */ + while (wchar_len > 0 && info->FileName[wchar_len - 1] == L'\0') + wchar_len -= 1; + + if (wchar_len == 0) + continue; + if (wchar_len == 1 && info->FileName[0] == L'.') + continue; + if (wchar_len == 2 && info->FileName[0] == L'.' && + info->FileName[1] == L'.') + continue; + + /* Compute the space required to store the filename as UTF-8. */ + utf8_len = WideCharToMultiByte( + CP_UTF8, 0, &info->FileName[0], wchar_len, NULL, 0, NULL, NULL); + if (utf8_len == 0) + goto win32_error; + + /* Resize the dirent array if needed. */ + if (dirents_used >= dirents_size) { + size_t new_dirents_size = + dirents_size == 0 ? dirents_initial_size : dirents_size << 1; + uv__dirent_t** new_dirents = + uv__realloc(dirents, new_dirents_size * sizeof *dirents); + + if (new_dirents == NULL) + goto out_of_memory_error; + + dirents_size = new_dirents_size; + dirents = new_dirents; + } + + /* Allocate space for the uv dirent structure. The dirent structure + * includes room for the first character of the filename, but `utf8_len` + * doesn't count the NULL terminator at this point. + */ + dirent = uv__malloc(sizeof *dirent + utf8_len); + if (dirent == NULL) + goto out_of_memory_error; + + dirents[dirents_used++] = dirent; + + /* Convert file name to UTF-8. */ + if (WideCharToMultiByte(CP_UTF8, + 0, + &info->FileName[0], + wchar_len, + &dirent->d_name[0], + utf8_len, + NULL, + NULL) == 0) + goto win32_error; + + /* Add a null terminator to the filename. */ + dirent->d_name[utf8_len] = '\0'; + + /* Fill out the type field. */ + if (info->FileAttributes & FILE_ATTRIBUTE_DEVICE) + dirent->d_type = UV__DT_CHAR; + else if (info->FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) + dirent->d_type = UV__DT_LINK; + else if (info->FileAttributes & FILE_ATTRIBUTE_DIRECTORY) + dirent->d_type = UV__DT_DIR; + else + dirent->d_type = UV__DT_FILE; + } while (next_entry_offset != 0); + + /* Read the next chunk. */ + status = pNtQueryDirectoryFile(dir_handle, + NULL, + NULL, + NULL, + &iosb, + &buffer, + sizeof buffer, + FileDirectoryInformation, + FALSE, + NULL, + FALSE); + + /* After the first pNtQueryDirectoryFile call, the function may return + * STATUS_SUCCESS even if the buffer was too small to hold at least one + * directory entry. + */ + if (status == STATUS_SUCCESS && iosb.Information == 0) + status = STATUS_BUFFER_OVERFLOW; + } + + if (status != STATUS_NO_MORE_FILES) + goto nt_error; + + CloseHandle(dir_handle); + + /* Store the result in the request object. */ + req->ptr = dirents; + if (dirents != NULL) + req->flags |= UV_FS_FREE_PTR; + + SET_REQ_RESULT(req, dirents_used); + + /* `nbufs` will be used as index by uv_fs_scandir_next. */ + req->fs.info.nbufs = 0; + + return; + +nt_error: + SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(status)); + goto cleanup; + +win32_error: + SET_REQ_WIN32_ERROR(req, GetLastError()); + goto cleanup; + +not_a_directory_error: + SET_REQ_UV_ERROR(req, UV_ENOTDIR, ERROR_DIRECTORY); + goto cleanup; + +out_of_memory_error: + SET_REQ_UV_ERROR(req, UV_ENOMEM, ERROR_OUTOFMEMORY); + goto cleanup; + +cleanup: + if (dir_handle != INVALID_HANDLE_VALUE) + CloseHandle(dir_handle); + while (dirents_used > 0) + uv__free(dirents[--dirents_used]); + if (dirents != NULL) + uv__free(dirents); +} + + +INLINE static int fs__stat_handle(HANDLE handle, uv_stat_t* statbuf) { + FILE_ALL_INFORMATION file_info; + FILE_FS_VOLUME_INFORMATION volume_info; + NTSTATUS nt_status; + IO_STATUS_BLOCK io_status; + + nt_status = pNtQueryInformationFile(handle, + &io_status, + &file_info, + sizeof file_info, + FileAllInformation); + + /* Buffer overflow (a warning status code) is expected here. */ + if (NT_ERROR(nt_status)) { + SetLastError(pRtlNtStatusToDosError(nt_status)); + return -1; + } + + nt_status = pNtQueryVolumeInformationFile(handle, + &io_status, + &volume_info, + sizeof volume_info, + FileFsVolumeInformation); + + /* Buffer overflow (a warning status code) is expected here. */ + if (io_status.Status == STATUS_NOT_IMPLEMENTED) { + statbuf->st_dev = 0; + } else if (NT_ERROR(nt_status)) { + SetLastError(pRtlNtStatusToDosError(nt_status)); + return -1; + } else { + statbuf->st_dev = volume_info.VolumeSerialNumber; + } + + /* Todo: st_mode should probably always be 0666 for everyone. We might also + * want to report 0777 if the file is a .exe or a directory. + * + * Currently it's based on whether the 'readonly' attribute is set, which + * makes little sense because the semantics are so different: the 'read-only' + * flag is just a way for a user to protect against accidental deletion, and + * serves no security purpose. Windows uses ACLs for that. + * + * Also people now use uv_fs_chmod() to take away the writable bit for good + * reasons. Windows however just makes the file read-only, which makes it + * impossible to delete the file afterwards, since read-only files can't be + * deleted. + * + * IOW it's all just a clusterfuck and we should think of something that + * makes slightly more sense. + * + * And uv_fs_chmod should probably just fail on windows or be a total no-op. + * There's nothing sensible it can do anyway. + */ + statbuf->st_mode = 0; + + if (file_info.BasicInformation.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { + /* + * It is possible for a file to have FILE_ATTRIBUTE_REPARSE_POINT but not have + * any link data. In that case DeviceIoControl() in fs__readlink_handle() sets + * the last error to ERROR_NOT_A_REPARSE_POINT. Then the stat result mode + * calculated below will indicate a normal directory or file, as if + * FILE_ATTRIBUTE_REPARSE_POINT was not present. + */ + if (fs__readlink_handle(handle, NULL, &statbuf->st_size) == 0) { + statbuf->st_mode |= S_IFLNK; + } else if (GetLastError() != ERROR_NOT_A_REPARSE_POINT) { + return -1; + } + } + + if (statbuf->st_mode == 0) { + if (file_info.BasicInformation.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + statbuf->st_mode |= _S_IFDIR; + statbuf->st_size = 0; + } else { + statbuf->st_mode |= _S_IFREG; + statbuf->st_size = file_info.StandardInformation.EndOfFile.QuadPart; + } + } + + if (file_info.BasicInformation.FileAttributes & FILE_ATTRIBUTE_READONLY) + statbuf->st_mode |= _S_IREAD | (_S_IREAD >> 3) | (_S_IREAD >> 6); + else + statbuf->st_mode |= (_S_IREAD | _S_IWRITE) | ((_S_IREAD | _S_IWRITE) >> 3) | + ((_S_IREAD | _S_IWRITE) >> 6); + + FILETIME_TO_TIMESPEC(statbuf->st_atim, file_info.BasicInformation.LastAccessTime); + FILETIME_TO_TIMESPEC(statbuf->st_ctim, file_info.BasicInformation.ChangeTime); + FILETIME_TO_TIMESPEC(statbuf->st_mtim, file_info.BasicInformation.LastWriteTime); + FILETIME_TO_TIMESPEC(statbuf->st_birthtim, file_info.BasicInformation.CreationTime); + + statbuf->st_ino = file_info.InternalInformation.IndexNumber.QuadPart; + + /* st_blocks contains the on-disk allocation size in 512-byte units. */ + statbuf->st_blocks = + file_info.StandardInformation.AllocationSize.QuadPart >> 9ULL; + + statbuf->st_nlink = file_info.StandardInformation.NumberOfLinks; + + /* The st_blksize is supposed to be the 'optimal' number of bytes for reading + * and writing to the disk. That is, for any definition of 'optimal' - it's + * supposed to at least avoid read-update-write behavior when writing to the + * disk. + * + * However nobody knows this and even fewer people actually use this value, + * and in order to fill it out we'd have to make another syscall to query the + * volume for FILE_FS_SECTOR_SIZE_INFORMATION. + * + * Therefore we'll just report a sensible value that's quite commonly okay + * on modern hardware. + */ + statbuf->st_blksize = 2048; + + /* Todo: set st_flags to something meaningful. Also provide a wrapper for + * chattr(2). + */ + statbuf->st_flags = 0; + + /* Windows has nothing sensible to say about these values, so they'll just + * remain empty. + */ + statbuf->st_gid = 0; + statbuf->st_uid = 0; + statbuf->st_rdev = 0; + statbuf->st_gen = 0; + + return 0; +} + + +INLINE static void fs__stat_prepare_path(WCHAR* pathw) { + size_t len = wcslen(pathw); + + /* TODO: ignore namespaced paths. */ + if (len > 1 && pathw[len - 2] != L':' && + (pathw[len - 1] == L'\\' || pathw[len - 1] == L'/')) { + pathw[len - 1] = '\0'; + } +} + + +INLINE static void fs__stat_impl(uv_fs_t* req, int do_lstat) { + HANDLE handle; + DWORD flags; + + flags = FILE_FLAG_BACKUP_SEMANTICS; + if (do_lstat) { + flags |= FILE_FLAG_OPEN_REPARSE_POINT; + } + + handle = CreateFileW(req->file.pathw, + FILE_READ_ATTRIBUTES, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + flags, + NULL); + if (handle == INVALID_HANDLE_VALUE) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + return; + } + + if (fs__stat_handle(handle, &req->statbuf) != 0) { + DWORD error = GetLastError(); + if (do_lstat && error == ERROR_SYMLINK_NOT_SUPPORTED) { + /* We opened a reparse point but it was not a symlink. Try again. */ + fs__stat_impl(req, 0); + + } else { + /* Stat failed. */ + SET_REQ_WIN32_ERROR(req, GetLastError()); + } + + CloseHandle(handle); + return; + } + + req->ptr = &req->statbuf; + req->result = 0; + CloseHandle(handle); +} + + +static void fs__stat(uv_fs_t* req) { + fs__stat_prepare_path(req->file.pathw); + fs__stat_impl(req, 0); +} + + +static void fs__lstat(uv_fs_t* req) { + fs__stat_prepare_path(req->file.pathw); + fs__stat_impl(req, 1); +} + + +static void fs__fstat(uv_fs_t* req) { + int fd = req->file.fd; + HANDLE handle; + + VERIFY_FD(fd, req); + + handle = uv__get_osfhandle(fd); + + if (handle == INVALID_HANDLE_VALUE) { + SET_REQ_WIN32_ERROR(req, ERROR_INVALID_HANDLE); + return; + } + + if (fs__stat_handle(handle, &req->statbuf) != 0) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + return; + } + + req->ptr = &req->statbuf; + req->result = 0; +} + + +static void fs__rename(uv_fs_t* req) { + if (!MoveFileExW(req->file.pathw, req->fs.info.new_pathw, MOVEFILE_REPLACE_EXISTING)) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + return; + } + + SET_REQ_RESULT(req, 0); +} + + +INLINE static void fs__sync_impl(uv_fs_t* req) { + int fd = req->file.fd; + int result; + + VERIFY_FD(fd, req); + + result = FlushFileBuffers(uv__get_osfhandle(fd)) ? 0 : -1; + if (result == -1) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + } else { + SET_REQ_RESULT(req, result); + } +} + + +static void fs__fsync(uv_fs_t* req) { + fs__sync_impl(req); +} + + +static void fs__fdatasync(uv_fs_t* req) { + fs__sync_impl(req); +} + + +static void fs__ftruncate(uv_fs_t* req) { + int fd = req->file.fd; + HANDLE handle; + NTSTATUS status; + IO_STATUS_BLOCK io_status; + FILE_END_OF_FILE_INFORMATION eof_info; + + VERIFY_FD(fd, req); + + handle = uv__get_osfhandle(fd); + + eof_info.EndOfFile.QuadPart = req->fs.info.offset; + + status = pNtSetInformationFile(handle, + &io_status, + &eof_info, + sizeof eof_info, + FileEndOfFileInformation); + + if (NT_SUCCESS(status)) { + SET_REQ_RESULT(req, 0); + } else { + SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(status)); + } +} + + +static void fs__sendfile(uv_fs_t* req) { + int fd_in = req->file.fd, fd_out = req->fs.info.fd_out; + size_t length = req->fs.info.bufsml[0].len; + int64_t offset = req->fs.info.offset; + const size_t max_buf_size = 65536; + size_t buf_size = length < max_buf_size ? length : max_buf_size; + int n, result = 0; + int64_t result_offset = 0; + char* buf = (char*) uv__malloc(buf_size); + if (!buf) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + + if (offset != -1) { + result_offset = _lseeki64(fd_in, offset, SEEK_SET); + } + + if (result_offset == -1) { + result = -1; + } else { + while (length > 0) { + n = _read(fd_in, buf, length < buf_size ? length : buf_size); + if (n == 0) { + break; + } else if (n == -1) { + result = -1; + break; + } + + length -= n; + + n = _write(fd_out, buf, n); + if (n == -1) { + result = -1; + break; + } + + result += n; + } + } + + uv__free(buf); + + SET_REQ_RESULT(req, result); +} + + +static void fs__access(uv_fs_t* req) { + DWORD attr = GetFileAttributesW(req->file.pathw); + + if (attr == INVALID_FILE_ATTRIBUTES) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + return; + } + + /* + * Access is possible if + * - write access wasn't requested, + * - or the file isn't read-only, + * - or it's a directory. + * (Directories cannot be read-only on Windows.) + */ + if (!(req->fs.info.mode & W_OK) || + !(attr & FILE_ATTRIBUTE_READONLY) || + (attr & FILE_ATTRIBUTE_DIRECTORY)) { + SET_REQ_RESULT(req, 0); + } else { + SET_REQ_WIN32_ERROR(req, UV_EPERM); + } + +} + + +static void fs__chmod(uv_fs_t* req) { + int result = _wchmod(req->file.pathw, req->fs.info.mode); + SET_REQ_RESULT(req, result); +} + + +static void fs__fchmod(uv_fs_t* req) { + int fd = req->file.fd; + HANDLE handle; + NTSTATUS nt_status; + IO_STATUS_BLOCK io_status; + FILE_BASIC_INFORMATION file_info; + + VERIFY_FD(fd, req); + + handle = uv__get_osfhandle(fd); + + nt_status = pNtQueryInformationFile(handle, + &io_status, + &file_info, + sizeof file_info, + FileBasicInformation); + + if (!NT_SUCCESS(nt_status)) { + SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(nt_status)); + return; + } + + if (req->fs.info.mode & _S_IWRITE) { + file_info.FileAttributes &= ~FILE_ATTRIBUTE_READONLY; + } else { + file_info.FileAttributes |= FILE_ATTRIBUTE_READONLY; + } + + nt_status = pNtSetInformationFile(handle, + &io_status, + &file_info, + sizeof file_info, + FileBasicInformation); + + if (!NT_SUCCESS(nt_status)) { + SET_REQ_WIN32_ERROR(req, pRtlNtStatusToDosError(nt_status)); + return; + } + + SET_REQ_SUCCESS(req); +} + + +INLINE static int fs__utime_handle(HANDLE handle, double atime, double mtime) { + FILETIME filetime_a, filetime_m; + + TIME_T_TO_FILETIME(atime, &filetime_a); + TIME_T_TO_FILETIME(mtime, &filetime_m); + + if (!SetFileTime(handle, NULL, &filetime_a, &filetime_m)) { + return -1; + } + + return 0; +} + + +static void fs__utime(uv_fs_t* req) { + HANDLE handle; + + handle = CreateFileW(req->file.pathw, + FILE_WRITE_ATTRIBUTES, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + NULL); + + if (handle == INVALID_HANDLE_VALUE) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + return; + } + + if (fs__utime_handle(handle, req->fs.time.atime, req->fs.time.mtime) != 0) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + CloseHandle(handle); + return; + } + + CloseHandle(handle); + + req->result = 0; +} + + +static void fs__futime(uv_fs_t* req) { + int fd = req->file.fd; + HANDLE handle; + VERIFY_FD(fd, req); + + handle = uv__get_osfhandle(fd); + + if (handle == INVALID_HANDLE_VALUE) { + SET_REQ_WIN32_ERROR(req, ERROR_INVALID_HANDLE); + return; + } + + if (fs__utime_handle(handle, req->fs.time.atime, req->fs.time.mtime) != 0) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + return; + } + + req->result = 0; +} + + +static void fs__link(uv_fs_t* req) { + DWORD r = CreateHardLinkW(req->fs.info.new_pathw, req->file.pathw, NULL); + if (r == 0) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + } else { + req->result = 0; + } +} + + +static void fs__create_junction(uv_fs_t* req, const WCHAR* path, + const WCHAR* new_path) { + HANDLE handle = INVALID_HANDLE_VALUE; + REPARSE_DATA_BUFFER *buffer = NULL; + int created = 0; + int target_len; + int is_absolute, is_long_path; + int needed_buf_size, used_buf_size, used_data_size, path_buf_len; + int start, len, i; + int add_slash; + DWORD bytes; + WCHAR* path_buf; + + target_len = wcslen(path); + is_long_path = wcsncmp(path, LONG_PATH_PREFIX, LONG_PATH_PREFIX_LEN) == 0; + + if (is_long_path) { + is_absolute = 1; + } else { + is_absolute = target_len >= 3 && IS_LETTER(path[0]) && + path[1] == L':' && IS_SLASH(path[2]); + } + + if (!is_absolute) { + /* Not supporting relative paths */ + SET_REQ_UV_ERROR(req, UV_EINVAL, ERROR_NOT_SUPPORTED); + return; + } + + /* Do a pessimistic calculation of the required buffer size */ + needed_buf_size = + FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer.PathBuffer) + + JUNCTION_PREFIX_LEN * sizeof(WCHAR) + + 2 * (target_len + 2) * sizeof(WCHAR); + + /* Allocate the buffer */ + buffer = (REPARSE_DATA_BUFFER*)uv__malloc(needed_buf_size); + if (!buffer) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + + /* Grab a pointer to the part of the buffer where filenames go */ + path_buf = (WCHAR*)&(buffer->MountPointReparseBuffer.PathBuffer); + path_buf_len = 0; + + /* Copy the substitute (internal) target path */ + start = path_buf_len; + + wcsncpy((WCHAR*)&path_buf[path_buf_len], JUNCTION_PREFIX, + JUNCTION_PREFIX_LEN); + path_buf_len += JUNCTION_PREFIX_LEN; + + add_slash = 0; + for (i = is_long_path ? LONG_PATH_PREFIX_LEN : 0; path[i] != L'\0'; i++) { + if (IS_SLASH(path[i])) { + add_slash = 1; + continue; + } + + if (add_slash) { + path_buf[path_buf_len++] = L'\\'; + add_slash = 0; + } + + path_buf[path_buf_len++] = path[i]; + } + path_buf[path_buf_len++] = L'\\'; + len = path_buf_len - start; + + /* Set the info about the substitute name */ + buffer->MountPointReparseBuffer.SubstituteNameOffset = start * sizeof(WCHAR); + buffer->MountPointReparseBuffer.SubstituteNameLength = len * sizeof(WCHAR); + + /* Insert null terminator */ + path_buf[path_buf_len++] = L'\0'; + + /* Copy the print name of the target path */ + start = path_buf_len; + add_slash = 0; + for (i = is_long_path ? LONG_PATH_PREFIX_LEN : 0; path[i] != L'\0'; i++) { + if (IS_SLASH(path[i])) { + add_slash = 1; + continue; + } + + if (add_slash) { + path_buf[path_buf_len++] = L'\\'; + add_slash = 0; + } + + path_buf[path_buf_len++] = path[i]; + } + len = path_buf_len - start; + if (len == 2) { + path_buf[path_buf_len++] = L'\\'; + len++; + } + + /* Set the info about the print name */ + buffer->MountPointReparseBuffer.PrintNameOffset = start * sizeof(WCHAR); + buffer->MountPointReparseBuffer.PrintNameLength = len * sizeof(WCHAR); + + /* Insert another null terminator */ + path_buf[path_buf_len++] = L'\0'; + + /* Calculate how much buffer space was actually used */ + used_buf_size = FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer.PathBuffer) + + path_buf_len * sizeof(WCHAR); + used_data_size = used_buf_size - + FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer); + + /* Put general info in the data buffer */ + buffer->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT; + buffer->ReparseDataLength = used_data_size; + buffer->Reserved = 0; + + /* Create a new directory */ + if (!CreateDirectoryW(new_path, NULL)) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + goto error; + } + created = 1; + + /* Open the directory */ + handle = CreateFileW(new_path, + GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS | + FILE_FLAG_OPEN_REPARSE_POINT, + NULL); + if (handle == INVALID_HANDLE_VALUE) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + goto error; + } + + /* Create the actual reparse point */ + if (!DeviceIoControl(handle, + FSCTL_SET_REPARSE_POINT, + buffer, + used_buf_size, + NULL, + 0, + &bytes, + NULL)) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + goto error; + } + + /* Clean up */ + CloseHandle(handle); + uv__free(buffer); + + SET_REQ_RESULT(req, 0); + return; + +error: + uv__free(buffer); + + if (handle != INVALID_HANDLE_VALUE) { + CloseHandle(handle); + } + + if (created) { + RemoveDirectoryW(new_path); + } +} + + +static void fs__symlink(uv_fs_t* req) { + WCHAR* pathw = req->file.pathw; + WCHAR* new_pathw = req->fs.info.new_pathw; + int flags = req->fs.info.file_flags; + int result; + + + if (flags & UV_FS_SYMLINK_JUNCTION) { + fs__create_junction(req, pathw, new_pathw); + } else if (pCreateSymbolicLinkW) { + result = pCreateSymbolicLinkW(new_pathw, + pathw, + flags & UV_FS_SYMLINK_DIR ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0) ? 0 : -1; + if (result == -1) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + } else { + SET_REQ_RESULT(req, result); + } + } else { + SET_REQ_UV_ERROR(req, UV_ENOSYS, ERROR_NOT_SUPPORTED); + } +} + + +static void fs__readlink(uv_fs_t* req) { + HANDLE handle; + + handle = CreateFileW(req->file.pathw, + 0, + 0, + NULL, + OPEN_EXISTING, + FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, + NULL); + + if (handle == INVALID_HANDLE_VALUE) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + return; + } + + if (fs__readlink_handle(handle, (char**) &req->ptr, NULL) != 0) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + CloseHandle(handle); + return; + } + + req->flags |= UV_FS_FREE_PTR; + SET_REQ_RESULT(req, 0); + + CloseHandle(handle); +} + + +static size_t fs__realpath_handle(HANDLE handle, char** realpath_ptr) { + int r; + DWORD w_realpath_len; + WCHAR* w_realpath_ptr = NULL; + WCHAR* w_realpath_buf; + + w_realpath_len = pGetFinalPathNameByHandleW(handle, NULL, 0, VOLUME_NAME_DOS); + if (w_realpath_len == 0) { + return -1; + } + + w_realpath_buf = uv__malloc((w_realpath_len + 1) * sizeof(WCHAR)); + if (w_realpath_buf == NULL) { + SetLastError(ERROR_OUTOFMEMORY); + return -1; + } + w_realpath_ptr = w_realpath_buf; + + if (pGetFinalPathNameByHandleW(handle, + w_realpath_ptr, + w_realpath_len, + VOLUME_NAME_DOS) == 0) { + uv__free(w_realpath_buf); + SetLastError(ERROR_INVALID_HANDLE); + return -1; + } + + /* convert UNC path to long path */ + if (wcsncmp(w_realpath_ptr, + UNC_PATH_PREFIX, + UNC_PATH_PREFIX_LEN) == 0) { + w_realpath_ptr += 6; + *w_realpath_ptr = L'\\'; + w_realpath_len -= 6; + } else if (wcsncmp(w_realpath_ptr, + LONG_PATH_PREFIX, + LONG_PATH_PREFIX_LEN) == 0) { + w_realpath_ptr += 4; + w_realpath_len -= 4; + } else { + uv__free(w_realpath_buf); + SetLastError(ERROR_INVALID_HANDLE); + return -1; + } + + r = fs__wide_to_utf8(w_realpath_ptr, w_realpath_len, realpath_ptr, NULL); + uv__free(w_realpath_buf); + return r; +} + +static void fs__realpath(uv_fs_t* req) { + HANDLE handle; + + if (!pGetFinalPathNameByHandleW) { + SET_REQ_UV_ERROR(req, UV_ENOSYS, ERROR_NOT_SUPPORTED); + return; + } + + handle = CreateFileW(req->file.pathw, + 0, + 0, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, + NULL); + if (handle == INVALID_HANDLE_VALUE) { + SET_REQ_WIN32_ERROR(req, GetLastError()); + return; + } + + if (fs__realpath_handle(handle, (char**) &req->ptr) == -1) { + CloseHandle(handle); + SET_REQ_WIN32_ERROR(req, GetLastError()); + return; + } + + CloseHandle(handle); + req->flags |= UV_FS_FREE_PTR; + SET_REQ_RESULT(req, 0); +} + + +static void fs__chown(uv_fs_t* req) { + req->result = 0; +} + + +static void fs__fchown(uv_fs_t* req) { + req->result = 0; +} + + +static void uv__fs_work(struct uv__work* w) { + uv_fs_t* req; + + req = container_of(w, uv_fs_t, work_req); + assert(req->type == UV_FS); + +#define XX(uc, lc) case UV_FS_##uc: fs__##lc(req); break; + switch (req->fs_type) { + XX(OPEN, open) + XX(CLOSE, close) + XX(READ, read) + XX(WRITE, write) + XX(SENDFILE, sendfile) + XX(STAT, stat) + XX(LSTAT, lstat) + XX(FSTAT, fstat) + XX(FTRUNCATE, ftruncate) + XX(UTIME, utime) + XX(FUTIME, futime) + XX(ACCESS, access) + XX(CHMOD, chmod) + XX(FCHMOD, fchmod) + XX(FSYNC, fsync) + XX(FDATASYNC, fdatasync) + XX(UNLINK, unlink) + XX(RMDIR, rmdir) + XX(MKDIR, mkdir) + XX(MKDTEMP, mkdtemp) + XX(RENAME, rename) + XX(SCANDIR, scandir) + XX(LINK, link) + XX(SYMLINK, symlink) + XX(READLINK, readlink) + XX(REALPATH, realpath) + XX(CHOWN, chown) + XX(FCHOWN, fchown); + default: + assert(!"bad uv_fs_type"); + } +} + + +static void uv__fs_done(struct uv__work* w, int status) { + uv_fs_t* req; + + req = container_of(w, uv_fs_t, work_req); + uv__req_unregister(req->loop, req); + + if (status == UV_ECANCELED) { + assert(req->result == 0); + req->result = UV_ECANCELED; + } + + req->cb(req); +} + + +void uv_fs_req_cleanup(uv_fs_t* req) { + if (req->flags & UV_FS_CLEANEDUP) + return; + + if (req->flags & UV_FS_FREE_PATHS) + uv__free(req->file.pathw); + + if (req->flags & UV_FS_FREE_PTR) { + if (req->fs_type == UV_FS_SCANDIR && req->ptr != NULL) + uv__fs_scandir_cleanup(req); + else + uv__free(req->ptr); + } + + if (req->fs.info.bufs != req->fs.info.bufsml) + uv__free(req->fs.info.bufs); + + req->path = NULL; + req->file.pathw = NULL; + req->fs.info.new_pathw = NULL; + req->fs.info.bufs = NULL; + req->ptr = NULL; + + req->flags |= UV_FS_CLEANEDUP; +} + + +int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, + int mode, uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_OPEN, cb); + + err = fs__capture_path(req, path, NULL, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + req->fs.info.file_flags = flags; + req->fs.info.mode = mode; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__open(req); + return req->result; + } +} + + +int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) { + uv_fs_req_init(loop, req, UV_FS_CLOSE, cb); + req->file.fd = fd; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__close(req); + return req->result; + } +} + + +int uv_fs_read(uv_loop_t* loop, + uv_fs_t* req, + uv_file fd, + const uv_buf_t bufs[], + unsigned int nbufs, + int64_t offset, + uv_fs_cb cb) { + if (bufs == NULL || nbufs == 0) + return UV_EINVAL; + + uv_fs_req_init(loop, req, UV_FS_READ, cb); + + req->file.fd = fd; + + req->fs.info.nbufs = nbufs; + req->fs.info.bufs = req->fs.info.bufsml; + if (nbufs > ARRAY_SIZE(req->fs.info.bufsml)) + req->fs.info.bufs = uv__malloc(nbufs * sizeof(*bufs)); + + if (req->fs.info.bufs == NULL) + return UV_ENOMEM; + + memcpy(req->fs.info.bufs, bufs, nbufs * sizeof(*bufs)); + + req->fs.info.offset = offset; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__read(req); + return req->result; + } +} + + +int uv_fs_write(uv_loop_t* loop, + uv_fs_t* req, + uv_file fd, + const uv_buf_t bufs[], + unsigned int nbufs, + int64_t offset, + uv_fs_cb cb) { + if (bufs == NULL || nbufs == 0) + return UV_EINVAL; + + uv_fs_req_init(loop, req, UV_FS_WRITE, cb); + + req->file.fd = fd; + + req->fs.info.nbufs = nbufs; + req->fs.info.bufs = req->fs.info.bufsml; + if (nbufs > ARRAY_SIZE(req->fs.info.bufsml)) + req->fs.info.bufs = uv__malloc(nbufs * sizeof(*bufs)); + + if (req->fs.info.bufs == NULL) + return UV_ENOMEM; + + memcpy(req->fs.info.bufs, bufs, nbufs * sizeof(*bufs)); + + req->fs.info.offset = offset; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__write(req); + return req->result; + } +} + + +int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, + uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_UNLINK, cb); + + err = fs__capture_path(req, path, NULL, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__unlink(req); + return req->result; + } +} + + +int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, + uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_MKDIR, cb); + + err = fs__capture_path(req, path, NULL, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + req->fs.info.mode = mode; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__mkdir(req); + return req->result; + } +} + + +int uv_fs_mkdtemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, + uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_MKDTEMP, cb); + + err = fs__capture_path(req, tpl, NULL, TRUE); + if (err) + return uv_translate_sys_error(err); + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__mkdtemp(req); + return req->result; + } +} + + +int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_RMDIR, cb); + + err = fs__capture_path(req, path, NULL, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__rmdir(req); + return req->result; + } +} + + +int uv_fs_scandir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, + uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_SCANDIR, cb); + + err = fs__capture_path(req, path, NULL, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + req->fs.info.file_flags = flags; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__scandir(req); + return req->result; + } +} + + +int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path, + const char* new_path, uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_LINK, cb); + + err = fs__capture_path(req, path, new_path, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__link(req); + return req->result; + } +} + + +int uv_fs_symlink(uv_loop_t* loop, uv_fs_t* req, const char* path, + const char* new_path, int flags, uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_SYMLINK, cb); + + err = fs__capture_path(req, path, new_path, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + req->fs.info.file_flags = flags; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__symlink(req); + return req->result; + } +} + + +int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path, + uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_READLINK, cb); + + err = fs__capture_path(req, path, NULL, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__readlink(req); + return req->result; + } +} + + +int uv_fs_realpath(uv_loop_t* loop, uv_fs_t* req, const char* path, + uv_fs_cb cb) { + int err; + + if (!req || !path) { + return UV_EINVAL; + } + + uv_fs_req_init(loop, req, UV_FS_REALPATH, cb); + + err = fs__capture_path(req, path, NULL, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__realpath(req); + return req->result; + } +} + + +int uv_fs_chown(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_uid_t uid, + uv_gid_t gid, uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_CHOWN, cb); + + err = fs__capture_path(req, path, NULL, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__chown(req); + return req->result; + } +} + + +int uv_fs_fchown(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_uid_t uid, + uv_gid_t gid, uv_fs_cb cb) { + uv_fs_req_init(loop, req, UV_FS_FCHOWN, cb); + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__fchown(req); + return req->result; + } +} + + +int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_STAT, cb); + + err = fs__capture_path(req, path, NULL, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__stat(req); + return req->result; + } +} + + +int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_LSTAT, cb); + + err = fs__capture_path(req, path, NULL, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__lstat(req); + return req->result; + } +} + + +int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) { + uv_fs_req_init(loop, req, UV_FS_FSTAT, cb); + req->file.fd = fd; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__fstat(req); + return req->result; + } +} + + +int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path, + const char* new_path, uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_RENAME, cb); + + err = fs__capture_path(req, path, new_path, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__rename(req); + return req->result; + } +} + + +int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) { + uv_fs_req_init(loop, req, UV_FS_FSYNC, cb); + req->file.fd = fd; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__fsync(req); + return req->result; + } +} + + +int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file fd, uv_fs_cb cb) { + uv_fs_req_init(loop, req, UV_FS_FDATASYNC, cb); + req->file.fd = fd; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__fdatasync(req); + return req->result; + } +} + + +int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file fd, + int64_t offset, uv_fs_cb cb) { + uv_fs_req_init(loop, req, UV_FS_FTRUNCATE, cb); + + req->file.fd = fd; + req->fs.info.offset = offset; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__ftruncate(req); + return req->result; + } +} + + + +int uv_fs_sendfile(uv_loop_t* loop, uv_fs_t* req, uv_file fd_out, + uv_file fd_in, int64_t in_offset, size_t length, uv_fs_cb cb) { + uv_fs_req_init(loop, req, UV_FS_SENDFILE, cb); + + req->file.fd = fd_in; + req->fs.info.fd_out = fd_out; + req->fs.info.offset = in_offset; + req->fs.info.bufsml[0].len = length; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__sendfile(req); + return req->result; + } +} + + +int uv_fs_access(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int flags, + uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_ACCESS, cb); + + err = fs__capture_path(req, path, NULL, cb != NULL); + if (err) + return uv_translate_sys_error(err); + + req->fs.info.mode = flags; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } + + fs__access(req); + return req->result; +} + + +int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, + uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_CHMOD, cb); + + err = fs__capture_path(req, path, NULL, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + req->fs.info.mode = mode; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__chmod(req); + return req->result; + } +} + + +int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file fd, int mode, + uv_fs_cb cb) { + uv_fs_req_init(loop, req, UV_FS_FCHMOD, cb); + + req->file.fd = fd; + req->fs.info.mode = mode; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__fchmod(req); + return req->result; + } +} + + +int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, + double mtime, uv_fs_cb cb) { + int err; + + uv_fs_req_init(loop, req, UV_FS_UTIME, cb); + + err = fs__capture_path(req, path, NULL, cb != NULL); + if (err) { + return uv_translate_sys_error(err); + } + + req->fs.time.atime = atime; + req->fs.time.mtime = mtime; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__utime(req); + return req->result; + } +} + + +int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file fd, double atime, + double mtime, uv_fs_cb cb) { + uv_fs_req_init(loop, req, UV_FS_FUTIME, cb); + + req->file.fd = fd; + req->fs.time.atime = atime; + req->fs.time.mtime = mtime; + + if (cb) { + QUEUE_FS_TP_JOB(loop, req); + return 0; + } else { + fs__futime(req); + return req->result; + } +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/getaddrinfo.c b/lib/ESPiLight/pilight/libs/libuv/win/getaddrinfo.c new file mode 100644 index 0000000..baab838 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/getaddrinfo.c @@ -0,0 +1,382 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include + +#include "uv.h" +#include "internal.h" +#include "req-inl.h" + +/* EAI_* constants. */ +#include + + +int uv__getaddrinfo_translate_error(int sys_err) { + switch (sys_err) { + case 0: return 0; + case WSATRY_AGAIN: return UV_EAI_AGAIN; + case WSAEINVAL: return UV_EAI_BADFLAGS; + case WSANO_RECOVERY: return UV_EAI_FAIL; + case WSAEAFNOSUPPORT: return UV_EAI_FAMILY; + case WSA_NOT_ENOUGH_MEMORY: return UV_EAI_MEMORY; + case WSAHOST_NOT_FOUND: return UV_EAI_NONAME; + case WSATYPE_NOT_FOUND: return UV_EAI_SERVICE; + case WSAESOCKTNOSUPPORT: return UV_EAI_SOCKTYPE; + default: return uv_translate_sys_error(sys_err); + } +} + + +/* + * MinGW is missing this + */ +#if !defined(_MSC_VER) && !defined(__MINGW64_VERSION_MAJOR) + typedef struct addrinfoW { + int ai_flags; + int ai_family; + int ai_socktype; + int ai_protocol; + size_t ai_addrlen; + WCHAR* ai_canonname; + struct sockaddr* ai_addr; + struct addrinfoW* ai_next; + } ADDRINFOW, *PADDRINFOW; + + DECLSPEC_IMPORT int WSAAPI GetAddrInfoW(const WCHAR* node, + const WCHAR* service, + const ADDRINFOW* hints, + PADDRINFOW* result); + + DECLSPEC_IMPORT void WSAAPI FreeAddrInfoW(PADDRINFOW pAddrInfo); +#endif + + +/* adjust size value to be multiple of 4. Use to keep pointer aligned */ +/* Do we need different versions of this for different architectures? */ +#define ALIGNED_SIZE(X) ((((X) + 3) >> 2) << 2) + + +static void uv__getaddrinfo_work(struct uv__work* w) { + uv_getaddrinfo_t* req; + struct addrinfoW* hints; + int err; + + req = container_of(w, uv_getaddrinfo_t, work_req); + hints = req->addrinfow; + req->addrinfow = NULL; + err = GetAddrInfoW(req->node, req->service, hints, &req->addrinfow); + req->retcode = uv__getaddrinfo_translate_error(err); +} + + +/* + * Called from uv_run when complete. Call user specified callback + * then free returned addrinfo + * Returned addrinfo strings are converted from UTF-16 to UTF-8. + * + * To minimize allocation we calculate total size required, + * and copy all structs and referenced strings into the one block. + * Each size calculation is adjusted to avoid unaligned pointers. + */ +static void uv__getaddrinfo_done(struct uv__work* w, int status) { + uv_getaddrinfo_t* req; + int addrinfo_len = 0; + int name_len = 0; + size_t addrinfo_struct_len = ALIGNED_SIZE(sizeof(struct addrinfo)); + struct addrinfoW* addrinfow_ptr; + struct addrinfo* addrinfo_ptr; + char* alloc_ptr = NULL; + char* cur_ptr = NULL; + + req = container_of(w, uv_getaddrinfo_t, work_req); + + /* release input parameter memory */ + uv__free(req->alloc); + req->alloc = NULL; + + if (status == UV_ECANCELED) { + assert(req->retcode == 0); + req->retcode = UV_EAI_CANCELED; + goto complete; + } + + if (req->retcode == 0) { + /* convert addrinfoW to addrinfo */ + /* first calculate required length */ + addrinfow_ptr = req->addrinfow; + while (addrinfow_ptr != NULL) { + addrinfo_len += addrinfo_struct_len + + ALIGNED_SIZE(addrinfow_ptr->ai_addrlen); + if (addrinfow_ptr->ai_canonname != NULL) { + name_len = WideCharToMultiByte(CP_UTF8, + 0, + addrinfow_ptr->ai_canonname, + -1, + NULL, + 0, + NULL, + NULL); + if (name_len == 0) { + req->retcode = uv_translate_sys_error(GetLastError()); + goto complete; + } + addrinfo_len += ALIGNED_SIZE(name_len); + } + addrinfow_ptr = addrinfow_ptr->ai_next; + } + + /* allocate memory for addrinfo results */ + alloc_ptr = (char*)uv__malloc(addrinfo_len); + + /* do conversions */ + if (alloc_ptr != NULL) { + cur_ptr = alloc_ptr; + addrinfow_ptr = req->addrinfow; + + while (addrinfow_ptr != NULL) { + /* copy addrinfo struct data */ + assert(cur_ptr + addrinfo_struct_len <= alloc_ptr + addrinfo_len); + addrinfo_ptr = (struct addrinfo*)cur_ptr; + addrinfo_ptr->ai_family = addrinfow_ptr->ai_family; + addrinfo_ptr->ai_socktype = addrinfow_ptr->ai_socktype; + addrinfo_ptr->ai_protocol = addrinfow_ptr->ai_protocol; + addrinfo_ptr->ai_flags = addrinfow_ptr->ai_flags; + addrinfo_ptr->ai_addrlen = addrinfow_ptr->ai_addrlen; + addrinfo_ptr->ai_canonname = NULL; + addrinfo_ptr->ai_addr = NULL; + addrinfo_ptr->ai_next = NULL; + + cur_ptr += addrinfo_struct_len; + + /* copy sockaddr */ + if (addrinfo_ptr->ai_addrlen > 0) { + assert(cur_ptr + addrinfo_ptr->ai_addrlen <= + alloc_ptr + addrinfo_len); + memcpy(cur_ptr, addrinfow_ptr->ai_addr, addrinfo_ptr->ai_addrlen); + addrinfo_ptr->ai_addr = (struct sockaddr*)cur_ptr; + cur_ptr += ALIGNED_SIZE(addrinfo_ptr->ai_addrlen); + } + + /* convert canonical name to UTF-8 */ + if (addrinfow_ptr->ai_canonname != NULL) { + name_len = WideCharToMultiByte(CP_UTF8, + 0, + addrinfow_ptr->ai_canonname, + -1, + NULL, + 0, + NULL, + NULL); + assert(name_len > 0); + assert(cur_ptr + name_len <= alloc_ptr + addrinfo_len); + name_len = WideCharToMultiByte(CP_UTF8, + 0, + addrinfow_ptr->ai_canonname, + -1, + cur_ptr, + name_len, + NULL, + NULL); + assert(name_len > 0); + addrinfo_ptr->ai_canonname = cur_ptr; + cur_ptr += ALIGNED_SIZE(name_len); + } + assert(cur_ptr <= alloc_ptr + addrinfo_len); + + /* set next ptr */ + addrinfow_ptr = addrinfow_ptr->ai_next; + if (addrinfow_ptr != NULL) { + addrinfo_ptr->ai_next = (struct addrinfo*)cur_ptr; + } + } + req->addrinfo = (struct addrinfo*)alloc_ptr; + } else { + req->retcode = UV_EAI_MEMORY; + } + } + + /* return memory to system */ + if (req->addrinfow != NULL) { + FreeAddrInfoW(req->addrinfow); + req->addrinfow = NULL; + } + +complete: + uv__req_unregister(req->loop, req); + + /* finally do callback with converted result */ + if (req->getaddrinfo_cb) + req->getaddrinfo_cb(req, req->retcode, req->addrinfo); +} + + +void uv_freeaddrinfo(struct addrinfo* ai) { + char* alloc_ptr = (char*)ai; + + /* release copied result memory */ + uv__free(alloc_ptr); +} + + +/* + * Entry point for getaddrinfo + * we convert the UTF-8 strings to UNICODE + * and save the UNICODE string pointers in the req + * We also copy hints so that caller does not need to keep memory until the + * callback. + * return 0 if a callback will be made + * return error code if validation fails + * + * To minimize allocation we calculate total size required, + * and copy all structs and referenced strings into the one block. + * Each size calculation is adjusted to avoid unaligned pointers. + */ +int uv_getaddrinfo(uv_loop_t* loop, + uv_getaddrinfo_t* req, + uv_getaddrinfo_cb getaddrinfo_cb, + const char* node, + const char* service, + const struct addrinfo* hints) { + int nodesize = 0; + int servicesize = 0; + int hintssize = 0; + char* alloc_ptr = NULL; + int err; + + if (req == NULL || (node == NULL && service == NULL)) { + return UV_EINVAL; + } + + UV_REQ_INIT(req, UV_GETADDRINFO); + req->getaddrinfo_cb = getaddrinfo_cb; + req->addrinfo = NULL; + req->loop = loop; + req->retcode = 0; + + /* calculate required memory size for all input values */ + if (node != NULL) { + nodesize = ALIGNED_SIZE(MultiByteToWideChar(CP_UTF8, 0, node, -1, NULL, 0) * + sizeof(WCHAR)); + if (nodesize == 0) { + err = GetLastError(); + goto error; + } + } + + if (service != NULL) { + servicesize = ALIGNED_SIZE(MultiByteToWideChar(CP_UTF8, + 0, + service, + -1, + NULL, + 0) * + sizeof(WCHAR)); + if (servicesize == 0) { + err = GetLastError(); + goto error; + } + } + if (hints != NULL) { + hintssize = ALIGNED_SIZE(sizeof(struct addrinfoW)); + } + + /* allocate memory for inputs, and partition it as needed */ + alloc_ptr = (char*)uv__malloc(nodesize + servicesize + hintssize); + if (!alloc_ptr) { + err = WSAENOBUFS; + goto error; + } + + /* save alloc_ptr now so we can free if error */ + req->alloc = (void*)alloc_ptr; + + /* convert node string to UTF16 into allocated memory and save pointer in */ + /* the request. */ + if (node != NULL) { + req->node = (WCHAR*)alloc_ptr; + if (MultiByteToWideChar(CP_UTF8, + 0, + node, + -1, + (WCHAR*) alloc_ptr, + nodesize / sizeof(WCHAR)) == 0) { + err = GetLastError(); + goto error; + } + alloc_ptr += nodesize; + } else { + req->node = NULL; + } + + /* convert service string to UTF16 into allocated memory and save pointer */ + /* in the req. */ + if (service != NULL) { + req->service = (WCHAR*)alloc_ptr; + if (MultiByteToWideChar(CP_UTF8, + 0, + service, + -1, + (WCHAR*) alloc_ptr, + servicesize / sizeof(WCHAR)) == 0) { + err = GetLastError(); + goto error; + } + alloc_ptr += servicesize; + } else { + req->service = NULL; + } + + /* copy hints to allocated memory and save pointer in req */ + if (hints != NULL) { + req->addrinfow = (struct addrinfoW*)alloc_ptr; + req->addrinfow->ai_family = hints->ai_family; + req->addrinfow->ai_socktype = hints->ai_socktype; + req->addrinfow->ai_protocol = hints->ai_protocol; + req->addrinfow->ai_flags = hints->ai_flags; + req->addrinfow->ai_addrlen = 0; + req->addrinfow->ai_canonname = NULL; + req->addrinfow->ai_addr = NULL; + req->addrinfow->ai_next = NULL; + } else { + req->addrinfow = NULL; + } + + uv__req_register(loop, req); + + if (getaddrinfo_cb) { + uv__work_submit(loop, + &req->work_req, + uv__getaddrinfo_work, + uv__getaddrinfo_done); + return 0; + } else { + uv__getaddrinfo_work(&req->work_req); + uv__getaddrinfo_done(&req->work_req, 0); + return req->retcode; + } + +error: + if (req != NULL) { + uv__free(req->alloc); + req->alloc = NULL; + } + return uv_translate_sys_error(err); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/getnameinfo.c b/lib/ESPiLight/pilight/libs/libuv/win/getnameinfo.c new file mode 100644 index 0000000..9f10cd2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/getnameinfo.c @@ -0,0 +1,149 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to +* deal in the Software without restriction, including without limitation the +* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +* sell copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +* IN THE SOFTWARE. +*/ + +#include +#include + +#include "uv.h" +#include "internal.h" +#include "req-inl.h" + +#ifndef GetNameInfo +int WSAAPI GetNameInfoW( + const SOCKADDR *pSockaddr, + socklen_t SockaddrLength, + PWCHAR pNodeBuffer, + DWORD NodeBufferSize, + PWCHAR pServiceBuffer, + DWORD ServiceBufferSize, + INT Flags +); +#endif + +static void uv__getnameinfo_work(struct uv__work* w) { + uv_getnameinfo_t* req; + WCHAR host[NI_MAXHOST]; + WCHAR service[NI_MAXSERV]; + int ret = 0; + + req = container_of(w, uv_getnameinfo_t, work_req); + if (GetNameInfoW((struct sockaddr*)&req->storage, + sizeof(req->storage), + host, + ARRAY_SIZE(host), + service, + ARRAY_SIZE(service), + req->flags)) { + ret = WSAGetLastError(); + } + req->retcode = uv__getaddrinfo_translate_error(ret); + + /* convert results to UTF-8 */ + WideCharToMultiByte(CP_UTF8, + 0, + host, + -1, + req->host, + sizeof(req->host), + NULL, + NULL); + + WideCharToMultiByte(CP_UTF8, + 0, + service, + -1, + req->service, + sizeof(req->service), + NULL, + NULL); +} + + +/* +* Called from uv_run when complete. +*/ +static void uv__getnameinfo_done(struct uv__work* w, int status) { + uv_getnameinfo_t* req; + char* host; + char* service; + + req = container_of(w, uv_getnameinfo_t, work_req); + uv__req_unregister(req->loop, req); + host = service = NULL; + + if (status == UV_ECANCELED) { + assert(req->retcode == 0); + req->retcode = UV_EAI_CANCELED; + } else if (req->retcode == 0) { + host = req->host; + service = req->service; + } + + if (req->getnameinfo_cb) + req->getnameinfo_cb(req, req->retcode, host, service); +} + + +/* +* Entry point for getnameinfo +* return 0 if a callback will be made +* return error code if validation fails +*/ +int uv_getnameinfo(uv_loop_t* loop, + uv_getnameinfo_t* req, + uv_getnameinfo_cb getnameinfo_cb, + const struct sockaddr* addr, + int flags) { + if (req == NULL || addr == NULL) + return UV_EINVAL; + + if (addr->sa_family == AF_INET) { + memcpy(&req->storage, + addr, + sizeof(struct sockaddr_in)); + } else if (addr->sa_family == AF_INET6) { + memcpy(&req->storage, + addr, + sizeof(struct sockaddr_in6)); + } else { + return UV_EINVAL; + } + + UV_REQ_INIT(req, UV_GETNAMEINFO); + uv__req_register(loop, req); + + req->getnameinfo_cb = getnameinfo_cb; + req->flags = flags; + req->loop = loop; + req->retcode = 0; + + if (getnameinfo_cb) { + uv__work_submit(loop, + &req->work_req, + uv__getnameinfo_work, + uv__getnameinfo_done); + return 0; + } else { + uv__getnameinfo_work(&req->work_req); + uv__getnameinfo_done(&req->work_req, 0); + return req->retcode; + } +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/handle-inl.h b/lib/ESPiLight/pilight/libs/libuv/win/handle-inl.h new file mode 100644 index 0000000..8d0334c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/handle-inl.h @@ -0,0 +1,179 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_WIN_HANDLE_INL_H_ +#define UV_WIN_HANDLE_INL_H_ + +#include +#include + +#include "uv.h" +#include "internal.h" + + +#define DECREASE_ACTIVE_COUNT(loop, handle) \ + do { \ + if (--(handle)->activecnt == 0 && \ + !((handle)->flags & UV__HANDLE_CLOSING)) { \ + uv__handle_stop((handle)); \ + } \ + assert((handle)->activecnt >= 0); \ + } while (0) + + +#define INCREASE_ACTIVE_COUNT(loop, handle) \ + do { \ + if ((handle)->activecnt++ == 0) { \ + uv__handle_start((handle)); \ + } \ + assert((handle)->activecnt > 0); \ + } while (0) + + +#define DECREASE_PENDING_REQ_COUNT(handle) \ + do { \ + assert(handle->reqs_pending > 0); \ + handle->reqs_pending--; \ + \ + if (handle->flags & UV__HANDLE_CLOSING && \ + handle->reqs_pending == 0) { \ + uv_want_endgame(loop, (uv_handle_t*)handle); \ + } \ + } while (0) + + +#define uv__handle_closing(handle) \ + do { \ + assert(!((handle)->flags & UV__HANDLE_CLOSING)); \ + \ + if (!(((handle)->flags & UV__HANDLE_ACTIVE) && \ + ((handle)->flags & UV__HANDLE_REF))) \ + uv__active_handle_add((uv_handle_t*) (handle)); \ + \ + (handle)->flags |= UV__HANDLE_CLOSING; \ + (handle)->flags &= ~UV__HANDLE_ACTIVE; \ + } while (0) + + +#define uv__handle_close(handle) \ + do { \ + QUEUE_REMOVE(&(handle)->handle_queue); \ + uv__active_handle_rm((uv_handle_t*) (handle)); \ + \ + (handle)->flags |= UV_HANDLE_CLOSED; \ + \ + if ((handle)->close_cb) \ + (handle)->close_cb((uv_handle_t*) (handle)); \ + } while (0) + + +INLINE static void uv_want_endgame(uv_loop_t* loop, uv_handle_t* handle) { + if (!(handle->flags & UV_HANDLE_ENDGAME_QUEUED)) { + handle->flags |= UV_HANDLE_ENDGAME_QUEUED; + + handle->endgame_next = loop->endgame_handles; + loop->endgame_handles = handle; + } +} + + +INLINE static void uv_process_endgames(uv_loop_t* loop) { + uv_handle_t* handle; + + while (loop->endgame_handles) { + handle = loop->endgame_handles; + loop->endgame_handles = handle->endgame_next; + + handle->flags &= ~UV_HANDLE_ENDGAME_QUEUED; + + switch (handle->type) { + case UV_TCP: + uv_tcp_endgame(loop, (uv_tcp_t*) handle); + break; + + case UV_NAMED_PIPE: + uv_pipe_endgame(loop, (uv_pipe_t*) handle); + break; + + case UV_TTY: + uv_tty_endgame(loop, (uv_tty_t*) handle); + break; + + case UV_UDP: + uv_udp_endgame(loop, (uv_udp_t*) handle); + break; + + case UV_POLL: + uv_poll_endgame(loop, (uv_poll_t*) handle); + break; + + case UV_TIMER: + uv_timer_endgame(loop, (uv_timer_t*) handle); + break; + + case UV_PREPARE: + case UV_CHECK: + case UV_IDLE: + uv_loop_watcher_endgame(loop, handle); + break; + + case UV_ASYNC: + uv_async_endgame(loop, (uv_async_t*) handle); + break; + + case UV_SIGNAL: + uv_signal_endgame(loop, (uv_signal_t*) handle); + break; + + case UV_PROCESS: + uv_process_endgame(loop, (uv_process_t*) handle); + break; + + case UV_FS_EVENT: + uv_fs_event_endgame(loop, (uv_fs_event_t*) handle); + break; + + case UV_FS_POLL: + uv__fs_poll_endgame(loop, (uv_fs_poll_t*) handle); + break; + + default: + assert(0); + break; + } + } +} + +INLINE static HANDLE uv__get_osfhandle(int fd) +{ + /* _get_osfhandle() raises an assert in debug builds if the FD is invalid. */ + /* But it also correctly checks the FD and returns INVALID_HANDLE_VALUE */ + /* for invalid FDs in release builds (or if you let the assert continue). */ + /* So this wrapper function disables asserts when calling _get_osfhandle. */ + + HANDLE handle; + UV_BEGIN_DISABLE_CRT_ASSERT(); + handle = (HANDLE) _get_osfhandle(fd); + UV_END_DISABLE_CRT_ASSERT(); + return handle; +} + +#endif /* UV_WIN_HANDLE_INL_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/win/handle.c b/lib/ESPiLight/pilight/libs/libuv/win/handle.c new file mode 100644 index 0000000..3915070 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/handle.c @@ -0,0 +1,159 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include + +#include "uv.h" +#include "internal.h" +#include "handle-inl.h" + + +uv_handle_type uv_guess_handle(uv_file file) { + HANDLE handle; + DWORD mode; + + if (file < 0) { + return UV_UNKNOWN_HANDLE; + } + + handle = uv__get_osfhandle(file); + + switch (GetFileType(handle)) { + case FILE_TYPE_CHAR: + if (GetConsoleMode(handle, &mode)) { + return UV_TTY; + } else { + return UV_FILE; + } + + case FILE_TYPE_PIPE: + return UV_NAMED_PIPE; + + case FILE_TYPE_DISK: + return UV_FILE; + + default: + return UV_UNKNOWN_HANDLE; + } +} + + +int uv_is_active(const uv_handle_t* handle) { + return (handle->flags & UV__HANDLE_ACTIVE) && + !(handle->flags & UV__HANDLE_CLOSING); +} + + +void uv_close(uv_handle_t* handle, uv_close_cb cb) { + uv_loop_t* loop = handle->loop; + + if (handle->flags & UV__HANDLE_CLOSING) { + assert(0); + return; + } + + handle->close_cb = cb; + + /* Handle-specific close actions */ + switch (handle->type) { + case UV_TCP: + uv_tcp_close(loop, (uv_tcp_t*)handle); + return; + + case UV_NAMED_PIPE: + uv_pipe_close(loop, (uv_pipe_t*) handle); + return; + + case UV_TTY: + uv_tty_close((uv_tty_t*) handle); + return; + + case UV_UDP: + uv_udp_close(loop, (uv_udp_t*) handle); + return; + + case UV_POLL: + uv_poll_close(loop, (uv_poll_t*) handle); + return; + + case UV_TIMER: + uv_timer_stop((uv_timer_t*)handle); + uv__handle_closing(handle); + uv_want_endgame(loop, handle); + return; + + case UV_PREPARE: + uv_prepare_stop((uv_prepare_t*)handle); + uv__handle_closing(handle); + uv_want_endgame(loop, handle); + return; + + case UV_CHECK: + uv_check_stop((uv_check_t*)handle); + uv__handle_closing(handle); + uv_want_endgame(loop, handle); + return; + + case UV_IDLE: + uv_idle_stop((uv_idle_t*)handle); + uv__handle_closing(handle); + uv_want_endgame(loop, handle); + return; + + case UV_ASYNC: + uv_async_close(loop, (uv_async_t*) handle); + return; + + case UV_SIGNAL: + uv_signal_close(loop, (uv_signal_t*) handle); + return; + + case UV_PROCESS: + uv_process_close(loop, (uv_process_t*) handle); + return; + + case UV_FS_EVENT: + uv_fs_event_close(loop, (uv_fs_event_t*) handle); + return; + + case UV_FS_POLL: + uv__fs_poll_close((uv_fs_poll_t*) handle); + uv__handle_closing(handle); + uv_want_endgame(loop, handle); + return; + + default: + /* Not supported */ + abort(); + } +} + + +int uv_is_closing(const uv_handle_t* handle) { + return !!(handle->flags & (UV__HANDLE_CLOSING | UV_HANDLE_CLOSED)); +} + + +uv_os_fd_t uv_get_osfhandle(int fd) { + return uv__get_osfhandle(fd); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/internal.h b/lib/ESPiLight/pilight/libs/libuv/win/internal.h new file mode 100644 index 0000000..444327d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/internal.h @@ -0,0 +1,395 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_WIN_INTERNAL_H_ +#define UV_WIN_INTERNAL_H_ + +#include "uv.h" +#include "../uv-common.h" + +#include "tree.h" +#include "winapi.h" +#include "winsock.h" + +#ifdef _MSC_VER +# define INLINE __inline +# define UV_THREAD_LOCAL __declspec( thread ) +#else +# define INLINE inline +# define UV_THREAD_LOCAL __thread +#endif + + +#ifdef _DEBUG + +extern UV_THREAD_LOCAL int uv__crt_assert_enabled; + +#define UV_BEGIN_DISABLE_CRT_ASSERT() \ + { \ + int uv__saved_crt_assert_enabled = uv__crt_assert_enabled; \ + uv__crt_assert_enabled = FALSE; + + +#define UV_END_DISABLE_CRT_ASSERT() \ + uv__crt_assert_enabled = uv__saved_crt_assert_enabled; \ + } + +#else +#define UV_BEGIN_DISABLE_CRT_ASSERT() +#define UV_END_DISABLE_CRT_ASSERT() +#endif + +/* + * Handles + * (also see handle-inl.h) + */ + +/* Used by all handles. */ +#define UV_HANDLE_CLOSED 0x00000002 +#define UV_HANDLE_ENDGAME_QUEUED 0x00000008 + +/* uv-common.h: #define UV__HANDLE_CLOSING 0x00000001 */ +/* uv-common.h: #define UV__HANDLE_ACTIVE 0x00000040 */ +/* uv-common.h: #define UV__HANDLE_REF 0x00000020 */ +/* uv-common.h: #define UV_HANDLE_INTERNAL 0x00000080 */ + +/* Used by streams and UDP handles. */ +#define UV_HANDLE_READING 0x00000100 +#define UV_HANDLE_BOUND 0x00000200 +#define UV_HANDLE_LISTENING 0x00000800 +#define UV_HANDLE_CONNECTION 0x00001000 +#define UV_HANDLE_READABLE 0x00008000 +#define UV_HANDLE_WRITABLE 0x00010000 +#define UV_HANDLE_READ_PENDING 0x00020000 +#define UV_HANDLE_SYNC_BYPASS_IOCP 0x00040000 +#define UV_HANDLE_ZERO_READ 0x00080000 +#define UV_HANDLE_EMULATE_IOCP 0x00100000 +#define UV_HANDLE_BLOCKING_WRITES 0x00200000 +#define UV_HANDLE_CANCELLATION_PENDING 0x00400000 + +/* Used by uv_tcp_t and uv_udp_t handles */ +#define UV_HANDLE_IPV6 0x01000000 + +/* Only used by uv_tcp_t handles. */ +#define UV_HANDLE_TCP_NODELAY 0x02000000 +#define UV_HANDLE_TCP_KEEPALIVE 0x04000000 +#define UV_HANDLE_TCP_SINGLE_ACCEPT 0x08000000 +#define UV_HANDLE_TCP_ACCEPT_STATE_CHANGING 0x10000000 +#define UV_HANDLE_TCP_SOCKET_CLOSED 0x20000000 +#define UV_HANDLE_SHARED_TCP_SOCKET 0x40000000 + +/* Only used by uv_pipe_t handles. */ +#define UV_HANDLE_NON_OVERLAPPED_PIPE 0x01000000 +#define UV_HANDLE_PIPESERVER 0x02000000 +#define UV_HANDLE_PIPE_READ_CANCELABLE 0x04000000 + +/* Only used by uv_tty_t handles. */ +#define UV_HANDLE_TTY_READABLE 0x01000000 +#define UV_HANDLE_TTY_RAW 0x02000000 +#define UV_HANDLE_TTY_SAVED_POSITION 0x04000000 +#define UV_HANDLE_TTY_SAVED_ATTRIBUTES 0x08000000 + +/* Only used by uv_poll_t handles. */ +#define UV_HANDLE_POLL_SLOW 0x02000000 + + +/* + * Requests: see req-inl.h + */ + + +/* + * Streams: see stream-inl.h + */ + + +/* + * TCP + */ + +typedef struct { + WSAPROTOCOL_INFOW socket_info; + int delayed_error; +} uv__ipc_socket_info_ex; + +int uv_tcp_listen(uv_tcp_t* handle, int backlog, uv_connection_cb cb); +int uv_tcp_accept(uv_tcp_t* server, uv_tcp_t* client); +int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb, + uv_read_cb read_cb); +int uv_tcp_write(uv_loop_t* loop, uv_write_t* req, uv_tcp_t* handle, + const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb); +int uv__tcp_try_write(uv_tcp_t* handle, const uv_buf_t bufs[], + unsigned int nbufs); + +void uv_process_tcp_read_req(uv_loop_t* loop, uv_tcp_t* handle, uv_req_t* req); +void uv_process_tcp_write_req(uv_loop_t* loop, uv_tcp_t* handle, + uv_write_t* req); +void uv_process_tcp_accept_req(uv_loop_t* loop, uv_tcp_t* handle, + uv_req_t* req); +void uv_process_tcp_connect_req(uv_loop_t* loop, uv_tcp_t* handle, + uv_connect_t* req); + +void uv_tcp_close(uv_loop_t* loop, uv_tcp_t* tcp); +void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle); + +int uv_tcp_import(uv_tcp_t* tcp, uv__ipc_socket_info_ex* socket_info_ex, + int tcp_connection); + +int uv_tcp_duplicate_socket(uv_tcp_t* handle, int pid, + LPWSAPROTOCOL_INFOW protocol_info); + + +/* + * UDP + */ +void uv_process_udp_recv_req(uv_loop_t* loop, uv_udp_t* handle, uv_req_t* req); +void uv_process_udp_send_req(uv_loop_t* loop, uv_udp_t* handle, + uv_udp_send_t* req); + +void uv_udp_close(uv_loop_t* loop, uv_udp_t* handle); +void uv_udp_endgame(uv_loop_t* loop, uv_udp_t* handle); + + +/* + * Pipes + */ +int uv_stdio_pipe_server(uv_loop_t* loop, uv_pipe_t* handle, DWORD access, + char* name, size_t nameSize); + +int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb); +int uv_pipe_accept(uv_pipe_t* server, uv_stream_t* client); +int uv_pipe_read_start(uv_pipe_t* handle, uv_alloc_cb alloc_cb, + uv_read_cb read_cb); +int uv_pipe_write(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle, + const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb); +int uv_pipe_write2(uv_loop_t* loop, uv_write_t* req, uv_pipe_t* handle, + const uv_buf_t bufs[], unsigned int nbufs, uv_stream_t* send_handle, + uv_write_cb cb); +void uv__pipe_pause_read(uv_pipe_t* handle); +void uv__pipe_unpause_read(uv_pipe_t* handle); +void uv__pipe_stop_read(uv_pipe_t* handle); + +void uv_process_pipe_read_req(uv_loop_t* loop, uv_pipe_t* handle, + uv_req_t* req); +void uv_process_pipe_write_req(uv_loop_t* loop, uv_pipe_t* handle, + uv_write_t* req); +void uv_process_pipe_accept_req(uv_loop_t* loop, uv_pipe_t* handle, + uv_req_t* raw_req); +void uv_process_pipe_connect_req(uv_loop_t* loop, uv_pipe_t* handle, + uv_connect_t* req); +void uv_process_pipe_shutdown_req(uv_loop_t* loop, uv_pipe_t* handle, + uv_shutdown_t* req); + +void uv_pipe_close(uv_loop_t* loop, uv_pipe_t* handle); +void uv_pipe_cleanup(uv_loop_t* loop, uv_pipe_t* handle); +void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle); + + +/* + * TTY + */ +void uv_console_init(void); + +int uv_tty_read_start(uv_tty_t* handle, uv_alloc_cb alloc_cb, + uv_read_cb read_cb); +int uv_tty_read_stop(uv_tty_t* handle); +int uv_tty_write(uv_loop_t* loop, uv_write_t* req, uv_tty_t* handle, + const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb); +int uv__tty_try_write(uv_tty_t* handle, const uv_buf_t bufs[], + unsigned int nbufs); +void uv_tty_close(uv_tty_t* handle); + +void uv_process_tty_read_req(uv_loop_t* loop, uv_tty_t* handle, + uv_req_t* req); +void uv_process_tty_write_req(uv_loop_t* loop, uv_tty_t* handle, + uv_write_t* req); +/* TODO: remove me */ +void uv_process_tty_accept_req(uv_loop_t* loop, uv_tty_t* handle, + uv_req_t* raw_req); +/* TODO: remove me */ +void uv_process_tty_connect_req(uv_loop_t* loop, uv_tty_t* handle, + uv_connect_t* req); + +void uv_tty_endgame(uv_loop_t* loop, uv_tty_t* handle); + + +/* + * Poll watchers + */ +void uv_process_poll_req(uv_loop_t* loop, uv_poll_t* handle, + uv_req_t* req); + +int uv_poll_close(uv_loop_t* loop, uv_poll_t* handle); +void uv_poll_endgame(uv_loop_t* loop, uv_poll_t* handle); + + +/* + * Timers + */ +void uv_timer_endgame(uv_loop_t* loop, uv_timer_t* handle); + +DWORD uv__next_timeout(const uv_loop_t* loop); +void uv_process_timers(uv_loop_t* loop); + + +/* + * Loop watchers + */ +void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle); + +void uv_prepare_invoke(uv_loop_t* loop); +void uv_check_invoke(uv_loop_t* loop); +void uv_idle_invoke(uv_loop_t* loop); + +void uv__once_init(void); + + +/* + * Async watcher + */ +void uv_async_close(uv_loop_t* loop, uv_async_t* handle); +void uv_async_endgame(uv_loop_t* loop, uv_async_t* handle); + +void uv_process_async_wakeup_req(uv_loop_t* loop, uv_async_t* handle, + uv_req_t* req); + + +/* + * Signal watcher + */ +void uv_signals_init(void); +int uv__signal_dispatch(int signum); + +void uv_signal_close(uv_loop_t* loop, uv_signal_t* handle); +void uv_signal_endgame(uv_loop_t* loop, uv_signal_t* handle); + +void uv_process_signal_req(uv_loop_t* loop, uv_signal_t* handle, + uv_req_t* req); + + +/* + * Spawn + */ +void uv_process_proc_exit(uv_loop_t* loop, uv_process_t* handle); +void uv_process_close(uv_loop_t* loop, uv_process_t* handle); +void uv_process_endgame(uv_loop_t* loop, uv_process_t* handle); + + +/* + * Error + */ +int uv_translate_sys_error(int sys_errno); + + +/* + * FS + */ +void uv_fs_init(void); + + +/* + * FS Event + */ +void uv_process_fs_event_req(uv_loop_t* loop, uv_req_t* req, + uv_fs_event_t* handle); +void uv_fs_event_close(uv_loop_t* loop, uv_fs_event_t* handle); +void uv_fs_event_endgame(uv_loop_t* loop, uv_fs_event_t* handle); + + +/* + * Stat poller. + */ +void uv__fs_poll_endgame(uv_loop_t* loop, uv_fs_poll_t* handle); + + +/* + * Utilities. + */ +void uv__util_init(void); + +uint64_t uv__hrtime(double scale); +int uv_parent_pid(void); +int uv_current_pid(void); +__declspec(noreturn) void uv_fatal_error(const int errorno, const char* syscall); +int uv__getpwuid_r(uv_passwd_t* pwd); +int uv__convert_utf16_to_utf8(const WCHAR* utf16, int utf16len, char** utf8); +int uv__convert_utf8_to_utf16(const char* utf8, int utf8len, WCHAR** utf16); + + +/* + * Process stdio handles. + */ +int uv__stdio_create(uv_loop_t* loop, + const uv_process_options_t* options, + BYTE** buffer_ptr); +void uv__stdio_destroy(BYTE* buffer); +void uv__stdio_noinherit(BYTE* buffer); +int uv__stdio_verify(BYTE* buffer, WORD size); +WORD uv__stdio_size(BYTE* buffer); +HANDLE uv__stdio_handle(BYTE* buffer, int fd); + + +/* + * Winapi and ntapi utility functions + */ +void uv_winapi_init(void); + + +/* + * Winsock utility functions + */ +void uv_winsock_init(void); + +int uv_ntstatus_to_winsock_error(NTSTATUS status); + +BOOL uv_get_acceptex_function(SOCKET socket, LPFN_ACCEPTEX* target); +BOOL uv_get_connectex_function(SOCKET socket, LPFN_CONNECTEX* target); + +int WSAAPI uv_wsarecv_workaround(SOCKET socket, WSABUF* buffers, + DWORD buffer_count, DWORD* bytes, DWORD* flags, WSAOVERLAPPED *overlapped, + LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); +int WSAAPI uv_wsarecvfrom_workaround(SOCKET socket, WSABUF* buffers, + DWORD buffer_count, DWORD* bytes, DWORD* flags, struct sockaddr* addr, + int* addr_len, WSAOVERLAPPED *overlapped, + LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); + +int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info_in, + AFD_POLL_INFO* info_out, OVERLAPPED* overlapped); + +/* Whether there are any non-IFS LSPs stacked on TCP */ +extern int uv_tcp_non_ifs_lsp_ipv4; +extern int uv_tcp_non_ifs_lsp_ipv6; + +/* Ip address used to bind to any port at any interface */ +extern struct sockaddr_in uv_addr_ip4_any_; +extern struct sockaddr_in6 uv_addr_ip6_any_; + +/* + * Wake all loops with fake message + */ +void uv__wake_all_loops(void); + +/* + * Init system wake-up detection + */ +void uv__init_detect_system_wakeup(void); + +#endif /* UV_WIN_INTERNAL_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/win/loop-watcher.c b/lib/ESPiLight/pilight/libs/libuv/win/loop-watcher.c new file mode 100644 index 0000000..20e4509 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/loop-watcher.c @@ -0,0 +1,122 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include + +#include "uv.h" +#include "internal.h" +#include "handle-inl.h" + + +void uv_loop_watcher_endgame(uv_loop_t* loop, uv_handle_t* handle) { + if (handle->flags & UV__HANDLE_CLOSING) { + assert(!(handle->flags & UV_HANDLE_CLOSED)); + handle->flags |= UV_HANDLE_CLOSED; + uv__handle_close(handle); + } +} + + +#define UV_LOOP_WATCHER_DEFINE(name, NAME) \ + int uv_##name##_init(uv_loop_t* loop, uv_##name##_t* handle) { \ + uv__handle_init(loop, (uv_handle_t*) handle, UV_##NAME); \ + \ + return 0; \ + } \ + \ + \ + int uv_##name##_start(uv_##name##_t* handle, uv_##name##_cb cb) { \ + uv_loop_t* loop = handle->loop; \ + uv_##name##_t* old_head; \ + \ + assert(handle->type == UV_##NAME); \ + \ + if (uv__is_active(handle)) \ + return 0; \ + \ + if (cb == NULL) \ + return UV_EINVAL; \ + \ + old_head = loop->name##_handles; \ + \ + handle->name##_next = old_head; \ + handle->name##_prev = NULL; \ + \ + if (old_head) { \ + old_head->name##_prev = handle; \ + } \ + \ + loop->name##_handles = handle; \ + \ + handle->name##_cb = cb; \ + uv__handle_start(handle); \ + \ + return 0; \ + } \ + \ + \ + int uv_##name##_stop(uv_##name##_t* handle) { \ + uv_loop_t* loop = handle->loop; \ + \ + assert(handle->type == UV_##NAME); \ + \ + if (!uv__is_active(handle)) \ + return 0; \ + \ + /* Update loop head if needed */ \ + if (loop->name##_handles == handle) { \ + loop->name##_handles = handle->name##_next; \ + } \ + \ + /* Update the iterator-next pointer of needed */ \ + if (loop->next_##name##_handle == handle) { \ + loop->next_##name##_handle = handle->name##_next; \ + } \ + \ + if (handle->name##_prev) { \ + handle->name##_prev->name##_next = handle->name##_next; \ + } \ + if (handle->name##_next) { \ + handle->name##_next->name##_prev = handle->name##_prev; \ + } \ + \ + uv__handle_stop(handle); \ + \ + return 0; \ + } \ + \ + \ + void uv_##name##_invoke(uv_loop_t* loop) { \ + uv_##name##_t* handle; \ + \ + (loop)->next_##name##_handle = (loop)->name##_handles; \ + \ + while ((loop)->next_##name##_handle != NULL) { \ + handle = (loop)->next_##name##_handle; \ + (loop)->next_##name##_handle = handle->name##_next; \ + \ + handle->name##_cb(handle); \ + } \ + } + +UV_LOOP_WATCHER_DEFINE(prepare, PREPARE) +UV_LOOP_WATCHER_DEFINE(check, CHECK) +UV_LOOP_WATCHER_DEFINE(idle, IDLE) diff --git a/lib/ESPiLight/pilight/libs/libuv/win/pipe.c b/lib/ESPiLight/pilight/libs/libuv/win/pipe.c new file mode 100644 index 0000000..9b10cc9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/pipe.c @@ -0,0 +1,2132 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include + +#include "uv.h" +#include "internal.h" +#include "handle-inl.h" +#include "stream-inl.h" +#include "req-inl.h" + +typedef struct uv__ipc_queue_item_s uv__ipc_queue_item_t; + +struct uv__ipc_queue_item_s { + /* + * NOTE: It is important for socket_info_ex to be the first field, + * because we will we assigning it to the pending_ipc_info.socket_info + */ + uv__ipc_socket_info_ex socket_info_ex; + QUEUE member; + int tcp_connection; +}; + +/* A zero-size buffer for use by uv_pipe_read */ +static char uv_zero_[] = ""; + +/* Null uv_buf_t */ +static const uv_buf_t uv_null_buf_ = { 0, NULL }; + +/* The timeout that the pipe will wait for the remote end to write data */ +/* when the local ends wants to shut it down. */ +static const int64_t eof_timeout = 50; /* ms */ + +static const int default_pending_pipe_instances = 4; + +/* Pipe prefix */ +static char pipe_prefix[] = "\\\\?\\pipe"; +static const int pipe_prefix_len = sizeof(pipe_prefix) - 1; + +/* IPC protocol flags. */ +#define UV_IPC_RAW_DATA 0x0001 +#define UV_IPC_TCP_SERVER 0x0002 +#define UV_IPC_TCP_CONNECTION 0x0004 + +/* IPC frame header. */ +typedef struct { + int flags; + uint64_t raw_data_length; +} uv_ipc_frame_header_t; + +/* IPC frame, which contains an imported TCP socket stream. */ +typedef struct { + uv_ipc_frame_header_t header; + uv__ipc_socket_info_ex socket_info_ex; +} uv_ipc_frame_uv_stream; + +static void eof_timer_init(uv_pipe_t* pipe); +static void eof_timer_start(uv_pipe_t* pipe); +static void eof_timer_stop(uv_pipe_t* pipe); +static void eof_timer_cb(uv_timer_t* timer); +static void eof_timer_destroy(uv_pipe_t* pipe); +static void eof_timer_close_cb(uv_handle_t* handle); + + +static void uv_unique_pipe_name(char* ptr, char* name, size_t size) { + snprintf(name, size, "\\\\?\\pipe\\uv\\%p-%lu", ptr, GetCurrentProcessId()); +} + + +int uv_pipe_init(uv_loop_t* loop, uv_pipe_t* handle, int ipc) { + uv_stream_init(loop, (uv_stream_t*)handle, UV_NAMED_PIPE); + + handle->reqs_pending = 0; + handle->handle = INVALID_HANDLE_VALUE; + handle->name = NULL; + handle->pipe.conn.ipc_pid = 0; + handle->pipe.conn.remaining_ipc_rawdata_bytes = 0; + QUEUE_INIT(&handle->pipe.conn.pending_ipc_info.queue); + handle->pipe.conn.pending_ipc_info.queue_len = 0; + handle->ipc = ipc; + handle->pipe.conn.non_overlapped_writes_tail = NULL; + handle->pipe.conn.readfile_thread = NULL; + + UV_REQ_INIT(&handle->pipe.conn.ipc_header_write_req, UV_UNKNOWN_REQ); + + return 0; +} + + +static void uv_pipe_connection_init(uv_pipe_t* handle) { + uv_connection_init((uv_stream_t*) handle); + handle->read_req.data = handle; + handle->pipe.conn.eof_timer = NULL; + assert(!(handle->flags & UV_HANDLE_PIPESERVER)); + if (pCancelSynchronousIo && + handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE) { + uv_mutex_init(&handle->pipe.conn.readfile_mutex); + handle->flags |= UV_HANDLE_PIPE_READ_CANCELABLE; + } +} + + +static HANDLE open_named_pipe(const WCHAR* name, DWORD* duplex_flags) { + HANDLE pipeHandle; + + /* + * Assume that we have a duplex pipe first, so attempt to + * connect with GENERIC_READ | GENERIC_WRITE. + */ + pipeHandle = CreateFileW(name, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_FLAG_OVERLAPPED, + NULL); + if (pipeHandle != INVALID_HANDLE_VALUE) { + *duplex_flags = UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; + return pipeHandle; + } + + /* + * If the pipe is not duplex CreateFileW fails with + * ERROR_ACCESS_DENIED. In that case try to connect + * as a read-only or write-only. + */ + if (GetLastError() == ERROR_ACCESS_DENIED) { + pipeHandle = CreateFileW(name, + GENERIC_READ | FILE_WRITE_ATTRIBUTES, + 0, + NULL, + OPEN_EXISTING, + FILE_FLAG_OVERLAPPED, + NULL); + + if (pipeHandle != INVALID_HANDLE_VALUE) { + *duplex_flags = UV_HANDLE_READABLE; + return pipeHandle; + } + } + + if (GetLastError() == ERROR_ACCESS_DENIED) { + pipeHandle = CreateFileW(name, + GENERIC_WRITE | FILE_READ_ATTRIBUTES, + 0, + NULL, + OPEN_EXISTING, + FILE_FLAG_OVERLAPPED, + NULL); + + if (pipeHandle != INVALID_HANDLE_VALUE) { + *duplex_flags = UV_HANDLE_WRITABLE; + return pipeHandle; + } + } + + return INVALID_HANDLE_VALUE; +} + + +static void close_pipe(uv_pipe_t* pipe) { + assert(pipe->u.fd == -1 || pipe->u.fd > 2); + if (pipe->u.fd == -1) + CloseHandle(pipe->handle); + else + close(pipe->u.fd); + + pipe->u.fd = -1; + pipe->handle = INVALID_HANDLE_VALUE; +} + + +int uv_stdio_pipe_server(uv_loop_t* loop, uv_pipe_t* handle, DWORD access, + char* name, size_t nameSize) { + HANDLE pipeHandle; + int err; + char* ptr = (char*)handle; + + for (;;) { + uv_unique_pipe_name(ptr, name, nameSize); + + pipeHandle = CreateNamedPipeA(name, + access | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE, + PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, 65536, 65536, 0, + NULL); + + if (pipeHandle != INVALID_HANDLE_VALUE) { + /* No name collisions. We're done. */ + break; + } + + err = GetLastError(); + if (err != ERROR_PIPE_BUSY && err != ERROR_ACCESS_DENIED) { + goto error; + } + + /* Pipe name collision. Increment the pointer and try again. */ + ptr++; + } + + if (CreateIoCompletionPort(pipeHandle, + loop->iocp, + (ULONG_PTR)handle, + 0) == NULL) { + err = GetLastError(); + goto error; + } + + uv_pipe_connection_init(handle); + handle->handle = pipeHandle; + + return 0; + + error: + if (pipeHandle != INVALID_HANDLE_VALUE) { + CloseHandle(pipeHandle); + } + + return err; +} + + +static int uv_set_pipe_handle(uv_loop_t* loop, + uv_pipe_t* handle, + HANDLE pipeHandle, + int fd, + DWORD duplex_flags) { + NTSTATUS nt_status; + IO_STATUS_BLOCK io_status; + FILE_MODE_INFORMATION mode_info; + DWORD mode = PIPE_READMODE_BYTE | PIPE_WAIT; + DWORD current_mode = 0; + DWORD err = 0; + + if (!(handle->flags & UV_HANDLE_PIPESERVER) && + handle->handle != INVALID_HANDLE_VALUE) + return UV_EBUSY; + + if (!SetNamedPipeHandleState(pipeHandle, &mode, NULL, NULL)) { + err = GetLastError(); + if (err == ERROR_ACCESS_DENIED) { + /* + * SetNamedPipeHandleState can fail if the handle doesn't have either + * GENERIC_WRITE or FILE_WRITE_ATTRIBUTES. + * But if the handle already has the desired wait and blocking modes + * we can continue. + */ + if (!GetNamedPipeHandleState(pipeHandle, ¤t_mode, NULL, NULL, + NULL, NULL, 0)) { + return -1; + } else if (current_mode & PIPE_NOWAIT) { + SetLastError(ERROR_ACCESS_DENIED); + return -1; + } + } else { + /* If this returns ERROR_INVALID_PARAMETER we probably opened + * something that is not a pipe. */ + if (err == ERROR_INVALID_PARAMETER) { + SetLastError(WSAENOTSOCK); + } + return -1; + } + } + + /* Check if the pipe was created with FILE_FLAG_OVERLAPPED. */ + nt_status = pNtQueryInformationFile(pipeHandle, + &io_status, + &mode_info, + sizeof(mode_info), + FileModeInformation); + if (nt_status != STATUS_SUCCESS) { + return -1; + } + + if (mode_info.Mode & FILE_SYNCHRONOUS_IO_ALERT || + mode_info.Mode & FILE_SYNCHRONOUS_IO_NONALERT) { + /* Non-overlapped pipe. */ + handle->flags |= UV_HANDLE_NON_OVERLAPPED_PIPE; + } else { + /* Overlapped pipe. Try to associate with IOCP. */ + if (CreateIoCompletionPort(pipeHandle, + loop->iocp, + (ULONG_PTR)handle, + 0) == NULL) { + handle->flags |= UV_HANDLE_EMULATE_IOCP; + } + } + + handle->handle = pipeHandle; + handle->u.fd = fd; + handle->flags |= duplex_flags; + + return 0; +} + + +static DWORD WINAPI pipe_shutdown_thread_proc(void* parameter) { + uv_loop_t* loop; + uv_pipe_t* handle; + uv_shutdown_t* req; + + req = (uv_shutdown_t*) parameter; + assert(req); + handle = (uv_pipe_t*) req->handle; + assert(handle); + loop = handle->loop; + assert(loop); + + FlushFileBuffers(handle->handle); + + /* Post completed */ + POST_COMPLETION_FOR_REQ(loop, req); + + return 0; +} + + +void uv_pipe_endgame(uv_loop_t* loop, uv_pipe_t* handle) { + int err; + DWORD result; + uv_shutdown_t* req; + NTSTATUS nt_status; + IO_STATUS_BLOCK io_status; + FILE_PIPE_LOCAL_INFORMATION pipe_info; + uv__ipc_queue_item_t* item; + + if (handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { + handle->flags &= ~UV_HANDLE_PIPE_READ_CANCELABLE; + uv_mutex_destroy(&handle->pipe.conn.readfile_mutex); + } + + if ((handle->flags & UV_HANDLE_CONNECTION) && + handle->stream.conn.shutdown_req != NULL && + handle->stream.conn.write_reqs_pending == 0) { + req = handle->stream.conn.shutdown_req; + + /* Clear the shutdown_req field so we don't go here again. */ + handle->stream.conn.shutdown_req = NULL; + + if (handle->flags & UV__HANDLE_CLOSING) { + UNREGISTER_HANDLE_REQ(loop, handle, req); + + /* Already closing. Cancel the shutdown. */ + if (req->cb) { + req->cb(req, UV_ECANCELED); + } + + DECREASE_PENDING_REQ_COUNT(handle); + return; + } + + /* Try to avoid flushing the pipe buffer in the thread pool. */ + nt_status = pNtQueryInformationFile(handle->handle, + &io_status, + &pipe_info, + sizeof pipe_info, + FilePipeLocalInformation); + + if (nt_status != STATUS_SUCCESS) { + /* Failure */ + UNREGISTER_HANDLE_REQ(loop, handle, req); + + handle->flags |= UV_HANDLE_WRITABLE; /* Questionable */ + if (req->cb) { + err = pRtlNtStatusToDosError(nt_status); + req->cb(req, uv_translate_sys_error(err)); + } + + DECREASE_PENDING_REQ_COUNT(handle); + return; + } + + if (pipe_info.OutboundQuota == pipe_info.WriteQuotaAvailable) { + /* Short-circuit, no need to call FlushFileBuffers. */ + uv_insert_pending_req(loop, (uv_req_t*) req); + return; + } + + /* Run FlushFileBuffers in the thread pool. */ + result = QueueUserWorkItem(pipe_shutdown_thread_proc, + req, + WT_EXECUTELONGFUNCTION); + if (result) { + return; + + } else { + /* Failure. */ + UNREGISTER_HANDLE_REQ(loop, handle, req); + + handle->flags |= UV_HANDLE_WRITABLE; /* Questionable */ + if (req->cb) { + err = GetLastError(); + req->cb(req, uv_translate_sys_error(err)); + } + + DECREASE_PENDING_REQ_COUNT(handle); + return; + } + } + + if (handle->flags & UV__HANDLE_CLOSING && + handle->reqs_pending == 0) { + assert(!(handle->flags & UV_HANDLE_CLOSED)); + + if (handle->flags & UV_HANDLE_CONNECTION) { + /* Free pending sockets */ + while (!QUEUE_EMPTY(&handle->pipe.conn.pending_ipc_info.queue)) { + QUEUE* q; + SOCKET socket; + + q = QUEUE_HEAD(&handle->pipe.conn.pending_ipc_info.queue); + QUEUE_REMOVE(q); + item = QUEUE_DATA(q, uv__ipc_queue_item_t, member); + + /* Materialize socket and close it */ + socket = WSASocketW(FROM_PROTOCOL_INFO, + FROM_PROTOCOL_INFO, + FROM_PROTOCOL_INFO, + &item->socket_info_ex.socket_info, + 0, + WSA_FLAG_OVERLAPPED); + uv__free(item); + + if (socket != INVALID_SOCKET) + closesocket(socket); + } + handle->pipe.conn.pending_ipc_info.queue_len = 0; + + if (handle->flags & UV_HANDLE_EMULATE_IOCP) { + if (handle->read_req.wait_handle != INVALID_HANDLE_VALUE) { + UnregisterWait(handle->read_req.wait_handle); + handle->read_req.wait_handle = INVALID_HANDLE_VALUE; + } + if (handle->read_req.event_handle) { + CloseHandle(handle->read_req.event_handle); + handle->read_req.event_handle = NULL; + } + } + } + + if (handle->flags & UV_HANDLE_PIPESERVER) { + assert(handle->pipe.serv.accept_reqs); + uv__free(handle->pipe.serv.accept_reqs); + handle->pipe.serv.accept_reqs = NULL; + } + + uv__handle_close(handle); + } +} + + +void uv_pipe_pending_instances(uv_pipe_t* handle, int count) { + if (handle->flags & UV_HANDLE_BOUND) + return; + handle->pipe.serv.pending_instances = count; + handle->flags |= UV_HANDLE_PIPESERVER; +} + + +/* Creates a pipe server. */ +int uv_pipe_bind(uv_pipe_t* handle, const char* name) { + uv_loop_t* loop = handle->loop; + int i, err, nameSize; + uv_pipe_accept_t* req; + + if (handle->flags & UV_HANDLE_BOUND) { + return UV_EINVAL; + } + + if (!name) { + return UV_EINVAL; + } + + if (!(handle->flags & UV_HANDLE_PIPESERVER)) { + handle->pipe.serv.pending_instances = default_pending_pipe_instances; + } + + handle->pipe.serv.accept_reqs = (uv_pipe_accept_t*) + uv__malloc(sizeof(uv_pipe_accept_t) * handle->pipe.serv.pending_instances); + if (!handle->pipe.serv.accept_reqs) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + + for (i = 0; i < handle->pipe.serv.pending_instances; i++) { + req = &handle->pipe.serv.accept_reqs[i]; + UV_REQ_INIT(req, UV_ACCEPT); + req->data = handle; + req->pipeHandle = INVALID_HANDLE_VALUE; + req->next_pending = NULL; + } + + /* Convert name to UTF16. */ + nameSize = MultiByteToWideChar(CP_UTF8, 0, name, -1, NULL, 0) * sizeof(WCHAR); + handle->name = (WCHAR*)uv__malloc(nameSize); + if (!handle->name) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + + if (!MultiByteToWideChar(CP_UTF8, + 0, + name, + -1, + handle->name, + nameSize / sizeof(WCHAR))) { + err = GetLastError(); + goto error; + } + + /* + * Attempt to create the first pipe with FILE_FLAG_FIRST_PIPE_INSTANCE. + * If this fails then there's already a pipe server for the given pipe name. + */ + handle->pipe.serv.accept_reqs[0].pipeHandle = CreateNamedPipeW(handle->name, + PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | + FILE_FLAG_FIRST_PIPE_INSTANCE, + PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, + PIPE_UNLIMITED_INSTANCES, 65536, 65536, 0, NULL); + + if (handle->pipe.serv.accept_reqs[0].pipeHandle == INVALID_HANDLE_VALUE) { + err = GetLastError(); + if (err == ERROR_ACCESS_DENIED) { + err = WSAEADDRINUSE; /* Translates to UV_EADDRINUSE. */ + } else if (err == ERROR_PATH_NOT_FOUND || err == ERROR_INVALID_NAME) { + err = WSAEACCES; /* Translates to UV_EACCES. */ + } + goto error; + } + + if (uv_set_pipe_handle(loop, + handle, + handle->pipe.serv.accept_reqs[0].pipeHandle, + -1, + 0)) { + err = GetLastError(); + goto error; + } + + handle->pipe.serv.pending_accepts = NULL; + handle->flags |= UV_HANDLE_PIPESERVER; + handle->flags |= UV_HANDLE_BOUND; + + return 0; + +error: + if (handle->name) { + uv__free(handle->name); + handle->name = NULL; + } + + if (handle->pipe.serv.accept_reqs[0].pipeHandle != INVALID_HANDLE_VALUE) { + CloseHandle(handle->pipe.serv.accept_reqs[0].pipeHandle); + handle->pipe.serv.accept_reqs[0].pipeHandle = INVALID_HANDLE_VALUE; + } + + return uv_translate_sys_error(err); +} + + +static DWORD WINAPI pipe_connect_thread_proc(void* parameter) { + uv_loop_t* loop; + uv_pipe_t* handle; + uv_connect_t* req; + HANDLE pipeHandle = INVALID_HANDLE_VALUE; + DWORD duplex_flags; + + req = (uv_connect_t*) parameter; + assert(req); + handle = (uv_pipe_t*) req->handle; + assert(handle); + loop = handle->loop; + assert(loop); + + /* We're here because CreateFile on a pipe returned ERROR_PIPE_BUSY. */ + /* We wait for the pipe to become available with WaitNamedPipe. */ + while (WaitNamedPipeW(handle->name, 30000)) { + /* The pipe is now available, try to connect. */ + pipeHandle = open_named_pipe(handle->name, &duplex_flags); + if (pipeHandle != INVALID_HANDLE_VALUE) { + break; + } + + SwitchToThread(); + } + + if (pipeHandle != INVALID_HANDLE_VALUE && + !uv_set_pipe_handle(loop, handle, pipeHandle, -1, duplex_flags)) { + SET_REQ_SUCCESS(req); + } else { + SET_REQ_ERROR(req, GetLastError()); + } + + /* Post completed */ + POST_COMPLETION_FOR_REQ(loop, req); + + return 0; +} + + +void uv_pipe_connect(uv_connect_t* req, uv_pipe_t* handle, + const char* name, uv_connect_cb cb) { + uv_loop_t* loop = handle->loop; + int err, nameSize; + HANDLE pipeHandle = INVALID_HANDLE_VALUE; + DWORD duplex_flags; + + UV_REQ_INIT(req, UV_CONNECT); + req->handle = (uv_stream_t*) handle; + req->cb = cb; + + /* Convert name to UTF16. */ + nameSize = MultiByteToWideChar(CP_UTF8, 0, name, -1, NULL, 0) * sizeof(WCHAR); + handle->name = (WCHAR*)uv__malloc(nameSize); + if (!handle->name) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + + if (!MultiByteToWideChar(CP_UTF8, + 0, + name, + -1, + handle->name, + nameSize / sizeof(WCHAR))) { + err = GetLastError(); + goto error; + } + + pipeHandle = open_named_pipe(handle->name, &duplex_flags); + if (pipeHandle == INVALID_HANDLE_VALUE) { + if (GetLastError() == ERROR_PIPE_BUSY) { + /* Wait for the server to make a pipe instance available. */ + if (!QueueUserWorkItem(&pipe_connect_thread_proc, + req, + WT_EXECUTELONGFUNCTION)) { + err = GetLastError(); + goto error; + } + + REGISTER_HANDLE_REQ(loop, handle, req); + handle->reqs_pending++; + + return; + } + + err = GetLastError(); + goto error; + } + + assert(pipeHandle != INVALID_HANDLE_VALUE); + + if (uv_set_pipe_handle(loop, + (uv_pipe_t*) req->handle, + pipeHandle, + -1, + duplex_flags)) { + err = GetLastError(); + goto error; + } + + SET_REQ_SUCCESS(req); + uv_insert_pending_req(loop, (uv_req_t*) req); + handle->reqs_pending++; + REGISTER_HANDLE_REQ(loop, handle, req); + return; + +error: + if (handle->name) { + uv__free(handle->name); + handle->name = NULL; + } + + if (pipeHandle != INVALID_HANDLE_VALUE) { + CloseHandle(pipeHandle); + } + + /* Make this req pending reporting an error. */ + SET_REQ_ERROR(req, err); + uv_insert_pending_req(loop, (uv_req_t*) req); + handle->reqs_pending++; + REGISTER_HANDLE_REQ(loop, handle, req); + return; +} + + +void uv__pipe_pause_read(uv_pipe_t* handle) { + if (handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { + /* Pause the ReadFile task briefly, to work + around the Windows kernel bug that causes + any access to a NamedPipe to deadlock if + any process has called ReadFile */ + HANDLE h; + uv_mutex_lock(&handle->pipe.conn.readfile_mutex); + h = handle->pipe.conn.readfile_thread; + while (h) { + /* spinlock: we expect this to finish quickly, + or we are probably about to deadlock anyways + (in the kernel), so it doesn't matter */ + pCancelSynchronousIo(h); + SwitchToThread(); /* yield thread control briefly */ + h = handle->pipe.conn.readfile_thread; + } + } +} + + +void uv__pipe_unpause_read(uv_pipe_t* handle) { + if (handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { + uv_mutex_unlock(&handle->pipe.conn.readfile_mutex); + } +} + + +void uv__pipe_stop_read(uv_pipe_t* handle) { + handle->flags &= ~UV_HANDLE_READING; + uv__pipe_pause_read((uv_pipe_t*)handle); + uv__pipe_unpause_read((uv_pipe_t*)handle); +} + + +/* Cleans up uv_pipe_t (server or connection) and all resources associated */ +/* with it. */ +void uv_pipe_cleanup(uv_loop_t* loop, uv_pipe_t* handle) { + int i; + HANDLE pipeHandle; + + uv__pipe_stop_read(handle); + + if (handle->name) { + uv__free(handle->name); + handle->name = NULL; + } + + if (handle->flags & UV_HANDLE_PIPESERVER) { + for (i = 0; i < handle->pipe.serv.pending_instances; i++) { + pipeHandle = handle->pipe.serv.accept_reqs[i].pipeHandle; + if (pipeHandle != INVALID_HANDLE_VALUE) { + CloseHandle(pipeHandle); + handle->pipe.serv.accept_reqs[i].pipeHandle = INVALID_HANDLE_VALUE; + } + } + handle->handle = INVALID_HANDLE_VALUE; + } + + if (handle->flags & UV_HANDLE_CONNECTION) { + handle->flags &= ~UV_HANDLE_WRITABLE; + eof_timer_destroy(handle); + } + + if ((handle->flags & UV_HANDLE_CONNECTION) + && handle->handle != INVALID_HANDLE_VALUE) + close_pipe(handle); +} + + +void uv_pipe_close(uv_loop_t* loop, uv_pipe_t* handle) { + if (handle->flags & UV_HANDLE_READING) { + handle->flags &= ~UV_HANDLE_READING; + DECREASE_ACTIVE_COUNT(loop, handle); + } + + if (handle->flags & UV_HANDLE_LISTENING) { + handle->flags &= ~UV_HANDLE_LISTENING; + DECREASE_ACTIVE_COUNT(loop, handle); + } + + uv_pipe_cleanup(loop, handle); + + if (handle->reqs_pending == 0) { + uv_want_endgame(loop, (uv_handle_t*) handle); + } + + handle->flags &= ~(UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); + uv__handle_closing(handle); +} + + +static void uv_pipe_queue_accept(uv_loop_t* loop, uv_pipe_t* handle, + uv_pipe_accept_t* req, BOOL firstInstance) { + assert(handle->flags & UV_HANDLE_LISTENING); + + if (!firstInstance) { + assert(req->pipeHandle == INVALID_HANDLE_VALUE); + + req->pipeHandle = CreateNamedPipeW(handle->name, + PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, + PIPE_UNLIMITED_INSTANCES, 65536, 65536, 0, NULL); + + if (req->pipeHandle == INVALID_HANDLE_VALUE) { + SET_REQ_ERROR(req, GetLastError()); + uv_insert_pending_req(loop, (uv_req_t*) req); + handle->reqs_pending++; + return; + } + + if (uv_set_pipe_handle(loop, handle, req->pipeHandle, -1, 0)) { + CloseHandle(req->pipeHandle); + req->pipeHandle = INVALID_HANDLE_VALUE; + SET_REQ_ERROR(req, GetLastError()); + uv_insert_pending_req(loop, (uv_req_t*) req); + handle->reqs_pending++; + return; + } + } + + assert(req->pipeHandle != INVALID_HANDLE_VALUE); + + /* Prepare the overlapped structure. */ + memset(&(req->u.io.overlapped), 0, sizeof(req->u.io.overlapped)); + + if (!ConnectNamedPipe(req->pipeHandle, &req->u.io.overlapped) && + GetLastError() != ERROR_IO_PENDING) { + if (GetLastError() == ERROR_PIPE_CONNECTED) { + SET_REQ_SUCCESS(req); + } else { + CloseHandle(req->pipeHandle); + req->pipeHandle = INVALID_HANDLE_VALUE; + /* Make this req pending reporting an error. */ + SET_REQ_ERROR(req, GetLastError()); + } + uv_insert_pending_req(loop, (uv_req_t*) req); + handle->reqs_pending++; + return; + } + + handle->reqs_pending++; +} + + +int uv_pipe_accept(uv_pipe_t* server, uv_stream_t* client) { + uv_loop_t* loop = server->loop; + uv_pipe_t* pipe_client; + uv_pipe_accept_t* req; + QUEUE* q; + uv__ipc_queue_item_t* item; + int err; + + if (server->ipc) { + if (QUEUE_EMPTY(&server->pipe.conn.pending_ipc_info.queue)) { + /* No valid pending sockets. */ + return WSAEWOULDBLOCK; + } + + q = QUEUE_HEAD(&server->pipe.conn.pending_ipc_info.queue); + QUEUE_REMOVE(q); + server->pipe.conn.pending_ipc_info.queue_len--; + item = QUEUE_DATA(q, uv__ipc_queue_item_t, member); + + err = uv_tcp_import((uv_tcp_t*)client, + &item->socket_info_ex, + item->tcp_connection); + if (err != 0) + return err; + + uv__free(item); + + } else { + pipe_client = (uv_pipe_t*)client; + + /* Find a connection instance that has been connected, but not yet */ + /* accepted. */ + req = server->pipe.serv.pending_accepts; + + if (!req) { + /* No valid connections found, so we error out. */ + return WSAEWOULDBLOCK; + } + + /* Initialize the client handle and copy the pipeHandle to the client */ + uv_pipe_connection_init(pipe_client); + pipe_client->handle = req->pipeHandle; + pipe_client->flags |= UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; + + /* Prepare the req to pick up a new connection */ + server->pipe.serv.pending_accepts = req->next_pending; + req->next_pending = NULL; + req->pipeHandle = INVALID_HANDLE_VALUE; + + if (!(server->flags & UV__HANDLE_CLOSING)) { + uv_pipe_queue_accept(loop, server, req, FALSE); + } + } + + return 0; +} + + +/* Starts listening for connections for the given pipe. */ +int uv_pipe_listen(uv_pipe_t* handle, int backlog, uv_connection_cb cb) { + uv_loop_t* loop = handle->loop; + int i; + + if (handle->flags & UV_HANDLE_LISTENING) { + handle->stream.serv.connection_cb = cb; + } + + if (!(handle->flags & UV_HANDLE_BOUND)) { + return WSAEINVAL; + } + + if (handle->flags & UV_HANDLE_READING) { + return WSAEISCONN; + } + + if (!(handle->flags & UV_HANDLE_PIPESERVER)) { + return ERROR_NOT_SUPPORTED; + } + + handle->flags |= UV_HANDLE_LISTENING; + INCREASE_ACTIVE_COUNT(loop, handle); + handle->stream.serv.connection_cb = cb; + + /* First pipe handle should have already been created in uv_pipe_bind */ + assert(handle->pipe.serv.accept_reqs[0].pipeHandle != INVALID_HANDLE_VALUE); + + for (i = 0; i < handle->pipe.serv.pending_instances; i++) { + uv_pipe_queue_accept(loop, handle, &handle->pipe.serv.accept_reqs[i], i == 0); + } + + return 0; +} + + +static DWORD WINAPI uv_pipe_zero_readfile_thread_proc(void* parameter) { + int result; + DWORD bytes; + uv_read_t* req = (uv_read_t*) parameter; + uv_pipe_t* handle = (uv_pipe_t*) req->data; + uv_loop_t* loop = handle->loop; + HANDLE hThread = NULL; + DWORD err; + uv_mutex_t *m = &handle->pipe.conn.readfile_mutex; + + assert(req != NULL); + assert(req->type == UV_READ); + assert(handle->type == UV_NAMED_PIPE); + + if (handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { + uv_mutex_lock(m); /* mutex controls *setting* of readfile_thread */ + if (DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), + GetCurrentProcess(), &hThread, + 0, FALSE, DUPLICATE_SAME_ACCESS)) { + handle->pipe.conn.readfile_thread = hThread; + } else { + hThread = NULL; + } + uv_mutex_unlock(m); + } +restart_readfile: + if (handle->flags & UV_HANDLE_READING) { + result = ReadFile(handle->handle, + &uv_zero_, + 0, + &bytes, + NULL); + if (!result) { + err = GetLastError(); + if (err == ERROR_OPERATION_ABORTED && + handle->flags & UV_HANDLE_PIPE_READ_CANCELABLE) { + if (handle->flags & UV_HANDLE_READING) { + /* just a brief break to do something else */ + handle->pipe.conn.readfile_thread = NULL; + /* resume after it is finished */ + uv_mutex_lock(m); + handle->pipe.conn.readfile_thread = hThread; + uv_mutex_unlock(m); + goto restart_readfile; + } else { + result = 1; /* successfully stopped reading */ + } + } + } + } else { + result = 1; /* successfully aborted read before it even started */ + } + if (hThread) { + assert(hThread == handle->pipe.conn.readfile_thread); + /* mutex does not control clearing readfile_thread */ + handle->pipe.conn.readfile_thread = NULL; + uv_mutex_lock(m); + /* only when we hold the mutex lock is it safe to + open or close the handle */ + CloseHandle(hThread); + uv_mutex_unlock(m); + } + + if (!result) { + SET_REQ_ERROR(req, err); + } + + POST_COMPLETION_FOR_REQ(loop, req); + return 0; +} + + +static DWORD WINAPI uv_pipe_writefile_thread_proc(void* parameter) { + int result; + DWORD bytes; + uv_write_t* req = (uv_write_t*) parameter; + uv_pipe_t* handle = (uv_pipe_t*) req->handle; + uv_loop_t* loop = handle->loop; + + assert(req != NULL); + assert(req->type == UV_WRITE); + assert(handle->type == UV_NAMED_PIPE); + assert(req->write_buffer.base); + + result = WriteFile(handle->handle, + req->write_buffer.base, + req->write_buffer.len, + &bytes, + NULL); + + if (!result) { + SET_REQ_ERROR(req, GetLastError()); + } + + POST_COMPLETION_FOR_REQ(loop, req); + return 0; +} + + +static void CALLBACK post_completion_read_wait(void* context, BOOLEAN timed_out) { + uv_read_t* req; + uv_tcp_t* handle; + + req = (uv_read_t*) context; + assert(req != NULL); + handle = (uv_tcp_t*)req->data; + assert(handle != NULL); + assert(!timed_out); + + if (!PostQueuedCompletionStatus(handle->loop->iocp, + req->u.io.overlapped.InternalHigh, + 0, + &req->u.io.overlapped)) { + uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); + } +} + + +static void CALLBACK post_completion_write_wait(void* context, BOOLEAN timed_out) { + uv_write_t* req; + uv_tcp_t* handle; + + req = (uv_write_t*) context; + assert(req != NULL); + handle = (uv_tcp_t*)req->handle; + assert(handle != NULL); + assert(!timed_out); + + if (!PostQueuedCompletionStatus(handle->loop->iocp, + req->u.io.overlapped.InternalHigh, + 0, + &req->u.io.overlapped)) { + uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); + } +} + + +static void uv_pipe_queue_read(uv_loop_t* loop, uv_pipe_t* handle) { + uv_read_t* req; + int result; + + assert(handle->flags & UV_HANDLE_READING); + assert(!(handle->flags & UV_HANDLE_READ_PENDING)); + + assert(handle->handle != INVALID_HANDLE_VALUE); + + req = &handle->read_req; + + if (handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE) { + if (!QueueUserWorkItem(&uv_pipe_zero_readfile_thread_proc, + req, + WT_EXECUTELONGFUNCTION)) { + /* Make this req pending reporting an error. */ + SET_REQ_ERROR(req, GetLastError()); + goto error; + } + } else { + memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); + if (handle->flags & UV_HANDLE_EMULATE_IOCP) { + req->u.io.overlapped.hEvent = (HANDLE) ((uintptr_t) req->event_handle | 1); + } + + /* Do 0-read */ + result = ReadFile(handle->handle, + &uv_zero_, + 0, + NULL, + &req->u.io.overlapped); + + if (!result && GetLastError() != ERROR_IO_PENDING) { + /* Make this req pending reporting an error. */ + SET_REQ_ERROR(req, GetLastError()); + goto error; + } + + if (handle->flags & UV_HANDLE_EMULATE_IOCP) { + if (!req->event_handle) { + req->event_handle = CreateEvent(NULL, 0, 0, NULL); + if (!req->event_handle) { + uv_fatal_error(GetLastError(), "CreateEvent"); + } + } + if (req->wait_handle == INVALID_HANDLE_VALUE) { + if (!RegisterWaitForSingleObject(&req->wait_handle, + req->u.io.overlapped.hEvent, post_completion_read_wait, (void*) req, + INFINITE, WT_EXECUTEINWAITTHREAD)) { + SET_REQ_ERROR(req, GetLastError()); + goto error; + } + } + } + } + + /* Start the eof timer if there is one */ + eof_timer_start(handle); + handle->flags |= UV_HANDLE_READ_PENDING; + handle->reqs_pending++; + return; + +error: + uv_insert_pending_req(loop, (uv_req_t*)req); + handle->flags |= UV_HANDLE_READ_PENDING; + handle->reqs_pending++; +} + + +int uv_pipe_read_start(uv_pipe_t* handle, + uv_alloc_cb alloc_cb, + uv_read_cb read_cb) { + uv_loop_t* loop = handle->loop; + + handle->flags |= UV_HANDLE_READING; + INCREASE_ACTIVE_COUNT(loop, handle); + handle->read_cb = read_cb; + handle->alloc_cb = alloc_cb; + + /* If reading was stopped and then started again, there could still be a */ + /* read request pending. */ + if (!(handle->flags & UV_HANDLE_READ_PENDING)) + uv_pipe_queue_read(loop, handle); + + return 0; +} + + +static void uv_insert_non_overlapped_write_req(uv_pipe_t* handle, + uv_write_t* req) { + req->next_req = NULL; + if (handle->pipe.conn.non_overlapped_writes_tail) { + req->next_req = + handle->pipe.conn.non_overlapped_writes_tail->next_req; + handle->pipe.conn.non_overlapped_writes_tail->next_req = (uv_req_t*)req; + handle->pipe.conn.non_overlapped_writes_tail = req; + } else { + req->next_req = (uv_req_t*)req; + handle->pipe.conn.non_overlapped_writes_tail = req; + } +} + + +static uv_write_t* uv_remove_non_overlapped_write_req(uv_pipe_t* handle) { + uv_write_t* req; + + if (handle->pipe.conn.non_overlapped_writes_tail) { + req = (uv_write_t*)handle->pipe.conn.non_overlapped_writes_tail->next_req; + + if (req == handle->pipe.conn.non_overlapped_writes_tail) { + handle->pipe.conn.non_overlapped_writes_tail = NULL; + } else { + handle->pipe.conn.non_overlapped_writes_tail->next_req = + req->next_req; + } + + return req; + } else { + /* queue empty */ + return NULL; + } +} + + +static void uv_queue_non_overlapped_write(uv_pipe_t* handle) { + uv_write_t* req = uv_remove_non_overlapped_write_req(handle); + if (req) { + if (!QueueUserWorkItem(&uv_pipe_writefile_thread_proc, + req, + WT_EXECUTELONGFUNCTION)) { + uv_fatal_error(GetLastError(), "QueueUserWorkItem"); + } + } +} + + +static int uv_pipe_write_impl(uv_loop_t* loop, + uv_write_t* req, + uv_pipe_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_stream_t* send_handle, + uv_write_cb cb) { + int err; + int result; + uv_tcp_t* tcp_send_handle; + uv_write_t* ipc_header_req = NULL; + uv_ipc_frame_uv_stream ipc_frame; + + if (nbufs != 1 && (nbufs != 0 || !send_handle)) { + return ERROR_NOT_SUPPORTED; + } + + /* Only TCP handles are supported for sharing. */ + if (send_handle && ((send_handle->type != UV_TCP) || + (!(send_handle->flags & UV_HANDLE_BOUND) && + !(send_handle->flags & UV_HANDLE_CONNECTION)))) { + return ERROR_NOT_SUPPORTED; + } + + assert(handle->handle != INVALID_HANDLE_VALUE); + + UV_REQ_INIT(req, UV_WRITE); + req->handle = (uv_stream_t*) handle; + req->cb = cb; + req->ipc_header = 0; + req->event_handle = NULL; + req->wait_handle = INVALID_HANDLE_VALUE; + memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); + + if (handle->ipc) { + assert(!(handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE)); + ipc_frame.header.flags = 0; + + /* Use the IPC framing protocol. */ + if (send_handle) { + tcp_send_handle = (uv_tcp_t*)send_handle; + + if (handle->pipe.conn.ipc_pid == 0) { + handle->pipe.conn.ipc_pid = uv_current_pid(); + } + + err = uv_tcp_duplicate_socket(tcp_send_handle, handle->pipe.conn.ipc_pid, + &ipc_frame.socket_info_ex.socket_info); + if (err) { + return err; + } + + ipc_frame.socket_info_ex.delayed_error = tcp_send_handle->delayed_error; + + ipc_frame.header.flags |= UV_IPC_TCP_SERVER; + + if (tcp_send_handle->flags & UV_HANDLE_CONNECTION) { + ipc_frame.header.flags |= UV_IPC_TCP_CONNECTION; + } + } + + if (nbufs == 1) { + ipc_frame.header.flags |= UV_IPC_RAW_DATA; + ipc_frame.header.raw_data_length = bufs[0].len; + } + + /* + * Use the provided req if we're only doing a single write. + * If we're doing multiple writes, use ipc_header_write_req to do + * the first write, and then use the provided req for the second write. + */ + if (!(ipc_frame.header.flags & UV_IPC_RAW_DATA)) { + ipc_header_req = req; + } else { + /* + * Try to use the preallocated write req if it's available. + * Otherwise allocate a new one. + */ + if (handle->pipe.conn.ipc_header_write_req.type != UV_WRITE) { + ipc_header_req = (uv_write_t*)&handle->pipe.conn.ipc_header_write_req; + } else { + ipc_header_req = (uv_write_t*)uv__malloc(sizeof(uv_write_t)); + if (!ipc_header_req) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + } + + UV_REQ_INIT(ipc_header_req, UV_WRITE); + ipc_header_req->handle = (uv_stream_t*) handle; + ipc_header_req->cb = NULL; + ipc_header_req->ipc_header = 1; + } + + /* Write the header or the whole frame. */ + memset(&ipc_header_req->u.io.overlapped, 0, + sizeof(ipc_header_req->u.io.overlapped)); + + /* Using overlapped IO, but wait for completion before returning. + This write is blocking because ipc_frame is on stack. */ + ipc_header_req->u.io.overlapped.hEvent = CreateEvent(NULL, 1, 0, NULL); + if (!ipc_header_req->u.io.overlapped.hEvent) { + uv_fatal_error(GetLastError(), "CreateEvent"); + } + + result = WriteFile(handle->handle, + &ipc_frame, + ipc_frame.header.flags & UV_IPC_TCP_SERVER ? + sizeof(ipc_frame) : sizeof(ipc_frame.header), + NULL, + &ipc_header_req->u.io.overlapped); + if (!result && GetLastError() != ERROR_IO_PENDING) { + err = GetLastError(); + CloseHandle(ipc_header_req->u.io.overlapped.hEvent); + return err; + } + + if (!result) { + /* Request not completed immediately. Wait for it.*/ + if (WaitForSingleObject(ipc_header_req->u.io.overlapped.hEvent, INFINITE) != + WAIT_OBJECT_0) { + err = GetLastError(); + CloseHandle(ipc_header_req->u.io.overlapped.hEvent); + return err; + } + } + ipc_header_req->u.io.queued_bytes = 0; + CloseHandle(ipc_header_req->u.io.overlapped.hEvent); + ipc_header_req->u.io.overlapped.hEvent = NULL; + + REGISTER_HANDLE_REQ(loop, handle, ipc_header_req); + handle->reqs_pending++; + handle->stream.conn.write_reqs_pending++; + + /* If we don't have any raw data to write - we're done. */ + if (!(ipc_frame.header.flags & UV_IPC_RAW_DATA)) { + return 0; + } + } + + if ((handle->flags & + (UV_HANDLE_BLOCKING_WRITES | UV_HANDLE_NON_OVERLAPPED_PIPE)) == + (UV_HANDLE_BLOCKING_WRITES | UV_HANDLE_NON_OVERLAPPED_PIPE)) { + DWORD bytes; + result = WriteFile(handle->handle, + bufs[0].base, + bufs[0].len, + &bytes, + NULL); + + if (!result) { + err = GetLastError(); + return err; + } else { + /* Request completed immediately. */ + req->u.io.queued_bytes = 0; + } + + REGISTER_HANDLE_REQ(loop, handle, req); + handle->reqs_pending++; + handle->stream.conn.write_reqs_pending++; + POST_COMPLETION_FOR_REQ(loop, req); + return 0; + } else if (handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE) { + req->write_buffer = bufs[0]; + uv_insert_non_overlapped_write_req(handle, req); + if (handle->stream.conn.write_reqs_pending == 0) { + uv_queue_non_overlapped_write(handle); + } + + /* Request queued by the kernel. */ + req->u.io.queued_bytes = bufs[0].len; + handle->write_queue_size += req->u.io.queued_bytes; + } else if (handle->flags & UV_HANDLE_BLOCKING_WRITES) { + /* Using overlapped IO, but wait for completion before returning */ + req->u.io.overlapped.hEvent = CreateEvent(NULL, 1, 0, NULL); + if (!req->u.io.overlapped.hEvent) { + uv_fatal_error(GetLastError(), "CreateEvent"); + } + + result = WriteFile(handle->handle, + bufs[0].base, + bufs[0].len, + NULL, + &req->u.io.overlapped); + + if (!result && GetLastError() != ERROR_IO_PENDING) { + err = GetLastError(); + CloseHandle(req->u.io.overlapped.hEvent); + return err; + } + + if (result) { + /* Request completed immediately. */ + req->u.io.queued_bytes = 0; + } else { + /* Request queued by the kernel. */ + req->u.io.queued_bytes = bufs[0].len; + handle->write_queue_size += req->u.io.queued_bytes; + if (WaitForSingleObject(req->u.io.overlapped.hEvent, INFINITE) != + WAIT_OBJECT_0) { + err = GetLastError(); + CloseHandle(req->u.io.overlapped.hEvent); + return uv_translate_sys_error(err); + } + } + CloseHandle(req->u.io.overlapped.hEvent); + + REGISTER_HANDLE_REQ(loop, handle, req); + handle->reqs_pending++; + handle->stream.conn.write_reqs_pending++; + return 0; + } else { + result = WriteFile(handle->handle, + bufs[0].base, + bufs[0].len, + NULL, + &req->u.io.overlapped); + + if (!result && GetLastError() != ERROR_IO_PENDING) { + return GetLastError(); + } + + if (result) { + /* Request completed immediately. */ + req->u.io.queued_bytes = 0; + } else { + /* Request queued by the kernel. */ + req->u.io.queued_bytes = bufs[0].len; + handle->write_queue_size += req->u.io.queued_bytes; + } + + if (handle->flags & UV_HANDLE_EMULATE_IOCP) { + req->event_handle = CreateEvent(NULL, 0, 0, NULL); + if (!req->event_handle) { + uv_fatal_error(GetLastError(), "CreateEvent"); + } + if (!RegisterWaitForSingleObject(&req->wait_handle, + req->u.io.overlapped.hEvent, post_completion_write_wait, (void*) req, + INFINITE, WT_EXECUTEINWAITTHREAD)) { + return GetLastError(); + } + } + } + + REGISTER_HANDLE_REQ(loop, handle, req); + handle->reqs_pending++; + handle->stream.conn.write_reqs_pending++; + + return 0; +} + + +int uv_pipe_write(uv_loop_t* loop, + uv_write_t* req, + uv_pipe_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_write_cb cb) { + return uv_pipe_write_impl(loop, req, handle, bufs, nbufs, NULL, cb); +} + + +int uv_pipe_write2(uv_loop_t* loop, + uv_write_t* req, + uv_pipe_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_stream_t* send_handle, + uv_write_cb cb) { + if (!handle->ipc) { + return WSAEINVAL; + } + + return uv_pipe_write_impl(loop, req, handle, bufs, nbufs, send_handle, cb); +} + + +static void uv_pipe_read_eof(uv_loop_t* loop, uv_pipe_t* handle, + uv_buf_t buf) { + /* If there is an eof timer running, we don't need it any more, */ + /* so discard it. */ + eof_timer_destroy(handle); + + handle->flags &= ~UV_HANDLE_READABLE; + uv_read_stop((uv_stream_t*) handle); + + handle->read_cb((uv_stream_t*) handle, UV_EOF, &buf); +} + + +static void uv_pipe_read_error(uv_loop_t* loop, uv_pipe_t* handle, int error, + uv_buf_t buf) { + /* If there is an eof timer running, we don't need it any more, */ + /* so discard it. */ + eof_timer_destroy(handle); + + uv_read_stop((uv_stream_t*) handle); + + handle->read_cb((uv_stream_t*)handle, uv_translate_sys_error(error), &buf); +} + + +static void uv_pipe_read_error_or_eof(uv_loop_t* loop, uv_pipe_t* handle, + int error, uv_buf_t buf) { + if (error == ERROR_OPERATION_ABORTED) { + /* do nothing (equivalent to EINTR) */ + } + else if (error == ERROR_BROKEN_PIPE) { + uv_pipe_read_eof(loop, handle, buf); + } else { + uv_pipe_read_error(loop, handle, error, buf); + } +} + + +void uv__pipe_insert_pending_socket(uv_pipe_t* handle, + uv__ipc_socket_info_ex* info, + int tcp_connection) { + uv__ipc_queue_item_t* item; + + item = (uv__ipc_queue_item_t*) uv__malloc(sizeof(*item)); + if (item == NULL) + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + + memcpy(&item->socket_info_ex, info, sizeof(item->socket_info_ex)); + item->tcp_connection = tcp_connection; + QUEUE_INSERT_TAIL(&handle->pipe.conn.pending_ipc_info.queue, &item->member); + handle->pipe.conn.pending_ipc_info.queue_len++; +} + + +void uv_process_pipe_read_req(uv_loop_t* loop, uv_pipe_t* handle, + uv_req_t* req) { + DWORD bytes, avail; + uv_buf_t buf; + uv_ipc_frame_uv_stream ipc_frame; + + assert(handle->type == UV_NAMED_PIPE); + + handle->flags &= ~UV_HANDLE_READ_PENDING; + eof_timer_stop(handle); + + if (!REQ_SUCCESS(req)) { + /* An error occurred doing the 0-read. */ + if (handle->flags & UV_HANDLE_READING) { + uv_pipe_read_error_or_eof(loop, + handle, + GET_REQ_ERROR(req), + uv_null_buf_); + } + } else { + /* Do non-blocking reads until the buffer is empty */ + while (handle->flags & UV_HANDLE_READING) { + if (!PeekNamedPipe(handle->handle, + NULL, + 0, + NULL, + &avail, + NULL)) { + uv_pipe_read_error_or_eof(loop, handle, GetLastError(), uv_null_buf_); + break; + } + + if (avail == 0) { + /* There is nothing to read after all. */ + break; + } + + if (handle->ipc) { + /* Use the IPC framing protocol to read the incoming data. */ + if (handle->pipe.conn.remaining_ipc_rawdata_bytes == 0) { + /* We're reading a new frame. First, read the header. */ + assert(avail >= sizeof(ipc_frame.header)); + + if (!ReadFile(handle->handle, + &ipc_frame.header, + sizeof(ipc_frame.header), + &bytes, + NULL)) { + uv_pipe_read_error_or_eof(loop, handle, GetLastError(), + uv_null_buf_); + break; + } + + assert(bytes == sizeof(ipc_frame.header)); + assert(ipc_frame.header.flags <= (UV_IPC_TCP_SERVER | UV_IPC_RAW_DATA | + UV_IPC_TCP_CONNECTION)); + + if (ipc_frame.header.flags & UV_IPC_TCP_SERVER) { + assert(avail - sizeof(ipc_frame.header) >= + sizeof(ipc_frame.socket_info_ex)); + + /* Read the TCP socket info. */ + if (!ReadFile(handle->handle, + &ipc_frame.socket_info_ex, + sizeof(ipc_frame) - sizeof(ipc_frame.header), + &bytes, + NULL)) { + uv_pipe_read_error_or_eof(loop, handle, GetLastError(), + uv_null_buf_); + break; + } + + assert(bytes == sizeof(ipc_frame) - sizeof(ipc_frame.header)); + + /* Store the pending socket info. */ + uv__pipe_insert_pending_socket( + handle, + &ipc_frame.socket_info_ex, + ipc_frame.header.flags & UV_IPC_TCP_CONNECTION); + } + + if (ipc_frame.header.flags & UV_IPC_RAW_DATA) { + handle->pipe.conn.remaining_ipc_rawdata_bytes = + ipc_frame.header.raw_data_length; + continue; + } + } else { + avail = min(avail, (DWORD)handle->pipe.conn.remaining_ipc_rawdata_bytes); + } + } + + buf = uv_buf_init(NULL, 0); + handle->alloc_cb((uv_handle_t*) handle, avail, &buf); + if (buf.base == NULL || buf.len == 0) { + handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &buf); + break; + } + assert(buf.base != NULL); + + if (ReadFile(handle->handle, + buf.base, + min(buf.len, avail), + &bytes, + NULL)) { + /* Successful read */ + if (handle->ipc) { + assert(handle->pipe.conn.remaining_ipc_rawdata_bytes >= bytes); + handle->pipe.conn.remaining_ipc_rawdata_bytes = + handle->pipe.conn.remaining_ipc_rawdata_bytes - bytes; + } + handle->read_cb((uv_stream_t*)handle, bytes, &buf); + + /* Read again only if bytes == buf.len */ + if (bytes <= buf.len) { + break; + } + } else { + uv_pipe_read_error_or_eof(loop, handle, GetLastError(), buf); + break; + } + } + + /* Post another 0-read if still reading and not closing. */ + if ((handle->flags & UV_HANDLE_READING) && + !(handle->flags & UV_HANDLE_READ_PENDING)) { + uv_pipe_queue_read(loop, handle); + } + } + + DECREASE_PENDING_REQ_COUNT(handle); +} + + +void uv_process_pipe_write_req(uv_loop_t* loop, uv_pipe_t* handle, + uv_write_t* req) { + int err; + + assert(handle->type == UV_NAMED_PIPE); + + assert(handle->write_queue_size >= req->u.io.queued_bytes); + handle->write_queue_size -= req->u.io.queued_bytes; + + UNREGISTER_HANDLE_REQ(loop, handle, req); + + if (handle->flags & UV_HANDLE_EMULATE_IOCP) { + if (req->wait_handle != INVALID_HANDLE_VALUE) { + UnregisterWait(req->wait_handle); + req->wait_handle = INVALID_HANDLE_VALUE; + } + if (req->event_handle) { + CloseHandle(req->event_handle); + req->event_handle = NULL; + } + } + + if (req->ipc_header) { + if (req == &handle->pipe.conn.ipc_header_write_req) { + req->type = UV_UNKNOWN_REQ; + } else { + uv__free(req); + } + } else { + if (req->cb) { + err = GET_REQ_ERROR(req); + req->cb(req, uv_translate_sys_error(err)); + } + } + + handle->stream.conn.write_reqs_pending--; + + if (handle->flags & UV_HANDLE_NON_OVERLAPPED_PIPE && + handle->pipe.conn.non_overlapped_writes_tail) { + assert(handle->stream.conn.write_reqs_pending > 0); + uv_queue_non_overlapped_write(handle); + } + + if (handle->stream.conn.shutdown_req != NULL && + handle->stream.conn.write_reqs_pending == 0) { + uv_want_endgame(loop, (uv_handle_t*)handle); + } + + DECREASE_PENDING_REQ_COUNT(handle); +} + + +void uv_process_pipe_accept_req(uv_loop_t* loop, uv_pipe_t* handle, + uv_req_t* raw_req) { + uv_pipe_accept_t* req = (uv_pipe_accept_t*) raw_req; + + assert(handle->type == UV_NAMED_PIPE); + + if (handle->flags & UV__HANDLE_CLOSING) { + /* The req->pipeHandle should be freed already in uv_pipe_cleanup(). */ + assert(req->pipeHandle == INVALID_HANDLE_VALUE); + DECREASE_PENDING_REQ_COUNT(handle); + return; + } + + if (REQ_SUCCESS(req)) { + assert(req->pipeHandle != INVALID_HANDLE_VALUE); + req->next_pending = handle->pipe.serv.pending_accepts; + handle->pipe.serv.pending_accepts = req; + + if (handle->stream.serv.connection_cb) { + handle->stream.serv.connection_cb((uv_stream_t*)handle, 0); + } + } else { + if (req->pipeHandle != INVALID_HANDLE_VALUE) { + CloseHandle(req->pipeHandle); + req->pipeHandle = INVALID_HANDLE_VALUE; + } + if (!(handle->flags & UV__HANDLE_CLOSING)) { + uv_pipe_queue_accept(loop, handle, req, FALSE); + } + } + + DECREASE_PENDING_REQ_COUNT(handle); +} + + +void uv_process_pipe_connect_req(uv_loop_t* loop, uv_pipe_t* handle, + uv_connect_t* req) { + int err; + + assert(handle->type == UV_NAMED_PIPE); + + UNREGISTER_HANDLE_REQ(loop, handle, req); + + if (req->cb) { + err = 0; + if (REQ_SUCCESS(req)) { + uv_pipe_connection_init(handle); + } else { + err = GET_REQ_ERROR(req); + } + req->cb(req, uv_translate_sys_error(err)); + } + + DECREASE_PENDING_REQ_COUNT(handle); +} + + +void uv_process_pipe_shutdown_req(uv_loop_t* loop, uv_pipe_t* handle, + uv_shutdown_t* req) { + assert(handle->type == UV_NAMED_PIPE); + + UNREGISTER_HANDLE_REQ(loop, handle, req); + + if (handle->flags & UV_HANDLE_READABLE) { + /* Initialize and optionally start the eof timer. Only do this if the */ + /* pipe is readable and we haven't seen EOF come in ourselves. */ + eof_timer_init(handle); + + /* If reading start the timer right now. */ + /* Otherwise uv_pipe_queue_read will start it. */ + if (handle->flags & UV_HANDLE_READ_PENDING) { + eof_timer_start(handle); + } + + } else { + /* This pipe is not readable. We can just close it to let the other end */ + /* know that we're done writing. */ + close_pipe(handle); + } + + if (req->cb) { + req->cb(req, 0); + } + + DECREASE_PENDING_REQ_COUNT(handle); +} + + +static void eof_timer_init(uv_pipe_t* pipe) { + int r; + + assert(pipe->pipe.conn.eof_timer == NULL); + assert(pipe->flags & UV_HANDLE_CONNECTION); + + pipe->pipe.conn.eof_timer = (uv_timer_t*) uv__malloc(sizeof *pipe->pipe.conn.eof_timer); + + r = uv_timer_init(pipe->loop, pipe->pipe.conn.eof_timer); + assert(r == 0); /* timers can't fail */ + pipe->pipe.conn.eof_timer->data = pipe; + uv_unref((uv_handle_t*) pipe->pipe.conn.eof_timer); +} + + +static void eof_timer_start(uv_pipe_t* pipe) { + assert(pipe->flags & UV_HANDLE_CONNECTION); + + if (pipe->pipe.conn.eof_timer != NULL) { + uv_timer_start(pipe->pipe.conn.eof_timer, eof_timer_cb, eof_timeout, 0); + } +} + + +static void eof_timer_stop(uv_pipe_t* pipe) { + assert(pipe->flags & UV_HANDLE_CONNECTION); + + if (pipe->pipe.conn.eof_timer != NULL) { + uv_timer_stop(pipe->pipe.conn.eof_timer); + } +} + + +static void eof_timer_cb(uv_timer_t* timer) { + uv_pipe_t* pipe = (uv_pipe_t*) timer->data; + uv_loop_t* loop = timer->loop; + + assert(pipe->type == UV_NAMED_PIPE); + + /* This should always be true, since we start the timer only */ + /* in uv_pipe_queue_read after successfully calling ReadFile, */ + /* or in uv_process_pipe_shutdown_req if a read is pending, */ + /* and we always immediately stop the timer in */ + /* uv_process_pipe_read_req. */ + assert(pipe->flags & UV_HANDLE_READ_PENDING); + + /* If there are many packets coming off the iocp then the timer callback */ + /* may be called before the read request is coming off the queue. */ + /* Therefore we check here if the read request has completed but will */ + /* be processed later. */ + if ((pipe->flags & UV_HANDLE_READ_PENDING) && + HasOverlappedIoCompleted(&pipe->read_req.u.io.overlapped)) { + return; + } + + /* Force both ends off the pipe. */ + close_pipe(pipe); + + /* Stop reading, so the pending read that is going to fail will */ + /* not be reported to the user. */ + uv_read_stop((uv_stream_t*) pipe); + + /* Report the eof and update flags. This will get reported even if the */ + /* user stopped reading in the meantime. TODO: is that okay? */ + uv_pipe_read_eof(loop, pipe, uv_null_buf_); +} + + +static void eof_timer_destroy(uv_pipe_t* pipe) { + assert(pipe->flags & UV_HANDLE_CONNECTION); + + if (pipe->pipe.conn.eof_timer) { + uv_close((uv_handle_t*) pipe->pipe.conn.eof_timer, eof_timer_close_cb); + pipe->pipe.conn.eof_timer = NULL; + } +} + + +static void eof_timer_close_cb(uv_handle_t* handle) { + assert(handle->type == UV_TIMER); + uv__free(handle); +} + + +int uv_pipe_open(uv_pipe_t* pipe, uv_file file) { + HANDLE os_handle = uv__get_osfhandle(file); + NTSTATUS nt_status; + IO_STATUS_BLOCK io_status; + FILE_ACCESS_INFORMATION access; + DWORD duplex_flags = 0; + + if (os_handle == INVALID_HANDLE_VALUE) + return UV_EBADF; + + /* In order to avoid closing a stdio file descriptor 0-2, duplicate the + * underlying OS handle and forget about the original fd. + * We could also opt to use the original OS handle and just never close it, + * but then there would be no reliable way to cancel pending read operations + * upon close. + */ + if (file <= 2) { + if (!DuplicateHandle(INVALID_HANDLE_VALUE, + os_handle, + INVALID_HANDLE_VALUE, + &os_handle, + 0, + FALSE, + DUPLICATE_SAME_ACCESS)) + return uv_translate_sys_error(GetLastError()); + file = -1; + } + + /* Determine what kind of permissions we have on this handle. + * Cygwin opens the pipe in message mode, but we can support it, + * just query the access flags and set the stream flags accordingly. + */ + nt_status = pNtQueryInformationFile(os_handle, + &io_status, + &access, + sizeof(access), + FileAccessInformation); + if (nt_status != STATUS_SUCCESS) + return UV_EINVAL; + + if (pipe->ipc) { + if (!(access.AccessFlags & FILE_WRITE_DATA) || + !(access.AccessFlags & FILE_READ_DATA)) { + return UV_EINVAL; + } + } + + if (access.AccessFlags & FILE_WRITE_DATA) + duplex_flags |= UV_HANDLE_WRITABLE; + if (access.AccessFlags & FILE_READ_DATA) + duplex_flags |= UV_HANDLE_READABLE; + + if (os_handle == INVALID_HANDLE_VALUE || + uv_set_pipe_handle(pipe->loop, + pipe, + os_handle, + file, + duplex_flags) == -1) { + return UV_EINVAL; + } + + uv_pipe_connection_init(pipe); + + if (pipe->ipc) { + assert(!(pipe->flags & UV_HANDLE_NON_OVERLAPPED_PIPE)); + pipe->pipe.conn.ipc_pid = uv_parent_pid(); + assert(pipe->pipe.conn.ipc_pid != -1); + } + return 0; +} + + +static int uv__pipe_getname(const uv_pipe_t* handle, char* buffer, size_t* size) { + NTSTATUS nt_status; + IO_STATUS_BLOCK io_status; + FILE_NAME_INFORMATION tmp_name_info; + FILE_NAME_INFORMATION* name_info; + WCHAR* name_buf; + unsigned int addrlen; + unsigned int name_size; + unsigned int name_len; + int err; + + name_info = NULL; + + if (handle->handle == INVALID_HANDLE_VALUE) { + *size = 0; + return UV_EINVAL; + } + + uv__pipe_pause_read((uv_pipe_t*)handle); /* cast away const warning */ + + nt_status = pNtQueryInformationFile(handle->handle, + &io_status, + &tmp_name_info, + sizeof tmp_name_info, + FileNameInformation); + if (nt_status == STATUS_BUFFER_OVERFLOW) { + name_size = sizeof(*name_info) + tmp_name_info.FileNameLength; + name_info = uv__malloc(name_size); + if (!name_info) { + *size = 0; + err = UV_ENOMEM; + goto cleanup; + } + + nt_status = pNtQueryInformationFile(handle->handle, + &io_status, + name_info, + name_size, + FileNameInformation); + } + + if (nt_status != STATUS_SUCCESS) { + *size = 0; + err = uv_translate_sys_error(pRtlNtStatusToDosError(nt_status)); + goto error; + } + + if (!name_info) { + /* the struct on stack was used */ + name_buf = tmp_name_info.FileName; + name_len = tmp_name_info.FileNameLength; + } else { + name_buf = name_info->FileName; + name_len = name_info->FileNameLength; + } + + if (name_len == 0) { + *size = 0; + err = 0; + goto error; + } + + name_len /= sizeof(WCHAR); + + /* check how much space we need */ + addrlen = WideCharToMultiByte(CP_UTF8, + 0, + name_buf, + name_len, + NULL, + 0, + NULL, + NULL); + if (!addrlen) { + *size = 0; + err = uv_translate_sys_error(GetLastError()); + goto error; + } else if (pipe_prefix_len + addrlen >= *size) { + /* "\\\\.\\pipe" + name */ + *size = pipe_prefix_len + addrlen + 1; + err = UV_ENOBUFS; + goto error; + } + + memcpy(buffer, pipe_prefix, pipe_prefix_len); + addrlen = WideCharToMultiByte(CP_UTF8, + 0, + name_buf, + name_len, + buffer+pipe_prefix_len, + *size-pipe_prefix_len, + NULL, + NULL); + if (!addrlen) { + *size = 0; + err = uv_translate_sys_error(GetLastError()); + goto error; + } + + addrlen += pipe_prefix_len; + *size = addrlen; + buffer[addrlen] = '\0'; + + err = 0; + +error: + uv__free(name_info); + +cleanup: + uv__pipe_unpause_read((uv_pipe_t*)handle); /* cast away const warning */ + return err; +} + + +int uv_pipe_pending_count(uv_pipe_t* handle) { + if (!handle->ipc) + return 0; + return handle->pipe.conn.pending_ipc_info.queue_len; +} + + +int uv_pipe_getsockname(const uv_pipe_t* handle, char* buffer, size_t* size) { + if (handle->flags & UV_HANDLE_BOUND) + return uv__pipe_getname(handle, buffer, size); + + if (handle->flags & UV_HANDLE_CONNECTION || + handle->handle != INVALID_HANDLE_VALUE) { + *size = 0; + return 0; + } + + return UV_EBADF; +} + + +int uv_pipe_getpeername(const uv_pipe_t* handle, char* buffer, size_t* size) { + /* emulate unix behaviour */ + if (handle->flags & UV_HANDLE_BOUND) + return UV_ENOTCONN; + + if (handle->handle != INVALID_HANDLE_VALUE) + return uv__pipe_getname(handle, buffer, size); + + return UV_EBADF; +} + + +uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle) { + if (!handle->ipc) + return UV_UNKNOWN_HANDLE; + if (handle->pipe.conn.pending_ipc_info.queue_len == 0) + return UV_UNKNOWN_HANDLE; + else + return UV_TCP; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/poll.c b/lib/ESPiLight/pilight/libs/libuv/win/poll.c new file mode 100644 index 0000000..a648ba7 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/poll.c @@ -0,0 +1,644 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include + +#include "uv.h" +#include "internal.h" +#include "handle-inl.h" +#include "req-inl.h" + + +static const GUID uv_msafd_provider_ids[UV_MSAFD_PROVIDER_COUNT] = { + {0xe70f1aa0, 0xab8b, 0x11cf, + {0x8c, 0xa3, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}}, + {0xf9eab0c0, 0x26d4, 0x11d0, + {0xbb, 0xbf, 0x00, 0xaa, 0x00, 0x6c, 0x34, 0xe4}}, + {0x9fc48064, 0x7298, 0x43e4, + {0xb7, 0xbd, 0x18, 0x1f, 0x20, 0x89, 0x79, 0x2a}} +}; + +typedef struct uv_single_fd_set_s { + unsigned int fd_count; + SOCKET fd_array[1]; +} uv_single_fd_set_t; + + +static OVERLAPPED overlapped_dummy_; +static uv_once_t overlapped_dummy_init_guard_ = UV_ONCE_INIT; + +static AFD_POLL_INFO afd_poll_info_dummy_; + + +static void uv__init_overlapped_dummy(void) { + HANDLE event; + + event = CreateEvent(NULL, TRUE, TRUE, NULL); + if (event == NULL) + uv_fatal_error(GetLastError(), "CreateEvent"); + + memset(&overlapped_dummy_, 0, sizeof overlapped_dummy_); + overlapped_dummy_.hEvent = (HANDLE) ((uintptr_t) event | 1); +} + + +static OVERLAPPED* uv__get_overlapped_dummy(void) { + uv_once(&overlapped_dummy_init_guard_, uv__init_overlapped_dummy); + return &overlapped_dummy_; +} + + +static AFD_POLL_INFO* uv__get_afd_poll_info_dummy(void) { + return &afd_poll_info_dummy_; +} + + +static void uv__fast_poll_submit_poll_req(uv_loop_t* loop, uv_poll_t* handle) { + uv_req_t* req; + AFD_POLL_INFO* afd_poll_info; + DWORD result; + + /* Find a yet unsubmitted req to submit. */ + if (handle->submitted_events_1 == 0) { + req = &handle->poll_req_1; + afd_poll_info = &handle->afd_poll_info_1; + handle->submitted_events_1 = handle->events; + handle->mask_events_1 = 0; + handle->mask_events_2 = handle->events; + } else if (handle->submitted_events_2 == 0) { + req = &handle->poll_req_2; + afd_poll_info = &handle->afd_poll_info_2; + handle->submitted_events_2 = handle->events; + handle->mask_events_1 = handle->events; + handle->mask_events_2 = 0; + } else { + /* Just wait until there's an unsubmitted req. */ + /* This will happen almost immediately as one of the 2 outstanding */ + /* requests is about to return. When this happens, */ + /* uv__fast_poll_process_poll_req will be called, and the pending */ + /* events, if needed, will be processed in a subsequent request. */ + return; + } + + /* Setting Exclusive to TRUE makes the other poll request return if there */ + /* is any. */ + afd_poll_info->Exclusive = TRUE; + afd_poll_info->NumberOfHandles = 1; + afd_poll_info->Timeout.QuadPart = INT64_MAX; + afd_poll_info->Handles[0].Handle = (HANDLE) handle->socket; + afd_poll_info->Handles[0].Status = 0; + afd_poll_info->Handles[0].Events = 0; + + if (handle->events & UV_READABLE) { + afd_poll_info->Handles[0].Events |= AFD_POLL_RECEIVE | + AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT | AFD_POLL_ABORT; + } else { + if (handle->events & UV_DISCONNECT) { + afd_poll_info->Handles[0].Events |= AFD_POLL_DISCONNECT; + } + } + if (handle->events & UV_WRITABLE) { + afd_poll_info->Handles[0].Events |= AFD_POLL_SEND | AFD_POLL_CONNECT_FAIL; + } + + memset(&req->u.io.overlapped, 0, sizeof req->u.io.overlapped); + + result = uv_msafd_poll((SOCKET) handle->peer_socket, + afd_poll_info, + afd_poll_info, + &req->u.io.overlapped); + if (result != 0 && WSAGetLastError() != WSA_IO_PENDING) { + /* Queue this req, reporting an error. */ + SET_REQ_ERROR(req, WSAGetLastError()); + uv_insert_pending_req(loop, req); + } +} + + +static int uv__fast_poll_cancel_poll_req(uv_loop_t* loop, uv_poll_t* handle) { + AFD_POLL_INFO afd_poll_info; + DWORD result; + + afd_poll_info.Exclusive = TRUE; + afd_poll_info.NumberOfHandles = 1; + afd_poll_info.Timeout.QuadPart = INT64_MAX; + afd_poll_info.Handles[0].Handle = (HANDLE) handle->socket; + afd_poll_info.Handles[0].Status = 0; + afd_poll_info.Handles[0].Events = AFD_POLL_ALL; + + result = uv_msafd_poll(handle->socket, + &afd_poll_info, + uv__get_afd_poll_info_dummy(), + uv__get_overlapped_dummy()); + + if (result == SOCKET_ERROR) { + DWORD error = WSAGetLastError(); + if (error != WSA_IO_PENDING) + return error; + } + + return 0; +} + + +static void uv__fast_poll_process_poll_req(uv_loop_t* loop, uv_poll_t* handle, + uv_req_t* req) { + unsigned char mask_events; + AFD_POLL_INFO* afd_poll_info; + + if (req == &handle->poll_req_1) { + afd_poll_info = &handle->afd_poll_info_1; + handle->submitted_events_1 = 0; + mask_events = handle->mask_events_1; + } else if (req == &handle->poll_req_2) { + afd_poll_info = &handle->afd_poll_info_2; + handle->submitted_events_2 = 0; + mask_events = handle->mask_events_2; + } else { + assert(0); + return; + } + + /* Report an error unless the select was just interrupted. */ + if (!REQ_SUCCESS(req)) { + DWORD error = GET_REQ_SOCK_ERROR(req); + if (error != WSAEINTR && handle->events != 0) { + handle->events = 0; /* Stop the watcher */ + handle->poll_cb(handle, uv_translate_sys_error(error), 0); + } + + } else if (afd_poll_info->NumberOfHandles >= 1) { + unsigned char events = 0; + + if ((afd_poll_info->Handles[0].Events & (AFD_POLL_RECEIVE | + AFD_POLL_DISCONNECT | AFD_POLL_ACCEPT | AFD_POLL_ABORT)) != 0) { + events |= UV_READABLE; + if ((afd_poll_info->Handles[0].Events & AFD_POLL_DISCONNECT) != 0) { + events |= UV_DISCONNECT; + } + } + if ((afd_poll_info->Handles[0].Events & (AFD_POLL_SEND | + AFD_POLL_CONNECT_FAIL)) != 0) { + events |= UV_WRITABLE; + } + + events &= handle->events & ~mask_events; + + if (afd_poll_info->Handles[0].Events & AFD_POLL_LOCAL_CLOSE) { + /* Stop polling. */ + handle->events = 0; + if (uv__is_active(handle)) + uv__handle_stop(handle); + } + + if (events != 0) { + handle->poll_cb(handle, 0, events); + } + } + + if ((handle->events & ~(handle->submitted_events_1 | + handle->submitted_events_2)) != 0) { + uv__fast_poll_submit_poll_req(loop, handle); + } else if ((handle->flags & UV__HANDLE_CLOSING) && + handle->submitted_events_1 == 0 && + handle->submitted_events_2 == 0) { + uv_want_endgame(loop, (uv_handle_t*) handle); + } +} + + +static int uv__fast_poll_set(uv_loop_t* loop, uv_poll_t* handle, int events) { + assert(handle->type == UV_POLL); + assert(!(handle->flags & UV__HANDLE_CLOSING)); + assert((events & ~(UV_READABLE | UV_WRITABLE | UV_DISCONNECT)) == 0); + + handle->events = events; + + if (handle->events != 0) { + uv__handle_start(handle); + } else { + uv__handle_stop(handle); + } + + if ((handle->events & ~(handle->submitted_events_1 | + handle->submitted_events_2)) != 0) { + uv__fast_poll_submit_poll_req(handle->loop, handle); + } + + return 0; +} + + +static int uv__fast_poll_close(uv_loop_t* loop, uv_poll_t* handle) { + handle->events = 0; + uv__handle_closing(handle); + + if (handle->submitted_events_1 == 0 && + handle->submitted_events_2 == 0) { + uv_want_endgame(loop, (uv_handle_t*) handle); + return 0; + } else { + /* Cancel outstanding poll requests by executing another, unique poll */ + /* request that forces the outstanding ones to return. */ + return uv__fast_poll_cancel_poll_req(loop, handle); + } +} + + +static SOCKET uv__fast_poll_create_peer_socket(HANDLE iocp, + WSAPROTOCOL_INFOW* protocol_info) { + SOCKET sock = 0; + + sock = WSASocketW(protocol_info->iAddressFamily, + protocol_info->iSocketType, + protocol_info->iProtocol, + protocol_info, + 0, + WSA_FLAG_OVERLAPPED); + if (sock == INVALID_SOCKET) { + return INVALID_SOCKET; + } + + if (!SetHandleInformation((HANDLE) sock, HANDLE_FLAG_INHERIT, 0)) { + goto error; + }; + + if (CreateIoCompletionPort((HANDLE) sock, + iocp, + (ULONG_PTR) sock, + 0) == NULL) { + goto error; + } + + return sock; + + error: + closesocket(sock); + return INVALID_SOCKET; +} + + +static SOCKET uv__fast_poll_get_peer_socket(uv_loop_t* loop, + WSAPROTOCOL_INFOW* protocol_info) { + int index, i; + SOCKET peer_socket; + + index = -1; + for (i = 0; (size_t) i < ARRAY_SIZE(uv_msafd_provider_ids); i++) { + if (memcmp((void*) &protocol_info->ProviderId, + (void*) &uv_msafd_provider_ids[i], + sizeof protocol_info->ProviderId) == 0) { + index = i; + } + } + + /* Check if the protocol uses an msafd socket. */ + if (index < 0) { + return INVALID_SOCKET; + } + + /* If we didn't (try) to create a peer socket yet, try to make one. Don't */ + /* try again if the peer socket creation failed earlier for the same */ + /* protocol. */ + peer_socket = loop->poll_peer_sockets[index]; + if (peer_socket == 0) { + peer_socket = uv__fast_poll_create_peer_socket(loop->iocp, protocol_info); + loop->poll_peer_sockets[index] = peer_socket; + } + + return peer_socket; +} + + +static DWORD WINAPI uv__slow_poll_thread_proc(void* arg) { + uv_req_t* req = (uv_req_t*) arg; + uv_poll_t* handle = (uv_poll_t*) req->data; + unsigned char reported_events; + int r; + uv_single_fd_set_t rfds, wfds, efds; + struct timeval timeout; + + assert(handle->type == UV_POLL); + assert(req->type == UV_POLL_REQ); + + if (handle->events & UV_READABLE) { + rfds.fd_count = 1; + rfds.fd_array[0] = handle->socket; + } else { + rfds.fd_count = 0; + } + + if (handle->events & UV_WRITABLE) { + wfds.fd_count = 1; + wfds.fd_array[0] = handle->socket; + efds.fd_count = 1; + efds.fd_array[0] = handle->socket; + } else { + wfds.fd_count = 0; + efds.fd_count = 0; + } + + /* Make the select() time out after 3 minutes. If select() hangs because */ + /* the user closed the socket, we will at least not hang indefinitely. */ + timeout.tv_sec = 3 * 60; + timeout.tv_usec = 0; + + r = select(1, (fd_set*) &rfds, (fd_set*) &wfds, (fd_set*) &efds, &timeout); + if (r == SOCKET_ERROR) { + /* Queue this req, reporting an error. */ + SET_REQ_ERROR(&handle->poll_req_1, WSAGetLastError()); + POST_COMPLETION_FOR_REQ(handle->loop, req); + return 0; + } + + reported_events = 0; + + if (r > 0) { + if (rfds.fd_count > 0) { + assert(rfds.fd_count == 1); + assert(rfds.fd_array[0] == handle->socket); + reported_events |= UV_READABLE; + } + + if (wfds.fd_count > 0) { + assert(wfds.fd_count == 1); + assert(wfds.fd_array[0] == handle->socket); + reported_events |= UV_WRITABLE; + } else if (efds.fd_count > 0) { + assert(efds.fd_count == 1); + assert(efds.fd_array[0] == handle->socket); + reported_events |= UV_WRITABLE; + } + } + + SET_REQ_SUCCESS(req); + req->u.io.overlapped.InternalHigh = (DWORD) reported_events; + POST_COMPLETION_FOR_REQ(handle->loop, req); + + return 0; +} + + +static void uv__slow_poll_submit_poll_req(uv_loop_t* loop, uv_poll_t* handle) { + uv_req_t* req; + + /* Find a yet unsubmitted req to submit. */ + if (handle->submitted_events_1 == 0) { + req = &handle->poll_req_1; + handle->submitted_events_1 = handle->events; + handle->mask_events_1 = 0; + handle->mask_events_2 = handle->events; + } else if (handle->submitted_events_2 == 0) { + req = &handle->poll_req_2; + handle->submitted_events_2 = handle->events; + handle->mask_events_1 = handle->events; + handle->mask_events_2 = 0; + } else { + assert(0); + return; + } + + if (!QueueUserWorkItem(uv__slow_poll_thread_proc, + (void*) req, + WT_EXECUTELONGFUNCTION)) { + /* Make this req pending, reporting an error. */ + SET_REQ_ERROR(req, GetLastError()); + uv_insert_pending_req(loop, req); + } +} + + + +static void uv__slow_poll_process_poll_req(uv_loop_t* loop, uv_poll_t* handle, + uv_req_t* req) { + unsigned char mask_events; + int err; + + if (req == &handle->poll_req_1) { + handle->submitted_events_1 = 0; + mask_events = handle->mask_events_1; + } else if (req == &handle->poll_req_2) { + handle->submitted_events_2 = 0; + mask_events = handle->mask_events_2; + } else { + assert(0); + return; + } + + if (!REQ_SUCCESS(req)) { + /* Error. */ + if (handle->events != 0) { + err = GET_REQ_ERROR(req); + handle->events = 0; /* Stop the watcher */ + handle->poll_cb(handle, uv_translate_sys_error(err), 0); + } + } else { + /* Got some events. */ + int events = req->u.io.overlapped.InternalHigh & handle->events & ~mask_events; + if (events != 0) { + handle->poll_cb(handle, 0, events); + } + } + + if ((handle->events & ~(handle->submitted_events_1 | + handle->submitted_events_2)) != 0) { + uv__slow_poll_submit_poll_req(loop, handle); + } else if ((handle->flags & UV__HANDLE_CLOSING) && + handle->submitted_events_1 == 0 && + handle->submitted_events_2 == 0) { + uv_want_endgame(loop, (uv_handle_t*) handle); + } +} + + +static int uv__slow_poll_set(uv_loop_t* loop, uv_poll_t* handle, int events) { + assert(handle->type == UV_POLL); + assert(!(handle->flags & UV__HANDLE_CLOSING)); + assert((events & ~(UV_READABLE | UV_WRITABLE)) == 0); + + handle->events = events; + + if (handle->events != 0) { + uv__handle_start(handle); + } else { + uv__handle_stop(handle); + } + + if ((handle->events & + ~(handle->submitted_events_1 | handle->submitted_events_2)) != 0) { + uv__slow_poll_submit_poll_req(handle->loop, handle); + } + + return 0; +} + + +static int uv__slow_poll_close(uv_loop_t* loop, uv_poll_t* handle) { + handle->events = 0; + uv__handle_closing(handle); + + if (handle->submitted_events_1 == 0 && + handle->submitted_events_2 == 0) { + uv_want_endgame(loop, (uv_handle_t*) handle); + } + + return 0; +} + + +int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd) { + return uv_poll_init_socket(loop, handle, (SOCKET) uv__get_osfhandle(fd)); +} + + +int uv_poll_init_socket(uv_loop_t* loop, uv_poll_t* handle, + uv_os_sock_t socket) { + WSAPROTOCOL_INFOW protocol_info; + int len; + SOCKET peer_socket, base_socket; + DWORD bytes; + DWORD yes = 1; + + /* Set the socket to nonblocking mode */ + if (ioctlsocket(socket, FIONBIO, &yes) == SOCKET_ERROR) + return uv_translate_sys_error(WSAGetLastError()); + + /* Try to obtain a base handle for the socket. This increases this chances */ + /* that we find an AFD handle and are able to use the fast poll mechanism. */ + /* This will always fail on windows XP/2k3, since they don't support the */ + /* SIO_BASE_HANDLE ioctl. */ +#ifndef NDEBUG + base_socket = INVALID_SOCKET; +#endif + + if (WSAIoctl(socket, + SIO_BASE_HANDLE, + NULL, + 0, + &base_socket, + sizeof base_socket, + &bytes, + NULL, + NULL) == 0) { + assert(base_socket != 0 && base_socket != INVALID_SOCKET); + socket = base_socket; + } + + uv__handle_init(loop, (uv_handle_t*) handle, UV_POLL); + handle->socket = socket; + handle->events = 0; + + /* Obtain protocol information about the socket. */ + len = sizeof protocol_info; + if (getsockopt(socket, + SOL_SOCKET, + SO_PROTOCOL_INFOW, + (char*) &protocol_info, + &len) != 0) { + return uv_translate_sys_error(WSAGetLastError()); + } + + /* Get the peer socket that is needed to enable fast poll. If the returned */ + /* value is NULL, the protocol is not implemented by MSAFD and we'll have */ + /* to use slow mode. */ + peer_socket = uv__fast_poll_get_peer_socket(loop, &protocol_info); + + if (peer_socket != INVALID_SOCKET) { + /* Initialize fast poll specific fields. */ + handle->peer_socket = peer_socket; + } else { + /* Initialize slow poll specific fields. */ + handle->flags |= UV_HANDLE_POLL_SLOW; + } + + /* Initialize 2 poll reqs. */ + handle->submitted_events_1 = 0; + UV_REQ_INIT(&handle->poll_req_1, UV_POLL_REQ); + handle->poll_req_1.data = handle; + + handle->submitted_events_2 = 0; + UV_REQ_INIT(&handle->poll_req_2, UV_POLL_REQ); + handle->poll_req_2.data = handle; + + return 0; +} + + +int uv_poll_start(uv_poll_t* handle, int events, uv_poll_cb cb) { + int err; + + if (!(handle->flags & UV_HANDLE_POLL_SLOW)) { + err = uv__fast_poll_set(handle->loop, handle, events); + } else { + err = uv__slow_poll_set(handle->loop, handle, events); + } + + if (err) { + return uv_translate_sys_error(err); + } + + handle->poll_cb = cb; + + return 0; +} + + +int uv_poll_stop(uv_poll_t* handle) { + int err; + + if (!(handle->flags & UV_HANDLE_POLL_SLOW)) { + err = uv__fast_poll_set(handle->loop, handle, 0); + } else { + err = uv__slow_poll_set(handle->loop, handle, 0); + } + + return uv_translate_sys_error(err); +} + + +void uv_process_poll_req(uv_loop_t* loop, uv_poll_t* handle, uv_req_t* req) { + if (!(handle->flags & UV_HANDLE_POLL_SLOW)) { + uv__fast_poll_process_poll_req(loop, handle, req); + } else { + uv__slow_poll_process_poll_req(loop, handle, req); + } +} + + +int uv_poll_close(uv_loop_t* loop, uv_poll_t* handle) { + if (!(handle->flags & UV_HANDLE_POLL_SLOW)) { + return uv__fast_poll_close(loop, handle); + } else { + return uv__slow_poll_close(loop, handle); + } +} + + +void uv_poll_endgame(uv_loop_t* loop, uv_poll_t* handle) { + assert(handle->flags & UV__HANDLE_CLOSING); + assert(!(handle->flags & UV_HANDLE_CLOSED)); + + assert(handle->submitted_events_1 == 0); + assert(handle->submitted_events_2 == 0); + + uv__handle_close(handle); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/process-stdio.c b/lib/ESPiLight/pilight/libs/libuv/win/process-stdio.c new file mode 100644 index 0000000..032e309 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/process-stdio.c @@ -0,0 +1,511 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include + +#include "uv.h" +#include "internal.h" +#include "handle-inl.h" + + +/* + * The `child_stdio_buffer` buffer has the following layout: + * int number_of_fds + * unsigned char crt_flags[number_of_fds] + * HANDLE os_handle[number_of_fds] + */ +#define CHILD_STDIO_SIZE(count) \ + (sizeof(int) + \ + sizeof(unsigned char) * (count) + \ + sizeof(uintptr_t) * (count)) + +#define CHILD_STDIO_COUNT(buffer) \ + *((unsigned int*) (buffer)) + +#define CHILD_STDIO_CRT_FLAGS(buffer, fd) \ + *((unsigned char*) (buffer) + sizeof(int) + fd) + +#define CHILD_STDIO_HANDLE(buffer, fd) \ + *((HANDLE*) ((unsigned char*) (buffer) + \ + sizeof(int) + \ + sizeof(unsigned char) * \ + CHILD_STDIO_COUNT((buffer)) + \ + sizeof(HANDLE) * (fd))) + + +/* CRT file descriptor mode flags */ +#define FOPEN 0x01 +#define FEOFLAG 0x02 +#define FCRLF 0x04 +#define FPIPE 0x08 +#define FNOINHERIT 0x10 +#define FAPPEND 0x20 +#define FDEV 0x40 +#define FTEXT 0x80 + + +/* + * Clear the HANDLE_FLAG_INHERIT flag from all HANDLEs that were inherited + * the parent process. Don't check for errors - the stdio handles may not be + * valid, or may be closed already. There is no guarantee that this function + * does a perfect job. + */ +void uv_disable_stdio_inheritance(void) { + HANDLE handle; + STARTUPINFOW si; + + /* Make the windows stdio handles non-inheritable. */ + handle = GetStdHandle(STD_INPUT_HANDLE); + if (handle != NULL && handle != INVALID_HANDLE_VALUE) + SetHandleInformation(handle, HANDLE_FLAG_INHERIT, 0); + + handle = GetStdHandle(STD_OUTPUT_HANDLE); + if (handle != NULL && handle != INVALID_HANDLE_VALUE) + SetHandleInformation(handle, HANDLE_FLAG_INHERIT, 0); + + handle = GetStdHandle(STD_ERROR_HANDLE); + if (handle != NULL && handle != INVALID_HANDLE_VALUE) + SetHandleInformation(handle, HANDLE_FLAG_INHERIT, 0); + + /* Make inherited CRT FDs non-inheritable. */ + GetStartupInfoW(&si); + if (uv__stdio_verify(si.lpReserved2, si.cbReserved2)) + uv__stdio_noinherit(si.lpReserved2); +} + + +static int uv__create_stdio_pipe_pair(uv_loop_t* loop, + uv_pipe_t* server_pipe, HANDLE* child_pipe_ptr, unsigned int flags) { + char pipe_name[64]; + SECURITY_ATTRIBUTES sa; + DWORD server_access = 0; + DWORD client_access = 0; + HANDLE child_pipe = INVALID_HANDLE_VALUE; + int err; + + if (flags & UV_READABLE_PIPE) { + /* The server needs inbound access too, otherwise CreateNamedPipe() */ + /* won't give us the FILE_READ_ATTRIBUTES permission. We need that to */ + /* probe the state of the write buffer when we're trying to shutdown */ + /* the pipe. */ + server_access |= PIPE_ACCESS_OUTBOUND | PIPE_ACCESS_INBOUND; + client_access |= GENERIC_READ | FILE_WRITE_ATTRIBUTES; + } + if (flags & UV_WRITABLE_PIPE) { + server_access |= PIPE_ACCESS_INBOUND; + client_access |= GENERIC_WRITE | FILE_READ_ATTRIBUTES; + } + + /* Create server pipe handle. */ + err = uv_stdio_pipe_server(loop, + server_pipe, + server_access, + pipe_name, + sizeof(pipe_name)); + if (err) + goto error; + + /* Create child pipe handle. */ + sa.nLength = sizeof sa; + sa.lpSecurityDescriptor = NULL; + sa.bInheritHandle = TRUE; + + child_pipe = CreateFileA(pipe_name, + client_access, + 0, + &sa, + OPEN_EXISTING, + server_pipe->ipc ? FILE_FLAG_OVERLAPPED : 0, + NULL); + if (child_pipe == INVALID_HANDLE_VALUE) { + err = GetLastError(); + goto error; + } + +#ifndef NDEBUG + /* Validate that the pipe was opened in the right mode. */ + { + DWORD mode; + BOOL r = GetNamedPipeHandleState(child_pipe, + &mode, + NULL, + NULL, + NULL, + NULL, + 0); + assert(r == TRUE); + assert(mode == (PIPE_READMODE_BYTE | PIPE_WAIT)); + } +#endif + + /* Do a blocking ConnectNamedPipe. This should not block because we have */ + /* both ends of the pipe created. */ + if (!ConnectNamedPipe(server_pipe->handle, NULL)) { + if (GetLastError() != ERROR_PIPE_CONNECTED) { + err = GetLastError(); + goto error; + } + } + + /* The server end is now readable and/or writable. */ + if (flags & UV_READABLE_PIPE) + server_pipe->flags |= UV_HANDLE_WRITABLE; + if (flags & UV_WRITABLE_PIPE) + server_pipe->flags |= UV_HANDLE_READABLE; + + *child_pipe_ptr = child_pipe; + return 0; + + error: + if (server_pipe->handle != INVALID_HANDLE_VALUE) { + uv_pipe_cleanup(loop, server_pipe); + } + + if (child_pipe != INVALID_HANDLE_VALUE) { + CloseHandle(child_pipe); + } + + return err; +} + + +static int uv__duplicate_handle(uv_loop_t* loop, HANDLE handle, HANDLE* dup) { + HANDLE current_process; + + + /* _get_osfhandle will sometimes return -2 in case of an error. This seems */ + /* to happen when fd <= 2 and the process' corresponding stdio handle is */ + /* set to NULL. Unfortunately DuplicateHandle will happily duplicate */ + /* (HANDLE) -2, so this situation goes unnoticed until someone tries to */ + /* use the duplicate. Therefore we filter out known-invalid handles here. */ + if (handle == INVALID_HANDLE_VALUE || + handle == NULL || + handle == (HANDLE) -2) { + *dup = INVALID_HANDLE_VALUE; + return ERROR_INVALID_HANDLE; + } + + current_process = GetCurrentProcess(); + + if (!DuplicateHandle(current_process, + handle, + current_process, + dup, + 0, + TRUE, + DUPLICATE_SAME_ACCESS)) { + *dup = INVALID_HANDLE_VALUE; + return GetLastError(); + } + + return 0; +} + + +static int uv__duplicate_fd(uv_loop_t* loop, int fd, HANDLE* dup) { + HANDLE handle; + + if (fd == -1) { + *dup = INVALID_HANDLE_VALUE; + return ERROR_INVALID_HANDLE; + } + + handle = uv__get_osfhandle(fd); + return uv__duplicate_handle(loop, handle, dup); +} + + +int uv__create_nul_handle(HANDLE* handle_ptr, + DWORD access) { + HANDLE handle; + SECURITY_ATTRIBUTES sa; + + sa.nLength = sizeof sa; + sa.lpSecurityDescriptor = NULL; + sa.bInheritHandle = TRUE; + + handle = CreateFileW(L"NUL", + access, + FILE_SHARE_READ | FILE_SHARE_WRITE, + &sa, + OPEN_EXISTING, + 0, + NULL); + if (handle == INVALID_HANDLE_VALUE) { + return GetLastError(); + } + + *handle_ptr = handle; + return 0; +} + + +int uv__stdio_create(uv_loop_t* loop, + const uv_process_options_t* options, + BYTE** buffer_ptr) { + BYTE* buffer; + int count, i; + int err; + + count = options->stdio_count; + + if (count < 0 || count > 255) { + /* Only support FDs 0-255 */ + return ERROR_NOT_SUPPORTED; + } else if (count < 3) { + /* There should always be at least 3 stdio handles. */ + count = 3; + } + + /* Allocate the child stdio buffer */ + buffer = (BYTE*) uv__malloc(CHILD_STDIO_SIZE(count)); + if (buffer == NULL) { + return ERROR_OUTOFMEMORY; + } + + /* Prepopulate the buffer with INVALID_HANDLE_VALUE handles so we can */ + /* clean up on failure. */ + CHILD_STDIO_COUNT(buffer) = count; + for (i = 0; i < count; i++) { + CHILD_STDIO_CRT_FLAGS(buffer, i) = 0; + CHILD_STDIO_HANDLE(buffer, i) = INVALID_HANDLE_VALUE; + } + + for (i = 0; i < count; i++) { + uv_stdio_container_t fdopt; + if (i < options->stdio_count) { + fdopt = options->stdio[i]; + } else { + fdopt.flags = UV_IGNORE; + } + + switch (fdopt.flags & (UV_IGNORE | UV_CREATE_PIPE | UV_INHERIT_FD | + UV_INHERIT_STREAM)) { + case UV_IGNORE: + /* Starting a process with no stdin/stout/stderr can confuse it. */ + /* So no matter what the user specified, we make sure the first */ + /* three FDs are always open in their typical modes, e.g. stdin */ + /* be readable and stdout/err should be writable. For FDs > 2, don't */ + /* do anything - all handles in the stdio buffer are initialized with */ + /* INVALID_HANDLE_VALUE, which should be okay. */ + if (i <= 2) { + DWORD access = (i == 0) ? FILE_GENERIC_READ : + FILE_GENERIC_WRITE | FILE_READ_ATTRIBUTES; + + err = uv__create_nul_handle(&CHILD_STDIO_HANDLE(buffer, i), + access); + if (err) + goto error; + + CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FDEV; + } + break; + + case UV_CREATE_PIPE: { + /* Create a pair of two connected pipe ends; one end is turned into */ + /* an uv_pipe_t for use by the parent. The other one is given to */ + /* the child. */ + uv_pipe_t* parent_pipe = (uv_pipe_t*) fdopt.data.stream; + HANDLE child_pipe = INVALID_HANDLE_VALUE; + + /* Create a new, connected pipe pair. stdio[i].stream should point */ + /* to an uninitialized, but not connected pipe handle. */ + assert(fdopt.data.stream->type == UV_NAMED_PIPE); + assert(!(fdopt.data.stream->flags & UV_HANDLE_CONNECTION)); + assert(!(fdopt.data.stream->flags & UV_HANDLE_PIPESERVER)); + + err = uv__create_stdio_pipe_pair(loop, + parent_pipe, + &child_pipe, + fdopt.flags); + if (err) + goto error; + + CHILD_STDIO_HANDLE(buffer, i) = child_pipe; + CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FPIPE; + break; + } + + case UV_INHERIT_FD: { + /* Inherit a raw FD. */ + HANDLE child_handle; + + /* Make an inheritable duplicate of the handle. */ + err = uv__duplicate_fd(loop, fdopt.data.fd, &child_handle); + if (err) { + /* If fdopt.data.fd is not valid and fd fd <= 2, then ignore the */ + /* error. */ + if (fdopt.data.fd <= 2 && err == ERROR_INVALID_HANDLE) { + CHILD_STDIO_CRT_FLAGS(buffer, i) = 0; + CHILD_STDIO_HANDLE(buffer, i) = INVALID_HANDLE_VALUE; + break; + } + goto error; + } + + /* Figure out what the type is. */ + switch (GetFileType(child_handle)) { + case FILE_TYPE_DISK: + CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN; + break; + + case FILE_TYPE_PIPE: + CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FPIPE; + break; + + case FILE_TYPE_CHAR: + case FILE_TYPE_REMOTE: + CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FDEV; + break; + + case FILE_TYPE_UNKNOWN: + if (GetLastError() != 0) { + err = GetLastError(); + CloseHandle(child_handle); + goto error; + } + CHILD_STDIO_CRT_FLAGS(buffer, i) = FOPEN | FDEV; + break; + + default: + assert(0); + return -1; + } + + CHILD_STDIO_HANDLE(buffer, i) = child_handle; + break; + } + + case UV_INHERIT_STREAM: { + /* Use an existing stream as the stdio handle for the child. */ + HANDLE stream_handle, child_handle; + unsigned char crt_flags; + uv_stream_t* stream = fdopt.data.stream; + + /* Leech the handle out of the stream. */ + if (stream->type == UV_TTY) { + stream_handle = ((uv_tty_t*) stream)->handle; + crt_flags = FOPEN | FDEV; + } else if (stream->type == UV_NAMED_PIPE && + stream->flags & UV_HANDLE_CONNECTION) { + stream_handle = ((uv_pipe_t*) stream)->handle; + crt_flags = FOPEN | FPIPE; + } else { + stream_handle = INVALID_HANDLE_VALUE; + crt_flags = 0; + } + + if (stream_handle == NULL || + stream_handle == INVALID_HANDLE_VALUE) { + /* The handle is already closed, or not yet created, or the */ + /* stream type is not supported. */ + err = ERROR_NOT_SUPPORTED; + goto error; + } + + /* Make an inheritable copy of the handle. */ + err = uv__duplicate_handle(loop, stream_handle, &child_handle); + if (err) + goto error; + + CHILD_STDIO_HANDLE(buffer, i) = child_handle; + CHILD_STDIO_CRT_FLAGS(buffer, i) = crt_flags; + break; + } + + default: + assert(0); + return -1; + } + } + + *buffer_ptr = buffer; + return 0; + + error: + uv__stdio_destroy(buffer); + return err; +} + + +void uv__stdio_destroy(BYTE* buffer) { + int i, count; + + count = CHILD_STDIO_COUNT(buffer); + for (i = 0; i < count; i++) { + HANDLE handle = CHILD_STDIO_HANDLE(buffer, i); + if (handle != INVALID_HANDLE_VALUE) { + CloseHandle(handle); + } + } + + uv__free(buffer); +} + + +void uv__stdio_noinherit(BYTE* buffer) { + int i, count; + + count = CHILD_STDIO_COUNT(buffer); + for (i = 0; i < count; i++) { + HANDLE handle = CHILD_STDIO_HANDLE(buffer, i); + if (handle != INVALID_HANDLE_VALUE) { + SetHandleInformation(handle, HANDLE_FLAG_INHERIT, 0); + } + } +} + + +int uv__stdio_verify(BYTE* buffer, WORD size) { + unsigned int count; + + /* Check the buffer pointer. */ + if (buffer == NULL) + return 0; + + /* Verify that the buffer is at least big enough to hold the count. */ + if (size < CHILD_STDIO_SIZE(0)) + return 0; + + /* Verify if the count is within range. */ + count = CHILD_STDIO_COUNT(buffer); + if (count > 256) + return 0; + + /* Verify that the buffer size is big enough to hold info for N FDs. */ + if (size < CHILD_STDIO_SIZE(count)) + return 0; + + return 1; +} + + +WORD uv__stdio_size(BYTE* buffer) { + return (WORD) CHILD_STDIO_SIZE(CHILD_STDIO_COUNT((buffer))); +} + + +HANDLE uv__stdio_handle(BYTE* buffer, int fd) { + return CHILD_STDIO_HANDLE(buffer, fd); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/process.c b/lib/ESPiLight/pilight/libs/libuv/win/process.c new file mode 100644 index 0000000..d141601 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/process.c @@ -0,0 +1,1246 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include /* alloca */ + +#include "uv.h" +#include "internal.h" +#include "handle-inl.h" +#include "req-inl.h" + + +#define SIGKILL 9 + + +typedef struct env_var { + const WCHAR* const wide; + const WCHAR* const wide_eq; + const size_t len; /* including null or '=' */ +} env_var_t; + +#define E_V(str) { L##str, L##str L"=", sizeof(str) } + +static const env_var_t required_vars[] = { /* keep me sorted */ + E_V("HOMEDRIVE"), + E_V("HOMEPATH"), + E_V("LOGONSERVER"), + E_V("PATH"), + E_V("SYSTEMDRIVE"), + E_V("SYSTEMROOT"), + E_V("TEMP"), + E_V("USERDOMAIN"), + E_V("USERNAME"), + E_V("USERPROFILE"), + E_V("WINDIR"), +}; +static size_t n_required_vars = ARRAY_SIZE(required_vars); + + +static HANDLE uv_global_job_handle_; +static uv_once_t uv_global_job_handle_init_guard_ = UV_ONCE_INIT; + + +static void uv__init_global_job_handle(void) { + /* Create a job object and set it up to kill all contained processes when + * it's closed. Since this handle is made non-inheritable and we're not + * giving it to anyone, we're the only process holding a reference to it. + * That means that if this process exits it is closed and all the processes + * it contains are killed. All processes created with uv_spawn that are not + * spawned with the UV_PROCESS_DETACHED flag are assigned to this job. + * + * We're setting the JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK flag so only the + * processes that we explicitly add are affected, and *their* subprocesses + * are not. This ensures that our child processes are not limited in their + * ability to use job control on Windows versions that don't deal with + * nested jobs (prior to Windows 8 / Server 2012). It also lets our child + * processes created detached processes without explicitly breaking away + * from job control (which uv_spawn doesn't, either). + */ + SECURITY_ATTRIBUTES attr; + JOBOBJECT_EXTENDED_LIMIT_INFORMATION info; + + memset(&attr, 0, sizeof attr); + attr.bInheritHandle = FALSE; + + memset(&info, 0, sizeof info); + info.BasicLimitInformation.LimitFlags = + JOB_OBJECT_LIMIT_BREAKAWAY_OK | + JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK | + JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION | + JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; + + uv_global_job_handle_ = CreateJobObjectW(&attr, NULL); + if (uv_global_job_handle_ == NULL) + uv_fatal_error(GetLastError(), "CreateJobObjectW"); + + if (!SetInformationJobObject(uv_global_job_handle_, + JobObjectExtendedLimitInformation, + &info, + sizeof info)) + uv_fatal_error(GetLastError(), "SetInformationJobObject"); +} + + +static int uv_utf8_to_utf16_alloc(const char* s, WCHAR** ws_ptr) { + int ws_len, r; + WCHAR* ws; + + ws_len = MultiByteToWideChar(CP_UTF8, + 0, + s, + -1, + NULL, + 0); + if (ws_len <= 0) { + return GetLastError(); + } + + ws = (WCHAR*) uv__malloc(ws_len * sizeof(WCHAR)); + if (ws == NULL) { + return ERROR_OUTOFMEMORY; + } + + r = MultiByteToWideChar(CP_UTF8, + 0, + s, + -1, + ws, + ws_len); + assert(r == ws_len); + + *ws_ptr = ws; + return 0; +} + + +static void uv_process_init(uv_loop_t* loop, uv_process_t* handle) { + uv__handle_init(loop, (uv_handle_t*) handle, UV_PROCESS); + handle->exit_cb = NULL; + handle->pid = 0; + handle->exit_signal = 0; + handle->wait_handle = INVALID_HANDLE_VALUE; + handle->process_handle = INVALID_HANDLE_VALUE; + handle->child_stdio_buffer = NULL; + handle->exit_cb_pending = 0; + + UV_REQ_INIT(&handle->exit_req, UV_PROCESS_EXIT); + handle->exit_req.data = handle; +} + + +/* + * Path search functions + */ + +/* + * Helper function for search_path + */ +static WCHAR* search_path_join_test(const WCHAR* dir, + size_t dir_len, + const WCHAR* name, + size_t name_len, + const WCHAR* ext, + size_t ext_len, + const WCHAR* cwd, + size_t cwd_len) { + WCHAR *result, *result_pos; + DWORD attrs; + if (dir_len > 2 && dir[0] == L'\\' && dir[1] == L'\\') { + /* It's a UNC path so ignore cwd */ + cwd_len = 0; + } else if (dir_len >= 1 && (dir[0] == L'/' || dir[0] == L'\\')) { + /* It's a full path without drive letter, use cwd's drive letter only */ + cwd_len = 2; + } else if (dir_len >= 2 && dir[1] == L':' && + (dir_len < 3 || (dir[2] != L'/' && dir[2] != L'\\'))) { + /* It's a relative path with drive letter (ext.g. D:../some/file) + * Replace drive letter in dir by full cwd if it points to the same drive, + * otherwise use the dir only. + */ + if (cwd_len < 2 || _wcsnicmp(cwd, dir, 2) != 0) { + cwd_len = 0; + } else { + dir += 2; + dir_len -= 2; + } + } else if (dir_len > 2 && dir[1] == L':') { + /* It's an absolute path with drive letter + * Don't use the cwd at all + */ + cwd_len = 0; + } + + /* Allocate buffer for output */ + result = result_pos = (WCHAR*)uv__malloc(sizeof(WCHAR) * + (cwd_len + 1 + dir_len + 1 + name_len + 1 + ext_len + 1)); + + /* Copy cwd */ + wcsncpy(result_pos, cwd, cwd_len); + result_pos += cwd_len; + + /* Add a path separator if cwd didn't end with one */ + if (cwd_len && wcsrchr(L"\\/:", result_pos[-1]) == NULL) { + result_pos[0] = L'\\'; + result_pos++; + } + + /* Copy dir */ + wcsncpy(result_pos, dir, dir_len); + result_pos += dir_len; + + /* Add a separator if the dir didn't end with one */ + if (dir_len && wcsrchr(L"\\/:", result_pos[-1]) == NULL) { + result_pos[0] = L'\\'; + result_pos++; + } + + /* Copy filename */ + wcsncpy(result_pos, name, name_len); + result_pos += name_len; + + if (ext_len) { + /* Add a dot if the filename didn't end with one */ + if (name_len && result_pos[-1] != '.') { + result_pos[0] = L'.'; + result_pos++; + } + + /* Copy extension */ + wcsncpy(result_pos, ext, ext_len); + result_pos += ext_len; + } + + /* Null terminator */ + result_pos[0] = L'\0'; + + attrs = GetFileAttributesW(result); + + if (attrs != INVALID_FILE_ATTRIBUTES && + !(attrs & FILE_ATTRIBUTE_DIRECTORY)) { + return result; + } + + uv__free(result); + return NULL; +} + + +/* + * Helper function for search_path + */ +static WCHAR* path_search_walk_ext(const WCHAR *dir, + size_t dir_len, + const WCHAR *name, + size_t name_len, + WCHAR *cwd, + size_t cwd_len, + int name_has_ext) { + WCHAR* result; + + /* If the name itself has a nonempty extension, try this extension first */ + if (name_has_ext) { + result = search_path_join_test(dir, dir_len, + name, name_len, + L"", 0, + cwd, cwd_len); + if (result != NULL) { + return result; + } + } + + /* Try .com extension */ + result = search_path_join_test(dir, dir_len, + name, name_len, + L"com", 3, + cwd, cwd_len); + if (result != NULL) { + return result; + } + + /* Try .exe extension */ + result = search_path_join_test(dir, dir_len, + name, name_len, + L"exe", 3, + cwd, cwd_len); + if (result != NULL) { + return result; + } + + return NULL; +} + + +/* + * search_path searches the system path for an executable filename - + * the windows API doesn't provide this as a standalone function nor as an + * option to CreateProcess. + * + * It tries to return an absolute filename. + * + * Furthermore, it tries to follow the semantics that cmd.exe, with this + * exception that PATHEXT environment variable isn't used. Since CreateProcess + * can start only .com and .exe files, only those extensions are tried. This + * behavior equals that of msvcrt's spawn functions. + * + * - Do not search the path if the filename already contains a path (either + * relative or absolute). + * + * - If there's really only a filename, check the current directory for file, + * then search all path directories. + * + * - If filename specified has *any* extension, search for the file with the + * specified extension first. + * + * - If the literal filename is not found in a directory, try *appending* + * (not replacing) .com first and then .exe. + * + * - The path variable may contain relative paths; relative paths are relative + * to the cwd. + * + * - Directories in path may or may not end with a trailing backslash. + * + * - CMD does not trim leading/trailing whitespace from path/pathex entries + * nor from the environment variables as a whole. + * + * - When cmd.exe cannot read a directory, it will just skip it and go on + * searching. However, unlike posix-y systems, it will happily try to run a + * file that is not readable/executable; if the spawn fails it will not + * continue searching. + * + * UNC path support: we are dealing with UNC paths in both the path and the + * filename. This is a deviation from what cmd.exe does (it does not let you + * start a program by specifying an UNC path on the command line) but this is + * really a pointless restriction. + * + */ +static WCHAR* search_path(const WCHAR *file, + WCHAR *cwd, + const WCHAR *path) { + int file_has_dir; + WCHAR* result = NULL; + WCHAR *file_name_start; + WCHAR *dot; + const WCHAR *dir_start, *dir_end, *dir_path; + size_t dir_len; + int name_has_ext; + + size_t file_len = wcslen(file); + size_t cwd_len = wcslen(cwd); + + /* If the caller supplies an empty filename, + * we're not gonna return c:\windows\.exe -- GFY! + */ + if (file_len == 0 + || (file_len == 1 && file[0] == L'.')) { + return NULL; + } + + /* Find the start of the filename so we can split the directory from the */ + /* name. */ + for (file_name_start = (WCHAR*)file + file_len; + file_name_start > file + && file_name_start[-1] != L'\\' + && file_name_start[-1] != L'/' + && file_name_start[-1] != L':'; + file_name_start--); + + file_has_dir = file_name_start != file; + + /* Check if the filename includes an extension */ + dot = wcschr(file_name_start, L'.'); + name_has_ext = (dot != NULL && dot[1] != L'\0'); + + if (file_has_dir) { + /* The file has a path inside, don't use path */ + result = path_search_walk_ext( + file, file_name_start - file, + file_name_start, file_len - (file_name_start - file), + cwd, cwd_len, + name_has_ext); + + } else { + dir_end = path; + + /* The file is really only a name; look in cwd first, then scan path */ + result = path_search_walk_ext(L"", 0, + file, file_len, + cwd, cwd_len, + name_has_ext); + + while (result == NULL) { + if (*dir_end == L'\0') { + break; + } + + /* Skip the separator that dir_end now points to */ + if (dir_end != path || *path == L';') { + dir_end++; + } + + /* Next slice starts just after where the previous one ended */ + dir_start = dir_end; + + /* Slice until the next ; or \0 is found */ + dir_end = wcschr(dir_start, L';'); + if (dir_end == NULL) { + dir_end = wcschr(dir_start, L'\0'); + } + + /* If the slice is zero-length, don't bother */ + if (dir_end - dir_start == 0) { + continue; + } + + dir_path = dir_start; + dir_len = dir_end - dir_start; + + /* Adjust if the path is quoted. */ + if (dir_path[0] == '"' || dir_path[0] == '\'') { + ++dir_path; + --dir_len; + } + + if (dir_path[dir_len - 1] == '"' || dir_path[dir_len - 1] == '\'') { + --dir_len; + } + + result = path_search_walk_ext(dir_path, dir_len, + file, file_len, + cwd, cwd_len, + name_has_ext); + } + } + + return result; +} + + +/* + * Quotes command line arguments + * Returns a pointer to the end (next char to be written) of the buffer + */ +WCHAR* quote_cmd_arg(const WCHAR *source, WCHAR *target) { + size_t len = wcslen(source); + size_t i; + int quote_hit; + WCHAR* start; + + if (len == 0) { + /* Need double quotation for empty argument */ + *(target++) = L'"'; + *(target++) = L'"'; + return target; + } + + if (NULL == wcspbrk(source, L" \t\"")) { + /* No quotation needed */ + wcsncpy(target, source, len); + target += len; + return target; + } + + if (NULL == wcspbrk(source, L"\"\\")) { + /* + * No embedded double quotes or backlashes, so I can just wrap + * quote marks around the whole thing. + */ + *(target++) = L'"'; + wcsncpy(target, source, len); + target += len; + *(target++) = L'"'; + return target; + } + + /* + * Expected input/output: + * input : hello"world + * output: "hello\"world" + * input : hello""world + * output: "hello\"\"world" + * input : hello\world + * output: hello\world + * input : hello\\world + * output: hello\\world + * input : hello\"world + * output: "hello\\\"world" + * input : hello\\"world + * output: "hello\\\\\"world" + * input : hello world\ + * output: "hello world\\" + */ + + *(target++) = L'"'; + start = target; + quote_hit = 1; + + for (i = len; i > 0; --i) { + *(target++) = source[i - 1]; + + if (quote_hit && source[i - 1] == L'\\') { + *(target++) = L'\\'; + } else if(source[i - 1] == L'"') { + quote_hit = 1; + *(target++) = L'\\'; + } else { + quote_hit = 0; + } + } + target[0] = L'\0'; + wcsrev(start); + *(target++) = L'"'; + return target; +} + + +int make_program_args(char** args, int verbatim_arguments, WCHAR** dst_ptr) { + char** arg; + WCHAR* dst = NULL; + WCHAR* temp_buffer = NULL; + size_t dst_len = 0; + size_t temp_buffer_len = 0; + WCHAR* pos; + int arg_count = 0; + int err = 0; + + /* Count the required size. */ + for (arg = args; *arg; arg++) { + DWORD arg_len; + + arg_len = MultiByteToWideChar(CP_UTF8, + 0, + *arg, + -1, + NULL, + 0); + if (arg_len == 0) { + return GetLastError(); + } + + dst_len += arg_len; + + if (arg_len > temp_buffer_len) + temp_buffer_len = arg_len; + + arg_count++; + } + + /* Adjust for potential quotes. Also assume the worst-case scenario */ + /* that every character needs escaping, so we need twice as much space. */ + dst_len = dst_len * 2 + arg_count * 2; + + /* Allocate buffer for the final command line. */ + dst = (WCHAR*) uv__malloc(dst_len * sizeof(WCHAR)); + if (dst == NULL) { + err = ERROR_OUTOFMEMORY; + goto error; + } + + /* Allocate temporary working buffer. */ + temp_buffer = (WCHAR*) uv__malloc(temp_buffer_len * sizeof(WCHAR)); + if (temp_buffer == NULL) { + err = ERROR_OUTOFMEMORY; + goto error; + } + + pos = dst; + for (arg = args; *arg; arg++) { + DWORD arg_len; + + /* Convert argument to wide char. */ + arg_len = MultiByteToWideChar(CP_UTF8, + 0, + *arg, + -1, + temp_buffer, + (int) (dst + dst_len - pos)); + if (arg_len == 0) { + err = GetLastError(); + goto error; + } + + if (verbatim_arguments) { + /* Copy verbatim. */ + wcscpy(pos, temp_buffer); + pos += arg_len - 1; + } else { + /* Quote/escape, if needed. */ + pos = quote_cmd_arg(temp_buffer, pos); + } + + *pos++ = *(arg + 1) ? L' ' : L'\0'; + } + + uv__free(temp_buffer); + + *dst_ptr = dst; + return 0; + +error: + uv__free(dst); + uv__free(temp_buffer); + return err; +} + + +int env_strncmp(const wchar_t* a, int na, const wchar_t* b) { + wchar_t* a_eq; + wchar_t* b_eq; + wchar_t* A; + wchar_t* B; + int nb; + int r; + + if (na < 0) { + a_eq = wcschr(a, L'='); + assert(a_eq); + na = (int)(long)(a_eq - a); + } else { + na--; + } + b_eq = wcschr(b, L'='); + assert(b_eq); + nb = b_eq - b; + + A = alloca((na+1) * sizeof(wchar_t)); + B = alloca((nb+1) * sizeof(wchar_t)); + + r = LCMapStringW(LOCALE_INVARIANT, LCMAP_UPPERCASE, a, na, A, na); + assert(r==na); + A[na] = L'\0'; + r = LCMapStringW(LOCALE_INVARIANT, LCMAP_UPPERCASE, b, nb, B, nb); + assert(r==nb); + B[nb] = L'\0'; + + while (1) { + wchar_t AA = *A++; + wchar_t BB = *B++; + if (AA < BB) { + return -1; + } else if (AA > BB) { + return 1; + } else if (!AA && !BB) { + return 0; + } + } +} + + +static int qsort_wcscmp(const void *a, const void *b) { + wchar_t* astr = *(wchar_t* const*)a; + wchar_t* bstr = *(wchar_t* const*)b; + return env_strncmp(astr, -1, bstr); +} + + +/* + * The way windows takes environment variables is different than what C does; + * Windows wants a contiguous block of null-terminated strings, terminated + * with an additional null. + * + * Windows has a few "essential" environment variables. winsock will fail + * to initialize if SYSTEMROOT is not defined; some APIs make reference to + * TEMP. SYSTEMDRIVE is probably also important. We therefore ensure that + * these get defined if the input environment block does not contain any + * values for them. + * + * Also add variables known to Cygwin to be required for correct + * subprocess operation in many cases: + * https://github.com/Alexpux/Cygwin/blob/b266b04fbbd3a595f02ea149e4306d3ab9b1fe3d/winsup/cygwin/environ.cc#L955 + * + */ +int make_program_env(char* env_block[], WCHAR** dst_ptr) { + WCHAR* dst; + WCHAR* ptr; + char** env; + size_t env_len = 0; + int len; + size_t i; + DWORD var_size; + size_t env_block_count = 1; /* 1 for null-terminator */ + WCHAR* dst_copy; + WCHAR** ptr_copy; + WCHAR** env_copy; + DWORD* required_vars_value_len = alloca(n_required_vars * sizeof(DWORD*)); + + /* first pass: determine size in UTF-16 */ + for (env = env_block; *env; env++) { + int len; + if (strchr(*env, '=')) { + len = MultiByteToWideChar(CP_UTF8, + 0, + *env, + -1, + NULL, + 0); + if (len <= 0) { + return GetLastError(); + } + env_len += len; + env_block_count++; + } + } + + /* second pass: copy to UTF-16 environment block */ + dst_copy = (WCHAR*)uv__malloc(env_len * sizeof(WCHAR)); + if (!dst_copy) { + return ERROR_OUTOFMEMORY; + } + env_copy = alloca(env_block_count * sizeof(WCHAR*)); + + ptr = dst_copy; + ptr_copy = env_copy; + for (env = env_block; *env; env++) { + if (strchr(*env, '=')) { + len = MultiByteToWideChar(CP_UTF8, + 0, + *env, + -1, + ptr, + (int) (env_len - (ptr - dst_copy))); + if (len <= 0) { + DWORD err = GetLastError(); + uv__free(dst_copy); + return err; + } + *ptr_copy++ = ptr; + ptr += len; + } + } + *ptr_copy = NULL; + assert(env_len == ptr - dst_copy); + + /* sort our (UTF-16) copy */ + qsort(env_copy, env_block_count-1, sizeof(wchar_t*), qsort_wcscmp); + + /* third pass: check for required variables */ + for (ptr_copy = env_copy, i = 0; i < n_required_vars; ) { + int cmp; + if (!*ptr_copy) { + cmp = -1; + } else { + cmp = env_strncmp(required_vars[i].wide_eq, + required_vars[i].len, + *ptr_copy); + } + if (cmp < 0) { + /* missing required var */ + var_size = GetEnvironmentVariableW(required_vars[i].wide, NULL, 0); + required_vars_value_len[i] = var_size; + if (var_size != 0) { + env_len += required_vars[i].len; + env_len += var_size; + } + i++; + } else { + ptr_copy++; + if (cmp == 0) + i++; + } + } + + /* final pass: copy, in sort order, and inserting required variables */ + dst = uv__malloc((1+env_len) * sizeof(WCHAR)); + if (!dst) { + uv__free(dst_copy); + return ERROR_OUTOFMEMORY; + } + + for (ptr = dst, ptr_copy = env_copy, i = 0; + *ptr_copy || i < n_required_vars; + ptr += len) { + int cmp; + if (i >= n_required_vars) { + cmp = 1; + } else if (!*ptr_copy) { + cmp = -1; + } else { + cmp = env_strncmp(required_vars[i].wide_eq, + required_vars[i].len, + *ptr_copy); + } + if (cmp < 0) { + /* missing required var */ + len = required_vars_value_len[i]; + if (len) { + wcscpy(ptr, required_vars[i].wide_eq); + ptr += required_vars[i].len; + var_size = GetEnvironmentVariableW(required_vars[i].wide, + ptr, + (int) (env_len - (ptr - dst))); + if (var_size != len-1) { /* race condition? */ + uv_fatal_error(GetLastError(), "GetEnvironmentVariableW"); + } + } + i++; + } else { + /* copy var from env_block */ + len = wcslen(*ptr_copy) + 1; + wmemcpy(ptr, *ptr_copy, len); + ptr_copy++; + if (cmp == 0) + i++; + } + } + + /* Terminate with an extra NULL. */ + assert(env_len == (ptr - dst)); + *ptr = L'\0'; + + uv__free(dst_copy); + *dst_ptr = dst; + return 0; +} + +/* + * Attempt to find the value of the PATH environment variable in the child's + * preprocessed environment. + * + * If found, a pointer into `env` is returned. If not found, NULL is returned. + */ +static WCHAR* find_path(WCHAR *env) { + for (; env != NULL && *env != 0; env += wcslen(env) + 1) { + if (wcsncmp(env, L"PATH=", 5) == 0) + return &env[5]; + } + + return NULL; +} + +/* + * Called on Windows thread-pool thread to indicate that + * a child process has exited. + */ +static void CALLBACK exit_wait_callback(void* data, BOOLEAN didTimeout) { + uv_process_t* process = (uv_process_t*) data; + uv_loop_t* loop = process->loop; + + assert(didTimeout == FALSE); + assert(process); + assert(!process->exit_cb_pending); + + process->exit_cb_pending = 1; + + /* Post completed */ + POST_COMPLETION_FOR_REQ(loop, &process->exit_req); +} + + +/* Called on main thread after a child process has exited. */ +void uv_process_proc_exit(uv_loop_t* loop, uv_process_t* handle) { + int64_t exit_code; + DWORD status; + + assert(handle->exit_cb_pending); + handle->exit_cb_pending = 0; + + /* If we're closing, don't call the exit callback. Just schedule a close */ + /* callback now. */ + if (handle->flags & UV__HANDLE_CLOSING) { + uv_want_endgame(loop, (uv_handle_t*) handle); + return; + } + + /* Unregister from process notification. */ + if (handle->wait_handle != INVALID_HANDLE_VALUE) { + UnregisterWait(handle->wait_handle); + handle->wait_handle = INVALID_HANDLE_VALUE; + } + + /* Set the handle to inactive: no callbacks will be made after the exit */ + /* callback.*/ + uv__handle_stop(handle); + + if (GetExitCodeProcess(handle->process_handle, &status)) { + exit_code = status; + } else { + /* Unable to to obtain the exit code. This should never happen. */ + exit_code = uv_translate_sys_error(GetLastError()); + } + + /* Fire the exit callback. */ + if (handle->exit_cb) { + handle->exit_cb(handle, exit_code, handle->exit_signal); + } +} + + +void uv_process_close(uv_loop_t* loop, uv_process_t* handle) { + uv__handle_closing(handle); + + if (handle->wait_handle != INVALID_HANDLE_VALUE) { + /* This blocks until either the wait was cancelled, or the callback has */ + /* completed. */ + BOOL r = UnregisterWaitEx(handle->wait_handle, INVALID_HANDLE_VALUE); + if (!r) { + /* This should never happen, and if it happens, we can't recover... */ + uv_fatal_error(GetLastError(), "UnregisterWaitEx"); + } + + handle->wait_handle = INVALID_HANDLE_VALUE; + } + + if (!handle->exit_cb_pending) { + uv_want_endgame(loop, (uv_handle_t*)handle); + } +} + + +void uv_process_endgame(uv_loop_t* loop, uv_process_t* handle) { + assert(!handle->exit_cb_pending); + assert(handle->flags & UV__HANDLE_CLOSING); + assert(!(handle->flags & UV_HANDLE_CLOSED)); + + /* Clean-up the process handle. */ + CloseHandle(handle->process_handle); + + uv__handle_close(handle); +} + + +int uv_spawn(uv_loop_t* loop, + uv_process_t* process, + const uv_process_options_t* options) { + int i; + int err = 0; + WCHAR* path = NULL, *alloc_path = NULL; + BOOL result; + WCHAR* application_path = NULL, *application = NULL, *arguments = NULL, + *env = NULL, *cwd = NULL; + STARTUPINFOW startup; + PROCESS_INFORMATION info; + DWORD process_flags; + + uv_process_init(loop, process); + process->exit_cb = options->exit_cb; + + if (options->flags & (UV_PROCESS_SETGID | UV_PROCESS_SETUID)) { + return UV_ENOTSUP; + } + + if (options->file == NULL || + options->args == NULL) { + return UV_EINVAL; + } + + assert(options->file != NULL); + assert(!(options->flags & ~(UV_PROCESS_DETACHED | + UV_PROCESS_SETGID | + UV_PROCESS_SETUID | + UV_PROCESS_WINDOWS_HIDE | + UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS))); + + err = uv_utf8_to_utf16_alloc(options->file, &application); + if (err) + goto done; + + err = make_program_args( + options->args, + options->flags & UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS, + &arguments); + if (err) + goto done; + + if (options->env) { + err = make_program_env(options->env, &env); + if (err) + goto done; + } + + if (options->cwd) { + /* Explicit cwd */ + err = uv_utf8_to_utf16_alloc(options->cwd, &cwd); + if (err) + goto done; + + } else { + /* Inherit cwd */ + DWORD cwd_len, r; + + cwd_len = GetCurrentDirectoryW(0, NULL); + if (!cwd_len) { + err = GetLastError(); + goto done; + } + + cwd = (WCHAR*) uv__malloc(cwd_len * sizeof(WCHAR)); + if (cwd == NULL) { + err = ERROR_OUTOFMEMORY; + goto done; + } + + r = GetCurrentDirectoryW(cwd_len, cwd); + if (r == 0 || r >= cwd_len) { + err = GetLastError(); + goto done; + } + } + + /* Get PATH environment variable. */ + path = find_path(env); + if (path == NULL) { + DWORD path_len, r; + + path_len = GetEnvironmentVariableW(L"PATH", NULL, 0); + if (path_len == 0) { + err = GetLastError(); + goto done; + } + + alloc_path = (WCHAR*) uv__malloc(path_len * sizeof(WCHAR)); + if (alloc_path == NULL) { + err = ERROR_OUTOFMEMORY; + goto done; + } + path = alloc_path; + + r = GetEnvironmentVariableW(L"PATH", path, path_len); + if (r == 0 || r >= path_len) { + err = GetLastError(); + goto done; + } + } + + err = uv__stdio_create(loop, options, &process->child_stdio_buffer); + if (err) + goto done; + + application_path = search_path(application, + cwd, + path); + if (application_path == NULL) { + /* Not found. */ + err = ERROR_FILE_NOT_FOUND; + goto done; + } + + startup.cb = sizeof(startup); + startup.lpReserved = NULL; + startup.lpDesktop = NULL; + startup.lpTitle = NULL; + startup.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; + + startup.cbReserved2 = uv__stdio_size(process->child_stdio_buffer); + startup.lpReserved2 = (BYTE*) process->child_stdio_buffer; + + startup.hStdInput = uv__stdio_handle(process->child_stdio_buffer, 0); + startup.hStdOutput = uv__stdio_handle(process->child_stdio_buffer, 1); + startup.hStdError = uv__stdio_handle(process->child_stdio_buffer, 2); + + if (options->flags & UV_PROCESS_WINDOWS_HIDE) { + /* Use SW_HIDE to avoid any potential process window. */ + startup.wShowWindow = SW_HIDE; + } else { + startup.wShowWindow = SW_SHOWDEFAULT; + } + + process_flags = CREATE_UNICODE_ENVIRONMENT; + + if (options->flags & UV_PROCESS_DETACHED) { + /* Note that we're not setting the CREATE_BREAKAWAY_FROM_JOB flag. That + * means that libuv might not let you create a fully daemonized process + * when run under job control. However the type of job control that libuv + * itself creates doesn't trickle down to subprocesses so they can still + * daemonize. + * + * A reason to not do this is that CREATE_BREAKAWAY_FROM_JOB makes the + * CreateProcess call fail if we're under job control that doesn't allow + * breakaway. + */ + process_flags |= DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP; + } + + if (!CreateProcessW(application_path, + arguments, + NULL, + NULL, + 1, + process_flags, + env, + cwd, + &startup, + &info)) { + /* CreateProcessW failed. */ + err = GetLastError(); + goto done; + } + + /* Spawn succeeded */ + /* Beyond this point, failure is reported asynchronously. */ + + process->process_handle = info.hProcess; + process->pid = info.dwProcessId; + + /* If the process isn't spawned as detached, assign to the global job */ + /* object so windows will kill it when the parent process dies. */ + if (!(options->flags & UV_PROCESS_DETACHED)) { + uv_once(&uv_global_job_handle_init_guard_, uv__init_global_job_handle); + + if (!AssignProcessToJobObject(uv_global_job_handle_, info.hProcess)) { + /* AssignProcessToJobObject might fail if this process is under job + * control and the job doesn't have the + * JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK flag set, on a Windows version + * that doesn't support nested jobs. + * + * When that happens we just swallow the error and continue without + * establishing a kill-child-on-parent-exit relationship, otherwise + * there would be no way for libuv applications run under job control + * to spawn processes at all. + */ + DWORD err = GetLastError(); + if (err != ERROR_ACCESS_DENIED) + uv_fatal_error(err, "AssignProcessToJobObject"); + } + } + + /* Set IPC pid to all IPC pipes. */ + for (i = 0; i < options->stdio_count; i++) { + const uv_stdio_container_t* fdopt = &options->stdio[i]; + if (fdopt->flags & UV_CREATE_PIPE && + fdopt->data.stream->type == UV_NAMED_PIPE && + ((uv_pipe_t*) fdopt->data.stream)->ipc) { + ((uv_pipe_t*) fdopt->data.stream)->pipe.conn.ipc_pid = info.dwProcessId; + } + } + + /* Setup notifications for when the child process exits. */ + result = RegisterWaitForSingleObject(&process->wait_handle, + process->process_handle, exit_wait_callback, (void*)process, INFINITE, + WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE); + if (!result) { + uv_fatal_error(GetLastError(), "RegisterWaitForSingleObject"); + } + + CloseHandle(info.hThread); + + assert(!err); + + /* Make the handle active. It will remain active until the exit callback */ + /* is made or the handle is closed, whichever happens first. */ + uv__handle_start(process); + + /* Cleanup, whether we succeeded or failed. */ + done: + uv__free(application); + uv__free(application_path); + uv__free(arguments); + uv__free(cwd); + uv__free(env); + uv__free(alloc_path); + + if (process->child_stdio_buffer != NULL) { + /* Clean up child stdio handles. */ + uv__stdio_destroy(process->child_stdio_buffer); + process->child_stdio_buffer = NULL; + } + + return uv_translate_sys_error(err); +} + + +static int uv__kill(HANDLE process_handle, int signum) { + switch (signum) { + case SIGTERM: + case SIGKILL: + case SIGINT: { + /* Unconditionally terminate the process. On Windows, killed processes */ + /* normally return 1. */ + DWORD status; + int err; + + if (TerminateProcess(process_handle, 1)) + return 0; + + /* If the process already exited before TerminateProcess was called, */ + /* TerminateProcess will fail with ERROR_ACCESS_DENIED. */ + err = GetLastError(); + if (err == ERROR_ACCESS_DENIED && + GetExitCodeProcess(process_handle, &status) && + status != STILL_ACTIVE) { + return UV_ESRCH; + } + + return uv_translate_sys_error(err); + } + + case 0: { + /* Health check: is the process still alive? */ + DWORD status; + + if (!GetExitCodeProcess(process_handle, &status)) + return uv_translate_sys_error(GetLastError()); + + if (status != STILL_ACTIVE) + return UV_ESRCH; + + return 0; + } + + default: + /* Unsupported signal. */ + return UV_ENOSYS; + } +} + + +int uv_process_kill(uv_process_t* process, int signum) { + int err; + + if (process->process_handle == INVALID_HANDLE_VALUE) { + return UV_EINVAL; + } + + err = uv__kill(process->process_handle, signum); + if (err) { + return err; /* err is already translated. */ + } + + process->exit_signal = signum; + + return 0; +} + + +int uv_kill(int pid, int signum) { + int err; + HANDLE process_handle = OpenProcess(PROCESS_TERMINATE | + PROCESS_QUERY_INFORMATION, FALSE, pid); + + if (process_handle == NULL) { + err = GetLastError(); + if (err == ERROR_INVALID_PARAMETER) { + return UV_ESRCH; + } else { + return uv_translate_sys_error(err); + } + } + + err = uv__kill(process_handle, signum); + CloseHandle(process_handle); + + return err; /* err is already translated. */ +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/req-inl.h b/lib/ESPiLight/pilight/libs/libuv/win/req-inl.h new file mode 100644 index 0000000..f2513b7 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/req-inl.h @@ -0,0 +1,221 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_WIN_REQ_INL_H_ +#define UV_WIN_REQ_INL_H_ + +#include + +#include "uv.h" +#include "internal.h" + + +#define SET_REQ_STATUS(req, status) \ + (req)->u.io.overlapped.Internal = (ULONG_PTR) (status) + +#define SET_REQ_ERROR(req, error) \ + SET_REQ_STATUS((req), NTSTATUS_FROM_WIN32((error))) + +/* Note: used open-coded in UV_REQ_INIT() because of a circular dependency + * between src/uv-common.h and src/win/internal.h. + */ +#define SET_REQ_SUCCESS(req) \ + SET_REQ_STATUS((req), STATUS_SUCCESS) + +#define GET_REQ_STATUS(req) \ + ((NTSTATUS) (req)->u.io.overlapped.Internal) + +#define REQ_SUCCESS(req) \ + (NT_SUCCESS(GET_REQ_STATUS((req)))) + +#define GET_REQ_ERROR(req) \ + (pRtlNtStatusToDosError(GET_REQ_STATUS((req)))) + +#define GET_REQ_SOCK_ERROR(req) \ + (uv_ntstatus_to_winsock_error(GET_REQ_STATUS((req)))) + + +#define REGISTER_HANDLE_REQ(loop, handle, req) \ + do { \ + INCREASE_ACTIVE_COUNT((loop), (handle)); \ + uv__req_register((loop), (req)); \ + } while (0) + +#define UNREGISTER_HANDLE_REQ(loop, handle, req) \ + do { \ + DECREASE_ACTIVE_COUNT((loop), (handle)); \ + uv__req_unregister((loop), (req)); \ + } while (0) + + +#define UV_SUCCEEDED_WITHOUT_IOCP(result) \ + ((result) && (handle->flags & UV_HANDLE_SYNC_BYPASS_IOCP)) + +#define UV_SUCCEEDED_WITH_IOCP(result) \ + ((result) || (GetLastError() == ERROR_IO_PENDING)) + + +#define POST_COMPLETION_FOR_REQ(loop, req) \ + if (!PostQueuedCompletionStatus((loop)->iocp, \ + 0, \ + 0, \ + &((req)->u.io.overlapped))) { \ + uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); \ + } + + +INLINE static uv_req_t* uv_overlapped_to_req(OVERLAPPED* overlapped) { + return CONTAINING_RECORD(overlapped, uv_req_t, u.io.overlapped); +} + + +INLINE static void uv_insert_pending_req(uv_loop_t* loop, uv_req_t* req) { + req->next_req = NULL; + if (loop->pending_reqs_tail) { +#ifdef _DEBUG + /* Ensure the request is not already in the queue, or the queue + * will get corrupted. + */ + uv_req_t* current = loop->pending_reqs_tail; + do { + assert(req != current); + current = current->next_req; + } while(current != loop->pending_reqs_tail); +#endif + + req->next_req = loop->pending_reqs_tail->next_req; + loop->pending_reqs_tail->next_req = req; + loop->pending_reqs_tail = req; + } else { + req->next_req = req; + loop->pending_reqs_tail = req; + } +} + + +#define DELEGATE_STREAM_REQ(loop, req, method, handle_at) \ + do { \ + switch (((uv_handle_t*) (req)->handle_at)->type) { \ + case UV_TCP: \ + uv_process_tcp_##method##_req(loop, \ + (uv_tcp_t*) ((req)->handle_at), \ + req); \ + break; \ + \ + case UV_NAMED_PIPE: \ + uv_process_pipe_##method##_req(loop, \ + (uv_pipe_t*) ((req)->handle_at), \ + req); \ + break; \ + \ + case UV_TTY: \ + uv_process_tty_##method##_req(loop, \ + (uv_tty_t*) ((req)->handle_at), \ + req); \ + break; \ + \ + default: \ + assert(0); \ + } \ + } while (0) + + +INLINE static int uv_process_reqs(uv_loop_t* loop) { + uv_req_t* req; + uv_req_t* first; + uv_req_t* next; + + if (loop->pending_reqs_tail == NULL) + return 0; + + first = loop->pending_reqs_tail->next_req; + next = first; + loop->pending_reqs_tail = NULL; + + while (next != NULL) { + req = next; + next = req->next_req != first ? req->next_req : NULL; + + switch (req->type) { + case UV_READ: + DELEGATE_STREAM_REQ(loop, req, read, data); + break; + + case UV_WRITE: + DELEGATE_STREAM_REQ(loop, (uv_write_t*) req, write, handle); + break; + + case UV_ACCEPT: + DELEGATE_STREAM_REQ(loop, req, accept, data); + break; + + case UV_CONNECT: + DELEGATE_STREAM_REQ(loop, (uv_connect_t*) req, connect, handle); + break; + + case UV_SHUTDOWN: + /* Tcp shutdown requests don't come here. */ + assert(((uv_shutdown_t*) req)->handle->type == UV_NAMED_PIPE); + uv_process_pipe_shutdown_req( + loop, + (uv_pipe_t*) ((uv_shutdown_t*) req)->handle, + (uv_shutdown_t*) req); + break; + + case UV_UDP_RECV: + uv_process_udp_recv_req(loop, (uv_udp_t*) req->data, req); + break; + + case UV_UDP_SEND: + uv_process_udp_send_req(loop, + ((uv_udp_send_t*) req)->handle, + (uv_udp_send_t*) req); + break; + + case UV_WAKEUP: + uv_process_async_wakeup_req(loop, (uv_async_t*) req->data, req); + break; + + case UV_SIGNAL_REQ: + uv_process_signal_req(loop, (uv_signal_t*) req->data, req); + break; + + case UV_POLL_REQ: + uv_process_poll_req(loop, (uv_poll_t*) req->data, req); + break; + + case UV_PROCESS_EXIT: + uv_process_proc_exit(loop, (uv_process_t*) req->data); + break; + + case UV_FS_EVENT_REQ: + uv_process_fs_event_req(loop, req, (uv_fs_event_t*) req->data); + break; + + default: + assert(0); + } + } + + return 1; +} + +#endif /* UV_WIN_REQ_INL_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/win/req.c b/lib/ESPiLight/pilight/libs/libuv/win/req.c new file mode 100644 index 0000000..111cc5e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/req.c @@ -0,0 +1,25 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include + +#include "uv.h" +#include "internal.h" diff --git a/lib/ESPiLight/pilight/libs/libuv/win/signal.c b/lib/ESPiLight/pilight/libs/libuv/win/signal.c new file mode 100644 index 0000000..7b42dd9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/signal.c @@ -0,0 +1,277 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include + +#include "uv.h" +#include "internal.h" +#include "handle-inl.h" +#include "req-inl.h" + + +RB_HEAD(uv_signal_tree_s, uv_signal_s); + +static struct uv_signal_tree_s uv__signal_tree = RB_INITIALIZER(uv__signal_tree); +static CRITICAL_SECTION uv__signal_lock; + +static BOOL WINAPI uv__signal_control_handler(DWORD type); + +int uv__signal_start(uv_signal_t* handle, + uv_signal_cb signal_cb, + int signum, + int oneshot); + +void uv_signals_init(void) { + InitializeCriticalSection(&uv__signal_lock); + if (!SetConsoleCtrlHandler(uv__signal_control_handler, TRUE)) + abort(); +} + + +static int uv__signal_compare(uv_signal_t* w1, uv_signal_t* w2) { + /* Compare signums first so all watchers with the same signnum end up */ + /* adjacent. */ + if (w1->signum < w2->signum) return -1; + if (w1->signum > w2->signum) return 1; + + /* Sort by loop pointer, so we can easily look up the first item after */ + /* { .signum = x, .loop = NULL } */ + if ((uintptr_t) w1->loop < (uintptr_t) w2->loop) return -1; + if ((uintptr_t) w1->loop > (uintptr_t) w2->loop) return 1; + + if ((uintptr_t) w1 < (uintptr_t) w2) return -1; + if ((uintptr_t) w1 > (uintptr_t) w2) return 1; + + return 0; +} + + +RB_GENERATE_STATIC(uv_signal_tree_s, uv_signal_s, tree_entry, uv__signal_compare); + + +/* + * Dispatches signal {signum} to all active uv_signal_t watchers in all loops. + * Returns 1 if the signal was dispatched to any watcher, or 0 if there were + * no active signal watchers observing this signal. + */ +int uv__signal_dispatch(int signum) { + uv_signal_t lookup; + uv_signal_t* handle; + int dispatched; + + dispatched = 0; + + EnterCriticalSection(&uv__signal_lock); + + lookup.signum = signum; + lookup.loop = NULL; + + for (handle = RB_NFIND(uv_signal_tree_s, &uv__signal_tree, &lookup); + handle != NULL && handle->signum == signum; + handle = RB_NEXT(uv_signal_tree_s, &uv__signal_tree, handle)) { + unsigned long previous = InterlockedExchange( + (volatile LONG*) &handle->pending_signum, signum); + + if (handle->flags & UV__SIGNAL_ONE_SHOT_DISPATCHED) + continue; + + if (!previous) { + POST_COMPLETION_FOR_REQ(handle->loop, &handle->signal_req); + } + + dispatched = 1; + if (handle->flags & UV__SIGNAL_ONE_SHOT) + handle->flags |= UV__SIGNAL_ONE_SHOT_DISPATCHED; + } + + LeaveCriticalSection(&uv__signal_lock); + + return dispatched; +} + + +static BOOL WINAPI uv__signal_control_handler(DWORD type) { + switch (type) { + case CTRL_C_EVENT: + return uv__signal_dispatch(SIGINT); + + case CTRL_BREAK_EVENT: + return uv__signal_dispatch(SIGBREAK); + + case CTRL_CLOSE_EVENT: + if (uv__signal_dispatch(SIGHUP)) { + /* Windows will terminate the process after the control handler */ + /* returns. After that it will just terminate our process. Therefore */ + /* block the signal handler so the main loop has some time to pick */ + /* up the signal and do something for a few seconds. */ + Sleep(INFINITE); + return TRUE; + } + return FALSE; + + case CTRL_LOGOFF_EVENT: + case CTRL_SHUTDOWN_EVENT: + /* These signals are only sent to services. Services have their own */ + /* notification mechanism, so there's no point in handling these. */ + + default: + /* We don't handle these. */ + return FALSE; + } +} + + +int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle) { + uv__handle_init(loop, (uv_handle_t*) handle, UV_SIGNAL); + handle->pending_signum = 0; + handle->signum = 0; + handle->signal_cb = NULL; + + UV_REQ_INIT(&handle->signal_req, UV_SIGNAL_REQ); + handle->signal_req.data = handle; + + return 0; +} + + +int uv_signal_stop(uv_signal_t* handle) { + uv_signal_t* removed_handle; + + /* If the watcher wasn't started, this is a no-op. */ + if (handle->signum == 0) + return 0; + + EnterCriticalSection(&uv__signal_lock); + + removed_handle = RB_REMOVE(uv_signal_tree_s, &uv__signal_tree, handle); + assert(removed_handle == handle); + + LeaveCriticalSection(&uv__signal_lock); + + handle->signum = 0; + uv__handle_stop(handle); + + return 0; +} + + +int uv_signal_start(uv_signal_t* handle, uv_signal_cb signal_cb, int signum) { + return uv__signal_start(handle, signal_cb, signum, 0); +} + + +int uv_signal_start_oneshot(uv_signal_t* handle, + uv_signal_cb signal_cb, + int signum) { + return uv__signal_start(handle, signal_cb, signum, 1); +} + + +int uv__signal_start(uv_signal_t* handle, + uv_signal_cb signal_cb, + int signum, + int oneshot) { + /* Test for invalid signal values. */ + if (signum != SIGWINCH && (signum <= 0 || signum >= NSIG)) + return UV_EINVAL; + + /* Short circuit: if the signal watcher is already watching {signum} don't */ + /* go through the process of deregistering and registering the handler. */ + /* Additionally, this avoids pending signals getting lost in the (small) */ + /* time frame that handle->signum == 0. */ + if (signum == handle->signum) { + handle->signal_cb = signal_cb; + return 0; + } + + /* If the signal handler was already active, stop it first. */ + if (handle->signum != 0) { + int r = uv_signal_stop(handle); + /* uv_signal_stop is infallible. */ + assert(r == 0); + } + + EnterCriticalSection(&uv__signal_lock); + + handle->signum = signum; + if (oneshot) + handle->flags |= UV__SIGNAL_ONE_SHOT; + + RB_INSERT(uv_signal_tree_s, &uv__signal_tree, handle); + + LeaveCriticalSection(&uv__signal_lock); + + handle->signal_cb = signal_cb; + uv__handle_start(handle); + + return 0; +} + + +void uv_process_signal_req(uv_loop_t* loop, uv_signal_t* handle, + uv_req_t* req) { + long dispatched_signum; + + assert(handle->type == UV_SIGNAL); + assert(req->type == UV_SIGNAL_REQ); + + dispatched_signum = InterlockedExchange( + (volatile LONG*) &handle->pending_signum, 0); + assert(dispatched_signum != 0); + + /* Check if the pending signal equals the signum that we are watching for. */ + /* These can get out of sync when the handler is stopped and restarted */ + /* while the signal_req is pending. */ + if (dispatched_signum == handle->signum) + handle->signal_cb(handle, dispatched_signum); + + if (handle->flags & UV__SIGNAL_ONE_SHOT) + uv_signal_stop(handle); + + if (handle->flags & UV__HANDLE_CLOSING) { + /* When it is closing, it must be stopped at this point. */ + assert(handle->signum == 0); + uv_want_endgame(loop, (uv_handle_t*) handle); + } +} + + +void uv_signal_close(uv_loop_t* loop, uv_signal_t* handle) { + uv_signal_stop(handle); + uv__handle_closing(handle); + + if (handle->pending_signum == 0) { + uv_want_endgame(loop, (uv_handle_t*) handle); + } +} + + +void uv_signal_endgame(uv_loop_t* loop, uv_signal_t* handle) { + assert(handle->flags & UV__HANDLE_CLOSING); + assert(!(handle->flags & UV_HANDLE_CLOSED)); + + assert(handle->signum == 0); + assert(handle->pending_signum == 0); + + handle->flags |= UV_HANDLE_CLOSED; + + uv__handle_close(handle); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/snprintf.c b/lib/ESPiLight/pilight/libs/libuv/win/snprintf.c new file mode 100644 index 0000000..776c0e3 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/snprintf.c @@ -0,0 +1,42 @@ +/* Copyright the libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#if defined(_MSC_VER) && _MSC_VER < 1900 + +#include +#include + +/* Emulate snprintf() on MSVC<2015, _snprintf() doesn't zero-terminate the buffer + * on overflow... + */ +int snprintf(char* buf, size_t len, const char* fmt, ...) { + int n; + va_list ap; + va_start(ap, fmt); + + n = _vscprintf(fmt, ap); + vsnprintf_s(buf, len, _TRUNCATE, fmt, ap); + + va_end(ap); + return n; +} + +#endif diff --git a/lib/ESPiLight/pilight/libs/libuv/win/stream-inl.h b/lib/ESPiLight/pilight/libs/libuv/win/stream-inl.h new file mode 100644 index 0000000..bf12148 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/stream-inl.h @@ -0,0 +1,55 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_WIN_STREAM_INL_H_ +#define UV_WIN_STREAM_INL_H_ + +#include + +#include "uv.h" +#include "internal.h" +#include "handle-inl.h" +#include "req-inl.h" + + +INLINE static void uv_stream_init(uv_loop_t* loop, + uv_stream_t* handle, + uv_handle_type type) { + uv__handle_init(loop, (uv_handle_t*) handle, type); + handle->write_queue_size = 0; + handle->activecnt = 0; +} + + +INLINE static void uv_connection_init(uv_stream_t* handle) { + handle->flags |= UV_HANDLE_CONNECTION; + handle->stream.conn.write_reqs_pending = 0; + + UV_REQ_INIT(&handle->read_req, UV_READ); + handle->read_req.event_handle = NULL; + handle->read_req.wait_handle = INVALID_HANDLE_VALUE; + handle->read_req.data = handle; + + handle->stream.conn.shutdown_req = NULL; +} + + +#endif /* UV_WIN_STREAM_INL_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/win/stream.c b/lib/ESPiLight/pilight/libs/libuv/win/stream.c new file mode 100644 index 0000000..13cbfdc --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/stream.c @@ -0,0 +1,248 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include + +#include "uv.h" +#include "internal.h" +#include "handle-inl.h" +#include "req-inl.h" + + +int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb) { + int err; + + err = ERROR_INVALID_PARAMETER; + switch (stream->type) { + case UV_TCP: + err = uv_tcp_listen((uv_tcp_t*)stream, backlog, cb); + break; + case UV_NAMED_PIPE: + err = uv_pipe_listen((uv_pipe_t*)stream, backlog, cb); + break; + default: + assert(0); + } + + return uv_translate_sys_error(err); +} + + +int uv_accept(uv_stream_t* server, uv_stream_t* client) { + int err; + + err = ERROR_INVALID_PARAMETER; + switch (server->type) { + case UV_TCP: + err = uv_tcp_accept((uv_tcp_t*)server, (uv_tcp_t*)client); + break; + case UV_NAMED_PIPE: + err = uv_pipe_accept((uv_pipe_t*)server, client); + break; + default: + assert(0); + } + + return uv_translate_sys_error(err); +} + + +int uv_read_start(uv_stream_t* handle, uv_alloc_cb alloc_cb, + uv_read_cb read_cb) { + int err; + + if (handle->flags & UV_HANDLE_READING) { + return UV_EALREADY; + } + + if (!(handle->flags & UV_HANDLE_READABLE)) { + return UV_ENOTCONN; + } + + err = ERROR_INVALID_PARAMETER; + switch (handle->type) { + case UV_TCP: + err = uv_tcp_read_start((uv_tcp_t*)handle, alloc_cb, read_cb); + break; + case UV_NAMED_PIPE: + err = uv_pipe_read_start((uv_pipe_t*)handle, alloc_cb, read_cb); + break; + case UV_TTY: + err = uv_tty_read_start((uv_tty_t*) handle, alloc_cb, read_cb); + break; + default: + assert(0); + } + + return uv_translate_sys_error(err); +} + + +int uv_read_stop(uv_stream_t* handle) { + int err; + + if (!(handle->flags & UV_HANDLE_READING)) + return 0; + + err = 0; + if (handle->type == UV_TTY) { + err = uv_tty_read_stop((uv_tty_t*) handle); + } else { + if (handle->type == UV_NAMED_PIPE) { + uv__pipe_stop_read((uv_pipe_t*) handle); + } else { + handle->flags &= ~UV_HANDLE_READING; + } + DECREASE_ACTIVE_COUNT(handle->loop, handle); + } + + return uv_translate_sys_error(err); +} + + +int uv_write(uv_write_t* req, + uv_stream_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_write_cb cb) { + uv_loop_t* loop = handle->loop; + int err; + + if (!(handle->flags & UV_HANDLE_WRITABLE)) { + return UV_EPIPE; + } + + err = ERROR_INVALID_PARAMETER; + switch (handle->type) { + case UV_TCP: + err = uv_tcp_write(loop, req, (uv_tcp_t*) handle, bufs, nbufs, cb); + break; + case UV_NAMED_PIPE: + err = uv_pipe_write(loop, req, (uv_pipe_t*) handle, bufs, nbufs, cb); + break; + case UV_TTY: + err = uv_tty_write(loop, req, (uv_tty_t*) handle, bufs, nbufs, cb); + break; + default: + assert(0); + } + + return uv_translate_sys_error(err); +} + + +int uv_write2(uv_write_t* req, + uv_stream_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_stream_t* send_handle, + uv_write_cb cb) { + uv_loop_t* loop = handle->loop; + int err; + + if (!(handle->flags & UV_HANDLE_WRITABLE)) { + return UV_EPIPE; + } + + err = ERROR_INVALID_PARAMETER; + switch (handle->type) { + case UV_NAMED_PIPE: + err = uv_pipe_write2(loop, + req, + (uv_pipe_t*) handle, + bufs, + nbufs, + send_handle, + cb); + break; + default: + assert(0); + } + + return uv_translate_sys_error(err); +} + + +int uv_try_write(uv_stream_t* stream, + const uv_buf_t bufs[], + unsigned int nbufs) { + if (stream->flags & UV__HANDLE_CLOSING) + return UV_EBADF; + if (!(stream->flags & UV_HANDLE_WRITABLE)) + return UV_EPIPE; + + switch (stream->type) { + case UV_TCP: + return uv__tcp_try_write((uv_tcp_t*) stream, bufs, nbufs); + case UV_TTY: + return uv__tty_try_write((uv_tty_t*) stream, bufs, nbufs); + case UV_NAMED_PIPE: + return UV_EAGAIN; + default: + assert(0); + return UV_ENOSYS; + } +} + + +int uv_shutdown(uv_shutdown_t* req, uv_stream_t* handle, uv_shutdown_cb cb) { + uv_loop_t* loop = handle->loop; + + if (!(handle->flags & UV_HANDLE_WRITABLE)) { + return UV_EPIPE; + } + + UV_REQ_INIT(req, UV_SHUTDOWN); + req->handle = handle; + req->cb = cb; + + handle->flags &= ~UV_HANDLE_WRITABLE; + handle->stream.conn.shutdown_req = req; + handle->reqs_pending++; + REGISTER_HANDLE_REQ(loop, handle, req); + + uv_want_endgame(loop, (uv_handle_t*)handle); + + return 0; +} + + +int uv_is_readable(const uv_stream_t* handle) { + return !!(handle->flags & UV_HANDLE_READABLE); +} + + +int uv_is_writable(const uv_stream_t* handle) { + return !!(handle->flags & UV_HANDLE_WRITABLE); +} + + +int uv_stream_set_blocking(uv_stream_t* handle, int blocking) { + if (handle->type != UV_NAMED_PIPE) + return UV_EINVAL; + + if (blocking != 0) + handle->flags |= UV_HANDLE_BLOCKING_WRITES; + else + handle->flags &= ~UV_HANDLE_BLOCKING_WRITES; + + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/tcp.c b/lib/ESPiLight/pilight/libs/libuv/win/tcp.c new file mode 100644 index 0000000..972539f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/tcp.c @@ -0,0 +1,1505 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include + +#include "uv.h" +#include "internal.h" +#include "handle-inl.h" +#include "stream-inl.h" +#include "req-inl.h" + + +/* + * Threshold of active tcp streams for which to preallocate tcp read buffers. + * (Due to node slab allocator performing poorly under this pattern, + * the optimization is temporarily disabled (threshold=0). This will be + * revisited once node allocator is improved.) + */ +const unsigned int uv_active_tcp_streams_threshold = 0; + +/* + * Number of simultaneous pending AcceptEx calls. + */ +const unsigned int uv_simultaneous_server_accepts = 32; + +/* A zero-size buffer for use by uv_tcp_read */ +static char uv_zero_[] = ""; + +static int uv__tcp_nodelay(uv_tcp_t* handle, SOCKET socket, int enable) { + if (setsockopt(socket, + IPPROTO_TCP, + TCP_NODELAY, + (const char*)&enable, + sizeof enable) == -1) { + return WSAGetLastError(); + } + return 0; +} + + +static int uv__tcp_keepalive(uv_tcp_t* handle, SOCKET socket, int enable, unsigned int delay) { + if (setsockopt(socket, + SOL_SOCKET, + SO_KEEPALIVE, + (const char*)&enable, + sizeof enable) == -1) { + return WSAGetLastError(); + } + + if (enable && setsockopt(socket, + IPPROTO_TCP, + TCP_KEEPALIVE, + (const char*)&delay, + sizeof delay) == -1) { + return WSAGetLastError(); + } + + return 0; +} + + +static int uv_tcp_set_socket(uv_loop_t* loop, + uv_tcp_t* handle, + SOCKET socket, + int family, + int imported) { + DWORD yes = 1; + int non_ifs_lsp; + int err; + + if (handle->socket != INVALID_SOCKET) + return UV_EBUSY; + + /* Set the socket to nonblocking mode */ + if (ioctlsocket(socket, FIONBIO, &yes) == SOCKET_ERROR) { + return WSAGetLastError(); + } + + /* Make the socket non-inheritable */ + if (!SetHandleInformation((HANDLE) socket, HANDLE_FLAG_INHERIT, 0)) + return GetLastError(); + + /* Associate it with the I/O completion port. */ + /* Use uv_handle_t pointer as completion key. */ + if (CreateIoCompletionPort((HANDLE)socket, + loop->iocp, + (ULONG_PTR)socket, + 0) == NULL) { + if (imported) { + handle->flags |= UV_HANDLE_EMULATE_IOCP; + } else { + return GetLastError(); + } + } + + if (family == AF_INET6) { + non_ifs_lsp = uv_tcp_non_ifs_lsp_ipv6; + } else { + non_ifs_lsp = uv_tcp_non_ifs_lsp_ipv4; + } + + if (pSetFileCompletionNotificationModes && + !(handle->flags & UV_HANDLE_EMULATE_IOCP) && !non_ifs_lsp) { + if (pSetFileCompletionNotificationModes((HANDLE) socket, + FILE_SKIP_SET_EVENT_ON_HANDLE | + FILE_SKIP_COMPLETION_PORT_ON_SUCCESS)) { + handle->flags |= UV_HANDLE_SYNC_BYPASS_IOCP; + } else if (GetLastError() != ERROR_INVALID_FUNCTION) { + return GetLastError(); + } + } + + if (handle->flags & UV_HANDLE_TCP_NODELAY) { + err = uv__tcp_nodelay(handle, socket, 1); + if (err) + return err; + } + + /* TODO: Use stored delay. */ + if (handle->flags & UV_HANDLE_TCP_KEEPALIVE) { + err = uv__tcp_keepalive(handle, socket, 1, 60); + if (err) + return err; + } + + handle->socket = socket; + + if (family == AF_INET6) { + handle->flags |= UV_HANDLE_IPV6; + } else { + assert(!(handle->flags & UV_HANDLE_IPV6)); + } + + return 0; +} + + +int uv_tcp_init_ex(uv_loop_t* loop, uv_tcp_t* handle, unsigned int flags) { + int domain; + + /* Use the lower 8 bits for the domain */ + domain = flags & 0xFF; + if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC) + return UV_EINVAL; + + if (flags & ~0xFF) + return UV_EINVAL; + + uv_stream_init(loop, (uv_stream_t*) handle, UV_TCP); + handle->tcp.serv.accept_reqs = NULL; + handle->tcp.serv.pending_accepts = NULL; + handle->socket = INVALID_SOCKET; + handle->reqs_pending = 0; + handle->tcp.serv.func_acceptex = NULL; + handle->tcp.conn.func_connectex = NULL; + handle->tcp.serv.processed_accepts = 0; + handle->delayed_error = 0; + + /* If anything fails beyond this point we need to remove the handle from + * the handle queue, since it was added by uv__handle_init in uv_stream_init. + */ + + if (domain != AF_UNSPEC) { + SOCKET sock; + DWORD err; + + sock = socket(domain, SOCK_STREAM, 0); + if (sock == INVALID_SOCKET) { + err = WSAGetLastError(); + QUEUE_REMOVE(&handle->handle_queue); + return uv_translate_sys_error(err); + } + + err = uv_tcp_set_socket(handle->loop, handle, sock, domain, 0); + if (err) { + closesocket(sock); + QUEUE_REMOVE(&handle->handle_queue); + return uv_translate_sys_error(err); + } + + } + + return 0; +} + + +int uv_tcp_init(uv_loop_t* loop, uv_tcp_t* handle) { + return uv_tcp_init_ex(loop, handle, AF_UNSPEC); +} + + +void uv_tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle) { + int err; + unsigned int i; + uv_tcp_accept_t* req; + + if (handle->flags & UV_HANDLE_CONNECTION && + handle->stream.conn.shutdown_req != NULL && + handle->stream.conn.write_reqs_pending == 0) { + + UNREGISTER_HANDLE_REQ(loop, handle, handle->stream.conn.shutdown_req); + + err = 0; + if (handle->flags & UV__HANDLE_CLOSING) { + err = ERROR_OPERATION_ABORTED; + } else if (shutdown(handle->socket, SD_SEND) == SOCKET_ERROR) { + err = WSAGetLastError(); + } + + if (handle->stream.conn.shutdown_req->cb) { + handle->stream.conn.shutdown_req->cb(handle->stream.conn.shutdown_req, + uv_translate_sys_error(err)); + } + + handle->stream.conn.shutdown_req = NULL; + DECREASE_PENDING_REQ_COUNT(handle); + return; + } + + if (handle->flags & UV__HANDLE_CLOSING && + handle->reqs_pending == 0) { + assert(!(handle->flags & UV_HANDLE_CLOSED)); + + if (!(handle->flags & UV_HANDLE_TCP_SOCKET_CLOSED)) { + closesocket(handle->socket); + handle->socket = INVALID_SOCKET; + handle->flags |= UV_HANDLE_TCP_SOCKET_CLOSED; + } + + if (!(handle->flags & UV_HANDLE_CONNECTION) && handle->tcp.serv.accept_reqs) { + if (handle->flags & UV_HANDLE_EMULATE_IOCP) { + for (i = 0; i < uv_simultaneous_server_accepts; i++) { + req = &handle->tcp.serv.accept_reqs[i]; + if (req->wait_handle != INVALID_HANDLE_VALUE) { + UnregisterWait(req->wait_handle); + req->wait_handle = INVALID_HANDLE_VALUE; + } + if (req->event_handle) { + CloseHandle(req->event_handle); + req->event_handle = NULL; + } + } + } + + uv__free(handle->tcp.serv.accept_reqs); + handle->tcp.serv.accept_reqs = NULL; + } + + if (handle->flags & UV_HANDLE_CONNECTION && + handle->flags & UV_HANDLE_EMULATE_IOCP) { + if (handle->read_req.wait_handle != INVALID_HANDLE_VALUE) { + UnregisterWait(handle->read_req.wait_handle); + handle->read_req.wait_handle = INVALID_HANDLE_VALUE; + } + if (handle->read_req.event_handle) { + CloseHandle(handle->read_req.event_handle); + handle->read_req.event_handle = NULL; + } + } + + uv__handle_close(handle); + loop->active_tcp_streams--; + } +} + + +/* Unlike on Unix, here we don't set SO_REUSEADDR, because it doesn't just + * allow binding to addresses that are in use by sockets in TIME_WAIT, it + * effectively allows 'stealing' a port which is in use by another application. + * + * SO_EXCLUSIVEADDRUSE is also not good here because it does check all sockets, + * regardless of state, so we'd get an error even if the port is in use by a + * socket in TIME_WAIT state. + * + * See issue #1360. + * + */ +static int uv_tcp_try_bind(uv_tcp_t* handle, + const struct sockaddr* addr, + unsigned int addrlen, + unsigned int flags) { + DWORD err; + int r; + + if (handle->socket == INVALID_SOCKET) { + SOCKET sock; + + /* Cannot set IPv6-only mode on non-IPv6 socket. */ + if ((flags & UV_TCP_IPV6ONLY) && addr->sa_family != AF_INET6) + return ERROR_INVALID_PARAMETER; + + sock = socket(addr->sa_family, SOCK_STREAM, 0); + if (sock == INVALID_SOCKET) { + return WSAGetLastError(); + } + + err = uv_tcp_set_socket(handle->loop, handle, sock, addr->sa_family, 0); + if (err) { + closesocket(sock); + return err; + } + } + +#ifdef IPV6_V6ONLY + if (addr->sa_family == AF_INET6) { + int on; + + on = (flags & UV_TCP_IPV6ONLY) != 0; + + /* TODO: how to handle errors? This may fail if there is no ipv4 stack */ + /* available, or when run on XP/2003 which have no support for dualstack */ + /* sockets. For now we're silently ignoring the error. */ + setsockopt(handle->socket, + IPPROTO_IPV6, + IPV6_V6ONLY, + (const char*)&on, + sizeof on); + } +#endif + + r = bind(handle->socket, addr, addrlen); + + if (r == SOCKET_ERROR) { + err = WSAGetLastError(); + if (err == WSAEADDRINUSE) { + /* Some errors are not to be reported until connect() or listen() */ + handle->delayed_error = err; + } else { + return err; + } + } + + handle->flags |= UV_HANDLE_BOUND; + + return 0; +} + + +static void CALLBACK post_completion(void* context, BOOLEAN timed_out) { + uv_req_t* req; + uv_tcp_t* handle; + + req = (uv_req_t*) context; + assert(req != NULL); + handle = (uv_tcp_t*)req->data; + assert(handle != NULL); + assert(!timed_out); + + if (!PostQueuedCompletionStatus(handle->loop->iocp, + req->u.io.overlapped.InternalHigh, + 0, + &req->u.io.overlapped)) { + uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); + } +} + + +static void CALLBACK post_write_completion(void* context, BOOLEAN timed_out) { + uv_write_t* req; + uv_tcp_t* handle; + + req = (uv_write_t*) context; + assert(req != NULL); + handle = (uv_tcp_t*)req->handle; + assert(handle != NULL); + assert(!timed_out); + + if (!PostQueuedCompletionStatus(handle->loop->iocp, + req->u.io.overlapped.InternalHigh, + 0, + &req->u.io.overlapped)) { + uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); + } +} + + +static void uv_tcp_queue_accept(uv_tcp_t* handle, uv_tcp_accept_t* req) { + uv_loop_t* loop = handle->loop; + BOOL success; + DWORD bytes; + SOCKET accept_socket; + short family; + + assert(handle->flags & UV_HANDLE_LISTENING); + assert(req->accept_socket == INVALID_SOCKET); + + /* choose family and extension function */ + if (handle->flags & UV_HANDLE_IPV6) { + family = AF_INET6; + } else { + family = AF_INET; + } + + /* Open a socket for the accepted connection. */ + accept_socket = socket(family, SOCK_STREAM, 0); + if (accept_socket == INVALID_SOCKET) { + SET_REQ_ERROR(req, WSAGetLastError()); + uv_insert_pending_req(loop, (uv_req_t*)req); + handle->reqs_pending++; + return; + } + + /* Make the socket non-inheritable */ + if (!SetHandleInformation((HANDLE) accept_socket, HANDLE_FLAG_INHERIT, 0)) { + SET_REQ_ERROR(req, GetLastError()); + uv_insert_pending_req(loop, (uv_req_t*)req); + handle->reqs_pending++; + closesocket(accept_socket); + return; + } + + /* Prepare the overlapped structure. */ + memset(&(req->u.io.overlapped), 0, sizeof(req->u.io.overlapped)); + if (handle->flags & UV_HANDLE_EMULATE_IOCP) { + req->u.io.overlapped.hEvent = (HANDLE) ((ULONG_PTR) req->event_handle | 1); + } + + success = handle->tcp.serv.func_acceptex(handle->socket, + accept_socket, + (void*)req->accept_buffer, + 0, + sizeof(struct sockaddr_storage), + sizeof(struct sockaddr_storage), + &bytes, + &req->u.io.overlapped); + + if (UV_SUCCEEDED_WITHOUT_IOCP(success)) { + /* Process the req without IOCP. */ + req->accept_socket = accept_socket; + handle->reqs_pending++; + uv_insert_pending_req(loop, (uv_req_t*)req); + } else if (UV_SUCCEEDED_WITH_IOCP(success)) { + /* The req will be processed with IOCP. */ + req->accept_socket = accept_socket; + handle->reqs_pending++; + if (handle->flags & UV_HANDLE_EMULATE_IOCP && + req->wait_handle == INVALID_HANDLE_VALUE && + !RegisterWaitForSingleObject(&req->wait_handle, + req->event_handle, post_completion, (void*) req, + INFINITE, WT_EXECUTEINWAITTHREAD)) { + SET_REQ_ERROR(req, GetLastError()); + uv_insert_pending_req(loop, (uv_req_t*)req); + handle->reqs_pending++; + return; + } + } else { + /* Make this req pending reporting an error. */ + SET_REQ_ERROR(req, WSAGetLastError()); + uv_insert_pending_req(loop, (uv_req_t*)req); + handle->reqs_pending++; + /* Destroy the preallocated client socket. */ + closesocket(accept_socket); + /* Destroy the event handle */ + if (handle->flags & UV_HANDLE_EMULATE_IOCP) { + CloseHandle(req->u.io.overlapped.hEvent); + req->event_handle = NULL; + } + } +} + + +static void uv_tcp_queue_read(uv_loop_t* loop, uv_tcp_t* handle) { + uv_read_t* req; + uv_buf_t buf; + int result; + DWORD bytes, flags; + + assert(handle->flags & UV_HANDLE_READING); + assert(!(handle->flags & UV_HANDLE_READ_PENDING)); + + req = &handle->read_req; + memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); + + /* + * Preallocate a read buffer if the number of active streams is below + * the threshold. + */ + if (loop->active_tcp_streams < uv_active_tcp_streams_threshold) { + handle->flags &= ~UV_HANDLE_ZERO_READ; + handle->tcp.conn.read_buffer = uv_buf_init(NULL, 0); + handle->alloc_cb((uv_handle_t*) handle, 65536, &handle->tcp.conn.read_buffer); + if (handle->tcp.conn.read_buffer.base == NULL || + handle->tcp.conn.read_buffer.len == 0) { + handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &handle->tcp.conn.read_buffer); + return; + } + assert(handle->tcp.conn.read_buffer.base != NULL); + buf = handle->tcp.conn.read_buffer; + } else { + handle->flags |= UV_HANDLE_ZERO_READ; + buf.base = (char*) &uv_zero_; + buf.len = 0; + } + + /* Prepare the overlapped structure. */ + memset(&(req->u.io.overlapped), 0, sizeof(req->u.io.overlapped)); + if (handle->flags & UV_HANDLE_EMULATE_IOCP) { + assert(req->event_handle); + req->u.io.overlapped.hEvent = (HANDLE) ((ULONG_PTR) req->event_handle | 1); + } + + flags = 0; + result = WSARecv(handle->socket, + (WSABUF*)&buf, + 1, + &bytes, + &flags, + &req->u.io.overlapped, + NULL); + + if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { + /* Process the req without IOCP. */ + handle->flags |= UV_HANDLE_READ_PENDING; + req->u.io.overlapped.InternalHigh = bytes; + handle->reqs_pending++; + uv_insert_pending_req(loop, (uv_req_t*)req); + } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { + /* The req will be processed with IOCP. */ + handle->flags |= UV_HANDLE_READ_PENDING; + handle->reqs_pending++; + if (handle->flags & UV_HANDLE_EMULATE_IOCP && + req->wait_handle == INVALID_HANDLE_VALUE && + !RegisterWaitForSingleObject(&req->wait_handle, + req->event_handle, post_completion, (void*) req, + INFINITE, WT_EXECUTEINWAITTHREAD)) { + SET_REQ_ERROR(req, GetLastError()); + uv_insert_pending_req(loop, (uv_req_t*)req); + } + } else { + /* Make this req pending reporting an error. */ + SET_REQ_ERROR(req, WSAGetLastError()); + uv_insert_pending_req(loop, (uv_req_t*)req); + handle->reqs_pending++; + } +} + + +int uv_tcp_listen(uv_tcp_t* handle, int backlog, uv_connection_cb cb) { + unsigned int i, simultaneous_accepts; + uv_tcp_accept_t* req; + int err; + + assert(backlog > 0); + + if (handle->flags & UV_HANDLE_LISTENING) { + handle->stream.serv.connection_cb = cb; + } + + if (handle->flags & UV_HANDLE_READING) { + return WSAEISCONN; + } + + if (handle->delayed_error) { + return handle->delayed_error; + } + + if (!(handle->flags & UV_HANDLE_BOUND)) { + err = uv_tcp_try_bind(handle, + (const struct sockaddr*) &uv_addr_ip4_any_, + sizeof(uv_addr_ip4_any_), + 0); + if (err) + return err; + if (handle->delayed_error) + return handle->delayed_error; + } + + if (!handle->tcp.serv.func_acceptex) { + if (!uv_get_acceptex_function(handle->socket, &handle->tcp.serv.func_acceptex)) { + return WSAEAFNOSUPPORT; + } + } + + if (!(handle->flags & UV_HANDLE_SHARED_TCP_SOCKET) && + listen(handle->socket, backlog) == SOCKET_ERROR) { + return WSAGetLastError(); + } + + handle->flags |= UV_HANDLE_LISTENING; + handle->stream.serv.connection_cb = cb; + INCREASE_ACTIVE_COUNT(loop, handle); + + simultaneous_accepts = handle->flags & UV_HANDLE_TCP_SINGLE_ACCEPT ? 1 + : uv_simultaneous_server_accepts; + + if(!handle->tcp.serv.accept_reqs) { + handle->tcp.serv.accept_reqs = (uv_tcp_accept_t*) + uv__malloc(uv_simultaneous_server_accepts * sizeof(uv_tcp_accept_t)); + if (!handle->tcp.serv.accept_reqs) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + + for (i = 0; i < simultaneous_accepts; i++) { + req = &handle->tcp.serv.accept_reqs[i]; + UV_REQ_INIT(req, UV_ACCEPT); + req->accept_socket = INVALID_SOCKET; + req->data = handle; + + req->wait_handle = INVALID_HANDLE_VALUE; + if (handle->flags & UV_HANDLE_EMULATE_IOCP) { + req->event_handle = CreateEvent(NULL, 0, 0, NULL); + if (!req->event_handle) { + uv_fatal_error(GetLastError(), "CreateEvent"); + } + } else { + req->event_handle = NULL; + } + + uv_tcp_queue_accept(handle, req); + } + + /* Initialize other unused requests too, because uv_tcp_endgame */ + /* doesn't know how how many requests were initialized, so it will */ + /* try to clean up {uv_simultaneous_server_accepts} requests. */ + for (i = simultaneous_accepts; i < uv_simultaneous_server_accepts; i++) { + req = &handle->tcp.serv.accept_reqs[i]; + UV_REQ_INIT(req, UV_ACCEPT); + req->accept_socket = INVALID_SOCKET; + req->data = handle; + req->wait_handle = INVALID_HANDLE_VALUE; + req->event_handle = NULL; + } + } + + return 0; +} + + +int uv_tcp_accept(uv_tcp_t* server, uv_tcp_t* client) { + uv_loop_t* loop = server->loop; + int err = 0; + int family; + + uv_tcp_accept_t* req = server->tcp.serv.pending_accepts; + + if (!req) { + /* No valid connections found, so we error out. */ + return WSAEWOULDBLOCK; + } + + if (req->accept_socket == INVALID_SOCKET) { + return WSAENOTCONN; + } + + if (server->flags & UV_HANDLE_IPV6) { + family = AF_INET6; + } else { + family = AF_INET; + } + + err = uv_tcp_set_socket(client->loop, + client, + req->accept_socket, + family, + 0); + if (err) { + closesocket(req->accept_socket); + } else { + uv_connection_init((uv_stream_t*) client); + /* AcceptEx() implicitly binds the accepted socket. */ + client->flags |= UV_HANDLE_BOUND | UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; + } + + /* Prepare the req to pick up a new connection */ + server->tcp.serv.pending_accepts = req->next_pending; + req->next_pending = NULL; + req->accept_socket = INVALID_SOCKET; + + if (!(server->flags & UV__HANDLE_CLOSING)) { + /* Check if we're in a middle of changing the number of pending accepts. */ + if (!(server->flags & UV_HANDLE_TCP_ACCEPT_STATE_CHANGING)) { + uv_tcp_queue_accept(server, req); + } else { + /* We better be switching to a single pending accept. */ + assert(server->flags & UV_HANDLE_TCP_SINGLE_ACCEPT); + + server->tcp.serv.processed_accepts++; + + if (server->tcp.serv.processed_accepts >= uv_simultaneous_server_accepts) { + server->tcp.serv.processed_accepts = 0; + /* + * All previously queued accept requests are now processed. + * We now switch to queueing just a single accept. + */ + uv_tcp_queue_accept(server, &server->tcp.serv.accept_reqs[0]); + server->flags &= ~UV_HANDLE_TCP_ACCEPT_STATE_CHANGING; + server->flags |= UV_HANDLE_TCP_SINGLE_ACCEPT; + } + } + } + + loop->active_tcp_streams++; + + return err; +} + + +int uv_tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb, + uv_read_cb read_cb) { + uv_loop_t* loop = handle->loop; + + handle->flags |= UV_HANDLE_READING; + handle->read_cb = read_cb; + handle->alloc_cb = alloc_cb; + INCREASE_ACTIVE_COUNT(loop, handle); + + /* If reading was stopped and then started again, there could still be a */ + /* read request pending. */ + if (!(handle->flags & UV_HANDLE_READ_PENDING)) { + if (handle->flags & UV_HANDLE_EMULATE_IOCP && + !handle->read_req.event_handle) { + handle->read_req.event_handle = CreateEvent(NULL, 0, 0, NULL); + if (!handle->read_req.event_handle) { + uv_fatal_error(GetLastError(), "CreateEvent"); + } + } + uv_tcp_queue_read(loop, handle); + } + + return 0; +} + + +static int uv_tcp_try_connect(uv_connect_t* req, + uv_tcp_t* handle, + const struct sockaddr* addr, + unsigned int addrlen, + uv_connect_cb cb) { + uv_loop_t* loop = handle->loop; + const struct sockaddr* bind_addr; + BOOL success; + DWORD bytes; + int err; + + if (handle->delayed_error) { + return handle->delayed_error; + } + + if (!(handle->flags & UV_HANDLE_BOUND)) { + if (addrlen == sizeof(uv_addr_ip4_any_)) { + bind_addr = (const struct sockaddr*) &uv_addr_ip4_any_; + } else if (addrlen == sizeof(uv_addr_ip6_any_)) { + bind_addr = (const struct sockaddr*) &uv_addr_ip6_any_; + } else { + abort(); + } + err = uv_tcp_try_bind(handle, bind_addr, addrlen, 0); + if (err) + return err; + if (handle->delayed_error) + return handle->delayed_error; + } + + if (!handle->tcp.conn.func_connectex) { + if (!uv_get_connectex_function(handle->socket, &handle->tcp.conn.func_connectex)) { + return WSAEAFNOSUPPORT; + } + } + + UV_REQ_INIT(req, UV_CONNECT); + req->handle = (uv_stream_t*) handle; + req->cb = cb; + memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); + + success = handle->tcp.conn.func_connectex(handle->socket, + addr, + addrlen, + NULL, + 0, + &bytes, + &req->u.io.overlapped); + + if (UV_SUCCEEDED_WITHOUT_IOCP(success)) { + /* Process the req without IOCP. */ + handle->reqs_pending++; + REGISTER_HANDLE_REQ(loop, handle, req); + uv_insert_pending_req(loop, (uv_req_t*)req); + } else if (UV_SUCCEEDED_WITH_IOCP(success)) { + /* The req will be processed with IOCP. */ + handle->reqs_pending++; + REGISTER_HANDLE_REQ(loop, handle, req); + } else { + return WSAGetLastError(); + } + + return 0; +} + + +int uv_tcp_getsockname(const uv_tcp_t* handle, + struct sockaddr* name, + int* namelen) { + int result; + + if (handle->socket == INVALID_SOCKET) { + return UV_EINVAL; + } + + if (handle->delayed_error) { + return uv_translate_sys_error(handle->delayed_error); + } + + result = getsockname(handle->socket, name, namelen); + if (result != 0) { + return uv_translate_sys_error(WSAGetLastError()); + } + + return 0; +} + + +int uv_tcp_getpeername(const uv_tcp_t* handle, + struct sockaddr* name, + int* namelen) { + int result; + + if (handle->socket == INVALID_SOCKET) { + return UV_EINVAL; + } + + if (handle->delayed_error) { + return uv_translate_sys_error(handle->delayed_error); + } + + result = getpeername(handle->socket, name, namelen); + if (result != 0) { + return uv_translate_sys_error(WSAGetLastError()); + } + + return 0; +} + + +int uv_tcp_write(uv_loop_t* loop, + uv_write_t* req, + uv_tcp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_write_cb cb) { + int result; + DWORD bytes; + + UV_REQ_INIT(req, UV_WRITE); + req->handle = (uv_stream_t*) handle; + req->cb = cb; + + /* Prepare the overlapped structure. */ + memset(&(req->u.io.overlapped), 0, sizeof(req->u.io.overlapped)); + if (handle->flags & UV_HANDLE_EMULATE_IOCP) { + req->event_handle = CreateEvent(NULL, 0, 0, NULL); + if (!req->event_handle) { + uv_fatal_error(GetLastError(), "CreateEvent"); + } + req->u.io.overlapped.hEvent = (HANDLE) ((ULONG_PTR) req->event_handle | 1); + req->wait_handle = INVALID_HANDLE_VALUE; + } + + result = WSASend(handle->socket, + (WSABUF*) bufs, + nbufs, + &bytes, + 0, + &req->u.io.overlapped, + NULL); + + if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { + /* Request completed immediately. */ + req->u.io.queued_bytes = 0; + handle->reqs_pending++; + handle->stream.conn.write_reqs_pending++; + REGISTER_HANDLE_REQ(loop, handle, req); + uv_insert_pending_req(loop, (uv_req_t*) req); + } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { + /* Request queued by the kernel. */ + req->u.io.queued_bytes = uv__count_bufs(bufs, nbufs); + handle->reqs_pending++; + handle->stream.conn.write_reqs_pending++; + REGISTER_HANDLE_REQ(loop, handle, req); + handle->write_queue_size += req->u.io.queued_bytes; + if (handle->flags & UV_HANDLE_EMULATE_IOCP && + !RegisterWaitForSingleObject(&req->wait_handle, + req->event_handle, post_write_completion, (void*) req, + INFINITE, WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE)) { + SET_REQ_ERROR(req, GetLastError()); + uv_insert_pending_req(loop, (uv_req_t*)req); + } + } else { + /* Send failed due to an error, report it later */ + req->u.io.queued_bytes = 0; + handle->reqs_pending++; + handle->stream.conn.write_reqs_pending++; + REGISTER_HANDLE_REQ(loop, handle, req); + SET_REQ_ERROR(req, WSAGetLastError()); + uv_insert_pending_req(loop, (uv_req_t*) req); + } + + return 0; +} + + +int uv__tcp_try_write(uv_tcp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs) { + int result; + DWORD bytes; + + if (handle->stream.conn.write_reqs_pending > 0) + return UV_EAGAIN; + + result = WSASend(handle->socket, + (WSABUF*) bufs, + nbufs, + &bytes, + 0, + NULL, + NULL); + + if (result == SOCKET_ERROR) + return uv_translate_sys_error(WSAGetLastError()); + else + return bytes; +} + + +void uv_process_tcp_read_req(uv_loop_t* loop, uv_tcp_t* handle, + uv_req_t* req) { + DWORD bytes, flags, err; + uv_buf_t buf; + + assert(handle->type == UV_TCP); + + handle->flags &= ~UV_HANDLE_READ_PENDING; + + if (!REQ_SUCCESS(req)) { + /* An error occurred doing the read. */ + if ((handle->flags & UV_HANDLE_READING) || + !(handle->flags & UV_HANDLE_ZERO_READ)) { + handle->flags &= ~UV_HANDLE_READING; + DECREASE_ACTIVE_COUNT(loop, handle); + buf = (handle->flags & UV_HANDLE_ZERO_READ) ? + uv_buf_init(NULL, 0) : handle->tcp.conn.read_buffer; + + err = GET_REQ_SOCK_ERROR(req); + + if (err == WSAECONNABORTED) { + /* + * Turn WSAECONNABORTED into UV_ECONNRESET to be consistent with Unix. + */ + err = WSAECONNRESET; + } + + handle->read_cb((uv_stream_t*)handle, + uv_translate_sys_error(err), + &buf); + } + } else { + if (!(handle->flags & UV_HANDLE_ZERO_READ)) { + /* The read was done with a non-zero buffer length. */ + if (req->u.io.overlapped.InternalHigh > 0) { + /* Successful read */ + handle->read_cb((uv_stream_t*)handle, + req->u.io.overlapped.InternalHigh, + &handle->tcp.conn.read_buffer); + /* Read again only if bytes == buf.len */ + if (req->u.io.overlapped.InternalHigh < handle->tcp.conn.read_buffer.len) { + goto done; + } + } else { + /* Connection closed */ + if (handle->flags & UV_HANDLE_READING) { + handle->flags &= ~UV_HANDLE_READING; + DECREASE_ACTIVE_COUNT(loop, handle); + } + handle->flags &= ~UV_HANDLE_READABLE; + + buf.base = 0; + buf.len = 0; + handle->read_cb((uv_stream_t*)handle, UV_EOF, &handle->tcp.conn.read_buffer); + goto done; + } + } + + /* Do nonblocking reads until the buffer is empty */ + while (handle->flags & UV_HANDLE_READING) { + buf = uv_buf_init(NULL, 0); + handle->alloc_cb((uv_handle_t*) handle, 65536, &buf); + if (buf.base == NULL || buf.len == 0) { + handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &buf); + break; + } + assert(buf.base != NULL); + + flags = 0; + if (WSARecv(handle->socket, + (WSABUF*)&buf, + 1, + &bytes, + &flags, + NULL, + NULL) != SOCKET_ERROR) { + if (bytes > 0) { + /* Successful read */ + handle->read_cb((uv_stream_t*)handle, bytes, &buf); + /* Read again only if bytes == buf.len */ + if (bytes < buf.len) { + break; + } + } else { + /* Connection closed */ + handle->flags &= ~(UV_HANDLE_READING | UV_HANDLE_READABLE); + DECREASE_ACTIVE_COUNT(loop, handle); + + handle->read_cb((uv_stream_t*)handle, UV_EOF, &buf); + break; + } + } else { + err = WSAGetLastError(); + if (err == WSAEWOULDBLOCK) { + /* Read buffer was completely empty, report a 0-byte read. */ + handle->read_cb((uv_stream_t*)handle, 0, &buf); + } else { + /* Ouch! serious error. */ + handle->flags &= ~UV_HANDLE_READING; + DECREASE_ACTIVE_COUNT(loop, handle); + + if (err == WSAECONNABORTED) { + /* Turn WSAECONNABORTED into UV_ECONNRESET to be consistent with */ + /* Unix. */ + err = WSAECONNRESET; + } + + handle->read_cb((uv_stream_t*)handle, + uv_translate_sys_error(err), + &buf); + } + break; + } + } + +done: + /* Post another read if still reading and not closing. */ + if ((handle->flags & UV_HANDLE_READING) && + !(handle->flags & UV_HANDLE_READ_PENDING)) { + uv_tcp_queue_read(loop, handle); + } + } + + DECREASE_PENDING_REQ_COUNT(handle); +} + + +void uv_process_tcp_write_req(uv_loop_t* loop, uv_tcp_t* handle, + uv_write_t* req) { + int err; + + assert(handle->type == UV_TCP); + + assert(handle->write_queue_size >= req->u.io.queued_bytes); + handle->write_queue_size -= req->u.io.queued_bytes; + + UNREGISTER_HANDLE_REQ(loop, handle, req); + + if (handle->flags & UV_HANDLE_EMULATE_IOCP) { + if (req->wait_handle != INVALID_HANDLE_VALUE) { + UnregisterWait(req->wait_handle); + req->wait_handle = INVALID_HANDLE_VALUE; + } + if (req->event_handle) { + CloseHandle(req->event_handle); + req->event_handle = NULL; + } + } + + if (req->cb) { + err = uv_translate_sys_error(GET_REQ_SOCK_ERROR(req)); + if (err == UV_ECONNABORTED) { + /* use UV_ECANCELED for consistency with Unix */ + err = UV_ECANCELED; + } + req->cb(req, err); + } + + handle->stream.conn.write_reqs_pending--; + if (handle->stream.conn.shutdown_req != NULL && + handle->stream.conn.write_reqs_pending == 0) { + uv_want_endgame(loop, (uv_handle_t*)handle); + } + + DECREASE_PENDING_REQ_COUNT(handle); +} + + +void uv_process_tcp_accept_req(uv_loop_t* loop, uv_tcp_t* handle, + uv_req_t* raw_req) { + uv_tcp_accept_t* req = (uv_tcp_accept_t*) raw_req; + int err; + + assert(handle->type == UV_TCP); + + /* If handle->accepted_socket is not a valid socket, then */ + /* uv_queue_accept must have failed. This is a serious error. We stop */ + /* accepting connections and report this error to the connection */ + /* callback. */ + if (req->accept_socket == INVALID_SOCKET) { + if (handle->flags & UV_HANDLE_LISTENING) { + handle->flags &= ~UV_HANDLE_LISTENING; + DECREASE_ACTIVE_COUNT(loop, handle); + if (handle->stream.serv.connection_cb) { + err = GET_REQ_SOCK_ERROR(req); + handle->stream.serv.connection_cb((uv_stream_t*)handle, + uv_translate_sys_error(err)); + } + } + } else if (REQ_SUCCESS(req) && + setsockopt(req->accept_socket, + SOL_SOCKET, + SO_UPDATE_ACCEPT_CONTEXT, + (char*)&handle->socket, + sizeof(handle->socket)) == 0) { + req->next_pending = handle->tcp.serv.pending_accepts; + handle->tcp.serv.pending_accepts = req; + + /* Accept and SO_UPDATE_ACCEPT_CONTEXT were successful. */ + if (handle->stream.serv.connection_cb) { + handle->stream.serv.connection_cb((uv_stream_t*)handle, 0); + } + } else { + /* Error related to accepted socket is ignored because the server */ + /* socket may still be healthy. If the server socket is broken */ + /* uv_queue_accept will detect it. */ + closesocket(req->accept_socket); + req->accept_socket = INVALID_SOCKET; + if (handle->flags & UV_HANDLE_LISTENING) { + uv_tcp_queue_accept(handle, req); + } + } + + DECREASE_PENDING_REQ_COUNT(handle); +} + + +void uv_process_tcp_connect_req(uv_loop_t* loop, uv_tcp_t* handle, + uv_connect_t* req) { + int err; + + assert(handle->type == UV_TCP); + + UNREGISTER_HANDLE_REQ(loop, handle, req); + + err = 0; + if (REQ_SUCCESS(req)) { + if (setsockopt(handle->socket, + SOL_SOCKET, + SO_UPDATE_CONNECT_CONTEXT, + NULL, + 0) == 0) { + uv_connection_init((uv_stream_t*)handle); + handle->flags |= UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; + loop->active_tcp_streams++; + } else { + err = WSAGetLastError(); + } + } else { + err = GET_REQ_SOCK_ERROR(req); + } + req->cb(req, uv_translate_sys_error(err)); + + DECREASE_PENDING_REQ_COUNT(handle); +} + + +int uv_tcp_import(uv_tcp_t* tcp, uv__ipc_socket_info_ex* socket_info_ex, + int tcp_connection) { + int err; + SOCKET socket = WSASocketW(FROM_PROTOCOL_INFO, + FROM_PROTOCOL_INFO, + FROM_PROTOCOL_INFO, + &socket_info_ex->socket_info, + 0, + WSA_FLAG_OVERLAPPED); + + if (socket == INVALID_SOCKET) { + return WSAGetLastError(); + } + + err = uv_tcp_set_socket(tcp->loop, + tcp, + socket, + socket_info_ex->socket_info.iAddressFamily, + 1); + if (err) { + closesocket(socket); + return err; + } + + if (tcp_connection) { + uv_connection_init((uv_stream_t*)tcp); + tcp->flags |= UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; + } + + tcp->flags |= UV_HANDLE_BOUND; + tcp->flags |= UV_HANDLE_SHARED_TCP_SOCKET; + + tcp->delayed_error = socket_info_ex->delayed_error; + + tcp->loop->active_tcp_streams++; + return 0; +} + + +int uv_tcp_nodelay(uv_tcp_t* handle, int enable) { + int err; + + if (handle->socket != INVALID_SOCKET) { + err = uv__tcp_nodelay(handle, handle->socket, enable); + if (err) + return err; + } + + if (enable) { + handle->flags |= UV_HANDLE_TCP_NODELAY; + } else { + handle->flags &= ~UV_HANDLE_TCP_NODELAY; + } + + return 0; +} + + +int uv_tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay) { + int err; + + if (handle->socket != INVALID_SOCKET) { + err = uv__tcp_keepalive(handle, handle->socket, enable, delay); + if (err) + return err; + } + + if (enable) { + handle->flags |= UV_HANDLE_TCP_KEEPALIVE; + } else { + handle->flags &= ~UV_HANDLE_TCP_KEEPALIVE; + } + + /* TODO: Store delay if handle->socket isn't created yet. */ + + return 0; +} + + +int uv_tcp_duplicate_socket(uv_tcp_t* handle, int pid, + LPWSAPROTOCOL_INFOW protocol_info) { + if (!(handle->flags & UV_HANDLE_CONNECTION)) { + /* + * We're about to share the socket with another process. Because + * this is a listening socket, we assume that the other process will + * be accepting connections on it. So, before sharing the socket + * with another process, we call listen here in the parent process. + */ + + if (!(handle->flags & UV_HANDLE_LISTENING)) { + if (!(handle->flags & UV_HANDLE_BOUND)) { + return ERROR_INVALID_PARAMETER; + } + + if (!(handle->delayed_error)) { + if (listen(handle->socket, SOMAXCONN) == SOCKET_ERROR) { + handle->delayed_error = WSAGetLastError(); + } + } + } + } + + if (WSADuplicateSocketW(handle->socket, pid, protocol_info)) { + return WSAGetLastError(); + } + + handle->flags |= UV_HANDLE_SHARED_TCP_SOCKET; + + return 0; +} + + +int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable) { + if (handle->flags & UV_HANDLE_CONNECTION) { + return UV_EINVAL; + } + + /* Check if we're already in the desired mode. */ + if ((enable && !(handle->flags & UV_HANDLE_TCP_SINGLE_ACCEPT)) || + (!enable && handle->flags & UV_HANDLE_TCP_SINGLE_ACCEPT)) { + return 0; + } + + /* Don't allow switching from single pending accept to many. */ + if (enable) { + return UV_ENOTSUP; + } + + /* Check if we're in a middle of changing the number of pending accepts. */ + if (handle->flags & UV_HANDLE_TCP_ACCEPT_STATE_CHANGING) { + return 0; + } + + handle->flags |= UV_HANDLE_TCP_SINGLE_ACCEPT; + + /* Flip the changing flag if we have already queued multiple accepts. */ + if (handle->flags & UV_HANDLE_LISTENING) { + handle->flags |= UV_HANDLE_TCP_ACCEPT_STATE_CHANGING; + } + + return 0; +} + + +static int uv_tcp_try_cancel_io(uv_tcp_t* tcp) { + SOCKET socket = tcp->socket; + int non_ifs_lsp; + + /* Check if we have any non-IFS LSPs stacked on top of TCP */ + non_ifs_lsp = (tcp->flags & UV_HANDLE_IPV6) ? uv_tcp_non_ifs_lsp_ipv6 : + uv_tcp_non_ifs_lsp_ipv4; + + /* If there are non-ifs LSPs then try to obtain a base handle for the */ + /* socket. This will always fail on Windows XP/3k. */ + if (non_ifs_lsp) { + DWORD bytes; + if (WSAIoctl(socket, + SIO_BASE_HANDLE, + NULL, + 0, + &socket, + sizeof socket, + &bytes, + NULL, + NULL) != 0) { + /* Failed. We can't do CancelIo. */ + return -1; + } + } + + assert(socket != 0 && socket != INVALID_SOCKET); + + if (!CancelIo((HANDLE) socket)) { + return GetLastError(); + } + + /* It worked. */ + return 0; +} + + +void uv_tcp_close(uv_loop_t* loop, uv_tcp_t* tcp) { + int close_socket = 1; + + if (tcp->flags & UV_HANDLE_READ_PENDING) { + /* In order for winsock to do a graceful close there must not be any */ + /* any pending reads, or the socket must be shut down for writing */ + if (!(tcp->flags & UV_HANDLE_SHARED_TCP_SOCKET)) { + /* Just do shutdown on non-shared sockets, which ensures graceful close. */ + shutdown(tcp->socket, SD_SEND); + + } else if (uv_tcp_try_cancel_io(tcp) == 0) { + /* In case of a shared socket, we try to cancel all outstanding I/O, */ + /* If that works, don't close the socket yet - wait for the read req to */ + /* return and close the socket in uv_tcp_endgame. */ + close_socket = 0; + + } else { + /* When cancelling isn't possible - which could happen when an LSP is */ + /* present on an old Windows version, we will have to close the socket */ + /* with a read pending. That is not nice because trailing sent bytes */ + /* may not make it to the other side. */ + } + + } else if ((tcp->flags & UV_HANDLE_SHARED_TCP_SOCKET) && + tcp->tcp.serv.accept_reqs != NULL) { + /* Under normal circumstances closesocket() will ensure that all pending */ + /* accept reqs are canceled. However, when the socket is shared the */ + /* presence of another reference to the socket in another process will */ + /* keep the accept reqs going, so we have to ensure that these are */ + /* canceled. */ + if (uv_tcp_try_cancel_io(tcp) != 0) { + /* When cancellation is not possible, there is another option: we can */ + /* close the incoming sockets, which will also cancel the accept */ + /* operations. However this is not cool because we might inadvertently */ + /* close a socket that just accepted a new connection, which will */ + /* cause the connection to be aborted. */ + unsigned int i; + for (i = 0; i < uv_simultaneous_server_accepts; i++) { + uv_tcp_accept_t* req = &tcp->tcp.serv.accept_reqs[i]; + if (req->accept_socket != INVALID_SOCKET && + !HasOverlappedIoCompleted(&req->u.io.overlapped)) { + closesocket(req->accept_socket); + req->accept_socket = INVALID_SOCKET; + } + } + } + } + + if (tcp->flags & UV_HANDLE_READING) { + tcp->flags &= ~UV_HANDLE_READING; + DECREASE_ACTIVE_COUNT(loop, tcp); + } + + if (tcp->flags & UV_HANDLE_LISTENING) { + tcp->flags &= ~UV_HANDLE_LISTENING; + DECREASE_ACTIVE_COUNT(loop, tcp); + } + + if (close_socket) { + closesocket(tcp->socket); + tcp->socket = INVALID_SOCKET; + tcp->flags |= UV_HANDLE_TCP_SOCKET_CLOSED; + } + + tcp->flags &= ~(UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); + uv__handle_closing(tcp); + + if (tcp->reqs_pending == 0) { + uv_want_endgame(tcp->loop, (uv_handle_t*)tcp); + } +} + + +int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock) { + WSAPROTOCOL_INFOW protocol_info; + int opt_len; + int err; + + /* Detect the address family of the socket. */ + opt_len = (int) sizeof protocol_info; + if (getsockopt(sock, + SOL_SOCKET, + SO_PROTOCOL_INFOW, + (char*) &protocol_info, + &opt_len) == SOCKET_ERROR) { + return uv_translate_sys_error(GetLastError()); + } + + err = uv_tcp_set_socket(handle->loop, + handle, + sock, + protocol_info.iAddressFamily, + 1); + if (err) { + return uv_translate_sys_error(err); + } + + return 0; +} + + +/* This function is an egress point, i.e. it returns libuv errors rather than + * system errors. + */ +int uv__tcp_bind(uv_tcp_t* handle, + const struct sockaddr* addr, + unsigned int addrlen, + unsigned int flags) { + int err; + + err = uv_tcp_try_bind(handle, addr, addrlen, flags); + if (err) + return uv_translate_sys_error(err); + + return 0; +} + + +/* This function is an egress point, i.e. it returns libuv errors rather than + * system errors. + */ +int uv__tcp_connect(uv_connect_t* req, + uv_tcp_t* handle, + const struct sockaddr* addr, + unsigned int addrlen, + uv_connect_cb cb) { + int err; + + err = uv_tcp_try_connect(req, handle, addr, addrlen, cb); + if (err) + return uv_translate_sys_error(err); + + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/thread.c b/lib/ESPiLight/pilight/libs/libuv/win/thread.c new file mode 100644 index 0000000..91684e9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/thread.c @@ -0,0 +1,697 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include + +#include "uv.h" +#include "internal.h" + + +#define HAVE_CONDVAR_API() (pInitializeConditionVariable != NULL) + +static int uv_cond_fallback_init(uv_cond_t* cond); +static void uv_cond_fallback_destroy(uv_cond_t* cond); +static void uv_cond_fallback_signal(uv_cond_t* cond); +static void uv_cond_fallback_broadcast(uv_cond_t* cond); +static void uv_cond_fallback_wait(uv_cond_t* cond, uv_mutex_t* mutex); +static int uv_cond_fallback_timedwait(uv_cond_t* cond, + uv_mutex_t* mutex, uint64_t timeout); + +static int uv_cond_condvar_init(uv_cond_t* cond); +static void uv_cond_condvar_destroy(uv_cond_t* cond); +static void uv_cond_condvar_signal(uv_cond_t* cond); +static void uv_cond_condvar_broadcast(uv_cond_t* cond); +static void uv_cond_condvar_wait(uv_cond_t* cond, uv_mutex_t* mutex); +static int uv_cond_condvar_timedwait(uv_cond_t* cond, + uv_mutex_t* mutex, uint64_t timeout); + + +static void uv__once_inner(uv_once_t* guard, void (*callback)(void)) { + DWORD result; + HANDLE existing_event, created_event; + + created_event = CreateEvent(NULL, 1, 0, NULL); + if (created_event == 0) { + /* Could fail in a low-memory situation? */ + uv_fatal_error(GetLastError(), "CreateEvent"); + } + + existing_event = InterlockedCompareExchangePointer(&guard->event, + created_event, + NULL); + + if (existing_event == NULL) { + /* We won the race */ + callback(); + + result = SetEvent(created_event); + assert(result); + guard->ran = 1; + + } else { + /* We lost the race. Destroy the event we created and wait for the */ + /* existing one to become signaled. */ + CloseHandle(created_event); + result = WaitForSingleObject(existing_event, INFINITE); + assert(result == WAIT_OBJECT_0); + } +} + + +void uv_once(uv_once_t* guard, void (*callback)(void)) { + /* Fast case - avoid WaitForSingleObject. */ + if (guard->ran) { + return; + } + + uv__once_inner(guard, callback); +} + + +/* Verify that uv_thread_t can be stored in a TLS slot. */ +STATIC_ASSERT(sizeof(uv_thread_t) <= sizeof(void*)); + +static uv_key_t uv__current_thread_key; +static uv_once_t uv__current_thread_init_guard = UV_ONCE_INIT; + + +static void uv__init_current_thread_key(void) { + if (uv_key_create(&uv__current_thread_key)) + abort(); +} + + +struct thread_ctx { + void (*entry)(void* arg); + void* arg; + uv_thread_t self; +}; + + +static UINT __stdcall uv__thread_start(void* arg) { + struct thread_ctx *ctx_p; + struct thread_ctx ctx; + + ctx_p = arg; + ctx = *ctx_p; + uv__free(ctx_p); + + uv_once(&uv__current_thread_init_guard, uv__init_current_thread_key); + uv_key_set(&uv__current_thread_key, (void*) ctx.self); + + ctx.entry(ctx.arg); + + return 0; +} + + +int uv_thread_create(uv_thread_t *tid, void (*entry)(void *arg), void *arg) { + struct thread_ctx* ctx; + int err; + HANDLE thread; + + ctx = uv__malloc(sizeof(*ctx)); + if (ctx == NULL) + return UV_ENOMEM; + + ctx->entry = entry; + ctx->arg = arg; + + /* Create the thread in suspended state so we have a chance to pass + * its own creation handle to it */ + thread = (HANDLE) _beginthreadex(NULL, + 0, + uv__thread_start, + ctx, + CREATE_SUSPENDED, + NULL); + if (thread == NULL) { + err = errno; + uv__free(ctx); + } else { + err = 0; + *tid = thread; + ctx->self = thread; + ResumeThread(thread); + } + + switch (err) { + case 0: + return 0; + case EACCES: + return UV_EACCES; + case EAGAIN: + return UV_EAGAIN; + case EINVAL: + return UV_EINVAL; + } + + return UV_EIO; +} + + +uv_thread_t uv_thread_self(void) { + uv_once(&uv__current_thread_init_guard, uv__init_current_thread_key); + return (uv_thread_t) uv_key_get(&uv__current_thread_key); +} + + +int uv_thread_join(uv_thread_t *tid) { + if (WaitForSingleObject(*tid, INFINITE)) + return uv_translate_sys_error(GetLastError()); + else { + CloseHandle(*tid); + *tid = 0; + return 0; + } +} + + +int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2) { + return *t1 == *t2; +} + + +int uv_mutex_init(uv_mutex_t* mutex) { + InitializeCriticalSection(mutex); + return 0; +} + + +void uv_mutex_destroy(uv_mutex_t* mutex) { + DeleteCriticalSection(mutex); +} + + +void uv_mutex_lock(uv_mutex_t* mutex) { + EnterCriticalSection(mutex); +} + + +int uv_mutex_trylock(uv_mutex_t* mutex) { + if (TryEnterCriticalSection(mutex)) + return 0; + else + return UV_EBUSY; +} + + +void uv_mutex_unlock(uv_mutex_t* mutex) { + LeaveCriticalSection(mutex); +} + + +int uv_rwlock_init(uv_rwlock_t* rwlock) { + /* Initialize the semaphore that acts as the write lock. */ + HANDLE handle = CreateSemaphoreW(NULL, 1, 1, NULL); + if (handle == NULL) + return uv_translate_sys_error(GetLastError()); + rwlock->state_.write_semaphore_ = handle; + + /* Initialize the critical section protecting the reader count. */ + InitializeCriticalSection(&rwlock->state_.num_readers_lock_); + + /* Initialize the reader count. */ + rwlock->state_.num_readers_ = 0; + + return 0; +} + + +void uv_rwlock_destroy(uv_rwlock_t* rwlock) { + DeleteCriticalSection(&rwlock->state_.num_readers_lock_); + CloseHandle(rwlock->state_.write_semaphore_); +} + + +void uv_rwlock_rdlock(uv_rwlock_t* rwlock) { + /* Acquire the lock that protects the reader count. */ + EnterCriticalSection(&rwlock->state_.num_readers_lock_); + + /* Increase the reader count, and lock for write if this is the first + * reader. + */ + if (++rwlock->state_.num_readers_ == 1) { + DWORD r = WaitForSingleObject(rwlock->state_.write_semaphore_, INFINITE); + if (r != WAIT_OBJECT_0) + uv_fatal_error(GetLastError(), "WaitForSingleObject"); + } + + /* Release the lock that protects the reader count. */ + LeaveCriticalSection(&rwlock->state_.num_readers_lock_); +} + + +int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock) { + int err; + + if (!TryEnterCriticalSection(&rwlock->state_.num_readers_lock_)) + return UV_EBUSY; + + err = 0; + + if (rwlock->state_.num_readers_ == 0) { + /* Currently there are no other readers, which means that the write lock + * needs to be acquired. + */ + DWORD r = WaitForSingleObject(rwlock->state_.write_semaphore_, 0); + if (r == WAIT_OBJECT_0) + rwlock->state_.num_readers_++; + else if (r == WAIT_TIMEOUT) + err = UV_EBUSY; + else if (r == WAIT_FAILED) + uv_fatal_error(GetLastError(), "WaitForSingleObject"); + + } else { + /* The write lock has already been acquired because there are other + * active readers. + */ + rwlock->state_.num_readers_++; + } + + LeaveCriticalSection(&rwlock->state_.num_readers_lock_); + return err; +} + + +void uv_rwlock_rdunlock(uv_rwlock_t* rwlock) { + EnterCriticalSection(&rwlock->state_.num_readers_lock_); + + if (--rwlock->state_.num_readers_ == 0) { + if (!ReleaseSemaphore(rwlock->state_.write_semaphore_, 1, NULL)) + uv_fatal_error(GetLastError(), "ReleaseSemaphore"); + } + + LeaveCriticalSection(&rwlock->state_.num_readers_lock_); +} + + +void uv_rwlock_wrlock(uv_rwlock_t* rwlock) { + DWORD r = WaitForSingleObject(rwlock->state_.write_semaphore_, INFINITE); + if (r != WAIT_OBJECT_0) + uv_fatal_error(GetLastError(), "WaitForSingleObject"); +} + + +int uv_rwlock_trywrlock(uv_rwlock_t* rwlock) { + DWORD r = WaitForSingleObject(rwlock->state_.write_semaphore_, 0); + if (r == WAIT_OBJECT_0) + return 0; + else if (r == WAIT_TIMEOUT) + return UV_EBUSY; + else + uv_fatal_error(GetLastError(), "WaitForSingleObject"); +} + + +void uv_rwlock_wrunlock(uv_rwlock_t* rwlock) { + if (!ReleaseSemaphore(rwlock->state_.write_semaphore_, 1, NULL)) + uv_fatal_error(GetLastError(), "ReleaseSemaphore"); +} + + +int uv_sem_init(uv_sem_t* sem, unsigned int value) { + *sem = CreateSemaphore(NULL, value, INT_MAX, NULL); + if (*sem == NULL) + return uv_translate_sys_error(GetLastError()); + else + return 0; +} + + +void uv_sem_destroy(uv_sem_t* sem) { + if (!CloseHandle(*sem)) + abort(); +} + + +void uv_sem_post(uv_sem_t* sem) { + if (!ReleaseSemaphore(*sem, 1, NULL)) + abort(); +} + + +void uv_sem_wait(uv_sem_t* sem) { + if (WaitForSingleObject(*sem, INFINITE) != WAIT_OBJECT_0) + abort(); +} + + +int uv_sem_trywait(uv_sem_t* sem) { + DWORD r = WaitForSingleObject(*sem, 0); + + if (r == WAIT_OBJECT_0) + return 0; + + if (r == WAIT_TIMEOUT) + return UV_EAGAIN; + + abort(); + return -1; /* Satisfy the compiler. */ +} + + +/* This condition variable implementation is based on the SetEvent solution + * (section 3.2) at http://www.cs.wustl.edu/~schmidt/win32-cv-1.html + * We could not use the SignalObjectAndWait solution (section 3.4) because + * it want the 2nd argument (type uv_mutex_t) of uv_cond_wait() and + * uv_cond_timedwait() to be HANDLEs, but we use CRITICAL_SECTIONs. + */ + +static int uv_cond_fallback_init(uv_cond_t* cond) { + int err; + + /* Initialize the count to 0. */ + cond->fallback.waiters_count = 0; + + InitializeCriticalSection(&cond->fallback.waiters_count_lock); + + /* Create an auto-reset event. */ + cond->fallback.signal_event = CreateEvent(NULL, /* no security */ + FALSE, /* auto-reset event */ + FALSE, /* non-signaled initially */ + NULL); /* unnamed */ + if (!cond->fallback.signal_event) { + err = GetLastError(); + goto error2; + } + + /* Create a manual-reset event. */ + cond->fallback.broadcast_event = CreateEvent(NULL, /* no security */ + TRUE, /* manual-reset */ + FALSE, /* non-signaled */ + NULL); /* unnamed */ + if (!cond->fallback.broadcast_event) { + err = GetLastError(); + goto error; + } + + return 0; + +error: + CloseHandle(cond->fallback.signal_event); +error2: + DeleteCriticalSection(&cond->fallback.waiters_count_lock); + return uv_translate_sys_error(err); +} + + +static int uv_cond_condvar_init(uv_cond_t* cond) { + pInitializeConditionVariable(&cond->cond_var); + return 0; +} + + +int uv_cond_init(uv_cond_t* cond) { + uv__once_init(); + + if (HAVE_CONDVAR_API()) + return uv_cond_condvar_init(cond); + else + return uv_cond_fallback_init(cond); +} + + +static void uv_cond_fallback_destroy(uv_cond_t* cond) { + if (!CloseHandle(cond->fallback.broadcast_event)) + abort(); + if (!CloseHandle(cond->fallback.signal_event)) + abort(); + DeleteCriticalSection(&cond->fallback.waiters_count_lock); +} + + +static void uv_cond_condvar_destroy(uv_cond_t* cond) { + /* nothing to do */ +} + + +void uv_cond_destroy(uv_cond_t* cond) { + if (HAVE_CONDVAR_API()) + uv_cond_condvar_destroy(cond); + else + uv_cond_fallback_destroy(cond); +} + + +static void uv_cond_fallback_signal(uv_cond_t* cond) { + int have_waiters; + + /* Avoid race conditions. */ + EnterCriticalSection(&cond->fallback.waiters_count_lock); + have_waiters = cond->fallback.waiters_count > 0; + LeaveCriticalSection(&cond->fallback.waiters_count_lock); + + if (have_waiters) + SetEvent(cond->fallback.signal_event); +} + + +static void uv_cond_condvar_signal(uv_cond_t* cond) { + pWakeConditionVariable(&cond->cond_var); +} + + +void uv_cond_signal(uv_cond_t* cond) { + if (HAVE_CONDVAR_API()) + uv_cond_condvar_signal(cond); + else + uv_cond_fallback_signal(cond); +} + + +static void uv_cond_fallback_broadcast(uv_cond_t* cond) { + int have_waiters; + + /* Avoid race conditions. */ + EnterCriticalSection(&cond->fallback.waiters_count_lock); + have_waiters = cond->fallback.waiters_count > 0; + LeaveCriticalSection(&cond->fallback.waiters_count_lock); + + if (have_waiters) + SetEvent(cond->fallback.broadcast_event); +} + + +static void uv_cond_condvar_broadcast(uv_cond_t* cond) { + pWakeAllConditionVariable(&cond->cond_var); +} + + +void uv_cond_broadcast(uv_cond_t* cond) { + if (HAVE_CONDVAR_API()) + uv_cond_condvar_broadcast(cond); + else + uv_cond_fallback_broadcast(cond); +} + + +static int uv_cond_wait_helper(uv_cond_t* cond, uv_mutex_t* mutex, + DWORD dwMilliseconds) { + DWORD result; + int last_waiter; + HANDLE handles[2] = { + cond->fallback.signal_event, + cond->fallback.broadcast_event + }; + + /* Avoid race conditions. */ + EnterCriticalSection(&cond->fallback.waiters_count_lock); + cond->fallback.waiters_count++; + LeaveCriticalSection(&cond->fallback.waiters_count_lock); + + /* It's ok to release the here since Win32 manual-reset events */ + /* maintain state when used with . This avoids the "lost wakeup" */ + /* bug. */ + uv_mutex_unlock(mutex); + + /* Wait for either event to become signaled due to being */ + /* called or being called. */ + result = WaitForMultipleObjects(2, handles, FALSE, dwMilliseconds); + + EnterCriticalSection(&cond->fallback.waiters_count_lock); + cond->fallback.waiters_count--; + last_waiter = result == WAIT_OBJECT_0 + 1 + && cond->fallback.waiters_count == 0; + LeaveCriticalSection(&cond->fallback.waiters_count_lock); + + /* Some thread called . */ + if (last_waiter) { + /* We're the last waiter to be notified or to stop waiting, so reset the */ + /* the manual-reset event. */ + ResetEvent(cond->fallback.broadcast_event); + } + + /* Reacquire the . */ + uv_mutex_lock(mutex); + + if (result == WAIT_OBJECT_0 || result == WAIT_OBJECT_0 + 1) + return 0; + + if (result == WAIT_TIMEOUT) + return UV_ETIMEDOUT; + + abort(); + return -1; /* Satisfy the compiler. */ +} + + +static void uv_cond_fallback_wait(uv_cond_t* cond, uv_mutex_t* mutex) { + if (uv_cond_wait_helper(cond, mutex, INFINITE)) + abort(); +} + + +static void uv_cond_condvar_wait(uv_cond_t* cond, uv_mutex_t* mutex) { + if (!pSleepConditionVariableCS(&cond->cond_var, mutex, INFINITE)) + abort(); +} + + +void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex) { + if (HAVE_CONDVAR_API()) + uv_cond_condvar_wait(cond, mutex); + else + uv_cond_fallback_wait(cond, mutex); +} + + +static int uv_cond_fallback_timedwait(uv_cond_t* cond, + uv_mutex_t* mutex, uint64_t timeout) { + return uv_cond_wait_helper(cond, mutex, (DWORD)(timeout / 1e6)); +} + + +static int uv_cond_condvar_timedwait(uv_cond_t* cond, + uv_mutex_t* mutex, uint64_t timeout) { + if (pSleepConditionVariableCS(&cond->cond_var, mutex, (DWORD)(timeout / 1e6))) + return 0; + if (GetLastError() != ERROR_TIMEOUT) + abort(); + return UV_ETIMEDOUT; +} + + +int uv_cond_timedwait(uv_cond_t* cond, uv_mutex_t* mutex, + uint64_t timeout) { + if (HAVE_CONDVAR_API()) + return uv_cond_condvar_timedwait(cond, mutex, timeout); + else + return uv_cond_fallback_timedwait(cond, mutex, timeout); +} + + +int uv_barrier_init(uv_barrier_t* barrier, unsigned int count) { + int err; + + barrier->n = count; + barrier->count = 0; + + err = uv_mutex_init(&barrier->mutex); + if (err) + return err; + + err = uv_sem_init(&barrier->turnstile1, 0); + if (err) + goto error2; + + err = uv_sem_init(&barrier->turnstile2, 1); + if (err) + goto error; + + return 0; + +error: + uv_sem_destroy(&barrier->turnstile1); +error2: + uv_mutex_destroy(&barrier->mutex); + return err; + +} + + +void uv_barrier_destroy(uv_barrier_t* barrier) { + uv_sem_destroy(&barrier->turnstile2); + uv_sem_destroy(&barrier->turnstile1); + uv_mutex_destroy(&barrier->mutex); +} + + +int uv_barrier_wait(uv_barrier_t* barrier) { + int serial_thread; + + uv_mutex_lock(&barrier->mutex); + if (++barrier->count == barrier->n) { + uv_sem_wait(&barrier->turnstile2); + uv_sem_post(&barrier->turnstile1); + } + uv_mutex_unlock(&barrier->mutex); + + uv_sem_wait(&barrier->turnstile1); + uv_sem_post(&barrier->turnstile1); + + uv_mutex_lock(&barrier->mutex); + serial_thread = (--barrier->count == 0); + if (serial_thread) { + uv_sem_wait(&barrier->turnstile1); + uv_sem_post(&barrier->turnstile2); + } + uv_mutex_unlock(&barrier->mutex); + + uv_sem_wait(&barrier->turnstile2); + uv_sem_post(&barrier->turnstile2); + return serial_thread; +} + + +int uv_key_create(uv_key_t* key) { + key->tls_index = TlsAlloc(); + if (key->tls_index == TLS_OUT_OF_INDEXES) + return UV_ENOMEM; + return 0; +} + + +void uv_key_delete(uv_key_t* key) { + if (TlsFree(key->tls_index) == FALSE) + abort(); + key->tls_index = TLS_OUT_OF_INDEXES; +} + + +void* uv_key_get(uv_key_t* key) { + void* value; + + value = TlsGetValue(key->tls_index); + if (value == NULL) + if (GetLastError() != ERROR_SUCCESS) + abort(); + + return value; +} + + +void uv_key_set(uv_key_t* key, void* value) { + if (TlsSetValue(key->tls_index, value) == FALSE) + abort(); +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/timer.c b/lib/ESPiLight/pilight/libs/libuv/win/timer.c new file mode 100644 index 0000000..27ca771 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/timer.c @@ -0,0 +1,195 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include + +#include "uv.h" +#include "internal.h" +#include "tree.h" +#include "handle-inl.h" + + +/* The number of milliseconds in one second. */ +#define UV__MILLISEC 1000 + + +void uv_update_time(uv_loop_t* loop) { + uint64_t new_time = uv__hrtime(UV__MILLISEC); + assert(new_time >= loop->time); + loop->time = new_time; +} + + +static int uv_timer_compare(uv_timer_t* a, uv_timer_t* b) { + if (a->due < b->due) + return -1; + if (a->due > b->due) + return 1; + /* + * compare start_id when both has the same due. start_id is + * allocated with loop->timer_counter in uv_timer_start(). + */ + if (a->start_id < b->start_id) + return -1; + if (a->start_id > b->start_id) + return 1; + return 0; +} + + +RB_GENERATE_STATIC(uv_timer_tree_s, uv_timer_s, tree_entry, uv_timer_compare); + + +int uv_timer_init(uv_loop_t* loop, uv_timer_t* handle) { + uv__handle_init(loop, (uv_handle_t*) handle, UV_TIMER); + handle->timer_cb = NULL; + handle->repeat = 0; + + return 0; +} + + +void uv_timer_endgame(uv_loop_t* loop, uv_timer_t* handle) { + if (handle->flags & UV__HANDLE_CLOSING) { + assert(!(handle->flags & UV_HANDLE_CLOSED)); + uv__handle_close(handle); + } +} + + +static uint64_t get_clamped_due_time(uint64_t loop_time, uint64_t timeout) { + uint64_t clamped_timeout; + + clamped_timeout = loop_time + timeout; + if (clamped_timeout < timeout) + clamped_timeout = (uint64_t) -1; + + return clamped_timeout; +} + + +int uv_timer_start(uv_timer_t* handle, uv_timer_cb timer_cb, uint64_t timeout, + uint64_t repeat) { + uv_loop_t* loop = handle->loop; + uv_timer_t* old; + + if (timer_cb == NULL) + return UV_EINVAL; + + if (uv__is_active(handle)) + uv_timer_stop(handle); + + handle->timer_cb = timer_cb; + handle->due = get_clamped_due_time(loop->time, timeout); + handle->repeat = repeat; + uv__handle_start(handle); + + /* start_id is the second index to be compared in uv__timer_cmp() */ + handle->start_id = handle->loop->timer_counter++; + + old = RB_INSERT(uv_timer_tree_s, &loop->timers, handle); + assert(old == NULL); + + return 0; +} + + +int uv_timer_stop(uv_timer_t* handle) { + uv_loop_t* loop = handle->loop; + + if (!uv__is_active(handle)) + return 0; + + RB_REMOVE(uv_timer_tree_s, &loop->timers, handle); + uv__handle_stop(handle); + + return 0; +} + + +int uv_timer_again(uv_timer_t* handle) { + /* If timer_cb is NULL that means that the timer was never started. */ + if (!handle->timer_cb) { + return UV_EINVAL; + } + + if (handle->repeat) { + uv_timer_stop(handle); + uv_timer_start(handle, handle->timer_cb, handle->repeat, handle->repeat); + } + + return 0; +} + + +void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat) { + assert(handle->type == UV_TIMER); + handle->repeat = repeat; +} + + +uint64_t uv_timer_get_repeat(const uv_timer_t* handle) { + assert(handle->type == UV_TIMER); + return handle->repeat; +} + + +DWORD uv__next_timeout(const uv_loop_t* loop) { + uv_timer_t* timer; + int64_t delta; + + /* Check if there are any running timers + * Need to cast away const first, since RB_MIN doesn't know what we are + * going to do with this return value, it can't be marked const + */ + timer = RB_MIN(uv_timer_tree_s, &((uv_loop_t*)loop)->timers); + if (timer) { + delta = timer->due - loop->time; + if (delta >= UINT_MAX - 1) { + /* A timeout value of UINT_MAX means infinite, so that's no good. */ + return UINT_MAX - 1; + } else if (delta < 0) { + /* Negative timeout values are not allowed */ + return 0; + } else { + return (DWORD)delta; + } + } else { + /* No timers */ + return INFINITE; + } +} + + +void uv_process_timers(uv_loop_t* loop) { + uv_timer_t* timer; + + /* Call timer callbacks */ + for (timer = RB_MIN(uv_timer_tree_s, &loop->timers); + timer != NULL && timer->due <= loop->time; + timer = RB_MIN(uv_timer_tree_s, &loop->timers)) { + + uv_timer_stop(timer); + uv_timer_again(timer); + timer->timer_cb((uv_timer_t*) timer); + } +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/tty.c b/lib/ESPiLight/pilight/libs/libuv/win/tty.c new file mode 100644 index 0000000..a6f5839 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/tty.c @@ -0,0 +1,2281 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include + +#if defined(_MSC_VER) && _MSC_VER < 1600 +# include "stdint-msvc2008.h" +#else +# include +#endif + +#ifndef COMMON_LVB_REVERSE_VIDEO +# define COMMON_LVB_REVERSE_VIDEO 0x4000 +#endif + +#include "uv.h" +#include "internal.h" +#include "handle-inl.h" +#include "stream-inl.h" +#include "req-inl.h" + +#ifndef InterlockedOr +# define InterlockedOr _InterlockedOr +#endif + +#define UNICODE_REPLACEMENT_CHARACTER (0xfffd) + +#define ANSI_NORMAL 0x00 +#define ANSI_ESCAPE_SEEN 0x02 +#define ANSI_CSI 0x04 +#define ANSI_ST_CONTROL 0x08 +#define ANSI_IGNORE 0x10 +#define ANSI_IN_ARG 0x20 +#define ANSI_IN_STRING 0x40 +#define ANSI_BACKSLASH_SEEN 0x80 + +#define MAX_INPUT_BUFFER_LENGTH 8192 +#define MAX_CONSOLE_CHAR 8192 + +#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING +#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 +#endif + +static void uv_tty_capture_initial_style(CONSOLE_SCREEN_BUFFER_INFO* info); +static void uv_tty_update_virtual_window(CONSOLE_SCREEN_BUFFER_INFO* info); +static int uv__cancel_read_console(uv_tty_t* handle); + + +/* Null uv_buf_t */ +static const uv_buf_t uv_null_buf_ = { 0, NULL }; + +enum uv__read_console_status_e { + NOT_STARTED, + IN_PROGRESS, + TRAP_REQUESTED, + COMPLETED +}; + +static volatile LONG uv__read_console_status = NOT_STARTED; +static volatile LONG uv__restore_screen_state; +static CONSOLE_SCREEN_BUFFER_INFO uv__saved_screen_state; + + +/* + * The console virtual window. + * + * Normally cursor movement in windows is relative to the console screen buffer, + * e.g. the application is allowed to overwrite the 'history'. This is very + * inconvenient, it makes absolute cursor movement pretty useless. There is + * also the concept of 'client rect' which is defined by the actual size of + * the console window and the scroll position of the screen buffer, but it's + * very volatile because it changes when the user scrolls. + * + * To make cursor movement behave sensibly we define a virtual window to which + * cursor movement is confined. The virtual window is always as wide as the + * console screen buffer, but it's height is defined by the size of the + * console window. The top of the virtual window aligns with the position + * of the caret when the first stdout/err handle is created, unless that would + * mean that it would extend beyond the bottom of the screen buffer - in that + * that case it's located as far down as possible. + * + * When the user writes a long text or many newlines, such that the output + * reaches beyond the bottom of the virtual window, the virtual window is + * shifted downwards, but not resized. + * + * Since all tty i/o happens on the same console, this window is shared + * between all stdout/stderr handles. + */ + +static int uv_tty_virtual_offset = -1; +static int uv_tty_virtual_height = -1; +static int uv_tty_virtual_width = -1; + +/* We use a semaphore rather than a mutex or critical section because in some + cases (uv__cancel_read_console) we need take the lock in the main thread and + release it in another thread. Using a semaphore ensures that in such + scenario the main thread will still block when trying to acquire the lock. */ +static uv_sem_t uv_tty_output_lock; + +static HANDLE uv_tty_output_handle = INVALID_HANDLE_VALUE; + +static WORD uv_tty_default_text_attributes = + FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; + +static char uv_tty_default_fg_color = 7; +static char uv_tty_default_bg_color = 0; +static char uv_tty_default_fg_bright = 0; +static char uv_tty_default_bg_bright = 0; +static char uv_tty_default_inverse = 0; + +typedef enum { + UV_SUPPORTED, + UV_UNCHECKED, + UV_UNSUPPORTED +} uv_vtermstate_t; +/* Determine whether or not ANSI support is enabled. */ +static uv_vtermstate_t uv__vterm_state = UV_UNCHECKED; +static void uv__determine_vterm_state(HANDLE handle); + +void uv_console_init(void) { + if (uv_sem_init(&uv_tty_output_lock, 1)) + abort(); +} + + +int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, uv_file fd, int readable) { + HANDLE handle; + CONSOLE_SCREEN_BUFFER_INFO screen_buffer_info; + + handle = (HANDLE) uv__get_osfhandle(fd); + if (handle == INVALID_HANDLE_VALUE) + return UV_EBADF; + + if (fd <= 2) { + /* In order to avoid closing a stdio file descriptor 0-2, duplicate the + * underlying OS handle and forget about the original fd. + * We could also opt to use the original OS handle and just never close it, + * but then there would be no reliable way to cancel pending read operations + * upon close. + */ + if (!DuplicateHandle(INVALID_HANDLE_VALUE, + handle, + INVALID_HANDLE_VALUE, + &handle, + 0, + FALSE, + DUPLICATE_SAME_ACCESS)) + return uv_translate_sys_error(GetLastError()); + fd = -1; + } + + if (!readable) { + /* Obtain the screen buffer info with the output handle. */ + if (!GetConsoleScreenBufferInfo(handle, &screen_buffer_info)) { + return uv_translate_sys_error(GetLastError()); + } + + /* Obtain the the tty_output_lock because the virtual window state is */ + /* shared between all uv_tty_t handles. */ + uv_sem_wait(&uv_tty_output_lock); + + if (uv__vterm_state == UV_UNCHECKED) + uv__determine_vterm_state(handle); + + /* Store the global tty output handle. This handle is used by TTY read */ + /* streams to update the virtual window when a CONSOLE_BUFFER_SIZE_EVENT */ + /* is received. */ + uv_tty_output_handle = handle; + + /* Remember the original console text attributes. */ + uv_tty_capture_initial_style(&screen_buffer_info); + + uv_tty_update_virtual_window(&screen_buffer_info); + + uv_sem_post(&uv_tty_output_lock); + } + + + uv_stream_init(loop, (uv_stream_t*) tty, UV_TTY); + uv_connection_init((uv_stream_t*) tty); + + tty->handle = handle; + tty->u.fd = fd; + tty->reqs_pending = 0; + tty->flags |= UV_HANDLE_BOUND; + + if (readable) { + /* Initialize TTY input specific fields. */ + tty->flags |= UV_HANDLE_TTY_READABLE | UV_HANDLE_READABLE; + /* TODO: remove me in v2.x. */ + tty->tty.rd.unused_ = NULL; + tty->tty.rd.read_line_buffer = uv_null_buf_; + tty->tty.rd.read_raw_wait = NULL; + + /* Init keycode-to-vt100 mapper state. */ + tty->tty.rd.last_key_len = 0; + tty->tty.rd.last_key_offset = 0; + tty->tty.rd.last_utf16_high_surrogate = 0; + memset(&tty->tty.rd.last_input_record, 0, sizeof tty->tty.rd.last_input_record); + } else { + /* TTY output specific fields. */ + tty->flags |= UV_HANDLE_WRITABLE; + + /* Init utf8-to-utf16 conversion state. */ + tty->tty.wr.utf8_bytes_left = 0; + tty->tty.wr.utf8_codepoint = 0; + + /* Initialize eol conversion state */ + tty->tty.wr.previous_eol = 0; + + /* Init ANSI parser state. */ + tty->tty.wr.ansi_parser_state = ANSI_NORMAL; + } + + return 0; +} + + +/* Set the default console text attributes based on how the console was + * configured when libuv started. + */ +static void uv_tty_capture_initial_style(CONSOLE_SCREEN_BUFFER_INFO* info) { + static int style_captured = 0; + + /* Only do this once. + Assumption: Caller has acquired uv_tty_output_lock. */ + if (style_captured) + return; + + /* Save raw win32 attributes. */ + uv_tty_default_text_attributes = info->wAttributes; + + /* Convert black text on black background to use white text. */ + if (uv_tty_default_text_attributes == 0) + uv_tty_default_text_attributes = 7; + + /* Convert Win32 attributes to ANSI colors. */ + uv_tty_default_fg_color = 0; + uv_tty_default_bg_color = 0; + uv_tty_default_fg_bright = 0; + uv_tty_default_bg_bright = 0; + uv_tty_default_inverse = 0; + + if (uv_tty_default_text_attributes & FOREGROUND_RED) + uv_tty_default_fg_color |= 1; + + if (uv_tty_default_text_attributes & FOREGROUND_GREEN) + uv_tty_default_fg_color |= 2; + + if (uv_tty_default_text_attributes & FOREGROUND_BLUE) + uv_tty_default_fg_color |= 4; + + if (uv_tty_default_text_attributes & BACKGROUND_RED) + uv_tty_default_bg_color |= 1; + + if (uv_tty_default_text_attributes & BACKGROUND_GREEN) + uv_tty_default_bg_color |= 2; + + if (uv_tty_default_text_attributes & BACKGROUND_BLUE) + uv_tty_default_bg_color |= 4; + + if (uv_tty_default_text_attributes & FOREGROUND_INTENSITY) + uv_tty_default_fg_bright = 1; + + if (uv_tty_default_text_attributes & BACKGROUND_INTENSITY) + uv_tty_default_bg_bright = 1; + + if (uv_tty_default_text_attributes & COMMON_LVB_REVERSE_VIDEO) + uv_tty_default_inverse = 1; + + style_captured = 1; +} + + +int uv_tty_set_mode(uv_tty_t* tty, uv_tty_mode_t mode) { + DWORD flags; + unsigned char was_reading; + uv_alloc_cb alloc_cb; + uv_read_cb read_cb; + int err; + + if (!(tty->flags & UV_HANDLE_TTY_READABLE)) { + return UV_EINVAL; + } + + if (!!mode == !!(tty->flags & UV_HANDLE_TTY_RAW)) { + return 0; + } + + switch (mode) { + case UV_TTY_MODE_NORMAL: + flags = ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT; + break; + case UV_TTY_MODE_RAW: + flags = ENABLE_WINDOW_INPUT; + break; + case UV_TTY_MODE_IO: + return UV_ENOTSUP; + default: + return UV_EINVAL; + } + + /* If currently reading, stop, and restart reading. */ + if (tty->flags & UV_HANDLE_READING) { + was_reading = 1; + alloc_cb = tty->alloc_cb; + read_cb = tty->read_cb; + err = uv_tty_read_stop(tty); + if (err) { + return uv_translate_sys_error(err); + } + } else { + was_reading = 0; + } + + uv_sem_wait(&uv_tty_output_lock); + if (!SetConsoleMode(tty->handle, flags)) { + err = uv_translate_sys_error(GetLastError()); + uv_sem_post(&uv_tty_output_lock); + return err; + } + uv_sem_post(&uv_tty_output_lock); + + /* Update flag. */ + tty->flags &= ~UV_HANDLE_TTY_RAW; + tty->flags |= mode ? UV_HANDLE_TTY_RAW : 0; + + /* If we just stopped reading, restart. */ + if (was_reading) { + err = uv_tty_read_start(tty, alloc_cb, read_cb); + if (err) { + return uv_translate_sys_error(err); + } + } + + return 0; +} + + +int uv_is_tty(uv_file file) { + DWORD result; + return GetConsoleMode((HANDLE) _get_osfhandle(file), &result) != 0; +} + + +int uv_tty_get_winsize(uv_tty_t* tty, int* width, int* height) { + CONSOLE_SCREEN_BUFFER_INFO info; + + if (!GetConsoleScreenBufferInfo(tty->handle, &info)) { + return uv_translate_sys_error(GetLastError()); + } + + uv_sem_wait(&uv_tty_output_lock); + uv_tty_update_virtual_window(&info); + uv_sem_post(&uv_tty_output_lock); + + *width = uv_tty_virtual_width; + *height = uv_tty_virtual_height; + + return 0; +} + + +static void CALLBACK uv_tty_post_raw_read(void* data, BOOLEAN didTimeout) { + uv_loop_t* loop; + uv_tty_t* handle; + uv_req_t* req; + + assert(data); + assert(!didTimeout); + + req = (uv_req_t*) data; + handle = (uv_tty_t*) req->data; + loop = handle->loop; + + UnregisterWait(handle->tty.rd.read_raw_wait); + handle->tty.rd.read_raw_wait = NULL; + + SET_REQ_SUCCESS(req); + POST_COMPLETION_FOR_REQ(loop, req); +} + + +static void uv_tty_queue_read_raw(uv_loop_t* loop, uv_tty_t* handle) { + uv_read_t* req; + BOOL r; + + assert(handle->flags & UV_HANDLE_READING); + assert(!(handle->flags & UV_HANDLE_READ_PENDING)); + + assert(handle->handle && handle->handle != INVALID_HANDLE_VALUE); + + handle->tty.rd.read_line_buffer = uv_null_buf_; + + req = &handle->read_req; + memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); + + r = RegisterWaitForSingleObject(&handle->tty.rd.read_raw_wait, + handle->handle, + uv_tty_post_raw_read, + (void*) req, + INFINITE, + WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE); + if (!r) { + handle->tty.rd.read_raw_wait = NULL; + SET_REQ_ERROR(req, GetLastError()); + uv_insert_pending_req(loop, (uv_req_t*)req); + } + + handle->flags |= UV_HANDLE_READ_PENDING; + handle->reqs_pending++; +} + + +static DWORD CALLBACK uv_tty_line_read_thread(void* data) { + uv_loop_t* loop; + uv_tty_t* handle; + uv_req_t* req; + DWORD bytes, read_bytes; + WCHAR utf16[MAX_INPUT_BUFFER_LENGTH / 3]; + DWORD chars, read_chars; + LONG status; + COORD pos; + BOOL read_console_success; + + assert(data); + + req = (uv_req_t*) data; + handle = (uv_tty_t*) req->data; + loop = handle->loop; + + assert(handle->tty.rd.read_line_buffer.base != NULL); + assert(handle->tty.rd.read_line_buffer.len > 0); + + /* ReadConsole can't handle big buffers. */ + if (handle->tty.rd.read_line_buffer.len < MAX_INPUT_BUFFER_LENGTH) { + bytes = handle->tty.rd.read_line_buffer.len; + } else { + bytes = MAX_INPUT_BUFFER_LENGTH; + } + + /* At last, unicode! */ + /* One utf-16 codeunit never takes more than 3 utf-8 codeunits to encode */ + chars = bytes / 3; + + status = InterlockedExchange(&uv__read_console_status, IN_PROGRESS); + if (status == TRAP_REQUESTED) { + SET_REQ_SUCCESS(req); + req->u.io.overlapped.InternalHigh = 0; + POST_COMPLETION_FOR_REQ(loop, req); + return 0; + } + + read_console_success = ReadConsoleW(handle->handle, + (void*) utf16, + chars, + &read_chars, + NULL); + + if (read_console_success) { + read_bytes = WideCharToMultiByte(CP_UTF8, + 0, + utf16, + read_chars, + handle->tty.rd.read_line_buffer.base, + bytes, + NULL, + NULL); + SET_REQ_SUCCESS(req); + req->u.io.overlapped.InternalHigh = read_bytes; + } else { + SET_REQ_ERROR(req, GetLastError()); + } + + status = InterlockedExchange(&uv__read_console_status, COMPLETED); + + if (status == TRAP_REQUESTED) { + /* If we canceled the read by sending a VK_RETURN event, restore the + screen state to undo the visual effect of the VK_RETURN */ + if (read_console_success && InterlockedOr(&uv__restore_screen_state, 0)) { + HANDLE active_screen_buffer; + active_screen_buffer = CreateFileA("conout$", + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + if (active_screen_buffer != INVALID_HANDLE_VALUE) { + pos = uv__saved_screen_state.dwCursorPosition; + + /* If the cursor was at the bottom line of the screen buffer, the + VK_RETURN would have caused the buffer contents to scroll up by one + line. The right position to reset the cursor to is therefore one line + higher */ + if (pos.Y == uv__saved_screen_state.dwSize.Y - 1) + pos.Y--; + + SetConsoleCursorPosition(active_screen_buffer, pos); + CloseHandle(active_screen_buffer); + } + } + uv_sem_post(&uv_tty_output_lock); + } + POST_COMPLETION_FOR_REQ(loop, req); + return 0; +} + + +static void uv_tty_queue_read_line(uv_loop_t* loop, uv_tty_t* handle) { + uv_read_t* req; + BOOL r; + + assert(handle->flags & UV_HANDLE_READING); + assert(!(handle->flags & UV_HANDLE_READ_PENDING)); + assert(handle->handle && handle->handle != INVALID_HANDLE_VALUE); + + req = &handle->read_req; + memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); + + handle->tty.rd.read_line_buffer = uv_buf_init(NULL, 0); + handle->alloc_cb((uv_handle_t*) handle, 8192, &handle->tty.rd.read_line_buffer); + if (handle->tty.rd.read_line_buffer.base == NULL || + handle->tty.rd.read_line_buffer.len == 0) { + handle->read_cb((uv_stream_t*) handle, + UV_ENOBUFS, + &handle->tty.rd.read_line_buffer); + return; + } + assert(handle->tty.rd.read_line_buffer.base != NULL); + + /* Reset flags No locking is required since there cannot be a line read + in progress. We are also relying on the memory barrier provided by + QueueUserWorkItem*/ + uv__restore_screen_state = FALSE; + uv__read_console_status = NOT_STARTED; + r = QueueUserWorkItem(uv_tty_line_read_thread, + (void*) req, + WT_EXECUTELONGFUNCTION); + if (!r) { + SET_REQ_ERROR(req, GetLastError()); + uv_insert_pending_req(loop, (uv_req_t*)req); + } + + handle->flags |= UV_HANDLE_READ_PENDING; + handle->reqs_pending++; +} + + +static void uv_tty_queue_read(uv_loop_t* loop, uv_tty_t* handle) { + if (handle->flags & UV_HANDLE_TTY_RAW) { + uv_tty_queue_read_raw(loop, handle); + } else { + uv_tty_queue_read_line(loop, handle); + } +} + + +static const char* get_vt100_fn_key(DWORD code, char shift, char ctrl, + size_t* len) { +#define VK_CASE(vk, normal_str, shift_str, ctrl_str, shift_ctrl_str) \ + case (vk): \ + if (shift && ctrl) { \ + *len = sizeof shift_ctrl_str; \ + return "\033" shift_ctrl_str; \ + } else if (shift) { \ + *len = sizeof shift_str ; \ + return "\033" shift_str; \ + } else if (ctrl) { \ + *len = sizeof ctrl_str; \ + return "\033" ctrl_str; \ + } else { \ + *len = sizeof normal_str; \ + return "\033" normal_str; \ + } + + switch (code) { + /* These mappings are the same as Cygwin's. Unmodified and alt-modified */ + /* keypad keys comply with linux console, modifiers comply with xterm */ + /* modifier usage. F1..f12 and shift-f1..f10 comply with linux console, */ + /* f6..f12 with and without modifiers comply with rxvt. */ + VK_CASE(VK_INSERT, "[2~", "[2;2~", "[2;5~", "[2;6~") + VK_CASE(VK_END, "[4~", "[4;2~", "[4;5~", "[4;6~") + VK_CASE(VK_DOWN, "[B", "[1;2B", "[1;5B", "[1;6B") + VK_CASE(VK_NEXT, "[6~", "[6;2~", "[6;5~", "[6;6~") + VK_CASE(VK_LEFT, "[D", "[1;2D", "[1;5D", "[1;6D") + VK_CASE(VK_CLEAR, "[G", "[1;2G", "[1;5G", "[1;6G") + VK_CASE(VK_RIGHT, "[C", "[1;2C", "[1;5C", "[1;6C") + VK_CASE(VK_UP, "[A", "[1;2A", "[1;5A", "[1;6A") + VK_CASE(VK_HOME, "[1~", "[1;2~", "[1;5~", "[1;6~") + VK_CASE(VK_PRIOR, "[5~", "[5;2~", "[5;5~", "[5;6~") + VK_CASE(VK_DELETE, "[3~", "[3;2~", "[3;5~", "[3;6~") + VK_CASE(VK_NUMPAD0, "[2~", "[2;2~", "[2;5~", "[2;6~") + VK_CASE(VK_NUMPAD1, "[4~", "[4;2~", "[4;5~", "[4;6~") + VK_CASE(VK_NUMPAD2, "[B", "[1;2B", "[1;5B", "[1;6B") + VK_CASE(VK_NUMPAD3, "[6~", "[6;2~", "[6;5~", "[6;6~") + VK_CASE(VK_NUMPAD4, "[D", "[1;2D", "[1;5D", "[1;6D") + VK_CASE(VK_NUMPAD5, "[G", "[1;2G", "[1;5G", "[1;6G") + VK_CASE(VK_NUMPAD6, "[C", "[1;2C", "[1;5C", "[1;6C") + VK_CASE(VK_NUMPAD7, "[A", "[1;2A", "[1;5A", "[1;6A") + VK_CASE(VK_NUMPAD8, "[1~", "[1;2~", "[1;5~", "[1;6~") + VK_CASE(VK_NUMPAD9, "[5~", "[5;2~", "[5;5~", "[5;6~") + VK_CASE(VK_DECIMAL, "[3~", "[3;2~", "[3;5~", "[3;6~") + VK_CASE(VK_F1, "[[A", "[23~", "[11^", "[23^" ) + VK_CASE(VK_F2, "[[B", "[24~", "[12^", "[24^" ) + VK_CASE(VK_F3, "[[C", "[25~", "[13^", "[25^" ) + VK_CASE(VK_F4, "[[D", "[26~", "[14^", "[26^" ) + VK_CASE(VK_F5, "[[E", "[28~", "[15^", "[28^" ) + VK_CASE(VK_F6, "[17~", "[29~", "[17^", "[29^" ) + VK_CASE(VK_F7, "[18~", "[31~", "[18^", "[31^" ) + VK_CASE(VK_F8, "[19~", "[32~", "[19^", "[32^" ) + VK_CASE(VK_F9, "[20~", "[33~", "[20^", "[33^" ) + VK_CASE(VK_F10, "[21~", "[34~", "[21^", "[34^" ) + VK_CASE(VK_F11, "[23~", "[23$", "[23^", "[23@" ) + VK_CASE(VK_F12, "[24~", "[24$", "[24^", "[24@" ) + + default: + *len = 0; + return NULL; + } +#undef VK_CASE +} + + +void uv_process_tty_read_raw_req(uv_loop_t* loop, uv_tty_t* handle, + uv_req_t* req) { + /* Shortcut for handle->tty.rd.last_input_record.Event.KeyEvent. */ +#define KEV handle->tty.rd.last_input_record.Event.KeyEvent + + DWORD records_left, records_read; + uv_buf_t buf; + off_t buf_used; + + assert(handle->type == UV_TTY); + assert(handle->flags & UV_HANDLE_TTY_READABLE); + handle->flags &= ~UV_HANDLE_READ_PENDING; + + if (!(handle->flags & UV_HANDLE_READING) || + !(handle->flags & UV_HANDLE_TTY_RAW)) { + goto out; + } + + if (!REQ_SUCCESS(req)) { + /* An error occurred while waiting for the event. */ + if ((handle->flags & UV_HANDLE_READING)) { + handle->flags &= ~UV_HANDLE_READING; + handle->read_cb((uv_stream_t*)handle, + uv_translate_sys_error(GET_REQ_ERROR(req)), + &uv_null_buf_); + } + goto out; + } + + /* Fetch the number of events */ + if (!GetNumberOfConsoleInputEvents(handle->handle, &records_left)) { + handle->flags &= ~UV_HANDLE_READING; + DECREASE_ACTIVE_COUNT(loop, handle); + handle->read_cb((uv_stream_t*)handle, + uv_translate_sys_error(GetLastError()), + &uv_null_buf_); + goto out; + } + + /* Windows sends a lot of events that we're not interested in, so buf */ + /* will be allocated on demand, when there's actually something to emit. */ + buf = uv_null_buf_; + buf_used = 0; + + while ((records_left > 0 || handle->tty.rd.last_key_len > 0) && + (handle->flags & UV_HANDLE_READING)) { + if (handle->tty.rd.last_key_len == 0) { + /* Read the next input record */ + if (!ReadConsoleInputW(handle->handle, + &handle->tty.rd.last_input_record, + 1, + &records_read)) { + handle->flags &= ~UV_HANDLE_READING; + DECREASE_ACTIVE_COUNT(loop, handle); + handle->read_cb((uv_stream_t*) handle, + uv_translate_sys_error(GetLastError()), + &buf); + goto out; + } + records_left--; + + /* If the window was resized, recompute the virtual window size. This */ + /* will trigger a SIGWINCH signal if the window size changed in an */ + /* way that matters to libuv. */ + if (handle->tty.rd.last_input_record.EventType == WINDOW_BUFFER_SIZE_EVENT) { + CONSOLE_SCREEN_BUFFER_INFO info; + + uv_sem_wait(&uv_tty_output_lock); + + if (uv_tty_output_handle != INVALID_HANDLE_VALUE && + GetConsoleScreenBufferInfo(uv_tty_output_handle, &info)) { + uv_tty_update_virtual_window(&info); + } + + uv_sem_post(&uv_tty_output_lock); + + continue; + } + + /* Ignore other events that are not key or resize events. */ + if (handle->tty.rd.last_input_record.EventType != KEY_EVENT) { + continue; + } + + /* Ignore keyup events, unless the left alt key was held and a valid */ + /* unicode character was emitted. */ + if (!KEV.bKeyDown && !(((KEV.dwControlKeyState & LEFT_ALT_PRESSED) || + KEV.wVirtualKeyCode==VK_MENU) && KEV.uChar.UnicodeChar != 0)) { + continue; + } + + /* Ignore keypresses to numpad number keys if the left alt is held */ + /* because the user is composing a character, or windows simulating */ + /* this. */ + if ((KEV.dwControlKeyState & LEFT_ALT_PRESSED) && + !(KEV.dwControlKeyState & ENHANCED_KEY) && + (KEV.wVirtualKeyCode == VK_INSERT || + KEV.wVirtualKeyCode == VK_END || + KEV.wVirtualKeyCode == VK_DOWN || + KEV.wVirtualKeyCode == VK_NEXT || + KEV.wVirtualKeyCode == VK_LEFT || + KEV.wVirtualKeyCode == VK_CLEAR || + KEV.wVirtualKeyCode == VK_RIGHT || + KEV.wVirtualKeyCode == VK_HOME || + KEV.wVirtualKeyCode == VK_UP || + KEV.wVirtualKeyCode == VK_PRIOR || + KEV.wVirtualKeyCode == VK_NUMPAD0 || + KEV.wVirtualKeyCode == VK_NUMPAD1 || + KEV.wVirtualKeyCode == VK_NUMPAD2 || + KEV.wVirtualKeyCode == VK_NUMPAD3 || + KEV.wVirtualKeyCode == VK_NUMPAD4 || + KEV.wVirtualKeyCode == VK_NUMPAD5 || + KEV.wVirtualKeyCode == VK_NUMPAD6 || + KEV.wVirtualKeyCode == VK_NUMPAD7 || + KEV.wVirtualKeyCode == VK_NUMPAD8 || + KEV.wVirtualKeyCode == VK_NUMPAD9)) { + continue; + } + + if (KEV.uChar.UnicodeChar != 0) { + int prefix_len, char_len; + + /* Character key pressed */ + if (KEV.uChar.UnicodeChar >= 0xD800 && + KEV.uChar.UnicodeChar < 0xDC00) { + /* UTF-16 high surrogate */ + handle->tty.rd.last_utf16_high_surrogate = KEV.uChar.UnicodeChar; + continue; + } + + /* Prefix with \u033 if alt was held, but alt was not used as part */ + /* a compose sequence. */ + if ((KEV.dwControlKeyState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) + && !(KEV.dwControlKeyState & (LEFT_CTRL_PRESSED | + RIGHT_CTRL_PRESSED)) && KEV.bKeyDown) { + handle->tty.rd.last_key[0] = '\033'; + prefix_len = 1; + } else { + prefix_len = 0; + } + + if (KEV.uChar.UnicodeChar >= 0xDC00 && + KEV.uChar.UnicodeChar < 0xE000) { + /* UTF-16 surrogate pair */ + WCHAR utf16_buffer[2] = { handle->tty.rd.last_utf16_high_surrogate, + KEV.uChar.UnicodeChar}; + char_len = WideCharToMultiByte(CP_UTF8, + 0, + utf16_buffer, + 2, + &handle->tty.rd.last_key[prefix_len], + sizeof handle->tty.rd.last_key, + NULL, + NULL); + } else { + /* Single UTF-16 character */ + char_len = WideCharToMultiByte(CP_UTF8, + 0, + &KEV.uChar.UnicodeChar, + 1, + &handle->tty.rd.last_key[prefix_len], + sizeof handle->tty.rd.last_key, + NULL, + NULL); + } + + /* Whatever happened, the last character wasn't a high surrogate. */ + handle->tty.rd.last_utf16_high_surrogate = 0; + + /* If the utf16 character(s) couldn't be converted something must */ + /* be wrong. */ + if (!char_len) { + handle->flags &= ~UV_HANDLE_READING; + DECREASE_ACTIVE_COUNT(loop, handle); + handle->read_cb((uv_stream_t*) handle, + uv_translate_sys_error(GetLastError()), + &buf); + goto out; + } + + handle->tty.rd.last_key_len = (unsigned char) (prefix_len + char_len); + handle->tty.rd.last_key_offset = 0; + continue; + + } else { + /* Function key pressed */ + const char* vt100; + size_t prefix_len, vt100_len; + + vt100 = get_vt100_fn_key(KEV.wVirtualKeyCode, + !!(KEV.dwControlKeyState & SHIFT_PRESSED), + !!(KEV.dwControlKeyState & ( + LEFT_CTRL_PRESSED | + RIGHT_CTRL_PRESSED)), + &vt100_len); + + /* If we were unable to map to a vt100 sequence, just ignore. */ + if (!vt100) { + continue; + } + + /* Prefix with \x033 when the alt key was held. */ + if (KEV.dwControlKeyState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) { + handle->tty.rd.last_key[0] = '\033'; + prefix_len = 1; + } else { + prefix_len = 0; + } + + /* Copy the vt100 sequence to the handle buffer. */ + assert(prefix_len + vt100_len < sizeof handle->tty.rd.last_key); + memcpy(&handle->tty.rd.last_key[prefix_len], vt100, vt100_len); + + handle->tty.rd.last_key_len = (unsigned char) (prefix_len + vt100_len); + handle->tty.rd.last_key_offset = 0; + continue; + } + } else { + /* Copy any bytes left from the last keypress to the user buffer. */ + if (handle->tty.rd.last_key_offset < handle->tty.rd.last_key_len) { + /* Allocate a buffer if needed */ + if (buf_used == 0) { + buf = uv_buf_init(NULL, 0); + handle->alloc_cb((uv_handle_t*) handle, 1024, &buf); + if (buf.base == NULL || buf.len == 0) { + handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &buf); + goto out; + } + assert(buf.base != NULL); + } + + buf.base[buf_used++] = handle->tty.rd.last_key[handle->tty.rd.last_key_offset++]; + + /* If the buffer is full, emit it */ + if ((size_t) buf_used == buf.len) { + handle->read_cb((uv_stream_t*) handle, buf_used, &buf); + buf = uv_null_buf_; + buf_used = 0; + } + + continue; + } + + /* Apply dwRepeat from the last input record. */ + if (--KEV.wRepeatCount > 0) { + handle->tty.rd.last_key_offset = 0; + continue; + } + + handle->tty.rd.last_key_len = 0; + continue; + } + } + + /* Send the buffer back to the user */ + if (buf_used > 0) { + handle->read_cb((uv_stream_t*) handle, buf_used, &buf); + } + + out: + /* Wait for more input events. */ + if ((handle->flags & UV_HANDLE_READING) && + !(handle->flags & UV_HANDLE_READ_PENDING)) { + uv_tty_queue_read(loop, handle); + } + + DECREASE_PENDING_REQ_COUNT(handle); + +#undef KEV +} + + + +void uv_process_tty_read_line_req(uv_loop_t* loop, uv_tty_t* handle, + uv_req_t* req) { + uv_buf_t buf; + + assert(handle->type == UV_TTY); + assert(handle->flags & UV_HANDLE_TTY_READABLE); + + buf = handle->tty.rd.read_line_buffer; + + handle->flags &= ~UV_HANDLE_READ_PENDING; + handle->tty.rd.read_line_buffer = uv_null_buf_; + + if (!REQ_SUCCESS(req)) { + /* Read was not successful */ + if (handle->flags & UV_HANDLE_READING) { + /* Real error */ + handle->flags &= ~UV_HANDLE_READING; + DECREASE_ACTIVE_COUNT(loop, handle); + handle->read_cb((uv_stream_t*) handle, + uv_translate_sys_error(GET_REQ_ERROR(req)), + &buf); + } else { + /* The read was cancelled, or whatever we don't care */ + handle->read_cb((uv_stream_t*) handle, 0, &buf); + } + + } else { + if (!(handle->flags & UV_HANDLE_CANCELLATION_PENDING)) { + /* Read successful */ + /* TODO: read unicode, convert to utf-8 */ + DWORD bytes = req->u.io.overlapped.InternalHigh; + handle->read_cb((uv_stream_t*) handle, bytes, &buf); + } else { + handle->flags &= ~UV_HANDLE_CANCELLATION_PENDING; + handle->read_cb((uv_stream_t*) handle, 0, &buf); + } + } + + /* Wait for more input events. */ + if ((handle->flags & UV_HANDLE_READING) && + !(handle->flags & UV_HANDLE_READ_PENDING)) { + uv_tty_queue_read(loop, handle); + } + + DECREASE_PENDING_REQ_COUNT(handle); +} + + +void uv_process_tty_read_req(uv_loop_t* loop, uv_tty_t* handle, + uv_req_t* req) { + assert(handle->type == UV_TTY); + assert(handle->flags & UV_HANDLE_TTY_READABLE); + + /* If the read_line_buffer member is zero, it must have been an raw read. */ + /* Otherwise it was a line-buffered read. */ + /* FIXME: This is quite obscure. Use a flag or something. */ + if (handle->tty.rd.read_line_buffer.len == 0) { + uv_process_tty_read_raw_req(loop, handle, req); + } else { + uv_process_tty_read_line_req(loop, handle, req); + } +} + + +int uv_tty_read_start(uv_tty_t* handle, uv_alloc_cb alloc_cb, + uv_read_cb read_cb) { + uv_loop_t* loop = handle->loop; + + if (!(handle->flags & UV_HANDLE_TTY_READABLE)) { + return ERROR_INVALID_PARAMETER; + } + + handle->flags |= UV_HANDLE_READING; + INCREASE_ACTIVE_COUNT(loop, handle); + handle->read_cb = read_cb; + handle->alloc_cb = alloc_cb; + + /* If reading was stopped and then started again, there could still be a */ + /* read request pending. */ + if (handle->flags & UV_HANDLE_READ_PENDING) { + return 0; + } + + /* Maybe the user stopped reading half-way while processing key events. */ + /* Short-circuit if this could be the case. */ + if (handle->tty.rd.last_key_len > 0) { + SET_REQ_SUCCESS(&handle->read_req); + uv_insert_pending_req(handle->loop, (uv_req_t*) &handle->read_req); + /* Make sure no attempt is made to insert it again until it's handled. */ + handle->flags |= UV_HANDLE_READ_PENDING; + handle->reqs_pending++; + return 0; + } + + uv_tty_queue_read(loop, handle); + + return 0; +} + + +int uv_tty_read_stop(uv_tty_t* handle) { + INPUT_RECORD record; + DWORD written, err; + + handle->flags &= ~UV_HANDLE_READING; + DECREASE_ACTIVE_COUNT(handle->loop, handle); + + if (!(handle->flags & UV_HANDLE_READ_PENDING)) + return 0; + + if (handle->flags & UV_HANDLE_TTY_RAW) { + /* Cancel raw read */ + /* Write some bullshit event to force the console wait to return. */ + memset(&record, 0, sizeof record); + if (!WriteConsoleInputW(handle->handle, &record, 1, &written)) { + return GetLastError(); + } + } else if (!(handle->flags & UV_HANDLE_CANCELLATION_PENDING)) { + /* Cancel line-buffered read if not already pending */ + err = uv__cancel_read_console(handle); + if (err) + return err; + + handle->flags |= UV_HANDLE_CANCELLATION_PENDING; + } + + return 0; +} + +static int uv__cancel_read_console(uv_tty_t* handle) { + HANDLE active_screen_buffer = INVALID_HANDLE_VALUE; + INPUT_RECORD record; + DWORD written; + DWORD err = 0; + LONG status; + + assert(!(handle->flags & UV_HANDLE_CANCELLATION_PENDING)); + + /* Hold the output lock during the cancellation, to ensure that further + writes don't interfere with the screen state. It will be the ReadConsole + thread's responsibility to release the lock. */ + uv_sem_wait(&uv_tty_output_lock); + status = InterlockedExchange(&uv__read_console_status, TRAP_REQUESTED); + if (status != IN_PROGRESS) { + /* Either we have managed to set a trap for the other thread before + ReadConsole is called, or ReadConsole has returned because the user + has pressed ENTER. In either case, there is nothing else to do. */ + uv_sem_post(&uv_tty_output_lock); + return 0; + } + + /* Save screen state before sending the VK_RETURN event */ + active_screen_buffer = CreateFileA("conout$", + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (active_screen_buffer != INVALID_HANDLE_VALUE && + GetConsoleScreenBufferInfo(active_screen_buffer, + &uv__saved_screen_state)) { + InterlockedOr(&uv__restore_screen_state, 1); + } + + /* Write enter key event to force the console wait to return. */ + record.EventType = KEY_EVENT; + record.Event.KeyEvent.bKeyDown = TRUE; + record.Event.KeyEvent.wRepeatCount = 1; + record.Event.KeyEvent.wVirtualKeyCode = VK_RETURN; + record.Event.KeyEvent.wVirtualScanCode = + MapVirtualKeyW(VK_RETURN, MAPVK_VK_TO_VSC); + record.Event.KeyEvent.uChar.UnicodeChar = L'\r'; + record.Event.KeyEvent.dwControlKeyState = 0; + if (!WriteConsoleInputW(handle->handle, &record, 1, &written)) + err = GetLastError(); + + if (active_screen_buffer != INVALID_HANDLE_VALUE) + CloseHandle(active_screen_buffer); + + return err; +} + + +static void uv_tty_update_virtual_window(CONSOLE_SCREEN_BUFFER_INFO* info) { + int old_virtual_width = uv_tty_virtual_width; + int old_virtual_height = uv_tty_virtual_height; + + uv_tty_virtual_width = info->dwSize.X; + uv_tty_virtual_height = info->srWindow.Bottom - info->srWindow.Top + 1; + + /* Recompute virtual window offset row. */ + if (uv_tty_virtual_offset == -1) { + uv_tty_virtual_offset = info->dwCursorPosition.Y; + } else if (uv_tty_virtual_offset < info->dwCursorPosition.Y - + uv_tty_virtual_height + 1) { + /* If suddenly find the cursor outside of the virtual window, it must */ + /* have somehow scrolled. Update the virtual window offset. */ + uv_tty_virtual_offset = info->dwCursorPosition.Y - + uv_tty_virtual_height + 1; + } + if (uv_tty_virtual_offset + uv_tty_virtual_height > info->dwSize.Y) { + uv_tty_virtual_offset = info->dwSize.Y - uv_tty_virtual_height; + } + if (uv_tty_virtual_offset < 0) { + uv_tty_virtual_offset = 0; + } + + /* If the virtual window size changed, emit a SIGWINCH signal. Don't emit */ + /* if this was the first time the virtual window size was computed. */ + if (old_virtual_width != -1 && old_virtual_height != -1 && + (uv_tty_virtual_width != old_virtual_width || + uv_tty_virtual_height != old_virtual_height)) { + uv__signal_dispatch(SIGWINCH); + } +} + + +static COORD uv_tty_make_real_coord(uv_tty_t* handle, + CONSOLE_SCREEN_BUFFER_INFO* info, int x, unsigned char x_relative, int y, + unsigned char y_relative) { + COORD result; + + uv_tty_update_virtual_window(info); + + /* Adjust y position */ + if (y_relative) { + y = info->dwCursorPosition.Y + y; + } else { + y = uv_tty_virtual_offset + y; + } + /* Clip y to virtual client rectangle */ + if (y < uv_tty_virtual_offset) { + y = uv_tty_virtual_offset; + } else if (y >= uv_tty_virtual_offset + uv_tty_virtual_height) { + y = uv_tty_virtual_offset + uv_tty_virtual_height - 1; + } + + /* Adjust x */ + if (x_relative) { + x = info->dwCursorPosition.X + x; + } + /* Clip x */ + if (x < 0) { + x = 0; + } else if (x >= uv_tty_virtual_width) { + x = uv_tty_virtual_width - 1; + } + + result.X = (unsigned short) x; + result.Y = (unsigned short) y; + return result; +} + + +static int uv_tty_emit_text(uv_tty_t* handle, WCHAR buffer[], DWORD length, + DWORD* error) { + DWORD written; + + if (*error != ERROR_SUCCESS) { + return -1; + } + + if (!WriteConsoleW(handle->handle, + (void*) buffer, + length, + &written, + NULL)) { + *error = GetLastError(); + return -1; + } + + return 0; +} + + +static int uv_tty_move_caret(uv_tty_t* handle, int x, unsigned char x_relative, + int y, unsigned char y_relative, DWORD* error) { + CONSOLE_SCREEN_BUFFER_INFO info; + COORD pos; + + if (*error != ERROR_SUCCESS) { + return -1; + } + + retry: + if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { + *error = GetLastError(); + } + + pos = uv_tty_make_real_coord(handle, &info, x, x_relative, y, y_relative); + + if (!SetConsoleCursorPosition(handle->handle, pos)) { + if (GetLastError() == ERROR_INVALID_PARAMETER) { + /* The console may be resized - retry */ + goto retry; + } else { + *error = GetLastError(); + return -1; + } + } + + return 0; +} + + +static int uv_tty_reset(uv_tty_t* handle, DWORD* error) { + const COORD origin = {0, 0}; + const WORD char_attrs = uv_tty_default_text_attributes; + CONSOLE_SCREEN_BUFFER_INFO info; + DWORD count, written; + + if (*error != ERROR_SUCCESS) { + return -1; + } + + /* Reset original text attributes. */ + if (!SetConsoleTextAttribute(handle->handle, char_attrs)) { + *error = GetLastError(); + return -1; + } + + /* Move the cursor position to (0, 0). */ + if (!SetConsoleCursorPosition(handle->handle, origin)) { + *error = GetLastError(); + return -1; + } + + /* Clear the screen buffer. */ + retry: + if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { + *error = GetLastError(); + return -1; + } + + count = info.dwSize.X * info.dwSize.Y; + + if (!(FillConsoleOutputCharacterW(handle->handle, + L'\x20', + count, + origin, + &written) && + FillConsoleOutputAttribute(handle->handle, + char_attrs, + written, + origin, + &written))) { + if (GetLastError() == ERROR_INVALID_PARAMETER) { + /* The console may be resized - retry */ + goto retry; + } else { + *error = GetLastError(); + return -1; + } + } + + /* Move the virtual window up to the top. */ + uv_tty_virtual_offset = 0; + uv_tty_update_virtual_window(&info); + + return 0; +} + + +static int uv_tty_clear(uv_tty_t* handle, int dir, char entire_screen, + DWORD* error) { + CONSOLE_SCREEN_BUFFER_INFO info; + COORD start, end; + DWORD count, written; + + int x1, x2, y1, y2; + int x1r, x2r, y1r, y2r; + + if (*error != ERROR_SUCCESS) { + return -1; + } + + if (dir == 0) { + /* Clear from current position */ + x1 = 0; + x1r = 1; + } else { + /* Clear from column 0 */ + x1 = 0; + x1r = 0; + } + + if (dir == 1) { + /* Clear to current position */ + x2 = 0; + x2r = 1; + } else { + /* Clear to end of row. We pretend the console is 65536 characters wide, */ + /* uv_tty_make_real_coord will clip it to the actual console width. */ + x2 = 0xffff; + x2r = 0; + } + + if (!entire_screen) { + /* Stay on our own row */ + y1 = y2 = 0; + y1r = y2r = 1; + } else { + /* Apply columns direction to row */ + y1 = x1; + y1r = x1r; + y2 = x2; + y2r = x2r; + } + + retry: + if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { + *error = GetLastError(); + return -1; + } + + start = uv_tty_make_real_coord(handle, &info, x1, x1r, y1, y1r); + end = uv_tty_make_real_coord(handle, &info, x2, x2r, y2, y2r); + count = (end.Y * info.dwSize.X + end.X) - + (start.Y * info.dwSize.X + start.X) + 1; + + if (!(FillConsoleOutputCharacterW(handle->handle, + L'\x20', + count, + start, + &written) && + FillConsoleOutputAttribute(handle->handle, + info.wAttributes, + written, + start, + &written))) { + if (GetLastError() == ERROR_INVALID_PARAMETER) { + /* The console may be resized - retry */ + goto retry; + } else { + *error = GetLastError(); + return -1; + } + } + + return 0; +} + +#define FLIP_FGBG \ + do { \ + WORD fg = info.wAttributes & 0xF; \ + WORD bg = info.wAttributes & 0xF0; \ + info.wAttributes &= 0xFF00; \ + info.wAttributes |= fg << 4; \ + info.wAttributes |= bg >> 4; \ + } while (0) + +static int uv_tty_set_style(uv_tty_t* handle, DWORD* error) { + unsigned short argc = handle->tty.wr.ansi_csi_argc; + unsigned short* argv = handle->tty.wr.ansi_csi_argv; + int i; + CONSOLE_SCREEN_BUFFER_INFO info; + + char fg_color = -1, bg_color = -1; + char fg_bright = -1, bg_bright = -1; + char inverse = -1; + + if (argc == 0) { + /* Reset mode */ + fg_color = uv_tty_default_fg_color; + bg_color = uv_tty_default_bg_color; + fg_bright = uv_tty_default_fg_bright; + bg_bright = uv_tty_default_bg_bright; + inverse = uv_tty_default_inverse; + } + + for (i = 0; i < argc; i++) { + short arg = argv[i]; + + if (arg == 0) { + /* Reset mode */ + fg_color = uv_tty_default_fg_color; + bg_color = uv_tty_default_bg_color; + fg_bright = uv_tty_default_fg_bright; + bg_bright = uv_tty_default_bg_bright; + inverse = uv_tty_default_inverse; + + } else if (arg == 1) { + /* Foreground bright on */ + fg_bright = 1; + + } else if (arg == 2) { + /* Both bright off */ + fg_bright = 0; + bg_bright = 0; + + } else if (arg == 5) { + /* Background bright on */ + bg_bright = 1; + + } else if (arg == 7) { + /* Inverse: on */ + inverse = 1; + + } else if (arg == 21 || arg == 22) { + /* Foreground bright off */ + fg_bright = 0; + + } else if (arg == 25) { + /* Background bright off */ + bg_bright = 0; + + } else if (arg == 27) { + /* Inverse: off */ + inverse = 0; + + } else if (arg >= 30 && arg <= 37) { + /* Set foreground color */ + fg_color = arg - 30; + + } else if (arg == 39) { + /* Default text color */ + fg_color = uv_tty_default_fg_color; + fg_bright = uv_tty_default_fg_bright; + + } else if (arg >= 40 && arg <= 47) { + /* Set background color */ + bg_color = arg - 40; + + } else if (arg == 49) { + /* Default background color */ + bg_color = uv_tty_default_bg_color; + bg_bright = uv_tty_default_bg_bright; + + } else if (arg >= 90 && arg <= 97) { + /* Set bold foreground color */ + fg_bright = 1; + fg_color = arg - 90; + + } else if (arg >= 100 && arg <= 107) { + /* Set bold background color */ + bg_bright = 1; + bg_color = arg - 100; + + } + } + + if (fg_color == -1 && bg_color == -1 && fg_bright == -1 && + bg_bright == -1 && inverse == -1) { + /* Nothing changed */ + return 0; + } + + if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { + *error = GetLastError(); + return -1; + } + + if ((info.wAttributes & COMMON_LVB_REVERSE_VIDEO) > 0) { + FLIP_FGBG; + } + + if (fg_color != -1) { + info.wAttributes &= ~(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); + if (fg_color & 1) info.wAttributes |= FOREGROUND_RED; + if (fg_color & 2) info.wAttributes |= FOREGROUND_GREEN; + if (fg_color & 4) info.wAttributes |= FOREGROUND_BLUE; + } + + if (fg_bright != -1) { + if (fg_bright) { + info.wAttributes |= FOREGROUND_INTENSITY; + } else { + info.wAttributes &= ~FOREGROUND_INTENSITY; + } + } + + if (bg_color != -1) { + info.wAttributes &= ~(BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE); + if (bg_color & 1) info.wAttributes |= BACKGROUND_RED; + if (bg_color & 2) info.wAttributes |= BACKGROUND_GREEN; + if (bg_color & 4) info.wAttributes |= BACKGROUND_BLUE; + } + + if (bg_bright != -1) { + if (bg_bright) { + info.wAttributes |= BACKGROUND_INTENSITY; + } else { + info.wAttributes &= ~BACKGROUND_INTENSITY; + } + } + + if (inverse != -1) { + if (inverse) { + info.wAttributes |= COMMON_LVB_REVERSE_VIDEO; + } else { + info.wAttributes &= ~COMMON_LVB_REVERSE_VIDEO; + } + } + + if ((info.wAttributes & COMMON_LVB_REVERSE_VIDEO) > 0) { + FLIP_FGBG; + } + + if (!SetConsoleTextAttribute(handle->handle, info.wAttributes)) { + *error = GetLastError(); + return -1; + } + + return 0; +} + + +static int uv_tty_save_state(uv_tty_t* handle, unsigned char save_attributes, + DWORD* error) { + CONSOLE_SCREEN_BUFFER_INFO info; + + if (*error != ERROR_SUCCESS) { + return -1; + } + + if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { + *error = GetLastError(); + return -1; + } + + uv_tty_update_virtual_window(&info); + + handle->tty.wr.saved_position.X = info.dwCursorPosition.X; + handle->tty.wr.saved_position.Y = info.dwCursorPosition.Y - uv_tty_virtual_offset; + handle->flags |= UV_HANDLE_TTY_SAVED_POSITION; + + if (save_attributes) { + handle->tty.wr.saved_attributes = info.wAttributes & + (FOREGROUND_INTENSITY | BACKGROUND_INTENSITY); + handle->flags |= UV_HANDLE_TTY_SAVED_ATTRIBUTES; + } + + return 0; +} + + +static int uv_tty_restore_state(uv_tty_t* handle, + unsigned char restore_attributes, DWORD* error) { + CONSOLE_SCREEN_BUFFER_INFO info; + WORD new_attributes; + + if (*error != ERROR_SUCCESS) { + return -1; + } + + if (handle->flags & UV_HANDLE_TTY_SAVED_POSITION) { + if (uv_tty_move_caret(handle, + handle->tty.wr.saved_position.X, + 0, + handle->tty.wr.saved_position.Y, + 0, + error) != 0) { + return -1; + } + } + + if (restore_attributes && + (handle->flags & UV_HANDLE_TTY_SAVED_ATTRIBUTES)) { + if (!GetConsoleScreenBufferInfo(handle->handle, &info)) { + *error = GetLastError(); + return -1; + } + + new_attributes = info.wAttributes; + new_attributes &= ~(FOREGROUND_INTENSITY | BACKGROUND_INTENSITY); + new_attributes |= handle->tty.wr.saved_attributes; + + if (!SetConsoleTextAttribute(handle->handle, new_attributes)) { + *error = GetLastError(); + return -1; + } + } + + return 0; +} + +static int uv_tty_set_cursor_visibility(uv_tty_t* handle, + BOOL visible, + DWORD* error) { + CONSOLE_CURSOR_INFO cursor_info; + + if (!GetConsoleCursorInfo(handle->handle, &cursor_info)) { + *error = GetLastError(); + return -1; + } + + cursor_info.bVisible = visible; + + if (!SetConsoleCursorInfo(handle->handle, &cursor_info)) { + *error = GetLastError(); + return -1; + } + + return 0; +} + +static int uv_tty_write_bufs(uv_tty_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + DWORD* error) { + /* We can only write 8k characters at a time. Windows can't handle */ + /* much more characters in a single console write anyway. */ + WCHAR utf16_buf[MAX_CONSOLE_CHAR]; + WCHAR* utf16_buffer; + DWORD utf16_buf_used = 0; + unsigned int i, len, max_len, pos; + int allocate = 0; + +#define FLUSH_TEXT() \ + do { \ + pos = 0; \ + do { \ + len = utf16_buf_used - pos; \ + if (len > MAX_CONSOLE_CHAR) \ + len = MAX_CONSOLE_CHAR; \ + uv_tty_emit_text(handle, &utf16_buffer[pos], len, error); \ + pos += len; \ + } while (pos < utf16_buf_used); \ + if (allocate) { \ + uv__free(utf16_buffer); \ + allocate = 0; \ + utf16_buffer = utf16_buf; \ + } \ + utf16_buf_used = 0; \ + } while (0) + +#define ENSURE_BUFFER_SPACE(wchars_needed) \ + if (wchars_needed > ARRAY_SIZE(utf16_buf) - utf16_buf_used) { \ + FLUSH_TEXT(); \ + } + + /* Cache for fast access */ + unsigned char utf8_bytes_left = handle->tty.wr.utf8_bytes_left; + unsigned int utf8_codepoint = handle->tty.wr.utf8_codepoint; + unsigned char previous_eol = handle->tty.wr.previous_eol; + unsigned char ansi_parser_state = handle->tty.wr.ansi_parser_state; + + /* Store the error here. If we encounter an error, stop trying to do i/o */ + /* but keep parsing the buffer so we leave the parser in a consistent */ + /* state. */ + *error = ERROR_SUCCESS; + + utf16_buffer = utf16_buf; + + uv_sem_wait(&uv_tty_output_lock); + + for (i = 0; i < nbufs; i++) { + uv_buf_t buf = bufs[i]; + unsigned int j; + + if (uv__vterm_state == UV_SUPPORTED && buf.len > 0) { + utf16_buf_used = MultiByteToWideChar(CP_UTF8, + 0, + buf.base, + buf.len, + NULL, + 0); + + if (utf16_buf_used == 0) { + *error = GetLastError(); + break; + } + + max_len = (utf16_buf_used + 1) * sizeof(WCHAR); + allocate = max_len > MAX_CONSOLE_CHAR; + if (allocate) + utf16_buffer = uv__malloc(max_len); + if (!MultiByteToWideChar(CP_UTF8, + 0, + buf.base, + buf.len, + utf16_buffer, + utf16_buf_used)) { + if (allocate) + uv__free(utf16_buffer); + *error = GetLastError(); + break; + } + + FLUSH_TEXT(); + + continue; + } + + for (j = 0; j < buf.len; j++) { + unsigned char c = buf.base[j]; + + /* Run the character through the utf8 decoder We happily accept non */ + /* shortest form encodings and invalid code points - there's no real */ + /* harm that can be done. */ + if (utf8_bytes_left == 0) { + /* Read utf-8 start byte */ + DWORD first_zero_bit; + unsigned char not_c = ~c; +#ifdef _MSC_VER /* msvc */ + if (_BitScanReverse(&first_zero_bit, not_c)) { +#else /* assume gcc */ + if (c != 0) { + first_zero_bit = (sizeof(int) * 8) - 1 - __builtin_clz(not_c); +#endif + if (first_zero_bit == 7) { + /* Ascii - pass right through */ + utf8_codepoint = (unsigned int) c; + + } else if (first_zero_bit <= 5) { + /* Multibyte sequence */ + utf8_codepoint = (0xff >> (8 - first_zero_bit)) & c; + utf8_bytes_left = (char) (6 - first_zero_bit); + + } else { + /* Invalid continuation */ + utf8_codepoint = UNICODE_REPLACEMENT_CHARACTER; + } + + } else { + /* 0xff -- invalid */ + utf8_codepoint = UNICODE_REPLACEMENT_CHARACTER; + } + + } else if ((c & 0xc0) == 0x80) { + /* Valid continuation of utf-8 multibyte sequence */ + utf8_bytes_left--; + utf8_codepoint <<= 6; + utf8_codepoint |= ((unsigned int) c & 0x3f); + + } else { + /* Start byte where continuation was expected. */ + utf8_bytes_left = 0; + utf8_codepoint = UNICODE_REPLACEMENT_CHARACTER; + /* Patch buf offset so this character will be parsed again as a */ + /* start byte. */ + j--; + } + + /* Maybe we need to parse more bytes to find a character. */ + if (utf8_bytes_left != 0) { + continue; + } + + /* Parse vt100/ansi escape codes */ + if (ansi_parser_state == ANSI_NORMAL) { + switch (utf8_codepoint) { + case '\033': + ansi_parser_state = ANSI_ESCAPE_SEEN; + continue; + + case 0233: + ansi_parser_state = ANSI_CSI; + handle->tty.wr.ansi_csi_argc = 0; + continue; + } + + } else if (ansi_parser_state == ANSI_ESCAPE_SEEN) { + switch (utf8_codepoint) { + case '[': + ansi_parser_state = ANSI_CSI; + handle->tty.wr.ansi_csi_argc = 0; + continue; + + case '^': + case '_': + case 'P': + case ']': + /* Not supported, but we'll have to parse until we see a stop */ + /* code, e.g. ESC \ or BEL. */ + ansi_parser_state = ANSI_ST_CONTROL; + continue; + + case '\033': + /* Ignore double escape. */ + continue; + + case 'c': + /* Full console reset. */ + FLUSH_TEXT(); + uv_tty_reset(handle, error); + ansi_parser_state = ANSI_NORMAL; + continue; + + case '7': + /* Save the cursor position and text attributes. */ + FLUSH_TEXT(); + uv_tty_save_state(handle, 1, error); + ansi_parser_state = ANSI_NORMAL; + continue; + + case '8': + /* Restore the cursor position and text attributes */ + FLUSH_TEXT(); + uv_tty_restore_state(handle, 1, error); + ansi_parser_state = ANSI_NORMAL; + continue; + + default: + if (utf8_codepoint >= '@' && utf8_codepoint <= '_') { + /* Single-char control. */ + ansi_parser_state = ANSI_NORMAL; + continue; + } else { + /* Invalid - proceed as normal, */ + ansi_parser_state = ANSI_NORMAL; + } + } + + } else if (ansi_parser_state & ANSI_CSI) { + if (!(ansi_parser_state & ANSI_IGNORE)) { + if (utf8_codepoint >= '0' && utf8_codepoint <= '9') { + /* Parsing a numerical argument */ + + if (!(ansi_parser_state & ANSI_IN_ARG)) { + /* We were not currently parsing a number */ + + /* Check for too many arguments */ + if (handle->tty.wr.ansi_csi_argc >= ARRAY_SIZE(handle->tty.wr.ansi_csi_argv)) { + ansi_parser_state |= ANSI_IGNORE; + continue; + } + + ansi_parser_state |= ANSI_IN_ARG; + handle->tty.wr.ansi_csi_argc++; + handle->tty.wr.ansi_csi_argv[handle->tty.wr.ansi_csi_argc - 1] = + (unsigned short) utf8_codepoint - '0'; + continue; + } else { + /* We were already parsing a number. Parse next digit. */ + uint32_t value = 10 * + handle->tty.wr.ansi_csi_argv[handle->tty.wr.ansi_csi_argc - 1]; + + /* Check for overflow. */ + if (value > UINT16_MAX) { + ansi_parser_state |= ANSI_IGNORE; + continue; + } + + handle->tty.wr.ansi_csi_argv[handle->tty.wr.ansi_csi_argc - 1] = + (unsigned short) value + (utf8_codepoint - '0'); + continue; + } + + } else if (utf8_codepoint == ';') { + /* Denotes the end of an argument. */ + if (ansi_parser_state & ANSI_IN_ARG) { + ansi_parser_state &= ~ANSI_IN_ARG; + continue; + + } else { + /* If ANSI_IN_ARG is not set, add another argument and */ + /* default it to 0. */ + /* Check for too many arguments */ + if (handle->tty.wr.ansi_csi_argc >= ARRAY_SIZE(handle->tty.wr.ansi_csi_argv)) { + ansi_parser_state |= ANSI_IGNORE; + continue; + } + + handle->tty.wr.ansi_csi_argc++; + handle->tty.wr.ansi_csi_argv[handle->tty.wr.ansi_csi_argc - 1] = 0; + continue; + } + + } else if (utf8_codepoint == '?' && !(ansi_parser_state & ANSI_IN_ARG) && + handle->tty.wr.ansi_csi_argc == 0) { + /* Ignores '?' if it is the first character after CSI[ */ + /* This is an extension character from the VT100 codeset */ + /* that is supported and used by most ANSI terminals today. */ + continue; + + } else if (utf8_codepoint >= '@' && utf8_codepoint <= '~' && + (handle->tty.wr.ansi_csi_argc > 0 || utf8_codepoint != '[')) { + int x, y, d; + + /* Command byte */ + switch (utf8_codepoint) { + case 'A': + /* cursor up */ + FLUSH_TEXT(); + y = -(handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 1); + uv_tty_move_caret(handle, 0, 1, y, 1, error); + break; + + case 'B': + /* cursor down */ + FLUSH_TEXT(); + y = handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 1; + uv_tty_move_caret(handle, 0, 1, y, 1, error); + break; + + case 'C': + /* cursor forward */ + FLUSH_TEXT(); + x = handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 1; + uv_tty_move_caret(handle, x, 1, 0, 1, error); + break; + + case 'D': + /* cursor back */ + FLUSH_TEXT(); + x = -(handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 1); + uv_tty_move_caret(handle, x, 1, 0, 1, error); + break; + + case 'E': + /* cursor next line */ + FLUSH_TEXT(); + y = handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 1; + uv_tty_move_caret(handle, 0, 0, y, 1, error); + break; + + case 'F': + /* cursor previous line */ + FLUSH_TEXT(); + y = -(handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 1); + uv_tty_move_caret(handle, 0, 0, y, 1, error); + break; + + case 'G': + /* cursor horizontal move absolute */ + FLUSH_TEXT(); + x = (handle->tty.wr.ansi_csi_argc >= 1 && handle->tty.wr.ansi_csi_argv[0]) + ? handle->tty.wr.ansi_csi_argv[0] - 1 : 0; + uv_tty_move_caret(handle, x, 0, 0, 1, error); + break; + + case 'H': + case 'f': + /* cursor move absolute */ + FLUSH_TEXT(); + y = (handle->tty.wr.ansi_csi_argc >= 1 && handle->tty.wr.ansi_csi_argv[0]) + ? handle->tty.wr.ansi_csi_argv[0] - 1 : 0; + x = (handle->tty.wr.ansi_csi_argc >= 2 && handle->tty.wr.ansi_csi_argv[1]) + ? handle->tty.wr.ansi_csi_argv[1] - 1 : 0; + uv_tty_move_caret(handle, x, 0, y, 0, error); + break; + + case 'J': + /* Erase screen */ + FLUSH_TEXT(); + d = handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 0; + if (d >= 0 && d <= 2) { + uv_tty_clear(handle, d, 1, error); + } + break; + + case 'K': + /* Erase line */ + FLUSH_TEXT(); + d = handle->tty.wr.ansi_csi_argc ? handle->tty.wr.ansi_csi_argv[0] : 0; + if (d >= 0 && d <= 2) { + uv_tty_clear(handle, d, 0, error); + } + break; + + case 'm': + /* Set style */ + FLUSH_TEXT(); + uv_tty_set_style(handle, error); + break; + + case 's': + /* Save the cursor position. */ + FLUSH_TEXT(); + uv_tty_save_state(handle, 0, error); + break; + + case 'u': + /* Restore the cursor position */ + FLUSH_TEXT(); + uv_tty_restore_state(handle, 0, error); + break; + + case 'l': + /* Hide the cursor */ + if (handle->tty.wr.ansi_csi_argc == 1 && + handle->tty.wr.ansi_csi_argv[0] == 25) { + FLUSH_TEXT(); + uv_tty_set_cursor_visibility(handle, 0, error); + } + break; + + case 'h': + /* Show the cursor */ + if (handle->tty.wr.ansi_csi_argc == 1 && + handle->tty.wr.ansi_csi_argv[0] == 25) { + FLUSH_TEXT(); + uv_tty_set_cursor_visibility(handle, 1, error); + } + break; + } + + /* Sequence ended - go back to normal state. */ + ansi_parser_state = ANSI_NORMAL; + continue; + + } else { + /* We don't support commands that use private mode characters or */ + /* intermediaries. Ignore the rest of the sequence. */ + ansi_parser_state |= ANSI_IGNORE; + continue; + } + } else { + /* We're ignoring this command. Stop only on command character. */ + if (utf8_codepoint >= '@' && utf8_codepoint <= '~') { + ansi_parser_state = ANSI_NORMAL; + } + continue; + } + + } else if (ansi_parser_state & ANSI_ST_CONTROL) { + /* Unsupported control code */ + /* Ignore everything until we see BEL or ESC \ */ + if (ansi_parser_state & ANSI_IN_STRING) { + if (!(ansi_parser_state & ANSI_BACKSLASH_SEEN)) { + if (utf8_codepoint == '"') { + ansi_parser_state &= ~ANSI_IN_STRING; + } else if (utf8_codepoint == '\\') { + ansi_parser_state |= ANSI_BACKSLASH_SEEN; + } + } else { + ansi_parser_state &= ~ANSI_BACKSLASH_SEEN; + } + } else { + if (utf8_codepoint == '\007' || (utf8_codepoint == '\\' && + (ansi_parser_state & ANSI_ESCAPE_SEEN))) { + /* End of sequence */ + ansi_parser_state = ANSI_NORMAL; + } else if (utf8_codepoint == '\033') { + /* Escape character */ + ansi_parser_state |= ANSI_ESCAPE_SEEN; + } else if (utf8_codepoint == '"') { + /* String starting */ + ansi_parser_state |= ANSI_IN_STRING; + ansi_parser_state &= ~ANSI_ESCAPE_SEEN; + ansi_parser_state &= ~ANSI_BACKSLASH_SEEN; + } else { + ansi_parser_state &= ~ANSI_ESCAPE_SEEN; + } + } + continue; + } else { + /* Inconsistent state */ + abort(); + } + + /* We wouldn't mind emitting utf-16 surrogate pairs. Too bad, the */ + /* windows console doesn't really support UTF-16, so just emit the */ + /* replacement character. */ + if (utf8_codepoint > 0xffff) { + utf8_codepoint = UNICODE_REPLACEMENT_CHARACTER; + } + + if (utf8_codepoint == 0x0a || utf8_codepoint == 0x0d) { + /* EOL conversion - emit \r\n when we see \n. */ + + if (utf8_codepoint == 0x0a && previous_eol != 0x0d) { + /* \n was not preceded by \r; print \r\n. */ + ENSURE_BUFFER_SPACE(2); + utf16_buf[utf16_buf_used++] = L'\r'; + utf16_buf[utf16_buf_used++] = L'\n'; + } else if (utf8_codepoint == 0x0d && previous_eol == 0x0a) { + /* \n was followed by \r; do not print the \r, since */ + /* the source was either \r\n\r (so the second \r is */ + /* redundant) or was \n\r (so the \n was processed */ + /* by the last case and an \r automatically inserted). */ + } else { + /* \r without \n; print \r as-is. */ + ENSURE_BUFFER_SPACE(1); + utf16_buf[utf16_buf_used++] = (WCHAR) utf8_codepoint; + } + + previous_eol = (char) utf8_codepoint; + + } else if (utf8_codepoint <= 0xffff) { + /* Encode character into utf-16 buffer. */ + ENSURE_BUFFER_SPACE(1); + utf16_buf[utf16_buf_used++] = (WCHAR) utf8_codepoint; + previous_eol = 0; + } + } + } + + /* Flush remaining characters */ + FLUSH_TEXT(); + + /* Copy cached values back to struct. */ + handle->tty.wr.utf8_bytes_left = utf8_bytes_left; + handle->tty.wr.utf8_codepoint = utf8_codepoint; + handle->tty.wr.previous_eol = previous_eol; + handle->tty.wr.ansi_parser_state = ansi_parser_state; + + uv_sem_post(&uv_tty_output_lock); + + if (*error == STATUS_SUCCESS) { + return 0; + } else { + return -1; + } + +#undef FLUSH_TEXT +} + + +int uv_tty_write(uv_loop_t* loop, + uv_write_t* req, + uv_tty_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_write_cb cb) { + DWORD error; + + UV_REQ_INIT(req, UV_WRITE); + req->handle = (uv_stream_t*) handle; + req->cb = cb; + + handle->reqs_pending++; + handle->stream.conn.write_reqs_pending++; + REGISTER_HANDLE_REQ(loop, handle, req); + + req->u.io.queued_bytes = 0; + + if (!uv_tty_write_bufs(handle, bufs, nbufs, &error)) { + SET_REQ_SUCCESS(req); + } else { + SET_REQ_ERROR(req, error); + } + + uv_insert_pending_req(loop, (uv_req_t*) req); + + return 0; +} + + +int uv__tty_try_write(uv_tty_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs) { + DWORD error; + + if (handle->stream.conn.write_reqs_pending > 0) + return UV_EAGAIN; + + if (uv_tty_write_bufs(handle, bufs, nbufs, &error)) + return uv_translate_sys_error(error); + + return uv__count_bufs(bufs, nbufs); +} + + +void uv_process_tty_write_req(uv_loop_t* loop, uv_tty_t* handle, + uv_write_t* req) { + int err; + + handle->write_queue_size -= req->u.io.queued_bytes; + UNREGISTER_HANDLE_REQ(loop, handle, req); + + if (req->cb) { + err = GET_REQ_ERROR(req); + req->cb(req, uv_translate_sys_error(err)); + } + + handle->stream.conn.write_reqs_pending--; + if (handle->stream.conn.shutdown_req != NULL && + handle->stream.conn.write_reqs_pending == 0) { + uv_want_endgame(loop, (uv_handle_t*)handle); + } + + DECREASE_PENDING_REQ_COUNT(handle); +} + + +void uv_tty_close(uv_tty_t* handle) { + assert(handle->u.fd == -1 || handle->u.fd > 2); + if (handle->u.fd == -1) + CloseHandle(handle->handle); + else + close(handle->u.fd); + + if (handle->flags & UV_HANDLE_READING) + uv_tty_read_stop(handle); + + handle->u.fd = -1; + handle->handle = INVALID_HANDLE_VALUE; + handle->flags &= ~(UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); + uv__handle_closing(handle); + + if (handle->reqs_pending == 0) { + uv_want_endgame(handle->loop, (uv_handle_t*) handle); + } +} + + +void uv_tty_endgame(uv_loop_t* loop, uv_tty_t* handle) { + if (!(handle->flags & UV_HANDLE_TTY_READABLE) && + handle->stream.conn.shutdown_req != NULL && + handle->stream.conn.write_reqs_pending == 0) { + UNREGISTER_HANDLE_REQ(loop, handle, handle->stream.conn.shutdown_req); + + /* TTY shutdown is really just a no-op */ + if (handle->stream.conn.shutdown_req->cb) { + if (handle->flags & UV__HANDLE_CLOSING) { + handle->stream.conn.shutdown_req->cb(handle->stream.conn.shutdown_req, UV_ECANCELED); + } else { + handle->stream.conn.shutdown_req->cb(handle->stream.conn.shutdown_req, 0); + } + } + + handle->stream.conn.shutdown_req = NULL; + + DECREASE_PENDING_REQ_COUNT(handle); + return; + } + + if (handle->flags & UV__HANDLE_CLOSING && + handle->reqs_pending == 0) { + /* The wait handle used for raw reading should be unregistered when the */ + /* wait callback runs. */ + assert(!(handle->flags & UV_HANDLE_TTY_READABLE) || + handle->tty.rd.read_raw_wait == NULL); + + assert(!(handle->flags & UV_HANDLE_CLOSED)); + uv__handle_close(handle); + } +} + + +/* TODO: remove me */ +void uv_process_tty_accept_req(uv_loop_t* loop, uv_tty_t* handle, + uv_req_t* raw_req) { + abort(); +} + + +/* TODO: remove me */ +void uv_process_tty_connect_req(uv_loop_t* loop, uv_tty_t* handle, + uv_connect_t* req) { + abort(); +} + + +int uv_tty_reset_mode(void) { + /* Not necessary to do anything. */ + return 0; +} + +/* Determine whether or not this version of windows supports + * proper ANSI color codes. Should be supported as of windows + * 10 version 1511, build number 10.0.10586. + */ +static void uv__determine_vterm_state(HANDLE handle) { + DWORD dwMode = 0; + + if (!GetConsoleMode(handle, &dwMode)) { + uv__vterm_state = UV_UNSUPPORTED; + return; + } + + dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + if (!SetConsoleMode(handle, dwMode)) { + uv__vterm_state = UV_UNSUPPORTED; + return; + } + + uv__vterm_state = UV_SUPPORTED; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/udp.c b/lib/ESPiLight/pilight/libs/libuv/win/udp.c new file mode 100644 index 0000000..2fd15cf --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/udp.c @@ -0,0 +1,926 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include + +#include "uv.h" +#include "internal.h" +#include "handle-inl.h" +#include "stream-inl.h" +#include "req-inl.h" + + +/* + * Threshold of active udp streams for which to preallocate udp read buffers. + */ +const unsigned int uv_active_udp_streams_threshold = 0; + +/* A zero-size buffer for use by uv_udp_read */ +static char uv_zero_[] = ""; + +int uv_udp_getsockname(const uv_udp_t* handle, + struct sockaddr* name, + int* namelen) { + int result; + + if (handle->socket == INVALID_SOCKET) { + return UV_EINVAL; + } + + result = getsockname(handle->socket, name, namelen); + if (result != 0) { + return uv_translate_sys_error(WSAGetLastError()); + } + + return 0; +} + + +static int uv_udp_set_socket(uv_loop_t* loop, uv_udp_t* handle, SOCKET socket, + int family) { + DWORD yes = 1; + WSAPROTOCOL_INFOW info; + int opt_len; + + if (handle->socket != INVALID_SOCKET) + return UV_EBUSY; + + /* Set the socket to nonblocking mode */ + if (ioctlsocket(socket, FIONBIO, &yes) == SOCKET_ERROR) { + return WSAGetLastError(); + } + + /* Make the socket non-inheritable */ + if (!SetHandleInformation((HANDLE)socket, HANDLE_FLAG_INHERIT, 0)) { + return GetLastError(); + } + + /* Associate it with the I/O completion port. */ + /* Use uv_handle_t pointer as completion key. */ + if (CreateIoCompletionPort((HANDLE)socket, + loop->iocp, + (ULONG_PTR)socket, + 0) == NULL) { + return GetLastError(); + } + + if (pSetFileCompletionNotificationModes) { + /* All known Windows that support SetFileCompletionNotificationModes */ + /* have a bug that makes it impossible to use this function in */ + /* conjunction with datagram sockets. We can work around that but only */ + /* if the user is using the default UDP driver (AFD) and has no other */ + /* LSPs stacked on top. Here we check whether that is the case. */ + opt_len = (int) sizeof info; + if (getsockopt(socket, + SOL_SOCKET, + SO_PROTOCOL_INFOW, + (char*) &info, + &opt_len) == SOCKET_ERROR) { + return GetLastError(); + } + + if (info.ProtocolChain.ChainLen == 1) { + if (pSetFileCompletionNotificationModes((HANDLE)socket, + FILE_SKIP_SET_EVENT_ON_HANDLE | + FILE_SKIP_COMPLETION_PORT_ON_SUCCESS)) { + handle->flags |= UV_HANDLE_SYNC_BYPASS_IOCP; + handle->func_wsarecv = uv_wsarecv_workaround; + handle->func_wsarecvfrom = uv_wsarecvfrom_workaround; + } else if (GetLastError() != ERROR_INVALID_FUNCTION) { + return GetLastError(); + } + } + } + + handle->socket = socket; + + if (family == AF_INET6) { + handle->flags |= UV_HANDLE_IPV6; + } else { + assert(!(handle->flags & UV_HANDLE_IPV6)); + } + + return 0; +} + + +int uv_udp_init_ex(uv_loop_t* loop, uv_udp_t* handle, unsigned int flags) { + int domain; + + /* Use the lower 8 bits for the domain */ + domain = flags & 0xFF; + if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC) + return UV_EINVAL; + + if (flags & ~0xFF) + return UV_EINVAL; + + uv__handle_init(loop, (uv_handle_t*) handle, UV_UDP); + handle->socket = INVALID_SOCKET; + handle->reqs_pending = 0; + handle->activecnt = 0; + handle->func_wsarecv = WSARecv; + handle->func_wsarecvfrom = WSARecvFrom; + handle->send_queue_size = 0; + handle->send_queue_count = 0; + UV_REQ_INIT(&handle->recv_req, UV_UDP_RECV); + handle->recv_req.data = handle; + + /* If anything fails beyond this point we need to remove the handle from + * the handle queue, since it was added by uv__handle_init. + */ + + if (domain != AF_UNSPEC) { + SOCKET sock; + DWORD err; + + sock = socket(domain, SOCK_DGRAM, 0); + if (sock == INVALID_SOCKET) { + err = WSAGetLastError(); + QUEUE_REMOVE(&handle->handle_queue); + return uv_translate_sys_error(err); + } + + err = uv_udp_set_socket(handle->loop, handle, sock, domain); + if (err) { + closesocket(sock); + QUEUE_REMOVE(&handle->handle_queue); + return uv_translate_sys_error(err); + } + } + + return 0; +} + + +int uv_udp_init(uv_loop_t* loop, uv_udp_t* handle) { + return uv_udp_init_ex(loop, handle, AF_UNSPEC); +} + + +void uv_udp_close(uv_loop_t* loop, uv_udp_t* handle) { + uv_udp_recv_stop(handle); + closesocket(handle->socket); + handle->socket = INVALID_SOCKET; + + uv__handle_closing(handle); + + if (handle->reqs_pending == 0) { + uv_want_endgame(loop, (uv_handle_t*) handle); + } +} + + +void uv_udp_endgame(uv_loop_t* loop, uv_udp_t* handle) { + if (handle->flags & UV__HANDLE_CLOSING && + handle->reqs_pending == 0) { + assert(!(handle->flags & UV_HANDLE_CLOSED)); + uv__handle_close(handle); + } +} + + +static int uv_udp_maybe_bind(uv_udp_t* handle, + const struct sockaddr* addr, + unsigned int addrlen, + unsigned int flags) { + int r; + int err; + DWORD no = 0; + + if (handle->flags & UV_HANDLE_BOUND) + return 0; + + if ((flags & UV_UDP_IPV6ONLY) && addr->sa_family != AF_INET6) { + /* UV_UDP_IPV6ONLY is supported only for IPV6 sockets */ + return ERROR_INVALID_PARAMETER; + } + + if (handle->socket == INVALID_SOCKET) { + SOCKET sock = socket(addr->sa_family, SOCK_DGRAM, 0); + if (sock == INVALID_SOCKET) { + return WSAGetLastError(); + } + + err = uv_udp_set_socket(handle->loop, handle, sock, addr->sa_family); + if (err) { + closesocket(sock); + return err; + } + } + + if (flags & UV_UDP_REUSEADDR) { + DWORD yes = 1; + /* Set SO_REUSEADDR on the socket. */ + if (setsockopt(handle->socket, + SOL_SOCKET, + SO_REUSEADDR, + (char*) &yes, + sizeof yes) == SOCKET_ERROR) { + err = WSAGetLastError(); + return err; + } + } + + if (addr->sa_family == AF_INET6) + handle->flags |= UV_HANDLE_IPV6; + + if (addr->sa_family == AF_INET6 && !(flags & UV_UDP_IPV6ONLY)) { + /* On windows IPV6ONLY is on by default. */ + /* If the user doesn't specify it libuv turns it off. */ + + /* TODO: how to handle errors? This may fail if there is no ipv4 stack */ + /* available, or when run on XP/2003 which have no support for dualstack */ + /* sockets. For now we're silently ignoring the error. */ + setsockopt(handle->socket, + IPPROTO_IPV6, + IPV6_V6ONLY, + (char*) &no, + sizeof no); + } + + r = bind(handle->socket, addr, addrlen); + if (r == SOCKET_ERROR) { + return WSAGetLastError(); + } + + handle->flags |= UV_HANDLE_BOUND; + + return 0; +} + + +static void uv_udp_queue_recv(uv_loop_t* loop, uv_udp_t* handle) { + uv_req_t* req; + uv_buf_t buf; + DWORD bytes, flags; + int result; + + assert(handle->flags & UV_HANDLE_READING); + assert(!(handle->flags & UV_HANDLE_READ_PENDING)); + + req = &handle->recv_req; + memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); + + /* + * Preallocate a read buffer if the number of active streams is below + * the threshold. + */ + if (loop->active_udp_streams < uv_active_udp_streams_threshold) { + handle->flags &= ~UV_HANDLE_ZERO_READ; + + handle->recv_buffer = uv_buf_init(NULL, 0); + handle->alloc_cb((uv_handle_t*) handle, 65536, &handle->recv_buffer); + if (handle->recv_buffer.base == NULL || handle->recv_buffer.len == 0) { + handle->recv_cb(handle, UV_ENOBUFS, &handle->recv_buffer, NULL, 0); + return; + } + assert(handle->recv_buffer.base != NULL); + + buf = handle->recv_buffer; + memset(&handle->recv_from, 0, sizeof handle->recv_from); + handle->recv_from_len = sizeof handle->recv_from; + flags = 0; + + result = handle->func_wsarecvfrom(handle->socket, + (WSABUF*) &buf, + 1, + &bytes, + &flags, + (struct sockaddr*) &handle->recv_from, + &handle->recv_from_len, + &req->u.io.overlapped, + NULL); + + if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { + /* Process the req without IOCP. */ + handle->flags |= UV_HANDLE_READ_PENDING; + req->u.io.overlapped.InternalHigh = bytes; + handle->reqs_pending++; + uv_insert_pending_req(loop, req); + } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { + /* The req will be processed with IOCP. */ + handle->flags |= UV_HANDLE_READ_PENDING; + handle->reqs_pending++; + } else { + /* Make this req pending reporting an error. */ + SET_REQ_ERROR(req, WSAGetLastError()); + uv_insert_pending_req(loop, req); + handle->reqs_pending++; + } + + } else { + handle->flags |= UV_HANDLE_ZERO_READ; + + buf.base = (char*) uv_zero_; + buf.len = 0; + flags = MSG_PEEK; + + result = handle->func_wsarecv(handle->socket, + (WSABUF*) &buf, + 1, + &bytes, + &flags, + &req->u.io.overlapped, + NULL); + + if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { + /* Process the req without IOCP. */ + handle->flags |= UV_HANDLE_READ_PENDING; + req->u.io.overlapped.InternalHigh = bytes; + handle->reqs_pending++; + uv_insert_pending_req(loop, req); + } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { + /* The req will be processed with IOCP. */ + handle->flags |= UV_HANDLE_READ_PENDING; + handle->reqs_pending++; + } else { + /* Make this req pending reporting an error. */ + SET_REQ_ERROR(req, WSAGetLastError()); + uv_insert_pending_req(loop, req); + handle->reqs_pending++; + } + } +} + + +int uv__udp_recv_start(uv_udp_t* handle, uv_alloc_cb alloc_cb, + uv_udp_recv_cb recv_cb) { + uv_loop_t* loop = handle->loop; + int err; + + if (handle->flags & UV_HANDLE_READING) { + return WSAEALREADY; + } + + err = uv_udp_maybe_bind(handle, + (const struct sockaddr*) &uv_addr_ip4_any_, + sizeof(uv_addr_ip4_any_), + 0); + if (err) + return err; + + handle->flags |= UV_HANDLE_READING; + INCREASE_ACTIVE_COUNT(loop, handle); + loop->active_udp_streams++; + + handle->recv_cb = recv_cb; + handle->alloc_cb = alloc_cb; + + /* If reading was stopped and then started again, there could still be a */ + /* recv request pending. */ + if (!(handle->flags & UV_HANDLE_READ_PENDING)) + uv_udp_queue_recv(loop, handle); + + return 0; +} + + +int uv__udp_recv_stop(uv_udp_t* handle) { + if (handle->flags & UV_HANDLE_READING) { + handle->flags &= ~UV_HANDLE_READING; + handle->loop->active_udp_streams--; + DECREASE_ACTIVE_COUNT(loop, handle); + } + + return 0; +} + + +static int uv__send(uv_udp_send_t* req, + uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr, + unsigned int addrlen, + uv_udp_send_cb cb) { + uv_loop_t* loop = handle->loop; + DWORD result, bytes; + + UV_REQ_INIT(req, UV_UDP_SEND); + req->handle = handle; + req->cb = cb; + memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); + + result = WSASendTo(handle->socket, + (WSABUF*)bufs, + nbufs, + &bytes, + 0, + addr, + addrlen, + &req->u.io.overlapped, + NULL); + + if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { + /* Request completed immediately. */ + req->u.io.queued_bytes = 0; + handle->reqs_pending++; + handle->send_queue_size += req->u.io.queued_bytes; + handle->send_queue_count++; + REGISTER_HANDLE_REQ(loop, handle, req); + uv_insert_pending_req(loop, (uv_req_t*)req); + } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { + /* Request queued by the kernel. */ + req->u.io.queued_bytes = uv__count_bufs(bufs, nbufs); + handle->reqs_pending++; + handle->send_queue_size += req->u.io.queued_bytes; + handle->send_queue_count++; + REGISTER_HANDLE_REQ(loop, handle, req); + } else { + /* Send failed due to an error. */ + return WSAGetLastError(); + } + + return 0; +} + + +void uv_process_udp_recv_req(uv_loop_t* loop, uv_udp_t* handle, + uv_req_t* req) { + uv_buf_t buf; + int partial; + + assert(handle->type == UV_UDP); + + handle->flags &= ~UV_HANDLE_READ_PENDING; + + if (!REQ_SUCCESS(req)) { + DWORD err = GET_REQ_SOCK_ERROR(req); + if (err == WSAEMSGSIZE) { + /* Not a real error, it just indicates that the received packet */ + /* was bigger than the receive buffer. */ + } else if (err == WSAECONNRESET || err == WSAENETRESET) { + /* A previous sendto operation failed; ignore this error. If */ + /* zero-reading we need to call WSARecv/WSARecvFrom _without_ the */ + /* MSG_PEEK flag to clear out the error queue. For nonzero reads, */ + /* immediately queue a new receive. */ + if (!(handle->flags & UV_HANDLE_ZERO_READ)) { + goto done; + } + } else { + /* A real error occurred. Report the error to the user only if we're */ + /* currently reading. */ + if (handle->flags & UV_HANDLE_READING) { + uv_udp_recv_stop(handle); + buf = (handle->flags & UV_HANDLE_ZERO_READ) ? + uv_buf_init(NULL, 0) : handle->recv_buffer; + handle->recv_cb(handle, uv_translate_sys_error(err), &buf, NULL, 0); + } + goto done; + } + } + + if (!(handle->flags & UV_HANDLE_ZERO_READ)) { + /* Successful read */ + partial = !REQ_SUCCESS(req); + handle->recv_cb(handle, + req->u.io.overlapped.InternalHigh, + &handle->recv_buffer, + (const struct sockaddr*) &handle->recv_from, + partial ? UV_UDP_PARTIAL : 0); + } else if (handle->flags & UV_HANDLE_READING) { + DWORD bytes, err, flags; + struct sockaddr_storage from; + int from_len; + + /* Do a nonblocking receive */ + /* TODO: try to read multiple datagrams at once. FIONREAD maybe? */ + buf = uv_buf_init(NULL, 0); + handle->alloc_cb((uv_handle_t*) handle, 65536, &buf); + if (buf.base == NULL || buf.len == 0) { + handle->recv_cb(handle, UV_ENOBUFS, &buf, NULL, 0); + goto done; + } + assert(buf.base != NULL); + + memset(&from, 0, sizeof from); + from_len = sizeof from; + + flags = 0; + + if (WSARecvFrom(handle->socket, + (WSABUF*)&buf, + 1, + &bytes, + &flags, + (struct sockaddr*) &from, + &from_len, + NULL, + NULL) != SOCKET_ERROR) { + + /* Message received */ + handle->recv_cb(handle, bytes, &buf, (const struct sockaddr*) &from, 0); + } else { + err = WSAGetLastError(); + if (err == WSAEMSGSIZE) { + /* Message truncated */ + handle->recv_cb(handle, + bytes, + &buf, + (const struct sockaddr*) &from, + UV_UDP_PARTIAL); + } else if (err == WSAEWOULDBLOCK) { + /* Kernel buffer empty */ + handle->recv_cb(handle, 0, &buf, NULL, 0); + } else if (err == WSAECONNRESET || err == WSAENETRESET) { + /* WSAECONNRESET/WSANETRESET is ignored because this just indicates + * that a previous sendto operation failed. + */ + handle->recv_cb(handle, 0, &buf, NULL, 0); + } else { + /* Any other error that we want to report back to the user. */ + uv_udp_recv_stop(handle); + handle->recv_cb(handle, uv_translate_sys_error(err), &buf, NULL, 0); + } + } + } + +done: + /* Post another read if still reading and not closing. */ + if ((handle->flags & UV_HANDLE_READING) && + !(handle->flags & UV_HANDLE_READ_PENDING)) { + uv_udp_queue_recv(loop, handle); + } + + DECREASE_PENDING_REQ_COUNT(handle); +} + + +void uv_process_udp_send_req(uv_loop_t* loop, uv_udp_t* handle, + uv_udp_send_t* req) { + int err; + + assert(handle->type == UV_UDP); + + assert(handle->send_queue_size >= req->u.io.queued_bytes); + assert(handle->send_queue_count >= 1); + handle->send_queue_size -= req->u.io.queued_bytes; + handle->send_queue_count--; + + UNREGISTER_HANDLE_REQ(loop, handle, req); + + if (req->cb) { + err = 0; + if (!REQ_SUCCESS(req)) { + err = GET_REQ_SOCK_ERROR(req); + } + req->cb(req, uv_translate_sys_error(err)); + } + + DECREASE_PENDING_REQ_COUNT(handle); +} + + +static int uv__udp_set_membership4(uv_udp_t* handle, + const struct sockaddr_in* multicast_addr, + const char* interface_addr, + uv_membership membership) { + int err; + int optname; + struct ip_mreq mreq; + + if (handle->flags & UV_HANDLE_IPV6) + return UV_EINVAL; + + /* If the socket is unbound, bind to inaddr_any. */ + err = uv_udp_maybe_bind(handle, + (const struct sockaddr*) &uv_addr_ip4_any_, + sizeof(uv_addr_ip4_any_), + UV_UDP_REUSEADDR); + if (err) + return uv_translate_sys_error(err); + + memset(&mreq, 0, sizeof mreq); + + if (interface_addr) { + err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr); + if (err) + return err; + } else { + mreq.imr_interface.s_addr = htonl(INADDR_ANY); + } + + mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr; + + switch (membership) { + case UV_JOIN_GROUP: + optname = IP_ADD_MEMBERSHIP; + break; + case UV_LEAVE_GROUP: + optname = IP_DROP_MEMBERSHIP; + break; + default: + return UV_EINVAL; + } + + if (setsockopt(handle->socket, + IPPROTO_IP, + optname, + (char*) &mreq, + sizeof mreq) == SOCKET_ERROR) { + return uv_translate_sys_error(WSAGetLastError()); + } + + return 0; +} + + +int uv__udp_set_membership6(uv_udp_t* handle, + const struct sockaddr_in6* multicast_addr, + const char* interface_addr, + uv_membership membership) { + int optname; + int err; + struct ipv6_mreq mreq; + struct sockaddr_in6 addr6; + + if ((handle->flags & UV_HANDLE_BOUND) && !(handle->flags & UV_HANDLE_IPV6)) + return UV_EINVAL; + + err = uv_udp_maybe_bind(handle, + (const struct sockaddr*) &uv_addr_ip6_any_, + sizeof(uv_addr_ip6_any_), + UV_UDP_REUSEADDR); + + if (err) + return uv_translate_sys_error(err); + + memset(&mreq, 0, sizeof(mreq)); + + if (interface_addr) { + if (uv_ip6_addr(interface_addr, 0, &addr6)) + return UV_EINVAL; + mreq.ipv6mr_interface = addr6.sin6_scope_id; + } else { + mreq.ipv6mr_interface = 0; + } + + mreq.ipv6mr_multiaddr = multicast_addr->sin6_addr; + + switch (membership) { + case UV_JOIN_GROUP: + optname = IPV6_ADD_MEMBERSHIP; + break; + case UV_LEAVE_GROUP: + optname = IPV6_DROP_MEMBERSHIP; + break; + default: + return UV_EINVAL; + } + + if (setsockopt(handle->socket, + IPPROTO_IPV6, + optname, + (char*) &mreq, + sizeof mreq) == SOCKET_ERROR) { + return uv_translate_sys_error(WSAGetLastError()); + } + + return 0; +} + + +int uv_udp_set_membership(uv_udp_t* handle, + const char* multicast_addr, + const char* interface_addr, + uv_membership membership) { + struct sockaddr_in addr4; + struct sockaddr_in6 addr6; + + if (uv_ip4_addr(multicast_addr, 0, &addr4) == 0) + return uv__udp_set_membership4(handle, &addr4, interface_addr, membership); + else if (uv_ip6_addr(multicast_addr, 0, &addr6) == 0) + return uv__udp_set_membership6(handle, &addr6, interface_addr, membership); + else + return UV_EINVAL; +} + + +int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr) { + struct sockaddr_storage addr_st; + struct sockaddr_in* addr4; + struct sockaddr_in6* addr6; + + addr4 = (struct sockaddr_in*) &addr_st; + addr6 = (struct sockaddr_in6*) &addr_st; + + if (!interface_addr) { + memset(&addr_st, 0, sizeof addr_st); + if (handle->flags & UV_HANDLE_IPV6) { + addr_st.ss_family = AF_INET6; + addr6->sin6_scope_id = 0; + } else { + addr_st.ss_family = AF_INET; + addr4->sin_addr.s_addr = htonl(INADDR_ANY); + } + } else if (uv_ip4_addr(interface_addr, 0, addr4) == 0) { + /* nothing, address was parsed */ + } else if (uv_ip6_addr(interface_addr, 0, addr6) == 0) { + /* nothing, address was parsed */ + } else { + return UV_EINVAL; + } + + if (!(handle->flags & UV_HANDLE_BOUND)) + return UV_EBADF; + + if (addr_st.ss_family == AF_INET) { + if (setsockopt(handle->socket, + IPPROTO_IP, + IP_MULTICAST_IF, + (char*) &addr4->sin_addr, + sizeof(addr4->sin_addr)) == SOCKET_ERROR) { + return uv_translate_sys_error(WSAGetLastError()); + } + } else if (addr_st.ss_family == AF_INET6) { + if (setsockopt(handle->socket, + IPPROTO_IPV6, + IPV6_MULTICAST_IF, + (char*) &addr6->sin6_scope_id, + sizeof(addr6->sin6_scope_id)) == SOCKET_ERROR) { + return uv_translate_sys_error(WSAGetLastError()); + } + } else { + assert(0 && "unexpected address family"); + abort(); + } + + return 0; +} + + +int uv_udp_set_broadcast(uv_udp_t* handle, int value) { + BOOL optval = (BOOL) value; + + if (!(handle->flags & UV_HANDLE_BOUND)) + return UV_EBADF; + + if (setsockopt(handle->socket, + SOL_SOCKET, + SO_BROADCAST, + (char*) &optval, + sizeof optval)) { + return uv_translate_sys_error(WSAGetLastError()); + } + + return 0; +} + + +int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock) { + WSAPROTOCOL_INFOW protocol_info; + int opt_len; + int err; + + /* Detect the address family of the socket. */ + opt_len = (int) sizeof protocol_info; + if (getsockopt(sock, + SOL_SOCKET, + SO_PROTOCOL_INFOW, + (char*) &protocol_info, + &opt_len) == SOCKET_ERROR) { + return uv_translate_sys_error(GetLastError()); + } + + err = uv_udp_set_socket(handle->loop, + handle, + sock, + protocol_info.iAddressFamily); + return uv_translate_sys_error(err); +} + + +#define SOCKOPT_SETTER(name, option4, option6, validate) \ + int uv_udp_set_##name(uv_udp_t* handle, int value) { \ + DWORD optval = (DWORD) value; \ + \ + if (!(validate(value))) { \ + return UV_EINVAL; \ + } \ + \ + if (!(handle->flags & UV_HANDLE_BOUND)) \ + return UV_EBADF; \ + \ + if (!(handle->flags & UV_HANDLE_IPV6)) { \ + /* Set IPv4 socket option */ \ + if (setsockopt(handle->socket, \ + IPPROTO_IP, \ + option4, \ + (char*) &optval, \ + sizeof optval)) { \ + return uv_translate_sys_error(WSAGetLastError()); \ + } \ + } else { \ + /* Set IPv6 socket option */ \ + if (setsockopt(handle->socket, \ + IPPROTO_IPV6, \ + option6, \ + (char*) &optval, \ + sizeof optval)) { \ + return uv_translate_sys_error(WSAGetLastError()); \ + } \ + } \ + return 0; \ + } + +#define VALIDATE_TTL(value) ((value) >= 1 && (value) <= 255) +#define VALIDATE_MULTICAST_TTL(value) ((value) >= -1 && (value) <= 255) +#define VALIDATE_MULTICAST_LOOP(value) (1) + +SOCKOPT_SETTER(ttl, + IP_TTL, + IPV6_HOPLIMIT, + VALIDATE_TTL) +SOCKOPT_SETTER(multicast_ttl, + IP_MULTICAST_TTL, + IPV6_MULTICAST_HOPS, + VALIDATE_MULTICAST_TTL) +SOCKOPT_SETTER(multicast_loop, + IP_MULTICAST_LOOP, + IPV6_MULTICAST_LOOP, + VALIDATE_MULTICAST_LOOP) + +#undef SOCKOPT_SETTER +#undef VALIDATE_TTL +#undef VALIDATE_MULTICAST_TTL +#undef VALIDATE_MULTICAST_LOOP + + +/* This function is an egress point, i.e. it returns libuv errors rather than + * system errors. + */ +int uv__udp_bind(uv_udp_t* handle, + const struct sockaddr* addr, + unsigned int addrlen, + unsigned int flags) { + int err; + + err = uv_udp_maybe_bind(handle, addr, addrlen, flags); + if (err) + return uv_translate_sys_error(err); + + return 0; +} + + +/* This function is an egress point, i.e. it returns libuv errors rather than + * system errors. + */ +int uv__udp_send(uv_udp_send_t* req, + uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr, + unsigned int addrlen, + uv_udp_send_cb send_cb) { + const struct sockaddr* bind_addr; + int err; + + if (!(handle->flags & UV_HANDLE_BOUND)) { + if (addrlen == sizeof(uv_addr_ip4_any_)) { + bind_addr = (const struct sockaddr*) &uv_addr_ip4_any_; + } else if (addrlen == sizeof(uv_addr_ip6_any_)) { + bind_addr = (const struct sockaddr*) &uv_addr_ip6_any_; + } else { + abort(); + } + err = uv_udp_maybe_bind(handle, bind_addr, addrlen, 0); + if (err) + return uv_translate_sys_error(err); + } + + err = uv__send(req, handle, bufs, nbufs, addr, addrlen, send_cb); + if (err) + return uv_translate_sys_error(err); + + return 0; +} + + +int uv__udp_try_send(uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr, + unsigned int addrlen) { + return UV_ENOSYS; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/util.c b/lib/ESPiLight/pilight/libs/libuv/win/util.c new file mode 100644 index 0000000..d2e7f77 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/util.c @@ -0,0 +1,1576 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "uv.h" +#include "internal.h" + +#include +#include +#include +#include +#include +#include +#include + + +/* + * Max title length; the only thing MSDN tells us about the maximum length + * of the console title is that it is smaller than 64K. However in practice + * it is much smaller, and there is no way to figure out what the exact length + * of the title is or can be, at least not on XP. To make it even more + * annoying, GetConsoleTitle fails when the buffer to be read into is bigger + * than the actual maximum length. So we make a conservative guess here; + * just don't put the novel you're writing in the title, unless the plot + * survives truncation. + */ +#define MAX_TITLE_LENGTH 8192 + +/* The number of nanoseconds in one second. */ +#define UV__NANOSEC 1000000000 + +/* Max user name length, from iphlpapi.h */ +#ifndef UNLEN +# define UNLEN 256 +#endif + +/* + Max hostname length. The Windows gethostname() documentation states that 256 + bytes will always be large enough to hold the null-terminated hostname. +*/ +#ifndef MAXHOSTNAMELEN +# define MAXHOSTNAMELEN 256 +#endif + +/* Maximum environment variable size, including the terminating null */ +#define MAX_ENV_VAR_LENGTH 32767 + +/* Cached copy of the process title, plus a mutex guarding it. */ +static char *process_title; +static CRITICAL_SECTION process_title_lock; + +/* Cached copy of the process id, written once. */ +static DWORD current_pid = 0; + + +/* Interval (in seconds) of the high-resolution clock. */ +static double hrtime_interval_ = 0; + + +/* + * One-time initialization code for functionality defined in util.c. + */ +void uv__util_init(void) { + LARGE_INTEGER perf_frequency; + + /* Initialize process title access mutex. */ + InitializeCriticalSection(&process_title_lock); + + /* Retrieve high-resolution timer frequency + * and precompute its reciprocal. + */ + if (QueryPerformanceFrequency(&perf_frequency)) { + hrtime_interval_ = 1.0 / perf_frequency.QuadPart; + } else { + hrtime_interval_= 0; + } +} + + +int uv_exepath(char* buffer, size_t* size_ptr) { + int utf8_len, utf16_buffer_len, utf16_len; + WCHAR* utf16_buffer; + int err; + + if (buffer == NULL || size_ptr == NULL || *size_ptr == 0) { + return UV_EINVAL; + } + + if (*size_ptr > 32768) { + /* Windows paths can never be longer than this. */ + utf16_buffer_len = 32768; + } else { + utf16_buffer_len = (int) *size_ptr; + } + + utf16_buffer = (WCHAR*) uv__malloc(sizeof(WCHAR) * utf16_buffer_len); + if (!utf16_buffer) { + return UV_ENOMEM; + } + + /* Get the path as UTF-16. */ + utf16_len = GetModuleFileNameW(NULL, utf16_buffer, utf16_buffer_len); + if (utf16_len <= 0) { + err = GetLastError(); + goto error; + } + + /* utf16_len contains the length, *not* including the terminating null. */ + utf16_buffer[utf16_len] = L'\0'; + + /* Convert to UTF-8 */ + utf8_len = WideCharToMultiByte(CP_UTF8, + 0, + utf16_buffer, + -1, + buffer, + (int) *size_ptr, + NULL, + NULL); + if (utf8_len == 0) { + err = GetLastError(); + goto error; + } + + uv__free(utf16_buffer); + + /* utf8_len *does* include the terminating null at this point, but the */ + /* returned size shouldn't. */ + *size_ptr = utf8_len - 1; + return 0; + + error: + uv__free(utf16_buffer); + return uv_translate_sys_error(err); +} + + +int uv_cwd(char* buffer, size_t* size) { + DWORD utf16_len; + WCHAR utf16_buffer[MAX_PATH]; + int r; + + if (buffer == NULL || size == NULL) { + return UV_EINVAL; + } + + utf16_len = GetCurrentDirectoryW(MAX_PATH, utf16_buffer); + if (utf16_len == 0) { + return uv_translate_sys_error(GetLastError()); + } else if (utf16_len > MAX_PATH) { + /* This should be impossible; however the CRT has a code path to deal */ + /* with this scenario, so I added a check anyway. */ + return UV_EIO; + } + + /* utf16_len contains the length, *not* including the terminating null. */ + utf16_buffer[utf16_len] = L'\0'; + + /* The returned directory should not have a trailing slash, unless it */ + /* points at a drive root, like c:\. Remove it if needed.*/ + if (utf16_buffer[utf16_len - 1] == L'\\' && + !(utf16_len == 3 && utf16_buffer[1] == L':')) { + utf16_len--; + utf16_buffer[utf16_len] = L'\0'; + } + + /* Check how much space we need */ + r = WideCharToMultiByte(CP_UTF8, + 0, + utf16_buffer, + -1, + NULL, + 0, + NULL, + NULL); + if (r == 0) { + return uv_translate_sys_error(GetLastError()); + } else if (r > (int) *size) { + *size = r; + return UV_ENOBUFS; + } + + /* Convert to UTF-8 */ + r = WideCharToMultiByte(CP_UTF8, + 0, + utf16_buffer, + -1, + buffer, + *size > INT_MAX ? INT_MAX : (int) *size, + NULL, + NULL); + if (r == 0) { + return uv_translate_sys_error(GetLastError()); + } + + *size = r - 1; + return 0; +} + + +int uv_chdir(const char* dir) { + WCHAR utf16_buffer[MAX_PATH]; + size_t utf16_len; + WCHAR drive_letter, env_var[4]; + + if (dir == NULL) { + return UV_EINVAL; + } + + if (MultiByteToWideChar(CP_UTF8, + 0, + dir, + -1, + utf16_buffer, + MAX_PATH) == 0) { + DWORD error = GetLastError(); + /* The maximum length of the current working directory is 260 chars, */ + /* including terminating null. If it doesn't fit, the path name must be */ + /* too long. */ + if (error == ERROR_INSUFFICIENT_BUFFER) { + return UV_ENAMETOOLONG; + } else { + return uv_translate_sys_error(error); + } + } + + if (!SetCurrentDirectoryW(utf16_buffer)) { + return uv_translate_sys_error(GetLastError()); + } + + /* Windows stores the drive-local path in an "hidden" environment variable, */ + /* which has the form "=C:=C:\Windows". SetCurrentDirectory does not */ + /* update this, so we'll have to do it. */ + utf16_len = GetCurrentDirectoryW(MAX_PATH, utf16_buffer); + if (utf16_len == 0) { + return uv_translate_sys_error(GetLastError()); + } else if (utf16_len > MAX_PATH) { + return UV_EIO; + } + + /* The returned directory should not have a trailing slash, unless it */ + /* points at a drive root, like c:\. Remove it if needed. */ + if (utf16_buffer[utf16_len - 1] == L'\\' && + !(utf16_len == 3 && utf16_buffer[1] == L':')) { + utf16_len--; + utf16_buffer[utf16_len] = L'\0'; + } + + if (utf16_len < 2 || utf16_buffer[1] != L':') { + /* Doesn't look like a drive letter could be there - probably an UNC */ + /* path. TODO: Need to handle win32 namespaces like \\?\C:\ ? */ + drive_letter = 0; + } else if (utf16_buffer[0] >= L'A' && utf16_buffer[0] <= L'Z') { + drive_letter = utf16_buffer[0]; + } else if (utf16_buffer[0] >= L'a' && utf16_buffer[0] <= L'z') { + /* Convert to uppercase. */ + drive_letter = utf16_buffer[0] - L'a' + L'A'; + } else { + /* Not valid. */ + drive_letter = 0; + } + + if (drive_letter != 0) { + /* Construct the environment variable name and set it. */ + env_var[0] = L'='; + env_var[1] = drive_letter; + env_var[2] = L':'; + env_var[3] = L'\0'; + + if (!SetEnvironmentVariableW(env_var, utf16_buffer)) { + return uv_translate_sys_error(GetLastError()); + } + } + + return 0; +} + + +void uv_loadavg(double avg[3]) { + /* Can't be implemented */ + avg[0] = avg[1] = avg[2] = 0; +} + + +uint64_t uv_get_free_memory(void) { + MEMORYSTATUSEX memory_status; + memory_status.dwLength = sizeof(memory_status); + + if (!GlobalMemoryStatusEx(&memory_status)) { + return -1; + } + + return (uint64_t)memory_status.ullAvailPhys; +} + + +uint64_t uv_get_total_memory(void) { + MEMORYSTATUSEX memory_status; + memory_status.dwLength = sizeof(memory_status); + + if (!GlobalMemoryStatusEx(&memory_status)) { + return -1; + } + + return (uint64_t)memory_status.ullTotalPhys; +} + + +int uv_parent_pid(void) { + int parent_pid = -1; + HANDLE handle; + PROCESSENTRY32 pe; + DWORD current_pid = GetCurrentProcessId(); + + pe.dwSize = sizeof(PROCESSENTRY32); + handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + + if (Process32First(handle, &pe)) { + do { + if (pe.th32ProcessID == current_pid) { + parent_pid = pe.th32ParentProcessID; + break; + } + } while( Process32Next(handle, &pe)); + } + + CloseHandle(handle); + return parent_pid; +} + + +int uv_current_pid(void) { + if (current_pid == 0) { + current_pid = GetCurrentProcessId(); + } + return current_pid; +} + + +char** uv_setup_args(int argc, char** argv) { + return argv; +} + + +int uv_set_process_title(const char* title) { + int err; + int length; + WCHAR* title_w = NULL; + + uv__once_init(); + + /* Find out how big the buffer for the wide-char title must be */ + length = MultiByteToWideChar(CP_UTF8, 0, title, -1, NULL, 0); + if (!length) { + err = GetLastError(); + goto done; + } + + /* Convert to wide-char string */ + title_w = (WCHAR*)uv__malloc(sizeof(WCHAR) * length); + if (!title_w) { + uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); + } + + length = MultiByteToWideChar(CP_UTF8, 0, title, -1, title_w, length); + if (!length) { + err = GetLastError(); + goto done; + } + + /* If the title must be truncated insert a \0 terminator there */ + if (length > MAX_TITLE_LENGTH) { + title_w[MAX_TITLE_LENGTH - 1] = L'\0'; + } + + if (!SetConsoleTitleW(title_w)) { + err = GetLastError(); + goto done; + } + + EnterCriticalSection(&process_title_lock); + uv__free(process_title); + process_title = uv__strdup(title); + LeaveCriticalSection(&process_title_lock); + + err = 0; + +done: + uv__free(title_w); + return uv_translate_sys_error(err); +} + + +static int uv__get_process_title(void) { + WCHAR title_w[MAX_TITLE_LENGTH]; + + if (!GetConsoleTitleW(title_w, sizeof(title_w) / sizeof(WCHAR))) { + return -1; + } + + if (uv__convert_utf16_to_utf8(title_w, -1, &process_title) != 0) + return -1; + + return 0; +} + + +int uv_get_process_title(char* buffer, size_t size) { + size_t len; + + if (buffer == NULL || size == 0) + return UV_EINVAL; + + uv__once_init(); + + EnterCriticalSection(&process_title_lock); + /* + * If the process_title was never read before nor explicitly set, + * we must query it with getConsoleTitleW + */ + if (!process_title && uv__get_process_title() == -1) { + LeaveCriticalSection(&process_title_lock); + return uv_translate_sys_error(GetLastError()); + } + + assert(process_title); + len = strlen(process_title) + 1; + + if (size < len) { + LeaveCriticalSection(&process_title_lock); + return UV_ENOBUFS; + } + + memcpy(buffer, process_title, len); + LeaveCriticalSection(&process_title_lock); + + return 0; +} + + +uint64_t uv_hrtime(void) { + uv__once_init(); + return uv__hrtime(UV__NANOSEC); +} + +uint64_t uv__hrtime(double scale) { + LARGE_INTEGER counter; + + /* If the performance interval is zero, there's no support. */ + if (hrtime_interval_ == 0) { + return 0; + } + + if (!QueryPerformanceCounter(&counter)) { + return 0; + } + + /* Because we have no guarantee about the order of magnitude of the + * performance counter interval, integer math could cause this computation + * to overflow. Therefore we resort to floating point math. + */ + return (uint64_t) ((double) counter.QuadPart * hrtime_interval_ * scale); +} + + +int uv_resident_set_memory(size_t* rss) { + HANDLE current_process; + PROCESS_MEMORY_COUNTERS pmc; + + current_process = GetCurrentProcess(); + + if (!GetProcessMemoryInfo(current_process, &pmc, sizeof(pmc))) { + return uv_translate_sys_error(GetLastError()); + } + + *rss = pmc.WorkingSetSize; + + return 0; +} + + +int uv_uptime(double* uptime) { + BYTE stack_buffer[4096]; + BYTE* malloced_buffer = NULL; + BYTE* buffer = (BYTE*) stack_buffer; + size_t buffer_size = sizeof(stack_buffer); + DWORD data_size; + + PERF_DATA_BLOCK* data_block; + PERF_OBJECT_TYPE* object_type; + PERF_COUNTER_DEFINITION* counter_definition; + + DWORD i; + + for (;;) { + LONG result; + + data_size = (DWORD) buffer_size; + result = RegQueryValueExW(HKEY_PERFORMANCE_DATA, + L"2", + NULL, + NULL, + buffer, + &data_size); + if (result == ERROR_SUCCESS) { + break; + } else if (result != ERROR_MORE_DATA) { + *uptime = 0; + return uv_translate_sys_error(result); + } + + buffer_size *= 2; + /* Don't let the buffer grow infinitely. */ + if (buffer_size > 1 << 20) { + goto internalError; + } + + uv__free(malloced_buffer); + + buffer = malloced_buffer = (BYTE*) uv__malloc(buffer_size); + if (malloced_buffer == NULL) { + *uptime = 0; + return UV_ENOMEM; + } + } + + if (data_size < sizeof(*data_block)) + goto internalError; + + data_block = (PERF_DATA_BLOCK*) buffer; + + if (wmemcmp(data_block->Signature, L"PERF", 4) != 0) + goto internalError; + + if (data_size < data_block->HeaderLength + sizeof(*object_type)) + goto internalError; + + object_type = (PERF_OBJECT_TYPE*) (buffer + data_block->HeaderLength); + + if (object_type->NumInstances != PERF_NO_INSTANCES) + goto internalError; + + counter_definition = (PERF_COUNTER_DEFINITION*) (buffer + + data_block->HeaderLength + object_type->HeaderLength); + for (i = 0; i < object_type->NumCounters; i++) { + if ((BYTE*) counter_definition + sizeof(*counter_definition) > + buffer + data_size) { + break; + } + + if (counter_definition->CounterNameTitleIndex == 674 && + counter_definition->CounterSize == sizeof(uint64_t)) { + if (counter_definition->CounterOffset + sizeof(uint64_t) > data_size || + !(counter_definition->CounterType & PERF_OBJECT_TIMER)) { + goto internalError; + } else { + BYTE* address = (BYTE*) object_type + object_type->DefinitionLength + + counter_definition->CounterOffset; + uint64_t value = *((uint64_t*) address); + *uptime = (double) (object_type->PerfTime.QuadPart - value) / + (double) object_type->PerfFreq.QuadPart; + uv__free(malloced_buffer); + return 0; + } + } + + counter_definition = (PERF_COUNTER_DEFINITION*) + ((BYTE*) counter_definition + counter_definition->ByteLength); + } + + /* If we get here, the uptime value was not found. */ + uv__free(malloced_buffer); + *uptime = 0; + return UV_ENOSYS; + + internalError: + uv__free(malloced_buffer); + *uptime = 0; + return UV_EIO; +} + + +int uv_cpu_info(uv_cpu_info_t** cpu_infos_ptr, int* cpu_count_ptr) { + uv_cpu_info_t* cpu_infos; + SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION* sppi; + DWORD sppi_size; + SYSTEM_INFO system_info; + DWORD cpu_count, r, i; + NTSTATUS status; + ULONG result_size; + int err; + uv_cpu_info_t* cpu_info; + + cpu_infos = NULL; + cpu_count = 0; + sppi = NULL; + + uv__once_init(); + + GetSystemInfo(&system_info); + cpu_count = system_info.dwNumberOfProcessors; + + cpu_infos = uv__calloc(cpu_count, sizeof *cpu_infos); + if (cpu_infos == NULL) { + err = ERROR_OUTOFMEMORY; + goto error; + } + + sppi_size = cpu_count * sizeof(*sppi); + sppi = uv__malloc(sppi_size); + if (sppi == NULL) { + err = ERROR_OUTOFMEMORY; + goto error; + } + + status = pNtQuerySystemInformation(SystemProcessorPerformanceInformation, + sppi, + sppi_size, + &result_size); + if (!NT_SUCCESS(status)) { + err = pRtlNtStatusToDosError(status); + goto error; + } + + assert(result_size == sppi_size); + + for (i = 0; i < cpu_count; i++) { + WCHAR key_name[128]; + HKEY processor_key; + DWORD cpu_speed; + DWORD cpu_speed_size = sizeof(cpu_speed); + WCHAR cpu_brand[256]; + DWORD cpu_brand_size = sizeof(cpu_brand); + size_t len; + + len = _snwprintf(key_name, + ARRAY_SIZE(key_name), + L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\%d", + i); + + assert(len > 0 && len < ARRAY_SIZE(key_name)); + + r = RegOpenKeyExW(HKEY_LOCAL_MACHINE, + key_name, + 0, + KEY_QUERY_VALUE, + &processor_key); + if (r != ERROR_SUCCESS) { + err = GetLastError(); + goto error; + } + + if (RegQueryValueExW(processor_key, + L"~MHz", + NULL, + NULL, + (BYTE*) &cpu_speed, + &cpu_speed_size) != ERROR_SUCCESS) { + err = GetLastError(); + RegCloseKey(processor_key); + goto error; + } + + if (RegQueryValueExW(processor_key, + L"ProcessorNameString", + NULL, + NULL, + (BYTE*) &cpu_brand, + &cpu_brand_size) != ERROR_SUCCESS) { + err = GetLastError(); + RegCloseKey(processor_key); + goto error; + } + + RegCloseKey(processor_key); + + cpu_info = &cpu_infos[i]; + cpu_info->speed = cpu_speed; + cpu_info->cpu_times.user = sppi[i].UserTime.QuadPart / 10000; + cpu_info->cpu_times.sys = (sppi[i].KernelTime.QuadPart - + sppi[i].IdleTime.QuadPart) / 10000; + cpu_info->cpu_times.idle = sppi[i].IdleTime.QuadPart / 10000; + cpu_info->cpu_times.irq = sppi[i].InterruptTime.QuadPart / 10000; + cpu_info->cpu_times.nice = 0; + + uv__convert_utf16_to_utf8(cpu_brand, + cpu_brand_size / sizeof(WCHAR), + &(cpu_info->model)); + } + + uv__free(sppi); + + *cpu_count_ptr = cpu_count; + *cpu_infos_ptr = cpu_infos; + + return 0; + + error: + /* This is safe because the cpu_infos array is zeroed on allocation. */ + for (i = 0; i < cpu_count; i++) + uv__free(cpu_infos[i].model); + + uv__free(cpu_infos); + uv__free(sppi); + + return uv_translate_sys_error(err); +} + + +void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count) { + int i; + + for (i = 0; i < count; i++) { + uv__free(cpu_infos[i].model); + } + + uv__free(cpu_infos); +} + + +static int is_windows_version_or_greater(DWORD os_major, + DWORD os_minor, + WORD service_pack_major, + WORD service_pack_minor) { + OSVERSIONINFOEX osvi; + DWORDLONG condition_mask = 0; + int op = VER_GREATER_EQUAL; + + /* Initialize the OSVERSIONINFOEX structure. */ + ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + osvi.dwMajorVersion = os_major; + osvi.dwMinorVersion = os_minor; + osvi.wServicePackMajor = service_pack_major; + osvi.wServicePackMinor = service_pack_minor; + + /* Initialize the condition mask. */ + VER_SET_CONDITION(condition_mask, VER_MAJORVERSION, op); + VER_SET_CONDITION(condition_mask, VER_MINORVERSION, op); + VER_SET_CONDITION(condition_mask, VER_SERVICEPACKMAJOR, op); + VER_SET_CONDITION(condition_mask, VER_SERVICEPACKMINOR, op); + + /* Perform the test. */ + return (int) VerifyVersionInfo( + &osvi, + VER_MAJORVERSION | VER_MINORVERSION | + VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, + condition_mask); +} + + +static int address_prefix_match(int family, + struct sockaddr* address, + struct sockaddr* prefix_address, + int prefix_len) { + uint8_t* address_data; + uint8_t* prefix_address_data; + int i; + + assert(address->sa_family == family); + assert(prefix_address->sa_family == family); + + if (family == AF_INET6) { + address_data = (uint8_t*) &(((struct sockaddr_in6 *) address)->sin6_addr); + prefix_address_data = + (uint8_t*) &(((struct sockaddr_in6 *) prefix_address)->sin6_addr); + } else { + address_data = (uint8_t*) &(((struct sockaddr_in *) address)->sin_addr); + prefix_address_data = + (uint8_t*) &(((struct sockaddr_in *) prefix_address)->sin_addr); + } + + for (i = 0; i < prefix_len >> 3; i++) { + if (address_data[i] != prefix_address_data[i]) + return 0; + } + + if (prefix_len % 8) + return prefix_address_data[i] == + (address_data[i] & (0xff << (8 - prefix_len % 8))); + + return 1; +} + + +int uv_interface_addresses(uv_interface_address_t** addresses_ptr, + int* count_ptr) { + IP_ADAPTER_ADDRESSES* win_address_buf; + ULONG win_address_buf_size; + IP_ADAPTER_ADDRESSES* adapter; + + uv_interface_address_t* uv_address_buf; + char* name_buf; + size_t uv_address_buf_size; + uv_interface_address_t* uv_address; + + int count; + + int is_vista_or_greater; + ULONG flags; + + is_vista_or_greater = is_windows_version_or_greater(6, 0, 0, 0); + if (is_vista_or_greater) { + flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | + GAA_FLAG_SKIP_DNS_SERVER; + } else { + /* We need at least XP SP1. */ + if (!is_windows_version_or_greater(5, 1, 1, 0)) + return UV_ENOTSUP; + + flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | + GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_INCLUDE_PREFIX; + } + + + /* Fetch the size of the adapters reported by windows, and then get the */ + /* list itself. */ + win_address_buf_size = 0; + win_address_buf = NULL; + + for (;;) { + ULONG r; + + /* If win_address_buf is 0, then GetAdaptersAddresses will fail with */ + /* ERROR_BUFFER_OVERFLOW, and the required buffer size will be stored in */ + /* win_address_buf_size. */ + r = GetAdaptersAddresses(AF_UNSPEC, + flags, + NULL, + win_address_buf, + &win_address_buf_size); + + if (r == ERROR_SUCCESS) + break; + + uv__free(win_address_buf); + + switch (r) { + case ERROR_BUFFER_OVERFLOW: + /* This happens when win_address_buf is NULL or too small to hold */ + /* all adapters. */ + win_address_buf = uv__malloc(win_address_buf_size); + if (win_address_buf == NULL) + return UV_ENOMEM; + + continue; + + case ERROR_NO_DATA: { + /* No adapters were found. */ + uv_address_buf = uv__malloc(1); + if (uv_address_buf == NULL) + return UV_ENOMEM; + + *count_ptr = 0; + *addresses_ptr = uv_address_buf; + + return 0; + } + + case ERROR_ADDRESS_NOT_ASSOCIATED: + return UV_EAGAIN; + + case ERROR_INVALID_PARAMETER: + /* MSDN says: + * "This error is returned for any of the following conditions: the + * SizePointer parameter is NULL, the Address parameter is not + * AF_INET, AF_INET6, or AF_UNSPEC, or the address information for + * the parameters requested is greater than ULONG_MAX." + * Since the first two conditions are not met, it must be that the + * adapter data is too big. + */ + return UV_ENOBUFS; + + default: + /* Other (unspecified) errors can happen, but we don't have any */ + /* special meaning for them. */ + assert(r != ERROR_SUCCESS); + return uv_translate_sys_error(r); + } + } + + /* Count the number of enabled interfaces and compute how much space is */ + /* needed to store their info. */ + count = 0; + uv_address_buf_size = 0; + + for (adapter = win_address_buf; + adapter != NULL; + adapter = adapter->Next) { + IP_ADAPTER_UNICAST_ADDRESS* unicast_address; + int name_size; + + /* Interfaces that are not 'up' should not be reported. Also skip */ + /* interfaces that have no associated unicast address, as to avoid */ + /* allocating space for the name for this interface. */ + if (adapter->OperStatus != IfOperStatusUp || + adapter->FirstUnicastAddress == NULL) + continue; + + /* Compute the size of the interface name. */ + name_size = WideCharToMultiByte(CP_UTF8, + 0, + adapter->FriendlyName, + -1, + NULL, + 0, + NULL, + FALSE); + if (name_size <= 0) { + uv__free(win_address_buf); + return uv_translate_sys_error(GetLastError()); + } + uv_address_buf_size += name_size; + + /* Count the number of addresses associated with this interface, and */ + /* compute the size. */ + for (unicast_address = (IP_ADAPTER_UNICAST_ADDRESS*) + adapter->FirstUnicastAddress; + unicast_address != NULL; + unicast_address = unicast_address->Next) { + count++; + uv_address_buf_size += sizeof(uv_interface_address_t); + } + } + + /* Allocate space to store interface data plus adapter names. */ + uv_address_buf = uv__malloc(uv_address_buf_size); + if (uv_address_buf == NULL) { + uv__free(win_address_buf); + return UV_ENOMEM; + } + + /* Compute the start of the uv_interface_address_t array, and the place in */ + /* the buffer where the interface names will be stored. */ + uv_address = uv_address_buf; + name_buf = (char*) (uv_address_buf + count); + + /* Fill out the output buffer. */ + for (adapter = win_address_buf; + adapter != NULL; + adapter = adapter->Next) { + IP_ADAPTER_UNICAST_ADDRESS* unicast_address; + int name_size; + size_t max_name_size; + + if (adapter->OperStatus != IfOperStatusUp || + adapter->FirstUnicastAddress == NULL) + continue; + + /* Convert the interface name to UTF8. */ + max_name_size = (char*) uv_address_buf + uv_address_buf_size - name_buf; + if (max_name_size > (size_t) INT_MAX) + max_name_size = INT_MAX; + name_size = WideCharToMultiByte(CP_UTF8, + 0, + adapter->FriendlyName, + -1, + name_buf, + (int) max_name_size, + NULL, + FALSE); + if (name_size <= 0) { + uv__free(win_address_buf); + uv__free(uv_address_buf); + return uv_translate_sys_error(GetLastError()); + } + + /* Add an uv_interface_address_t element for every unicast address. */ + for (unicast_address = (IP_ADAPTER_UNICAST_ADDRESS*) + adapter->FirstUnicastAddress; + unicast_address != NULL; + unicast_address = unicast_address->Next) { + struct sockaddr* sa; + ULONG prefix_len; + + sa = unicast_address->Address.lpSockaddr; + + /* XP has no OnLinkPrefixLength field. */ + if (is_vista_or_greater) { + prefix_len = + ((IP_ADAPTER_UNICAST_ADDRESS_LH*) unicast_address)->OnLinkPrefixLength; + } else { + /* Prior to Windows Vista the FirstPrefix pointed to the list with + * single prefix for each IP address assigned to the adapter. + * Order of FirstPrefix does not match order of FirstUnicastAddress, + * so we need to find corresponding prefix. + */ + IP_ADAPTER_PREFIX* prefix; + prefix_len = 0; + + for (prefix = adapter->FirstPrefix; prefix; prefix = prefix->Next) { + /* We want the longest matching prefix. */ + if (prefix->Address.lpSockaddr->sa_family != sa->sa_family || + prefix->PrefixLength <= prefix_len) + continue; + + if (address_prefix_match(sa->sa_family, sa, + prefix->Address.lpSockaddr, prefix->PrefixLength)) { + prefix_len = prefix->PrefixLength; + } + } + + /* If there is no matching prefix information, return a single-host + * subnet mask (e.g. 255.255.255.255 for IPv4). + */ + if (!prefix_len) + prefix_len = (sa->sa_family == AF_INET6) ? 128 : 32; + } + + memset(uv_address, 0, sizeof *uv_address); + + uv_address->name = name_buf; + + if (adapter->PhysicalAddressLength == sizeof(uv_address->phys_addr)) { + memcpy(uv_address->phys_addr, + adapter->PhysicalAddress, + sizeof(uv_address->phys_addr)); + } + + uv_address->is_internal = + (adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK); + + if (sa->sa_family == AF_INET6) { + uv_address->address.address6 = *((struct sockaddr_in6 *) sa); + + uv_address->netmask.netmask6.sin6_family = AF_INET6; + memset(uv_address->netmask.netmask6.sin6_addr.s6_addr, 0xff, prefix_len >> 3); + /* This check ensures that we don't write past the size of the data. */ + if (prefix_len % 8) { + uv_address->netmask.netmask6.sin6_addr.s6_addr[prefix_len >> 3] = + 0xff << (8 - prefix_len % 8); + } + + } else { + uv_address->address.address4 = *((struct sockaddr_in *) sa); + + uv_address->netmask.netmask4.sin_family = AF_INET; + uv_address->netmask.netmask4.sin_addr.s_addr = (prefix_len > 0) ? + htonl(0xffffffff << (32 - prefix_len)) : 0; + } + + uv_address++; + } + + name_buf += name_size; + } + + uv__free(win_address_buf); + + *addresses_ptr = uv_address_buf; + *count_ptr = count; + + return 0; +} + + +void uv_free_interface_addresses(uv_interface_address_t* addresses, + int count) { + uv__free(addresses); +} + + +int uv_getrusage(uv_rusage_t *uv_rusage) { + FILETIME createTime, exitTime, kernelTime, userTime; + SYSTEMTIME kernelSystemTime, userSystemTime; + PROCESS_MEMORY_COUNTERS memCounters; + IO_COUNTERS ioCounters; + int ret; + + ret = GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &kernelTime, &userTime); + if (ret == 0) { + return uv_translate_sys_error(GetLastError()); + } + + ret = FileTimeToSystemTime(&kernelTime, &kernelSystemTime); + if (ret == 0) { + return uv_translate_sys_error(GetLastError()); + } + + ret = FileTimeToSystemTime(&userTime, &userSystemTime); + if (ret == 0) { + return uv_translate_sys_error(GetLastError()); + } + + ret = GetProcessMemoryInfo(GetCurrentProcess(), + &memCounters, + sizeof(memCounters)); + if (ret == 0) { + return uv_translate_sys_error(GetLastError()); + } + + ret = GetProcessIoCounters(GetCurrentProcess(), &ioCounters); + if (ret == 0) { + return uv_translate_sys_error(GetLastError()); + } + + memset(uv_rusage, 0, sizeof(*uv_rusage)); + + uv_rusage->ru_utime.tv_sec = userSystemTime.wHour * 3600 + + userSystemTime.wMinute * 60 + + userSystemTime.wSecond; + uv_rusage->ru_utime.tv_usec = userSystemTime.wMilliseconds * 1000; + + uv_rusage->ru_stime.tv_sec = kernelSystemTime.wHour * 3600 + + kernelSystemTime.wMinute * 60 + + kernelSystemTime.wSecond; + uv_rusage->ru_stime.tv_usec = kernelSystemTime.wMilliseconds * 1000; + + uv_rusage->ru_majflt = (uint64_t) memCounters.PageFaultCount; + uv_rusage->ru_maxrss = (uint64_t) memCounters.PeakWorkingSetSize / 1024; + + uv_rusage->ru_oublock = (uint64_t) ioCounters.WriteOperationCount; + uv_rusage->ru_inblock = (uint64_t) ioCounters.ReadOperationCount; + + return 0; +} + + +int uv_os_homedir(char* buffer, size_t* size) { + uv_passwd_t pwd; + wchar_t path[MAX_PATH]; + DWORD bufsize; + size_t len; + int r; + + if (buffer == NULL || size == NULL || *size == 0) + return UV_EINVAL; + + /* Check if the USERPROFILE environment variable is set first */ + len = GetEnvironmentVariableW(L"USERPROFILE", path, MAX_PATH); + + if (len == 0) { + r = GetLastError(); + + /* Don't return an error if USERPROFILE was not found */ + if (r != ERROR_ENVVAR_NOT_FOUND) + return uv_translate_sys_error(r); + } else if (len > MAX_PATH) { + /* This should not be possible */ + return UV_EIO; + } else { + /* Check how much space we need */ + bufsize = WideCharToMultiByte(CP_UTF8, 0, path, -1, NULL, 0, NULL, NULL); + + if (bufsize == 0) { + return uv_translate_sys_error(GetLastError()); + } else if (bufsize > *size) { + *size = bufsize; + return UV_ENOBUFS; + } + + /* Convert to UTF-8 */ + bufsize = WideCharToMultiByte(CP_UTF8, + 0, + path, + -1, + buffer, + *size, + NULL, + NULL); + + if (bufsize == 0) + return uv_translate_sys_error(GetLastError()); + + *size = bufsize - 1; + return 0; + } + + /* USERPROFILE is not set, so call uv__getpwuid_r() */ + r = uv__getpwuid_r(&pwd); + + if (r != 0) { + return r; + } + + len = strlen(pwd.homedir); + + if (len >= *size) { + *size = len + 1; + uv_os_free_passwd(&pwd); + return UV_ENOBUFS; + } + + memcpy(buffer, pwd.homedir, len + 1); + *size = len; + uv_os_free_passwd(&pwd); + + return 0; +} + + +int uv_os_tmpdir(char* buffer, size_t* size) { + wchar_t path[MAX_PATH + 1]; + DWORD bufsize; + size_t len; + + if (buffer == NULL || size == NULL || *size == 0) + return UV_EINVAL; + + len = GetTempPathW(MAX_PATH + 1, path); + + if (len == 0) { + return uv_translate_sys_error(GetLastError()); + } else if (len > MAX_PATH + 1) { + /* This should not be possible */ + return UV_EIO; + } + + /* The returned directory should not have a trailing slash, unless it */ + /* points at a drive root, like c:\. Remove it if needed.*/ + if (path[len - 1] == L'\\' && + !(len == 3 && path[1] == L':')) { + len--; + path[len] = L'\0'; + } + + /* Check how much space we need */ + bufsize = WideCharToMultiByte(CP_UTF8, 0, path, -1, NULL, 0, NULL, NULL); + + if (bufsize == 0) { + return uv_translate_sys_error(GetLastError()); + } else if (bufsize > *size) { + *size = bufsize; + return UV_ENOBUFS; + } + + /* Convert to UTF-8 */ + bufsize = WideCharToMultiByte(CP_UTF8, + 0, + path, + -1, + buffer, + *size, + NULL, + NULL); + + if (bufsize == 0) + return uv_translate_sys_error(GetLastError()); + + *size = bufsize - 1; + return 0; +} + + +void uv_os_free_passwd(uv_passwd_t* pwd) { + if (pwd == NULL) + return; + + uv__free(pwd->username); + uv__free(pwd->homedir); + pwd->username = NULL; + pwd->homedir = NULL; +} + + +/* + * Converts a UTF-16 string into a UTF-8 one. The resulting string is + * null-terminated. + * + * If utf16 is null terminated, utf16len can be set to -1, otherwise it must + * be specified. + */ +int uv__convert_utf16_to_utf8(const WCHAR* utf16, int utf16len, char** utf8) { + DWORD bufsize; + + if (utf16 == NULL) + return UV_EINVAL; + + /* Check how much space we need */ + bufsize = WideCharToMultiByte(CP_UTF8, + 0, + utf16, + utf16len, + NULL, + 0, + NULL, + NULL); + + if (bufsize == 0) + return uv_translate_sys_error(GetLastError()); + + /* Allocate the destination buffer adding an extra byte for the terminating + * NULL. If utf16len is not -1 WideCharToMultiByte will not add it, so + * we do it ourselves always, just in case. */ + *utf8 = uv__malloc(bufsize + 1); + + if (*utf8 == NULL) + return UV_ENOMEM; + + /* Convert to UTF-8 */ + bufsize = WideCharToMultiByte(CP_UTF8, + 0, + utf16, + utf16len, + *utf8, + bufsize, + NULL, + NULL); + + if (bufsize == 0) { + uv__free(*utf8); + *utf8 = NULL; + return uv_translate_sys_error(GetLastError()); + } + + (*utf8)[bufsize] = '\0'; + return 0; +} + + +/* + * Converts a UTF-8 string into a UTF-16 one. The resulting string is + * null-terminated. + * + * If utf8 is null terminated, utf8len can be set to -1, otherwise it must + * be specified. + */ +int uv__convert_utf8_to_utf16(const char* utf8, int utf8len, WCHAR** utf16) { + int bufsize; + + if (utf8 == NULL) + return UV_EINVAL; + + /* Check how much space we need */ + bufsize = MultiByteToWideChar(CP_UTF8, 0, utf8, utf8len, NULL, 0); + + if (bufsize == 0) + return uv_translate_sys_error(GetLastError()); + + /* Allocate the destination buffer adding an extra byte for the terminating + * NULL. If utf8len is not -1 MultiByteToWideChar will not add it, so + * we do it ourselves always, just in case. */ + *utf16 = uv__malloc(sizeof(WCHAR) * (bufsize + 1)); + + if (*utf16 == NULL) + return UV_ENOMEM; + + /* Convert to UTF-16 */ + bufsize = MultiByteToWideChar(CP_UTF8, 0, utf8, utf8len, *utf16, bufsize); + + if (bufsize == 0) { + uv__free(*utf16); + *utf16 = NULL; + return uv_translate_sys_error(GetLastError()); + } + + (*utf16)[bufsize] = '\0'; + return 0; +} + + +int uv__getpwuid_r(uv_passwd_t* pwd) { + HANDLE token; + wchar_t username[UNLEN + 1]; + wchar_t path[MAX_PATH]; + DWORD bufsize; + int r; + + if (pwd == NULL) + return UV_EINVAL; + + /* Get the home directory using GetUserProfileDirectoryW() */ + if (OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &token) == 0) + return uv_translate_sys_error(GetLastError()); + + bufsize = sizeof(path); + if (!GetUserProfileDirectoryW(token, path, &bufsize)) { + r = GetLastError(); + CloseHandle(token); + + /* This should not be possible */ + if (r == ERROR_INSUFFICIENT_BUFFER) + return UV_ENOMEM; + + return uv_translate_sys_error(r); + } + + CloseHandle(token); + + /* Get the username using GetUserNameW() */ + bufsize = sizeof(username); + if (!GetUserNameW(username, &bufsize)) { + r = GetLastError(); + + /* This should not be possible */ + if (r == ERROR_INSUFFICIENT_BUFFER) + return UV_ENOMEM; + + return uv_translate_sys_error(r); + } + + pwd->homedir = NULL; + r = uv__convert_utf16_to_utf8(path, -1, &pwd->homedir); + + if (r != 0) + return r; + + pwd->username = NULL; + r = uv__convert_utf16_to_utf8(username, -1, &pwd->username); + + if (r != 0) { + uv__free(pwd->homedir); + return r; + } + + pwd->shell = NULL; + pwd->uid = -1; + pwd->gid = -1; + + return 0; +} + + +int uv_os_get_passwd(uv_passwd_t* pwd) { + return uv__getpwuid_r(pwd); +} + + +int uv_os_getenv(const char* name, char* buffer, size_t* size) { + wchar_t var[MAX_ENV_VAR_LENGTH]; + wchar_t* name_w; + DWORD bufsize; + size_t len; + int r; + + if (name == NULL || buffer == NULL || size == NULL || *size == 0) + return UV_EINVAL; + + r = uv__convert_utf8_to_utf16(name, -1, &name_w); + + if (r != 0) + return r; + + len = GetEnvironmentVariableW(name_w, var, MAX_ENV_VAR_LENGTH); + uv__free(name_w); + assert(len < MAX_ENV_VAR_LENGTH); /* len does not include the null */ + + if (len == 0) { + r = GetLastError(); + + if (r == ERROR_ENVVAR_NOT_FOUND) + return UV_ENOENT; + + return uv_translate_sys_error(r); + } + + /* Check how much space we need */ + bufsize = WideCharToMultiByte(CP_UTF8, 0, var, -1, NULL, 0, NULL, NULL); + + if (bufsize == 0) { + return uv_translate_sys_error(GetLastError()); + } else if (bufsize > *size) { + *size = bufsize; + return UV_ENOBUFS; + } + + /* Convert to UTF-8 */ + bufsize = WideCharToMultiByte(CP_UTF8, + 0, + var, + -1, + buffer, + *size, + NULL, + NULL); + + if (bufsize == 0) + return uv_translate_sys_error(GetLastError()); + + *size = bufsize - 1; + return 0; +} + + +int uv_os_setenv(const char* name, const char* value) { + wchar_t* name_w; + wchar_t* value_w; + int r; + + if (name == NULL || value == NULL) + return UV_EINVAL; + + r = uv__convert_utf8_to_utf16(name, -1, &name_w); + + if (r != 0) + return r; + + r = uv__convert_utf8_to_utf16(value, -1, &value_w); + + if (r != 0) { + uv__free(name_w); + return r; + } + + r = SetEnvironmentVariableW(name_w, value_w); + uv__free(name_w); + uv__free(value_w); + + if (r == 0) + return uv_translate_sys_error(GetLastError()); + + return 0; +} + + +int uv_os_unsetenv(const char* name) { + wchar_t* name_w; + int r; + + if (name == NULL) + return UV_EINVAL; + + r = uv__convert_utf8_to_utf16(name, -1, &name_w); + + if (r != 0) + return r; + + r = SetEnvironmentVariableW(name_w, NULL); + uv__free(name_w); + + if (r == 0) + return uv_translate_sys_error(GetLastError()); + + return 0; +} + + +int uv_os_gethostname(char* buffer, size_t* size) { + char buf[MAXHOSTNAMELEN + 1]; + size_t len; + + if (buffer == NULL || size == NULL || *size == 0) + return UV_EINVAL; + + uv__once_init(); /* Initialize winsock */ + + if (gethostname(buf, sizeof(buf)) != 0) + return uv_translate_sys_error(WSAGetLastError()); + + buf[sizeof(buf) - 1] = '\0'; /* Null terminate, just to be safe. */ + len = strlen(buf); + + if (len >= *size) { + *size = len + 1; + return UV_ENOBUFS; + } + + memcpy(buffer, buf, len + 1); + *size = len; + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/winapi.c b/lib/ESPiLight/pilight/libs/libuv/win/winapi.c new file mode 100644 index 0000000..aa5d719 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/winapi.c @@ -0,0 +1,159 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include + +#include "uv.h" +#include "internal.h" + + +/* Ntdll function pointers */ +sRtlNtStatusToDosError pRtlNtStatusToDosError; +sNtDeviceIoControlFile pNtDeviceIoControlFile; +sNtQueryInformationFile pNtQueryInformationFile; +sNtSetInformationFile pNtSetInformationFile; +sNtQueryVolumeInformationFile pNtQueryVolumeInformationFile; +sNtQueryDirectoryFile pNtQueryDirectoryFile; +sNtQuerySystemInformation pNtQuerySystemInformation; + + +/* Kernel32 function pointers */ +sGetQueuedCompletionStatusEx pGetQueuedCompletionStatusEx; +sSetFileCompletionNotificationModes pSetFileCompletionNotificationModes; +sCreateSymbolicLinkW pCreateSymbolicLinkW; +sCancelIoEx pCancelIoEx; +sInitializeConditionVariable pInitializeConditionVariable; +sSleepConditionVariableCS pSleepConditionVariableCS; +sSleepConditionVariableSRW pSleepConditionVariableSRW; +sWakeAllConditionVariable pWakeAllConditionVariable; +sWakeConditionVariable pWakeConditionVariable; +sCancelSynchronousIo pCancelSynchronousIo; +sGetFinalPathNameByHandleW pGetFinalPathNameByHandleW; + + +/* Powrprof.dll function pointer */ +sPowerRegisterSuspendResumeNotification pPowerRegisterSuspendResumeNotification; + + +void uv_winapi_init(void) { + HMODULE ntdll_module; + HMODULE kernel32_module; + HMODULE powrprof_module; + + ntdll_module = GetModuleHandleA("ntdll.dll"); + if (ntdll_module == NULL) { + uv_fatal_error(GetLastError(), "GetModuleHandleA"); + } + + pRtlNtStatusToDosError = (sRtlNtStatusToDosError) GetProcAddress( + ntdll_module, + "RtlNtStatusToDosError"); + if (pRtlNtStatusToDosError == NULL) { + uv_fatal_error(GetLastError(), "GetProcAddress"); + } + + pNtDeviceIoControlFile = (sNtDeviceIoControlFile) GetProcAddress( + ntdll_module, + "NtDeviceIoControlFile"); + if (pNtDeviceIoControlFile == NULL) { + uv_fatal_error(GetLastError(), "GetProcAddress"); + } + + pNtQueryInformationFile = (sNtQueryInformationFile) GetProcAddress( + ntdll_module, + "NtQueryInformationFile"); + if (pNtQueryInformationFile == NULL) { + uv_fatal_error(GetLastError(), "GetProcAddress"); + } + + pNtSetInformationFile = (sNtSetInformationFile) GetProcAddress( + ntdll_module, + "NtSetInformationFile"); + if (pNtSetInformationFile == NULL) { + uv_fatal_error(GetLastError(), "GetProcAddress"); + } + + pNtQueryVolumeInformationFile = (sNtQueryVolumeInformationFile) + GetProcAddress(ntdll_module, "NtQueryVolumeInformationFile"); + if (pNtQueryVolumeInformationFile == NULL) { + uv_fatal_error(GetLastError(), "GetProcAddress"); + } + + pNtQueryDirectoryFile = (sNtQueryDirectoryFile) + GetProcAddress(ntdll_module, "NtQueryDirectoryFile"); + if (pNtQueryVolumeInformationFile == NULL) { + uv_fatal_error(GetLastError(), "GetProcAddress"); + } + + pNtQuerySystemInformation = (sNtQuerySystemInformation) GetProcAddress( + ntdll_module, + "NtQuerySystemInformation"); + if (pNtQuerySystemInformation == NULL) { + uv_fatal_error(GetLastError(), "GetProcAddress"); + } + + kernel32_module = GetModuleHandleA("kernel32.dll"); + if (kernel32_module == NULL) { + uv_fatal_error(GetLastError(), "GetModuleHandleA"); + } + + pGetQueuedCompletionStatusEx = (sGetQueuedCompletionStatusEx) GetProcAddress( + kernel32_module, + "GetQueuedCompletionStatusEx"); + + pSetFileCompletionNotificationModes = (sSetFileCompletionNotificationModes) + GetProcAddress(kernel32_module, "SetFileCompletionNotificationModes"); + + pCreateSymbolicLinkW = (sCreateSymbolicLinkW) + GetProcAddress(kernel32_module, "CreateSymbolicLinkW"); + + pCancelIoEx = (sCancelIoEx) + GetProcAddress(kernel32_module, "CancelIoEx"); + + pInitializeConditionVariable = (sInitializeConditionVariable) + GetProcAddress(kernel32_module, "InitializeConditionVariable"); + + pSleepConditionVariableCS = (sSleepConditionVariableCS) + GetProcAddress(kernel32_module, "SleepConditionVariableCS"); + + pSleepConditionVariableSRW = (sSleepConditionVariableSRW) + GetProcAddress(kernel32_module, "SleepConditionVariableSRW"); + + pWakeAllConditionVariable = (sWakeAllConditionVariable) + GetProcAddress(kernel32_module, "WakeAllConditionVariable"); + + pWakeConditionVariable = (sWakeConditionVariable) + GetProcAddress(kernel32_module, "WakeConditionVariable"); + + pCancelSynchronousIo = (sCancelSynchronousIo) + GetProcAddress(kernel32_module, "CancelSynchronousIo"); + + pGetFinalPathNameByHandleW = (sGetFinalPathNameByHandleW) + GetProcAddress(kernel32_module, "GetFinalPathNameByHandleW"); + + + powrprof_module = LoadLibraryA("powrprof.dll"); + if (powrprof_module != NULL) { + pPowerRegisterSuspendResumeNotification = (sPowerRegisterSuspendResumeNotification) + GetProcAddress(powrprof_module, "PowerRegisterSuspendResumeNotification"); + } + +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/winapi.h b/lib/ESPiLight/pilight/libs/libuv/win/winapi.h new file mode 100644 index 0000000..9401676 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/winapi.h @@ -0,0 +1,4752 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_WIN_WINAPI_H_ +#define UV_WIN_WINAPI_H_ + +#include + + +/* + * Ntdll headers + */ +#ifndef STATUS_SEVERITY_SUCCESS +# define STATUS_SEVERITY_SUCCESS 0x0 +#endif + +#ifndef STATUS_SEVERITY_INFORMATIONAL +# define STATUS_SEVERITY_INFORMATIONAL 0x1 +#endif + +#ifndef STATUS_SEVERITY_WARNING +# define STATUS_SEVERITY_WARNING 0x2 +#endif + +#ifndef STATUS_SEVERITY_ERROR +# define STATUS_SEVERITY_ERROR 0x3 +#endif + +#ifndef FACILITY_NTWIN32 +# define FACILITY_NTWIN32 0x7 +#endif + +#ifndef NT_SUCCESS +# define NT_SUCCESS(status) (((NTSTATUS) (status)) >= 0) +#endif + +#ifndef NT_INFORMATION +# define NT_INFORMATION(status) ((((ULONG) (status)) >> 30) == 1) +#endif + +#ifndef NT_WARNING +# define NT_WARNING(status) ((((ULONG) (status)) >> 30) == 2) +#endif + +#ifndef NT_ERROR +# define NT_ERROR(status) ((((ULONG) (status)) >> 30) == 3) +#endif + +#ifndef STATUS_SUCCESS +# define STATUS_SUCCESS ((NTSTATUS) 0x00000000L) +#endif + +#ifndef STATUS_WAIT_0 +# define STATUS_WAIT_0 ((NTSTATUS) 0x00000000L) +#endif + +#ifndef STATUS_WAIT_1 +# define STATUS_WAIT_1 ((NTSTATUS) 0x00000001L) +#endif + +#ifndef STATUS_WAIT_2 +# define STATUS_WAIT_2 ((NTSTATUS) 0x00000002L) +#endif + +#ifndef STATUS_WAIT_3 +# define STATUS_WAIT_3 ((NTSTATUS) 0x00000003L) +#endif + +#ifndef STATUS_WAIT_63 +# define STATUS_WAIT_63 ((NTSTATUS) 0x0000003FL) +#endif + +#ifndef STATUS_ABANDONED +# define STATUS_ABANDONED ((NTSTATUS) 0x00000080L) +#endif + +#ifndef STATUS_ABANDONED_WAIT_0 +# define STATUS_ABANDONED_WAIT_0 ((NTSTATUS) 0x00000080L) +#endif + +#ifndef STATUS_ABANDONED_WAIT_63 +# define STATUS_ABANDONED_WAIT_63 ((NTSTATUS) 0x000000BFL) +#endif + +#ifndef STATUS_USER_APC +# define STATUS_USER_APC ((NTSTATUS) 0x000000C0L) +#endif + +#ifndef STATUS_KERNEL_APC +# define STATUS_KERNEL_APC ((NTSTATUS) 0x00000100L) +#endif + +#ifndef STATUS_ALERTED +# define STATUS_ALERTED ((NTSTATUS) 0x00000101L) +#endif + +#ifndef STATUS_TIMEOUT +# define STATUS_TIMEOUT ((NTSTATUS) 0x00000102L) +#endif + +#ifndef STATUS_PENDING +# define STATUS_PENDING ((NTSTATUS) 0x00000103L) +#endif + +#ifndef STATUS_REPARSE +# define STATUS_REPARSE ((NTSTATUS) 0x00000104L) +#endif + +#ifndef STATUS_MORE_ENTRIES +# define STATUS_MORE_ENTRIES ((NTSTATUS) 0x00000105L) +#endif + +#ifndef STATUS_NOT_ALL_ASSIGNED +# define STATUS_NOT_ALL_ASSIGNED ((NTSTATUS) 0x00000106L) +#endif + +#ifndef STATUS_SOME_NOT_MAPPED +# define STATUS_SOME_NOT_MAPPED ((NTSTATUS) 0x00000107L) +#endif + +#ifndef STATUS_OPLOCK_BREAK_IN_PROGRESS +# define STATUS_OPLOCK_BREAK_IN_PROGRESS ((NTSTATUS) 0x00000108L) +#endif + +#ifndef STATUS_VOLUME_MOUNTED +# define STATUS_VOLUME_MOUNTED ((NTSTATUS) 0x00000109L) +#endif + +#ifndef STATUS_RXACT_COMMITTED +# define STATUS_RXACT_COMMITTED ((NTSTATUS) 0x0000010AL) +#endif + +#ifndef STATUS_NOTIFY_CLEANUP +# define STATUS_NOTIFY_CLEANUP ((NTSTATUS) 0x0000010BL) +#endif + +#ifndef STATUS_NOTIFY_ENUM_DIR +# define STATUS_NOTIFY_ENUM_DIR ((NTSTATUS) 0x0000010CL) +#endif + +#ifndef STATUS_NO_QUOTAS_FOR_ACCOUNT +# define STATUS_NO_QUOTAS_FOR_ACCOUNT ((NTSTATUS) 0x0000010DL) +#endif + +#ifndef STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED +# define STATUS_PRIMARY_TRANSPORT_CONNECT_FAILED ((NTSTATUS) 0x0000010EL) +#endif + +#ifndef STATUS_PAGE_FAULT_TRANSITION +# define STATUS_PAGE_FAULT_TRANSITION ((NTSTATUS) 0x00000110L) +#endif + +#ifndef STATUS_PAGE_FAULT_DEMAND_ZERO +# define STATUS_PAGE_FAULT_DEMAND_ZERO ((NTSTATUS) 0x00000111L) +#endif + +#ifndef STATUS_PAGE_FAULT_COPY_ON_WRITE +# define STATUS_PAGE_FAULT_COPY_ON_WRITE ((NTSTATUS) 0x00000112L) +#endif + +#ifndef STATUS_PAGE_FAULT_GUARD_PAGE +# define STATUS_PAGE_FAULT_GUARD_PAGE ((NTSTATUS) 0x00000113L) +#endif + +#ifndef STATUS_PAGE_FAULT_PAGING_FILE +# define STATUS_PAGE_FAULT_PAGING_FILE ((NTSTATUS) 0x00000114L) +#endif + +#ifndef STATUS_CACHE_PAGE_LOCKED +# define STATUS_CACHE_PAGE_LOCKED ((NTSTATUS) 0x00000115L) +#endif + +#ifndef STATUS_CRASH_DUMP +# define STATUS_CRASH_DUMP ((NTSTATUS) 0x00000116L) +#endif + +#ifndef STATUS_BUFFER_ALL_ZEROS +# define STATUS_BUFFER_ALL_ZEROS ((NTSTATUS) 0x00000117L) +#endif + +#ifndef STATUS_REPARSE_OBJECT +# define STATUS_REPARSE_OBJECT ((NTSTATUS) 0x00000118L) +#endif + +#ifndef STATUS_RESOURCE_REQUIREMENTS_CHANGED +# define STATUS_RESOURCE_REQUIREMENTS_CHANGED ((NTSTATUS) 0x00000119L) +#endif + +#ifndef STATUS_TRANSLATION_COMPLETE +# define STATUS_TRANSLATION_COMPLETE ((NTSTATUS) 0x00000120L) +#endif + +#ifndef STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY +# define STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY ((NTSTATUS) 0x00000121L) +#endif + +#ifndef STATUS_NOTHING_TO_TERMINATE +# define STATUS_NOTHING_TO_TERMINATE ((NTSTATUS) 0x00000122L) +#endif + +#ifndef STATUS_PROCESS_NOT_IN_JOB +# define STATUS_PROCESS_NOT_IN_JOB ((NTSTATUS) 0x00000123L) +#endif + +#ifndef STATUS_PROCESS_IN_JOB +# define STATUS_PROCESS_IN_JOB ((NTSTATUS) 0x00000124L) +#endif + +#ifndef STATUS_VOLSNAP_HIBERNATE_READY +# define STATUS_VOLSNAP_HIBERNATE_READY ((NTSTATUS) 0x00000125L) +#endif + +#ifndef STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY +# define STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY ((NTSTATUS) 0x00000126L) +#endif + +#ifndef STATUS_INTERRUPT_VECTOR_ALREADY_CONNECTED +# define STATUS_INTERRUPT_VECTOR_ALREADY_CONNECTED ((NTSTATUS) 0x00000127L) +#endif + +#ifndef STATUS_INTERRUPT_STILL_CONNECTED +# define STATUS_INTERRUPT_STILL_CONNECTED ((NTSTATUS) 0x00000128L) +#endif + +#ifndef STATUS_PROCESS_CLONED +# define STATUS_PROCESS_CLONED ((NTSTATUS) 0x00000129L) +#endif + +#ifndef STATUS_FILE_LOCKED_WITH_ONLY_READERS +# define STATUS_FILE_LOCKED_WITH_ONLY_READERS ((NTSTATUS) 0x0000012AL) +#endif + +#ifndef STATUS_FILE_LOCKED_WITH_WRITERS +# define STATUS_FILE_LOCKED_WITH_WRITERS ((NTSTATUS) 0x0000012BL) +#endif + +#ifndef STATUS_RESOURCEMANAGER_READ_ONLY +# define STATUS_RESOURCEMANAGER_READ_ONLY ((NTSTATUS) 0x00000202L) +#endif + +#ifndef STATUS_RING_PREVIOUSLY_EMPTY +# define STATUS_RING_PREVIOUSLY_EMPTY ((NTSTATUS) 0x00000210L) +#endif + +#ifndef STATUS_RING_PREVIOUSLY_FULL +# define STATUS_RING_PREVIOUSLY_FULL ((NTSTATUS) 0x00000211L) +#endif + +#ifndef STATUS_RING_PREVIOUSLY_ABOVE_QUOTA +# define STATUS_RING_PREVIOUSLY_ABOVE_QUOTA ((NTSTATUS) 0x00000212L) +#endif + +#ifndef STATUS_RING_NEWLY_EMPTY +# define STATUS_RING_NEWLY_EMPTY ((NTSTATUS) 0x00000213L) +#endif + +#ifndef STATUS_RING_SIGNAL_OPPOSITE_ENDPOINT +# define STATUS_RING_SIGNAL_OPPOSITE_ENDPOINT ((NTSTATUS) 0x00000214L) +#endif + +#ifndef STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE +# define STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE ((NTSTATUS) 0x00000215L) +#endif + +#ifndef STATUS_OPLOCK_HANDLE_CLOSED +# define STATUS_OPLOCK_HANDLE_CLOSED ((NTSTATUS) 0x00000216L) +#endif + +#ifndef STATUS_WAIT_FOR_OPLOCK +# define STATUS_WAIT_FOR_OPLOCK ((NTSTATUS) 0x00000367L) +#endif + +#ifndef STATUS_OBJECT_NAME_EXISTS +# define STATUS_OBJECT_NAME_EXISTS ((NTSTATUS) 0x40000000L) +#endif + +#ifndef STATUS_THREAD_WAS_SUSPENDED +# define STATUS_THREAD_WAS_SUSPENDED ((NTSTATUS) 0x40000001L) +#endif + +#ifndef STATUS_WORKING_SET_LIMIT_RANGE +# define STATUS_WORKING_SET_LIMIT_RANGE ((NTSTATUS) 0x40000002L) +#endif + +#ifndef STATUS_IMAGE_NOT_AT_BASE +# define STATUS_IMAGE_NOT_AT_BASE ((NTSTATUS) 0x40000003L) +#endif + +#ifndef STATUS_RXACT_STATE_CREATED +# define STATUS_RXACT_STATE_CREATED ((NTSTATUS) 0x40000004L) +#endif + +#ifndef STATUS_SEGMENT_NOTIFICATION +# define STATUS_SEGMENT_NOTIFICATION ((NTSTATUS) 0x40000005L) +#endif + +#ifndef STATUS_LOCAL_USER_SESSION_KEY +# define STATUS_LOCAL_USER_SESSION_KEY ((NTSTATUS) 0x40000006L) +#endif + +#ifndef STATUS_BAD_CURRENT_DIRECTORY +# define STATUS_BAD_CURRENT_DIRECTORY ((NTSTATUS) 0x40000007L) +#endif + +#ifndef STATUS_SERIAL_MORE_WRITES +# define STATUS_SERIAL_MORE_WRITES ((NTSTATUS) 0x40000008L) +#endif + +#ifndef STATUS_REGISTRY_RECOVERED +# define STATUS_REGISTRY_RECOVERED ((NTSTATUS) 0x40000009L) +#endif + +#ifndef STATUS_FT_READ_RECOVERY_FROM_BACKUP +# define STATUS_FT_READ_RECOVERY_FROM_BACKUP ((NTSTATUS) 0x4000000AL) +#endif + +#ifndef STATUS_FT_WRITE_RECOVERY +# define STATUS_FT_WRITE_RECOVERY ((NTSTATUS) 0x4000000BL) +#endif + +#ifndef STATUS_SERIAL_COUNTER_TIMEOUT +# define STATUS_SERIAL_COUNTER_TIMEOUT ((NTSTATUS) 0x4000000CL) +#endif + +#ifndef STATUS_NULL_LM_PASSWORD +# define STATUS_NULL_LM_PASSWORD ((NTSTATUS) 0x4000000DL) +#endif + +#ifndef STATUS_IMAGE_MACHINE_TYPE_MISMATCH +# define STATUS_IMAGE_MACHINE_TYPE_MISMATCH ((NTSTATUS) 0x4000000EL) +#endif + +#ifndef STATUS_RECEIVE_PARTIAL +# define STATUS_RECEIVE_PARTIAL ((NTSTATUS) 0x4000000FL) +#endif + +#ifndef STATUS_RECEIVE_EXPEDITED +# define STATUS_RECEIVE_EXPEDITED ((NTSTATUS) 0x40000010L) +#endif + +#ifndef STATUS_RECEIVE_PARTIAL_EXPEDITED +# define STATUS_RECEIVE_PARTIAL_EXPEDITED ((NTSTATUS) 0x40000011L) +#endif + +#ifndef STATUS_EVENT_DONE +# define STATUS_EVENT_DONE ((NTSTATUS) 0x40000012L) +#endif + +#ifndef STATUS_EVENT_PENDING +# define STATUS_EVENT_PENDING ((NTSTATUS) 0x40000013L) +#endif + +#ifndef STATUS_CHECKING_FILE_SYSTEM +# define STATUS_CHECKING_FILE_SYSTEM ((NTSTATUS) 0x40000014L) +#endif + +#ifndef STATUS_FATAL_APP_EXIT +# define STATUS_FATAL_APP_EXIT ((NTSTATUS) 0x40000015L) +#endif + +#ifndef STATUS_PREDEFINED_HANDLE +# define STATUS_PREDEFINED_HANDLE ((NTSTATUS) 0x40000016L) +#endif + +#ifndef STATUS_WAS_UNLOCKED +# define STATUS_WAS_UNLOCKED ((NTSTATUS) 0x40000017L) +#endif + +#ifndef STATUS_SERVICE_NOTIFICATION +# define STATUS_SERVICE_NOTIFICATION ((NTSTATUS) 0x40000018L) +#endif + +#ifndef STATUS_WAS_LOCKED +# define STATUS_WAS_LOCKED ((NTSTATUS) 0x40000019L) +#endif + +#ifndef STATUS_LOG_HARD_ERROR +# define STATUS_LOG_HARD_ERROR ((NTSTATUS) 0x4000001AL) +#endif + +#ifndef STATUS_ALREADY_WIN32 +# define STATUS_ALREADY_WIN32 ((NTSTATUS) 0x4000001BL) +#endif + +#ifndef STATUS_WX86_UNSIMULATE +# define STATUS_WX86_UNSIMULATE ((NTSTATUS) 0x4000001CL) +#endif + +#ifndef STATUS_WX86_CONTINUE +# define STATUS_WX86_CONTINUE ((NTSTATUS) 0x4000001DL) +#endif + +#ifndef STATUS_WX86_SINGLE_STEP +# define STATUS_WX86_SINGLE_STEP ((NTSTATUS) 0x4000001EL) +#endif + +#ifndef STATUS_WX86_BREAKPOINT +# define STATUS_WX86_BREAKPOINT ((NTSTATUS) 0x4000001FL) +#endif + +#ifndef STATUS_WX86_EXCEPTION_CONTINUE +# define STATUS_WX86_EXCEPTION_CONTINUE ((NTSTATUS) 0x40000020L) +#endif + +#ifndef STATUS_WX86_EXCEPTION_LASTCHANCE +# define STATUS_WX86_EXCEPTION_LASTCHANCE ((NTSTATUS) 0x40000021L) +#endif + +#ifndef STATUS_WX86_EXCEPTION_CHAIN +# define STATUS_WX86_EXCEPTION_CHAIN ((NTSTATUS) 0x40000022L) +#endif + +#ifndef STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE +# define STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE ((NTSTATUS) 0x40000023L) +#endif + +#ifndef STATUS_NO_YIELD_PERFORMED +# define STATUS_NO_YIELD_PERFORMED ((NTSTATUS) 0x40000024L) +#endif + +#ifndef STATUS_TIMER_RESUME_IGNORED +# define STATUS_TIMER_RESUME_IGNORED ((NTSTATUS) 0x40000025L) +#endif + +#ifndef STATUS_ARBITRATION_UNHANDLED +# define STATUS_ARBITRATION_UNHANDLED ((NTSTATUS) 0x40000026L) +#endif + +#ifndef STATUS_CARDBUS_NOT_SUPPORTED +# define STATUS_CARDBUS_NOT_SUPPORTED ((NTSTATUS) 0x40000027L) +#endif + +#ifndef STATUS_WX86_CREATEWX86TIB +# define STATUS_WX86_CREATEWX86TIB ((NTSTATUS) 0x40000028L) +#endif + +#ifndef STATUS_MP_PROCESSOR_MISMATCH +# define STATUS_MP_PROCESSOR_MISMATCH ((NTSTATUS) 0x40000029L) +#endif + +#ifndef STATUS_HIBERNATED +# define STATUS_HIBERNATED ((NTSTATUS) 0x4000002AL) +#endif + +#ifndef STATUS_RESUME_HIBERNATION +# define STATUS_RESUME_HIBERNATION ((NTSTATUS) 0x4000002BL) +#endif + +#ifndef STATUS_FIRMWARE_UPDATED +# define STATUS_FIRMWARE_UPDATED ((NTSTATUS) 0x4000002CL) +#endif + +#ifndef STATUS_DRIVERS_LEAKING_LOCKED_PAGES +# define STATUS_DRIVERS_LEAKING_LOCKED_PAGES ((NTSTATUS) 0x4000002DL) +#endif + +#ifndef STATUS_MESSAGE_RETRIEVED +# define STATUS_MESSAGE_RETRIEVED ((NTSTATUS) 0x4000002EL) +#endif + +#ifndef STATUS_SYSTEM_POWERSTATE_TRANSITION +# define STATUS_SYSTEM_POWERSTATE_TRANSITION ((NTSTATUS) 0x4000002FL) +#endif + +#ifndef STATUS_ALPC_CHECK_COMPLETION_LIST +# define STATUS_ALPC_CHECK_COMPLETION_LIST ((NTSTATUS) 0x40000030L) +#endif + +#ifndef STATUS_SYSTEM_POWERSTATE_COMPLEX_TRANSITION +# define STATUS_SYSTEM_POWERSTATE_COMPLEX_TRANSITION ((NTSTATUS) 0x40000031L) +#endif + +#ifndef STATUS_ACCESS_AUDIT_BY_POLICY +# define STATUS_ACCESS_AUDIT_BY_POLICY ((NTSTATUS) 0x40000032L) +#endif + +#ifndef STATUS_ABANDON_HIBERFILE +# define STATUS_ABANDON_HIBERFILE ((NTSTATUS) 0x40000033L) +#endif + +#ifndef STATUS_BIZRULES_NOT_ENABLED +# define STATUS_BIZRULES_NOT_ENABLED ((NTSTATUS) 0x40000034L) +#endif + +#ifndef STATUS_GUARD_PAGE_VIOLATION +# define STATUS_GUARD_PAGE_VIOLATION ((NTSTATUS) 0x80000001L) +#endif + +#ifndef STATUS_DATATYPE_MISALIGNMENT +# define STATUS_DATATYPE_MISALIGNMENT ((NTSTATUS) 0x80000002L) +#endif + +#ifndef STATUS_BREAKPOINT +# define STATUS_BREAKPOINT ((NTSTATUS) 0x80000003L) +#endif + +#ifndef STATUS_SINGLE_STEP +# define STATUS_SINGLE_STEP ((NTSTATUS) 0x80000004L) +#endif + +#ifndef STATUS_BUFFER_OVERFLOW +# define STATUS_BUFFER_OVERFLOW ((NTSTATUS) 0x80000005L) +#endif + +#ifndef STATUS_NO_MORE_FILES +# define STATUS_NO_MORE_FILES ((NTSTATUS) 0x80000006L) +#endif + +#ifndef STATUS_WAKE_SYSTEM_DEBUGGER +# define STATUS_WAKE_SYSTEM_DEBUGGER ((NTSTATUS) 0x80000007L) +#endif + +#ifndef STATUS_HANDLES_CLOSED +# define STATUS_HANDLES_CLOSED ((NTSTATUS) 0x8000000AL) +#endif + +#ifndef STATUS_NO_INHERITANCE +# define STATUS_NO_INHERITANCE ((NTSTATUS) 0x8000000BL) +#endif + +#ifndef STATUS_GUID_SUBSTITUTION_MADE +# define STATUS_GUID_SUBSTITUTION_MADE ((NTSTATUS) 0x8000000CL) +#endif + +#ifndef STATUS_PARTIAL_COPY +# define STATUS_PARTIAL_COPY ((NTSTATUS) 0x8000000DL) +#endif + +#ifndef STATUS_DEVICE_PAPER_EMPTY +# define STATUS_DEVICE_PAPER_EMPTY ((NTSTATUS) 0x8000000EL) +#endif + +#ifndef STATUS_DEVICE_POWERED_OFF +# define STATUS_DEVICE_POWERED_OFF ((NTSTATUS) 0x8000000FL) +#endif + +#ifndef STATUS_DEVICE_OFF_LINE +# define STATUS_DEVICE_OFF_LINE ((NTSTATUS) 0x80000010L) +#endif + +#ifndef STATUS_DEVICE_BUSY +# define STATUS_DEVICE_BUSY ((NTSTATUS) 0x80000011L) +#endif + +#ifndef STATUS_NO_MORE_EAS +# define STATUS_NO_MORE_EAS ((NTSTATUS) 0x80000012L) +#endif + +#ifndef STATUS_INVALID_EA_NAME +# define STATUS_INVALID_EA_NAME ((NTSTATUS) 0x80000013L) +#endif + +#ifndef STATUS_EA_LIST_INCONSISTENT +# define STATUS_EA_LIST_INCONSISTENT ((NTSTATUS) 0x80000014L) +#endif + +#ifndef STATUS_INVALID_EA_FLAG +# define STATUS_INVALID_EA_FLAG ((NTSTATUS) 0x80000015L) +#endif + +#ifndef STATUS_VERIFY_REQUIRED +# define STATUS_VERIFY_REQUIRED ((NTSTATUS) 0x80000016L) +#endif + +#ifndef STATUS_EXTRANEOUS_INFORMATION +# define STATUS_EXTRANEOUS_INFORMATION ((NTSTATUS) 0x80000017L) +#endif + +#ifndef STATUS_RXACT_COMMIT_NECESSARY +# define STATUS_RXACT_COMMIT_NECESSARY ((NTSTATUS) 0x80000018L) +#endif + +#ifndef STATUS_NO_MORE_ENTRIES +# define STATUS_NO_MORE_ENTRIES ((NTSTATUS) 0x8000001AL) +#endif + +#ifndef STATUS_FILEMARK_DETECTED +# define STATUS_FILEMARK_DETECTED ((NTSTATUS) 0x8000001BL) +#endif + +#ifndef STATUS_MEDIA_CHANGED +# define STATUS_MEDIA_CHANGED ((NTSTATUS) 0x8000001CL) +#endif + +#ifndef STATUS_BUS_RESET +# define STATUS_BUS_RESET ((NTSTATUS) 0x8000001DL) +#endif + +#ifndef STATUS_END_OF_MEDIA +# define STATUS_END_OF_MEDIA ((NTSTATUS) 0x8000001EL) +#endif + +#ifndef STATUS_BEGINNING_OF_MEDIA +# define STATUS_BEGINNING_OF_MEDIA ((NTSTATUS) 0x8000001FL) +#endif + +#ifndef STATUS_MEDIA_CHECK +# define STATUS_MEDIA_CHECK ((NTSTATUS) 0x80000020L) +#endif + +#ifndef STATUS_SETMARK_DETECTED +# define STATUS_SETMARK_DETECTED ((NTSTATUS) 0x80000021L) +#endif + +#ifndef STATUS_NO_DATA_DETECTED +# define STATUS_NO_DATA_DETECTED ((NTSTATUS) 0x80000022L) +#endif + +#ifndef STATUS_REDIRECTOR_HAS_OPEN_HANDLES +# define STATUS_REDIRECTOR_HAS_OPEN_HANDLES ((NTSTATUS) 0x80000023L) +#endif + +#ifndef STATUS_SERVER_HAS_OPEN_HANDLES +# define STATUS_SERVER_HAS_OPEN_HANDLES ((NTSTATUS) 0x80000024L) +#endif + +#ifndef STATUS_ALREADY_DISCONNECTED +# define STATUS_ALREADY_DISCONNECTED ((NTSTATUS) 0x80000025L) +#endif + +#ifndef STATUS_LONGJUMP +# define STATUS_LONGJUMP ((NTSTATUS) 0x80000026L) +#endif + +#ifndef STATUS_CLEANER_CARTRIDGE_INSTALLED +# define STATUS_CLEANER_CARTRIDGE_INSTALLED ((NTSTATUS) 0x80000027L) +#endif + +#ifndef STATUS_PLUGPLAY_QUERY_VETOED +# define STATUS_PLUGPLAY_QUERY_VETOED ((NTSTATUS) 0x80000028L) +#endif + +#ifndef STATUS_UNWIND_CONSOLIDATE +# define STATUS_UNWIND_CONSOLIDATE ((NTSTATUS) 0x80000029L) +#endif + +#ifndef STATUS_REGISTRY_HIVE_RECOVERED +# define STATUS_REGISTRY_HIVE_RECOVERED ((NTSTATUS) 0x8000002AL) +#endif + +#ifndef STATUS_DLL_MIGHT_BE_INSECURE +# define STATUS_DLL_MIGHT_BE_INSECURE ((NTSTATUS) 0x8000002BL) +#endif + +#ifndef STATUS_DLL_MIGHT_BE_INCOMPATIBLE +# define STATUS_DLL_MIGHT_BE_INCOMPATIBLE ((NTSTATUS) 0x8000002CL) +#endif + +#ifndef STATUS_STOPPED_ON_SYMLINK +# define STATUS_STOPPED_ON_SYMLINK ((NTSTATUS) 0x8000002DL) +#endif + +#ifndef STATUS_CANNOT_GRANT_REQUESTED_OPLOCK +# define STATUS_CANNOT_GRANT_REQUESTED_OPLOCK ((NTSTATUS) 0x8000002EL) +#endif + +#ifndef STATUS_NO_ACE_CONDITION +# define STATUS_NO_ACE_CONDITION ((NTSTATUS) 0x8000002FL) +#endif + +#ifndef STATUS_UNSUCCESSFUL +# define STATUS_UNSUCCESSFUL ((NTSTATUS) 0xC0000001L) +#endif + +#ifndef STATUS_NOT_IMPLEMENTED +# define STATUS_NOT_IMPLEMENTED ((NTSTATUS) 0xC0000002L) +#endif + +#ifndef STATUS_INVALID_INFO_CLASS +# define STATUS_INVALID_INFO_CLASS ((NTSTATUS) 0xC0000003L) +#endif + +#ifndef STATUS_INFO_LENGTH_MISMATCH +# define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS) 0xC0000004L) +#endif + +#ifndef STATUS_ACCESS_VIOLATION +# define STATUS_ACCESS_VIOLATION ((NTSTATUS) 0xC0000005L) +#endif + +#ifndef STATUS_IN_PAGE_ERROR +# define STATUS_IN_PAGE_ERROR ((NTSTATUS) 0xC0000006L) +#endif + +#ifndef STATUS_PAGEFILE_QUOTA +# define STATUS_PAGEFILE_QUOTA ((NTSTATUS) 0xC0000007L) +#endif + +#ifndef STATUS_INVALID_HANDLE +# define STATUS_INVALID_HANDLE ((NTSTATUS) 0xC0000008L) +#endif + +#ifndef STATUS_BAD_INITIAL_STACK +# define STATUS_BAD_INITIAL_STACK ((NTSTATUS) 0xC0000009L) +#endif + +#ifndef STATUS_BAD_INITIAL_PC +# define STATUS_BAD_INITIAL_PC ((NTSTATUS) 0xC000000AL) +#endif + +#ifndef STATUS_INVALID_CID +# define STATUS_INVALID_CID ((NTSTATUS) 0xC000000BL) +#endif + +#ifndef STATUS_TIMER_NOT_CANCELED +# define STATUS_TIMER_NOT_CANCELED ((NTSTATUS) 0xC000000CL) +#endif + +#ifndef STATUS_INVALID_PARAMETER +# define STATUS_INVALID_PARAMETER ((NTSTATUS) 0xC000000DL) +#endif + +#ifndef STATUS_NO_SUCH_DEVICE +# define STATUS_NO_SUCH_DEVICE ((NTSTATUS) 0xC000000EL) +#endif + +#ifndef STATUS_NO_SUCH_FILE +# define STATUS_NO_SUCH_FILE ((NTSTATUS) 0xC000000FL) +#endif + +#ifndef STATUS_INVALID_DEVICE_REQUEST +# define STATUS_INVALID_DEVICE_REQUEST ((NTSTATUS) 0xC0000010L) +#endif + +#ifndef STATUS_END_OF_FILE +# define STATUS_END_OF_FILE ((NTSTATUS) 0xC0000011L) +#endif + +#ifndef STATUS_WRONG_VOLUME +# define STATUS_WRONG_VOLUME ((NTSTATUS) 0xC0000012L) +#endif + +#ifndef STATUS_NO_MEDIA_IN_DEVICE +# define STATUS_NO_MEDIA_IN_DEVICE ((NTSTATUS) 0xC0000013L) +#endif + +#ifndef STATUS_UNRECOGNIZED_MEDIA +# define STATUS_UNRECOGNIZED_MEDIA ((NTSTATUS) 0xC0000014L) +#endif + +#ifndef STATUS_NONEXISTENT_SECTOR +# define STATUS_NONEXISTENT_SECTOR ((NTSTATUS) 0xC0000015L) +#endif + +#ifndef STATUS_MORE_PROCESSING_REQUIRED +# define STATUS_MORE_PROCESSING_REQUIRED ((NTSTATUS) 0xC0000016L) +#endif + +#ifndef STATUS_NO_MEMORY +# define STATUS_NO_MEMORY ((NTSTATUS) 0xC0000017L) +#endif + +#ifndef STATUS_CONFLICTING_ADDRESSES +# define STATUS_CONFLICTING_ADDRESSES ((NTSTATUS) 0xC0000018L) +#endif + +#ifndef STATUS_NOT_MAPPED_VIEW +# define STATUS_NOT_MAPPED_VIEW ((NTSTATUS) 0xC0000019L) +#endif + +#ifndef STATUS_UNABLE_TO_FREE_VM +# define STATUS_UNABLE_TO_FREE_VM ((NTSTATUS) 0xC000001AL) +#endif + +#ifndef STATUS_UNABLE_TO_DELETE_SECTION +# define STATUS_UNABLE_TO_DELETE_SECTION ((NTSTATUS) 0xC000001BL) +#endif + +#ifndef STATUS_INVALID_SYSTEM_SERVICE +# define STATUS_INVALID_SYSTEM_SERVICE ((NTSTATUS) 0xC000001CL) +#endif + +#ifndef STATUS_ILLEGAL_INSTRUCTION +# define STATUS_ILLEGAL_INSTRUCTION ((NTSTATUS) 0xC000001DL) +#endif + +#ifndef STATUS_INVALID_LOCK_SEQUENCE +# define STATUS_INVALID_LOCK_SEQUENCE ((NTSTATUS) 0xC000001EL) +#endif + +#ifndef STATUS_INVALID_VIEW_SIZE +# define STATUS_INVALID_VIEW_SIZE ((NTSTATUS) 0xC000001FL) +#endif + +#ifndef STATUS_INVALID_FILE_FOR_SECTION +# define STATUS_INVALID_FILE_FOR_SECTION ((NTSTATUS) 0xC0000020L) +#endif + +#ifndef STATUS_ALREADY_COMMITTED +# define STATUS_ALREADY_COMMITTED ((NTSTATUS) 0xC0000021L) +#endif + +#ifndef STATUS_ACCESS_DENIED +# define STATUS_ACCESS_DENIED ((NTSTATUS) 0xC0000022L) +#endif + +#ifndef STATUS_BUFFER_TOO_SMALL +# define STATUS_BUFFER_TOO_SMALL ((NTSTATUS) 0xC0000023L) +#endif + +#ifndef STATUS_OBJECT_TYPE_MISMATCH +# define STATUS_OBJECT_TYPE_MISMATCH ((NTSTATUS) 0xC0000024L) +#endif + +#ifndef STATUS_NONCONTINUABLE_EXCEPTION +# define STATUS_NONCONTINUABLE_EXCEPTION ((NTSTATUS) 0xC0000025L) +#endif + +#ifndef STATUS_INVALID_DISPOSITION +# define STATUS_INVALID_DISPOSITION ((NTSTATUS) 0xC0000026L) +#endif + +#ifndef STATUS_UNWIND +# define STATUS_UNWIND ((NTSTATUS) 0xC0000027L) +#endif + +#ifndef STATUS_BAD_STACK +# define STATUS_BAD_STACK ((NTSTATUS) 0xC0000028L) +#endif + +#ifndef STATUS_INVALID_UNWIND_TARGET +# define STATUS_INVALID_UNWIND_TARGET ((NTSTATUS) 0xC0000029L) +#endif + +#ifndef STATUS_NOT_LOCKED +# define STATUS_NOT_LOCKED ((NTSTATUS) 0xC000002AL) +#endif + +#ifndef STATUS_PARITY_ERROR +# define STATUS_PARITY_ERROR ((NTSTATUS) 0xC000002BL) +#endif + +#ifndef STATUS_UNABLE_TO_DECOMMIT_VM +# define STATUS_UNABLE_TO_DECOMMIT_VM ((NTSTATUS) 0xC000002CL) +#endif + +#ifndef STATUS_NOT_COMMITTED +# define STATUS_NOT_COMMITTED ((NTSTATUS) 0xC000002DL) +#endif + +#ifndef STATUS_INVALID_PORT_ATTRIBUTES +# define STATUS_INVALID_PORT_ATTRIBUTES ((NTSTATUS) 0xC000002EL) +#endif + +#ifndef STATUS_PORT_MESSAGE_TOO_LONG +# define STATUS_PORT_MESSAGE_TOO_LONG ((NTSTATUS) 0xC000002FL) +#endif + +#ifndef STATUS_INVALID_PARAMETER_MIX +# define STATUS_INVALID_PARAMETER_MIX ((NTSTATUS) 0xC0000030L) +#endif + +#ifndef STATUS_INVALID_QUOTA_LOWER +# define STATUS_INVALID_QUOTA_LOWER ((NTSTATUS) 0xC0000031L) +#endif + +#ifndef STATUS_DISK_CORRUPT_ERROR +# define STATUS_DISK_CORRUPT_ERROR ((NTSTATUS) 0xC0000032L) +#endif + +#ifndef STATUS_OBJECT_NAME_INVALID +# define STATUS_OBJECT_NAME_INVALID ((NTSTATUS) 0xC0000033L) +#endif + +#ifndef STATUS_OBJECT_NAME_NOT_FOUND +# define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS) 0xC0000034L) +#endif + +#ifndef STATUS_OBJECT_NAME_COLLISION +# define STATUS_OBJECT_NAME_COLLISION ((NTSTATUS) 0xC0000035L) +#endif + +#ifndef STATUS_PORT_DISCONNECTED +# define STATUS_PORT_DISCONNECTED ((NTSTATUS) 0xC0000037L) +#endif + +#ifndef STATUS_DEVICE_ALREADY_ATTACHED +# define STATUS_DEVICE_ALREADY_ATTACHED ((NTSTATUS) 0xC0000038L) +#endif + +#ifndef STATUS_OBJECT_PATH_INVALID +# define STATUS_OBJECT_PATH_INVALID ((NTSTATUS) 0xC0000039L) +#endif + +#ifndef STATUS_OBJECT_PATH_NOT_FOUND +# define STATUS_OBJECT_PATH_NOT_FOUND ((NTSTATUS) 0xC000003AL) +#endif + +#ifndef STATUS_OBJECT_PATH_SYNTAX_BAD +# define STATUS_OBJECT_PATH_SYNTAX_BAD ((NTSTATUS) 0xC000003BL) +#endif + +#ifndef STATUS_DATA_OVERRUN +# define STATUS_DATA_OVERRUN ((NTSTATUS) 0xC000003CL) +#endif + +#ifndef STATUS_DATA_LATE_ERROR +# define STATUS_DATA_LATE_ERROR ((NTSTATUS) 0xC000003DL) +#endif + +#ifndef STATUS_DATA_ERROR +# define STATUS_DATA_ERROR ((NTSTATUS) 0xC000003EL) +#endif + +#ifndef STATUS_CRC_ERROR +# define STATUS_CRC_ERROR ((NTSTATUS) 0xC000003FL) +#endif + +#ifndef STATUS_SECTION_TOO_BIG +# define STATUS_SECTION_TOO_BIG ((NTSTATUS) 0xC0000040L) +#endif + +#ifndef STATUS_PORT_CONNECTION_REFUSED +# define STATUS_PORT_CONNECTION_REFUSED ((NTSTATUS) 0xC0000041L) +#endif + +#ifndef STATUS_INVALID_PORT_HANDLE +# define STATUS_INVALID_PORT_HANDLE ((NTSTATUS) 0xC0000042L) +#endif + +#ifndef STATUS_SHARING_VIOLATION +# define STATUS_SHARING_VIOLATION ((NTSTATUS) 0xC0000043L) +#endif + +#ifndef STATUS_QUOTA_EXCEEDED +# define STATUS_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000044L) +#endif + +#ifndef STATUS_INVALID_PAGE_PROTECTION +# define STATUS_INVALID_PAGE_PROTECTION ((NTSTATUS) 0xC0000045L) +#endif + +#ifndef STATUS_MUTANT_NOT_OWNED +# define STATUS_MUTANT_NOT_OWNED ((NTSTATUS) 0xC0000046L) +#endif + +#ifndef STATUS_SEMAPHORE_LIMIT_EXCEEDED +# define STATUS_SEMAPHORE_LIMIT_EXCEEDED ((NTSTATUS) 0xC0000047L) +#endif + +#ifndef STATUS_PORT_ALREADY_SET +# define STATUS_PORT_ALREADY_SET ((NTSTATUS) 0xC0000048L) +#endif + +#ifndef STATUS_SECTION_NOT_IMAGE +# define STATUS_SECTION_NOT_IMAGE ((NTSTATUS) 0xC0000049L) +#endif + +#ifndef STATUS_SUSPEND_COUNT_EXCEEDED +# define STATUS_SUSPEND_COUNT_EXCEEDED ((NTSTATUS) 0xC000004AL) +#endif + +#ifndef STATUS_THREAD_IS_TERMINATING +# define STATUS_THREAD_IS_TERMINATING ((NTSTATUS) 0xC000004BL) +#endif + +#ifndef STATUS_BAD_WORKING_SET_LIMIT +# define STATUS_BAD_WORKING_SET_LIMIT ((NTSTATUS) 0xC000004CL) +#endif + +#ifndef STATUS_INCOMPATIBLE_FILE_MAP +# define STATUS_INCOMPATIBLE_FILE_MAP ((NTSTATUS) 0xC000004DL) +#endif + +#ifndef STATUS_SECTION_PROTECTION +# define STATUS_SECTION_PROTECTION ((NTSTATUS) 0xC000004EL) +#endif + +#ifndef STATUS_EAS_NOT_SUPPORTED +# define STATUS_EAS_NOT_SUPPORTED ((NTSTATUS) 0xC000004FL) +#endif + +#ifndef STATUS_EA_TOO_LARGE +# define STATUS_EA_TOO_LARGE ((NTSTATUS) 0xC0000050L) +#endif + +#ifndef STATUS_NONEXISTENT_EA_ENTRY +# define STATUS_NONEXISTENT_EA_ENTRY ((NTSTATUS) 0xC0000051L) +#endif + +#ifndef STATUS_NO_EAS_ON_FILE +# define STATUS_NO_EAS_ON_FILE ((NTSTATUS) 0xC0000052L) +#endif + +#ifndef STATUS_EA_CORRUPT_ERROR +# define STATUS_EA_CORRUPT_ERROR ((NTSTATUS) 0xC0000053L) +#endif + +#ifndef STATUS_FILE_LOCK_CONFLICT +# define STATUS_FILE_LOCK_CONFLICT ((NTSTATUS) 0xC0000054L) +#endif + +#ifndef STATUS_LOCK_NOT_GRANTED +# define STATUS_LOCK_NOT_GRANTED ((NTSTATUS) 0xC0000055L) +#endif + +#ifndef STATUS_DELETE_PENDING +# define STATUS_DELETE_PENDING ((NTSTATUS) 0xC0000056L) +#endif + +#ifndef STATUS_CTL_FILE_NOT_SUPPORTED +# define STATUS_CTL_FILE_NOT_SUPPORTED ((NTSTATUS) 0xC0000057L) +#endif + +#ifndef STATUS_UNKNOWN_REVISION +# define STATUS_UNKNOWN_REVISION ((NTSTATUS) 0xC0000058L) +#endif + +#ifndef STATUS_REVISION_MISMATCH +# define STATUS_REVISION_MISMATCH ((NTSTATUS) 0xC0000059L) +#endif + +#ifndef STATUS_INVALID_OWNER +# define STATUS_INVALID_OWNER ((NTSTATUS) 0xC000005AL) +#endif + +#ifndef STATUS_INVALID_PRIMARY_GROUP +# define STATUS_INVALID_PRIMARY_GROUP ((NTSTATUS) 0xC000005BL) +#endif + +#ifndef STATUS_NO_IMPERSONATION_TOKEN +# define STATUS_NO_IMPERSONATION_TOKEN ((NTSTATUS) 0xC000005CL) +#endif + +#ifndef STATUS_CANT_DISABLE_MANDATORY +# define STATUS_CANT_DISABLE_MANDATORY ((NTSTATUS) 0xC000005DL) +#endif + +#ifndef STATUS_NO_LOGON_SERVERS +# define STATUS_NO_LOGON_SERVERS ((NTSTATUS) 0xC000005EL) +#endif + +#ifndef STATUS_NO_SUCH_LOGON_SESSION +# define STATUS_NO_SUCH_LOGON_SESSION ((NTSTATUS) 0xC000005FL) +#endif + +#ifndef STATUS_NO_SUCH_PRIVILEGE +# define STATUS_NO_SUCH_PRIVILEGE ((NTSTATUS) 0xC0000060L) +#endif + +#ifndef STATUS_PRIVILEGE_NOT_HELD +# define STATUS_PRIVILEGE_NOT_HELD ((NTSTATUS) 0xC0000061L) +#endif + +#ifndef STATUS_INVALID_ACCOUNT_NAME +# define STATUS_INVALID_ACCOUNT_NAME ((NTSTATUS) 0xC0000062L) +#endif + +#ifndef STATUS_USER_EXISTS +# define STATUS_USER_EXISTS ((NTSTATUS) 0xC0000063L) +#endif + +#ifndef STATUS_NO_SUCH_USER +# define STATUS_NO_SUCH_USER ((NTSTATUS) 0xC0000064L) +#endif + +#ifndef STATUS_GROUP_EXISTS +# define STATUS_GROUP_EXISTS ((NTSTATUS) 0xC0000065L) +#endif + +#ifndef STATUS_NO_SUCH_GROUP +# define STATUS_NO_SUCH_GROUP ((NTSTATUS) 0xC0000066L) +#endif + +#ifndef STATUS_MEMBER_IN_GROUP +# define STATUS_MEMBER_IN_GROUP ((NTSTATUS) 0xC0000067L) +#endif + +#ifndef STATUS_MEMBER_NOT_IN_GROUP +# define STATUS_MEMBER_NOT_IN_GROUP ((NTSTATUS) 0xC0000068L) +#endif + +#ifndef STATUS_LAST_ADMIN +# define STATUS_LAST_ADMIN ((NTSTATUS) 0xC0000069L) +#endif + +#ifndef STATUS_WRONG_PASSWORD +# define STATUS_WRONG_PASSWORD ((NTSTATUS) 0xC000006AL) +#endif + +#ifndef STATUS_ILL_FORMED_PASSWORD +# define STATUS_ILL_FORMED_PASSWORD ((NTSTATUS) 0xC000006BL) +#endif + +#ifndef STATUS_PASSWORD_RESTRICTION +# define STATUS_PASSWORD_RESTRICTION ((NTSTATUS) 0xC000006CL) +#endif + +#ifndef STATUS_LOGON_FAILURE +# define STATUS_LOGON_FAILURE ((NTSTATUS) 0xC000006DL) +#endif + +#ifndef STATUS_ACCOUNT_RESTRICTION +# define STATUS_ACCOUNT_RESTRICTION ((NTSTATUS) 0xC000006EL) +#endif + +#ifndef STATUS_INVALID_LOGON_HOURS +# define STATUS_INVALID_LOGON_HOURS ((NTSTATUS) 0xC000006FL) +#endif + +#ifndef STATUS_INVALID_WORKSTATION +# define STATUS_INVALID_WORKSTATION ((NTSTATUS) 0xC0000070L) +#endif + +#ifndef STATUS_PASSWORD_EXPIRED +# define STATUS_PASSWORD_EXPIRED ((NTSTATUS) 0xC0000071L) +#endif + +#ifndef STATUS_ACCOUNT_DISABLED +# define STATUS_ACCOUNT_DISABLED ((NTSTATUS) 0xC0000072L) +#endif + +#ifndef STATUS_NONE_MAPPED +# define STATUS_NONE_MAPPED ((NTSTATUS) 0xC0000073L) +#endif + +#ifndef STATUS_TOO_MANY_LUIDS_REQUESTED +# define STATUS_TOO_MANY_LUIDS_REQUESTED ((NTSTATUS) 0xC0000074L) +#endif + +#ifndef STATUS_LUIDS_EXHAUSTED +# define STATUS_LUIDS_EXHAUSTED ((NTSTATUS) 0xC0000075L) +#endif + +#ifndef STATUS_INVALID_SUB_AUTHORITY +# define STATUS_INVALID_SUB_AUTHORITY ((NTSTATUS) 0xC0000076L) +#endif + +#ifndef STATUS_INVALID_ACL +# define STATUS_INVALID_ACL ((NTSTATUS) 0xC0000077L) +#endif + +#ifndef STATUS_INVALID_SID +# define STATUS_INVALID_SID ((NTSTATUS) 0xC0000078L) +#endif + +#ifndef STATUS_INVALID_SECURITY_DESCR +# define STATUS_INVALID_SECURITY_DESCR ((NTSTATUS) 0xC0000079L) +#endif + +#ifndef STATUS_PROCEDURE_NOT_FOUND +# define STATUS_PROCEDURE_NOT_FOUND ((NTSTATUS) 0xC000007AL) +#endif + +#ifndef STATUS_INVALID_IMAGE_FORMAT +# define STATUS_INVALID_IMAGE_FORMAT ((NTSTATUS) 0xC000007BL) +#endif + +#ifndef STATUS_NO_TOKEN +# define STATUS_NO_TOKEN ((NTSTATUS) 0xC000007CL) +#endif + +#ifndef STATUS_BAD_INHERITANCE_ACL +# define STATUS_BAD_INHERITANCE_ACL ((NTSTATUS) 0xC000007DL) +#endif + +#ifndef STATUS_RANGE_NOT_LOCKED +# define STATUS_RANGE_NOT_LOCKED ((NTSTATUS) 0xC000007EL) +#endif + +#ifndef STATUS_DISK_FULL +# define STATUS_DISK_FULL ((NTSTATUS) 0xC000007FL) +#endif + +#ifndef STATUS_SERVER_DISABLED +# define STATUS_SERVER_DISABLED ((NTSTATUS) 0xC0000080L) +#endif + +#ifndef STATUS_SERVER_NOT_DISABLED +# define STATUS_SERVER_NOT_DISABLED ((NTSTATUS) 0xC0000081L) +#endif + +#ifndef STATUS_TOO_MANY_GUIDS_REQUESTED +# define STATUS_TOO_MANY_GUIDS_REQUESTED ((NTSTATUS) 0xC0000082L) +#endif + +#ifndef STATUS_GUIDS_EXHAUSTED +# define STATUS_GUIDS_EXHAUSTED ((NTSTATUS) 0xC0000083L) +#endif + +#ifndef STATUS_INVALID_ID_AUTHORITY +# define STATUS_INVALID_ID_AUTHORITY ((NTSTATUS) 0xC0000084L) +#endif + +#ifndef STATUS_AGENTS_EXHAUSTED +# define STATUS_AGENTS_EXHAUSTED ((NTSTATUS) 0xC0000085L) +#endif + +#ifndef STATUS_INVALID_VOLUME_LABEL +# define STATUS_INVALID_VOLUME_LABEL ((NTSTATUS) 0xC0000086L) +#endif + +#ifndef STATUS_SECTION_NOT_EXTENDED +# define STATUS_SECTION_NOT_EXTENDED ((NTSTATUS) 0xC0000087L) +#endif + +#ifndef STATUS_NOT_MAPPED_DATA +# define STATUS_NOT_MAPPED_DATA ((NTSTATUS) 0xC0000088L) +#endif + +#ifndef STATUS_RESOURCE_DATA_NOT_FOUND +# define STATUS_RESOURCE_DATA_NOT_FOUND ((NTSTATUS) 0xC0000089L) +#endif + +#ifndef STATUS_RESOURCE_TYPE_NOT_FOUND +# define STATUS_RESOURCE_TYPE_NOT_FOUND ((NTSTATUS) 0xC000008AL) +#endif + +#ifndef STATUS_RESOURCE_NAME_NOT_FOUND +# define STATUS_RESOURCE_NAME_NOT_FOUND ((NTSTATUS) 0xC000008BL) +#endif + +#ifndef STATUS_ARRAY_BOUNDS_EXCEEDED +# define STATUS_ARRAY_BOUNDS_EXCEEDED ((NTSTATUS) 0xC000008CL) +#endif + +#ifndef STATUS_FLOAT_DENORMAL_OPERAND +# define STATUS_FLOAT_DENORMAL_OPERAND ((NTSTATUS) 0xC000008DL) +#endif + +#ifndef STATUS_FLOAT_DIVIDE_BY_ZERO +# define STATUS_FLOAT_DIVIDE_BY_ZERO ((NTSTATUS) 0xC000008EL) +#endif + +#ifndef STATUS_FLOAT_INEXACT_RESULT +# define STATUS_FLOAT_INEXACT_RESULT ((NTSTATUS) 0xC000008FL) +#endif + +#ifndef STATUS_FLOAT_INVALID_OPERATION +# define STATUS_FLOAT_INVALID_OPERATION ((NTSTATUS) 0xC0000090L) +#endif + +#ifndef STATUS_FLOAT_OVERFLOW +# define STATUS_FLOAT_OVERFLOW ((NTSTATUS) 0xC0000091L) +#endif + +#ifndef STATUS_FLOAT_STACK_CHECK +# define STATUS_FLOAT_STACK_CHECK ((NTSTATUS) 0xC0000092L) +#endif + +#ifndef STATUS_FLOAT_UNDERFLOW +# define STATUS_FLOAT_UNDERFLOW ((NTSTATUS) 0xC0000093L) +#endif + +#ifndef STATUS_INTEGER_DIVIDE_BY_ZERO +# define STATUS_INTEGER_DIVIDE_BY_ZERO ((NTSTATUS) 0xC0000094L) +#endif + +#ifndef STATUS_INTEGER_OVERFLOW +# define STATUS_INTEGER_OVERFLOW ((NTSTATUS) 0xC0000095L) +#endif + +#ifndef STATUS_PRIVILEGED_INSTRUCTION +# define STATUS_PRIVILEGED_INSTRUCTION ((NTSTATUS) 0xC0000096L) +#endif + +#ifndef STATUS_TOO_MANY_PAGING_FILES +# define STATUS_TOO_MANY_PAGING_FILES ((NTSTATUS) 0xC0000097L) +#endif + +#ifndef STATUS_FILE_INVALID +# define STATUS_FILE_INVALID ((NTSTATUS) 0xC0000098L) +#endif + +#ifndef STATUS_ALLOTTED_SPACE_EXCEEDED +# define STATUS_ALLOTTED_SPACE_EXCEEDED ((NTSTATUS) 0xC0000099L) +#endif + +#ifndef STATUS_INSUFFICIENT_RESOURCES +# define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS) 0xC000009AL) +#endif + +#ifndef STATUS_DFS_EXIT_PATH_FOUND +# define STATUS_DFS_EXIT_PATH_FOUND ((NTSTATUS) 0xC000009BL) +#endif + +#ifndef STATUS_DEVICE_DATA_ERROR +# define STATUS_DEVICE_DATA_ERROR ((NTSTATUS) 0xC000009CL) +#endif + +#ifndef STATUS_DEVICE_NOT_CONNECTED +# define STATUS_DEVICE_NOT_CONNECTED ((NTSTATUS) 0xC000009DL) +#endif + +#ifndef STATUS_DEVICE_POWER_FAILURE +# define STATUS_DEVICE_POWER_FAILURE ((NTSTATUS) 0xC000009EL) +#endif + +#ifndef STATUS_FREE_VM_NOT_AT_BASE +# define STATUS_FREE_VM_NOT_AT_BASE ((NTSTATUS) 0xC000009FL) +#endif + +#ifndef STATUS_MEMORY_NOT_ALLOCATED +# define STATUS_MEMORY_NOT_ALLOCATED ((NTSTATUS) 0xC00000A0L) +#endif + +#ifndef STATUS_WORKING_SET_QUOTA +# define STATUS_WORKING_SET_QUOTA ((NTSTATUS) 0xC00000A1L) +#endif + +#ifndef STATUS_MEDIA_WRITE_PROTECTED +# define STATUS_MEDIA_WRITE_PROTECTED ((NTSTATUS) 0xC00000A2L) +#endif + +#ifndef STATUS_DEVICE_NOT_READY +# define STATUS_DEVICE_NOT_READY ((NTSTATUS) 0xC00000A3L) +#endif + +#ifndef STATUS_INVALID_GROUP_ATTRIBUTES +# define STATUS_INVALID_GROUP_ATTRIBUTES ((NTSTATUS) 0xC00000A4L) +#endif + +#ifndef STATUS_BAD_IMPERSONATION_LEVEL +# define STATUS_BAD_IMPERSONATION_LEVEL ((NTSTATUS) 0xC00000A5L) +#endif + +#ifndef STATUS_CANT_OPEN_ANONYMOUS +# define STATUS_CANT_OPEN_ANONYMOUS ((NTSTATUS) 0xC00000A6L) +#endif + +#ifndef STATUS_BAD_VALIDATION_CLASS +# define STATUS_BAD_VALIDATION_CLASS ((NTSTATUS) 0xC00000A7L) +#endif + +#ifndef STATUS_BAD_TOKEN_TYPE +# define STATUS_BAD_TOKEN_TYPE ((NTSTATUS) 0xC00000A8L) +#endif + +#ifndef STATUS_BAD_MASTER_BOOT_RECORD +# define STATUS_BAD_MASTER_BOOT_RECORD ((NTSTATUS) 0xC00000A9L) +#endif + +#ifndef STATUS_INSTRUCTION_MISALIGNMENT +# define STATUS_INSTRUCTION_MISALIGNMENT ((NTSTATUS) 0xC00000AAL) +#endif + +#ifndef STATUS_INSTANCE_NOT_AVAILABLE +# define STATUS_INSTANCE_NOT_AVAILABLE ((NTSTATUS) 0xC00000ABL) +#endif + +#ifndef STATUS_PIPE_NOT_AVAILABLE +# define STATUS_PIPE_NOT_AVAILABLE ((NTSTATUS) 0xC00000ACL) +#endif + +#ifndef STATUS_INVALID_PIPE_STATE +# define STATUS_INVALID_PIPE_STATE ((NTSTATUS) 0xC00000ADL) +#endif + +#ifndef STATUS_PIPE_BUSY +# define STATUS_PIPE_BUSY ((NTSTATUS) 0xC00000AEL) +#endif + +#ifndef STATUS_ILLEGAL_FUNCTION +# define STATUS_ILLEGAL_FUNCTION ((NTSTATUS) 0xC00000AFL) +#endif + +#ifndef STATUS_PIPE_DISCONNECTED +# define STATUS_PIPE_DISCONNECTED ((NTSTATUS) 0xC00000B0L) +#endif + +#ifndef STATUS_PIPE_CLOSING +# define STATUS_PIPE_CLOSING ((NTSTATUS) 0xC00000B1L) +#endif + +#ifndef STATUS_PIPE_CONNECTED +# define STATUS_PIPE_CONNECTED ((NTSTATUS) 0xC00000B2L) +#endif + +#ifndef STATUS_PIPE_LISTENING +# define STATUS_PIPE_LISTENING ((NTSTATUS) 0xC00000B3L) +#endif + +#ifndef STATUS_INVALID_READ_MODE +# define STATUS_INVALID_READ_MODE ((NTSTATUS) 0xC00000B4L) +#endif + +#ifndef STATUS_IO_TIMEOUT +# define STATUS_IO_TIMEOUT ((NTSTATUS) 0xC00000B5L) +#endif + +#ifndef STATUS_FILE_FORCED_CLOSED +# define STATUS_FILE_FORCED_CLOSED ((NTSTATUS) 0xC00000B6L) +#endif + +#ifndef STATUS_PROFILING_NOT_STARTED +# define STATUS_PROFILING_NOT_STARTED ((NTSTATUS) 0xC00000B7L) +#endif + +#ifndef STATUS_PROFILING_NOT_STOPPED +# define STATUS_PROFILING_NOT_STOPPED ((NTSTATUS) 0xC00000B8L) +#endif + +#ifndef STATUS_COULD_NOT_INTERPRET +# define STATUS_COULD_NOT_INTERPRET ((NTSTATUS) 0xC00000B9L) +#endif + +#ifndef STATUS_FILE_IS_A_DIRECTORY +# define STATUS_FILE_IS_A_DIRECTORY ((NTSTATUS) 0xC00000BAL) +#endif + +#ifndef STATUS_NOT_SUPPORTED +# define STATUS_NOT_SUPPORTED ((NTSTATUS) 0xC00000BBL) +#endif + +#ifndef STATUS_REMOTE_NOT_LISTENING +# define STATUS_REMOTE_NOT_LISTENING ((NTSTATUS) 0xC00000BCL) +#endif + +#ifndef STATUS_DUPLICATE_NAME +# define STATUS_DUPLICATE_NAME ((NTSTATUS) 0xC00000BDL) +#endif + +#ifndef STATUS_BAD_NETWORK_PATH +# define STATUS_BAD_NETWORK_PATH ((NTSTATUS) 0xC00000BEL) +#endif + +#ifndef STATUS_NETWORK_BUSY +# define STATUS_NETWORK_BUSY ((NTSTATUS) 0xC00000BFL) +#endif + +#ifndef STATUS_DEVICE_DOES_NOT_EXIST +# define STATUS_DEVICE_DOES_NOT_EXIST ((NTSTATUS) 0xC00000C0L) +#endif + +#ifndef STATUS_TOO_MANY_COMMANDS +# define STATUS_TOO_MANY_COMMANDS ((NTSTATUS) 0xC00000C1L) +#endif + +#ifndef STATUS_ADAPTER_HARDWARE_ERROR +# define STATUS_ADAPTER_HARDWARE_ERROR ((NTSTATUS) 0xC00000C2L) +#endif + +#ifndef STATUS_INVALID_NETWORK_RESPONSE +# define STATUS_INVALID_NETWORK_RESPONSE ((NTSTATUS) 0xC00000C3L) +#endif + +#ifndef STATUS_UNEXPECTED_NETWORK_ERROR +# define STATUS_UNEXPECTED_NETWORK_ERROR ((NTSTATUS) 0xC00000C4L) +#endif + +#ifndef STATUS_BAD_REMOTE_ADAPTER +# define STATUS_BAD_REMOTE_ADAPTER ((NTSTATUS) 0xC00000C5L) +#endif + +#ifndef STATUS_PRINT_QUEUE_FULL +# define STATUS_PRINT_QUEUE_FULL ((NTSTATUS) 0xC00000C6L) +#endif + +#ifndef STATUS_NO_SPOOL_SPACE +# define STATUS_NO_SPOOL_SPACE ((NTSTATUS) 0xC00000C7L) +#endif + +#ifndef STATUS_PRINT_CANCELLED +# define STATUS_PRINT_CANCELLED ((NTSTATUS) 0xC00000C8L) +#endif + +#ifndef STATUS_NETWORK_NAME_DELETED +# define STATUS_NETWORK_NAME_DELETED ((NTSTATUS) 0xC00000C9L) +#endif + +#ifndef STATUS_NETWORK_ACCESS_DENIED +# define STATUS_NETWORK_ACCESS_DENIED ((NTSTATUS) 0xC00000CAL) +#endif + +#ifndef STATUS_BAD_DEVICE_TYPE +# define STATUS_BAD_DEVICE_TYPE ((NTSTATUS) 0xC00000CBL) +#endif + +#ifndef STATUS_BAD_NETWORK_NAME +# define STATUS_BAD_NETWORK_NAME ((NTSTATUS) 0xC00000CCL) +#endif + +#ifndef STATUS_TOO_MANY_NAMES +# define STATUS_TOO_MANY_NAMES ((NTSTATUS) 0xC00000CDL) +#endif + +#ifndef STATUS_TOO_MANY_SESSIONS +# define STATUS_TOO_MANY_SESSIONS ((NTSTATUS) 0xC00000CEL) +#endif + +#ifndef STATUS_SHARING_PAUSED +# define STATUS_SHARING_PAUSED ((NTSTATUS) 0xC00000CFL) +#endif + +#ifndef STATUS_REQUEST_NOT_ACCEPTED +# define STATUS_REQUEST_NOT_ACCEPTED ((NTSTATUS) 0xC00000D0L) +#endif + +#ifndef STATUS_REDIRECTOR_PAUSED +# define STATUS_REDIRECTOR_PAUSED ((NTSTATUS) 0xC00000D1L) +#endif + +#ifndef STATUS_NET_WRITE_FAULT +# define STATUS_NET_WRITE_FAULT ((NTSTATUS) 0xC00000D2L) +#endif + +#ifndef STATUS_PROFILING_AT_LIMIT +# define STATUS_PROFILING_AT_LIMIT ((NTSTATUS) 0xC00000D3L) +#endif + +#ifndef STATUS_NOT_SAME_DEVICE +# define STATUS_NOT_SAME_DEVICE ((NTSTATUS) 0xC00000D4L) +#endif + +#ifndef STATUS_FILE_RENAMED +# define STATUS_FILE_RENAMED ((NTSTATUS) 0xC00000D5L) +#endif + +#ifndef STATUS_VIRTUAL_CIRCUIT_CLOSED +# define STATUS_VIRTUAL_CIRCUIT_CLOSED ((NTSTATUS) 0xC00000D6L) +#endif + +#ifndef STATUS_NO_SECURITY_ON_OBJECT +# define STATUS_NO_SECURITY_ON_OBJECT ((NTSTATUS) 0xC00000D7L) +#endif + +#ifndef STATUS_CANT_WAIT +# define STATUS_CANT_WAIT ((NTSTATUS) 0xC00000D8L) +#endif + +#ifndef STATUS_PIPE_EMPTY +# define STATUS_PIPE_EMPTY ((NTSTATUS) 0xC00000D9L) +#endif + +#ifndef STATUS_CANT_ACCESS_DOMAIN_INFO +# define STATUS_CANT_ACCESS_DOMAIN_INFO ((NTSTATUS) 0xC00000DAL) +#endif + +#ifndef STATUS_CANT_TERMINATE_SELF +# define STATUS_CANT_TERMINATE_SELF ((NTSTATUS) 0xC00000DBL) +#endif + +#ifndef STATUS_INVALID_SERVER_STATE +# define STATUS_INVALID_SERVER_STATE ((NTSTATUS) 0xC00000DCL) +#endif + +#ifndef STATUS_INVALID_DOMAIN_STATE +# define STATUS_INVALID_DOMAIN_STATE ((NTSTATUS) 0xC00000DDL) +#endif + +#ifndef STATUS_INVALID_DOMAIN_ROLE +# define STATUS_INVALID_DOMAIN_ROLE ((NTSTATUS) 0xC00000DEL) +#endif + +#ifndef STATUS_NO_SUCH_DOMAIN +# define STATUS_NO_SUCH_DOMAIN ((NTSTATUS) 0xC00000DFL) +#endif + +#ifndef STATUS_DOMAIN_EXISTS +# define STATUS_DOMAIN_EXISTS ((NTSTATUS) 0xC00000E0L) +#endif + +#ifndef STATUS_DOMAIN_LIMIT_EXCEEDED +# define STATUS_DOMAIN_LIMIT_EXCEEDED ((NTSTATUS) 0xC00000E1L) +#endif + +#ifndef STATUS_OPLOCK_NOT_GRANTED +# define STATUS_OPLOCK_NOT_GRANTED ((NTSTATUS) 0xC00000E2L) +#endif + +#ifndef STATUS_INVALID_OPLOCK_PROTOCOL +# define STATUS_INVALID_OPLOCK_PROTOCOL ((NTSTATUS) 0xC00000E3L) +#endif + +#ifndef STATUS_INTERNAL_DB_CORRUPTION +# define STATUS_INTERNAL_DB_CORRUPTION ((NTSTATUS) 0xC00000E4L) +#endif + +#ifndef STATUS_INTERNAL_ERROR +# define STATUS_INTERNAL_ERROR ((NTSTATUS) 0xC00000E5L) +#endif + +#ifndef STATUS_GENERIC_NOT_MAPPED +# define STATUS_GENERIC_NOT_MAPPED ((NTSTATUS) 0xC00000E6L) +#endif + +#ifndef STATUS_BAD_DESCRIPTOR_FORMAT +# define STATUS_BAD_DESCRIPTOR_FORMAT ((NTSTATUS) 0xC00000E7L) +#endif + +#ifndef STATUS_INVALID_USER_BUFFER +# define STATUS_INVALID_USER_BUFFER ((NTSTATUS) 0xC00000E8L) +#endif + +#ifndef STATUS_UNEXPECTED_IO_ERROR +# define STATUS_UNEXPECTED_IO_ERROR ((NTSTATUS) 0xC00000E9L) +#endif + +#ifndef STATUS_UNEXPECTED_MM_CREATE_ERR +# define STATUS_UNEXPECTED_MM_CREATE_ERR ((NTSTATUS) 0xC00000EAL) +#endif + +#ifndef STATUS_UNEXPECTED_MM_MAP_ERROR +# define STATUS_UNEXPECTED_MM_MAP_ERROR ((NTSTATUS) 0xC00000EBL) +#endif + +#ifndef STATUS_UNEXPECTED_MM_EXTEND_ERR +# define STATUS_UNEXPECTED_MM_EXTEND_ERR ((NTSTATUS) 0xC00000ECL) +#endif + +#ifndef STATUS_NOT_LOGON_PROCESS +# define STATUS_NOT_LOGON_PROCESS ((NTSTATUS) 0xC00000EDL) +#endif + +#ifndef STATUS_LOGON_SESSION_EXISTS +# define STATUS_LOGON_SESSION_EXISTS ((NTSTATUS) 0xC00000EEL) +#endif + +#ifndef STATUS_INVALID_PARAMETER_1 +# define STATUS_INVALID_PARAMETER_1 ((NTSTATUS) 0xC00000EFL) +#endif + +#ifndef STATUS_INVALID_PARAMETER_2 +# define STATUS_INVALID_PARAMETER_2 ((NTSTATUS) 0xC00000F0L) +#endif + +#ifndef STATUS_INVALID_PARAMETER_3 +# define STATUS_INVALID_PARAMETER_3 ((NTSTATUS) 0xC00000F1L) +#endif + +#ifndef STATUS_INVALID_PARAMETER_4 +# define STATUS_INVALID_PARAMETER_4 ((NTSTATUS) 0xC00000F2L) +#endif + +#ifndef STATUS_INVALID_PARAMETER_5 +# define STATUS_INVALID_PARAMETER_5 ((NTSTATUS) 0xC00000F3L) +#endif + +#ifndef STATUS_INVALID_PARAMETER_6 +# define STATUS_INVALID_PARAMETER_6 ((NTSTATUS) 0xC00000F4L) +#endif + +#ifndef STATUS_INVALID_PARAMETER_7 +# define STATUS_INVALID_PARAMETER_7 ((NTSTATUS) 0xC00000F5L) +#endif + +#ifndef STATUS_INVALID_PARAMETER_8 +# define STATUS_INVALID_PARAMETER_8 ((NTSTATUS) 0xC00000F6L) +#endif + +#ifndef STATUS_INVALID_PARAMETER_9 +# define STATUS_INVALID_PARAMETER_9 ((NTSTATUS) 0xC00000F7L) +#endif + +#ifndef STATUS_INVALID_PARAMETER_10 +# define STATUS_INVALID_PARAMETER_10 ((NTSTATUS) 0xC00000F8L) +#endif + +#ifndef STATUS_INVALID_PARAMETER_11 +# define STATUS_INVALID_PARAMETER_11 ((NTSTATUS) 0xC00000F9L) +#endif + +#ifndef STATUS_INVALID_PARAMETER_12 +# define STATUS_INVALID_PARAMETER_12 ((NTSTATUS) 0xC00000FAL) +#endif + +#ifndef STATUS_REDIRECTOR_NOT_STARTED +# define STATUS_REDIRECTOR_NOT_STARTED ((NTSTATUS) 0xC00000FBL) +#endif + +#ifndef STATUS_REDIRECTOR_STARTED +# define STATUS_REDIRECTOR_STARTED ((NTSTATUS) 0xC00000FCL) +#endif + +#ifndef STATUS_STACK_OVERFLOW +# define STATUS_STACK_OVERFLOW ((NTSTATUS) 0xC00000FDL) +#endif + +#ifndef STATUS_NO_SUCH_PACKAGE +# define STATUS_NO_SUCH_PACKAGE ((NTSTATUS) 0xC00000FEL) +#endif + +#ifndef STATUS_BAD_FUNCTION_TABLE +# define STATUS_BAD_FUNCTION_TABLE ((NTSTATUS) 0xC00000FFL) +#endif + +#ifndef STATUS_VARIABLE_NOT_FOUND +# define STATUS_VARIABLE_NOT_FOUND ((NTSTATUS) 0xC0000100L) +#endif + +#ifndef STATUS_DIRECTORY_NOT_EMPTY +# define STATUS_DIRECTORY_NOT_EMPTY ((NTSTATUS) 0xC0000101L) +#endif + +#ifndef STATUS_FILE_CORRUPT_ERROR +# define STATUS_FILE_CORRUPT_ERROR ((NTSTATUS) 0xC0000102L) +#endif + +#ifndef STATUS_NOT_A_DIRECTORY +# define STATUS_NOT_A_DIRECTORY ((NTSTATUS) 0xC0000103L) +#endif + +#ifndef STATUS_BAD_LOGON_SESSION_STATE +# define STATUS_BAD_LOGON_SESSION_STATE ((NTSTATUS) 0xC0000104L) +#endif + +#ifndef STATUS_LOGON_SESSION_COLLISION +# define STATUS_LOGON_SESSION_COLLISION ((NTSTATUS) 0xC0000105L) +#endif + +#ifndef STATUS_NAME_TOO_LONG +# define STATUS_NAME_TOO_LONG ((NTSTATUS) 0xC0000106L) +#endif + +#ifndef STATUS_FILES_OPEN +# define STATUS_FILES_OPEN ((NTSTATUS) 0xC0000107L) +#endif + +#ifndef STATUS_CONNECTION_IN_USE +# define STATUS_CONNECTION_IN_USE ((NTSTATUS) 0xC0000108L) +#endif + +#ifndef STATUS_MESSAGE_NOT_FOUND +# define STATUS_MESSAGE_NOT_FOUND ((NTSTATUS) 0xC0000109L) +#endif + +#ifndef STATUS_PROCESS_IS_TERMINATING +# define STATUS_PROCESS_IS_TERMINATING ((NTSTATUS) 0xC000010AL) +#endif + +#ifndef STATUS_INVALID_LOGON_TYPE +# define STATUS_INVALID_LOGON_TYPE ((NTSTATUS) 0xC000010BL) +#endif + +#ifndef STATUS_NO_GUID_TRANSLATION +# define STATUS_NO_GUID_TRANSLATION ((NTSTATUS) 0xC000010CL) +#endif + +#ifndef STATUS_CANNOT_IMPERSONATE +# define STATUS_CANNOT_IMPERSONATE ((NTSTATUS) 0xC000010DL) +#endif + +#ifndef STATUS_IMAGE_ALREADY_LOADED +# define STATUS_IMAGE_ALREADY_LOADED ((NTSTATUS) 0xC000010EL) +#endif + +#ifndef STATUS_ABIOS_NOT_PRESENT +# define STATUS_ABIOS_NOT_PRESENT ((NTSTATUS) 0xC000010FL) +#endif + +#ifndef STATUS_ABIOS_LID_NOT_EXIST +# define STATUS_ABIOS_LID_NOT_EXIST ((NTSTATUS) 0xC0000110L) +#endif + +#ifndef STATUS_ABIOS_LID_ALREADY_OWNED +# define STATUS_ABIOS_LID_ALREADY_OWNED ((NTSTATUS) 0xC0000111L) +#endif + +#ifndef STATUS_ABIOS_NOT_LID_OWNER +# define STATUS_ABIOS_NOT_LID_OWNER ((NTSTATUS) 0xC0000112L) +#endif + +#ifndef STATUS_ABIOS_INVALID_COMMAND +# define STATUS_ABIOS_INVALID_COMMAND ((NTSTATUS) 0xC0000113L) +#endif + +#ifndef STATUS_ABIOS_INVALID_LID +# define STATUS_ABIOS_INVALID_LID ((NTSTATUS) 0xC0000114L) +#endif + +#ifndef STATUS_ABIOS_SELECTOR_NOT_AVAILABLE +# define STATUS_ABIOS_SELECTOR_NOT_AVAILABLE ((NTSTATUS) 0xC0000115L) +#endif + +#ifndef STATUS_ABIOS_INVALID_SELECTOR +# define STATUS_ABIOS_INVALID_SELECTOR ((NTSTATUS) 0xC0000116L) +#endif + +#ifndef STATUS_NO_LDT +# define STATUS_NO_LDT ((NTSTATUS) 0xC0000117L) +#endif + +#ifndef STATUS_INVALID_LDT_SIZE +# define STATUS_INVALID_LDT_SIZE ((NTSTATUS) 0xC0000118L) +#endif + +#ifndef STATUS_INVALID_LDT_OFFSET +# define STATUS_INVALID_LDT_OFFSET ((NTSTATUS) 0xC0000119L) +#endif + +#ifndef STATUS_INVALID_LDT_DESCRIPTOR +# define STATUS_INVALID_LDT_DESCRIPTOR ((NTSTATUS) 0xC000011AL) +#endif + +#ifndef STATUS_INVALID_IMAGE_NE_FORMAT +# define STATUS_INVALID_IMAGE_NE_FORMAT ((NTSTATUS) 0xC000011BL) +#endif + +#ifndef STATUS_RXACT_INVALID_STATE +# define STATUS_RXACT_INVALID_STATE ((NTSTATUS) 0xC000011CL) +#endif + +#ifndef STATUS_RXACT_COMMIT_FAILURE +# define STATUS_RXACT_COMMIT_FAILURE ((NTSTATUS) 0xC000011DL) +#endif + +#ifndef STATUS_MAPPED_FILE_SIZE_ZERO +# define STATUS_MAPPED_FILE_SIZE_ZERO ((NTSTATUS) 0xC000011EL) +#endif + +#ifndef STATUS_TOO_MANY_OPENED_FILES +# define STATUS_TOO_MANY_OPENED_FILES ((NTSTATUS) 0xC000011FL) +#endif + +#ifndef STATUS_CANCELLED +# define STATUS_CANCELLED ((NTSTATUS) 0xC0000120L) +#endif + +#ifndef STATUS_CANNOT_DELETE +# define STATUS_CANNOT_DELETE ((NTSTATUS) 0xC0000121L) +#endif + +#ifndef STATUS_INVALID_COMPUTER_NAME +# define STATUS_INVALID_COMPUTER_NAME ((NTSTATUS) 0xC0000122L) +#endif + +#ifndef STATUS_FILE_DELETED +# define STATUS_FILE_DELETED ((NTSTATUS) 0xC0000123L) +#endif + +#ifndef STATUS_SPECIAL_ACCOUNT +# define STATUS_SPECIAL_ACCOUNT ((NTSTATUS) 0xC0000124L) +#endif + +#ifndef STATUS_SPECIAL_GROUP +# define STATUS_SPECIAL_GROUP ((NTSTATUS) 0xC0000125L) +#endif + +#ifndef STATUS_SPECIAL_USER +# define STATUS_SPECIAL_USER ((NTSTATUS) 0xC0000126L) +#endif + +#ifndef STATUS_MEMBERS_PRIMARY_GROUP +# define STATUS_MEMBERS_PRIMARY_GROUP ((NTSTATUS) 0xC0000127L) +#endif + +#ifndef STATUS_FILE_CLOSED +# define STATUS_FILE_CLOSED ((NTSTATUS) 0xC0000128L) +#endif + +#ifndef STATUS_TOO_MANY_THREADS +# define STATUS_TOO_MANY_THREADS ((NTSTATUS) 0xC0000129L) +#endif + +#ifndef STATUS_THREAD_NOT_IN_PROCESS +# define STATUS_THREAD_NOT_IN_PROCESS ((NTSTATUS) 0xC000012AL) +#endif + +#ifndef STATUS_TOKEN_ALREADY_IN_USE +# define STATUS_TOKEN_ALREADY_IN_USE ((NTSTATUS) 0xC000012BL) +#endif + +#ifndef STATUS_PAGEFILE_QUOTA_EXCEEDED +# define STATUS_PAGEFILE_QUOTA_EXCEEDED ((NTSTATUS) 0xC000012CL) +#endif + +#ifndef STATUS_COMMITMENT_LIMIT +# define STATUS_COMMITMENT_LIMIT ((NTSTATUS) 0xC000012DL) +#endif + +#ifndef STATUS_INVALID_IMAGE_LE_FORMAT +# define STATUS_INVALID_IMAGE_LE_FORMAT ((NTSTATUS) 0xC000012EL) +#endif + +#ifndef STATUS_INVALID_IMAGE_NOT_MZ +# define STATUS_INVALID_IMAGE_NOT_MZ ((NTSTATUS) 0xC000012FL) +#endif + +#ifndef STATUS_INVALID_IMAGE_PROTECT +# define STATUS_INVALID_IMAGE_PROTECT ((NTSTATUS) 0xC0000130L) +#endif + +#ifndef STATUS_INVALID_IMAGE_WIN_16 +# define STATUS_INVALID_IMAGE_WIN_16 ((NTSTATUS) 0xC0000131L) +#endif + +#ifndef STATUS_LOGON_SERVER_CONFLICT +# define STATUS_LOGON_SERVER_CONFLICT ((NTSTATUS) 0xC0000132L) +#endif + +#ifndef STATUS_TIME_DIFFERENCE_AT_DC +# define STATUS_TIME_DIFFERENCE_AT_DC ((NTSTATUS) 0xC0000133L) +#endif + +#ifndef STATUS_SYNCHRONIZATION_REQUIRED +# define STATUS_SYNCHRONIZATION_REQUIRED ((NTSTATUS) 0xC0000134L) +#endif + +#ifndef STATUS_DLL_NOT_FOUND +# define STATUS_DLL_NOT_FOUND ((NTSTATUS) 0xC0000135L) +#endif + +#ifndef STATUS_OPEN_FAILED +# define STATUS_OPEN_FAILED ((NTSTATUS) 0xC0000136L) +#endif + +#ifndef STATUS_IO_PRIVILEGE_FAILED +# define STATUS_IO_PRIVILEGE_FAILED ((NTSTATUS) 0xC0000137L) +#endif + +#ifndef STATUS_ORDINAL_NOT_FOUND +# define STATUS_ORDINAL_NOT_FOUND ((NTSTATUS) 0xC0000138L) +#endif + +#ifndef STATUS_ENTRYPOINT_NOT_FOUND +# define STATUS_ENTRYPOINT_NOT_FOUND ((NTSTATUS) 0xC0000139L) +#endif + +#ifndef STATUS_CONTROL_C_EXIT +# define STATUS_CONTROL_C_EXIT ((NTSTATUS) 0xC000013AL) +#endif + +#ifndef STATUS_LOCAL_DISCONNECT +# define STATUS_LOCAL_DISCONNECT ((NTSTATUS) 0xC000013BL) +#endif + +#ifndef STATUS_REMOTE_DISCONNECT +# define STATUS_REMOTE_DISCONNECT ((NTSTATUS) 0xC000013CL) +#endif + +#ifndef STATUS_REMOTE_RESOURCES +# define STATUS_REMOTE_RESOURCES ((NTSTATUS) 0xC000013DL) +#endif + +#ifndef STATUS_LINK_FAILED +# define STATUS_LINK_FAILED ((NTSTATUS) 0xC000013EL) +#endif + +#ifndef STATUS_LINK_TIMEOUT +# define STATUS_LINK_TIMEOUT ((NTSTATUS) 0xC000013FL) +#endif + +#ifndef STATUS_INVALID_CONNECTION +# define STATUS_INVALID_CONNECTION ((NTSTATUS) 0xC0000140L) +#endif + +#ifndef STATUS_INVALID_ADDRESS +# define STATUS_INVALID_ADDRESS ((NTSTATUS) 0xC0000141L) +#endif + +#ifndef STATUS_DLL_INIT_FAILED +# define STATUS_DLL_INIT_FAILED ((NTSTATUS) 0xC0000142L) +#endif + +#ifndef STATUS_MISSING_SYSTEMFILE +# define STATUS_MISSING_SYSTEMFILE ((NTSTATUS) 0xC0000143L) +#endif + +#ifndef STATUS_UNHANDLED_EXCEPTION +# define STATUS_UNHANDLED_EXCEPTION ((NTSTATUS) 0xC0000144L) +#endif + +#ifndef STATUS_APP_INIT_FAILURE +# define STATUS_APP_INIT_FAILURE ((NTSTATUS) 0xC0000145L) +#endif + +#ifndef STATUS_PAGEFILE_CREATE_FAILED +# define STATUS_PAGEFILE_CREATE_FAILED ((NTSTATUS) 0xC0000146L) +#endif + +#ifndef STATUS_NO_PAGEFILE +# define STATUS_NO_PAGEFILE ((NTSTATUS) 0xC0000147L) +#endif + +#ifndef STATUS_INVALID_LEVEL +# define STATUS_INVALID_LEVEL ((NTSTATUS) 0xC0000148L) +#endif + +#ifndef STATUS_WRONG_PASSWORD_CORE +# define STATUS_WRONG_PASSWORD_CORE ((NTSTATUS) 0xC0000149L) +#endif + +#ifndef STATUS_ILLEGAL_FLOAT_CONTEXT +# define STATUS_ILLEGAL_FLOAT_CONTEXT ((NTSTATUS) 0xC000014AL) +#endif + +#ifndef STATUS_PIPE_BROKEN +# define STATUS_PIPE_BROKEN ((NTSTATUS) 0xC000014BL) +#endif + +#ifndef STATUS_REGISTRY_CORRUPT +# define STATUS_REGISTRY_CORRUPT ((NTSTATUS) 0xC000014CL) +#endif + +#ifndef STATUS_REGISTRY_IO_FAILED +# define STATUS_REGISTRY_IO_FAILED ((NTSTATUS) 0xC000014DL) +#endif + +#ifndef STATUS_NO_EVENT_PAIR +# define STATUS_NO_EVENT_PAIR ((NTSTATUS) 0xC000014EL) +#endif + +#ifndef STATUS_UNRECOGNIZED_VOLUME +# define STATUS_UNRECOGNIZED_VOLUME ((NTSTATUS) 0xC000014FL) +#endif + +#ifndef STATUS_SERIAL_NO_DEVICE_INITED +# define STATUS_SERIAL_NO_DEVICE_INITED ((NTSTATUS) 0xC0000150L) +#endif + +#ifndef STATUS_NO_SUCH_ALIAS +# define STATUS_NO_SUCH_ALIAS ((NTSTATUS) 0xC0000151L) +#endif + +#ifndef STATUS_MEMBER_NOT_IN_ALIAS +# define STATUS_MEMBER_NOT_IN_ALIAS ((NTSTATUS) 0xC0000152L) +#endif + +#ifndef STATUS_MEMBER_IN_ALIAS +# define STATUS_MEMBER_IN_ALIAS ((NTSTATUS) 0xC0000153L) +#endif + +#ifndef STATUS_ALIAS_EXISTS +# define STATUS_ALIAS_EXISTS ((NTSTATUS) 0xC0000154L) +#endif + +#ifndef STATUS_LOGON_NOT_GRANTED +# define STATUS_LOGON_NOT_GRANTED ((NTSTATUS) 0xC0000155L) +#endif + +#ifndef STATUS_TOO_MANY_SECRETS +# define STATUS_TOO_MANY_SECRETS ((NTSTATUS) 0xC0000156L) +#endif + +#ifndef STATUS_SECRET_TOO_LONG +# define STATUS_SECRET_TOO_LONG ((NTSTATUS) 0xC0000157L) +#endif + +#ifndef STATUS_INTERNAL_DB_ERROR +# define STATUS_INTERNAL_DB_ERROR ((NTSTATUS) 0xC0000158L) +#endif + +#ifndef STATUS_FULLSCREEN_MODE +# define STATUS_FULLSCREEN_MODE ((NTSTATUS) 0xC0000159L) +#endif + +#ifndef STATUS_TOO_MANY_CONTEXT_IDS +# define STATUS_TOO_MANY_CONTEXT_IDS ((NTSTATUS) 0xC000015AL) +#endif + +#ifndef STATUS_LOGON_TYPE_NOT_GRANTED +# define STATUS_LOGON_TYPE_NOT_GRANTED ((NTSTATUS) 0xC000015BL) +#endif + +#ifndef STATUS_NOT_REGISTRY_FILE +# define STATUS_NOT_REGISTRY_FILE ((NTSTATUS) 0xC000015CL) +#endif + +#ifndef STATUS_NT_CROSS_ENCRYPTION_REQUIRED +# define STATUS_NT_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS) 0xC000015DL) +#endif + +#ifndef STATUS_DOMAIN_CTRLR_CONFIG_ERROR +# define STATUS_DOMAIN_CTRLR_CONFIG_ERROR ((NTSTATUS) 0xC000015EL) +#endif + +#ifndef STATUS_FT_MISSING_MEMBER +# define STATUS_FT_MISSING_MEMBER ((NTSTATUS) 0xC000015FL) +#endif + +#ifndef STATUS_ILL_FORMED_SERVICE_ENTRY +# define STATUS_ILL_FORMED_SERVICE_ENTRY ((NTSTATUS) 0xC0000160L) +#endif + +#ifndef STATUS_ILLEGAL_CHARACTER +# define STATUS_ILLEGAL_CHARACTER ((NTSTATUS) 0xC0000161L) +#endif + +#ifndef STATUS_UNMAPPABLE_CHARACTER +# define STATUS_UNMAPPABLE_CHARACTER ((NTSTATUS) 0xC0000162L) +#endif + +#ifndef STATUS_UNDEFINED_CHARACTER +# define STATUS_UNDEFINED_CHARACTER ((NTSTATUS) 0xC0000163L) +#endif + +#ifndef STATUS_FLOPPY_VOLUME +# define STATUS_FLOPPY_VOLUME ((NTSTATUS) 0xC0000164L) +#endif + +#ifndef STATUS_FLOPPY_ID_MARK_NOT_FOUND +# define STATUS_FLOPPY_ID_MARK_NOT_FOUND ((NTSTATUS) 0xC0000165L) +#endif + +#ifndef STATUS_FLOPPY_WRONG_CYLINDER +# define STATUS_FLOPPY_WRONG_CYLINDER ((NTSTATUS) 0xC0000166L) +#endif + +#ifndef STATUS_FLOPPY_UNKNOWN_ERROR +# define STATUS_FLOPPY_UNKNOWN_ERROR ((NTSTATUS) 0xC0000167L) +#endif + +#ifndef STATUS_FLOPPY_BAD_REGISTERS +# define STATUS_FLOPPY_BAD_REGISTERS ((NTSTATUS) 0xC0000168L) +#endif + +#ifndef STATUS_DISK_RECALIBRATE_FAILED +# define STATUS_DISK_RECALIBRATE_FAILED ((NTSTATUS) 0xC0000169L) +#endif + +#ifndef STATUS_DISK_OPERATION_FAILED +# define STATUS_DISK_OPERATION_FAILED ((NTSTATUS) 0xC000016AL) +#endif + +#ifndef STATUS_DISK_RESET_FAILED +# define STATUS_DISK_RESET_FAILED ((NTSTATUS) 0xC000016BL) +#endif + +#ifndef STATUS_SHARED_IRQ_BUSY +# define STATUS_SHARED_IRQ_BUSY ((NTSTATUS) 0xC000016CL) +#endif + +#ifndef STATUS_FT_ORPHANING +# define STATUS_FT_ORPHANING ((NTSTATUS) 0xC000016DL) +#endif + +#ifndef STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT +# define STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT ((NTSTATUS) 0xC000016EL) +#endif + +#ifndef STATUS_PARTITION_FAILURE +# define STATUS_PARTITION_FAILURE ((NTSTATUS) 0xC0000172L) +#endif + +#ifndef STATUS_INVALID_BLOCK_LENGTH +# define STATUS_INVALID_BLOCK_LENGTH ((NTSTATUS) 0xC0000173L) +#endif + +#ifndef STATUS_DEVICE_NOT_PARTITIONED +# define STATUS_DEVICE_NOT_PARTITIONED ((NTSTATUS) 0xC0000174L) +#endif + +#ifndef STATUS_UNABLE_TO_LOCK_MEDIA +# define STATUS_UNABLE_TO_LOCK_MEDIA ((NTSTATUS) 0xC0000175L) +#endif + +#ifndef STATUS_UNABLE_TO_UNLOAD_MEDIA +# define STATUS_UNABLE_TO_UNLOAD_MEDIA ((NTSTATUS) 0xC0000176L) +#endif + +#ifndef STATUS_EOM_OVERFLOW +# define STATUS_EOM_OVERFLOW ((NTSTATUS) 0xC0000177L) +#endif + +#ifndef STATUS_NO_MEDIA +# define STATUS_NO_MEDIA ((NTSTATUS) 0xC0000178L) +#endif + +#ifndef STATUS_NO_SUCH_MEMBER +# define STATUS_NO_SUCH_MEMBER ((NTSTATUS) 0xC000017AL) +#endif + +#ifndef STATUS_INVALID_MEMBER +# define STATUS_INVALID_MEMBER ((NTSTATUS) 0xC000017BL) +#endif + +#ifndef STATUS_KEY_DELETED +# define STATUS_KEY_DELETED ((NTSTATUS) 0xC000017CL) +#endif + +#ifndef STATUS_NO_LOG_SPACE +# define STATUS_NO_LOG_SPACE ((NTSTATUS) 0xC000017DL) +#endif + +#ifndef STATUS_TOO_MANY_SIDS +# define STATUS_TOO_MANY_SIDS ((NTSTATUS) 0xC000017EL) +#endif + +#ifndef STATUS_LM_CROSS_ENCRYPTION_REQUIRED +# define STATUS_LM_CROSS_ENCRYPTION_REQUIRED ((NTSTATUS) 0xC000017FL) +#endif + +#ifndef STATUS_KEY_HAS_CHILDREN +# define STATUS_KEY_HAS_CHILDREN ((NTSTATUS) 0xC0000180L) +#endif + +#ifndef STATUS_CHILD_MUST_BE_VOLATILE +# define STATUS_CHILD_MUST_BE_VOLATILE ((NTSTATUS) 0xC0000181L) +#endif + +#ifndef STATUS_DEVICE_CONFIGURATION_ERROR +# define STATUS_DEVICE_CONFIGURATION_ERROR ((NTSTATUS) 0xC0000182L) +#endif + +#ifndef STATUS_DRIVER_INTERNAL_ERROR +# define STATUS_DRIVER_INTERNAL_ERROR ((NTSTATUS) 0xC0000183L) +#endif + +#ifndef STATUS_INVALID_DEVICE_STATE +# define STATUS_INVALID_DEVICE_STATE ((NTSTATUS) 0xC0000184L) +#endif + +#ifndef STATUS_IO_DEVICE_ERROR +# define STATUS_IO_DEVICE_ERROR ((NTSTATUS) 0xC0000185L) +#endif + +#ifndef STATUS_DEVICE_PROTOCOL_ERROR +# define STATUS_DEVICE_PROTOCOL_ERROR ((NTSTATUS) 0xC0000186L) +#endif + +#ifndef STATUS_BACKUP_CONTROLLER +# define STATUS_BACKUP_CONTROLLER ((NTSTATUS) 0xC0000187L) +#endif + +#ifndef STATUS_LOG_FILE_FULL +# define STATUS_LOG_FILE_FULL ((NTSTATUS) 0xC0000188L) +#endif + +#ifndef STATUS_TOO_LATE +# define STATUS_TOO_LATE ((NTSTATUS) 0xC0000189L) +#endif + +#ifndef STATUS_NO_TRUST_LSA_SECRET +# define STATUS_NO_TRUST_LSA_SECRET ((NTSTATUS) 0xC000018AL) +#endif + +#ifndef STATUS_NO_TRUST_SAM_ACCOUNT +# define STATUS_NO_TRUST_SAM_ACCOUNT ((NTSTATUS) 0xC000018BL) +#endif + +#ifndef STATUS_TRUSTED_DOMAIN_FAILURE +# define STATUS_TRUSTED_DOMAIN_FAILURE ((NTSTATUS) 0xC000018CL) +#endif + +#ifndef STATUS_TRUSTED_RELATIONSHIP_FAILURE +# define STATUS_TRUSTED_RELATIONSHIP_FAILURE ((NTSTATUS) 0xC000018DL) +#endif + +#ifndef STATUS_EVENTLOG_FILE_CORRUPT +# define STATUS_EVENTLOG_FILE_CORRUPT ((NTSTATUS) 0xC000018EL) +#endif + +#ifndef STATUS_EVENTLOG_CANT_START +# define STATUS_EVENTLOG_CANT_START ((NTSTATUS) 0xC000018FL) +#endif + +#ifndef STATUS_TRUST_FAILURE +# define STATUS_TRUST_FAILURE ((NTSTATUS) 0xC0000190L) +#endif + +#ifndef STATUS_MUTANT_LIMIT_EXCEEDED +# define STATUS_MUTANT_LIMIT_EXCEEDED ((NTSTATUS) 0xC0000191L) +#endif + +#ifndef STATUS_NETLOGON_NOT_STARTED +# define STATUS_NETLOGON_NOT_STARTED ((NTSTATUS) 0xC0000192L) +#endif + +#ifndef STATUS_ACCOUNT_EXPIRED +# define STATUS_ACCOUNT_EXPIRED ((NTSTATUS) 0xC0000193L) +#endif + +#ifndef STATUS_POSSIBLE_DEADLOCK +# define STATUS_POSSIBLE_DEADLOCK ((NTSTATUS) 0xC0000194L) +#endif + +#ifndef STATUS_NETWORK_CREDENTIAL_CONFLICT +# define STATUS_NETWORK_CREDENTIAL_CONFLICT ((NTSTATUS) 0xC0000195L) +#endif + +#ifndef STATUS_REMOTE_SESSION_LIMIT +# define STATUS_REMOTE_SESSION_LIMIT ((NTSTATUS) 0xC0000196L) +#endif + +#ifndef STATUS_EVENTLOG_FILE_CHANGED +# define STATUS_EVENTLOG_FILE_CHANGED ((NTSTATUS) 0xC0000197L) +#endif + +#ifndef STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT +# define STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT ((NTSTATUS) 0xC0000198L) +#endif + +#ifndef STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT +# define STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT ((NTSTATUS) 0xC0000199L) +#endif + +#ifndef STATUS_NOLOGON_SERVER_TRUST_ACCOUNT +# define STATUS_NOLOGON_SERVER_TRUST_ACCOUNT ((NTSTATUS) 0xC000019AL) +#endif + +#ifndef STATUS_DOMAIN_TRUST_INCONSISTENT +# define STATUS_DOMAIN_TRUST_INCONSISTENT ((NTSTATUS) 0xC000019BL) +#endif + +#ifndef STATUS_FS_DRIVER_REQUIRED +# define STATUS_FS_DRIVER_REQUIRED ((NTSTATUS) 0xC000019CL) +#endif + +#ifndef STATUS_IMAGE_ALREADY_LOADED_AS_DLL +# define STATUS_IMAGE_ALREADY_LOADED_AS_DLL ((NTSTATUS) 0xC000019DL) +#endif + +#ifndef STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING +# define STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING ((NTSTATUS) 0xC000019EL) +#endif + +#ifndef STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME +# define STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME ((NTSTATUS) 0xC000019FL) +#endif + +#ifndef STATUS_SECURITY_STREAM_IS_INCONSISTENT +# define STATUS_SECURITY_STREAM_IS_INCONSISTENT ((NTSTATUS) 0xC00001A0L) +#endif + +#ifndef STATUS_INVALID_LOCK_RANGE +# define STATUS_INVALID_LOCK_RANGE ((NTSTATUS) 0xC00001A1L) +#endif + +#ifndef STATUS_INVALID_ACE_CONDITION +# define STATUS_INVALID_ACE_CONDITION ((NTSTATUS) 0xC00001A2L) +#endif + +#ifndef STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT +# define STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT ((NTSTATUS) 0xC00001A3L) +#endif + +#ifndef STATUS_NOTIFICATION_GUID_ALREADY_DEFINED +# define STATUS_NOTIFICATION_GUID_ALREADY_DEFINED ((NTSTATUS) 0xC00001A4L) +#endif + +#ifndef STATUS_NETWORK_OPEN_RESTRICTION +# define STATUS_NETWORK_OPEN_RESTRICTION ((NTSTATUS) 0xC0000201L) +#endif + +#ifndef STATUS_NO_USER_SESSION_KEY +# define STATUS_NO_USER_SESSION_KEY ((NTSTATUS) 0xC0000202L) +#endif + +#ifndef STATUS_USER_SESSION_DELETED +# define STATUS_USER_SESSION_DELETED ((NTSTATUS) 0xC0000203L) +#endif + +#ifndef STATUS_RESOURCE_LANG_NOT_FOUND +# define STATUS_RESOURCE_LANG_NOT_FOUND ((NTSTATUS) 0xC0000204L) +#endif + +#ifndef STATUS_INSUFF_SERVER_RESOURCES +# define STATUS_INSUFF_SERVER_RESOURCES ((NTSTATUS) 0xC0000205L) +#endif + +#ifndef STATUS_INVALID_BUFFER_SIZE +# define STATUS_INVALID_BUFFER_SIZE ((NTSTATUS) 0xC0000206L) +#endif + +#ifndef STATUS_INVALID_ADDRESS_COMPONENT +# define STATUS_INVALID_ADDRESS_COMPONENT ((NTSTATUS) 0xC0000207L) +#endif + +#ifndef STATUS_INVALID_ADDRESS_WILDCARD +# define STATUS_INVALID_ADDRESS_WILDCARD ((NTSTATUS) 0xC0000208L) +#endif + +#ifndef STATUS_TOO_MANY_ADDRESSES +# define STATUS_TOO_MANY_ADDRESSES ((NTSTATUS) 0xC0000209L) +#endif + +#ifndef STATUS_ADDRESS_ALREADY_EXISTS +# define STATUS_ADDRESS_ALREADY_EXISTS ((NTSTATUS) 0xC000020AL) +#endif + +#ifndef STATUS_ADDRESS_CLOSED +# define STATUS_ADDRESS_CLOSED ((NTSTATUS) 0xC000020BL) +#endif + +#ifndef STATUS_CONNECTION_DISCONNECTED +# define STATUS_CONNECTION_DISCONNECTED ((NTSTATUS) 0xC000020CL) +#endif + +#ifndef STATUS_CONNECTION_RESET +# define STATUS_CONNECTION_RESET ((NTSTATUS) 0xC000020DL) +#endif + +#ifndef STATUS_TOO_MANY_NODES +# define STATUS_TOO_MANY_NODES ((NTSTATUS) 0xC000020EL) +#endif + +#ifndef STATUS_TRANSACTION_ABORTED +# define STATUS_TRANSACTION_ABORTED ((NTSTATUS) 0xC000020FL) +#endif + +#ifndef STATUS_TRANSACTION_TIMED_OUT +# define STATUS_TRANSACTION_TIMED_OUT ((NTSTATUS) 0xC0000210L) +#endif + +#ifndef STATUS_TRANSACTION_NO_RELEASE +# define STATUS_TRANSACTION_NO_RELEASE ((NTSTATUS) 0xC0000211L) +#endif + +#ifndef STATUS_TRANSACTION_NO_MATCH +# define STATUS_TRANSACTION_NO_MATCH ((NTSTATUS) 0xC0000212L) +#endif + +#ifndef STATUS_TRANSACTION_RESPONDED +# define STATUS_TRANSACTION_RESPONDED ((NTSTATUS) 0xC0000213L) +#endif + +#ifndef STATUS_TRANSACTION_INVALID_ID +# define STATUS_TRANSACTION_INVALID_ID ((NTSTATUS) 0xC0000214L) +#endif + +#ifndef STATUS_TRANSACTION_INVALID_TYPE +# define STATUS_TRANSACTION_INVALID_TYPE ((NTSTATUS) 0xC0000215L) +#endif + +#ifndef STATUS_NOT_SERVER_SESSION +# define STATUS_NOT_SERVER_SESSION ((NTSTATUS) 0xC0000216L) +#endif + +#ifndef STATUS_NOT_CLIENT_SESSION +# define STATUS_NOT_CLIENT_SESSION ((NTSTATUS) 0xC0000217L) +#endif + +#ifndef STATUS_CANNOT_LOAD_REGISTRY_FILE +# define STATUS_CANNOT_LOAD_REGISTRY_FILE ((NTSTATUS) 0xC0000218L) +#endif + +#ifndef STATUS_DEBUG_ATTACH_FAILED +# define STATUS_DEBUG_ATTACH_FAILED ((NTSTATUS) 0xC0000219L) +#endif + +#ifndef STATUS_SYSTEM_PROCESS_TERMINATED +# define STATUS_SYSTEM_PROCESS_TERMINATED ((NTSTATUS) 0xC000021AL) +#endif + +#ifndef STATUS_DATA_NOT_ACCEPTED +# define STATUS_DATA_NOT_ACCEPTED ((NTSTATUS) 0xC000021BL) +#endif + +#ifndef STATUS_NO_BROWSER_SERVERS_FOUND +# define STATUS_NO_BROWSER_SERVERS_FOUND ((NTSTATUS) 0xC000021CL) +#endif + +#ifndef STATUS_VDM_HARD_ERROR +# define STATUS_VDM_HARD_ERROR ((NTSTATUS) 0xC000021DL) +#endif + +#ifndef STATUS_DRIVER_CANCEL_TIMEOUT +# define STATUS_DRIVER_CANCEL_TIMEOUT ((NTSTATUS) 0xC000021EL) +#endif + +#ifndef STATUS_REPLY_MESSAGE_MISMATCH +# define STATUS_REPLY_MESSAGE_MISMATCH ((NTSTATUS) 0xC000021FL) +#endif + +#ifndef STATUS_MAPPED_ALIGNMENT +# define STATUS_MAPPED_ALIGNMENT ((NTSTATUS) 0xC0000220L) +#endif + +#ifndef STATUS_IMAGE_CHECKSUM_MISMATCH +# define STATUS_IMAGE_CHECKSUM_MISMATCH ((NTSTATUS) 0xC0000221L) +#endif + +#ifndef STATUS_LOST_WRITEBEHIND_DATA +# define STATUS_LOST_WRITEBEHIND_DATA ((NTSTATUS) 0xC0000222L) +#endif + +#ifndef STATUS_CLIENT_SERVER_PARAMETERS_INVALID +# define STATUS_CLIENT_SERVER_PARAMETERS_INVALID ((NTSTATUS) 0xC0000223L) +#endif + +#ifndef STATUS_PASSWORD_MUST_CHANGE +# define STATUS_PASSWORD_MUST_CHANGE ((NTSTATUS) 0xC0000224L) +#endif + +#ifndef STATUS_NOT_FOUND +# define STATUS_NOT_FOUND ((NTSTATUS) 0xC0000225L) +#endif + +#ifndef STATUS_NOT_TINY_STREAM +# define STATUS_NOT_TINY_STREAM ((NTSTATUS) 0xC0000226L) +#endif + +#ifndef STATUS_RECOVERY_FAILURE +# define STATUS_RECOVERY_FAILURE ((NTSTATUS) 0xC0000227L) +#endif + +#ifndef STATUS_STACK_OVERFLOW_READ +# define STATUS_STACK_OVERFLOW_READ ((NTSTATUS) 0xC0000228L) +#endif + +#ifndef STATUS_FAIL_CHECK +# define STATUS_FAIL_CHECK ((NTSTATUS) 0xC0000229L) +#endif + +#ifndef STATUS_DUPLICATE_OBJECTID +# define STATUS_DUPLICATE_OBJECTID ((NTSTATUS) 0xC000022AL) +#endif + +#ifndef STATUS_OBJECTID_EXISTS +# define STATUS_OBJECTID_EXISTS ((NTSTATUS) 0xC000022BL) +#endif + +#ifndef STATUS_CONVERT_TO_LARGE +# define STATUS_CONVERT_TO_LARGE ((NTSTATUS) 0xC000022CL) +#endif + +#ifndef STATUS_RETRY +# define STATUS_RETRY ((NTSTATUS) 0xC000022DL) +#endif + +#ifndef STATUS_FOUND_OUT_OF_SCOPE +# define STATUS_FOUND_OUT_OF_SCOPE ((NTSTATUS) 0xC000022EL) +#endif + +#ifndef STATUS_ALLOCATE_BUCKET +# define STATUS_ALLOCATE_BUCKET ((NTSTATUS) 0xC000022FL) +#endif + +#ifndef STATUS_PROPSET_NOT_FOUND +# define STATUS_PROPSET_NOT_FOUND ((NTSTATUS) 0xC0000230L) +#endif + +#ifndef STATUS_MARSHALL_OVERFLOW +# define STATUS_MARSHALL_OVERFLOW ((NTSTATUS) 0xC0000231L) +#endif + +#ifndef STATUS_INVALID_VARIANT +# define STATUS_INVALID_VARIANT ((NTSTATUS) 0xC0000232L) +#endif + +#ifndef STATUS_DOMAIN_CONTROLLER_NOT_FOUND +# define STATUS_DOMAIN_CONTROLLER_NOT_FOUND ((NTSTATUS) 0xC0000233L) +#endif + +#ifndef STATUS_ACCOUNT_LOCKED_OUT +# define STATUS_ACCOUNT_LOCKED_OUT ((NTSTATUS) 0xC0000234L) +#endif + +#ifndef STATUS_HANDLE_NOT_CLOSABLE +# define STATUS_HANDLE_NOT_CLOSABLE ((NTSTATUS) 0xC0000235L) +#endif + +#ifndef STATUS_CONNECTION_REFUSED +# define STATUS_CONNECTION_REFUSED ((NTSTATUS) 0xC0000236L) +#endif + +#ifndef STATUS_GRACEFUL_DISCONNECT +# define STATUS_GRACEFUL_DISCONNECT ((NTSTATUS) 0xC0000237L) +#endif + +#ifndef STATUS_ADDRESS_ALREADY_ASSOCIATED +# define STATUS_ADDRESS_ALREADY_ASSOCIATED ((NTSTATUS) 0xC0000238L) +#endif + +#ifndef STATUS_ADDRESS_NOT_ASSOCIATED +# define STATUS_ADDRESS_NOT_ASSOCIATED ((NTSTATUS) 0xC0000239L) +#endif + +#ifndef STATUS_CONNECTION_INVALID +# define STATUS_CONNECTION_INVALID ((NTSTATUS) 0xC000023AL) +#endif + +#ifndef STATUS_CONNECTION_ACTIVE +# define STATUS_CONNECTION_ACTIVE ((NTSTATUS) 0xC000023BL) +#endif + +#ifndef STATUS_NETWORK_UNREACHABLE +# define STATUS_NETWORK_UNREACHABLE ((NTSTATUS) 0xC000023CL) +#endif + +#ifndef STATUS_HOST_UNREACHABLE +# define STATUS_HOST_UNREACHABLE ((NTSTATUS) 0xC000023DL) +#endif + +#ifndef STATUS_PROTOCOL_UNREACHABLE +# define STATUS_PROTOCOL_UNREACHABLE ((NTSTATUS) 0xC000023EL) +#endif + +#ifndef STATUS_PORT_UNREACHABLE +# define STATUS_PORT_UNREACHABLE ((NTSTATUS) 0xC000023FL) +#endif + +#ifndef STATUS_REQUEST_ABORTED +# define STATUS_REQUEST_ABORTED ((NTSTATUS) 0xC0000240L) +#endif + +#ifndef STATUS_CONNECTION_ABORTED +# define STATUS_CONNECTION_ABORTED ((NTSTATUS) 0xC0000241L) +#endif + +#ifndef STATUS_BAD_COMPRESSION_BUFFER +# define STATUS_BAD_COMPRESSION_BUFFER ((NTSTATUS) 0xC0000242L) +#endif + +#ifndef STATUS_USER_MAPPED_FILE +# define STATUS_USER_MAPPED_FILE ((NTSTATUS) 0xC0000243L) +#endif + +#ifndef STATUS_AUDIT_FAILED +# define STATUS_AUDIT_FAILED ((NTSTATUS) 0xC0000244L) +#endif + +#ifndef STATUS_TIMER_RESOLUTION_NOT_SET +# define STATUS_TIMER_RESOLUTION_NOT_SET ((NTSTATUS) 0xC0000245L) +#endif + +#ifndef STATUS_CONNECTION_COUNT_LIMIT +# define STATUS_CONNECTION_COUNT_LIMIT ((NTSTATUS) 0xC0000246L) +#endif + +#ifndef STATUS_LOGIN_TIME_RESTRICTION +# define STATUS_LOGIN_TIME_RESTRICTION ((NTSTATUS) 0xC0000247L) +#endif + +#ifndef STATUS_LOGIN_WKSTA_RESTRICTION +# define STATUS_LOGIN_WKSTA_RESTRICTION ((NTSTATUS) 0xC0000248L) +#endif + +#ifndef STATUS_IMAGE_MP_UP_MISMATCH +# define STATUS_IMAGE_MP_UP_MISMATCH ((NTSTATUS) 0xC0000249L) +#endif + +#ifndef STATUS_INSUFFICIENT_LOGON_INFO +# define STATUS_INSUFFICIENT_LOGON_INFO ((NTSTATUS) 0xC0000250L) +#endif + +#ifndef STATUS_BAD_DLL_ENTRYPOINT +# define STATUS_BAD_DLL_ENTRYPOINT ((NTSTATUS) 0xC0000251L) +#endif + +#ifndef STATUS_BAD_SERVICE_ENTRYPOINT +# define STATUS_BAD_SERVICE_ENTRYPOINT ((NTSTATUS) 0xC0000252L) +#endif + +#ifndef STATUS_LPC_REPLY_LOST +# define STATUS_LPC_REPLY_LOST ((NTSTATUS) 0xC0000253L) +#endif + +#ifndef STATUS_IP_ADDRESS_CONFLICT1 +# define STATUS_IP_ADDRESS_CONFLICT1 ((NTSTATUS) 0xC0000254L) +#endif + +#ifndef STATUS_IP_ADDRESS_CONFLICT2 +# define STATUS_IP_ADDRESS_CONFLICT2 ((NTSTATUS) 0xC0000255L) +#endif + +#ifndef STATUS_REGISTRY_QUOTA_LIMIT +# define STATUS_REGISTRY_QUOTA_LIMIT ((NTSTATUS) 0xC0000256L) +#endif + +#ifndef STATUS_PATH_NOT_COVERED +# define STATUS_PATH_NOT_COVERED ((NTSTATUS) 0xC0000257L) +#endif + +#ifndef STATUS_NO_CALLBACK_ACTIVE +# define STATUS_NO_CALLBACK_ACTIVE ((NTSTATUS) 0xC0000258L) +#endif + +#ifndef STATUS_LICENSE_QUOTA_EXCEEDED +# define STATUS_LICENSE_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000259L) +#endif + +#ifndef STATUS_PWD_TOO_SHORT +# define STATUS_PWD_TOO_SHORT ((NTSTATUS) 0xC000025AL) +#endif + +#ifndef STATUS_PWD_TOO_RECENT +# define STATUS_PWD_TOO_RECENT ((NTSTATUS) 0xC000025BL) +#endif + +#ifndef STATUS_PWD_HISTORY_CONFLICT +# define STATUS_PWD_HISTORY_CONFLICT ((NTSTATUS) 0xC000025CL) +#endif + +#ifndef STATUS_PLUGPLAY_NO_DEVICE +# define STATUS_PLUGPLAY_NO_DEVICE ((NTSTATUS) 0xC000025EL) +#endif + +#ifndef STATUS_UNSUPPORTED_COMPRESSION +# define STATUS_UNSUPPORTED_COMPRESSION ((NTSTATUS) 0xC000025FL) +#endif + +#ifndef STATUS_INVALID_HW_PROFILE +# define STATUS_INVALID_HW_PROFILE ((NTSTATUS) 0xC0000260L) +#endif + +#ifndef STATUS_INVALID_PLUGPLAY_DEVICE_PATH +# define STATUS_INVALID_PLUGPLAY_DEVICE_PATH ((NTSTATUS) 0xC0000261L) +#endif + +#ifndef STATUS_DRIVER_ORDINAL_NOT_FOUND +# define STATUS_DRIVER_ORDINAL_NOT_FOUND ((NTSTATUS) 0xC0000262L) +#endif + +#ifndef STATUS_DRIVER_ENTRYPOINT_NOT_FOUND +# define STATUS_DRIVER_ENTRYPOINT_NOT_FOUND ((NTSTATUS) 0xC0000263L) +#endif + +#ifndef STATUS_RESOURCE_NOT_OWNED +# define STATUS_RESOURCE_NOT_OWNED ((NTSTATUS) 0xC0000264L) +#endif + +#ifndef STATUS_TOO_MANY_LINKS +# define STATUS_TOO_MANY_LINKS ((NTSTATUS) 0xC0000265L) +#endif + +#ifndef STATUS_QUOTA_LIST_INCONSISTENT +# define STATUS_QUOTA_LIST_INCONSISTENT ((NTSTATUS) 0xC0000266L) +#endif + +#ifndef STATUS_FILE_IS_OFFLINE +# define STATUS_FILE_IS_OFFLINE ((NTSTATUS) 0xC0000267L) +#endif + +#ifndef STATUS_EVALUATION_EXPIRATION +# define STATUS_EVALUATION_EXPIRATION ((NTSTATUS) 0xC0000268L) +#endif + +#ifndef STATUS_ILLEGAL_DLL_RELOCATION +# define STATUS_ILLEGAL_DLL_RELOCATION ((NTSTATUS) 0xC0000269L) +#endif + +#ifndef STATUS_LICENSE_VIOLATION +# define STATUS_LICENSE_VIOLATION ((NTSTATUS) 0xC000026AL) +#endif + +#ifndef STATUS_DLL_INIT_FAILED_LOGOFF +# define STATUS_DLL_INIT_FAILED_LOGOFF ((NTSTATUS) 0xC000026BL) +#endif + +#ifndef STATUS_DRIVER_UNABLE_TO_LOAD +# define STATUS_DRIVER_UNABLE_TO_LOAD ((NTSTATUS) 0xC000026CL) +#endif + +#ifndef STATUS_DFS_UNAVAILABLE +# define STATUS_DFS_UNAVAILABLE ((NTSTATUS) 0xC000026DL) +#endif + +#ifndef STATUS_VOLUME_DISMOUNTED +# define STATUS_VOLUME_DISMOUNTED ((NTSTATUS) 0xC000026EL) +#endif + +#ifndef STATUS_WX86_INTERNAL_ERROR +# define STATUS_WX86_INTERNAL_ERROR ((NTSTATUS) 0xC000026FL) +#endif + +#ifndef STATUS_WX86_FLOAT_STACK_CHECK +# define STATUS_WX86_FLOAT_STACK_CHECK ((NTSTATUS) 0xC0000270L) +#endif + +#ifndef STATUS_VALIDATE_CONTINUE +# define STATUS_VALIDATE_CONTINUE ((NTSTATUS) 0xC0000271L) +#endif + +#ifndef STATUS_NO_MATCH +# define STATUS_NO_MATCH ((NTSTATUS) 0xC0000272L) +#endif + +#ifndef STATUS_NO_MORE_MATCHES +# define STATUS_NO_MORE_MATCHES ((NTSTATUS) 0xC0000273L) +#endif + +#ifndef STATUS_NOT_A_REPARSE_POINT +# define STATUS_NOT_A_REPARSE_POINT ((NTSTATUS) 0xC0000275L) +#endif + +#ifndef STATUS_IO_REPARSE_TAG_INVALID +# define STATUS_IO_REPARSE_TAG_INVALID ((NTSTATUS) 0xC0000276L) +#endif + +#ifndef STATUS_IO_REPARSE_TAG_MISMATCH +# define STATUS_IO_REPARSE_TAG_MISMATCH ((NTSTATUS) 0xC0000277L) +#endif + +#ifndef STATUS_IO_REPARSE_DATA_INVALID +# define STATUS_IO_REPARSE_DATA_INVALID ((NTSTATUS) 0xC0000278L) +#endif + +#ifndef STATUS_IO_REPARSE_TAG_NOT_HANDLED +# define STATUS_IO_REPARSE_TAG_NOT_HANDLED ((NTSTATUS) 0xC0000279L) +#endif + +#ifndef STATUS_REPARSE_POINT_NOT_RESOLVED +# define STATUS_REPARSE_POINT_NOT_RESOLVED ((NTSTATUS) 0xC0000280L) +#endif + +#ifndef STATUS_DIRECTORY_IS_A_REPARSE_POINT +# define STATUS_DIRECTORY_IS_A_REPARSE_POINT ((NTSTATUS) 0xC0000281L) +#endif + +#ifndef STATUS_RANGE_LIST_CONFLICT +# define STATUS_RANGE_LIST_CONFLICT ((NTSTATUS) 0xC0000282L) +#endif + +#ifndef STATUS_SOURCE_ELEMENT_EMPTY +# define STATUS_SOURCE_ELEMENT_EMPTY ((NTSTATUS) 0xC0000283L) +#endif + +#ifndef STATUS_DESTINATION_ELEMENT_FULL +# define STATUS_DESTINATION_ELEMENT_FULL ((NTSTATUS) 0xC0000284L) +#endif + +#ifndef STATUS_ILLEGAL_ELEMENT_ADDRESS +# define STATUS_ILLEGAL_ELEMENT_ADDRESS ((NTSTATUS) 0xC0000285L) +#endif + +#ifndef STATUS_MAGAZINE_NOT_PRESENT +# define STATUS_MAGAZINE_NOT_PRESENT ((NTSTATUS) 0xC0000286L) +#endif + +#ifndef STATUS_REINITIALIZATION_NEEDED +# define STATUS_REINITIALIZATION_NEEDED ((NTSTATUS) 0xC0000287L) +#endif + +#ifndef STATUS_DEVICE_REQUIRES_CLEANING +# define STATUS_DEVICE_REQUIRES_CLEANING ((NTSTATUS) 0x80000288L) +#endif + +#ifndef STATUS_DEVICE_DOOR_OPEN +# define STATUS_DEVICE_DOOR_OPEN ((NTSTATUS) 0x80000289L) +#endif + +#ifndef STATUS_ENCRYPTION_FAILED +# define STATUS_ENCRYPTION_FAILED ((NTSTATUS) 0xC000028AL) +#endif + +#ifndef STATUS_DECRYPTION_FAILED +# define STATUS_DECRYPTION_FAILED ((NTSTATUS) 0xC000028BL) +#endif + +#ifndef STATUS_RANGE_NOT_FOUND +# define STATUS_RANGE_NOT_FOUND ((NTSTATUS) 0xC000028CL) +#endif + +#ifndef STATUS_NO_RECOVERY_POLICY +# define STATUS_NO_RECOVERY_POLICY ((NTSTATUS) 0xC000028DL) +#endif + +#ifndef STATUS_NO_EFS +# define STATUS_NO_EFS ((NTSTATUS) 0xC000028EL) +#endif + +#ifndef STATUS_WRONG_EFS +# define STATUS_WRONG_EFS ((NTSTATUS) 0xC000028FL) +#endif + +#ifndef STATUS_NO_USER_KEYS +# define STATUS_NO_USER_KEYS ((NTSTATUS) 0xC0000290L) +#endif + +#ifndef STATUS_FILE_NOT_ENCRYPTED +# define STATUS_FILE_NOT_ENCRYPTED ((NTSTATUS) 0xC0000291L) +#endif + +#ifndef STATUS_NOT_EXPORT_FORMAT +# define STATUS_NOT_EXPORT_FORMAT ((NTSTATUS) 0xC0000292L) +#endif + +#ifndef STATUS_FILE_ENCRYPTED +# define STATUS_FILE_ENCRYPTED ((NTSTATUS) 0xC0000293L) +#endif + +#ifndef STATUS_WAKE_SYSTEM +# define STATUS_WAKE_SYSTEM ((NTSTATUS) 0x40000294L) +#endif + +#ifndef STATUS_WMI_GUID_NOT_FOUND +# define STATUS_WMI_GUID_NOT_FOUND ((NTSTATUS) 0xC0000295L) +#endif + +#ifndef STATUS_WMI_INSTANCE_NOT_FOUND +# define STATUS_WMI_INSTANCE_NOT_FOUND ((NTSTATUS) 0xC0000296L) +#endif + +#ifndef STATUS_WMI_ITEMID_NOT_FOUND +# define STATUS_WMI_ITEMID_NOT_FOUND ((NTSTATUS) 0xC0000297L) +#endif + +#ifndef STATUS_WMI_TRY_AGAIN +# define STATUS_WMI_TRY_AGAIN ((NTSTATUS) 0xC0000298L) +#endif + +#ifndef STATUS_SHARED_POLICY +# define STATUS_SHARED_POLICY ((NTSTATUS) 0xC0000299L) +#endif + +#ifndef STATUS_POLICY_OBJECT_NOT_FOUND +# define STATUS_POLICY_OBJECT_NOT_FOUND ((NTSTATUS) 0xC000029AL) +#endif + +#ifndef STATUS_POLICY_ONLY_IN_DS +# define STATUS_POLICY_ONLY_IN_DS ((NTSTATUS) 0xC000029BL) +#endif + +#ifndef STATUS_VOLUME_NOT_UPGRADED +# define STATUS_VOLUME_NOT_UPGRADED ((NTSTATUS) 0xC000029CL) +#endif + +#ifndef STATUS_REMOTE_STORAGE_NOT_ACTIVE +# define STATUS_REMOTE_STORAGE_NOT_ACTIVE ((NTSTATUS) 0xC000029DL) +#endif + +#ifndef STATUS_REMOTE_STORAGE_MEDIA_ERROR +# define STATUS_REMOTE_STORAGE_MEDIA_ERROR ((NTSTATUS) 0xC000029EL) +#endif + +#ifndef STATUS_NO_TRACKING_SERVICE +# define STATUS_NO_TRACKING_SERVICE ((NTSTATUS) 0xC000029FL) +#endif + +#ifndef STATUS_SERVER_SID_MISMATCH +# define STATUS_SERVER_SID_MISMATCH ((NTSTATUS) 0xC00002A0L) +#endif + +#ifndef STATUS_DS_NO_ATTRIBUTE_OR_VALUE +# define STATUS_DS_NO_ATTRIBUTE_OR_VALUE ((NTSTATUS) 0xC00002A1L) +#endif + +#ifndef STATUS_DS_INVALID_ATTRIBUTE_SYNTAX +# define STATUS_DS_INVALID_ATTRIBUTE_SYNTAX ((NTSTATUS) 0xC00002A2L) +#endif + +#ifndef STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED +# define STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED ((NTSTATUS) 0xC00002A3L) +#endif + +#ifndef STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS +# define STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS ((NTSTATUS) 0xC00002A4L) +#endif + +#ifndef STATUS_DS_BUSY +# define STATUS_DS_BUSY ((NTSTATUS) 0xC00002A5L) +#endif + +#ifndef STATUS_DS_UNAVAILABLE +# define STATUS_DS_UNAVAILABLE ((NTSTATUS) 0xC00002A6L) +#endif + +#ifndef STATUS_DS_NO_RIDS_ALLOCATED +# define STATUS_DS_NO_RIDS_ALLOCATED ((NTSTATUS) 0xC00002A7L) +#endif + +#ifndef STATUS_DS_NO_MORE_RIDS +# define STATUS_DS_NO_MORE_RIDS ((NTSTATUS) 0xC00002A8L) +#endif + +#ifndef STATUS_DS_INCORRECT_ROLE_OWNER +# define STATUS_DS_INCORRECT_ROLE_OWNER ((NTSTATUS) 0xC00002A9L) +#endif + +#ifndef STATUS_DS_RIDMGR_INIT_ERROR +# define STATUS_DS_RIDMGR_INIT_ERROR ((NTSTATUS) 0xC00002AAL) +#endif + +#ifndef STATUS_DS_OBJ_CLASS_VIOLATION +# define STATUS_DS_OBJ_CLASS_VIOLATION ((NTSTATUS) 0xC00002ABL) +#endif + +#ifndef STATUS_DS_CANT_ON_NON_LEAF +# define STATUS_DS_CANT_ON_NON_LEAF ((NTSTATUS) 0xC00002ACL) +#endif + +#ifndef STATUS_DS_CANT_ON_RDN +# define STATUS_DS_CANT_ON_RDN ((NTSTATUS) 0xC00002ADL) +#endif + +#ifndef STATUS_DS_CANT_MOD_OBJ_CLASS +# define STATUS_DS_CANT_MOD_OBJ_CLASS ((NTSTATUS) 0xC00002AEL) +#endif + +#ifndef STATUS_DS_CROSS_DOM_MOVE_FAILED +# define STATUS_DS_CROSS_DOM_MOVE_FAILED ((NTSTATUS) 0xC00002AFL) +#endif + +#ifndef STATUS_DS_GC_NOT_AVAILABLE +# define STATUS_DS_GC_NOT_AVAILABLE ((NTSTATUS) 0xC00002B0L) +#endif + +#ifndef STATUS_DIRECTORY_SERVICE_REQUIRED +# define STATUS_DIRECTORY_SERVICE_REQUIRED ((NTSTATUS) 0xC00002B1L) +#endif + +#ifndef STATUS_REPARSE_ATTRIBUTE_CONFLICT +# define STATUS_REPARSE_ATTRIBUTE_CONFLICT ((NTSTATUS) 0xC00002B2L) +#endif + +#ifndef STATUS_CANT_ENABLE_DENY_ONLY +# define STATUS_CANT_ENABLE_DENY_ONLY ((NTSTATUS) 0xC00002B3L) +#endif + +#ifndef STATUS_FLOAT_MULTIPLE_FAULTS +# define STATUS_FLOAT_MULTIPLE_FAULTS ((NTSTATUS) 0xC00002B4L) +#endif + +#ifndef STATUS_FLOAT_MULTIPLE_TRAPS +# define STATUS_FLOAT_MULTIPLE_TRAPS ((NTSTATUS) 0xC00002B5L) +#endif + +#ifndef STATUS_DEVICE_REMOVED +# define STATUS_DEVICE_REMOVED ((NTSTATUS) 0xC00002B6L) +#endif + +#ifndef STATUS_JOURNAL_DELETE_IN_PROGRESS +# define STATUS_JOURNAL_DELETE_IN_PROGRESS ((NTSTATUS) 0xC00002B7L) +#endif + +#ifndef STATUS_JOURNAL_NOT_ACTIVE +# define STATUS_JOURNAL_NOT_ACTIVE ((NTSTATUS) 0xC00002B8L) +#endif + +#ifndef STATUS_NOINTERFACE +# define STATUS_NOINTERFACE ((NTSTATUS) 0xC00002B9L) +#endif + +#ifndef STATUS_DS_ADMIN_LIMIT_EXCEEDED +# define STATUS_DS_ADMIN_LIMIT_EXCEEDED ((NTSTATUS) 0xC00002C1L) +#endif + +#ifndef STATUS_DRIVER_FAILED_SLEEP +# define STATUS_DRIVER_FAILED_SLEEP ((NTSTATUS) 0xC00002C2L) +#endif + +#ifndef STATUS_MUTUAL_AUTHENTICATION_FAILED +# define STATUS_MUTUAL_AUTHENTICATION_FAILED ((NTSTATUS) 0xC00002C3L) +#endif + +#ifndef STATUS_CORRUPT_SYSTEM_FILE +# define STATUS_CORRUPT_SYSTEM_FILE ((NTSTATUS) 0xC00002C4L) +#endif + +#ifndef STATUS_DATATYPE_MISALIGNMENT_ERROR +# define STATUS_DATATYPE_MISALIGNMENT_ERROR ((NTSTATUS) 0xC00002C5L) +#endif + +#ifndef STATUS_WMI_READ_ONLY +# define STATUS_WMI_READ_ONLY ((NTSTATUS) 0xC00002C6L) +#endif + +#ifndef STATUS_WMI_SET_FAILURE +# define STATUS_WMI_SET_FAILURE ((NTSTATUS) 0xC00002C7L) +#endif + +#ifndef STATUS_COMMITMENT_MINIMUM +# define STATUS_COMMITMENT_MINIMUM ((NTSTATUS) 0xC00002C8L) +#endif + +#ifndef STATUS_REG_NAT_CONSUMPTION +# define STATUS_REG_NAT_CONSUMPTION ((NTSTATUS) 0xC00002C9L) +#endif + +#ifndef STATUS_TRANSPORT_FULL +# define STATUS_TRANSPORT_FULL ((NTSTATUS) 0xC00002CAL) +#endif + +#ifndef STATUS_DS_SAM_INIT_FAILURE +# define STATUS_DS_SAM_INIT_FAILURE ((NTSTATUS) 0xC00002CBL) +#endif + +#ifndef STATUS_ONLY_IF_CONNECTED +# define STATUS_ONLY_IF_CONNECTED ((NTSTATUS) 0xC00002CCL) +#endif + +#ifndef STATUS_DS_SENSITIVE_GROUP_VIOLATION +# define STATUS_DS_SENSITIVE_GROUP_VIOLATION ((NTSTATUS) 0xC00002CDL) +#endif + +#ifndef STATUS_PNP_RESTART_ENUMERATION +# define STATUS_PNP_RESTART_ENUMERATION ((NTSTATUS) 0xC00002CEL) +#endif + +#ifndef STATUS_JOURNAL_ENTRY_DELETED +# define STATUS_JOURNAL_ENTRY_DELETED ((NTSTATUS) 0xC00002CFL) +#endif + +#ifndef STATUS_DS_CANT_MOD_PRIMARYGROUPID +# define STATUS_DS_CANT_MOD_PRIMARYGROUPID ((NTSTATUS) 0xC00002D0L) +#endif + +#ifndef STATUS_SYSTEM_IMAGE_BAD_SIGNATURE +# define STATUS_SYSTEM_IMAGE_BAD_SIGNATURE ((NTSTATUS) 0xC00002D1L) +#endif + +#ifndef STATUS_PNP_REBOOT_REQUIRED +# define STATUS_PNP_REBOOT_REQUIRED ((NTSTATUS) 0xC00002D2L) +#endif + +#ifndef STATUS_POWER_STATE_INVALID +# define STATUS_POWER_STATE_INVALID ((NTSTATUS) 0xC00002D3L) +#endif + +#ifndef STATUS_DS_INVALID_GROUP_TYPE +# define STATUS_DS_INVALID_GROUP_TYPE ((NTSTATUS) 0xC00002D4L) +#endif + +#ifndef STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN +# define STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN ((NTSTATUS) 0xC00002D5L) +#endif + +#ifndef STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN +# define STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN ((NTSTATUS) 0xC00002D6L) +#endif + +#ifndef STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER +# define STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS) 0xC00002D7L) +#endif + +#ifndef STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER +# define STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS) 0xC00002D8L) +#endif + +#ifndef STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER +# define STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER ((NTSTATUS) 0xC00002D9L) +#endif + +#ifndef STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER +# define STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER ((NTSTATUS) 0xC00002DAL) +#endif + +#ifndef STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER +# define STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER ((NTSTATUS) 0xC00002DBL) +#endif + +#ifndef STATUS_DS_HAVE_PRIMARY_MEMBERS +# define STATUS_DS_HAVE_PRIMARY_MEMBERS ((NTSTATUS) 0xC00002DCL) +#endif + +#ifndef STATUS_WMI_NOT_SUPPORTED +# define STATUS_WMI_NOT_SUPPORTED ((NTSTATUS) 0xC00002DDL) +#endif + +#ifndef STATUS_INSUFFICIENT_POWER +# define STATUS_INSUFFICIENT_POWER ((NTSTATUS) 0xC00002DEL) +#endif + +#ifndef STATUS_SAM_NEED_BOOTKEY_PASSWORD +# define STATUS_SAM_NEED_BOOTKEY_PASSWORD ((NTSTATUS) 0xC00002DFL) +#endif + +#ifndef STATUS_SAM_NEED_BOOTKEY_FLOPPY +# define STATUS_SAM_NEED_BOOTKEY_FLOPPY ((NTSTATUS) 0xC00002E0L) +#endif + +#ifndef STATUS_DS_CANT_START +# define STATUS_DS_CANT_START ((NTSTATUS) 0xC00002E1L) +#endif + +#ifndef STATUS_DS_INIT_FAILURE +# define STATUS_DS_INIT_FAILURE ((NTSTATUS) 0xC00002E2L) +#endif + +#ifndef STATUS_SAM_INIT_FAILURE +# define STATUS_SAM_INIT_FAILURE ((NTSTATUS) 0xC00002E3L) +#endif + +#ifndef STATUS_DS_GC_REQUIRED +# define STATUS_DS_GC_REQUIRED ((NTSTATUS) 0xC00002E4L) +#endif + +#ifndef STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY +# define STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY ((NTSTATUS) 0xC00002E5L) +#endif + +#ifndef STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS +# define STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS ((NTSTATUS) 0xC00002E6L) +#endif + +#ifndef STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED +# define STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED ((NTSTATUS) 0xC00002E7L) +#endif + +#ifndef STATUS_MULTIPLE_FAULT_VIOLATION +# define STATUS_MULTIPLE_FAULT_VIOLATION ((NTSTATUS) 0xC00002E8L) +#endif + +#ifndef STATUS_CURRENT_DOMAIN_NOT_ALLOWED +# define STATUS_CURRENT_DOMAIN_NOT_ALLOWED ((NTSTATUS) 0xC00002E9L) +#endif + +#ifndef STATUS_CANNOT_MAKE +# define STATUS_CANNOT_MAKE ((NTSTATUS) 0xC00002EAL) +#endif + +#ifndef STATUS_SYSTEM_SHUTDOWN +# define STATUS_SYSTEM_SHUTDOWN ((NTSTATUS) 0xC00002EBL) +#endif + +#ifndef STATUS_DS_INIT_FAILURE_CONSOLE +# define STATUS_DS_INIT_FAILURE_CONSOLE ((NTSTATUS) 0xC00002ECL) +#endif + +#ifndef STATUS_DS_SAM_INIT_FAILURE_CONSOLE +# define STATUS_DS_SAM_INIT_FAILURE_CONSOLE ((NTSTATUS) 0xC00002EDL) +#endif + +#ifndef STATUS_UNFINISHED_CONTEXT_DELETED +# define STATUS_UNFINISHED_CONTEXT_DELETED ((NTSTATUS) 0xC00002EEL) +#endif + +#ifndef STATUS_NO_TGT_REPLY +# define STATUS_NO_TGT_REPLY ((NTSTATUS) 0xC00002EFL) +#endif + +#ifndef STATUS_OBJECTID_NOT_FOUND +# define STATUS_OBJECTID_NOT_FOUND ((NTSTATUS) 0xC00002F0L) +#endif + +#ifndef STATUS_NO_IP_ADDRESSES +# define STATUS_NO_IP_ADDRESSES ((NTSTATUS) 0xC00002F1L) +#endif + +#ifndef STATUS_WRONG_CREDENTIAL_HANDLE +# define STATUS_WRONG_CREDENTIAL_HANDLE ((NTSTATUS) 0xC00002F2L) +#endif + +#ifndef STATUS_CRYPTO_SYSTEM_INVALID +# define STATUS_CRYPTO_SYSTEM_INVALID ((NTSTATUS) 0xC00002F3L) +#endif + +#ifndef STATUS_MAX_REFERRALS_EXCEEDED +# define STATUS_MAX_REFERRALS_EXCEEDED ((NTSTATUS) 0xC00002F4L) +#endif + +#ifndef STATUS_MUST_BE_KDC +# define STATUS_MUST_BE_KDC ((NTSTATUS) 0xC00002F5L) +#endif + +#ifndef STATUS_STRONG_CRYPTO_NOT_SUPPORTED +# define STATUS_STRONG_CRYPTO_NOT_SUPPORTED ((NTSTATUS) 0xC00002F6L) +#endif + +#ifndef STATUS_TOO_MANY_PRINCIPALS +# define STATUS_TOO_MANY_PRINCIPALS ((NTSTATUS) 0xC00002F7L) +#endif + +#ifndef STATUS_NO_PA_DATA +# define STATUS_NO_PA_DATA ((NTSTATUS) 0xC00002F8L) +#endif + +#ifndef STATUS_PKINIT_NAME_MISMATCH +# define STATUS_PKINIT_NAME_MISMATCH ((NTSTATUS) 0xC00002F9L) +#endif + +#ifndef STATUS_SMARTCARD_LOGON_REQUIRED +# define STATUS_SMARTCARD_LOGON_REQUIRED ((NTSTATUS) 0xC00002FAL) +#endif + +#ifndef STATUS_KDC_INVALID_REQUEST +# define STATUS_KDC_INVALID_REQUEST ((NTSTATUS) 0xC00002FBL) +#endif + +#ifndef STATUS_KDC_UNABLE_TO_REFER +# define STATUS_KDC_UNABLE_TO_REFER ((NTSTATUS) 0xC00002FCL) +#endif + +#ifndef STATUS_KDC_UNKNOWN_ETYPE +# define STATUS_KDC_UNKNOWN_ETYPE ((NTSTATUS) 0xC00002FDL) +#endif + +#ifndef STATUS_SHUTDOWN_IN_PROGRESS +# define STATUS_SHUTDOWN_IN_PROGRESS ((NTSTATUS) 0xC00002FEL) +#endif + +#ifndef STATUS_SERVER_SHUTDOWN_IN_PROGRESS +# define STATUS_SERVER_SHUTDOWN_IN_PROGRESS ((NTSTATUS) 0xC00002FFL) +#endif + +#ifndef STATUS_NOT_SUPPORTED_ON_SBS +# define STATUS_NOT_SUPPORTED_ON_SBS ((NTSTATUS) 0xC0000300L) +#endif + +#ifndef STATUS_WMI_GUID_DISCONNECTED +# define STATUS_WMI_GUID_DISCONNECTED ((NTSTATUS) 0xC0000301L) +#endif + +#ifndef STATUS_WMI_ALREADY_DISABLED +# define STATUS_WMI_ALREADY_DISABLED ((NTSTATUS) 0xC0000302L) +#endif + +#ifndef STATUS_WMI_ALREADY_ENABLED +# define STATUS_WMI_ALREADY_ENABLED ((NTSTATUS) 0xC0000303L) +#endif + +#ifndef STATUS_MFT_TOO_FRAGMENTED +# define STATUS_MFT_TOO_FRAGMENTED ((NTSTATUS) 0xC0000304L) +#endif + +#ifndef STATUS_COPY_PROTECTION_FAILURE +# define STATUS_COPY_PROTECTION_FAILURE ((NTSTATUS) 0xC0000305L) +#endif + +#ifndef STATUS_CSS_AUTHENTICATION_FAILURE +# define STATUS_CSS_AUTHENTICATION_FAILURE ((NTSTATUS) 0xC0000306L) +#endif + +#ifndef STATUS_CSS_KEY_NOT_PRESENT +# define STATUS_CSS_KEY_NOT_PRESENT ((NTSTATUS) 0xC0000307L) +#endif + +#ifndef STATUS_CSS_KEY_NOT_ESTABLISHED +# define STATUS_CSS_KEY_NOT_ESTABLISHED ((NTSTATUS) 0xC0000308L) +#endif + +#ifndef STATUS_CSS_SCRAMBLED_SECTOR +# define STATUS_CSS_SCRAMBLED_SECTOR ((NTSTATUS) 0xC0000309L) +#endif + +#ifndef STATUS_CSS_REGION_MISMATCH +# define STATUS_CSS_REGION_MISMATCH ((NTSTATUS) 0xC000030AL) +#endif + +#ifndef STATUS_CSS_RESETS_EXHAUSTED +# define STATUS_CSS_RESETS_EXHAUSTED ((NTSTATUS) 0xC000030BL) +#endif + +#ifndef STATUS_PKINIT_FAILURE +# define STATUS_PKINIT_FAILURE ((NTSTATUS) 0xC0000320L) +#endif + +#ifndef STATUS_SMARTCARD_SUBSYSTEM_FAILURE +# define STATUS_SMARTCARD_SUBSYSTEM_FAILURE ((NTSTATUS) 0xC0000321L) +#endif + +#ifndef STATUS_NO_KERB_KEY +# define STATUS_NO_KERB_KEY ((NTSTATUS) 0xC0000322L) +#endif + +#ifndef STATUS_HOST_DOWN +# define STATUS_HOST_DOWN ((NTSTATUS) 0xC0000350L) +#endif + +#ifndef STATUS_UNSUPPORTED_PREAUTH +# define STATUS_UNSUPPORTED_PREAUTH ((NTSTATUS) 0xC0000351L) +#endif + +#ifndef STATUS_EFS_ALG_BLOB_TOO_BIG +# define STATUS_EFS_ALG_BLOB_TOO_BIG ((NTSTATUS) 0xC0000352L) +#endif + +#ifndef STATUS_PORT_NOT_SET +# define STATUS_PORT_NOT_SET ((NTSTATUS) 0xC0000353L) +#endif + +#ifndef STATUS_DEBUGGER_INACTIVE +# define STATUS_DEBUGGER_INACTIVE ((NTSTATUS) 0xC0000354L) +#endif + +#ifndef STATUS_DS_VERSION_CHECK_FAILURE +# define STATUS_DS_VERSION_CHECK_FAILURE ((NTSTATUS) 0xC0000355L) +#endif + +#ifndef STATUS_AUDITING_DISABLED +# define STATUS_AUDITING_DISABLED ((NTSTATUS) 0xC0000356L) +#endif + +#ifndef STATUS_PRENT4_MACHINE_ACCOUNT +# define STATUS_PRENT4_MACHINE_ACCOUNT ((NTSTATUS) 0xC0000357L) +#endif + +#ifndef STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER +# define STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER ((NTSTATUS) 0xC0000358L) +#endif + +#ifndef STATUS_INVALID_IMAGE_WIN_32 +# define STATUS_INVALID_IMAGE_WIN_32 ((NTSTATUS) 0xC0000359L) +#endif + +#ifndef STATUS_INVALID_IMAGE_WIN_64 +# define STATUS_INVALID_IMAGE_WIN_64 ((NTSTATUS) 0xC000035AL) +#endif + +#ifndef STATUS_BAD_BINDINGS +# define STATUS_BAD_BINDINGS ((NTSTATUS) 0xC000035BL) +#endif + +#ifndef STATUS_NETWORK_SESSION_EXPIRED +# define STATUS_NETWORK_SESSION_EXPIRED ((NTSTATUS) 0xC000035CL) +#endif + +#ifndef STATUS_APPHELP_BLOCK +# define STATUS_APPHELP_BLOCK ((NTSTATUS) 0xC000035DL) +#endif + +#ifndef STATUS_ALL_SIDS_FILTERED +# define STATUS_ALL_SIDS_FILTERED ((NTSTATUS) 0xC000035EL) +#endif + +#ifndef STATUS_NOT_SAFE_MODE_DRIVER +# define STATUS_NOT_SAFE_MODE_DRIVER ((NTSTATUS) 0xC000035FL) +#endif + +#ifndef STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT +# define STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT ((NTSTATUS) 0xC0000361L) +#endif + +#ifndef STATUS_ACCESS_DISABLED_BY_POLICY_PATH +# define STATUS_ACCESS_DISABLED_BY_POLICY_PATH ((NTSTATUS) 0xC0000362L) +#endif + +#ifndef STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER +# define STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER ((NTSTATUS) 0xC0000363L) +#endif + +#ifndef STATUS_ACCESS_DISABLED_BY_POLICY_OTHER +# define STATUS_ACCESS_DISABLED_BY_POLICY_OTHER ((NTSTATUS) 0xC0000364L) +#endif + +#ifndef STATUS_FAILED_DRIVER_ENTRY +# define STATUS_FAILED_DRIVER_ENTRY ((NTSTATUS) 0xC0000365L) +#endif + +#ifndef STATUS_DEVICE_ENUMERATION_ERROR +# define STATUS_DEVICE_ENUMERATION_ERROR ((NTSTATUS) 0xC0000366L) +#endif + +#ifndef STATUS_MOUNT_POINT_NOT_RESOLVED +# define STATUS_MOUNT_POINT_NOT_RESOLVED ((NTSTATUS) 0xC0000368L) +#endif + +#ifndef STATUS_INVALID_DEVICE_OBJECT_PARAMETER +# define STATUS_INVALID_DEVICE_OBJECT_PARAMETER ((NTSTATUS) 0xC0000369L) +#endif + +#ifndef STATUS_MCA_OCCURED +# define STATUS_MCA_OCCURED ((NTSTATUS) 0xC000036AL) +#endif + +#ifndef STATUS_DRIVER_BLOCKED_CRITICAL +# define STATUS_DRIVER_BLOCKED_CRITICAL ((NTSTATUS) 0xC000036BL) +#endif + +#ifndef STATUS_DRIVER_BLOCKED +# define STATUS_DRIVER_BLOCKED ((NTSTATUS) 0xC000036CL) +#endif + +#ifndef STATUS_DRIVER_DATABASE_ERROR +# define STATUS_DRIVER_DATABASE_ERROR ((NTSTATUS) 0xC000036DL) +#endif + +#ifndef STATUS_SYSTEM_HIVE_TOO_LARGE +# define STATUS_SYSTEM_HIVE_TOO_LARGE ((NTSTATUS) 0xC000036EL) +#endif + +#ifndef STATUS_INVALID_IMPORT_OF_NON_DLL +# define STATUS_INVALID_IMPORT_OF_NON_DLL ((NTSTATUS) 0xC000036FL) +#endif + +#ifndef STATUS_DS_SHUTTING_DOWN +# define STATUS_DS_SHUTTING_DOWN ((NTSTATUS) 0x40000370L) +#endif + +#ifndef STATUS_NO_SECRETS +# define STATUS_NO_SECRETS ((NTSTATUS) 0xC0000371L) +#endif + +#ifndef STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY +# define STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY ((NTSTATUS) 0xC0000372L) +#endif + +#ifndef STATUS_FAILED_STACK_SWITCH +# define STATUS_FAILED_STACK_SWITCH ((NTSTATUS) 0xC0000373L) +#endif + +#ifndef STATUS_HEAP_CORRUPTION +# define STATUS_HEAP_CORRUPTION ((NTSTATUS) 0xC0000374L) +#endif + +#ifndef STATUS_SMARTCARD_WRONG_PIN +# define STATUS_SMARTCARD_WRONG_PIN ((NTSTATUS) 0xC0000380L) +#endif + +#ifndef STATUS_SMARTCARD_CARD_BLOCKED +# define STATUS_SMARTCARD_CARD_BLOCKED ((NTSTATUS) 0xC0000381L) +#endif + +#ifndef STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED +# define STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED ((NTSTATUS) 0xC0000382L) +#endif + +#ifndef STATUS_SMARTCARD_NO_CARD +# define STATUS_SMARTCARD_NO_CARD ((NTSTATUS) 0xC0000383L) +#endif + +#ifndef STATUS_SMARTCARD_NO_KEY_CONTAINER +# define STATUS_SMARTCARD_NO_KEY_CONTAINER ((NTSTATUS) 0xC0000384L) +#endif + +#ifndef STATUS_SMARTCARD_NO_CERTIFICATE +# define STATUS_SMARTCARD_NO_CERTIFICATE ((NTSTATUS) 0xC0000385L) +#endif + +#ifndef STATUS_SMARTCARD_NO_KEYSET +# define STATUS_SMARTCARD_NO_KEYSET ((NTSTATUS) 0xC0000386L) +#endif + +#ifndef STATUS_SMARTCARD_IO_ERROR +# define STATUS_SMARTCARD_IO_ERROR ((NTSTATUS) 0xC0000387L) +#endif + +#ifndef STATUS_DOWNGRADE_DETECTED +# define STATUS_DOWNGRADE_DETECTED ((NTSTATUS) 0xC0000388L) +#endif + +#ifndef STATUS_SMARTCARD_CERT_REVOKED +# define STATUS_SMARTCARD_CERT_REVOKED ((NTSTATUS) 0xC0000389L) +#endif + +#ifndef STATUS_ISSUING_CA_UNTRUSTED +# define STATUS_ISSUING_CA_UNTRUSTED ((NTSTATUS) 0xC000038AL) +#endif + +#ifndef STATUS_REVOCATION_OFFLINE_C +# define STATUS_REVOCATION_OFFLINE_C ((NTSTATUS) 0xC000038BL) +#endif + +#ifndef STATUS_PKINIT_CLIENT_FAILURE +# define STATUS_PKINIT_CLIENT_FAILURE ((NTSTATUS) 0xC000038CL) +#endif + +#ifndef STATUS_SMARTCARD_CERT_EXPIRED +# define STATUS_SMARTCARD_CERT_EXPIRED ((NTSTATUS) 0xC000038DL) +#endif + +#ifndef STATUS_DRIVER_FAILED_PRIOR_UNLOAD +# define STATUS_DRIVER_FAILED_PRIOR_UNLOAD ((NTSTATUS) 0xC000038EL) +#endif + +#ifndef STATUS_SMARTCARD_SILENT_CONTEXT +# define STATUS_SMARTCARD_SILENT_CONTEXT ((NTSTATUS) 0xC000038FL) +#endif + +#ifndef STATUS_PER_USER_TRUST_QUOTA_EXCEEDED +# define STATUS_PER_USER_TRUST_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000401L) +#endif + +#ifndef STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED +# define STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000402L) +#endif + +#ifndef STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED +# define STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000403L) +#endif + +#ifndef STATUS_DS_NAME_NOT_UNIQUE +# define STATUS_DS_NAME_NOT_UNIQUE ((NTSTATUS) 0xC0000404L) +#endif + +#ifndef STATUS_DS_DUPLICATE_ID_FOUND +# define STATUS_DS_DUPLICATE_ID_FOUND ((NTSTATUS) 0xC0000405L) +#endif + +#ifndef STATUS_DS_GROUP_CONVERSION_ERROR +# define STATUS_DS_GROUP_CONVERSION_ERROR ((NTSTATUS) 0xC0000406L) +#endif + +#ifndef STATUS_VOLSNAP_PREPARE_HIBERNATE +# define STATUS_VOLSNAP_PREPARE_HIBERNATE ((NTSTATUS) 0xC0000407L) +#endif + +#ifndef STATUS_USER2USER_REQUIRED +# define STATUS_USER2USER_REQUIRED ((NTSTATUS) 0xC0000408L) +#endif + +#ifndef STATUS_STACK_BUFFER_OVERRUN +# define STATUS_STACK_BUFFER_OVERRUN ((NTSTATUS) 0xC0000409L) +#endif + +#ifndef STATUS_NO_S4U_PROT_SUPPORT +# define STATUS_NO_S4U_PROT_SUPPORT ((NTSTATUS) 0xC000040AL) +#endif + +#ifndef STATUS_CROSSREALM_DELEGATION_FAILURE +# define STATUS_CROSSREALM_DELEGATION_FAILURE ((NTSTATUS) 0xC000040BL) +#endif + +#ifndef STATUS_REVOCATION_OFFLINE_KDC +# define STATUS_REVOCATION_OFFLINE_KDC ((NTSTATUS) 0xC000040CL) +#endif + +#ifndef STATUS_ISSUING_CA_UNTRUSTED_KDC +# define STATUS_ISSUING_CA_UNTRUSTED_KDC ((NTSTATUS) 0xC000040DL) +#endif + +#ifndef STATUS_KDC_CERT_EXPIRED +# define STATUS_KDC_CERT_EXPIRED ((NTSTATUS) 0xC000040EL) +#endif + +#ifndef STATUS_KDC_CERT_REVOKED +# define STATUS_KDC_CERT_REVOKED ((NTSTATUS) 0xC000040FL) +#endif + +#ifndef STATUS_PARAMETER_QUOTA_EXCEEDED +# define STATUS_PARAMETER_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000410L) +#endif + +#ifndef STATUS_HIBERNATION_FAILURE +# define STATUS_HIBERNATION_FAILURE ((NTSTATUS) 0xC0000411L) +#endif + +#ifndef STATUS_DELAY_LOAD_FAILED +# define STATUS_DELAY_LOAD_FAILED ((NTSTATUS) 0xC0000412L) +#endif + +#ifndef STATUS_AUTHENTICATION_FIREWALL_FAILED +# define STATUS_AUTHENTICATION_FIREWALL_FAILED ((NTSTATUS) 0xC0000413L) +#endif + +#ifndef STATUS_VDM_DISALLOWED +# define STATUS_VDM_DISALLOWED ((NTSTATUS) 0xC0000414L) +#endif + +#ifndef STATUS_HUNG_DISPLAY_DRIVER_THREAD +# define STATUS_HUNG_DISPLAY_DRIVER_THREAD ((NTSTATUS) 0xC0000415L) +#endif + +#ifndef STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE +# define STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE ((NTSTATUS) 0xC0000416L) +#endif + +#ifndef STATUS_INVALID_CRUNTIME_PARAMETER +# define STATUS_INVALID_CRUNTIME_PARAMETER ((NTSTATUS) 0xC0000417L) +#endif + +#ifndef STATUS_NTLM_BLOCKED +# define STATUS_NTLM_BLOCKED ((NTSTATUS) 0xC0000418L) +#endif + +#ifndef STATUS_DS_SRC_SID_EXISTS_IN_FOREST +# define STATUS_DS_SRC_SID_EXISTS_IN_FOREST ((NTSTATUS) 0xC0000419L) +#endif + +#ifndef STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST +# define STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST ((NTSTATUS) 0xC000041AL) +#endif + +#ifndef STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST +# define STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST ((NTSTATUS) 0xC000041BL) +#endif + +#ifndef STATUS_INVALID_USER_PRINCIPAL_NAME +# define STATUS_INVALID_USER_PRINCIPAL_NAME ((NTSTATUS) 0xC000041CL) +#endif + +#ifndef STATUS_FATAL_USER_CALLBACK_EXCEPTION +# define STATUS_FATAL_USER_CALLBACK_EXCEPTION ((NTSTATUS) 0xC000041DL) +#endif + +#ifndef STATUS_ASSERTION_FAILURE +# define STATUS_ASSERTION_FAILURE ((NTSTATUS) 0xC0000420L) +#endif + +#ifndef STATUS_VERIFIER_STOP +# define STATUS_VERIFIER_STOP ((NTSTATUS) 0xC0000421L) +#endif + +#ifndef STATUS_CALLBACK_POP_STACK +# define STATUS_CALLBACK_POP_STACK ((NTSTATUS) 0xC0000423L) +#endif + +#ifndef STATUS_INCOMPATIBLE_DRIVER_BLOCKED +# define STATUS_INCOMPATIBLE_DRIVER_BLOCKED ((NTSTATUS) 0xC0000424L) +#endif + +#ifndef STATUS_HIVE_UNLOADED +# define STATUS_HIVE_UNLOADED ((NTSTATUS) 0xC0000425L) +#endif + +#ifndef STATUS_COMPRESSION_DISABLED +# define STATUS_COMPRESSION_DISABLED ((NTSTATUS) 0xC0000426L) +#endif + +#ifndef STATUS_FILE_SYSTEM_LIMITATION +# define STATUS_FILE_SYSTEM_LIMITATION ((NTSTATUS) 0xC0000427L) +#endif + +#ifndef STATUS_INVALID_IMAGE_HASH +# define STATUS_INVALID_IMAGE_HASH ((NTSTATUS) 0xC0000428L) +#endif + +#ifndef STATUS_NOT_CAPABLE +# define STATUS_NOT_CAPABLE ((NTSTATUS) 0xC0000429L) +#endif + +#ifndef STATUS_REQUEST_OUT_OF_SEQUENCE +# define STATUS_REQUEST_OUT_OF_SEQUENCE ((NTSTATUS) 0xC000042AL) +#endif + +#ifndef STATUS_IMPLEMENTATION_LIMIT +# define STATUS_IMPLEMENTATION_LIMIT ((NTSTATUS) 0xC000042BL) +#endif + +#ifndef STATUS_ELEVATION_REQUIRED +# define STATUS_ELEVATION_REQUIRED ((NTSTATUS) 0xC000042CL) +#endif + +#ifndef STATUS_NO_SECURITY_CONTEXT +# define STATUS_NO_SECURITY_CONTEXT ((NTSTATUS) 0xC000042DL) +#endif + +#ifndef STATUS_PKU2U_CERT_FAILURE +# define STATUS_PKU2U_CERT_FAILURE ((NTSTATUS) 0xC000042FL) +#endif + +#ifndef STATUS_BEYOND_VDL +# define STATUS_BEYOND_VDL ((NTSTATUS) 0xC0000432L) +#endif + +#ifndef STATUS_ENCOUNTERED_WRITE_IN_PROGRESS +# define STATUS_ENCOUNTERED_WRITE_IN_PROGRESS ((NTSTATUS) 0xC0000433L) +#endif + +#ifndef STATUS_PTE_CHANGED +# define STATUS_PTE_CHANGED ((NTSTATUS) 0xC0000434L) +#endif + +#ifndef STATUS_PURGE_FAILED +# define STATUS_PURGE_FAILED ((NTSTATUS) 0xC0000435L) +#endif + +#ifndef STATUS_CRED_REQUIRES_CONFIRMATION +# define STATUS_CRED_REQUIRES_CONFIRMATION ((NTSTATUS) 0xC0000440L) +#endif + +#ifndef STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE +# define STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE ((NTSTATUS) 0xC0000441L) +#endif + +#ifndef STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER +# define STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER ((NTSTATUS) 0xC0000442L) +#endif + +#ifndef STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE +# define STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE ((NTSTATUS) 0xC0000443L) +#endif + +#ifndef STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE +# define STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE ((NTSTATUS) 0xC0000444L) +#endif + +#ifndef STATUS_CS_ENCRYPTION_FILE_NOT_CSE +# define STATUS_CS_ENCRYPTION_FILE_NOT_CSE ((NTSTATUS) 0xC0000445L) +#endif + +#ifndef STATUS_INVALID_LABEL +# define STATUS_INVALID_LABEL ((NTSTATUS) 0xC0000446L) +#endif + +#ifndef STATUS_DRIVER_PROCESS_TERMINATED +# define STATUS_DRIVER_PROCESS_TERMINATED ((NTSTATUS) 0xC0000450L) +#endif + +#ifndef STATUS_AMBIGUOUS_SYSTEM_DEVICE +# define STATUS_AMBIGUOUS_SYSTEM_DEVICE ((NTSTATUS) 0xC0000451L) +#endif + +#ifndef STATUS_SYSTEM_DEVICE_NOT_FOUND +# define STATUS_SYSTEM_DEVICE_NOT_FOUND ((NTSTATUS) 0xC0000452L) +#endif + +#ifndef STATUS_RESTART_BOOT_APPLICATION +# define STATUS_RESTART_BOOT_APPLICATION ((NTSTATUS) 0xC0000453L) +#endif + +#ifndef STATUS_INSUFFICIENT_NVRAM_RESOURCES +# define STATUS_INSUFFICIENT_NVRAM_RESOURCES ((NTSTATUS) 0xC0000454L) +#endif + +#ifndef STATUS_INVALID_TASK_NAME +# define STATUS_INVALID_TASK_NAME ((NTSTATUS) 0xC0000500L) +#endif + +#ifndef STATUS_INVALID_TASK_INDEX +# define STATUS_INVALID_TASK_INDEX ((NTSTATUS) 0xC0000501L) +#endif + +#ifndef STATUS_THREAD_ALREADY_IN_TASK +# define STATUS_THREAD_ALREADY_IN_TASK ((NTSTATUS) 0xC0000502L) +#endif + +#ifndef STATUS_CALLBACK_BYPASS +# define STATUS_CALLBACK_BYPASS ((NTSTATUS) 0xC0000503L) +#endif + +#ifndef STATUS_FAIL_FAST_EXCEPTION +# define STATUS_FAIL_FAST_EXCEPTION ((NTSTATUS) 0xC0000602L) +#endif + +#ifndef STATUS_IMAGE_CERT_REVOKED +# define STATUS_IMAGE_CERT_REVOKED ((NTSTATUS) 0xC0000603L) +#endif + +#ifndef STATUS_PORT_CLOSED +# define STATUS_PORT_CLOSED ((NTSTATUS) 0xC0000700L) +#endif + +#ifndef STATUS_MESSAGE_LOST +# define STATUS_MESSAGE_LOST ((NTSTATUS) 0xC0000701L) +#endif + +#ifndef STATUS_INVALID_MESSAGE +# define STATUS_INVALID_MESSAGE ((NTSTATUS) 0xC0000702L) +#endif + +#ifndef STATUS_REQUEST_CANCELED +# define STATUS_REQUEST_CANCELED ((NTSTATUS) 0xC0000703L) +#endif + +#ifndef STATUS_RECURSIVE_DISPATCH +# define STATUS_RECURSIVE_DISPATCH ((NTSTATUS) 0xC0000704L) +#endif + +#ifndef STATUS_LPC_RECEIVE_BUFFER_EXPECTED +# define STATUS_LPC_RECEIVE_BUFFER_EXPECTED ((NTSTATUS) 0xC0000705L) +#endif + +#ifndef STATUS_LPC_INVALID_CONNECTION_USAGE +# define STATUS_LPC_INVALID_CONNECTION_USAGE ((NTSTATUS) 0xC0000706L) +#endif + +#ifndef STATUS_LPC_REQUESTS_NOT_ALLOWED +# define STATUS_LPC_REQUESTS_NOT_ALLOWED ((NTSTATUS) 0xC0000707L) +#endif + +#ifndef STATUS_RESOURCE_IN_USE +# define STATUS_RESOURCE_IN_USE ((NTSTATUS) 0xC0000708L) +#endif + +#ifndef STATUS_HARDWARE_MEMORY_ERROR +# define STATUS_HARDWARE_MEMORY_ERROR ((NTSTATUS) 0xC0000709L) +#endif + +#ifndef STATUS_THREADPOOL_HANDLE_EXCEPTION +# define STATUS_THREADPOOL_HANDLE_EXCEPTION ((NTSTATUS) 0xC000070AL) +#endif + +#ifndef STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED +# define STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070BL) +#endif + +#ifndef STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED +# define STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070CL) +#endif + +#ifndef STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED +# define STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070DL) +#endif + +#ifndef STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED +# define STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED ((NTSTATUS) 0xC000070EL) +#endif + +#ifndef STATUS_THREADPOOL_RELEASED_DURING_OPERATION +# define STATUS_THREADPOOL_RELEASED_DURING_OPERATION ((NTSTATUS) 0xC000070FL) +#endif + +#ifndef STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING +# define STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING ((NTSTATUS) 0xC0000710L) +#endif + +#ifndef STATUS_APC_RETURNED_WHILE_IMPERSONATING +# define STATUS_APC_RETURNED_WHILE_IMPERSONATING ((NTSTATUS) 0xC0000711L) +#endif + +#ifndef STATUS_PROCESS_IS_PROTECTED +# define STATUS_PROCESS_IS_PROTECTED ((NTSTATUS) 0xC0000712L) +#endif + +#ifndef STATUS_MCA_EXCEPTION +# define STATUS_MCA_EXCEPTION ((NTSTATUS) 0xC0000713L) +#endif + +#ifndef STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE +# define STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE ((NTSTATUS) 0xC0000714L) +#endif + +#ifndef STATUS_SYMLINK_CLASS_DISABLED +# define STATUS_SYMLINK_CLASS_DISABLED ((NTSTATUS) 0xC0000715L) +#endif + +#ifndef STATUS_INVALID_IDN_NORMALIZATION +# define STATUS_INVALID_IDN_NORMALIZATION ((NTSTATUS) 0xC0000716L) +#endif + +#ifndef STATUS_NO_UNICODE_TRANSLATION +# define STATUS_NO_UNICODE_TRANSLATION ((NTSTATUS) 0xC0000717L) +#endif + +#ifndef STATUS_ALREADY_REGISTERED +# define STATUS_ALREADY_REGISTERED ((NTSTATUS) 0xC0000718L) +#endif + +#ifndef STATUS_CONTEXT_MISMATCH +# define STATUS_CONTEXT_MISMATCH ((NTSTATUS) 0xC0000719L) +#endif + +#ifndef STATUS_PORT_ALREADY_HAS_COMPLETION_LIST +# define STATUS_PORT_ALREADY_HAS_COMPLETION_LIST ((NTSTATUS) 0xC000071AL) +#endif + +#ifndef STATUS_CALLBACK_RETURNED_THREAD_PRIORITY +# define STATUS_CALLBACK_RETURNED_THREAD_PRIORITY ((NTSTATUS) 0xC000071BL) +#endif + +#ifndef STATUS_INVALID_THREAD +# define STATUS_INVALID_THREAD ((NTSTATUS) 0xC000071CL) +#endif + +#ifndef STATUS_CALLBACK_RETURNED_TRANSACTION +# define STATUS_CALLBACK_RETURNED_TRANSACTION ((NTSTATUS) 0xC000071DL) +#endif + +#ifndef STATUS_CALLBACK_RETURNED_LDR_LOCK +# define STATUS_CALLBACK_RETURNED_LDR_LOCK ((NTSTATUS) 0xC000071EL) +#endif + +#ifndef STATUS_CALLBACK_RETURNED_LANG +# define STATUS_CALLBACK_RETURNED_LANG ((NTSTATUS) 0xC000071FL) +#endif + +#ifndef STATUS_CALLBACK_RETURNED_PRI_BACK +# define STATUS_CALLBACK_RETURNED_PRI_BACK ((NTSTATUS) 0xC0000720L) +#endif + +#ifndef STATUS_CALLBACK_RETURNED_THREAD_AFFINITY +# define STATUS_CALLBACK_RETURNED_THREAD_AFFINITY ((NTSTATUS) 0xC0000721L) +#endif + +#ifndef STATUS_DISK_REPAIR_DISABLED +# define STATUS_DISK_REPAIR_DISABLED ((NTSTATUS) 0xC0000800L) +#endif + +#ifndef STATUS_DS_DOMAIN_RENAME_IN_PROGRESS +# define STATUS_DS_DOMAIN_RENAME_IN_PROGRESS ((NTSTATUS) 0xC0000801L) +#endif + +#ifndef STATUS_DISK_QUOTA_EXCEEDED +# define STATUS_DISK_QUOTA_EXCEEDED ((NTSTATUS) 0xC0000802L) +#endif + +#ifndef STATUS_DATA_LOST_REPAIR +# define STATUS_DATA_LOST_REPAIR ((NTSTATUS) 0x80000803L) +#endif + +#ifndef STATUS_CONTENT_BLOCKED +# define STATUS_CONTENT_BLOCKED ((NTSTATUS) 0xC0000804L) +#endif + +#ifndef STATUS_BAD_CLUSTERS +# define STATUS_BAD_CLUSTERS ((NTSTATUS) 0xC0000805L) +#endif + +#ifndef STATUS_VOLUME_DIRTY +# define STATUS_VOLUME_DIRTY ((NTSTATUS) 0xC0000806L) +#endif + +#ifndef STATUS_FILE_CHECKED_OUT +# define STATUS_FILE_CHECKED_OUT ((NTSTATUS) 0xC0000901L) +#endif + +#ifndef STATUS_CHECKOUT_REQUIRED +# define STATUS_CHECKOUT_REQUIRED ((NTSTATUS) 0xC0000902L) +#endif + +#ifndef STATUS_BAD_FILE_TYPE +# define STATUS_BAD_FILE_TYPE ((NTSTATUS) 0xC0000903L) +#endif + +#ifndef STATUS_FILE_TOO_LARGE +# define STATUS_FILE_TOO_LARGE ((NTSTATUS) 0xC0000904L) +#endif + +#ifndef STATUS_FORMS_AUTH_REQUIRED +# define STATUS_FORMS_AUTH_REQUIRED ((NTSTATUS) 0xC0000905L) +#endif + +#ifndef STATUS_VIRUS_INFECTED +# define STATUS_VIRUS_INFECTED ((NTSTATUS) 0xC0000906L) +#endif + +#ifndef STATUS_VIRUS_DELETED +# define STATUS_VIRUS_DELETED ((NTSTATUS) 0xC0000907L) +#endif + +#ifndef STATUS_BAD_MCFG_TABLE +# define STATUS_BAD_MCFG_TABLE ((NTSTATUS) 0xC0000908L) +#endif + +#ifndef STATUS_CANNOT_BREAK_OPLOCK +# define STATUS_CANNOT_BREAK_OPLOCK ((NTSTATUS) 0xC0000909L) +#endif + +#ifndef STATUS_WOW_ASSERTION +# define STATUS_WOW_ASSERTION ((NTSTATUS) 0xC0009898L) +#endif + +#ifndef STATUS_INVALID_SIGNATURE +# define STATUS_INVALID_SIGNATURE ((NTSTATUS) 0xC000A000L) +#endif + +#ifndef STATUS_HMAC_NOT_SUPPORTED +# define STATUS_HMAC_NOT_SUPPORTED ((NTSTATUS) 0xC000A001L) +#endif + +#ifndef STATUS_AUTH_TAG_MISMATCH +# define STATUS_AUTH_TAG_MISMATCH ((NTSTATUS) 0xC000A002L) +#endif + +#ifndef STATUS_IPSEC_QUEUE_OVERFLOW +# define STATUS_IPSEC_QUEUE_OVERFLOW ((NTSTATUS) 0xC000A010L) +#endif + +#ifndef STATUS_ND_QUEUE_OVERFLOW +# define STATUS_ND_QUEUE_OVERFLOW ((NTSTATUS) 0xC000A011L) +#endif + +#ifndef STATUS_HOPLIMIT_EXCEEDED +# define STATUS_HOPLIMIT_EXCEEDED ((NTSTATUS) 0xC000A012L) +#endif + +#ifndef STATUS_PROTOCOL_NOT_SUPPORTED +# define STATUS_PROTOCOL_NOT_SUPPORTED ((NTSTATUS) 0xC000A013L) +#endif + +#ifndef STATUS_FASTPATH_REJECTED +# define STATUS_FASTPATH_REJECTED ((NTSTATUS) 0xC000A014L) +#endif + +#ifndef STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED +# define STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED ((NTSTATUS) 0xC000A080L) +#endif + +#ifndef STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR +# define STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR ((NTSTATUS) 0xC000A081L) +#endif + +#ifndef STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR +# define STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR ((NTSTATUS) 0xC000A082L) +#endif + +#ifndef STATUS_XML_PARSE_ERROR +# define STATUS_XML_PARSE_ERROR ((NTSTATUS) 0xC000A083L) +#endif + +#ifndef STATUS_XMLDSIG_ERROR +# define STATUS_XMLDSIG_ERROR ((NTSTATUS) 0xC000A084L) +#endif + +#ifndef STATUS_WRONG_COMPARTMENT +# define STATUS_WRONG_COMPARTMENT ((NTSTATUS) 0xC000A085L) +#endif + +#ifndef STATUS_AUTHIP_FAILURE +# define STATUS_AUTHIP_FAILURE ((NTSTATUS) 0xC000A086L) +#endif + +#ifndef STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS +# define STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS ((NTSTATUS) 0xC000A087L) +#endif + +#ifndef STATUS_DS_OID_NOT_FOUND +# define STATUS_DS_OID_NOT_FOUND ((NTSTATUS) 0xC000A088L) +#endif + +#ifndef STATUS_HASH_NOT_SUPPORTED +# define STATUS_HASH_NOT_SUPPORTED ((NTSTATUS) 0xC000A100L) +#endif + +#ifndef STATUS_HASH_NOT_PRESENT +# define STATUS_HASH_NOT_PRESENT ((NTSTATUS) 0xC000A101L) +#endif + +/* This is not the NTSTATUS_FROM_WIN32 that the DDK provides, because the */ +/* DDK got it wrong! */ +#ifdef NTSTATUS_FROM_WIN32 +# undef NTSTATUS_FROM_WIN32 +#endif +#define NTSTATUS_FROM_WIN32(error) ((NTSTATUS) (error) <= 0 ? \ + ((NTSTATUS) (error)) : ((NTSTATUS) (((error) & 0x0000FFFF) | \ + (FACILITY_NTWIN32 << 16) | ERROR_SEVERITY_WARNING))) + +#ifndef JOB_OBJECT_LIMIT_PROCESS_MEMORY +# define JOB_OBJECT_LIMIT_PROCESS_MEMORY 0x00000100 +#endif +#ifndef JOB_OBJECT_LIMIT_JOB_MEMORY +# define JOB_OBJECT_LIMIT_JOB_MEMORY 0x00000200 +#endif +#ifndef JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION +# define JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION 0x00000400 +#endif +#ifndef JOB_OBJECT_LIMIT_BREAKAWAY_OK +# define JOB_OBJECT_LIMIT_BREAKAWAY_OK 0x00000800 +#endif +#ifndef JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK +# define JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK 0x00001000 +#endif +#ifndef JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE +# define JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 0x00002000 +#endif + +/* from winternl.h */ +typedef struct _UNICODE_STRING { + USHORT Length; + USHORT MaximumLength; + PWSTR Buffer; +} UNICODE_STRING, *PUNICODE_STRING; + +typedef const UNICODE_STRING *PCUNICODE_STRING; + +/* from ntifs.h */ +#ifndef DEVICE_TYPE +# define DEVICE_TYPE DWORD +#endif + +/* MinGW already has a definition for REPARSE_DATA_BUFFER, but mingw-w64 does + * not. + */ +#if defined(_MSC_VER) || defined(__MINGW64_VERSION_MAJOR) + typedef struct _REPARSE_DATA_BUFFER { + ULONG ReparseTag; + USHORT ReparseDataLength; + USHORT Reserved; + union { + struct { + USHORT SubstituteNameOffset; + USHORT SubstituteNameLength; + USHORT PrintNameOffset; + USHORT PrintNameLength; + ULONG Flags; + WCHAR PathBuffer[1]; + } SymbolicLinkReparseBuffer; + struct { + USHORT SubstituteNameOffset; + USHORT SubstituteNameLength; + USHORT PrintNameOffset; + USHORT PrintNameLength; + WCHAR PathBuffer[1]; + } MountPointReparseBuffer; + struct { + UCHAR DataBuffer[1]; + } GenericReparseBuffer; + }; + } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; +#endif + +typedef struct _IO_STATUS_BLOCK { + union { + NTSTATUS Status; + PVOID Pointer; + }; + ULONG_PTR Information; +} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; + +typedef enum _FILE_INFORMATION_CLASS { + FileDirectoryInformation = 1, + FileFullDirectoryInformation, + FileBothDirectoryInformation, + FileBasicInformation, + FileStandardInformation, + FileInternalInformation, + FileEaInformation, + FileAccessInformation, + FileNameInformation, + FileRenameInformation, + FileLinkInformation, + FileNamesInformation, + FileDispositionInformation, + FilePositionInformation, + FileFullEaInformation, + FileModeInformation, + FileAlignmentInformation, + FileAllInformation, + FileAllocationInformation, + FileEndOfFileInformation, + FileAlternateNameInformation, + FileStreamInformation, + FilePipeInformation, + FilePipeLocalInformation, + FilePipeRemoteInformation, + FileMailslotQueryInformation, + FileMailslotSetInformation, + FileCompressionInformation, + FileObjectIdInformation, + FileCompletionInformation, + FileMoveClusterInformation, + FileQuotaInformation, + FileReparsePointInformation, + FileNetworkOpenInformation, + FileAttributeTagInformation, + FileTrackingInformation, + FileIdBothDirectoryInformation, + FileIdFullDirectoryInformation, + FileValidDataLengthInformation, + FileShortNameInformation, + FileIoCompletionNotificationInformation, + FileIoStatusBlockRangeInformation, + FileIoPriorityHintInformation, + FileSfioReserveInformation, + FileSfioVolumeInformation, + FileHardLinkInformation, + FileProcessIdsUsingFileInformation, + FileNormalizedNameInformation, + FileNetworkPhysicalNameInformation, + FileIdGlobalTxDirectoryInformation, + FileIsRemoteDeviceInformation, + FileAttributeCacheInformation, + FileNumaNodeInformation, + FileStandardLinkInformation, + FileRemoteProtocolInformation, + FileMaximumInformation +} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; + +typedef struct _FILE_DIRECTORY_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION; + +typedef struct _FILE_BOTH_DIR_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + CCHAR ShortNameLength; + WCHAR ShortName[12]; + WCHAR FileName[1]; +} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION; + +typedef struct _FILE_BASIC_INFORMATION { + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + DWORD FileAttributes; +} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; + +typedef struct _FILE_STANDARD_INFORMATION { + LARGE_INTEGER AllocationSize; + LARGE_INTEGER EndOfFile; + ULONG NumberOfLinks; + BOOLEAN DeletePending; + BOOLEAN Directory; +} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION; + +typedef struct _FILE_INTERNAL_INFORMATION { + LARGE_INTEGER IndexNumber; +} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION; + +typedef struct _FILE_EA_INFORMATION { + ULONG EaSize; +} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION; + +typedef struct _FILE_ACCESS_INFORMATION { + ACCESS_MASK AccessFlags; +} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION; + +typedef struct _FILE_POSITION_INFORMATION { + LARGE_INTEGER CurrentByteOffset; +} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; + +typedef struct _FILE_MODE_INFORMATION { + ULONG Mode; +} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION; + +typedef struct _FILE_ALIGNMENT_INFORMATION { + ULONG AlignmentRequirement; +} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; + +typedef struct _FILE_NAME_INFORMATION { + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; + +typedef struct _FILE_END_OF_FILE_INFORMATION { + LARGE_INTEGER EndOfFile; +} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; + +typedef struct _FILE_ALL_INFORMATION { + FILE_BASIC_INFORMATION BasicInformation; + FILE_STANDARD_INFORMATION StandardInformation; + FILE_INTERNAL_INFORMATION InternalInformation; + FILE_EA_INFORMATION EaInformation; + FILE_ACCESS_INFORMATION AccessInformation; + FILE_POSITION_INFORMATION PositionInformation; + FILE_MODE_INFORMATION ModeInformation; + FILE_ALIGNMENT_INFORMATION AlignmentInformation; + FILE_NAME_INFORMATION NameInformation; +} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION; + +typedef struct _FILE_DISPOSITION_INFORMATION { + BOOLEAN DeleteFile; +} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; + +typedef struct _FILE_PIPE_LOCAL_INFORMATION { + ULONG NamedPipeType; + ULONG NamedPipeConfiguration; + ULONG MaximumInstances; + ULONG CurrentInstances; + ULONG InboundQuota; + ULONG ReadDataAvailable; + ULONG OutboundQuota; + ULONG WriteQuotaAvailable; + ULONG NamedPipeState; + ULONG NamedPipeEnd; +} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION; + +#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010 +#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 + +typedef enum _FS_INFORMATION_CLASS { + FileFsVolumeInformation = 1, + FileFsLabelInformation = 2, + FileFsSizeInformation = 3, + FileFsDeviceInformation = 4, + FileFsAttributeInformation = 5, + FileFsControlInformation = 6, + FileFsFullSizeInformation = 7, + FileFsObjectIdInformation = 8, + FileFsDriverPathInformation = 9, + FileFsVolumeFlagsInformation = 10, + FileFsSectorSizeInformation = 11 +} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS; + +typedef struct _FILE_FS_VOLUME_INFORMATION { + LARGE_INTEGER VolumeCreationTime; + ULONG VolumeSerialNumber; + ULONG VolumeLabelLength; + BOOLEAN SupportsObjects; + WCHAR VolumeLabel[1]; +} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; + +typedef struct _FILE_FS_LABEL_INFORMATION { + ULONG VolumeLabelLength; + WCHAR VolumeLabel[1]; +} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; + +typedef struct _FILE_FS_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER AvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; + +typedef struct _FILE_FS_DEVICE_INFORMATION { + DEVICE_TYPE DeviceType; + ULONG Characteristics; +} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION; + +typedef struct _FILE_FS_ATTRIBUTE_INFORMATION { + ULONG FileSystemAttributes; + LONG MaximumComponentNameLength; + ULONG FileSystemNameLength; + WCHAR FileSystemName[1]; +} FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION; + +typedef struct _FILE_FS_CONTROL_INFORMATION { + LARGE_INTEGER FreeSpaceStartFiltering; + LARGE_INTEGER FreeSpaceThreshold; + LARGE_INTEGER FreeSpaceStopFiltering; + LARGE_INTEGER DefaultQuotaThreshold; + LARGE_INTEGER DefaultQuotaLimit; + ULONG FileSystemControlFlags; +} FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION; + +typedef struct _FILE_FS_FULL_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER CallerAvailableAllocationUnits; + LARGE_INTEGER ActualAvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; + +typedef struct _FILE_FS_OBJECTID_INFORMATION { + UCHAR ObjectId[16]; + UCHAR ExtendedInfo[48]; +} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; + +typedef struct _FILE_FS_DRIVER_PATH_INFORMATION { + BOOLEAN DriverInPath; + ULONG DriverNameLength; + WCHAR DriverName[1]; +} FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION; + +typedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION { + ULONG Flags; +} FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION; + +typedef struct _FILE_FS_SECTOR_SIZE_INFORMATION { + ULONG LogicalBytesPerSector; + ULONG PhysicalBytesPerSectorForAtomicity; + ULONG PhysicalBytesPerSectorForPerformance; + ULONG FileSystemEffectivePhysicalBytesPerSectorForAtomicity; + ULONG Flags; + ULONG ByteOffsetForSectorAlignment; + ULONG ByteOffsetForPartitionAlignment; +} FILE_FS_SECTOR_SIZE_INFORMATION, *PFILE_FS_SECTOR_SIZE_INFORMATION; + +typedef struct _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION { + LARGE_INTEGER IdleTime; + LARGE_INTEGER KernelTime; + LARGE_INTEGER UserTime; + LARGE_INTEGER DpcTime; + LARGE_INTEGER InterruptTime; + ULONG InterruptCount; +} SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION, *PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION; + +#ifndef SystemProcessorPerformanceInformation +# define SystemProcessorPerformanceInformation 8 +#endif + +#ifndef FILE_DEVICE_FILE_SYSTEM +# define FILE_DEVICE_FILE_SYSTEM 0x00000009 +#endif + +#ifndef FILE_DEVICE_NETWORK +# define FILE_DEVICE_NETWORK 0x00000012 +#endif + +#ifndef METHOD_BUFFERED +# define METHOD_BUFFERED 0 +#endif + +#ifndef METHOD_IN_DIRECT +# define METHOD_IN_DIRECT 1 +#endif + +#ifndef METHOD_OUT_DIRECT +# define METHOD_OUT_DIRECT 2 +#endif + +#ifndef METHOD_NEITHER +#define METHOD_NEITHER 3 +#endif + +#ifndef METHOD_DIRECT_TO_HARDWARE +# define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT +#endif + +#ifndef METHOD_DIRECT_FROM_HARDWARE +# define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT +#endif + +#ifndef FILE_ANY_ACCESS +# define FILE_ANY_ACCESS 0 +#endif + +#ifndef FILE_SPECIAL_ACCESS +# define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS) +#endif + +#ifndef FILE_READ_ACCESS +# define FILE_READ_ACCESS 0x0001 +#endif + +#ifndef FILE_WRITE_ACCESS +# define FILE_WRITE_ACCESS 0x0002 +#endif + +#ifndef CTL_CODE +# define CTL_CODE(device_type, function, method, access) \ + (((device_type) << 16) | ((access) << 14) | ((function) << 2) | (method)) +#endif + +#ifndef FSCTL_SET_REPARSE_POINT +# define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, \ + 41, \ + METHOD_BUFFERED, \ + FILE_SPECIAL_ACCESS) +#endif + +#ifndef FSCTL_GET_REPARSE_POINT +# define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, \ + 42, \ + METHOD_BUFFERED, \ + FILE_ANY_ACCESS) +#endif + +#ifndef FSCTL_DELETE_REPARSE_POINT +# define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, \ + 43, \ + METHOD_BUFFERED, \ + FILE_SPECIAL_ACCESS) +#endif + +#ifndef IO_REPARSE_TAG_SYMLINK +# define IO_REPARSE_TAG_SYMLINK (0xA000000CL) +#endif + +typedef VOID (NTAPI *PIO_APC_ROUTINE) + (PVOID ApcContext, + PIO_STATUS_BLOCK IoStatusBlock, + ULONG Reserved); + +typedef ULONG (NTAPI *sRtlNtStatusToDosError) + (NTSTATUS Status); + +typedef NTSTATUS (NTAPI *sNtDeviceIoControlFile) + (HANDLE FileHandle, + HANDLE Event, + PIO_APC_ROUTINE ApcRoutine, + PVOID ApcContext, + PIO_STATUS_BLOCK IoStatusBlock, + ULONG IoControlCode, + PVOID InputBuffer, + ULONG InputBufferLength, + PVOID OutputBuffer, + ULONG OutputBufferLength); + +typedef NTSTATUS (NTAPI *sNtQueryInformationFile) + (HANDLE FileHandle, + PIO_STATUS_BLOCK IoStatusBlock, + PVOID FileInformation, + ULONG Length, + FILE_INFORMATION_CLASS FileInformationClass); + +typedef NTSTATUS (NTAPI *sNtSetInformationFile) + (HANDLE FileHandle, + PIO_STATUS_BLOCK IoStatusBlock, + PVOID FileInformation, + ULONG Length, + FILE_INFORMATION_CLASS FileInformationClass); + +typedef NTSTATUS (NTAPI *sNtQueryVolumeInformationFile) + (HANDLE FileHandle, + PIO_STATUS_BLOCK IoStatusBlock, + PVOID FsInformation, + ULONG Length, + FS_INFORMATION_CLASS FsInformationClass); + +typedef NTSTATUS (NTAPI *sNtQuerySystemInformation) + (UINT SystemInformationClass, + PVOID SystemInformation, + ULONG SystemInformationLength, + PULONG ReturnLength); + +typedef NTSTATUS (NTAPI *sNtQueryDirectoryFile) + (HANDLE FileHandle, + HANDLE Event, + PIO_APC_ROUTINE ApcRoutine, + PVOID ApcContext, + PIO_STATUS_BLOCK IoStatusBlock, + PVOID FileInformation, + ULONG Length, + FILE_INFORMATION_CLASS FileInformationClass, + BOOLEAN ReturnSingleEntry, + PUNICODE_STRING FileName, + BOOLEAN RestartScan + ); + +/* + * Kernel32 headers + */ +#ifndef FILE_SKIP_COMPLETION_PORT_ON_SUCCESS +# define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1 +#endif + +#ifndef FILE_SKIP_SET_EVENT_ON_HANDLE +# define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2 +#endif + +#ifndef SYMBOLIC_LINK_FLAG_DIRECTORY +# define SYMBOLIC_LINK_FLAG_DIRECTORY 0x1 +#endif + +#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) + typedef struct _OVERLAPPED_ENTRY { + ULONG_PTR lpCompletionKey; + LPOVERLAPPED lpOverlapped; + ULONG_PTR Internal; + DWORD dwNumberOfBytesTransferred; + } OVERLAPPED_ENTRY, *LPOVERLAPPED_ENTRY; +#endif + +/* from wincon.h */ +#ifndef ENABLE_INSERT_MODE +# define ENABLE_INSERT_MODE 0x20 +#endif + +#ifndef ENABLE_QUICK_EDIT_MODE +# define ENABLE_QUICK_EDIT_MODE 0x40 +#endif + +#ifndef ENABLE_EXTENDED_FLAGS +# define ENABLE_EXTENDED_FLAGS 0x80 +#endif + +/* from winerror.h */ +#ifndef ERROR_ELEVATION_REQUIRED +# define ERROR_ELEVATION_REQUIRED 740 +#endif + +#ifndef ERROR_SYMLINK_NOT_SUPPORTED +# define ERROR_SYMLINK_NOT_SUPPORTED 1464 +#endif + +#ifndef ERROR_MUI_FILE_NOT_FOUND +# define ERROR_MUI_FILE_NOT_FOUND 15100 +#endif + +#ifndef ERROR_MUI_INVALID_FILE +# define ERROR_MUI_INVALID_FILE 15101 +#endif + +#ifndef ERROR_MUI_INVALID_RC_CONFIG +# define ERROR_MUI_INVALID_RC_CONFIG 15102 +#endif + +#ifndef ERROR_MUI_INVALID_LOCALE_NAME +# define ERROR_MUI_INVALID_LOCALE_NAME 15103 +#endif + +#ifndef ERROR_MUI_INVALID_ULTIMATEFALLBACK_NAME +# define ERROR_MUI_INVALID_ULTIMATEFALLBACK_NAME 15104 +#endif + +#ifndef ERROR_MUI_FILE_NOT_LOADED +# define ERROR_MUI_FILE_NOT_LOADED 15105 +#endif + +typedef BOOL (WINAPI *sGetQueuedCompletionStatusEx) + (HANDLE CompletionPort, + LPOVERLAPPED_ENTRY lpCompletionPortEntries, + ULONG ulCount, + PULONG ulNumEntriesRemoved, + DWORD dwMilliseconds, + BOOL fAlertable); + +typedef BOOL (WINAPI* sSetFileCompletionNotificationModes) + (HANDLE FileHandle, + UCHAR Flags); + +typedef BOOLEAN (WINAPI* sCreateSymbolicLinkW) + (LPCWSTR lpSymlinkFileName, + LPCWSTR lpTargetFileName, + DWORD dwFlags); + +typedef BOOL (WINAPI* sCancelIoEx) + (HANDLE hFile, + LPOVERLAPPED lpOverlapped); + +typedef VOID (WINAPI* sInitializeConditionVariable) + (PCONDITION_VARIABLE ConditionVariable); + +typedef BOOL (WINAPI* sSleepConditionVariableCS) + (PCONDITION_VARIABLE ConditionVariable, + PCRITICAL_SECTION CriticalSection, + DWORD dwMilliseconds); + +typedef BOOL (WINAPI* sSleepConditionVariableSRW) + (PCONDITION_VARIABLE ConditionVariable, + PSRWLOCK SRWLock, + DWORD dwMilliseconds, + ULONG Flags); + +typedef VOID (WINAPI* sWakeAllConditionVariable) + (PCONDITION_VARIABLE ConditionVariable); + +typedef VOID (WINAPI* sWakeConditionVariable) + (PCONDITION_VARIABLE ConditionVariable); + +typedef BOOL (WINAPI* sCancelSynchronousIo) + (HANDLE hThread); + +typedef DWORD (WINAPI* sGetFinalPathNameByHandleW) + (HANDLE hFile, + LPWSTR lpszFilePath, + DWORD cchFilePath, + DWORD dwFlags); + +/* from powerbase.h */ +#ifndef DEVICE_NOTIFY_CALLBACK +# define DEVICE_NOTIFY_CALLBACK 2 +#endif + +#ifndef PBT_APMRESUMEAUTOMATIC +# define PBT_APMRESUMEAUTOMATIC 18 +#endif + +#ifndef PBT_APMRESUMESUSPEND +# define PBT_APMRESUMESUSPEND 7 +#endif + +typedef ULONG CALLBACK _DEVICE_NOTIFY_CALLBACK_ROUTINE( + PVOID Context, + ULONG Type, + PVOID Setting +); +typedef _DEVICE_NOTIFY_CALLBACK_ROUTINE* _PDEVICE_NOTIFY_CALLBACK_ROUTINE; + +typedef struct _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS { + _PDEVICE_NOTIFY_CALLBACK_ROUTINE Callback; + PVOID Context; +} _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS, *_PDEVICE_NOTIFY_SUBSCRIBE_PARAMETERS; + +typedef PVOID _HPOWERNOTIFY; +typedef _HPOWERNOTIFY *_PHPOWERNOTIFY; + +typedef DWORD (WINAPI *sPowerRegisterSuspendResumeNotification) + (DWORD Flags, + HANDLE Recipient, + _PHPOWERNOTIFY RegistrationHandle); + + +/* Ntdll function pointers */ +extern sRtlNtStatusToDosError pRtlNtStatusToDosError; +extern sNtDeviceIoControlFile pNtDeviceIoControlFile; +extern sNtQueryInformationFile pNtQueryInformationFile; +extern sNtSetInformationFile pNtSetInformationFile; +extern sNtQueryVolumeInformationFile pNtQueryVolumeInformationFile; +extern sNtQueryDirectoryFile pNtQueryDirectoryFile; +extern sNtQuerySystemInformation pNtQuerySystemInformation; + + +/* Kernel32 function pointers */ +extern sGetQueuedCompletionStatusEx pGetQueuedCompletionStatusEx; +extern sSetFileCompletionNotificationModes pSetFileCompletionNotificationModes; +extern sCreateSymbolicLinkW pCreateSymbolicLinkW; +extern sCancelIoEx pCancelIoEx; +extern sInitializeConditionVariable pInitializeConditionVariable; +extern sSleepConditionVariableCS pSleepConditionVariableCS; +extern sSleepConditionVariableSRW pSleepConditionVariableSRW; +extern sWakeAllConditionVariable pWakeAllConditionVariable; +extern sWakeConditionVariable pWakeConditionVariable; +extern sCancelSynchronousIo pCancelSynchronousIo; +extern sGetFinalPathNameByHandleW pGetFinalPathNameByHandleW; + + +/* Powrprof.dll function pointer */ +extern sPowerRegisterSuspendResumeNotification pPowerRegisterSuspendResumeNotification; + +#endif /* UV_WIN_WINAPI_H_ */ diff --git a/lib/ESPiLight/pilight/libs/libuv/win/winsock.c b/lib/ESPiLight/pilight/libs/libuv/win/winsock.c new file mode 100644 index 0000000..e86d76b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/winsock.c @@ -0,0 +1,561 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include +#include + +#include "uv.h" +#include "internal.h" + + +/* Whether there are any non-IFS LSPs stacked on TCP */ +int uv_tcp_non_ifs_lsp_ipv4; +int uv_tcp_non_ifs_lsp_ipv6; + +/* Ip address used to bind to any port at any interface */ +struct sockaddr_in uv_addr_ip4_any_; +struct sockaddr_in6 uv_addr_ip6_any_; + + +/* + * Retrieves the pointer to a winsock extension function. + */ +static BOOL uv_get_extension_function(SOCKET socket, GUID guid, + void **target) { + int result; + DWORD bytes; + + result = WSAIoctl(socket, + SIO_GET_EXTENSION_FUNCTION_POINTER, + &guid, + sizeof(guid), + (void*)target, + sizeof(*target), + &bytes, + NULL, + NULL); + + if (result == SOCKET_ERROR) { + *target = NULL; + return FALSE; + } else { + return TRUE; + } +} + + +BOOL uv_get_acceptex_function(SOCKET socket, LPFN_ACCEPTEX* target) { + const GUID wsaid_acceptex = WSAID_ACCEPTEX; + return uv_get_extension_function(socket, wsaid_acceptex, (void**)target); +} + + +BOOL uv_get_connectex_function(SOCKET socket, LPFN_CONNECTEX* target) { + const GUID wsaid_connectex = WSAID_CONNECTEX; + return uv_get_extension_function(socket, wsaid_connectex, (void**)target); +} + + +static int error_means_no_support(DWORD error) { + return error == WSAEPROTONOSUPPORT || error == WSAESOCKTNOSUPPORT || + error == WSAEPFNOSUPPORT || error == WSAEAFNOSUPPORT; +} + + +void uv_winsock_init(void) { + WSADATA wsa_data; + int errorno; + SOCKET dummy; + WSAPROTOCOL_INFOW protocol_info; + int opt_len; + + /* Initialize winsock */ + errorno = WSAStartup(MAKEWORD(2, 2), &wsa_data); + if (errorno != 0) { + uv_fatal_error(errorno, "WSAStartup"); + } + + /* Set implicit binding address used by connectEx */ + if (uv_ip4_addr("0.0.0.0", 0, &uv_addr_ip4_any_)) { + abort(); + } + + if (uv_ip6_addr("::", 0, &uv_addr_ip6_any_)) { + abort(); + } + + /* Detect non-IFS LSPs */ + dummy = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); + + if (dummy != INVALID_SOCKET) { + opt_len = (int) sizeof protocol_info; + if (getsockopt(dummy, + SOL_SOCKET, + SO_PROTOCOL_INFOW, + (char*) &protocol_info, + &opt_len) == SOCKET_ERROR) + uv_fatal_error(WSAGetLastError(), "getsockopt"); + + if (!(protocol_info.dwServiceFlags1 & XP1_IFS_HANDLES)) + uv_tcp_non_ifs_lsp_ipv4 = 1; + + if (closesocket(dummy) == SOCKET_ERROR) + uv_fatal_error(WSAGetLastError(), "closesocket"); + + } else if (!error_means_no_support(WSAGetLastError())) { + /* Any error other than "socket type not supported" is fatal. */ + uv_fatal_error(WSAGetLastError(), "socket"); + } + + /* Detect IPV6 support and non-IFS LSPs */ + dummy = socket(AF_INET6, SOCK_STREAM, IPPROTO_IP); + + if (dummy != INVALID_SOCKET) { + opt_len = (int) sizeof protocol_info; + if (getsockopt(dummy, + SOL_SOCKET, + SO_PROTOCOL_INFOW, + (char*) &protocol_info, + &opt_len) == SOCKET_ERROR) + uv_fatal_error(WSAGetLastError(), "getsockopt"); + + if (!(protocol_info.dwServiceFlags1 & XP1_IFS_HANDLES)) + uv_tcp_non_ifs_lsp_ipv6 = 1; + + if (closesocket(dummy) == SOCKET_ERROR) + uv_fatal_error(WSAGetLastError(), "closesocket"); + + } else if (!error_means_no_support(WSAGetLastError())) { + /* Any error other than "socket type not supported" is fatal. */ + uv_fatal_error(WSAGetLastError(), "socket"); + } +} + + +int uv_ntstatus_to_winsock_error(NTSTATUS status) { + switch (status) { + case STATUS_SUCCESS: + return ERROR_SUCCESS; + + case STATUS_PENDING: + return ERROR_IO_PENDING; + + case STATUS_INVALID_HANDLE: + case STATUS_OBJECT_TYPE_MISMATCH: + return WSAENOTSOCK; + + case STATUS_INSUFFICIENT_RESOURCES: + case STATUS_PAGEFILE_QUOTA: + case STATUS_COMMITMENT_LIMIT: + case STATUS_WORKING_SET_QUOTA: + case STATUS_NO_MEMORY: + case STATUS_QUOTA_EXCEEDED: + case STATUS_TOO_MANY_PAGING_FILES: + case STATUS_REMOTE_RESOURCES: + return WSAENOBUFS; + + case STATUS_TOO_MANY_ADDRESSES: + case STATUS_SHARING_VIOLATION: + case STATUS_ADDRESS_ALREADY_EXISTS: + return WSAEADDRINUSE; + + case STATUS_LINK_TIMEOUT: + case STATUS_IO_TIMEOUT: + case STATUS_TIMEOUT: + return WSAETIMEDOUT; + + case STATUS_GRACEFUL_DISCONNECT: + return WSAEDISCON; + + case STATUS_REMOTE_DISCONNECT: + case STATUS_CONNECTION_RESET: + case STATUS_LINK_FAILED: + case STATUS_CONNECTION_DISCONNECTED: + case STATUS_PORT_UNREACHABLE: + case STATUS_HOPLIMIT_EXCEEDED: + return WSAECONNRESET; + + case STATUS_LOCAL_DISCONNECT: + case STATUS_TRANSACTION_ABORTED: + case STATUS_CONNECTION_ABORTED: + return WSAECONNABORTED; + + case STATUS_BAD_NETWORK_PATH: + case STATUS_NETWORK_UNREACHABLE: + case STATUS_PROTOCOL_UNREACHABLE: + return WSAENETUNREACH; + + case STATUS_HOST_UNREACHABLE: + return WSAEHOSTUNREACH; + + case STATUS_CANCELLED: + case STATUS_REQUEST_ABORTED: + return WSAEINTR; + + case STATUS_BUFFER_OVERFLOW: + case STATUS_INVALID_BUFFER_SIZE: + return WSAEMSGSIZE; + + case STATUS_BUFFER_TOO_SMALL: + case STATUS_ACCESS_VIOLATION: + return WSAEFAULT; + + case STATUS_DEVICE_NOT_READY: + case STATUS_REQUEST_NOT_ACCEPTED: + return WSAEWOULDBLOCK; + + case STATUS_INVALID_NETWORK_RESPONSE: + case STATUS_NETWORK_BUSY: + case STATUS_NO_SUCH_DEVICE: + case STATUS_NO_SUCH_FILE: + case STATUS_OBJECT_PATH_NOT_FOUND: + case STATUS_OBJECT_NAME_NOT_FOUND: + case STATUS_UNEXPECTED_NETWORK_ERROR: + return WSAENETDOWN; + + case STATUS_INVALID_CONNECTION: + return WSAENOTCONN; + + case STATUS_REMOTE_NOT_LISTENING: + case STATUS_CONNECTION_REFUSED: + return WSAECONNREFUSED; + + case STATUS_PIPE_DISCONNECTED: + return WSAESHUTDOWN; + + case STATUS_CONFLICTING_ADDRESSES: + case STATUS_INVALID_ADDRESS: + case STATUS_INVALID_ADDRESS_COMPONENT: + return WSAEADDRNOTAVAIL; + + case STATUS_NOT_SUPPORTED: + case STATUS_NOT_IMPLEMENTED: + return WSAEOPNOTSUPP; + + case STATUS_ACCESS_DENIED: + return WSAEACCES; + + default: + if ((status & (FACILITY_NTWIN32 << 16)) == (FACILITY_NTWIN32 << 16) && + (status & (ERROR_SEVERITY_ERROR | ERROR_SEVERITY_WARNING))) { + /* It's a windows error that has been previously mapped to an */ + /* ntstatus code. */ + return (DWORD) (status & 0xffff); + } else { + /* The default fallback for unmappable ntstatus codes. */ + return WSAEINVAL; + } + } +} + + +/* + * This function provides a workaround for a bug in the winsock implementation + * of WSARecv. The problem is that when SetFileCompletionNotificationModes is + * used to avoid IOCP notifications of completed reads, WSARecv does not + * reliably indicate whether we can expect a completion package to be posted + * when the receive buffer is smaller than the received datagram. + * + * However it is desirable to use SetFileCompletionNotificationModes because + * it yields a massive performance increase. + * + * This function provides a workaround for that bug, but it only works for the + * specific case that we need it for. E.g. it assumes that the "avoid iocp" + * bit has been set, and supports only overlapped operation. It also requires + * the user to use the default msafd driver, doesn't work when other LSPs are + * stacked on top of it. + */ +int WSAAPI uv_wsarecv_workaround(SOCKET socket, WSABUF* buffers, + DWORD buffer_count, DWORD* bytes, DWORD* flags, WSAOVERLAPPED *overlapped, + LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine) { + NTSTATUS status; + void* apc_context; + IO_STATUS_BLOCK* iosb = (IO_STATUS_BLOCK*) &overlapped->Internal; + AFD_RECV_INFO info; + DWORD error; + + if (overlapped == NULL || completion_routine != NULL) { + WSASetLastError(WSAEINVAL); + return SOCKET_ERROR; + } + + info.BufferArray = buffers; + info.BufferCount = buffer_count; + info.AfdFlags = AFD_OVERLAPPED; + info.TdiFlags = TDI_RECEIVE_NORMAL; + + if (*flags & MSG_PEEK) { + info.TdiFlags |= TDI_RECEIVE_PEEK; + } + + if (*flags & MSG_PARTIAL) { + info.TdiFlags |= TDI_RECEIVE_PARTIAL; + } + + if (!((intptr_t) overlapped->hEvent & 1)) { + apc_context = (void*) overlapped; + } else { + apc_context = NULL; + } + + iosb->Status = STATUS_PENDING; + iosb->Pointer = 0; + + status = pNtDeviceIoControlFile((HANDLE) socket, + overlapped->hEvent, + NULL, + apc_context, + iosb, + IOCTL_AFD_RECEIVE, + &info, + sizeof(info), + NULL, + 0); + + *flags = 0; + *bytes = (DWORD) iosb->Information; + + switch (status) { + case STATUS_SUCCESS: + error = ERROR_SUCCESS; + break; + + case STATUS_PENDING: + error = WSA_IO_PENDING; + break; + + case STATUS_BUFFER_OVERFLOW: + error = WSAEMSGSIZE; + break; + + case STATUS_RECEIVE_EXPEDITED: + error = ERROR_SUCCESS; + *flags = MSG_OOB; + break; + + case STATUS_RECEIVE_PARTIAL_EXPEDITED: + error = ERROR_SUCCESS; + *flags = MSG_PARTIAL | MSG_OOB; + break; + + case STATUS_RECEIVE_PARTIAL: + error = ERROR_SUCCESS; + *flags = MSG_PARTIAL; + break; + + default: + error = uv_ntstatus_to_winsock_error(status); + break; + } + + WSASetLastError(error); + + if (error == ERROR_SUCCESS) { + return 0; + } else { + return SOCKET_ERROR; + } +} + + +/* See description of uv_wsarecv_workaround. */ +int WSAAPI uv_wsarecvfrom_workaround(SOCKET socket, WSABUF* buffers, + DWORD buffer_count, DWORD* bytes, DWORD* flags, struct sockaddr* addr, + int* addr_len, WSAOVERLAPPED *overlapped, + LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine) { + NTSTATUS status; + void* apc_context; + IO_STATUS_BLOCK* iosb = (IO_STATUS_BLOCK*) &overlapped->Internal; + AFD_RECV_DATAGRAM_INFO info; + DWORD error; + + if (overlapped == NULL || addr == NULL || addr_len == NULL || + completion_routine != NULL) { + WSASetLastError(WSAEINVAL); + return SOCKET_ERROR; + } + + info.BufferArray = buffers; + info.BufferCount = buffer_count; + info.AfdFlags = AFD_OVERLAPPED; + info.TdiFlags = TDI_RECEIVE_NORMAL; + info.Address = addr; + info.AddressLength = addr_len; + + if (*flags & MSG_PEEK) { + info.TdiFlags |= TDI_RECEIVE_PEEK; + } + + if (*flags & MSG_PARTIAL) { + info.TdiFlags |= TDI_RECEIVE_PARTIAL; + } + + if (!((intptr_t) overlapped->hEvent & 1)) { + apc_context = (void*) overlapped; + } else { + apc_context = NULL; + } + + iosb->Status = STATUS_PENDING; + iosb->Pointer = 0; + + status = pNtDeviceIoControlFile((HANDLE) socket, + overlapped->hEvent, + NULL, + apc_context, + iosb, + IOCTL_AFD_RECEIVE_DATAGRAM, + &info, + sizeof(info), + NULL, + 0); + + *flags = 0; + *bytes = (DWORD) iosb->Information; + + switch (status) { + case STATUS_SUCCESS: + error = ERROR_SUCCESS; + break; + + case STATUS_PENDING: + error = WSA_IO_PENDING; + break; + + case STATUS_BUFFER_OVERFLOW: + error = WSAEMSGSIZE; + break; + + case STATUS_RECEIVE_EXPEDITED: + error = ERROR_SUCCESS; + *flags = MSG_OOB; + break; + + case STATUS_RECEIVE_PARTIAL_EXPEDITED: + error = ERROR_SUCCESS; + *flags = MSG_PARTIAL | MSG_OOB; + break; + + case STATUS_RECEIVE_PARTIAL: + error = ERROR_SUCCESS; + *flags = MSG_PARTIAL; + break; + + default: + error = uv_ntstatus_to_winsock_error(status); + break; + } + + WSASetLastError(error); + + if (error == ERROR_SUCCESS) { + return 0; + } else { + return SOCKET_ERROR; + } +} + + +int WSAAPI uv_msafd_poll(SOCKET socket, AFD_POLL_INFO* info_in, + AFD_POLL_INFO* info_out, OVERLAPPED* overlapped) { + IO_STATUS_BLOCK iosb; + IO_STATUS_BLOCK* iosb_ptr; + HANDLE event = NULL; + void* apc_context; + NTSTATUS status; + DWORD error; + + if (overlapped != NULL) { + /* Overlapped operation. */ + iosb_ptr = (IO_STATUS_BLOCK*) &overlapped->Internal; + event = overlapped->hEvent; + + /* Do not report iocp completion if hEvent is tagged. */ + if ((uintptr_t) event & 1) { + event = (HANDLE)((uintptr_t) event & ~(uintptr_t) 1); + apc_context = NULL; + } else { + apc_context = overlapped; + } + + } else { + /* Blocking operation. */ + iosb_ptr = &iosb; + event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (event == NULL) { + return SOCKET_ERROR; + } + apc_context = NULL; + } + + iosb_ptr->Status = STATUS_PENDING; + status = pNtDeviceIoControlFile((HANDLE) socket, + event, + NULL, + apc_context, + iosb_ptr, + IOCTL_AFD_POLL, + info_in, + sizeof *info_in, + info_out, + sizeof *info_out); + + if (overlapped == NULL) { + /* If this is a blocking operation, wait for the event to become */ + /* signaled, and then grab the real status from the io status block. */ + if (status == STATUS_PENDING) { + DWORD r = WaitForSingleObject(event, INFINITE); + + if (r == WAIT_FAILED) { + DWORD saved_error = GetLastError(); + CloseHandle(event); + WSASetLastError(saved_error); + return SOCKET_ERROR; + } + + status = iosb.Status; + } + + CloseHandle(event); + } + + switch (status) { + case STATUS_SUCCESS: + error = ERROR_SUCCESS; + break; + + case STATUS_PENDING: + error = WSA_IO_PENDING; + break; + + default: + error = uv_ntstatus_to_winsock_error(status); + break; + } + + WSASetLastError(error); + + if (error == ERROR_SUCCESS) { + return 0; + } else { + return SOCKET_ERROR; + } +} diff --git a/lib/ESPiLight/pilight/libs/libuv/win/winsock.h b/lib/ESPiLight/pilight/libs/libuv/win/winsock.h new file mode 100644 index 0000000..7c007ab --- /dev/null +++ b/lib/ESPiLight/pilight/libs/libuv/win/winsock.h @@ -0,0 +1,190 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_WIN_WINSOCK_H_ +#define UV_WIN_WINSOCK_H_ + +#include +#include +#include +#include +#include + +#include "winapi.h" + + +/* + * MinGW is missing these too + */ +#ifndef SO_UPDATE_CONNECT_CONTEXT +# define SO_UPDATE_CONNECT_CONTEXT 0x7010 +#endif + +#ifndef TCP_KEEPALIVE +# define TCP_KEEPALIVE 3 +#endif + +#ifndef IPV6_V6ONLY +# define IPV6_V6ONLY 27 +#endif + +#ifndef IPV6_HOPLIMIT +# define IPV6_HOPLIMIT 21 +#endif + +#ifndef SIO_BASE_HANDLE +# define SIO_BASE_HANDLE 0x48000022 +#endif + +/* + * TDI defines that are only in the DDK. + * We only need receive flags so far. + */ +#ifndef TDI_RECEIVE_NORMAL + #define TDI_RECEIVE_BROADCAST 0x00000004 + #define TDI_RECEIVE_MULTICAST 0x00000008 + #define TDI_RECEIVE_PARTIAL 0x00000010 + #define TDI_RECEIVE_NORMAL 0x00000020 + #define TDI_RECEIVE_EXPEDITED 0x00000040 + #define TDI_RECEIVE_PEEK 0x00000080 + #define TDI_RECEIVE_NO_RESPONSE_EXP 0x00000100 + #define TDI_RECEIVE_COPY_LOOKAHEAD 0x00000200 + #define TDI_RECEIVE_ENTIRE_MESSAGE 0x00000400 + #define TDI_RECEIVE_AT_DISPATCH_LEVEL 0x00000800 + #define TDI_RECEIVE_CONTROL_INFO 0x00001000 + #define TDI_RECEIVE_FORCE_INDICATION 0x00002000 + #define TDI_RECEIVE_NO_PUSH 0x00004000 +#endif + +/* + * The "Auxiliary Function Driver" is the windows kernel-mode driver that does + * TCP, UDP etc. Winsock is just a layer that dispatches requests to it. + * Having these definitions allows us to bypass winsock and make an AFD kernel + * call directly, avoiding a bug in winsock's recvfrom implementation. + */ + +#define AFD_NO_FAST_IO 0x00000001 +#define AFD_OVERLAPPED 0x00000002 +#define AFD_IMMEDIATE 0x00000004 + +#define AFD_POLL_RECEIVE_BIT 0 +#define AFD_POLL_RECEIVE (1 << AFD_POLL_RECEIVE_BIT) +#define AFD_POLL_RECEIVE_EXPEDITED_BIT 1 +#define AFD_POLL_RECEIVE_EXPEDITED (1 << AFD_POLL_RECEIVE_EXPEDITED_BIT) +#define AFD_POLL_SEND_BIT 2 +#define AFD_POLL_SEND (1 << AFD_POLL_SEND_BIT) +#define AFD_POLL_DISCONNECT_BIT 3 +#define AFD_POLL_DISCONNECT (1 << AFD_POLL_DISCONNECT_BIT) +#define AFD_POLL_ABORT_BIT 4 +#define AFD_POLL_ABORT (1 << AFD_POLL_ABORT_BIT) +#define AFD_POLL_LOCAL_CLOSE_BIT 5 +#define AFD_POLL_LOCAL_CLOSE (1 << AFD_POLL_LOCAL_CLOSE_BIT) +#define AFD_POLL_CONNECT_BIT 6 +#define AFD_POLL_CONNECT (1 << AFD_POLL_CONNECT_BIT) +#define AFD_POLL_ACCEPT_BIT 7 +#define AFD_POLL_ACCEPT (1 << AFD_POLL_ACCEPT_BIT) +#define AFD_POLL_CONNECT_FAIL_BIT 8 +#define AFD_POLL_CONNECT_FAIL (1 << AFD_POLL_CONNECT_FAIL_BIT) +#define AFD_POLL_QOS_BIT 9 +#define AFD_POLL_QOS (1 << AFD_POLL_QOS_BIT) +#define AFD_POLL_GROUP_QOS_BIT 10 +#define AFD_POLL_GROUP_QOS (1 << AFD_POLL_GROUP_QOS_BIT) + +#define AFD_NUM_POLL_EVENTS 11 +#define AFD_POLL_ALL ((1 << AFD_NUM_POLL_EVENTS) - 1) + +typedef struct _AFD_RECV_DATAGRAM_INFO { + LPWSABUF BufferArray; + ULONG BufferCount; + ULONG AfdFlags; + ULONG TdiFlags; + struct sockaddr* Address; + int* AddressLength; +} AFD_RECV_DATAGRAM_INFO, *PAFD_RECV_DATAGRAM_INFO; + +typedef struct _AFD_RECV_INFO { + LPWSABUF BufferArray; + ULONG BufferCount; + ULONG AfdFlags; + ULONG TdiFlags; +} AFD_RECV_INFO, *PAFD_RECV_INFO; + + +#define _AFD_CONTROL_CODE(operation, method) \ + ((FSCTL_AFD_BASE) << 12 | (operation << 2) | method) + +#define FSCTL_AFD_BASE FILE_DEVICE_NETWORK + +#define AFD_RECEIVE 5 +#define AFD_RECEIVE_DATAGRAM 6 +#define AFD_POLL 9 + +#define IOCTL_AFD_RECEIVE \ + _AFD_CONTROL_CODE(AFD_RECEIVE, METHOD_NEITHER) + +#define IOCTL_AFD_RECEIVE_DATAGRAM \ + _AFD_CONTROL_CODE(AFD_RECEIVE_DATAGRAM, METHOD_NEITHER) + +#define IOCTL_AFD_POLL \ + _AFD_CONTROL_CODE(AFD_POLL, METHOD_BUFFERED) + +#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) +typedef struct _IP_ADAPTER_UNICAST_ADDRESS_XP { + /* FIXME: __C89_NAMELESS was removed */ + /* __C89_NAMELESS */ union { + ULONGLONG Alignment; + /* __C89_NAMELESS */ struct { + ULONG Length; + DWORD Flags; + }; + }; + struct _IP_ADAPTER_UNICAST_ADDRESS_XP *Next; + SOCKET_ADDRESS Address; + IP_PREFIX_ORIGIN PrefixOrigin; + IP_SUFFIX_ORIGIN SuffixOrigin; + IP_DAD_STATE DadState; + ULONG ValidLifetime; + ULONG PreferredLifetime; + ULONG LeaseLifetime; +} IP_ADAPTER_UNICAST_ADDRESS_XP,*PIP_ADAPTER_UNICAST_ADDRESS_XP; + +typedef struct _IP_ADAPTER_UNICAST_ADDRESS_LH { + union { + ULONGLONG Alignment; + struct { + ULONG Length; + DWORD Flags; + }; + }; + struct _IP_ADAPTER_UNICAST_ADDRESS_LH *Next; + SOCKET_ADDRESS Address; + IP_PREFIX_ORIGIN PrefixOrigin; + IP_SUFFIX_ORIGIN SuffixOrigin; + IP_DAD_STATE DadState; + ULONG ValidLifetime; + ULONG PreferredLifetime; + ULONG LeaseLifetime; + UINT8 OnLinkPrefixLength; +} IP_ADAPTER_UNICAST_ADDRESS_LH,*PIP_ADAPTER_UNICAST_ADDRESS_LH; + +#endif + +#endif /* UV_WIN_WINSOCK_H_ */ diff --git a/lib/ESPiLight/pilight/libs/openzwave/Bitfield.h b/lib/ESPiLight/pilight/libs/openzwave/Bitfield.h new file mode 100644 index 0000000..7533eb7 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Bitfield.h @@ -0,0 +1,162 @@ +//----------------------------------------------------------------------------- +// +// Bitfield.h +// +// Variable length bitfield implementation +// +// Copyright (c) 2011 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Bitfield_H +#define _Bitfield_H + +#include +#include "Defs.h" + +namespace OpenZWave +{ + class OPENZWAVE_EXPORT Bitfield + { + friend class Iterator; + + public: + Bitfield():m_numSetBits(0){} + ~Bitfield(){} + + void Set( uint32 _idx ) + { + if( !IsSet(_idx) ) + { + uint32 newSize = (_idx>>5)+1; + if( newSize > m_bits.size() ) + { + m_bits.resize( newSize, 0 ); + } + m_bits[_idx>>5] |= (1<<(_idx&0x1f)); + ++m_numSetBits; + } + } + + void Clear( uint32 _idx ) + { + if( IsSet(_idx) ) + { + m_bits[_idx>>5] &= ~(1<<(_idx&0x1f)); + --m_numSetBits; + } + } + + bool IsSet( uint32 _idx )const + { + if( (_idx>>5) < m_bits.size() ) + { + return( ( m_bits[_idx>>5] & (1<<(_idx&0x1f)) ) !=0 ); + } + return false; + } + + uint32 GetNumSetBits()const{ return m_numSetBits; } + + class Iterator + { + friend class Bitfield; + + public: + uint32 operator *() const + { + return m_idx; + } + + Iterator& operator++() + { + // Search forward to next set bit + NextSetBit(); + return *this; + } + + Iterator operator++(int) + { + Iterator tmp = *this; + ++tmp; + return tmp; + } + + bool operator ==(const Iterator &rhs) + { + return m_idx == rhs.m_idx; + } + + bool operator !=(const Iterator &rhs) + { + return m_idx != rhs.m_idx; + } + + private: + Iterator( Bitfield const* _bitfield, uint32 _idx ): m_idx( _idx ), m_bitfield( _bitfield ) + { + // If this is a begin iterator, move it to the first set bit + if( ( _idx == 0 ) && ( !m_bitfield->IsSet(0) ) ) + { + NextSetBit(); + } + } + + void NextSetBit() + { + while( ((++m_idx)>>5)m_bits.size() ) + { + // See if there are any bits left to find in the current uint32 + if( ( m_bitfield->m_bits[m_idx>>5] & ~((1<<(m_idx&0x1f))-1) ) == 0 ) + { + // No more bits - move on to next uint32 (or rather one less than + // the next uint32 because of the preincrement in the while statement) + m_idx = (m_idx&0xffffffe0)+31; + } + else + { + if( (m_bitfield->m_bits[m_idx>>5] & (1<<(m_idx&0x1f))) !=0 ) + { + // This bit is set + return; + } + } + } + } + + uint32 m_idx; + Bitfield const* m_bitfield; + }; + + Iterator Begin()const{ return Iterator( this, 0 ); } + Iterator End()const{ return Iterator( this, (uint32) m_bits.size()<<5 ); } + + private: +OPENZWAVE_EXPORT_WARNINGS_OFF + vector m_bits; +OPENZWAVE_EXPORT_WARNINGS_ON + uint32 m_numSetBits; + }; +} // namespace OpenZWave + +#endif + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/CMakeLists.txt b/lib/ESPiLight/pilight/libs/openzwave/CMakeLists.txt new file mode 100644 index 0000000..5ae1c15 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/CMakeLists.txt @@ -0,0 +1,18 @@ +project(openzwave) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.cpp") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +add_subdirectory(aes) +add_subdirectory(command_classes) +add_subdirectory(platform) +add_subdirectory(value_classes) + +set(${PROJECT_NAME}_files + ${${PROJECT_NAME}_aes_files} + ${${PROJECT_NAME}_command_classes_files} + ${${PROJECT_NAME}_platform_files} + ${${PROJECT_NAME}_value_classes_files} + ${${PROJECT_NAME}_sources} + ${${PROJECT_NAME}_headers} +CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/openzwave/Defs.h b/lib/ESPiLight/pilight/libs/openzwave/Defs.h new file mode 100644 index 0000000..0ead487 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Defs.h @@ -0,0 +1,363 @@ +//----------------------------------------------------------------------------- +// +// Defs.h +// +// Basic types and preprocessor directives +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Defs_H +#define _Defs_H +#include +#include +#include +#include + + + +// Compilation export flags +#if (defined _WINDOWS || defined WIN32 || defined _WIN32) && !defined MINGW +# if defined OPENZWAVE_MAKEDLL // Create the dynamic library. +# define OPENZWAVE_EXPORT __declspec(dllexport) +# elif defined OPENZWAVE_USEDLL // Use the dynamic library +# define OPENZWAVE_EXPORT __declspec(dllimport) +# else // Create/Use the static library +# define OPENZWAVE_EXPORT +# endif +// Disable export warnings +# define OPENZWAVE_EXPORT +# define OPENZWAVE_EXPORT_WARNINGS_OFF +# define OPENZWAVE_EXPORT_WARNINGS_ON +#else +# define OPENZWAVE_EXPORT +# define OPENZWAVE_EXPORT_WARNINGS_OFF +# define OPENZWAVE_EXPORT_WARNINGS_ON +#endif + +#ifdef NULL +#undef NULL +#endif +#define NULL 0 + +// Basic types +typedef signed char int8; +typedef unsigned char uint8; + +typedef signed short int16; +typedef unsigned short uint16; + +typedef signed int int32; +typedef unsigned int uint32; + +#ifdef _WIN32 +typedef signed __int64 int64; +typedef unsigned __int64 uint64; +#endif + +#ifdef __GNUC__ +typedef signed long long int64; +typedef unsigned long long uint64; +#endif + +typedef float float32; +typedef double float64; + +typedef struct ozwversion { + uint32_t _v; /* major << 16 | minor */ +} ozwversion; + +/** + * \brief version_major - return the major version of the given struct + * \param v: the version number to obtain the major number from + * \return the Major Version Number + */ +static inline uint16_t version_major(struct ozwversion v) { + return (v._v & 0xFFFF0000) >> 16; +} + +/** + * \brief version_minor - return the minor version of the given struct + * \param v: the version number to obtain the minor number from + * \return the Minor Version Number + */ +static inline uint16_t version_minor(const struct ozwversion &v) { + return v._v & 0xFFFF; +} + +/** + * \brief version - create a new version number + * \param major: major version number + * \param minor: minor version number + * \return the Version Number Struct + */ +static inline struct ozwversion version(uint16_t major, uint16_t minor) +{ + struct ozwversion v; + v._v = (uint32_t)(major << 16) | (uint32_t)minor; + return v; +} + +/** + * \brief version_cmp - compare two versions + * \param a: the first version number + * \param b: the second version number + * \return a number greater, equal, or less than 0 if a is greater, equal or + * less than b, respectively + * + * Example: + * struct version a = version(1, 0); + * struct version b = version(1, 3); + * if (version_cmp(a, b) < 0) + * printf("b is smaller than b\n"); + */ +static inline int version_cmp(struct ozwversion a, struct ozwversion b) +{ + return (a._v == b._v) ? 0 : (a._v > b._v) ? 1 : - 1; +} + + +// Declare the OpenZWave namespace +namespace std {} +namespace OpenZWave +{ + // Include the STL namespace + using namespace std; +} + +// Modifications for Microsoft compilers +// #ifdef _WIN32 + +// // Fix for namespace-related compiler bug +// namespace OpenZWave +// { +// } + +// // Rename safe versions of sprintf etc +// #define snprintf sprintf_s +// #define strcasecmp _stricmp +// #define sscanf sscanf_s + +// #endif + +// Modifications for MiNGW32 compiler +#ifdef _WIN32 + +// Replace "safe" versions of sprintf +#define sprintf_s snprintf + +// seems some MINGW versions don't have a errno_t +#ifndef errno_t +#define errno_t int +#endif + +#define fopen_s fopen + + +#endif + +#define MAX_TRIES 3 // Retry sends up to 3 times +#define MAX_MAX_TRIES 7 // Don't exceed this retry limit +#define ACK_TIMEOUT 1000 // How long to wait for an ACK +#define BYTE_TIMEOUT 150 +#define RETRY_TIMEOUT 40000 // Retry send after 40 seconds + +#define SOF 0x01 +#define ACK 0x06 +#define NAK 0x15 +#define CAN 0x18 + +#define NUM_NODE_BITFIELD_BYTES 29 // 29 bytes = 232 bits, one for each possible node in the network. + +#define REQUEST 0x00 +#define RESPONSE 0x01 + +#define ZW_CLOCK_SET 0x30 + +#define TRANSMIT_OPTION_ACK 0x01 +#define TRANSMIT_OPTION_LOW_POWER 0x02 +#define TRANSMIT_OPTION_AUTO_ROUTE 0x04 +#define TRANSMIT_OPTION_NO_ROUTE 0x10 +#define TRANSMIT_OPTION_EXPLORE 0x20 + +#define TRANSMIT_COMPLETE_OK 0x00 +#define TRANSMIT_COMPLETE_NO_ACK 0x01 +#define TRANSMIT_COMPLETE_FAIL 0x02 +#define TRANSMIT_COMPLETE_NOT_IDLE 0x03 +#define TRANSMIT_COMPLETE_NOROUTE 0x04 + +#define RECEIVE_STATUS_ROUTED_BUSY 0x01 +#define RECEIVE_STATUS_TYPE_BROAD 0x04 + +#define FUNC_ID_SERIAL_API_GET_INIT_DATA 0x02 +#define FUNC_ID_SERIAL_API_APPL_NODE_INFORMATION 0x03 +#define FUNC_ID_APPLICATION_COMMAND_HANDLER 0x04 +#define FUNC_ID_ZW_GET_CONTROLLER_CAPABILITIES 0x05 +#define FUNC_ID_SERIAL_API_SET_TIMEOUTS 0x06 +#define FUNC_ID_SERIAL_API_GET_CAPABILITIES 0x07 +#define FUNC_ID_SERIAL_API_SOFT_RESET 0x08 + +#define FUNC_ID_ZW_SEND_NODE_INFORMATION 0x12 +#define FUNC_ID_ZW_SEND_DATA 0x13 +#define FUNC_ID_ZW_GET_VERSION 0x15 +#define FUNC_ID_ZW_R_F_POWER_LEVEL_SET 0x17 +#define FUNC_ID_ZW_GET_RANDOM 0x1c +#define FUNC_ID_ZW_MEMORY_GET_ID 0x20 +#define FUNC_ID_MEMORY_GET_BYTE 0x21 +#define FUNC_ID_ZW_READ_MEMORY 0x23 + +#define FUNC_ID_ZW_SET_LEARN_NODE_STATE 0x40 // Not implemented +#define FUNC_ID_ZW_GET_NODE_PROTOCOL_INFO 0x41 // Get protocol info (baud rate, listening, etc.) for a given node +#define FUNC_ID_ZW_SET_DEFAULT 0x42 // Reset controller and node info to default (original) values +#define FUNC_ID_ZW_NEW_CONTROLLER 0x43 // Not implemented +#define FUNC_ID_ZW_REPLICATION_COMMAND_COMPLETE 0x44 // Replication send data complete +#define FUNC_ID_ZW_REPLICATION_SEND_DATA 0x45 // Replication send data +#define FUNC_ID_ZW_ASSIGN_RETURN_ROUTE 0x46 // Assign a return route from the specified node to the controller +#define FUNC_ID_ZW_DELETE_RETURN_ROUTE 0x47 // Delete all return routes from the specified node +#define FUNC_ID_ZW_REQUEST_NODE_NEIGHBOR_UPDATE 0x48 // Ask the specified node to update its neighbors (then read them from the controller) +#define FUNC_ID_ZW_APPLICATION_UPDATE 0x49 // Get a list of supported (and controller) command classes +#define FUNC_ID_ZW_ADD_NODE_TO_NETWORK 0x4a // Control the addnode (or addcontroller) process...start, stop, etc. +#define FUNC_ID_ZW_REMOVE_NODE_FROM_NETWORK 0x4b // Control the removenode (or removecontroller) process...start, stop, etc. +#define FUNC_ID_ZW_CREATE_NEW_PRIMARY 0x4c // Control the createnewprimary process...start, stop, etc. +#define FUNC_ID_ZW_CONTROLLER_CHANGE 0x4d // Control the transferprimary process...start, stop, etc. +#define FUNC_ID_ZW_SET_LEARN_MODE 0x50 // Put a controller into learn mode for replication/ receipt of configuration info +#define FUNC_ID_ZW_ASSIGN_SUC_RETURN_ROUTE 0x51 // Assign a return route to the SUC +#define FUNC_ID_ZW_ENABLE_SUC 0x52 // Make a controller a Static Update Controller +#define FUNC_ID_ZW_REQUEST_NETWORK_UPDATE 0x53 // Network update for a SUC(?) +#define FUNC_ID_ZW_SET_SUC_NODE_ID 0x54 // Identify a Static Update Controller node id +#define FUNC_ID_ZW_DELETE_SUC_RETURN_ROUTE 0x55 // Remove return routes to the SUC +#define FUNC_ID_ZW_GET_SUC_NODE_ID 0x56 // Try to retrieve a Static Update Controller node id (zero if no SUC present) +#define FUNC_ID_ZW_REQUEST_NODE_NEIGHBOR_UPDATE_OPTIONS 0x5a // Allow options for request node neighbor update +#define FUNC_ID_ZW_REQUEST_NODE_INFO 0x60 // Get info (supported command classes) for the specified node +#define FUNC_ID_ZW_REMOVE_FAILED_NODE_ID 0x61 // Mark a specified node id as failed +#define FUNC_ID_ZW_IS_FAILED_NODE_ID 0x62 // Check to see if a specified node has failed +#define FUNC_ID_ZW_REPLACE_FAILED_NODE 0x63 // Remove a failed node from the controller's list (?) +#define FUNC_ID_ZW_GET_ROUTING_INFO 0x80 // Get a specified node's neighbor information from the controller +#define FUNC_ID_SERIAL_API_SLAVE_NODE_INFO 0xA0 // Set application virtual slave node information +#define FUNC_ID_APPLICATION_SLAVE_COMMAND_HANDLER 0xA1 // Slave command handler +#define FUNC_ID_ZW_SEND_SLAVE_NODE_INFO 0xA2 // Send a slave node information frame +#define FUNC_ID_ZW_SEND_SLAVE_DATA 0xA3 // Send data from slave +#define FUNC_ID_ZW_SET_SLAVE_LEARN_MODE 0xA4 // Enter slave learn mode +#define FUNC_ID_ZW_GET_VIRTUAL_NODES 0xA5 // Return all virtual nodes +#define FUNC_ID_ZW_IS_VIRTUAL_NODE 0xA6 // Virtual node test +#define FUNC_ID_ZW_SET_PROMISCUOUS_MODE 0xD0 // Set controller into promiscuous mode to listen to all frames +#define FUNC_ID_PROMISCUOUS_APPLICATION_COMMAND_HANDLER 0xD1 + +#define ADD_NODE_ANY 0x01 +#define ADD_NODE_CONTROLLER 0x02 +#define ADD_NODE_SLAVE 0x03 +#define ADD_NODE_EXISTING 0x04 +#define ADD_NODE_STOP 0x05 +#define ADD_NODE_STOP_FAILED 0x06 + +#define ADD_NODE_STATUS_LEARN_READY 0x01 +#define ADD_NODE_STATUS_NODE_FOUND 0x02 +#define ADD_NODE_STATUS_ADDING_SLAVE 0x03 +#define ADD_NODE_STATUS_ADDING_CONTROLLER 0x04 +#define ADD_NODE_STATUS_PROTOCOL_DONE 0x05 +#define ADD_NODE_STATUS_DONE 0x06 +#define ADD_NODE_STATUS_FAILED 0x07 + +#define REMOVE_NODE_ANY 0x01 +#define REMOVE_NODE_CONTROLLER 0x02 +#define REMOVE_NODE_SLAVE 0x03 +#define REMOVE_NODE_STOP 0x05 + +#define REMOVE_NODE_STATUS_LEARN_READY 0x01 +#define REMOVE_NODE_STATUS_NODE_FOUND 0x02 +#define REMOVE_NODE_STATUS_REMOVING_SLAVE 0x03 +#define REMOVE_NODE_STATUS_REMOVING_CONTROLLER 0x04 +#define REMOVE_NODE_STATUS_DONE 0x06 +#define REMOVE_NODE_STATUS_FAILED 0x07 + +#define CREATE_PRIMARY_START 0x02 +#define CREATE_PRIMARY_STOP 0x05 +#define CREATE_PRIMARY_STOP_FAILED 0x06 + +#define CONTROLLER_CHANGE_START 0x02 +#define CONTROLLER_CHANGE_STOP 0x05 +#define CONTROLLER_CHANGE_STOP_FAILED 0x06 + +#define LEARN_MODE_STARTED 0x01 +#define LEARN_MODE_DONE 0x06 +#define LEARN_MODE_FAILED 0x07 +#define LEARN_MODE_DELETED 0x80 + +#define REQUEST_NEIGHBOR_UPDATE_STARTED 0x21 +#define REQUEST_NEIGHBOR_UPDATE_DONE 0x22 +#define REQUEST_NEIGHBOR_UPDATE_FAILED 0x23 + +#define FAILED_NODE_OK 0x00 +#define FAILED_NODE_REMOVED 0x01 +#define FAILED_NODE_NOT_REMOVED 0x02 + +#define FAILED_NODE_REPLACE_WAITING 0x03 +#define FAILED_NODE_REPLACE_DONE 0x04 +#define FAILED_NODE_REPLACE_FAILED 0x05 + +#define FAILED_NODE_REMOVE_STARTED 0x00 +#define FAILED_NODE_NOT_PRIMARY_CONTROLLER 0x02 +#define FAILED_NODE_NO_CALLBACK_FUNCTION 0x04 +#define FAILED_NODE_NOT_FOUND 0x08 +#define FAILED_NODE_REMOVE_PROCESS_BUSY 0x10 +#define FAILED_NODE_REMOVE_FAIL 0x20 + +#define SUC_UPDATE_DONE 0x00 +#define SUC_UPDATE_ABORT 0x01 +#define SUC_UPDATE_WAIT 0x02 +#define SUC_UPDATE_DISABLED 0x03 +#define SUC_UPDATE_OVERFLOW 0x04 + +#define SUC_FUNC_BASIC_SUC 0x00 +#define SUC_FUNC_NODEID_SERVER 0x01 + +#define UPDATE_STATE_NODE_INFO_RECEIVED 0x84 +#define UPDATE_STATE_NODE_INFO_REQ_DONE 0x82 +#define UPDATE_STATE_NODE_INFO_REQ_FAILED 0x81 +#define UPDATE_STATE_ROUTING_PENDING 0x80 +#define UPDATE_STATE_NEW_ID_ASSIGNED 0x40 +#define UPDATE_STATE_DELETE_DONE 0x20 +#define UPDATE_STATE_SUC_ID 0x10 + +#define APPLICATION_NODEINFO_LISTENING 0x01 +#define APPLICATION_NODEINFO_OPTIONAL_FUNCTIONALITY 0x02 + +#define SLAVE_ASSIGN_COMPLETE 0x00 +#define SLAVE_ASSIGN_NODEID_DONE 0x01 // Node ID has been assigned +#define SLAVE_ASSIGN_RANGE_INFO_UPDATE 0x02 // Node is doing neighbor discovery + +#define SLAVE_LEARN_MODE_DISABLE 0x00 // disable add/remove virtual slave nodes +#define SLAVE_LEARN_MODE_ENABLE 0x01 // enable ability to include/exclude virtual slave nodes +#define SLAVE_LEARN_MODE_ADD 0x02 // add node directly but only if primary/inclusion controller +#define SLAVE_LEARN_MODE_REMOVE 0x03 // remove node directly but only if primary/inclusion controller + +#define OPTION_HIGH_POWER 0x80 + +//Device request related +#define BASIC_SET 0x01 +#define BASIC_REPORT 0x03 + +#define COMMAND_CLASS_BASIC 0x20 +#define COMMAND_CLASS_CONTROLLER_REPLICATION 0x21 +#define COMMAND_CLASS_APPLICATION_STATUS 0x22 +#define COMMAND_CLASS_HAIL 0x82 + +#endif // _Defs_H diff --git a/lib/ESPiLight/pilight/libs/openzwave/DoxygenMain.h b/lib/ESPiLight/pilight/libs/openzwave/DoxygenMain.h new file mode 100644 index 0000000..2268261 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/DoxygenMain.h @@ -0,0 +1,154 @@ + +/** + * \mainpage OpenZWave + * \section Introduction Introduction to OpenZWave + * OpenZWave is an open-source, cross-platform library designed to enable + * anyone to add support for Z-Wave home-automation devices to their + * applications, without requiring any in depth knowledge of the Z-Wave + * protocol. + *

        + * Z-Wave employs a proprietary protocol which the owners, Sigma Designs, + * have chosen not to release into the public domain. There is also no + * official free or low-cost SDK that can be used to develop applications + * (The ControlThink SDK is now tied exclusively to their own Z-Wave PC + * interface). The only way to obtain the protocol documentation and sample + * code is to purchase an expensive development kit, and sign a non-disclosure + * agreement (NDA) preventing the release of that knowledge. + *

        + * OpenZWave was created to fill that gap. We do not have the official + * documentation, have signed no NDA, and are free to develop the library as + * we see fit. Our knowledge comes from existing bodies of open-source code + * (principally the Z-Wave parts of LinuxMCE), and through examining the + * messages sent by Z-Wave devices. + *

        + * The goal of the project is to make a positive contribution to the Z-Wave + * community by creating a library that supports as much of the Z-Wave + * specification as possible, and that can be used as a "black-box" + * solution by anyone wanting to add Z-Wave to their application. It is NOT + * our aim to publish alternative documentation of the Z-Wave protocol, or + * to attempt to "punish" Sigma Designs for their decision to keep the + * protocol closed. + + * \section ZWave Z-Wave Concepts + * Z-Wave is a proprietary wireless communications protocol employing mesh + * networking technology. A mesh network allows low power devices to + * communicate over long ranges, and around radio blackspots by passing + * messages from one node to another. It is important to note that not all + * Z-Wave devices are active all the time, especially those that are battery + * powered. These nodes cannot take part in the forwarding of messages + * across the mesh. + *

        + * Each Z-Wave device is known as "Node" in the network. A Z-Wave network + * can contain up to 232 nodes. If more devices are required, then + * multiple networks need to be set up using separate Z-Wave controller. + * OpenZWave supports multiple controllers, but on its own does not bridge + * the networks allowing a device on one to directly control a device on + * another. This functionality would have to be supplied by the application. + *

        + * Z-Wave nodes can be divided into two types: Controllers and Slaves. The + * controllers are usually in the form of hand-held remote controls, or PC + * interfaces. The switches, dimmers, movement sensors etc are all slaves. + * Controllers and Devices + * Replication + * Command Classes + * Values + + *


        + * \section Library The OpenZWave Library + * \subsection Overview Overview + + * \subsection Manager The Manager + * All Z-Wave functionality is accessed via the Manager class. While this + * does not make for the most efficient code structure, it does enable + * the library to handle potentially complex and hard-to-debug issues + * such as multi-threading and object lifespans behind the scenes. + * Application development is therefore simplified and less prone to bugs. + *

        + + * \subsection Notifications Notifications + * Communication between the PC and devices on the the Z-Wave network occurs + * asynchronously. Some devices, notably movement sensors, sleep most of the + * time to save battery power, and can only receive commands when awake. + * Therefore a command to change a value in a device may not occur immediately. + * It may take several seconds or minutes, or even never arrive at all. + * For this reason, many OpenZWave methods, even those that request + * information, do not return that information directly. A request will be + * sent to the network, and the response sent to the application some time + * later via a system of notification callbacks. The notification handler + * will be at the core of any application using OpenZWave. It is here that + * all information regarding device configurations and states will be reported. + *

        + * A Z-Wave network is a dynamic entity. Controllers and devices can be + * added or removed at any time. Once a network has been set up, this + * probably won't happen very often, but OpenZWave, and any application + * built upon it, must cope all the same. The notification callback system + * is used to inform the application of any changes to the structure of the + * network. + + * \subsection Values Working with Values + * + + * \subsection Guidelines Application Development Guidelines + * The main considerations when designing an application based upon + * OpenZWave are: + * + * - Communication with Z-Wave devices is asynchronous and not guaranteed + * to be reliable. Do not rely on receiving a response to any request. + * + * - A Z-Wave network may change at any time. The application's notification + * callback handler must deal woth all notifications, and any representation + * of the state of the Z-Wave network held by the application must be + * modified to match. User interfaces should be built dynamically from the + * information reported in the notification callbacks, and must be able to cope + * with the addition and removal of devices. + * + * Some users will have more than one Z-Wave controller, to allow for remote + * locations or to work around the 232 device limit. OpenZWave is designed + * for use with multiple controllers, and all applications should be written + * to support this. + * + * - There is no need to save the state of the network and restore it on + * the next run. OpenZWave does this automatically, and is designed to cope + * with any changes that occur to the network while the application is not + * running. + * + + *


        + * \section Structure Source Code Structure + * + + *
        + * \section Samples Samples + * The SDK package includes skeleton code for creating xPL-enabled + * applications. Code is provided for three types of application - a Windows + * service, a Windowed application, and a console application. The Windows + * service is quite flexible - it will run as a console application if no + * command line parameters are passed to it. This makes it possible to + * ship one application that will run on all versions of Windows, whether or + * not there is support for services. It is also useful for debugging. + *

        + * The full source code for the W800RF32 service is also provided as a real + * life example of using the SDK to build a complete xPL application. + + *


        + * \section Licensing Licensing + * OpenZWave is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + *

        + * OpenZWave is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + *

        + * You should have received a copy of the GNU Lesser General Public License + * along with OpenZWave. If not, see . + + *


        + * \section Support Support + * Assistance with all OpenZWave issues can be obtained by posting a message + * to the OpenZWave Google Group (http://groups.google.com/group/openzwave) + *

        + */ + diff --git a/lib/ESPiLight/pilight/libs/openzwave/Driver.cpp b/lib/ESPiLight/pilight/libs/openzwave/Driver.cpp new file mode 100644 index 0000000..30237bb --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Driver.cpp @@ -0,0 +1,6317 @@ +//----------------------------------------------------------------------------- +// +// Driver.cpp +// +// Communicates with a Z-Wave network +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include "Defs.h" +#include "Driver.h" +#include "Options.h" +#include "Manager.h" +#include "Node.h" +#include "Msg.h" +#include "Notification.h" +#include "Scene.h" + +#include "platform/Event.h" +#include "platform/Mutex.h" +#include "platform/SerialController.h" +// #include "platform/HidController.h" +#include "platform/Thread.h" +#include "platform/Log.h" +#include "platform/TimeStamp.h" + +#include "command_classes/CommandClasses.h" +#include "command_classes/ApplicationStatus.h" +#include "command_classes/ControllerReplication.h" +#include "command_classes/Security.h" +#include "command_classes/WakeUp.h" +#include "command_classes/SwitchAll.h" +#include "command_classes/ManufacturerSpecific.h" +#include "command_classes/NoOperation.h" + +#include "value_classes/ValueID.h" +#include "value_classes/Value.h" +#include "value_classes/ValueStore.h" + +#include "tinyxml.h" + + +#include "Utils.h" +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) +# include +#elif defined _WIN32 +# include +#define sleep(x) Sleep(1000 * x) +#endif +#include +#include + +using namespace OpenZWave; + +// Version numbering for saved configurations. Any change that will invalidate +// previously saved configurations must be accompanied by an increment to the +// version number, and a comment explaining the date of, and reason for, the change. +// +// 01: 12-31-2010 - Introduced config version numbering due to ValueID format change. +// 02: 01-12-2011 - Command class m_afterMark sense corrected, and attribute named to match. +// 03: 08-04-2011 - Changed command class instance handling for non-sequential MultiChannel endpoints. +// +uint32 const c_configVersion = 3; + +static char const* c_libraryTypeNames[] = +{ + "Unknown", // library type 0 + "Static Controller", // library type 1 + "Controller", // library type 2 + "Enhanced Slave", // library type 3 + "Slave", // library type 4 + "Installer", // library type 5 + "Routing Slave", // library type 6 + "Bridge Controller", // library type 7 + "Device Under Test" // library type 8 +}; + +static char const* c_controllerCommandNames[] = +{ + "None", + "Add Device", + "Create New Primary", + "Receive Configuration", + "Remove Device", + "Remove Failed Node", + "Has Node Failed", + "Replace Failed Node", + "Transfer Primary Role", + "Request Network Update", + "Request Node Neighbor Update", + "Assign Return Route", + "Delete All Return Routes", + "Send Node Information", + "Replication Send", + "Create Button", + "Delete Button" +}; + +static char const* c_sendQueueNames[] = +{ + "Command", + "Security", + "NoOp", + "Controller", + "WakeUp", + "Send", + "Query", + "Poll" +}; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Driver::Driver +( + string const& _controllerPath, + ControllerInterface const& _interface +): + m_driverThread( new Thread( "driver" ) ), + m_exit( false ), + m_init( false ), + m_awakeNodesQueried( false ), + m_allNodesQueried( false ), + m_notifytransactions( false ), + m_controllerInterfaceType( _interface ), + m_controllerPath( _controllerPath ), + m_controller( NULL ), + m_homeId( 0 ), + m_libraryVersion( "" ), + m_libraryTypeName( "" ), + m_libraryType( 0 ), + m_manufacturerId( 0 ), + m_productType( 0 ), + m_productId ( 0 ), + m_initVersion( 0 ), + m_initCaps( 0 ), + m_controllerCaps( 0 ), + m_nodeMutex( new Mutex() ), + m_controllerReplication( NULL ), + m_transmitOptions( TRANSMIT_OPTION_ACK | TRANSMIT_OPTION_AUTO_ROUTE | TRANSMIT_OPTION_EXPLORE ), + m_waitingForAck( false ), + m_expectedCallbackId( 0 ), + m_expectedReply( 0 ), + m_expectedCommandClassId( 0 ), + m_expectedNodeId( 0 ), + m_pollThread( new Thread( "poll" ) ), + m_pollMutex( new Mutex() ), + m_pollInterval( 0 ), + m_bIntervalBetweenPolls( false ), // if set to true (via SetPollInterval), the pollInterval will be interspersed between each poll (so a much smaller m_pollInterval like 100, 500, or 1,000 may be appropriate) + m_currentControllerCommand( NULL ), + m_SUCNodeId( 0 ), + m_controllerResetEvent( NULL ), + m_sendMutex( new Mutex() ), + m_currentMsg( NULL ), + m_virtualNeighborsReceived( false ), + m_notificationsEvent( new Event() ), + m_SOFCnt( 0 ), + m_ACKWaiting( 0 ), + m_readAborts( 0 ), + m_badChecksum( 0 ), + m_readCnt( 0 ), + m_writeCnt( 0 ), + m_CANCnt( 0 ), + m_NAKCnt( 0 ), + m_ACKCnt( 0 ), + m_OOFCnt( 0 ), + m_dropped( 0 ), + m_retries( 0 ), + m_callbacks( 0 ), + m_badroutes( 0 ), + m_noack( 0 ), + m_netbusy( 0 ), + m_notidle( 0 ), + m_nondelivery( 0 ), + m_routedbusy( 0 ), + m_broadcastReadCnt( 0 ), + m_broadcastWriteCnt( 0 ) +{ + // set a timestamp to indicate when this driver started + TimeStamp m_startTime; + + // Create the message queue events + for( int32 i=0; iSetSignalThreshold( 1 ); + + Options::Get()->GetOptionAsBool( "NotifyTransactions", &m_notifytransactions ); + Options::Get()->GetOptionAsInt( "PollInterval", &m_pollInterval ); + Options::Get()->GetOptionAsBool( "IntervalBetweenPolls", &m_bIntervalBetweenPolls ); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +Driver::~Driver +( +) +{ + /* Signal that we are going away... so at least Apps know... */ + Notification* notification = new Notification( Notification::Type_DriverRemoved ); + notification->SetHomeAndNodeIds( m_homeId, 0 ); + QueueNotification( notification ); + NotifyWatchers(); + + + // append final driver stats output to the log file + LogDriverStatistics(); + + // Save the driver config before deleting anything else + bool save; + if( Options::Get()->GetOptionAsBool( "SaveConfiguration", &save) ) + { + if( save ) + { + WriteConfig(); + Scene::WriteXML( "zwscene.xml" ); + } + } + + // The order of the statements below has been achieved by mitigating freed memory + //references using a memory allocator checker. Do not rearrange unless you are + //certain memory won't be referenced out of order. --Greg Satz, April 2010 + m_exit = true; + + m_pollThread->Stop(); + m_pollThread->Release(); + + m_driverThread->Stop(); + m_driverThread->Release(); + + m_sendMutex->Release(); + + m_controller->Close(); + m_controller->Release(); + + if( m_currentMsg != NULL ) + { + RemoveCurrentMsg(); + } + + // Clear the node data + LockNodes(); + for( int i=0; i<256; ++i ) + { + if( GetNodeUnsafe( i ) ) + { + delete m_nodes[i]; + m_nodes[i] = NULL; + Notification* notification = new Notification( Notification::Type_NodeRemoved ); + notification->SetHomeAndNodeIds( m_homeId, i ); + QueueNotification( notification ); + } + } + ReleaseNodes(); + + // Don't release until all nodes have removed their poll values + m_pollMutex->Release(); + + // Clear the send Queue + for( int32 i=0; iRelease(); + } + /* Doing our Notification Call back here in the destructor is just asking for trouble + * as there is a good chance that the application will do some sort of GetDriver() supported + * method on the Manager Class, which by this time, most of the OZW Classes associated with the + * Driver class is 99% destructed. (mainly nodes, which cascade to CC, which cascade to ValueID + * classes etc). We might need a flag around the Manager::GetDriver() class that stops applications + * from getting a half destructed Driver Reference, but still retain a Internal GetDriver() method + * that can return half destructed Driver references for internal classes (as per Greg's note above) + */ + bool notify; + if( Options::Get()->GetOptionAsBool( "NotifyOnDriverUnload", ¬ify) ) + { + if( notify ) + { + NotifyWatchers(); + } + } + m_notificationsEvent->Release(); + m_nodeMutex->Release(); + + delete m_controllerReplication; +} + +//----------------------------------------------------------------------------- +// +// Start the driver thread +//----------------------------------------------------------------------------- +void Driver::Start +( +) +{ + // Start the thread that will handle communications with the Z-Wave network + m_driverThread->Start( Driver::DriverThreadEntryPoint, this ); +} + +//----------------------------------------------------------------------------- +// +// Entry point of the thread for creating and managing the worker threads +//----------------------------------------------------------------------------- +void Driver::DriverThreadEntryPoint +( + Event* _exitEvent, + void* _context +) +{ + Driver* driver = (Driver*)_context; + if( driver ) + { + driver->DriverThreadProc( _exitEvent ); + } +} + +//----------------------------------------------------------------------------- +// +// Create and manage the worker threads +//----------------------------------------------------------------------------- +void Driver::DriverThreadProc +( + Event* _exitEvent +) +{ + uint32 attempts = 0; + while( true ) + { + if( Init( attempts ) ) + { + // Driver has been initialised + Wait* waitObjects[11]; + waitObjects[0] = _exitEvent; // Thread must exit. + waitObjects[1] = m_notificationsEvent; // Notifications waiting to be sent. + waitObjects[2] = m_controller; // Controller has received data. + waitObjects[3] = m_queueEvent[MsgQueue_Command]; // A controller command is in progress. + waitObjects[4] = m_queueEvent[MsgQueue_Security]; // Security Related Commands (As they have a timeout) + waitObjects[5] = m_queueEvent[MsgQueue_NoOp]; // Send device probes and diagnostics messages + waitObjects[6] = m_queueEvent[MsgQueue_Controller]; // A multi-part controller command is in progress + waitObjects[7] = m_queueEvent[MsgQueue_WakeUp]; // A node has woken. Pending messages should be sent. + waitObjects[8] = m_queueEvent[MsgQueue_Send]; // Ordinary requests to be sent. + waitObjects[9] = m_queueEvent[MsgQueue_Query]; // Node queries are pending. + waitObjects[10] = m_queueEvent[MsgQueue_Poll]; // Poll request is waiting. + + TimeStamp retryTimeStamp; + int retryTimeout = RETRY_TIMEOUT; + Options::Get()->GetOptionAsInt( "RetryTimeout", &retryTimeout ); + + while( true ) + { + Log::Write( LogLevel_StreamDetail, " Top of DriverThreadProc loop." ); + uint32 count = 11; + int32 timeout = Wait::Timeout_Infinite; + + // If we're waiting for a message to complete, we can only + // handle incoming data, notifications and exit events. + if( m_waitingForAck || m_expectedCallbackId || m_expectedReply ) + { + count = 3; + timeout = m_waitingForAck ? ACK_TIMEOUT : retryTimeStamp.TimeRemaining(); + if( timeout < 0 ) + { + timeout = 0; + } + } + else if( m_currentControllerCommand != NULL ) + { + count = 7; + } + else + { + Log::QueueClear(); // clear the log queue when starting a new message + } + + // Wait for something to do + int32 res = Wait::Multiple( waitObjects, count, timeout ); + + switch( res ) + { + case -1: + { + // Wait has timed out - time to resend + if( m_currentMsg != NULL ) + { + Notification* notification = new Notification( Notification::Type_Notification ); + notification->SetHomeAndNodeIds( m_homeId, m_currentMsg->GetTargetNodeId() ); + notification->SetNotification( Notification::Code_Timeout ); + QueueNotification( notification ); + } + if( WriteMsg( "Wait Timeout" ) ) + { + retryTimeStamp.SetTime( retryTimeout ); + } + break; + } + case 0: + { + // Exit has been signalled + return; + } + case 1: + { + // Notifications are waiting to be sent + NotifyWatchers(); + break; + } + case 2: + { + // Data has been received + ReadMsg(); + break; + } + default: + { + // All the other events are sending message queue items + if( WriteNextMsg( (MsgQueue)(res-3) ) ) + { + retryTimeStamp.SetTime( retryTimeout ); + } + break; + } + } + } + } + + ++attempts; + + uint32 maxAttempts = 0; + Options::Get()->GetOptionAsInt("DriverMaxAttempts", (int32 *)&maxAttempts); + if( maxAttempts && (attempts >= maxAttempts) ) + { + Manager::Get()->Manager::SetDriverReady(this, false); + NotifyWatchers(); + break; + } + + if( attempts < 25 ) + { + // Retry every 5 seconds for the first two minutes + if( Wait::Single( _exitEvent, 5000 ) == 0 ) + { + // Exit signalled. + return; + } + } + else + { + // Retry every 30 seconds after that + if( Wait::Single( _exitEvent, 30000 ) == 0 ) + { + // Exit signalled. + return; + } + } + } +} + + +//----------------------------------------------------------------------------- +// +// Initialize the controller +//----------------------------------------------------------------------------- +bool Driver::Init +( + uint32 _attempts +) +{ + m_nodeId = -1; + m_waitingForAck = false; + + // Open the controller + Log::Write( LogLevel_Info, " Opening controller %s", m_controllerPath.c_str() ); + + if( !m_controller->Open( m_controllerPath ) ) + { + Log::Write( LogLevel_Warning, "WARNING: Failed to init the controller (attempt %d)", _attempts ); + return false; + } + + // Controller opened successfully, so we need to start all the worker threads + m_pollThread->Start( Driver::PollThreadEntryPoint, this ); + + // Send a NAK to the ZWave device + uint8 nak = NAK; + m_controller->Write( &nak, 1 ); + + // Get/set ZWave controller information in its preferred initialization order + m_controller->PlayInitSequence( this ); + + //If we ever want promiscuous mode uncomment this code. + //Msg* msg = new Msg( "FUNC_ID_ZW_SET_PROMISCUOUS_MODE", 0xff, REQUEST, FUNC_ID_ZW_SET_PROMISCUOUS_MODE, false, false ); + //msg->Append( 0xff ); + //SendMsg( msg ); + + // Init successful + return true; +} + +//----------------------------------------------------------------------------- +// +// Clean up any messages to a node +//----------------------------------------------------------------------------- +void Driver::RemoveQueues +( + uint8 const _nodeId +) +{ + if( m_currentMsg != NULL && m_currentMsg->GetTargetNodeId() == _nodeId ) + { + RemoveCurrentMsg(); + } + + // Clear the send Queue + for( int32 i=0; i::iterator it = m_msgQueue[i].begin(); + while( it != m_msgQueue[i].end() ) + { + bool remove = false; + MsgQueueItem const& item = *it; + if( MsgQueueCmd_SendMsg == item.m_command && _nodeId == item.m_msg->GetTargetNodeId() ) + { + delete item.m_msg; + remove = true; + } + else if( MsgQueueCmd_QueryStageComplete == item.m_command && _nodeId == item.m_nodeId ) + { + remove = true; + } + else if( MsgQueueCmd_Controller == item.m_command && _nodeId == item.m_cci->m_controllerCommandNode && m_currentControllerCommand != item.m_cci ) + { + delete item.m_cci; + remove = true; + } + if( remove ) + { + it = m_msgQueue[i].erase( it ); + } + else + { + ++it; + } + } + if( m_msgQueue[i].empty() ) + { + m_queueEvent[i]->Reset(); + } + } +} + +//----------------------------------------------------------------------------- +// Configuration +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Read our configuration from an XML document +//----------------------------------------------------------------------------- +bool Driver::ReadConfig +( +) +{ + char str[32]; + int32 intVal; + + // Load the XML document that contains the driver configuration + string userPath; + Options::Get()->GetOptionAsString( "UserPath", &userPath ); + + snprintf( str, sizeof(str), "zwcfg_0x%08x.xml", m_homeId ); + string filename = userPath + string(str); + + TiXmlDocument doc; + if( !doc.LoadFile( filename.c_str(), TIXML_ENCODING_UTF8 ) ) + { + return false; + } + + TiXmlElement const* driverElement = doc.RootElement(); + + // Version + if( TIXML_SUCCESS != driverElement->QueryIntAttribute( "version", &intVal ) || (uint32)intVal != c_configVersion ) + { + Log::Write( LogLevel_Warning, "WARNING: Driver::ReadConfig - %s is from an older version of OpenZWave and cannot be loaded.", filename.c_str() ); + return false; + } + + // Home ID + char const* homeIdStr = driverElement->Attribute( "home_id" ); + if( homeIdStr ) + { + char* p; + uint32 homeId = (uint32)strtoul( homeIdStr, &p, 0 ); + + if( homeId != m_homeId ) + { + Log::Write( LogLevel_Warning, "WARNING: Driver::ReadConfig - Home ID in file %s is incorrect", filename.c_str() ); + return false; + } + } + else + { + Log::Write( LogLevel_Warning, "WARNING: Driver::ReadConfig - Home ID is missing from file %s", filename.c_str() ); + return false; + } + + // Node ID + if( TIXML_SUCCESS == driverElement->QueryIntAttribute( "node_id", &intVal ) ) + { + if( (uint8)intVal != m_nodeId ) + { + Log::Write( LogLevel_Warning, "WARNING: Driver::ReadConfig - Controller Node ID in file %s is incorrect", filename.c_str() ); + return false; + } + } + else + { + Log::Write( LogLevel_Warning, "WARNING: Driver::ReadConfig - Node ID is missing from file %s", filename.c_str() ); + return false; + } + + // Capabilities + if( TIXML_SUCCESS == driverElement->QueryIntAttribute( "api_capabilities", &intVal ) ) + { + m_initCaps = (uint8)intVal; + } + + if( TIXML_SUCCESS == driverElement->QueryIntAttribute( "controller_capabilities", &intVal ) ) + { + m_controllerCaps = (uint8)intVal; + } + + // Poll Interval + if( TIXML_SUCCESS == driverElement->QueryIntAttribute( "poll_interval", &intVal ) ) + { + m_pollInterval = intVal; + } + + // Poll Interval--between polls or period for polling the entire pollList? + char const* cstr = driverElement->Attribute( "poll_interval_between" ); + if( cstr ) + { + m_bIntervalBetweenPolls = !strcmp( str, "true" ); + } + + // Read the nodes + LockNodes(); + TiXmlElement const* nodeElement = driverElement->FirstChildElement(); + while( nodeElement ) + { + char const* str = nodeElement->Value(); + if( str && !strcmp( str, "Node" ) ) + { + // Get the node Id from the XML + if( TIXML_SUCCESS == nodeElement->QueryIntAttribute( "id", &intVal ) ) + { + uint8 nodeId = (uint8)intVal; + Node* node = new Node( m_homeId, nodeId ); + m_nodes[nodeId] = node; + + Notification* notification = new Notification( Notification::Type_NodeAdded ); + notification->SetHomeAndNodeIds( m_homeId, nodeId ); + QueueNotification( notification ); + + // Read the rest of the node configuration from the XML + node->ReadXML( nodeElement ); + } + } + + nodeElement = nodeElement->NextSiblingElement(); + } + + ReleaseNodes(); + + // restore the previous state (for now, polling) for the nodes/values just retrieved + for( int i=0; i<256; i++ ) + { + if( m_nodes[i] != NULL ) + { + ValueStore* vs = m_nodes[i]->m_values; + for( ValueStore::Iterator it = vs->Begin(); it != vs->End(); ++it ) + { + Value* value = it->second; + if( value->m_pollIntensity != 0 ) + EnablePoll( value->GetID(), value->m_pollIntensity ); + } + } + } + + return true; +} + +//----------------------------------------------------------------------------- +// +// Write ourselves to an XML document +//----------------------------------------------------------------------------- +void Driver::WriteConfig +( +) +{ + char str[32]; + + if (!m_homeId) { + Log::Write( LogLevel_Warning, "WARNING: Tried to write driver config with no home ID set"); + return; + } + + // Create a new XML document to contain the driver configuration + TiXmlDocument doc; + TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "utf-8", "" ); + TiXmlElement* driverElement = new TiXmlElement( "Driver" ); + doc.LinkEndChild( decl ); + doc.LinkEndChild( driverElement ); + + driverElement->SetAttribute( "xmlns", "http://code.google.com/p/open-zwave/" ); + + snprintf( str, sizeof(str), "%d", c_configVersion ); + driverElement->SetAttribute( "version", str ); + + snprintf( str, sizeof(str), "0x%.8x", m_homeId ); + driverElement->SetAttribute( "home_id", str ); + + snprintf( str, sizeof(str), "%d", m_nodeId ); + driverElement->SetAttribute( "node_id", str ); + + snprintf( str, sizeof(str), "%d", m_initCaps ); + driverElement->SetAttribute( "api_capabilities", str ); + + snprintf( str, sizeof(str), "%d", m_controllerCaps ); + driverElement->SetAttribute( "controller_capabilities", str ); + + snprintf( str, sizeof(str), "%d", m_pollInterval ); + driverElement->SetAttribute( "poll_interval", str ); + + snprintf( str, sizeof(str), "%d", (int) m_bIntervalBetweenPolls ); + driverElement->SetAttribute( "poll_interval_between", str ); + + LockNodes(); + for( int i=0; i<256; ++i ) + { + if( m_nodes[i] ) + { + m_nodes[i]->WriteXML( driverElement ); + } + } + ReleaseNodes(); + + string userPath; + Options::Get()->GetOptionAsString( "UserPath", &userPath ); + + snprintf( str, sizeof(str), "zwcfg_0x%08x.xml", m_homeId ); + string filename = userPath + string(str); + + doc.SaveFile( filename.c_str() ); +} + +//----------------------------------------------------------------------------- +// Controller +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Returns a pointer to the requested node without locking. +// Only to be used by main thread code. +//----------------------------------------------------------------------------- +Node* Driver::GetNodeUnsafe +( + uint8 _nodeId +) +{ + if( Node* node = m_nodes[_nodeId] ) + { + return node; + } + return NULL; +} + +//----------------------------------------------------------------------------- +// +// Locks the nodes and returns a pointer to the requested one +//----------------------------------------------------------------------------- +Node* Driver::GetNode +( + uint8 _nodeId +) +{ + LockNodes(); + if( Node* node = m_nodes[_nodeId] ) + { + return node; + } + + ReleaseNodes(); + return NULL; +} + +//----------------------------------------------------------------------------- +// +// Lock the nodes so that no other thread can modify them +//----------------------------------------------------------------------------- +void Driver::LockNodes +( +) +{ + m_nodeMutex->Lock(); +} + +//----------------------------------------------------------------------------- +// +// Unlock the nodes so that other threads can modify them +//----------------------------------------------------------------------------- +void Driver::ReleaseNodes +( +) +{ + m_nodeMutex->Unlock(); +} + +//----------------------------------------------------------------------------- +// Sending Z-Wave messages +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Queue an item on the query queue that indicates a stage is complete +//----------------------------------------------------------------------------- +void Driver::SendQueryStageComplete +( + uint8 const _nodeId, + Node::QueryStage const _stage +) +{ + MsgQueueItem item; + item.m_command = MsgQueueCmd_QueryStageComplete; + item.m_nodeId = _nodeId; + item.m_queryStage = _stage; + item.m_retry = false; + + if( Node* node = GetNode( _nodeId ) ) + { + if( !node->IsListeningDevice() ) + { + if( WakeUp* wakeUp = static_cast( node->GetCommandClass( WakeUp::StaticGetCommandClassId() ) ) ) + { + if( !wakeUp->IsAwake() ) + { + // If the message is for a sleeping node, we queue it in the node itself. + Log::Write( LogLevel_Info, "" ); + Log::Write( LogLevel_Detail, node->GetNodeId(), "Queuing (%s) Query Stage Complete (%s)", c_sendQueueNames[MsgQueue_WakeUp], node->GetQueryStageName( _stage ).c_str() ); + wakeUp->QueueMsg( item ); + ReleaseNodes(); + return; + } + } + } + + // Non-sleeping node + Log::Write( LogLevel_Detail, node->GetNodeId(), "Queuing (%s) Query Stage Complete (%s)", c_sendQueueNames[MsgQueue_Query], node->GetQueryStageName( _stage ).c_str() ); + m_sendMutex->Lock(); + m_msgQueue[MsgQueue_Query].push_back( item ); + m_queueEvent[MsgQueue_Query]->Set(); + m_sendMutex->Unlock(); + + ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Request the current stage will be repeated +//----------------------------------------------------------------------------- +void Driver::RetryQueryStageComplete +( + uint8 const _nodeId, + Node::QueryStage const _stage +) +{ + MsgQueueItem item; + item.m_command = MsgQueueCmd_QueryStageComplete; + item.m_nodeId = _nodeId; + item.m_queryStage = _stage; + + m_sendMutex->Lock(); + + for( list::iterator it = m_msgQueue[MsgQueue_Query].begin(); it != m_msgQueue[MsgQueue_Query].end(); ++it ) + { + if( *it == item ) + { + (*it).m_retry = true; + break; + } + } + m_sendMutex->Unlock(); +} + +//----------------------------------------------------------------------------- +// +// Queue a message to be sent to the Z-Wave PC Interface +//----------------------------------------------------------------------------- +void Driver::SendMsg +( + Msg* _msg, + MsgQueue const _queue +) +{ + MsgQueueItem item; + + item.m_command = MsgQueueCmd_SendMsg; + item.m_msg = _msg; + _msg->Finalize(); + + + if( Node* node = GetNode(_msg->GetTargetNodeId()) ) + { + // If the message is for a sleeping node, we queue it in the node itself. + if( !node->IsListeningDevice() ) + { + if( WakeUp* wakeUp = static_cast( node->GetCommandClass( WakeUp::StaticGetCommandClassId() ) ) ) + { + if( !wakeUp->IsAwake() ) + { + Log::Write( LogLevel_Detail, "" ); + // Handle saving multi-step controller commands + if( m_currentControllerCommand != NULL ) + { + Log::Write( LogLevel_Detail, GetNodeNumber( _msg ), "Queuing (%s) %s", c_sendQueueNames[MsgQueue_Controller], c_controllerCommandNames[m_currentControllerCommand->m_controllerCommand] ); + delete _msg; + item.m_command = MsgQueueCmd_Controller; + item.m_cci = new ControllerCommandItem( *m_currentControllerCommand ); + item.m_msg = NULL; + UpdateControllerState( ControllerState_Sleeping ); + } + else + { + Log::Write( LogLevel_Detail, GetNodeNumber( _msg ), "Queuing (%s) %s", c_sendQueueNames[MsgQueue_WakeUp], _msg->GetAsString().c_str() ); + } + wakeUp->QueueMsg( item ); + ReleaseNodes(); + return; + } + } + } + + /* if the node Supports the Security Class - check if this message is meant to be encapsulated */ + if ( Security* security = static_cast( node->GetCommandClass(Security::StaticGetCommandClassId() ) ) ) + { + CommandClass *cc = node->GetCommandClass(_msg->GetSendingCommandClass()); + if ( (cc) && (cc->IsSecured()) ) + { + Log::Write( LogLevel_Detail, GetNodeNumber( _msg ), "Encrypting Message For Command Class %s", cc->GetCommandClassName().c_str()); + security->SendMsg(_msg); + ReleaseNodes(); + return; + } + } + ReleaseNodes(); + } + + Log::Write( LogLevel_Detail, GetNodeNumber( _msg ), "Queuing (%s) %s", c_sendQueueNames[_queue], _msg->GetAsString().c_str() ); + m_sendMutex->Lock(); + m_msgQueue[_queue].push_back( item ); + m_queueEvent[_queue]->Set(); + m_sendMutex->Unlock(); +} + +//----------------------------------------------------------------------------- +// +// Transmit a queued message to the Z-Wave controller +//----------------------------------------------------------------------------- +bool Driver::WriteNextMsg +( + MsgQueue const _queue +) +{ + + // There are messages to send, so get the one at the front of the queue + m_sendMutex->Lock(); + MsgQueueItem item = m_msgQueue[_queue].front(); + + if( MsgQueueCmd_SendMsg == item.m_command ) + { + // Send a message + m_currentMsg = item.m_msg; + m_currentMsgQueueSource = _queue; + m_msgQueue[_queue].pop_front(); + if( m_msgQueue[_queue].empty() ) + { + m_queueEvent[_queue]->Reset(); + } + m_sendMutex->Unlock(); + return WriteMsg( "WriteNextMsg" ); + } + + if( MsgQueueCmd_QueryStageComplete == item.m_command ) + { + // Move to the next query stage + m_currentMsg = NULL; + Node::QueryStage stage = item.m_queryStage; + m_msgQueue[_queue].pop_front(); + if( m_msgQueue[_queue].empty() ) + { + m_queueEvent[_queue]->Reset(); + } + m_sendMutex->Unlock(); + + Node* node = GetNodeUnsafe( item.m_nodeId ); + if( node != NULL ) + { + Log::Write( LogLevel_Detail, node->GetNodeId(), "Query Stage Complete (%s)", node->GetQueryStageName( stage ).c_str() ); + if( !item.m_retry ) + { + node->QueryStageComplete( stage ); + } + node->AdvanceQueries(); + return true; + } + } + + if( MsgQueueCmd_Controller == item.m_command ) + { + // Run a multi-step controller command + m_currentControllerCommand = item.m_cci; + m_sendMutex->Unlock(); + // Figure out if done with command + if ( m_currentControllerCommand->m_controllerCommandDone ) + { + m_sendMutex->Lock(); + m_msgQueue[_queue].pop_front(); + if( m_msgQueue[_queue].empty() ) + { + m_queueEvent[_queue]->Reset(); + } + m_sendMutex->Unlock(); + if( m_currentControllerCommand->m_controllerCallback ) + { + m_currentControllerCommand->m_controllerCallback( m_currentControllerCommand->m_controllerState, m_currentControllerCommand->m_controllerReturnError, m_currentControllerCommand->m_controllerCallbackContext ); + } + m_sendMutex->Lock(); + delete m_currentControllerCommand; + m_currentControllerCommand = NULL; + m_sendMutex->Unlock(); + } + else if( m_currentControllerCommand->m_controllerState == ControllerState_Normal ) + { + DoControllerCommand(); + } + else if( m_currentControllerCommand->m_controllerStateChanged ) + { + if( m_currentControllerCommand->m_controllerCallback ) + { + m_currentControllerCommand->m_controllerCallback( m_currentControllerCommand->m_controllerState, m_currentControllerCommand->m_controllerReturnError, m_currentControllerCommand->m_controllerCallbackContext ); + m_currentControllerCommand->m_controllerStateChanged = false; + } + } + else + { + Log::Write( LogLevel_Info, "WriteNextMsg Controller nothing to do" ); + m_sendMutex->Lock(); + m_queueEvent[_queue]->Reset(); + m_sendMutex->Unlock(); + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Transmit the current message to the Z-Wave controller +//----------------------------------------------------------------------------- +bool Driver::WriteMsg +( + string const &msg +) +{ + if( !m_currentMsg ) + { + Log::Write( LogLevel_Detail, GetNodeNumber( m_currentMsg ), "WriteMsg %s m_currentMsg=%08x", msg.c_str(), m_currentMsg ); + // We try not to hang when this happenes + m_expectedCallbackId = 0; + m_expectedCommandClassId = 0; + m_expectedNodeId = 0; + m_expectedReply = 0; + m_waitingForAck = false; + return false; + } + + uint8 attempts = m_currentMsg->GetSendAttempts(); + uint8 nodeId = m_currentMsg->GetTargetNodeId(); + Node* node = GetNode( nodeId ); + if( attempts >= m_currentMsg->GetMaxSendAttempts() || (node != NULL && !node->IsNodeAlive() && !m_currentMsg->IsNoOperation() ) ) + { + if( node != NULL && !node->IsNodeAlive() ) + { + Log::Write( LogLevel_Error, nodeId, "ERROR: Dropping command because node is presumed dead" ); + } + else + { + // That's it - already tried to send GetMaxSendAttempt() times. + Log::Write( LogLevel_Error, nodeId, "ERROR: Dropping command, expected response not received after %d attempt(s)", m_currentMsg->GetMaxSendAttempts() ); + } + RemoveCurrentMsg(); + m_dropped++; + if( node != NULL ) + { + ReleaseNodes(); + } + return false; + } + + if( attempts != 0) + { + // this is not the first attempt, so increment the callback id before sending + m_currentMsg->UpdateCallbackId(); + } + + m_currentMsg->SetSendAttempts( ++attempts ); + m_expectedCallbackId = m_currentMsg->GetCallbackId(); + m_expectedCommandClassId = m_currentMsg->GetExpectedCommandClassId(); + m_expectedNodeId = m_currentMsg->GetTargetNodeId(); + m_expectedReply = m_currentMsg->GetExpectedReply(); + m_waitingForAck = true; + string attemptsstr = ""; + if( attempts > 1 ) + { + char buf[15]; + snprintf( buf, sizeof(buf), "Attempt %d, ", attempts ); + attemptsstr = buf; + m_retries++; + if( node != NULL ) + { + node->m_retries++; + } + } + + Log::Write( LogLevel_Detail, "" ); + Log::Write( LogLevel_Info, nodeId, "Sending (%s) message (%sCallback ID=0x%.2x, Expected Reply=0x%.2x) - %s", c_sendQueueNames[m_currentMsgQueueSource], attemptsstr.c_str(), m_expectedCallbackId, m_expectedReply, m_currentMsg->GetAsString().c_str() ); + + m_controller->Write( m_currentMsg->GetBuffer(), m_currentMsg->GetLength() ); + m_writeCnt++; + + if( nodeId == 0xff ) + { + m_broadcastWriteCnt++; // not accurate since library uses 0xff for the controller too + } + else + { + if( node != NULL ) + { + node->m_sentCnt++; + node->m_sentTS.SetTime(); + if( m_expectedReply == FUNC_ID_APPLICATION_COMMAND_HANDLER ) + { + CommandClass* cc = node->GetCommandClass( m_expectedCommandClassId ); + if( cc != NULL ) + { + cc->SentCntIncr(); + } + } + } + } + if( node != NULL ) + { + ReleaseNodes(); + } + + return true; +} + +//----------------------------------------------------------------------------- +// +// Delete the current message +//----------------------------------------------------------------------------- +void Driver::RemoveCurrentMsg +( +) +{ + Log::Write( LogLevel_Detail, GetNodeNumber( m_currentMsg ), "Removing current message" ); + if( m_currentMsg != NULL) + { + delete m_currentMsg; + m_currentMsg = NULL; + } + + m_expectedCallbackId = 0; + m_expectedCommandClassId = 0; + m_expectedNodeId = 0; + m_expectedReply = 0; + m_waitingForAck = false; +} + +//----------------------------------------------------------------------------- +// +// Move messages for a sleeping device to its wake-up queue +//----------------------------------------------------------------------------- +bool Driver::MoveMessagesToWakeUpQueue +( + uint8 const _targetNodeId, + bool const _move +) +{ + // If the target node is one that goes to sleep, transfer + // all messages for it to its Wake-Up queue. + if( Node* node = GetNodeUnsafe(_targetNodeId) ) + { + if( !node->IsListeningDevice() && !node->IsFrequentListeningDevice() && _targetNodeId != m_nodeId ) + { + if( WakeUp* wakeUp = static_cast( node->GetCommandClass( WakeUp::StaticGetCommandClassId() ) ) ) + { + // Mark the node as asleep + wakeUp->SetAwake( false ); + + // If we need to save the messages + if( _move ) + { + // Move all messages for this node to the wake-up queue + m_sendMutex->Lock(); + + // See if we are working on a controller command + if( m_currentControllerCommand ) + { + // Don't save controller message as it will be recreated + RemoveCurrentMsg(); + } + + // Then try the current message first + if( m_currentMsg ) + { + if( _targetNodeId == m_currentMsg->GetTargetNodeId() ) + { + // This message is for the unresponsive node + // We do not move any "Wake Up No More Information" + // commands or NoOperations to the pending queue. + if( !m_currentMsg->IsWakeUpNoMoreInformationCommand() && !m_currentMsg->IsNoOperation() ) + { + Log::Write( LogLevel_Info, _targetNodeId, "Node not responding - moving message to Wake-Up queue: %s", m_currentMsg->GetAsString().c_str() ); + MsgQueueItem item; + item.m_command = MsgQueueCmd_SendMsg; + item.m_msg = m_currentMsg; + wakeUp->QueueMsg( item ); + } + else + { + delete m_currentMsg; + } + + m_currentMsg = NULL; + m_expectedCallbackId = 0; + m_expectedCommandClassId = 0; + m_expectedNodeId = 0; + m_expectedReply = 0; + m_waitingForAck = false; + } + } + + // Now the message queues + for( int i=0; i::iterator it = m_msgQueue[i].begin(); + while( it != m_msgQueue[i].end() ) + { + bool remove = false; + MsgQueueItem const& item = *it; + if( MsgQueueCmd_SendMsg == item.m_command ) + { + if( _targetNodeId == item.m_msg->GetTargetNodeId() ) + { + // This message is for the unresponsive node + // We do not move any "Wake Up No More Information" + // commands or NoOperations to the pending queue. + if( !item.m_msg->IsWakeUpNoMoreInformationCommand() && !item.m_msg->IsNoOperation() ) + { + Log::Write( LogLevel_Info, item.m_msg->GetTargetNodeId(), "Node not responding - moving message to Wake-Up queue: %s", item.m_msg->GetAsString().c_str() ); + wakeUp->QueueMsg( item ); + } + else + { + delete item.m_msg; + } + remove = true; + } + } + if( MsgQueueCmd_QueryStageComplete == item.m_command ) + { + if( _targetNodeId == item.m_nodeId ) + { + Log::Write( LogLevel_Info, _targetNodeId, "Node not responding - moving QueryStageComplete command to Wake-Up queue" ); + wakeUp->QueueMsg( item ); + remove = true; + } + } + if( MsgQueueCmd_Controller == item.m_command ) + { + if( _targetNodeId == item.m_cci->m_controllerCommandNode ) + { + Log::Write( LogLevel_Info, _targetNodeId, "Node not responding - moving controller command to Wake-Up queue: %s", c_controllerCommandNames[item.m_cci->m_controllerCommand] ); + wakeUp->QueueMsg( item ); + remove = true; + } + } + + if( remove ) + { + it = m_msgQueue[i].erase( it ); + } + else + { + ++it; + } + } + + // If the queue is now empty, we need to clear its event + if( m_msgQueue[i].empty() ) + { + m_queueEvent[i]->Reset(); + } + } + + if( m_currentControllerCommand ) + { + // Put command back on queue so it will be cleaned up + UpdateControllerState( ControllerState_Sleeping ); + MsgQueueItem item; + item.m_command = MsgQueueCmd_Controller; + item.m_cci = new ControllerCommandItem( *m_currentControllerCommand ); + m_currentControllerCommand = item.m_cci; + m_msgQueue[MsgQueue_Controller].push_back( item ); + m_queueEvent[MsgQueue_Controller]->Set(); + } + + m_sendMutex->Unlock(); + + // Move completed successfully + return true; + } + } + } + } + + // Failed to move messages + return false; +} + +//----------------------------------------------------------------------------- +// +// For messages that return a ZW_SEND_DATA response, process the results here +// If it is a non-listeing (sleeping) node return true. +//----------------------------------------------------------------------------- +bool Driver::HandleErrorResponse +( + uint8 const _error, + uint8 const _nodeId, + char const* _funcStr, + bool _sleepCheck // = 0 +) +{ + // Only called with a ZW_SEND_DATA error response. We count and output the message here. + if( _error == TRANSMIT_COMPLETE_NOROUTE ) + { + m_badroutes++; + Log::Write( LogLevel_Info, _nodeId, "ERROR: %s failed. No route available.", _funcStr ); + } + else if( _error == TRANSMIT_COMPLETE_NO_ACK ) + { + m_noack++; + Log::Write( LogLevel_Info, _nodeId, "WARNING: %s failed. No ACK received - device may be asleep.", _funcStr ); + if( m_currentMsg ) + { + // In case the failure is due to the target being a sleeping node, we + // first try to move its pending messages to its wake-up queue. + if( MoveMessagesToWakeUpQueue( m_currentMsg->GetTargetNodeId(), _sleepCheck ) ) + { + return true; + } + Log::Write( LogLevel_Warning, _nodeId, "WARNING: Device is not a sleeping node." ); + } + } + else if( _error == TRANSMIT_COMPLETE_FAIL ) + { + m_netbusy++; + Log::Write( LogLevel_Info, _nodeId, "ERROR: %s failed. Network is busy.", _funcStr ); + } + else if( _error == TRANSMIT_COMPLETE_NOT_IDLE ) + { + m_notidle++; + Log::Write( LogLevel_Info, _nodeId, "ERROR: %s failed. Network is busy.", _funcStr ); + } + if( Node* node = GetNodeUnsafe( _nodeId ) ) + { + if( ++node->m_errors >= 3 ) + { + node->SetNodeAlive( false ); + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Identify controller (as opposed to node) commands...especially blocking ones +//----------------------------------------------------------------------------- +void Driver::CheckCompletedNodeQueries +( +) +{ + Log::Write( LogLevel_Warning, "CheckCompletedNodeQueries m_allNodesQueried=%d m_awakeNodesQueried=%d", m_allNodesQueried, m_awakeNodesQueried ); + if( !m_allNodesQueried ) + { + bool all = true; + bool sleepingOnly = true; + bool deadFound = false; + + LockNodes(); + for( int i=0; i<256; ++i ) + { + if( m_nodes[i] ) + { + if( m_nodes[i]->GetCurrentQueryStage() != Node::QueryStage_Complete ) + { + if ( !m_nodes[i]->IsNodeAlive() ) + { + deadFound = true; + continue; + } + all = false; + if( m_nodes[i]->IsListeningDevice() ) + { + sleepingOnly = false; + } + } + } + } + ReleaseNodes(); + + Log::Write( LogLevel_Warning, "CheckCompletedNodeQueries all=%d, deadFound=%d sleepingOnly=%d", all, deadFound, sleepingOnly ); + if( all ) + { + if( deadFound ) + { + // only dead nodes left to query + Log::Write( LogLevel_Info, " Node query processing complete except for dead nodes." ); + Notification* notification = new Notification( Notification::Type_AllNodesQueriedSomeDead ); + notification->SetHomeAndNodeIds( m_homeId, 0xff ); + QueueNotification( notification ); + } + else + { + // no sleeping nodes, no dead nodes and no more nodes in the queue, so...All done + Log::Write( LogLevel_Info, " Node query processing complete." ); + Notification* notification = new Notification( Notification::Type_AllNodesQueried ); + notification->SetHomeAndNodeIds( m_homeId, 0xff ); + QueueNotification( notification ); + } + m_awakeNodesQueried = true; + m_allNodesQueried = true; + } + else if( sleepingOnly ) + { + if (!m_awakeNodesQueried ) + { + // only sleeping nodes remain, so signal awake nodes queried complete + Log::Write( LogLevel_Info, " Node query processing complete except for sleeping nodes." ); + Notification* notification = new Notification( Notification::Type_AwakeNodesQueried ); + notification->SetHomeAndNodeIds( m_homeId, 0xff ); + QueueNotification( notification ); + m_awakeNodesQueried = true; + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Determine if the reply is from the node we are expecting. +//----------------------------------------------------------------------------- +bool Driver::IsExpectedReply +( + const uint8 _nodeId +) +{ + // Accept all controller commands or where the protocol doesn't identify the actual node + if( m_expectedNodeId == 255 || _nodeId == 0 ) + { + return true; + } + // Accept all messages that do not convey source node identification. + if( m_expectedReply == FUNC_ID_ZW_GET_NODE_PROTOCOL_INFO || + m_expectedReply == FUNC_ID_ZW_REQUEST_NODE_INFO || + m_expectedReply == FUNC_ID_ZW_GET_ROUTING_INFO || + m_expectedReply == FUNC_ID_ZW_ASSIGN_RETURN_ROUTE || + m_expectedReply == FUNC_ID_ZW_DELETE_RETURN_ROUTE || + m_expectedReply == FUNC_ID_ZW_SEND_DATA || + m_expectedReply == FUNC_ID_ZW_SEND_NODE_INFORMATION || + m_expectedReply == FUNC_ID_ZW_REQUEST_NODE_NEIGHBOR_UPDATE || + m_expectedReply == FUNC_ID_ZW_ENABLE_SUC || + m_expectedReply == FUNC_ID_ZW_SET_SUC_NODE_ID || + m_expectedReply == FUNC_ID_ZW_REQUEST_NODE_NEIGHBOR_UPDATE_OPTIONS ) + { + return true; + } + // Accept if source message contains node info and it is from the one we are expecting + if( m_expectedNodeId == _nodeId ) + { + return true; + } + Log::Write( LogLevel_Detail, "IsExpectedReply: m_expectedNodeId = %d m_expectedReply = %02x", m_expectedNodeId, m_expectedReply ); + return false; +} +//----------------------------------------------------------------------------- +// Receiving Z-Wave messages +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Read data from the serial port +//----------------------------------------------------------------------------- +bool Driver::ReadMsg +( +) +{ + uint8 buffer[1024] = {0}; + + if( !m_controller->Read( buffer, 1 ) ) + { + // Nothing to read + return false; + } + + switch( buffer[0] ) + { + case SOF: + { + m_SOFCnt++; + if( m_waitingForAck ) + { + // This can happen on any normal network when a transmission overlaps an unexpected + // reception and the data in the buffer doesn't contain the ACK. The controller will + // notice and send us a CAN to retransmit. + Log::Write( LogLevel_Detail, "Unsolicited message received while waiting for ACK." ); + m_ACKWaiting++; + } + + // Read the length byte. Keep trying until we get it. + m_controller->SetSignalThreshold( 1 ); + int32 response = Wait::Single( m_controller, 50 ); + if( response < 0 ) + { + Log::Write( LogLevel_Warning, "WARNING: 50ms passed without finding the length byte...aborting frame read"); + m_readAborts++; + break; + } + + m_controller->Read( &buffer[1], 1 ); + m_controller->SetSignalThreshold( buffer[1] ); + if( Wait::Single( m_controller, 500 ) < 0 ) + { + Log::Write( LogLevel_Warning, "WARNING: 500ms passed without reading the rest of the frame...aborting frame read" ); + m_readAborts++; + m_controller->SetSignalThreshold( 1 ); + break; + } + + m_controller->Read( &buffer[2], buffer[1] ); + m_controller->SetSignalThreshold( 1 ); + + uint32 length = buffer[1] + 2; + + // Log the data + string str = ""; + for( uint32 i=0; iWrite( &ack, 1 ); + m_readCnt++; + + // Process the received message + ProcessMsg( &buffer[2] ); + } + else + { + Log::Write( LogLevel_Warning, nodeId, "WARNING: Checksum incorrect - sending NAK" ); + m_badChecksum++; + uint8 nak = NAK; + m_controller->Write( &nak, 1 ); + m_controller->Purge(); + } + break; + } + + case CAN: + { + // This is the other side of an unsolicited ACK. As mentioned there if we receive a message + // just after we transmitted one, the controller will notice and tell us to retransmit here. + // Don't increment the transmission counter as it is possible the message will never get out + // on very busy networks with lots of unsolicited messages being received. Increase the amount + // of retries but only up to a limit so we don't stay here forever. + Log::Write( LogLevel_Detail, GetNodeNumber( m_currentMsg ), "CAN received...triggering resend" ); + m_CANCnt++; + if( m_currentMsg != NULL ) + { + m_currentMsg->SetMaxSendAttempts( m_currentMsg->GetMaxSendAttempts() + 1 ); + } + else + { + Log::Write( LogLevel_Warning, "m_currentMsg was NULL when trying to set MaxSendAttempts" ); + Log::QueueDump(); + } + WriteMsg( "CAN" ); + break; + } + + case NAK: + { + Log::Write( LogLevel_Warning, GetNodeNumber( m_currentMsg ), "WARNING: NAK received...triggering resend" ); + m_NAKCnt++; + WriteMsg( "NAK" ); + break; + } + + case ACK: + { + m_ACKCnt++; + m_waitingForAck = false; + if( m_currentMsg == NULL ) + { + Log::Write( LogLevel_StreamDetail, 255, " ACK received" ); + } + else + { + Log::Write( LogLevel_StreamDetail, GetNodeNumber( m_currentMsg ), " ACK received CallbackId 0x%.2x Reply 0x%.2x", m_expectedCallbackId, m_expectedReply ); + if( ( 0 == m_expectedCallbackId ) && ( 0 == m_expectedReply ) ) + { + // Remove the message from the queue, now that it has been acknowledged. + RemoveCurrentMsg(); + } + } + break; + } + + default: + { + Log::Write( LogLevel_Warning, "WARNING: Out of frame flow! (0x%.2x). Sending NAK.", buffer[0] ); + m_OOFCnt++; + uint8 nak = NAK; + m_controller->Write( &nak, 1 ); + m_controller->Purge(); + break; + } + } + + return true; +} + +//----------------------------------------------------------------------------- +// +// Process data received from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::ProcessMsg +( + uint8* _data +) +{ + bool handleCallback = true; + uint8 nodeId = GetNodeNumber( m_currentMsg ); + + if( RESPONSE == _data[0] ) + { + switch( _data[1] ) + { + case FUNC_ID_SERIAL_API_GET_INIT_DATA: + { + Log::Write( LogLevel_Detail, "" ); + HandleSerialAPIGetInitDataResponse( _data ); + break; + } + case FUNC_ID_ZW_GET_CONTROLLER_CAPABILITIES: + { + Log::Write( LogLevel_Detail, "" ); + HandleGetControllerCapabilitiesResponse( _data ); + break; + } + case FUNC_ID_SERIAL_API_GET_CAPABILITIES: + { + Log::Write( LogLevel_Detail, "" ); + HandleGetSerialAPICapabilitiesResponse( _data ); + break; + } + case FUNC_ID_SERIAL_API_SOFT_RESET: + { + Log::Write( LogLevel_Detail, "" ); + HandleSerialAPISoftResetResponse( _data ); + break; + } + case FUNC_ID_ZW_SEND_DATA: + { + HandleSendDataResponse( _data, false ); + handleCallback = false; // Skip the callback handling - a subsequent FUNC_ID_ZW_SEND_DATA request will deal with that + break; + } + case FUNC_ID_ZW_GET_VERSION: + { + Log::Write( LogLevel_Detail, "" ); + HandleGetVersionResponse( _data ); + break; + } + case FUNC_ID_ZW_GET_RANDOM: + { + Log::Write( LogLevel_Detail, "" ); + HandleGetRandomResponse( _data ); + break; + } + case FUNC_ID_ZW_MEMORY_GET_ID: + { + Log::Write( LogLevel_Detail, "" ); + HandleMemoryGetIdResponse( _data ); + break; + } + case FUNC_ID_ZW_GET_NODE_PROTOCOL_INFO: + { + Log::Write( LogLevel_Detail, "" ); + HandleGetNodeProtocolInfoResponse( _data ); + break; + } + case FUNC_ID_ZW_REPLICATION_SEND_DATA: + { + HandleSendDataResponse( _data, true ); + handleCallback = false; // Skip the callback handling - a subsequent FUNC_ID_ZW_REPLICATION_SEND_DATA request will deal with that + break; + } + case FUNC_ID_ZW_ASSIGN_RETURN_ROUTE: + { + Log::Write( LogLevel_Detail, "" ); + if( !HandleAssignReturnRouteResponse( _data ) ) + { + m_expectedCallbackId = _data[2]; // The callback message won't be coming, so we force the transaction to complete + m_expectedReply = 0; + m_expectedCommandClassId = 0; + m_expectedNodeId = 0; + } + break; + } + case FUNC_ID_ZW_DELETE_RETURN_ROUTE: + { + Log::Write( LogLevel_Detail, "" ); + if( !HandleDeleteReturnRouteResponse( _data ) ) + { + m_expectedCallbackId = _data[2]; // The callback message won't be coming, so we force the transaction to complete + m_expectedReply = 0; + m_expectedCommandClassId = 0; + m_expectedNodeId = 0; + } + break; + } + case FUNC_ID_ZW_ENABLE_SUC: + { + Log::Write( LogLevel_Detail, "" ); + HandleEnableSUCResponse( _data ); + break; + } + case FUNC_ID_ZW_REQUEST_NETWORK_UPDATE: + { + Log::Write( LogLevel_Detail, "" ); + if( !HandleNetworkUpdateResponse( _data ) ) + { + m_expectedCallbackId = _data[2]; // The callback message won't be coming, so we force the transaction to complete + m_expectedReply = 0; + m_expectedCommandClassId = 0; + m_expectedNodeId = 0; + } + break; + } + case FUNC_ID_ZW_SET_SUC_NODE_ID: + { + Log::Write( LogLevel_Detail, "" ); + HandleSetSUCNodeIdResponse( _data ); + break; + } + case FUNC_ID_ZW_GET_SUC_NODE_ID: + { + Log::Write( LogLevel_Detail, "" ); + HandleGetSUCNodeIdResponse( _data ); + break; + } + case FUNC_ID_ZW_REQUEST_NODE_INFO: + { + Log::Write( LogLevel_Detail, "" ); + if( _data[2] ) + { + Log::Write( LogLevel_Info, nodeId, "FUNC_ID_ZW_REQUEST_NODE_INFO Request successful." ); + } + else + { + Log::Write( LogLevel_Info, nodeId, "FUNC_ID_ZW_REQUEST_NODE_INFO Request failed." ); + } + break; + } + case FUNC_ID_ZW_REMOVE_FAILED_NODE_ID: + { + Log::Write( LogLevel_Detail, "" ); + if( !HandleRemoveFailedNodeResponse( _data ) ) + { + m_expectedCallbackId = _data[2]; // The callback message won't be coming, so we force the transaction to complete + m_expectedReply = 0; + m_expectedCommandClassId = 0; + m_expectedNodeId = 0; + } + break; + } + case FUNC_ID_ZW_IS_FAILED_NODE_ID: + { + Log::Write( LogLevel_Detail, "" ); + HandleIsFailedNodeResponse( _data ); + break; + } + case FUNC_ID_ZW_REPLACE_FAILED_NODE: + { + Log::Write( LogLevel_Detail, "" ); + if( !HandleReplaceFailedNodeResponse( _data ) ) + { + m_expectedCallbackId = _data[2]; // The callback message won't be coming, so we force the transaction to complete + m_expectedReply = 0; + m_expectedCommandClassId = 0; + m_expectedNodeId = 0; + } + break; + } + case FUNC_ID_ZW_GET_ROUTING_INFO: + { + Log::Write( LogLevel_Detail, "" ); + HandleGetRoutingInfoResponse( _data ); + break; + } + case FUNC_ID_ZW_R_F_POWER_LEVEL_SET: + { + Log::Write( LogLevel_Detail, "" ); + HandleRfPowerLevelSetResponse( _data ); + break; + } + case FUNC_ID_ZW_READ_MEMORY: + { + Log::Write( LogLevel_Detail, "" ); + HandleReadMemoryResponse( _data ); + break; + } + case FUNC_ID_SERIAL_API_SET_TIMEOUTS: + { + Log::Write( LogLevel_Detail, "" ); + HandleSerialApiSetTimeoutsResponse( _data ); + break; + } + case FUNC_ID_MEMORY_GET_BYTE: + { + Log::Write( LogLevel_Detail, "" ); + HandleMemoryGetByteResponse( _data ); + break; + } + case FUNC_ID_ZW_GET_VIRTUAL_NODES: + { + Log::Write( LogLevel_Detail, "" ); + HandleGetVirtualNodesResponse( _data ); + break; + } + case FUNC_ID_ZW_SET_SLAVE_LEARN_MODE: + { + Log::Write( LogLevel_Detail, "" ); + if( !HandleSetSlaveLearnModeResponse( _data ) ) + { + m_expectedCallbackId = _data[2]; // The callback message won't be coming, so we force the transaction to complete + m_expectedReply = 0; + m_expectedCommandClassId = 0; + m_expectedNodeId = 0; + } + break; + } + case FUNC_ID_ZW_SEND_SLAVE_NODE_INFO: + { + Log::Write( LogLevel_Detail, "" ); + if( !HandleSendSlaveNodeInfoResponse( _data ) ) + { + m_expectedCallbackId = _data[2]; // The callback message won't be coming, so we force the transaction to complete + m_expectedReply = 0; + m_expectedCommandClassId = 0; + m_expectedNodeId = 0; + } + break; + } + default: + { + Log::Write( LogLevel_Detail, "" ); + Log::Write( LogLevel_Info, "**TODO: handle response for 0x%.2x** Please report this message.", _data[1] ); + break; + } + } + } + else if( REQUEST == _data[0] ) + { + switch( _data[1] ) + { + case FUNC_ID_APPLICATION_COMMAND_HANDLER: + { + Log::Write( LogLevel_Detail, "" ); + HandleApplicationCommandHandlerRequest( _data ); + break; + } + case FUNC_ID_ZW_SEND_DATA: + { + HandleSendDataRequest( _data, false ); + break; + } + case FUNC_ID_ZW_REPLICATION_COMMAND_COMPLETE: + { + if( m_controllerReplication ) + { + Log::Write( LogLevel_Detail, "" ); + m_controllerReplication->SendNextData(); + } + break; + } + case FUNC_ID_ZW_REPLICATION_SEND_DATA: + { + HandleSendDataRequest( _data, true ); + break; + } + case FUNC_ID_ZW_ASSIGN_RETURN_ROUTE: + { + Log::Write( LogLevel_Detail, "" ); + HandleAssignReturnRouteRequest( _data ); + break; + } + case FUNC_ID_ZW_DELETE_RETURN_ROUTE: + { + Log::Write( LogLevel_Detail, "" ); + HandleDeleteReturnRouteRequest( _data ); + break; + } + case FUNC_ID_ZW_SEND_NODE_INFORMATION: + { + Log::Write( LogLevel_Detail, "" ); + HandleSendNodeInformationRequest( _data ); + break; + } + case FUNC_ID_ZW_REQUEST_NODE_NEIGHBOR_UPDATE: + case FUNC_ID_ZW_REQUEST_NODE_NEIGHBOR_UPDATE_OPTIONS: + { + Log::Write( LogLevel_Detail, "" ); + HandleNodeNeighborUpdateRequest( _data ); + break; + } + case FUNC_ID_ZW_APPLICATION_UPDATE: + { + Log::Write( LogLevel_Detail, "" ); + handleCallback = !HandleApplicationUpdateRequest( _data ); + break; + } + case FUNC_ID_ZW_ADD_NODE_TO_NETWORK: + { + Log::Write( LogLevel_Detail, "" ); + HandleAddNodeToNetworkRequest( _data ); + break; + } + case FUNC_ID_ZW_REMOVE_NODE_FROM_NETWORK: + { + Log::Write( LogLevel_Detail, "" ); + HandleRemoveNodeFromNetworkRequest( _data ); + break; + } + case FUNC_ID_ZW_CREATE_NEW_PRIMARY: + { + Log::Write( LogLevel_Detail, "" ); + HandleCreateNewPrimaryRequest( _data ); + break; + } + case FUNC_ID_ZW_CONTROLLER_CHANGE: + { + Log::Write( LogLevel_Detail, "" ); + HandleControllerChangeRequest( _data ); + break; + } + case FUNC_ID_ZW_SET_LEARN_MODE: + { + Log::Write( LogLevel_Detail, "" ); + HandleSetLearnModeRequest( _data ); + break; + } + case FUNC_ID_ZW_REQUEST_NETWORK_UPDATE: + { + Log::Write( LogLevel_Detail, "" ); + HandleNetworkUpdateRequest( _data ); + break; + } + case FUNC_ID_ZW_REMOVE_FAILED_NODE_ID: + { + Log::Write( LogLevel_Detail, "" ); + HandleRemoveFailedNodeRequest( _data ); + break; + } + case FUNC_ID_ZW_REPLACE_FAILED_NODE: + { + Log::Write( LogLevel_Detail, "" ); + HandleReplaceFailedNodeRequest( _data ); + break; + } + case FUNC_ID_ZW_SET_SLAVE_LEARN_MODE: + { + Log::Write( LogLevel_Detail, "" ); + HandleSetSlaveLearnModeRequest( _data ); + break; + } + case FUNC_ID_ZW_SEND_SLAVE_NODE_INFO: + { + Log::Write( LogLevel_Detail, "" ); + HandleSendSlaveNodeInfoRequest( _data ); + break; + } + case FUNC_ID_APPLICATION_SLAVE_COMMAND_HANDLER: + { + Log::Write( LogLevel_Detail, "" ); + HandleApplicationSlaveCommandRequest( _data ); + break; + } + case FUNC_ID_PROMISCUOUS_APPLICATION_COMMAND_HANDLER: + { + Log::Write( LogLevel_Detail, "" ); + HandlePromiscuousApplicationCommandHandlerRequest( _data ); + break; + } + case FUNC_ID_ZW_SET_DEFAULT: + { + Log::Write( LogLevel_Detail, "" ); + HandleSerialAPIResetRequest( _data ); + break; + } + default: + { + Log::Write( LogLevel_Detail, "" ); + Log::Write( LogLevel_Info, "**TODO: handle request for 0x%.2x** Please report this message.", _data[1] ); + break; + } + } + } + + // Generic callback handling + if( handleCallback ) + { + if( ( m_expectedCallbackId || m_expectedReply ) ) + { + if( m_expectedCallbackId ) + { + if( m_expectedCallbackId == _data[2] ) + { + Log::Write( LogLevel_Detail, nodeId, " Expected callbackId was received" ); + m_expectedCallbackId = 0; + } + } + if( m_expectedReply ) + { + if( m_expectedReply == _data[1] ) + { + if( m_expectedCommandClassId && ( m_expectedReply == FUNC_ID_APPLICATION_COMMAND_HANDLER ) ) + { + if( m_expectedCallbackId == 0 && m_expectedCommandClassId == _data[5] && m_expectedNodeId == _data[3] ) + { + Log::Write( LogLevel_Detail, nodeId, " Expected reply and command class was received" ); + m_waitingForAck = false; + m_expectedReply = 0; + m_expectedCommandClassId = 0; + m_expectedNodeId = 0; + } + } + else + { + if( IsExpectedReply( _data[3] ) ) + + { + Log::Write( LogLevel_Detail, nodeId, " Expected reply was received" ); + m_expectedReply = 0; + m_expectedNodeId = 0; + } + } + } + } + + if( !( m_expectedCallbackId || m_expectedReply ) ) + { + Log::Write( LogLevel_Detail, nodeId, " Message transaction complete" ); + Log::Write( LogLevel_Detail, "" ); + + if( m_notifytransactions ) + { + Notification* notification = new Notification( Notification::Type_Notification ); + notification->SetHomeAndNodeIds( m_homeId, nodeId ); + notification->SetNotification( Notification::Code_MsgComplete ); + QueueNotification( notification ); + } + RemoveCurrentMsg(); + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleGetVersionResponse +( + uint8* _data +) +{ + m_libraryVersion = (char*)&_data[2]; + + m_libraryType = _data[m_libraryVersion.size()+3]; + if( m_libraryType < 9 ) + { + m_libraryTypeName = c_libraryTypeNames[m_libraryType]; + } + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_ZW_GET_VERSION:" ); + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), " %s library, version %s", m_libraryTypeName.c_str(), m_libraryVersion.c_str() ); +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- + +void Driver::HandleGetRandomResponse +( + uint8* _data +) +{ + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_ZW_GET_RANDOM: %s", _data[2] ? "true" : "false" ); +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleGetControllerCapabilitiesResponse +( + uint8* _data +) +{ + m_controllerCaps = _data[2]; + + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_ZW_GET_CONTROLLER_CAPABILITIES:" ); + + char str[256]; + if( m_controllerCaps & ControllerCaps_SIS ) + { + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), " There is a SUC ID Server (SIS) in this network." ); + snprintf( str, sizeof(str), " The PC controller is an inclusion %s%s%s", + ( m_controllerCaps & ControllerCaps_SUC ) ? "static update controller (SUC)" : "controller", + ( m_controllerCaps & ControllerCaps_OnOtherNetwork ) ? " which is using a Home ID from another network" : "", + ( m_controllerCaps & ControllerCaps_RealPrimary ) ? " and was the original primary before the SIS was added." : "." ); + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), str ); + + } + else + { + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), " There is no SUC ID Server (SIS) in this network." ); + snprintf( str, sizeof(str), " The PC controller is a %s%s%s", + ( m_controllerCaps & ControllerCaps_Secondary ) ? "secondary" : "primary", + ( m_controllerCaps & ControllerCaps_SUC ) ? " static update controller (SUC)" : " controller", + ( m_controllerCaps & ControllerCaps_OnOtherNetwork ) ? " which is using a Home ID from another network." : "." ); + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), str ); + } +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleGetSerialAPICapabilitiesResponse +( + uint8* _data +) +{ + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), " Received reply to FUNC_ID_SERIAL_API_GET_CAPABILITIES" ); + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), " Serial API Version: %d.%d", _data[2], _data[3] ); + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), " Manufacturer ID: 0x%.2x%.2x", _data[4], _data[5] ); + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), " Product Type: 0x%.2x%.2x", _data[6], _data[7] ); + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), " Product ID: 0x%.2x%.2x", _data[8], _data[9] ); + + // _data[10] to _data[41] are a 256-bit bitmask with one bit set for + // each FUNC_ID_ method supported by the controller. + // Bit 0 is FUNC_ID_ 1. So FUNC_ID_SERIAL_API_GET_CAPABILITIES (0x07) will be bit 6 of the first byte. + m_serialAPIVersion[0] = _data[2]; + m_serialAPIVersion[1] = _data[3]; + m_manufacturerId = ( ( (uint16)_data[4] )<<8) | (uint16)_data[5]; + m_productType = ( ( (uint16)_data[6] )<<8 ) | (uint16)_data[7]; + m_productId = ( ( (uint16)_data[8] )<<8 ) | (uint16)_data[9]; + memcpy( m_apiMask, &_data[10], sizeof( m_apiMask ) ); + + if( IsBridgeController() ) + { + SendMsg( new Msg( "FUNC_ID_ZW_GET_VIRTUAL_NODES", 0xff, REQUEST, FUNC_ID_ZW_GET_VIRTUAL_NODES, false ), MsgQueue_Command); + } + else if( IsAPICallSupported( FUNC_ID_ZW_GET_RANDOM ) ) + + { + Msg *msg = new Msg( "FUNC_ID_ZW_GET_RANDOM", 0xff, REQUEST, FUNC_ID_ZW_GET_RANDOM, false ); + msg->Append( 32 ); // 32 bytes + SendMsg( msg, MsgQueue_Command ); + } + SendMsg( new Msg( "FUNC_ID_SERIAL_API_GET_INIT_DATA", 0xff, REQUEST, FUNC_ID_SERIAL_API_GET_INIT_DATA, false ), MsgQueue_Command); + if( !IsBridgeController() ) + { + Msg* msg = new Msg( "FUNC_ID_SERIAL_API_SET_TIMEOUTS", 0xff, REQUEST, FUNC_ID_SERIAL_API_SET_TIMEOUTS, false ); + msg->Append( ACK_TIMEOUT / 10 ); + msg->Append( BYTE_TIMEOUT / 10 ); + SendMsg( msg, MsgQueue_Command ); + } + Msg* msg = new Msg( "FUNC_ID_SERIAL_API_APPL_NODE_INFORMATION", 0xff, REQUEST, FUNC_ID_SERIAL_API_APPL_NODE_INFORMATION, false, false ); + msg->Append( APPLICATION_NODEINFO_LISTENING ); + msg->Append( 0x02 ); // Generic Static Controller + msg->Append( 0x01 ); // Specific Static PC Controller + msg->Append( 0x00 ); // Length + SendMsg( msg, MsgQueue_Command ); +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleSerialAPISoftResetResponse +( + uint8* _data +) +{ + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to Soft Reset." ); +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleSerialAPIResetRequest +( + uint8* _data +) +{ + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to complete Controller Reset." ); + if( m_controllerResetEvent != NULL ) + { + m_controllerResetEvent->Set(); + m_controllerResetEvent = NULL; + } +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleEnableSUCResponse +( + uint8* _data +) +{ + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to Enable SUC." ); +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +bool Driver::HandleNetworkUpdateResponse +( + uint8* _data +) +{ + bool res = true; + ControllerState state = ControllerState_InProgress; + if( _data[2] ) + { + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_ZW_REQUEST_NETWORK_UPDATE - command in progress" ); + } + else + { + // Failed + Log::Write( LogLevel_Warning, GetNodeNumber( m_currentMsg ), "WARNING: Received reply to FUNC_ID_ZW_REQUEST_NETWORK_UPDATE - command failed" ); + state = ControllerState_Failed; + res = false; + } + + UpdateControllerState( state ); + return res; +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleSetSUCNodeIdResponse +( + uint8* _data +) +{ + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to SET_SUC_NODE_ID." ); +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleGetSUCNodeIdResponse +( + uint8* _data +) +{ + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to GET_SUC_NODE_ID. Node ID = %d", _data[2] ); + m_SUCNodeId = _data[2]; + + if( _data[2] == 0) + { + bool enableSIS = true; + Options::Get()->GetOptionAsBool("EnableSIS", &enableSIS); + if (enableSIS) { + Log::Write( LogLevel_Info, " No SUC, so we become SIS" ); + + Msg* msg; + msg = new Msg( "Enable SUC", m_nodeId, REQUEST, FUNC_ID_ZW_ENABLE_SUC, false ); + msg->Append( 1 ); + msg->Append( SUC_FUNC_NODEID_SERVER ); // SIS; SUC would be ZW_SUC_FUNC_BASIC_SUC + SendMsg( msg, MsgQueue_Send ); + + msg = new Msg( "Set SUC node ID", m_nodeId, REQUEST, FUNC_ID_ZW_SET_SUC_NODE_ID, false ); + msg->Append( m_nodeId ); + msg->Append( 1 ); // TRUE, we want to be SUC/SIS + msg->Append( 0 ); // no low power + msg->Append( SUC_FUNC_NODEID_SERVER ); + SendMsg( msg, MsgQueue_Send ); + } else { + Log::Write( LogLevel_Info, " No SUC, not becoming SUC as option is disabled" ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleMemoryGetIdResponse +( + uint8* _data +) +{ + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_ZW_MEMORY_GET_ID. Home ID = 0x%02x%02x%02x%02x. Our node ID = %d", _data[2], _data[3], _data[4], _data[5], _data[6] ); + m_homeId = ( ( (uint32)_data[2] )<<24 ) | ( ( (uint32)_data[3] )<<16 ) | ( ( (uint32)_data[4] )<<8 ) | ( (uint32)_data[5] ); + m_nodeId = _data[6]; + m_controllerReplication = static_cast(ControllerReplication::Create( m_homeId, m_nodeId )); +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleSerialAPIGetInitDataResponse +( + uint8* _data +) +{ + int32 i; + + if( !m_init ) + { + // Mark the driver as ready (we have to do this first or + // all the code handling notifications will go awry). + Manager::Get()->SetDriverReady( this, true ); + + // Read the config file first, to get the last known state + ReadConfig(); + } + else + { + // Notify the user that all node and value information has been deleted + // We need to wait to do this here so we have new information to report. + Notification* notification = new Notification( Notification::Type_DriverReset ); + notification->SetHomeAndNodeIds( m_homeId, 0 ); + QueueNotification( notification ); + } + + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_SERIAL_API_GET_INIT_DATA:" ); + m_initVersion = _data[2]; + m_initCaps = _data[3]; + + if( _data[4] == NUM_NODE_BITFIELD_BYTES ) + { + for( i=0; iSetQueryStage( Node::QueryStage_Probe1 ); + } + + ReleaseNodes(); + } + else + { + // This node is new + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), " Node %.3d - New", nodeId ); + Notification* notification = new Notification( Notification::Type_NodeNew ); + notification->SetHomeAndNodeIds( m_homeId, nodeId ); + QueueNotification( notification ); + + // Create the node and request its info + InitNode( nodeId ); + } + } + } + else + { + if( GetNode(nodeId) ) + { + // This node no longer exists in the Z-Wave network + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), " Node %.3d - Removed", nodeId ); + delete m_nodes[nodeId]; + m_nodes[nodeId] = NULL; + Notification* notification = new Notification( Notification::Type_NodeRemoved ); + notification->SetHomeAndNodeIds( m_homeId, nodeId ); + QueueNotification( notification ); + + ReleaseNodes(); + } + } + } + } + } + + m_init = true; +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleGetNodeProtocolInfoResponse +( + uint8* _data +) +{ + // The node that the protocol info response is for is not included in the message. + // We have to assume that the node is the same one as in the most recent request. + if( !m_currentMsg ) + { + Log::Write( LogLevel_Warning, "WARNING: Received unexpected FUNC_ID_ZW_GET_NODE_PROTOCOL_INFO message - ignoring."); + return; + } + + uint8 nodeId = m_currentMsg->GetTargetNodeId(); + Log::Write( LogLevel_Info, nodeId, "Received reply to FUNC_ID_ZW_GET_NODE_PROTOCOL_INFO" ); + + // Update the node with the protocol info + if( Node* node = GetNodeUnsafe( nodeId ) ) + { + node->UpdateProtocolInfo( &_data[2] ); + } +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +bool Driver::HandleAssignReturnRouteResponse +( + uint8* _data +) +{ + bool res = true; + ControllerState state = ControllerState_InProgress; + if( _data[2] ) + { + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_ZW_ASSIGN_RETURN_ROUTE - command in progress" ); + } + else + { + // Failed + Log::Write( LogLevel_Warning, GetNodeNumber( m_currentMsg ), "WARNING: Received reply to FUNC_ID_ZW_ASSIGN_RETURN_ROUTE - command failed" ); + state = ControllerState_Failed; + res = false; + } + + UpdateControllerState( state ); + return res; +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +bool Driver::HandleDeleteReturnRouteResponse +( + uint8* _data +) +{ + bool res = true; + ControllerState state = ControllerState_InProgress; + if( _data[2] ) + { + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_ZW_DELETE_RETURN_ROUTE - command in progress" ); + } + else + { + // Failed + Log::Write( LogLevel_Warning, GetNodeNumber( m_currentMsg ), "WARNING: Received reply to FUNC_ID_ZW_DELETE_RETURN_ROUTE - command failed" ); + state = ControllerState_Failed; + res = false; + } + + UpdateControllerState( state ); + return res; +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +bool Driver::HandleRemoveFailedNodeResponse +( + uint8* _data +) +{ + bool res = true; + ControllerState state = ControllerState_InProgress; + ControllerError error = ControllerError_None; + if( _data[2] ) + { + string reason; + switch( _data[2] ) + { + case FAILED_NODE_NOT_FOUND: + { + reason = "Node not found"; + error = ControllerError_NotFound; + break; + } + case FAILED_NODE_REMOVE_PROCESS_BUSY: + { + reason = "Remove process busy"; + error = ControllerError_Busy; + break; + } + case FAILED_NODE_REMOVE_FAIL: + { + reason = "Remove failed"; + error = ControllerError_Failed; + break; + } + case FAILED_NODE_NOT_PRIMARY_CONTROLLER: + { + reason = "Not Primary Controller"; + error = ControllerError_NotPrimary; + break; + } + default: + { + reason = "Command failed"; + break; + } + } + + Log::Write( LogLevel_Warning, GetNodeNumber( m_currentMsg ), "WARNING: Received reply to FUNC_ID_ZW_REMOVE_FAILED_NODE_ID - %s", reason.c_str() ); + state = ControllerState_Failed; + res = false; + } + else + { + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_ZW_REMOVE_FAILED_NODE_ID - Command in progress" ); + } + + UpdateControllerState( state, error ); + return res; +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleIsFailedNodeResponse +( + uint8* _data +) +{ + ControllerState state; + uint8 nodeId = m_currentControllerCommand ? m_currentControllerCommand->m_controllerCommandNode : GetNodeNumber( m_currentMsg ); + if( _data[2] ) + { + Log::Write( LogLevel_Warning, nodeId, "WARNING: Received reply to FUNC_ID_ZW_IS_FAILED_NODE_ID - node %d failed", nodeId ); + state = ControllerState_NodeFailed; + } + else + { + Log::Write( LogLevel_Warning, nodeId, "Received reply to FUNC_ID_ZW_IS_FAILED_NODE_ID - node %d has not failed", nodeId ); + if( Node* node = GetNodeUnsafe( nodeId ) ) + { + node->SetNodeAlive( true ); + } + state = ControllerState_NodeOK; + } + UpdateControllerState( state ); +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +bool Driver::HandleReplaceFailedNodeResponse +( + uint8* _data +) +{ + bool res = true; + ControllerState state = ControllerState_InProgress; + if( _data[2] ) + { + // Command failed + Log::Write( LogLevel_Warning, GetNodeNumber( m_currentMsg ), "WARNING: Received reply to FUNC_ID_ZW_REPLACE_FAILED_NODE - command failed" ); + state = ControllerState_Failed; + res = false; + } + else + { + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_ZW_REPLACE_FAILED_NODE - command in progress" ); + } + + UpdateControllerState( state ); + return res; +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleSendDataResponse +( + uint8* _data, + bool _replication +) +{ + if( _data[2] ) + { + Log::Write( LogLevel_Detail, GetNodeNumber( m_currentMsg ), " %s delivered to Z-Wave stack", _replication ? "ZW_REPLICATION_SEND_DATA" : "ZW_SEND_DATA" ); + } + else + { + Log::Write( LogLevel_Error, GetNodeNumber( m_currentMsg ), "ERROR: %s could not be delivered to Z-Wave stack", _replication ? "ZW_REPLICATION_SEND_DATA" : "ZW_SEND_DATA" ); + m_nondelivery++; + if( Node* node = GetNodeUnsafe( GetNodeNumber( m_currentMsg ) ) ) + { + node->m_sentFailed++; + } + } +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleGetRoutingInfoResponse +( + uint8* _data +) +{ + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_ZW_GET_ROUTING_INFO" ); + + if( Node* node = GetNode( GetNodeNumber( m_currentMsg ) ) ) + { + // copy the 29-byte bitmap received (29*8=232 possible nodes) into this node's neighbors member variable + memcpy( node->m_neighbors, &_data[2], 29 ); + ReleaseNodes(); + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), " Neighbors of this node are:" ); + bool bNeighbors = false; + for( int by=0; by<29; by++ ) + { + for( int bi=0; bi<8; bi++ ) + { + if( (_data[2+by] & (0x01< +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleSendDataRequest +( + uint8* _data, + bool _replication +) +{ + uint8 nodeId = GetNodeNumber( m_currentMsg ); + Log::Write( LogLevel_Detail, nodeId, " %s Request with callback ID 0x%.2x received (expected 0x%.2x)", _replication ? "ZW_REPLICATION_SEND_DATA" : "ZW_SEND_DATA", _data[2], m_expectedCallbackId ); + + if( _data[2] != m_expectedCallbackId ) + { + // Wrong callback ID + m_callbacks++; + Log::Write( LogLevel_Warning, nodeId, "WARNING: Unexpected Callback ID received" ); + } + else + { + Node* node = GetNodeUnsafe( nodeId ); + if( node != NULL ) + { + if( _data[3] != 0 ) + { + node->m_sentFailed++; + } + else + { + node->m_lastRequestRTT = -node->m_sentTS.TimeRemaining(); + + if( node->m_averageRequestRTT ) + { + // if the average has been established, update by averaging the average and the last RTT + node->m_averageRequestRTT = ( node->m_averageRequestRTT + node->m_lastRequestRTT ) >> 1; + } + else + { + // if this is the first observed RTT, set the average to this value + node->m_averageRequestRTT = node->m_lastRequestRTT; + } + Log::Write(LogLevel_Info, nodeId, "Request RTT %d Average Request RTT %d", node->m_lastRequestRTT, node->m_averageRequestRTT ); + } + } + + // We do this here since HandleErrorResponse/MoveMessagesToWakeUpQueue can delete m_currentMsg + if( m_currentMsg->IsNoOperation() ) + { + Notification* notification = new Notification( Notification::Type_Notification ); + notification->SetHomeAndNodeIds( m_homeId, GetNodeNumber( m_currentMsg) ); + notification->SetNotification( Notification::Code_NoOperation ); + QueueNotification( notification ); + } + + // Callback ID matches our expectation + if( _data[3] != 0 ) + { + if( !HandleErrorResponse( _data[3], nodeId, _replication ? "ZW_REPLICATION_END_DATA" : "ZW_SEND_DATA", !_replication ) ) + { + if( m_currentMsg->IsNoOperation() && node != NULL && + ( node->GetCurrentQueryStage() == Node::QueryStage_Probe || + node->GetCurrentQueryStage() == Node::QueryStage_Probe1 ) ) + { + node->QueryStageRetry( node->GetCurrentQueryStage(), 3 ); + } + } + } + else if( node != NULL ) + { + // If WakeUpNoMoreInformation request succeeds, update our status + if( m_currentMsg->IsWakeUpNoMoreInformationCommand() ) + { + if( WakeUp* wakeUp = static_cast( node->GetCommandClass( WakeUp::StaticGetCommandClassId() ) ) ) + { + // Mark the node as asleep + wakeUp->SetAwake( false ); + } + } + // If node is not alive, mark it alive now + if( !node->IsNodeAlive() ) + { + node->SetNodeAlive( true ); + } + } + // Command reception acknowledged by node, error or not + m_expectedCallbackId = 0; + } +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleNetworkUpdateRequest +( + uint8* _data +) +{ + ControllerState state = ControllerState_Failed; + ControllerError error = ControllerError_None; + uint8 nodeId = GetNodeNumber( m_currentMsg ); + switch( _data[3] ) + { + case SUC_UPDATE_DONE: + { + Log::Write( LogLevel_Info, nodeId, "Received reply to FUNC_ID_ZW_REQUEST_NETWORK_UPDATE: Success" ); + state = ControllerState_Completed; + break; + } + case SUC_UPDATE_ABORT: + { + Log::Write( LogLevel_Warning, nodeId, "WARNING: Received reply to FUNC_ID_ZW_REQUEST_NETWORK_UPDATE: Failed - Error. Process aborted." ); + error = ControllerError_Failed; + break; + } + case SUC_UPDATE_WAIT: + { + Log::Write( LogLevel_Warning, nodeId, "WARNING: Received reply to FUNC_ID_ZW_REQUEST_NETWORK_UPDATE: Failed - SUC is busy." ); + error = ControllerError_Busy; + break; + } + case SUC_UPDATE_DISABLED: + { + Log::Write( LogLevel_Warning, nodeId, "WARNING: Received reply to FUNC_ID_ZW_REQUEST_NETWORK_UPDATE: Failed - SUC is disabled." ); + error = ControllerError_Disabled; + break; + } + case SUC_UPDATE_OVERFLOW: + { + Log::Write( LogLevel_Warning, nodeId, "WARNING: Received reply to FUNC_ID_ZW_REQUEST_NETWORK_UPDATE: Failed - Overflow. Full replication required." ); + error = ControllerError_Overflow; + break; + } + default: + { + } + } + + UpdateControllerState( state, error ); +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleAddNodeToNetworkRequest +( + uint8* _data +) +{ + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "FUNC_ID_ZW_ADD_NODE_TO_NETWORK:" ); + CommonAddNodeStatusRequestHandler( FUNC_ID_ZW_ADD_NODE_TO_NETWORK, _data ); +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleRemoveNodeFromNetworkRequest +( + uint8* _data +) +{ + //uint8 nodeId = GetNodeNumber( m_currentMsg ); + if( m_currentControllerCommand == NULL ) + { + return; + } + ControllerState state = m_currentControllerCommand->m_controllerState; + Log::Write( LogLevel_Info, "FUNC_ID_ZW_REMOVE_NODE_FROM_NETWORK:" ); + + switch( _data[3] ) + { + case REMOVE_NODE_STATUS_LEARN_READY: + { + Log::Write( LogLevel_Info, "REMOVE_NODE_STATUS_LEARN_READY" ); + state = ControllerState_Waiting; + m_currentControllerCommand->m_controllerCommandNode = 0; + break; + } + case REMOVE_NODE_STATUS_NODE_FOUND: + { + Log::Write( LogLevel_Info, "REMOVE_NODE_STATUS_NODE_FOUND" ); + state = ControllerState_InProgress; + break; + } + case REMOVE_NODE_STATUS_REMOVING_SLAVE: + { + Log::Write( LogLevel_Info, "REMOVE_NODE_STATUS_REMOVING_SLAVE" ); + if (_data[4] != 0) + { + Log::Write( LogLevel_Info, "Removing node ID %d", _data[4] ); + m_currentControllerCommand->m_controllerCommandNode = _data[4]; + } + else + { + Log::Write( LogLevel_Warning, "Remove Node Failed - NodeID 0 Returned"); + state = ControllerState_Failed; + } + break; + } + case REMOVE_NODE_STATUS_REMOVING_CONTROLLER: + { + Log::Write( LogLevel_Info, "REMOVE_NODE_STATUS_REMOVING_CONTROLLER" ); + m_currentControllerCommand->m_controllerCommandNode = _data[4]; + if( m_currentControllerCommand->m_controllerCommandNode == 0 ) // Some controllers don't return node number + { + if( _data[5] >= 3 ) + { + LockNodes(); + for( int i=0; i<256; i++ ) + { + if( m_nodes[i] == NULL ) + { + continue; + } + // Ignore primary controller + if( m_nodes[i]->m_nodeId == m_nodeId ) + { + continue; + } + // See if we can match another way + if( m_nodes[i]->m_basic == _data[6] && + m_nodes[i]->m_generic == _data[7] && + m_nodes[i]->m_specific == _data[8] ) + { + if( m_currentControllerCommand->m_controllerCommandNode != 0 ) + { + Log::Write( LogLevel_Info, "Alternative controller lookup found more then one match. Using the first one found." ); + } + else + { + m_currentControllerCommand->m_controllerCommandNode = m_nodes[i]->m_nodeId; + } + } + } + ReleaseNodes(); + } + else + { + Log::Write( LogLevel_Warning, "WARNING: Node is 0 but not enough data to perform alternative match." ); + } + } + else + { + m_currentControllerCommand->m_controllerCommandNode = _data[4]; + } + Log::Write( LogLevel_Info, "Removing controller ID %d", m_currentControllerCommand->m_controllerCommandNode ); + break; + } + case REMOVE_NODE_STATUS_DONE: + { + Log::Write( LogLevel_Info, "REMOVE_NODE_STATUS_DONE" ); + if( !m_currentControllerCommand->m_controllerCommandDone ) + { + + // Remove Node Stop calls back through here so make sure + // we do't do it again. + UpdateControllerState( ControllerState_Completed ); + AddNodeStop( FUNC_ID_ZW_REMOVE_NODE_FROM_NETWORK ); + if ( m_currentControllerCommand->m_controllerCommandNode == 0 ) // never received "removing" update + { + if ( _data[4] != 0 ) // but message has the clue + { + m_currentControllerCommand->m_controllerCommandNode = _data[4]; + } + } + + if ( m_currentControllerCommand->m_controllerCommandNode != 0 && m_currentControllerCommand->m_controllerCommandNode != 0xff ) + { + LockNodes(); + delete m_nodes[m_currentControllerCommand->m_controllerCommandNode]; + m_nodes[m_currentControllerCommand->m_controllerCommandNode] = NULL; + ReleaseNodes(); + + Notification* notification = new Notification( Notification::Type_NodeRemoved ); + notification->SetHomeAndNodeIds( m_homeId, m_currentControllerCommand->m_controllerCommandNode ); + QueueNotification( notification ); + } + } + return; + } + case REMOVE_NODE_STATUS_FAILED: + { + AddNodeStop( FUNC_ID_ZW_REMOVE_NODE_FROM_NETWORK ); + Log::Write( LogLevel_Warning, "WARNING: REMOVE_NODE_STATUS_FAILED" ); + state = ControllerState_Failed; + break; + } + default: + { + break; + } + } + + UpdateControllerState( state ); +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleControllerChangeRequest +( + uint8* _data +) +{ + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "FUNC_ID_ZW_CONTROLLER_CHANGE:" ); + CommonAddNodeStatusRequestHandler( FUNC_ID_ZW_CONTROLLER_CHANGE, _data ); +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleCreateNewPrimaryRequest +( + uint8* _data +) +{ + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "FUNC_ID_ZW_CREATE_NEW_PRIMARY:" ); + CommonAddNodeStatusRequestHandler( FUNC_ID_ZW_CREATE_NEW_PRIMARY, _data ); +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleSetLearnModeRequest +( + uint8* _data +) +{ + uint8 nodeId = GetNodeNumber( m_currentMsg ); + if( m_currentControllerCommand == NULL ) + { + return; + } + ControllerState state = m_currentControllerCommand->m_controllerState; + Log::Write( LogLevel_Info, nodeId, "FUNC_ID_ZW_SET_LEARN_MODE:" ); + + switch( _data[3] ) + { + case LEARN_MODE_STARTED: + { + Log::Write( LogLevel_Info, nodeId, "LEARN_MODE_STARTED" ); + state = ControllerState_Waiting; + break; + } + case LEARN_MODE_DONE: + { + Log::Write( LogLevel_Info, nodeId, "LEARN_MODE_DONE" ); + state = ControllerState_Completed; + + // Stop learn mode + Msg* msg = new Msg( "End Learn Mode", 0xff, REQUEST, FUNC_ID_ZW_SET_LEARN_MODE, false, false ); + msg->Append( 0 ); + SendMsg( msg, MsgQueue_Command ); + + // Rebuild all the node info. Group and scene data that we stored + // during replication will be applied as we discover each node. + InitAllNodes(); + break; + } + case LEARN_MODE_FAILED: + { + Log::Write( LogLevel_Warning, nodeId, "WARNING: LEARN_MODE_FAILED" ); + state = ControllerState_Failed; + + // Stop learn mode + Msg* msg = new Msg( "End Learn Mode", 0xff, REQUEST, FUNC_ID_ZW_SET_LEARN_MODE, false, false ); + msg->Append( 0 ); + SendMsg( msg, MsgQueue_Command ); + + // Rebuild all the node info, since it may have been partially + // updated by the failed command. Group and scene data that we + // stored during replication will be applied as we discover each node. + InitAllNodes(); + break; + } + case LEARN_MODE_DELETED: + { + Log::Write( LogLevel_Info, nodeId, "LEARN_MODE_DELETED" ); + state = ControllerState_Failed; + // Stop learn mode + Msg* msg = new Msg( "End Learn Mode", 0xff, REQUEST, FUNC_ID_ZW_SET_LEARN_MODE, false, false ); + msg->Append( 0 ); + SendMsg( msg, MsgQueue_Command ); + break; + } + } + + UpdateControllerState( state ); +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleRemoveFailedNodeRequest +( + uint8* _data +) +{ + ControllerState state = ControllerState_Completed; + uint8 nodeId = GetNodeNumber( m_currentMsg ); + switch( _data[3] ) + { + case FAILED_NODE_OK: + { + Log::Write( LogLevel_Warning, nodeId, "WARNING: Received reply to FUNC_ID_ZW_REMOVE_FAILED_NODE_ID - Node %d is OK, so command failed", m_currentControllerCommand->m_controllerCommandNode ); + state = ControllerState_NodeOK; + break; + } + case FAILED_NODE_REMOVED: + { + Log::Write( LogLevel_Info, nodeId, "Received reply to FUNC_ID_ZW_REMOVE_FAILED_NODE_ID - node %d successfully moved to failed nodes list", m_currentControllerCommand->m_controllerCommandNode ); + state = ControllerState_Completed; + + LockNodes(); + delete m_nodes[m_currentControllerCommand->m_controllerCommandNode]; + m_nodes[m_currentControllerCommand->m_controllerCommandNode] = NULL; + ReleaseNodes(); + + Notification* notification = new Notification( Notification::Type_NodeRemoved ); + notification->SetHomeAndNodeIds( m_homeId, m_currentControllerCommand->m_controllerCommandNode ); + QueueNotification( notification ); + + break; + } + case FAILED_NODE_NOT_REMOVED: + { + Log::Write( LogLevel_Warning, nodeId, "WARNING: Received reply to FUNC_ID_ZW_REMOVE_FAILED_NODE_ID - unable to move node %d to failed nodes list", m_currentControllerCommand->m_controllerCommandNode ); + state = ControllerState_Failed; + break; + } + } + + UpdateControllerState( state ); +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleReplaceFailedNodeRequest +( + uint8* _data +) +{ + ControllerState state = ControllerState_Completed; + uint8 nodeId = GetNodeNumber( m_currentMsg ); + switch( _data[3] ) + { + case FAILED_NODE_OK: + { + Log::Write( LogLevel_Info, nodeId, "Received reply to FUNC_ID_ZW_REPLACE_FAILED_NODE - Node is OK, so command failed" ); + state = ControllerState_NodeOK; + break; + } + case FAILED_NODE_REPLACE_WAITING: + { + Log::Write( LogLevel_Info, nodeId, "Received reply to FUNC_ID_ZW_REPLACE_FAILED_NODE - Waiting for new node" ); + state = ControllerState_Waiting; + break; + } + case FAILED_NODE_REPLACE_DONE: + { + Log::Write( LogLevel_Info, nodeId, "Received reply to FUNC_ID_ZW_REPLACE_FAILED_NODE - Node successfully replaced" ); + state = ControllerState_Completed; + + // Request new node info for this device + if( m_currentControllerCommand != NULL ) + { + InitNode( m_currentControllerCommand->m_controllerCommandNode, true ); + } + break; + } + case FAILED_NODE_REPLACE_FAILED: + { + Log::Write( LogLevel_Info, nodeId, "Received reply to FUNC_ID_ZW_REPLACE_FAILED_NODE - Node replacement failed" ); + state = ControllerState_Failed; + break; + } + } + + UpdateControllerState( state ); +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleApplicationCommandHandlerRequest +( + uint8* _data +) +{ + uint8 status = _data[2]; + uint8 nodeId = _data[3]; + uint8 classId = _data[5]; + Node* node = GetNodeUnsafe( nodeId ); + + if( ( status & RECEIVE_STATUS_ROUTED_BUSY ) != 0 ) + { + m_routedbusy++; + } + if( ( status & RECEIVE_STATUS_TYPE_BROAD ) != 0 ) + { + m_broadcastReadCnt++; + } + if( node != NULL ) + { + node->m_receivedCnt++; + node->m_errors = 0; + int cmp = memcmp( _data, node->m_lastReceivedMessage, sizeof(node->m_lastReceivedMessage)); + if( cmp == 0 && node->m_receivedTS.TimeRemaining() > -500 ) + { + // if the exact same sequence of bytes are received within 500ms + node->m_receivedDups++; + } + else + { + memcpy( node->m_lastReceivedMessage, _data, sizeof(node->m_lastReceivedMessage) ); + } + node->m_receivedTS.SetTime(); + if( m_expectedReply == FUNC_ID_APPLICATION_COMMAND_HANDLER && m_expectedNodeId == nodeId ) + { + // Need to confirm this is the correct response to the last sent request. + // At least ignore any received messages prior to the send data request. + node->m_lastResponseRTT = -node->m_sentTS.TimeRemaining(); + + if( node->m_averageResponseRTT ) + { + // if the average has been established, update by averaging the average and the last RTT + node->m_averageResponseRTT = ( node->m_averageResponseRTT + node->m_lastResponseRTT ) >> 1; + } + else + { + // if this is the first observed RTT, set the average to this value + node->m_averageResponseRTT = node->m_lastResponseRTT; + } + Log::Write(LogLevel_Info, nodeId, "Response RTT %d Average Response RTT %d", node->m_lastResponseRTT, node->m_averageResponseRTT ); + } + else + { + node->m_receivedUnsolicited++; + } + if ( !node->IsNodeAlive() ) + { + node->SetNodeAlive( true ); + } + } + if( ApplicationStatus::StaticGetCommandClassId() == classId ) + { + //TODO: Test this class function or implement + } + else if( ControllerReplication::StaticGetCommandClassId() == classId ) + { + if( m_controllerReplication && m_currentControllerCommand && ( ControllerCommand_ReceiveConfiguration == m_currentControllerCommand->m_controllerCommand ) ) + { + m_controllerReplication->HandleMsg( &_data[6], _data[4] ); + + UpdateControllerState( ControllerState_InProgress ); + } + } + else + { + // Allow the node to handle the message itself + if( node != NULL ) + { + node->ApplicationCommandHandler( _data ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface when in promiscuous mode. +//----------------------------------------------------------------------------- +void Driver::HandlePromiscuousApplicationCommandHandlerRequest +( + uint8* _data +) +{ + //uint8 nodeId = _data[3]; + //uint8 len = _data[4]; + //uint8 classId = _data[5]; + //uint8 destNodeId = _data[5+len]; +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleAssignReturnRouteRequest +( + uint8* _data +) +{ + ControllerState state; + uint8 nodeId = GetNodeNumber( m_currentMsg ); + if( m_currentControllerCommand == NULL ) + { + return; + } + if( _data[3] ) + { + // Failed + HandleErrorResponse( _data[3], m_currentControllerCommand->m_controllerCommandNode, "ZW_ASSIGN_RETURN_ROUTE", true ); + state = ControllerState_Failed; + } + else + { + // Success + Log::Write( LogLevel_Info, nodeId, "Received reply to FUNC_ID_ZW_ASSIGN_RETURN_ROUTE for node %d - SUCCESS", m_currentControllerCommand->m_controllerCommandNode ); + state = ControllerState_Completed; + } + + UpdateControllerState( state ); +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleDeleteReturnRouteRequest +( + uint8* _data +) +{ + ControllerState state; + uint8 nodeId = GetNodeNumber( m_currentMsg ); + if( m_currentControllerCommand == NULL ) + { + return; + } + if( _data[3] ) + { + // Failed + HandleErrorResponse( _data[3], m_currentControllerCommand->m_controllerCommandNode, "ZW_DELETE_RETURN_ROUTE", true ); + state = ControllerState_Failed; + } + else + { + // Success + Log::Write( LogLevel_Info, nodeId, "Received reply to FUNC_ID_ZW_DELETE_RETURN_ROUTE for node %d - SUCCESS", m_currentControllerCommand->m_controllerCommandNode ); + state = ControllerState_Completed; + } + + UpdateControllerState( state ); +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleSendNodeInformationRequest +( + uint8* _data +) +{ + ControllerState state; + uint8 nodeId = GetNodeNumber( m_currentMsg ); + if( m_currentControllerCommand == NULL ) + { + return; + } + if( _data[3] ) + { + // Failed + HandleErrorResponse( _data[3], m_currentControllerCommand->m_controllerCommandNode, "ZW_SEND_NODE_INFORMATION" ); + state = ControllerState_Failed; + } + else + { + // Success + Log::Write( LogLevel_Info, nodeId, "Received reply to FUNC_ID_ZW_SEND_NODE_INFORMATION - SUCCESS" ); + state = ControllerState_Completed; + } + + UpdateControllerState( state ); +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleNodeNeighborUpdateRequest +( + uint8* _data +) +{ + uint8 nodeId = GetNodeNumber( m_currentMsg ); + ControllerState state = ControllerState_Normal; + switch( _data[3] ) + { + case REQUEST_NEIGHBOR_UPDATE_STARTED: + { + Log::Write( LogLevel_Info, nodeId, "REQUEST_NEIGHBOR_UPDATE_STARTED" ); + state = ControllerState_InProgress; + break; + } + case REQUEST_NEIGHBOR_UPDATE_DONE: + { + Log::Write( LogLevel_Info, nodeId, "REQUEST_NEIGHBOR_UPDATE_DONE" ); + state = ControllerState_Completed; + + // We now request the neighbour information from the + // controller and store it in our node object. + if( m_currentControllerCommand != NULL ) + { + RequestNodeNeighbors( m_currentControllerCommand->m_controllerCommandNode, 0 ); + } + break; + } + case REQUEST_NEIGHBOR_UPDATE_FAILED: + { + Log::Write( LogLevel_Warning, nodeId, "WARNING: REQUEST_NEIGHBOR_UPDATE_FAILED" ); + state = ControllerState_Failed; + break; + } + default: + { + break; + } + } + + UpdateControllerState( state ); +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +bool Driver::HandleApplicationUpdateRequest +( + uint8* _data +) +{ + bool messageRemoved = false; + uint8 nodeId = _data[3]; + Node* node = GetNodeUnsafe( nodeId ); + + // If node is not alive, mark it alive now + if( node != NULL && !node->IsNodeAlive() ) + { + node->SetNodeAlive( true ); + } + + switch( _data[2] ) + { + case UPDATE_STATE_SUC_ID: + { + Log::Write( LogLevel_Info, nodeId, "UPDATE_STATE_SUC_ID from node %d", nodeId ); + m_SUCNodeId = nodeId; // need to confirm real data here + break; + } + case UPDATE_STATE_DELETE_DONE: + { + Log::Write( LogLevel_Info, nodeId, "** Network change **: Z-Wave node %d was removed", nodeId ); + + LockNodes(); + delete m_nodes[nodeId]; + m_nodes[nodeId] = NULL; + ReleaseNodes(); + + Notification* notification = new Notification( Notification::Type_NodeRemoved ); + notification->SetHomeAndNodeIds( m_homeId, nodeId ); + QueueNotification( notification ); + break; + } + case UPDATE_STATE_NEW_ID_ASSIGNED: + { + Log::Write( LogLevel_Info, nodeId, "** Network change **: ID %d was assigned to a new Z-Wave node", nodeId ); + + // Request the node protocol info (also removes any existing node and creates a new one) + InitNode( nodeId ); + break; + } + case UPDATE_STATE_ROUTING_PENDING: + { + Log::Write( LogLevel_Info, nodeId, "UPDATE_STATE_ROUTING_PENDING from node %d", nodeId ); + break; + } + case UPDATE_STATE_NODE_INFO_REQ_FAILED: + { + Log::Write( LogLevel_Warning, nodeId, "WARNING: FUNC_ID_ZW_APPLICATION_UPDATE: UPDATE_STATE_NODE_INFO_REQ_FAILED received" ); + + // Note: Unhelpfully, the nodeId is always zero in this message. We have to + // assume the message came from the last node to which we sent a request. + if( m_currentMsg ) + { + Node* tnode = GetNodeUnsafe( m_currentMsg->GetTargetNodeId() ); + if( tnode ) + { + // Retry the query twice + tnode->QueryStageRetry( Node::QueryStage_NodeInfo, 2 ); + + // Just in case the failure was due to the node being asleep, we try + // to move its pending messages to its wakeup queue. If it is not + // a sleeping device, this will have no effect. + if( MoveMessagesToWakeUpQueue( tnode->GetNodeId(), true ) ) + { + messageRemoved = true; + } + } + } + break; + } + case UPDATE_STATE_NODE_INFO_REQ_DONE: + { + Log::Write( LogLevel_Info, nodeId, "UPDATE_STATE_NODE_INFO_REQ_DONE from node %d", nodeId ); + break; + } + case UPDATE_STATE_NODE_INFO_RECEIVED: + { + Log::Write( LogLevel_Info, nodeId, "UPDATE_STATE_NODE_INFO_RECEIVED from node %d", nodeId ); + if( node ) + { + node->UpdateNodeInfo( &_data[8], _data[4] - 3 ); + } + break; + } + } + + if( messageRemoved ) + { + m_waitingForAck = false; + m_expectedCallbackId = 0; + m_expectedReply = 0; + m_expectedCommandClassId = 0; + m_expectedNodeId = 0; + } + + return messageRemoved; +} + +//----------------------------------------------------------------------------- +// +// Handle common AddNode processing for many similar commands +//----------------------------------------------------------------------------- +void Driver::CommonAddNodeStatusRequestHandler +( + uint8 _funcId, + uint8* _data +) +{ + uint8 nodeId = GetNodeNumber( m_currentMsg ); + ControllerState state = ControllerState_Normal; + if( m_currentControllerCommand != NULL ) + { + state = m_currentControllerCommand->m_controllerState; + } + switch( _data[3] ) + { + case ADD_NODE_STATUS_LEARN_READY: + { + Log::Write( LogLevel_Info, nodeId, "ADD_NODE_STATUS_LEARN_READY" ); + m_currentControllerCommand->m_controllerAdded = false; + state = ControllerState_Waiting; + break; + } + case ADD_NODE_STATUS_NODE_FOUND: + { + Log::Write( LogLevel_Info, nodeId, "ADD_NODE_STATUS_NODE_FOUND" ); + state = ControllerState_InProgress; + break; + } + case ADD_NODE_STATUS_ADDING_SLAVE: + { + Log::Write( LogLevel_Info, nodeId, "ADD_NODE_STATUS_ADDING_SLAVE" ); + Log::Write( LogLevel_Info, nodeId, "Adding node ID %d", _data[4] ); + /* Discovered all the CC's are sent in this packet as well: + * position description + * 4 - Node ID + * 5 - Length + * 6 - Basic Device Class + * 7 - Generic Device Class + * 8 - Specific Device Class + * 9 to Length - Command Classes + * Last pck - CRC + */ + if( m_currentControllerCommand != NULL ) + { + m_currentControllerCommand->m_controllerAdded = false; + m_currentControllerCommand->m_controllerCommandNode = _data[4]; + } + AddNodeStop( _funcId ); + sleep(1); + break; + } + case ADD_NODE_STATUS_ADDING_CONTROLLER: + { + Log::Write( LogLevel_Info, nodeId, "ADD_NODE_STATUS_ADDING_CONTROLLER"); + Log::Write( LogLevel_Info, nodeId, "Adding controller ID %d", _data[4] ); + /* Discovered all the CC's are sent in this packet as well: + * position description + * 4 - Node ID + * 5 - Length + * 6 - Basic Device Class + * 7 - Generic Device Class + * 8 - Specific Device Class + * 9 to Length - Command Classes + * Last pck - CRC + */ + + + if( m_currentControllerCommand != NULL ) + { + m_currentControllerCommand->m_controllerAdded = true; + m_currentControllerCommand->m_controllerCommandNode = _data[4]; + } + AddNodeStop( _funcId ); + break; + } + case ADD_NODE_STATUS_PROTOCOL_DONE: + { + Log::Write( LogLevel_Info, nodeId, "ADD_NODE_STATUS_PROTOCOL_DONE" ); + // We added a device. + // Get the controller out of add mode to avoid accidentally adding other devices. + // We used to call replication here. + AddNodeStop( _funcId ); + break; + } + case ADD_NODE_STATUS_DONE: + { + Log::Write( LogLevel_Info, nodeId, "ADD_NODE_STATUS_DONE" ); + state = ControllerState_Completed; + if( m_currentControllerCommand != NULL && m_currentControllerCommand->m_controllerCommandNode != 0xff ) + { + InitNode( m_currentControllerCommand->m_controllerCommandNode, true ); + } + + // Not sure about the new controller function here. + if( _funcId != FUNC_ID_ZW_ADD_NODE_TO_NETWORK && m_currentControllerCommand != NULL && m_currentControllerCommand->m_controllerAdded ) + { + // Rebuild all the node info. Group and scene data that we stored + // during replication will be applied as we discover each node. + InitAllNodes(); + } + break; + } + case ADD_NODE_STATUS_FAILED: + { + Log::Write( LogLevel_Info, nodeId, "ADD_NODE_STATUS_FAILED" ); + state = ControllerState_Failed; + + // Remove the AddNode command from the queue + RemoveCurrentMsg(); + + // Get the controller out of add mode to avoid accidentally adding other devices. + AddNodeStop( _funcId ); + break; + } + default: + { + break; + } + } + + UpdateControllerState( state ); +} + +//----------------------------------------------------------------------------- +// Polling Z-Wave devices +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Enable polling of a value +//----------------------------------------------------------------------------- +bool Driver::EnablePoll +( + ValueID const &_valueId, + uint8 const _intensity +) +{ + // make sure the polling thread doesn't lock the node while we're in this function + m_pollMutex->Lock(); + + // confirm that this node exists + uint8 nodeId = _valueId.GetNodeId(); + Node* node = GetNode( nodeId ); + if( node != NULL ) + { + // confirm that this value is in the node's value store + if( Value* value = node->GetValue( _valueId ) ) + { + // update the value's pollIntensity + value->SetPollIntensity( _intensity ); + + // Add the valueid to the polling list + // See if the node is already in the poll list. + for( list::iterator it = m_pollList.begin(); it != m_pollList.end(); ++it ) + { + if( (*it).m_id == _valueId ) + { + // It is already in the poll list, so we have nothing to do. + Log::Write( LogLevel_Detail, "EnablePoll not required to do anything (value is already in the poll list)" ); + value->Release(); + m_pollMutex->Unlock(); + ReleaseNodes(); + return true; + } + } + + // Not in the list, so we add it + PollEntry pe; + pe.m_id = _valueId; + pe.m_pollCounter = value->GetPollIntensity(); + m_pollList.push_back( pe ); + value->Release(); + m_pollMutex->Unlock(); + ReleaseNodes(); + + // send notification to indicate polling is enabled + Notification* notification = new Notification( Notification::Type_PollingEnabled ); + notification->SetHomeAndNodeIds( m_homeId, _valueId.GetNodeId() ); + QueueNotification( notification ); + Log::Write( LogLevel_Info, nodeId, "EnablePoll for HomeID 0x%.8x, value(cc=0x%02x,in=0x%02x,id=0x%02x)--poll list has %d items", + _valueId.GetHomeId(), _valueId.GetCommandClassId(), _valueId.GetIndex(), _valueId.GetInstance(), m_pollList.size() ); + return true; + } + + // allow the poll thread to continue + m_pollMutex->Unlock(); + ReleaseNodes(); + + Log::Write( LogLevel_Info, nodeId, "EnablePoll failed - value not found for node %d", nodeId ); + return false; + } + + // allow the poll thread to continue + m_pollMutex->Unlock(); + + Log::Write( LogLevel_Info, "EnablePoll failed - node %d not found", nodeId ); + return false; +} + +//----------------------------------------------------------------------------- +// +// Disable polling of a node +//----------------------------------------------------------------------------- +bool Driver::DisablePoll +( + ValueID const &_valueId +) +{ + // make sure the polling thread doesn't lock the node while we're in this function + m_pollMutex->Lock(); + + // confirm that this node exists + uint8 nodeId = _valueId.GetNodeId(); + Node* node = GetNode( nodeId ); + if( node != NULL) + { + // See if the value is already in the poll list. + for( list::iterator it = m_pollList.begin(); it != m_pollList.end(); ++it ) + { + if( (*it).m_id == _valueId ) + { + // Found it + // remove it from the poll list + m_pollList.erase( it ); + + // get the value object and reset pollIntensity to zero (indicating no polling) + Value* value = GetValue( _valueId ); + if (!value) + continue; + value->SetPollIntensity( 0 ); + value->Release(); + m_pollMutex->Unlock(); + ReleaseNodes(); + + // send notification to indicate polling is disabled + Notification* notification = new Notification( Notification::Type_PollingDisabled ); + notification->SetHomeAndNodeIds( m_homeId, _valueId.GetNodeId() ); + QueueNotification( notification ); + Log::Write( LogLevel_Info, nodeId, "DisablePoll for HomeID 0x%.8x, value(cc=0x%02x,in=0x%02x,id=0x%02x)--poll list has %d items", + _valueId.GetHomeId(), _valueId.GetCommandClassId(), _valueId.GetIndex(), _valueId.GetInstance(), m_pollList.size() ); + return true; + } + } + + // Not in the list + m_pollMutex->Unlock(); + ReleaseNodes(); + Log::Write( LogLevel_Info, nodeId, "DisablePoll failed - value not on list"); + return false; + } + + // allow the poll thread to continue + m_pollMutex->Unlock(); + + Log::Write( LogLevel_Info, "DisablePoll failed - node %d not found", nodeId ); + return false; +} + +//----------------------------------------------------------------------------- +// +// Check polling status of a value +//----------------------------------------------------------------------------- +bool Driver::isPolled +( + ValueID const &_valueId +) +{ + bool bPolled; + + // make sure the polling thread doesn't lock the node while we're in this function + m_pollMutex->Lock(); + + Value* value = GetValue( _valueId ); + if( value && value->GetPollIntensity() != 0 ) + { + bPolled = true; + } + else + { + bPolled = false; + } + + if (value) value->Release(); + + /* + * This code is retained for the moment as a belt-and-suspenders test to confirm that + * the pollIntensity member of each value and the pollList contents do not get out + * of sync. + */ + // confirm that this node exists + uint8 nodeId = _valueId.GetNodeId(); + Node* node = GetNode( nodeId ); + if( node != NULL) + { + + // See if the value is already in the poll list. + for( list::iterator it = m_pollList.begin(); it != m_pollList.end(); ++it ) + { + if( (*it).m_id == _valueId ) + { + // Found it + if( bPolled ) + { + m_pollMutex->Unlock(); + ReleaseNodes(); + return true; + } + else + { + Log::Write( LogLevel_Error, nodeId, "IsPolled setting for valueId 0x%016x is not consistent with the poll list", _valueId.GetId() ); + } + } + } + + // Not in the list + + if( !bPolled ) + { + m_pollMutex->Unlock(); + ReleaseNodes(); + return false; + } + else + { + Log::Write( LogLevel_Error, nodeId, "IsPolled setting for valueId 0x%016x is not consistent with the poll list", _valueId.GetId() ); + } + } + + // allow the poll thread to continue + m_pollMutex->Unlock(); + + Log::Write( LogLevel_Info, "isPolled failed - node %d not found (the value reported that it is%s polled)", nodeId, bPolled?"":" not" ); + return false; +} + +//----------------------------------------------------------------------------- +// +// Set the intensity with which this value is polled +//----------------------------------------------------------------------------- +void Driver::SetPollIntensity +( + ValueID const &_valueId, + uint8 const _intensity +) +{ + // make sure the polling thread doesn't lock the value while we're in this function + m_pollMutex->Lock(); + + Value* value = GetValue( _valueId ); + if (!value) + return; + value->SetPollIntensity( _intensity ); + + value->Release(); + m_pollMutex->Unlock(); +} + +//----------------------------------------------------------------------------- +// +// Entry point of the thread for poll Z-Wave devices +//----------------------------------------------------------------------------- +void Driver::PollThreadEntryPoint +( + Event* _exitEvent, + void* _context +) +{ + Driver* driver = (Driver*)_context; + if( driver ) + { + driver->PollThreadProc( _exitEvent ); + } +} + +//----------------------------------------------------------------------------- +// +// Thread for poll Z-Wave devices +//----------------------------------------------------------------------------- +void Driver::PollThreadProc +( + Event* _exitEvent +) +{ + while( 1 ) + { + int32 pollInterval = m_pollInterval; + + if( m_awakeNodesQueried && !m_pollList.empty() ) + { + // We only bother getting the lock if the pollList is not empty + m_pollMutex->Lock(); + + // Get the next value to be polled + PollEntry pe = m_pollList.front(); + m_pollList.pop_front(); + ValueID valueId = pe.m_id; + + // only execute this poll if pe.m_pollCounter == 1; otherwise decrement the counter and process the next polled value + if( pe.m_pollCounter != 1) + { + pe.m_pollCounter--; + m_pollList.push_back( pe ); + m_pollMutex->Unlock(); + continue; + } + + // reset the poll counter to the full pollIntensity value and push it at the end of the list + // release the value object referenced; call GetNode to ensure the node objects are locked during this period + (void)GetNode( valueId.GetNodeId() ); + Value* value = GetValue( valueId ); + if (!value) + continue; + pe.m_pollCounter = value->GetPollIntensity(); + m_pollList.push_back( pe ); + value->Release(); + ReleaseNodes(); + + // If the polling interval is for the whole poll list, calculate the time before the next poll, + // so that all polls can take place within the user-specified interval. + if( !m_bIntervalBetweenPolls ) + { + if( pollInterval < 100 ) + { + Log::Write( LogLevel_Info, "The pollInterval setting is only %d, which appears to be a legacy setting. Multiplying by 1000 to convert to ms.", pollInterval ); + pollInterval *= 1000; + } + pollInterval /= (int32) m_pollList.size(); + } + + // Request the state of the value from the node to which it belongs + if( Node* node = GetNode( valueId.GetNodeId() ) ) + { + bool requestState = true; + if( !node->IsListeningDevice() ) + { + // The device is not awake all the time. If it is not awake, we mark it + // as requiring a poll. The poll will be done next time the node wakes up. + if( WakeUp* wakeUp = static_cast( node->GetCommandClass( WakeUp::StaticGetCommandClassId() ) ) ) + { + if( !wakeUp->IsAwake() ) + { + wakeUp->SetPollRequired(); + requestState = false; + } + } + } + + if( requestState ) + { + // Request an update of the value + CommandClass* cc = node->GetCommandClass( valueId.GetCommandClassId() ); + if (cc) { + uint8 index = valueId.GetIndex(); + uint8 instance = valueId.GetInstance(); + Log::Write( LogLevel_Detail, node->m_nodeId, "Polling: %s index = %d instance = %d (poll queue has %d messages)", cc->GetCommandClassName().c_str(), index, instance, m_msgQueue[MsgQueue_Poll].size() ); + cc->RequestValue( 0, index, instance, MsgQueue_Poll ); + } + } + + ReleaseNodes(); + } + + m_pollMutex->Unlock(); + + // Polling messages are only sent when there are no other messages waiting to be sent + // While this makes the polls much more variable and uncertain if some other activity dominates + // a send queue, that may be appropriate + // TODO we can have a debate about whether to test all four queues or just the Poll queue + // Wait until the library isn't actively sending messages (or in the midst of a transaction) + int i32; + int loopCount = 0; + while( !m_msgQueue[MsgQueue_Poll].empty() + || !m_msgQueue[MsgQueue_Send].empty() + || !m_msgQueue[MsgQueue_Command].empty() + || !m_msgQueue[MsgQueue_Query].empty() + || m_currentMsg != NULL ) + { + i32 = Wait::Single( _exitEvent, 10); // test conditions every 10ms + if( i32 == 0 ) + { + // Exit has been called + return; + } + loopCount++; + if( loopCount == 3000*10 ) // 300 seconds worth of delay? Something unusual is going on + { + Log::Write( LogLevel_Warning, "Poll queue hasn't been able to execute for 300 secs or more" ); + Log::QueueDump(); +// assert( 0 ); + } + } + + // ready for next poll...insert the pollInterval delay + i32 = Wait::Single( _exitEvent, pollInterval ); + if( i32 == 0 ) + { + // Exit has been called + return; + } + } + else // poll list is empty or awake nodes haven't been fully queried yet + { + // don't poll just yet, wait for the pollInterval or exit before re-checking to see if the pollList has elements + int32 i32 = Wait::Single( _exitEvent, 500 ); + if( i32 == 0 ) + { + // Exit has been called + return; + } + } + } +} + +//----------------------------------------------------------------------------- +// Retrieving Node information +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Delete all nodes and fetch new node data from the Z-Wave network +//----------------------------------------------------------------------------- +void Driver::InitAllNodes +( +) +{ + // Delete all the node data + LockNodes(); + for( int i=0; i<256; ++i ) + { + if( m_nodes[i] ) + { + delete m_nodes[i]; + m_nodes[i] = NULL; + } + } + ReleaseNodes(); + + // Fetch new node data from the Z-Wave network + m_controller->PlayInitSequence( this ); +} + +//----------------------------------------------------------------------------- +// +// Queue a node to be interrogated for its setup details +//----------------------------------------------------------------------------- +void Driver::InitNode +( + uint8 const _nodeId, + bool newNode +) +{ + // Delete any existing node and replace it with a new one + LockNodes(); + if( m_nodes[_nodeId] ) + { + // Remove the original node + delete m_nodes[_nodeId]; + Notification* notification = new Notification( Notification::Type_NodeRemoved ); + notification->SetHomeAndNodeIds( m_homeId, _nodeId ); + QueueNotification( notification ); + } + + // Add the new node + m_nodes[_nodeId] = new Node( m_homeId, _nodeId ); + if (newNode == true) static_cast(m_nodes[_nodeId])->SetAddingNode(); + ReleaseNodes(); + + Notification* notification = new Notification( Notification::Type_NodeAdded ); + notification->SetHomeAndNodeIds( m_homeId, _nodeId ); + QueueNotification( notification ); + + // Request the node info + m_nodes[_nodeId]->SetQueryStage( Node::QueryStage_ProtocolInfo ); + Log::Write(LogLevel_Info, "Initilizing Node. New Node: %s (%s)", static_cast(m_nodes[_nodeId])->IsAddingNode() ? "true" : "false", newNode ? "true" : "false"); +} + +//----------------------------------------------------------------------------- +// +// Get whether the node is a listening device that does not go to sleep +//----------------------------------------------------------------------------- +bool Driver::IsNodeListeningDevice +( + uint8 const _nodeId +) +{ + bool res = false; + if( Node* node = GetNode( _nodeId ) ) + { + res = node->IsListeningDevice(); + ReleaseNodes(); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Get whether the node is a listening device that does not go to sleep +//----------------------------------------------------------------------------- +bool Driver::IsNodeFrequentListeningDevice +( + uint8 const _nodeId +) +{ + bool res = false; + if( Node* node = GetNode( _nodeId ) ) + { + res = node->IsFrequentListeningDevice(); + ReleaseNodes(); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Get whether the node is a beam capable device. +//----------------------------------------------------------------------------- +bool Driver::IsNodeBeamingDevice +( + uint8 const _nodeId +) +{ + bool res = false; + if( Node* node = GetNode( _nodeId ) ) + { + res = node->IsBeamingDevice(); + ReleaseNodes(); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Get whether the node is a routing device that passes messages to other nodes +//----------------------------------------------------------------------------- +bool Driver::IsNodeRoutingDevice +( + uint8 const _nodeId +) +{ + bool res = false; + if( Node* node = GetNode( _nodeId ) ) + { + res = node->IsRoutingDevice(); + ReleaseNodes(); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Get the security attribute for a node +//----------------------------------------------------------------------------- +bool Driver::IsNodeSecurityDevice +( + uint8 const _nodeId +) +{ + bool security = false; + if( Node* node = GetNode( _nodeId ) ) + { + security = node->IsSecurityDevice(); + ReleaseNodes(); + } + + return security; +} + +//----------------------------------------------------------------------------- +// +// Get the maximum baud rate of a node's communications +//----------------------------------------------------------------------------- +uint32 Driver::GetNodeMaxBaudRate +( + uint8 const _nodeId +) +{ + uint32 baud = 0; + if( Node* node = GetNode( _nodeId ) ) + { + baud = node->GetMaxBaudRate(); + ReleaseNodes(); + } + + return baud; +} + +//----------------------------------------------------------------------------- +// +// Get the version number of a node +//----------------------------------------------------------------------------- +uint8 Driver::GetNodeVersion +( + uint8 const _nodeId +) +{ + uint8 version = 0; + if( Node* node = GetNode( _nodeId ) ) + { + version = node->GetVersion(); + ReleaseNodes(); + } + + return version; +} + +//----------------------------------------------------------------------------- +// +// Get the security byte of a node +//----------------------------------------------------------------------------- +uint8 Driver::GetNodeSecurity +( + uint8 const _nodeId +) +{ + uint8 security = 0; + if( Node* node = GetNode( _nodeId ) ) + { + security = node->GetSecurity(); + ReleaseNodes(); + } + + return security; +} + +//----------------------------------------------------------------------------- +// +// Get the basic type of a node +//----------------------------------------------------------------------------- +uint8 Driver::GetNodeBasic +( + uint8 const _nodeId +) +{ + uint8 basic = 0; + if( Node* node = GetNode( _nodeId ) ) + { + basic = node->GetBasic(); + ReleaseNodes(); + } + + return basic; +} + +//----------------------------------------------------------------------------- +// +// Get the generic type of a node +//----------------------------------------------------------------------------- +uint8 Driver::GetNodeGeneric +( + uint8 const _nodeId +) +{ + uint8 genericType = 0; + if( Node* node = GetNode( _nodeId ) ) + { + genericType = node->GetGeneric(); + ReleaseNodes(); + } + + return genericType; +} + +//----------------------------------------------------------------------------- +// +// Get the specific type of a node +//----------------------------------------------------------------------------- +uint8 Driver::GetNodeSpecific +( + uint8 const _nodeId +) +{ + uint8 specific = 0; + if( Node* node = GetNode( _nodeId ) ) + { + specific = node->GetSpecific(); + ReleaseNodes(); + } + + return specific; +} + +//----------------------------------------------------------------------------- +// +// Get the basic/generic/specific type of the specified node +// Returns a copy of the string rather than a const ref for thread safety +//----------------------------------------------------------------------------- +string Driver::GetNodeType +( + uint8 const _nodeId +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + string str = node->GetType(); + ReleaseNodes(); + return str; + } + + return "Unknown"; +} + +//----------------------------------------------------------------------------- +// +// Gets the neighbors for a node +//----------------------------------------------------------------------------- +uint32 Driver::GetNodeNeighbors +( + uint8 const _nodeId, + uint8** o_neighbors +) +{ + uint32 numNeighbors = 0; + if( Node* node = GetNode( _nodeId ) ) + { + numNeighbors = node->GetNeighbors( o_neighbors ); + ReleaseNodes(); + } + + return numNeighbors; +} + +//----------------------------------------------------------------------------- +// +// Get the manufacturer name for the node with the specified ID +// Returns a copy of the string rather than a const ref for thread safety +//----------------------------------------------------------------------------- +string Driver::GetNodeManufacturerName +( + uint8 const _nodeId +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + string str = node->GetManufacturerName(); + ReleaseNodes(); + return str; + } + + return ""; +} + +//----------------------------------------------------------------------------- +// +// Get the product name for the node with the specified ID +// Returns a copy of the string rather than a const ref for thread safety +//----------------------------------------------------------------------------- +string Driver::GetNodeProductName +( + uint8 const _nodeId +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + string str = node->GetProductName(); + ReleaseNodes(); + return str; + } + + return ""; +} + +//----------------------------------------------------------------------------- +// +// Get the user-editable name for the node with the specified ID +// Returns a copy of the string rather than a const ref for thread safety +//----------------------------------------------------------------------------- +string Driver::GetNodeName +( + uint8 const _nodeId +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + string str = node->GetNodeName(); + ReleaseNodes(); + return str; + } + + return ""; +} + +//----------------------------------------------------------------------------- +// +// Get the user-editable string for location of the specified node +// Returns a copy of the string rather than a const ref for thread safety +//----------------------------------------------------------------------------- +string Driver::GetNodeLocation +( + uint8 const _nodeId +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + string str = node->GetLocation(); + ReleaseNodes(); + return str; + } + + return ""; +} + +//----------------------------------------------------------------------------- +// +// Get the manufacturer Id string value with the specified ID +// Returns a copy of the string rather than a const ref for thread safety +//----------------------------------------------------------------------------- +string Driver::GetNodeManufacturerId +( + uint8 const _nodeId +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + string str = node->GetManufacturerId(); + ReleaseNodes(); + return str; + } + + return ""; +} + +//----------------------------------------------------------------------------- +// +// Get the product type string value with the specified ID +// Returns a copy of the string rather than a const ref for thread safety +//----------------------------------------------------------------------------- +string Driver::GetNodeProductType +( + uint8 const _nodeId +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + string str = node->GetProductType(); + ReleaseNodes(); + return str; + } + + return ""; +} + +//----------------------------------------------------------------------------- +// +// Get the product Id string value with the specified ID +// Returns a copy of the string rather than a const ref for thread safety +//----------------------------------------------------------------------------- +string Driver::GetNodeProductId +( + uint8 const _nodeId +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + string str = node->GetProductId(); + ReleaseNodes(); + return str; + } + + return ""; +} + +//----------------------------------------------------------------------------- +// +// Set the manufacturer name for the node with the specified ID +//----------------------------------------------------------------------------- +void Driver::SetNodeManufacturerName +( + uint8 const _nodeId, + string const& _manufacturerName +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + node->SetManufacturerName( _manufacturerName ); + ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Set the product name string value with the specified ID +//----------------------------------------------------------------------------- +void Driver::SetNodeProductName +( + uint8 const _nodeId, + string const& _productName +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + node->SetProductName( _productName ); + ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Set the node name string value with the specified ID +//----------------------------------------------------------------------------- +void Driver::SetNodeName +( + uint8 const _nodeId, + string const& _nodeName +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + node->SetNodeName( _nodeName ); + ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Set the location string value with the specified ID +//----------------------------------------------------------------------------- +void Driver::SetNodeLocation +( + uint8 const _nodeId, + string const& _location +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + node->SetLocation( _location ); + ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Helper to set the node level through the basic command class +//----------------------------------------------------------------------------- +void Driver::SetNodeLevel +( + uint8 const _nodeId, + uint8 const _level +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + node->SetLevel( _level ); + ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Helper to set the node on through the basic command class +//----------------------------------------------------------------------------- +void Driver::SetNodeOn +( + uint8 const _nodeId +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + node->SetNodeOn(); + ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Helper to set the node off through the basic command class +//----------------------------------------------------------------------------- +void Driver::SetNodeOff +( + uint8 const _nodeId +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + node->SetNodeOff(); + ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Get a pointer to a Value object for the specified ValueID +//----------------------------------------------------------------------------- +Value* Driver::GetValue +( + ValueID const& _id +) +{ + // This method is only called by code that has already locked the node + if( Node* node = m_nodes[_id.GetNodeId()] ) + { + return node->GetValue( _id ); + } + + return NULL; +} + +//----------------------------------------------------------------------------- +// Controller commands +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Reset controller and erase all node information +//----------------------------------------------------------------------------- +void Driver::ResetController +( + Event* _evt +) +{ + m_controllerResetEvent = _evt; + Log::Write( LogLevel_Info, "Reset controller and erase all node information"); + Msg* msg = new Msg( "Reset controller and erase all node information", 0xff, REQUEST, FUNC_ID_ZW_SET_DEFAULT, true ); + SendMsg( msg, MsgQueue_Command ); +} + +//----------------------------------------------------------------------------- +// +// Soft-reset the Z-Wave controller chip +//----------------------------------------------------------------------------- +void Driver::SoftReset +( +) +{ + Log::Write( LogLevel_Info, "Soft-resetting the Z-Wave controller chip"); + Msg* msg = new Msg( "Soft-resetting the Z-Wave controller chip", 0xff, REQUEST, FUNC_ID_SERIAL_API_SOFT_RESET, false, false ); + SendMsg( msg, MsgQueue_Command ); +} + +//----------------------------------------------------------------------------- +// +// Get the neighbour information for a node from the controller +//----------------------------------------------------------------------------- +void Driver::RequestNodeNeighbors +( + uint8 const _nodeId, + uint32 const _requestFlags +) +{ + if( IsAPICallSupported( FUNC_ID_ZW_GET_ROUTING_INFO ) ) + { + // Note: This is not the same as RequestNodeNeighbourUpdate. This method + // merely requests the controller's current neighbour information and + // the reply will be copied into the relevant Node object for later use. + Log::Write( LogLevel_Detail, GetNodeNumber( m_currentMsg ), "Requesting routing info (neighbor list) for Node %d", _nodeId ); + Msg* msg = new Msg( "Get Routing Info", _nodeId, REQUEST, FUNC_ID_ZW_GET_ROUTING_INFO, false ); + msg->Append( _nodeId ); + msg->Append( 0 ); // don't remove bad links + msg->Append( 0 ); // don't remove non-repeaters + msg->Append( 3 ); // funcid + SendMsg( msg, MsgQueue_Command ); + } +} + +//----------------------------------------------------------------------------- +// +// Start the controller performing one of its network management functions +// Create a ControllerCommand request. +//----------------------------------------------------------------------------- +bool Driver::BeginControllerCommand +( + ControllerCommand _command, + pfnControllerCallback_t _callback, + void* _context, + bool _highPower, + uint8 _nodeId, + uint8 _arg +) +{ + ControllerCommandItem* cci; + MsgQueueItem item; + + if( _command == ControllerCommand_None ) + { + return false; + } + + Log::Write( LogLevel_Detail, _nodeId, "Queuing (%s) %s", c_sendQueueNames[MsgQueue_Controller], c_controllerCommandNames[_command] ); + cci = new ControllerCommandItem(); + cci->m_controllerCommand = _command; + cci->m_controllerCallback = _callback; + cci->m_controllerCallbackContext = _context; + cci->m_highPower = _highPower; + cci->m_controllerCommandNode = _nodeId; + cci->m_controllerCommandArg = _arg; + cci->m_controllerState = ControllerState_Normal; + cci->m_controllerStateChanged = false; + cci->m_controllerCommandDone = false; + + item.m_command = MsgQueueCmd_Controller; + item.m_cci = cci; + + m_sendMutex->Lock(); + m_msgQueue[MsgQueue_Controller].push_back( item ); + m_queueEvent[MsgQueue_Controller]->Set(); + m_sendMutex->Unlock(); + + return true; +} + +//----------------------------------------------------------------------------- +// +// Start the controller performing one of its network management functions +//----------------------------------------------------------------------------- +void Driver::DoControllerCommand +( +) +{ + UpdateControllerState( ControllerState_Starting ); + switch( m_currentControllerCommand->m_controllerCommand ) + { + case ControllerCommand_AddDevice: + { + if( !IsPrimaryController() ) + { + UpdateControllerState( ControllerState_Error, ControllerError_NotPrimary ); + } + else + { + Log::Write( LogLevel_Info, 0, "Add Device" ); + Msg* msg = new Msg( "AddDevice", 0xff, REQUEST, FUNC_ID_ZW_ADD_NODE_TO_NETWORK, true ); + msg->Append( m_currentControllerCommand->m_highPower ? ADD_NODE_ANY | OPTION_HIGH_POWER : ADD_NODE_ANY ); + SendMsg( msg, MsgQueue_Command ); + } + break; + } + case ControllerCommand_CreateNewPrimary: + { + if( IsPrimaryController() ) + { + UpdateControllerState( ControllerState_Error, ControllerError_NotSecondary ); + } + else if( !IsStaticUpdateController() ) + { + UpdateControllerState( ControllerState_Error, ControllerError_NotSUC ); + } + else + { + Log::Write( LogLevel_Info, 0, "Create New Primary" ); + Msg* msg = new Msg( "CreateNewPrimary", 0xff, REQUEST, FUNC_ID_ZW_CREATE_NEW_PRIMARY, true ); + msg->Append( CREATE_PRIMARY_START ); + SendMsg( msg, MsgQueue_Command ); + } + break; + } + case ControllerCommand_ReceiveConfiguration: + { + Log::Write( LogLevel_Info, 0, "Receive Configuration" ); + Msg* msg = new Msg( "ReceiveConfiguration", 0xff, REQUEST, FUNC_ID_ZW_SET_LEARN_MODE, true ); + msg->Append( 0xff ); + SendMsg( msg, MsgQueue_Command ); + break; + } + case ControllerCommand_RemoveDevice: + { + if( !IsPrimaryController() ) + { + UpdateControllerState( ControllerState_Error, ControllerError_NotPrimary ); + } + else + { + Log::Write( LogLevel_Info, 0, "Remove Device" ); + Msg* msg = new Msg( "RemoveDevice", 0xff, REQUEST, FUNC_ID_ZW_REMOVE_NODE_FROM_NETWORK, true ); + msg->Append( m_currentControllerCommand->m_highPower ? REMOVE_NODE_ANY | OPTION_HIGH_POWER : REMOVE_NODE_ANY ); + SendMsg( msg, MsgQueue_Command ); + } + break; + } + case ControllerCommand_HasNodeFailed: + { + Log::Write( LogLevel_Info, 0, "Requesting whether node %d has failed", m_currentControllerCommand->m_controllerCommandNode ); + Msg* msg = new Msg( "Has Node Failed?", 0xff, REQUEST, FUNC_ID_ZW_IS_FAILED_NODE_ID, false ); + msg->Append( m_currentControllerCommand->m_controllerCommandNode ); + SendMsg( msg, MsgQueue_Command ); + break; + } + case ControllerCommand_RemoveFailedNode: + { + Log::Write( LogLevel_Info, 0, "Marking node %d as having failed", m_currentControllerCommand->m_controllerCommandNode ); + Msg* msg = new Msg( "Mark Node As Failed", 0xff, REQUEST, FUNC_ID_ZW_REMOVE_FAILED_NODE_ID, true ); + msg->Append( m_currentControllerCommand->m_controllerCommandNode ); + SendMsg( msg, MsgQueue_Command ); + break; + } + case ControllerCommand_ReplaceFailedNode: + { + Log::Write( LogLevel_Info, 0, "Replace Failed Node %d", m_currentControllerCommand->m_controllerCommandNode ); + Msg* msg = new Msg( "ReplaceFailedNode", 0xff, REQUEST, FUNC_ID_ZW_REPLACE_FAILED_NODE, true ); + msg->Append( m_currentControllerCommand->m_controllerCommandNode ); + SendMsg( msg, MsgQueue_Command ); + break; + } + case ControllerCommand_TransferPrimaryRole: + { + if( !IsPrimaryController() ) + { + UpdateControllerState( ControllerState_Error, ControllerError_NotPrimary ); + } + else + { + Log::Write( LogLevel_Info, 0, "Transfer Primary Role" ); + Msg* msg = new Msg( "TransferPrimaryRole", 0xff, REQUEST, FUNC_ID_ZW_CONTROLLER_CHANGE, true ); + msg->Append( m_currentControllerCommand->m_highPower ? CONTROLLER_CHANGE_START | OPTION_HIGH_POWER : CONTROLLER_CHANGE_START ); + SendMsg( msg, MsgQueue_Command ); + } + break; + } + case ControllerCommand_RequestNetworkUpdate: + { + if( !IsStaticUpdateController() ) + { + UpdateControllerState( ControllerState_Error, ControllerError_NotSUC ); + } + else + { + Log::Write( LogLevel_Info, 0, "Request Network Update" ); + Msg* msg = new Msg( "RequestNetworkUpdate", 0xff, REQUEST, FUNC_ID_ZW_REQUEST_NETWORK_UPDATE, true ); + SendMsg( msg, MsgQueue_Command ); + } + break; + } + case ControllerCommand_RequestNodeNeighborUpdate: + { + if( !IsPrimaryController() ) + { + UpdateControllerState( ControllerState_Error, ControllerError_NotPrimary ); + } + else + { + Log::Write( LogLevel_Info, 0, "Requesting Neighbor Update for node %d", m_currentControllerCommand->m_controllerCommandNode ); + bool opts = IsAPICallSupported( FUNC_ID_ZW_REQUEST_NODE_NEIGHBOR_UPDATE_OPTIONS ); + Msg* msg; + if( opts ) + { + msg = new Msg( "Requesting Neighbor Update", m_currentControllerCommand->m_controllerCommandNode, REQUEST, FUNC_ID_ZW_REQUEST_NODE_NEIGHBOR_UPDATE_OPTIONS, true ); + } + else + { + msg = new Msg( "Requesting Neighbor Update", m_currentControllerCommand->m_controllerCommandNode, REQUEST, FUNC_ID_ZW_REQUEST_NODE_NEIGHBOR_UPDATE, true ); + } + msg->Append( m_currentControllerCommand->m_controllerCommandNode ); + if( opts ) + { + msg->Append( GetTransmitOptions() ); + } + SendMsg( msg, MsgQueue_Command ); + } + break; + } + case ControllerCommand_AssignReturnRoute: + { + Log::Write( LogLevel_Info, 0, "Assigning return route from node %d to node %d", m_currentControllerCommand->m_controllerCommandNode, m_currentControllerCommand->m_controllerCommandArg ); + Msg* msg = new Msg( "Assigning return route", m_currentControllerCommand->m_controllerCommandNode, REQUEST, FUNC_ID_ZW_ASSIGN_RETURN_ROUTE, true ); + msg->Append( m_currentControllerCommand->m_controllerCommandNode ); // from the node + msg->Append( m_currentControllerCommand->m_controllerCommandArg ); // to the specific destination + SendMsg( msg, MsgQueue_Command ); + break; + } + case ControllerCommand_DeleteAllReturnRoutes: + { + Log::Write( LogLevel_Info, 0, "Deleting all return routes from node %d", m_currentControllerCommand->m_controllerCommandNode ); + Msg* msg = new Msg( "Deleting return routes", m_currentControllerCommand->m_controllerCommandNode, REQUEST, FUNC_ID_ZW_DELETE_RETURN_ROUTE, true ); + msg->Append( m_currentControllerCommand->m_controllerCommandNode ); // from the node + SendMsg( msg, MsgQueue_Command ); + break; + } + case ControllerCommand_SendNodeInformation: + { + Log::Write( LogLevel_Info, 0, "Sending a node information frame" ); + Msg* msg = new Msg( "Send Node Information", m_currentControllerCommand->m_controllerCommandNode, REQUEST, FUNC_ID_ZW_SEND_NODE_INFORMATION, true ); + msg->Append( m_currentControllerCommand->m_controllerCommandNode ); // to the node + msg->Append( GetTransmitOptions() ); + SendMsg( msg, MsgQueue_Command ); + break; + } + case ControllerCommand_ReplicationSend: + { + if( !IsPrimaryController() ) + { + UpdateControllerState( ControllerState_Error, ControllerError_NotPrimary ); + } + else + { + Log::Write( LogLevel_Info, 0, "Replication Send" ); + Msg* msg = new Msg( "ReplicationSend", 0xff, REQUEST, FUNC_ID_ZW_ADD_NODE_TO_NETWORK, true ); + msg->Append( m_currentControllerCommand->m_highPower ? ADD_NODE_CONTROLLER | OPTION_HIGH_POWER : ADD_NODE_CONTROLLER ); + SendMsg( msg, MsgQueue_Command ); + } + break; + } + case ControllerCommand_CreateButton: + { + if( IsBridgeController() ) + { + Node* node = GetNodeUnsafe( m_currentControllerCommand->m_controllerCommandNode ); + if( node != NULL ) + { + if( node->m_buttonMap.find( m_currentControllerCommand->m_controllerCommandArg ) == node->m_buttonMap.end() && m_virtualNeighborsReceived ) + { + bool found = false; + for( uint8 n = 1; n <= 232 && !found; n++ ) + { + if( !IsVirtualNode( n )) + continue; + + map::iterator it = node->m_buttonMap.begin(); + for( ; it != node->m_buttonMap.end(); ++it ) + { + // is virtual node already in map? + if( it->second == n ) + break; + } + if( it == node->m_buttonMap.end() ) // found unused virtual node + { + node->m_buttonMap[m_currentControllerCommand->m_controllerCommandArg] = n; + SendVirtualNodeInfo( n, m_currentControllerCommand->m_controllerCommandNode ); + found = true; + } + } + if( !found ) // create a new virtual node + { + Log::Write( LogLevel_Info, 0, "AddVirtualNode" ); + Msg* msg = new Msg( "Slave Node Information", 0xff, REQUEST, FUNC_ID_SERIAL_API_SLAVE_NODE_INFO, false, false ); + msg->Append( 0 ); // node 0 + msg->Append( 1 ); // listening + msg->Append( 0x09 ); // genericType window covering + msg->Append( 0x00 ); // specificType undefined + msg->Append( 0 ); // length + SendMsg( msg, MsgQueue_Command ); + + msg = new Msg( "Add Virtual Node", 0xff, REQUEST, FUNC_ID_ZW_SET_SLAVE_LEARN_MODE, true ); + msg->Append( 0 ); // node 0 to add + if( IsPrimaryController() || IsInclusionController() ) + { + msg->Append( SLAVE_LEARN_MODE_ADD ); + } + else + { + msg->Append( SLAVE_LEARN_MODE_ENABLE ); + } + SendMsg( msg, MsgQueue_Command ); + } + } + else + { + UpdateControllerState( ControllerState_Error, ControllerError_ButtonNotFound ); + } + } + else + { + UpdateControllerState( ControllerState_Error, ControllerError_NodeNotFound ); + } + } else + { + UpdateControllerState( ControllerState_Error, ControllerError_NotBridge ); + } + break; + } + case ControllerCommand_DeleteButton: + { + if( IsBridgeController() ) + { + Node* node = GetNodeUnsafe( m_currentControllerCommand->m_controllerCommandNode ); + if( node != NULL ) + { + // Make sure button is allocated to a virtual node. + if( node->m_buttonMap.find( m_currentControllerCommand->m_controllerCommandArg ) != node->m_buttonMap.end() ) + { +#ifdef notdef + // We would need a reference count to decide when to free virtual nodes + // We could do this by making the bitmap of virtual nodes into a map that also holds a reference count. + Log::Write( LogLevel_Info, 0, "RemoveVirtualNode %d", m_currentControllerCommand->m_controllerCommandNode ); + Msg* msg = new Msg( "Remove Virtual Node", 0xff, REQUEST, FUNC_ID_ZW_SET_SLAVE_LEARN_MODE, true ); + msg->Append( m_currentControllerCommand->m_controllerCommandNode ); // from the node + if( IsPrimaryController() || IsInclusionController() ) + msg->Append( SLAVE_LEARN_MODE_REMOVE ); + else + msg->Append( SLAVE_LEARN_MODE_ENABLE ); + SendMsg( msg ); +#endif + node->m_buttonMap.erase( m_currentControllerCommand->m_controllerCommandArg ); + SaveButtons(); + + Notification* notification = new Notification( Notification::Type_DeleteButton ); + notification->SetHomeAndNodeIds( m_homeId, m_currentControllerCommand->m_controllerCommandNode ); + notification->SetButtonId( m_currentControllerCommand->m_controllerCommandArg ); + QueueNotification( notification ); + } + else + { + UpdateControllerState( ControllerState_Error, ControllerError_ButtonNotFound ); + } + } + else + { + UpdateControllerState( ControllerState_Error, ControllerError_NodeNotFound ); + } + } + else + { + UpdateControllerState( ControllerState_Error, ControllerError_NotBridge ); + } + break; + } + case ControllerCommand_None: + { + // To keep gcc quiet + break; + } + } +} + +//----------------------------------------------------------------------------- +// +// Stop the current controller function +//----------------------------------------------------------------------------- +bool Driver::CancelControllerCommand +( +) +{ + if( m_currentControllerCommand == NULL ) + { + // Controller is not doing anything + return false; + } + + switch( m_currentControllerCommand->m_controllerCommand ) + { + case ControllerCommand_AddDevice: + { + Log::Write( LogLevel_Info, 0, "Cancel Add Node" ); + m_currentControllerCommand->m_controllerCommandNode = 0xff; // identify the fact that there is no new node to initialize + AddNodeStop( FUNC_ID_ZW_ADD_NODE_TO_NETWORK ); + break; + } + case ControllerCommand_CreateNewPrimary: + { + Log::Write( LogLevel_Info, 0, "Cancel Create New Primary" ); + Msg* msg = new Msg( "CreateNewPrimary Stop", 0xff, REQUEST, FUNC_ID_ZW_CREATE_NEW_PRIMARY, true ); + msg->Append( CREATE_PRIMARY_STOP ); + SendMsg( msg, MsgQueue_Command ); + break; + } + case ControllerCommand_ReceiveConfiguration: + { + Log::Write( LogLevel_Info, 0, "Cancel Receive Configuration" ); + Msg* msg = new Msg( "ReceiveConfiguration Stop", 0xff, REQUEST, FUNC_ID_ZW_SET_LEARN_MODE, false, false ); + msg->Append( 0 ); + SendMsg( msg, MsgQueue_Command ); + break; + } + case ControllerCommand_RemoveDevice: + { + Log::Write( LogLevel_Info, 0, "Cancel Remove Device" ); + m_currentControllerCommand->m_controllerCommandNode = 0xff; // identify the fact that there is no node to remove + AddNodeStop( FUNC_ID_ZW_REMOVE_NODE_FROM_NETWORK ); + break; + } + case ControllerCommand_TransferPrimaryRole: + { + Log::Write( LogLevel_Info, 0, "Cancel Transfer Primary Role" ); + Msg* msg = new Msg( "Transfer Primary Role Stop", 0xff, REQUEST, FUNC_ID_ZW_CONTROLLER_CHANGE, true ); + msg->Append( CONTROLLER_CHANGE_STOP ); + SendMsg( msg, MsgQueue_Command ); + break; + } + case ControllerCommand_ReplicationSend: + { + Log::Write( LogLevel_Info, 0, "Cancel Replication Send" ); + m_currentControllerCommand->m_controllerCommandNode = 0xff; // identify the fact that there is no new node to initialize + AddNodeStop( FUNC_ID_ZW_ADD_NODE_TO_NETWORK ); + break; + } + case ControllerCommand_CreateButton: + case ControllerCommand_DeleteButton: + { + if( m_currentControllerCommand->m_controllerCommandNode != 0 ) + { + SendSlaveLearnModeOff(); + } + break; + } + case ControllerCommand_None: + case ControllerCommand_RequestNetworkUpdate: + case ControllerCommand_RequestNodeNeighborUpdate: + case ControllerCommand_AssignReturnRoute: + case ControllerCommand_DeleteAllReturnRoutes: + case ControllerCommand_RemoveFailedNode: + case ControllerCommand_HasNodeFailed: + case ControllerCommand_ReplaceFailedNode: + case ControllerCommand_SendNodeInformation: + { + // Cannot cancel + return false; + } + } + + UpdateControllerState( ControllerState_Cancel ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Stop the Add Node mode based on API of controller +//----------------------------------------------------------------------------- +void Driver::AddNodeStop +( + uint8 const _funcId +) +{ + if( m_currentControllerCommand == NULL ) + { + // Controller is not doing anything + return; + } + + if( m_serialAPIVersion[0] == 2 && m_serialAPIVersion[1] == 76 ) + { + Msg* msg = new Msg( "Add Node Stop", 0xff, REQUEST, _funcId, false, false ); + msg->Append( ADD_NODE_STOP ); + SendMsg( msg, Driver::MsgQueue_Command ); + } + else + { + Msg* msg = new Msg( "Add Node Stop", 0xff, REQUEST, _funcId, false, true ); + msg->Append( ADD_NODE_STOP ); + SendMsg( msg, Driver::MsgQueue_Command ); + } +} + +//----------------------------------------------------------------------------- +// +// Run a series of messages to a single node or every node on the network. +//----------------------------------------------------------------------------- +void Driver::TestNetwork +( + uint8 const _nodeId, + uint32 const _count +) +{ + LockNodes(); + if( _nodeId == 0 ) // send _count messages to every node + { + for( int i=0; i<256; ++i ) + { + if( i == m_nodeId ) // ignore sending to ourself + { + continue; + } + if( m_nodes[i] != NULL ) + { + NoOperation *noop = static_cast( m_nodes[i]->GetCommandClass( NoOperation::StaticGetCommandClassId() ) ); + for( int j=0; j < (int)_count; j++ ) + { + noop->Set( true ); + } + } + } + } + else if( _nodeId != m_nodeId && m_nodes[_nodeId] != NULL ) + { + NoOperation *noop = static_cast( m_nodes[_nodeId]->GetCommandClass( NoOperation::StaticGetCommandClassId() ) ); + for( int i=0; i < (int)_count; i++ ) + { + noop->Set( true ); + } + } + ReleaseNodes(); +} + +//----------------------------------------------------------------------------- +// SwitchAll +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// All devices that support the SwitchAll command class will be turned on +//----------------------------------------------------------------------------- +void Driver::SwitchAllOn +( +) +{ + SwitchAll::On( this, 0xff ); + + LockNodes(); + for( int i=0; i<256; ++i ) + { + if( GetNodeUnsafe( i ) ) + { + if( m_nodes[i]->GetCommandClass( SwitchAll::StaticGetCommandClassId() ) ) + { + SwitchAll::On( this, (uint8)i ); + } + } + } + ReleaseNodes(); +} + +//----------------------------------------------------------------------------- +// +// All devices that support the SwitchAll command class will be turned off +//----------------------------------------------------------------------------- +void Driver::SwitchAllOff +( +) +{ + SwitchAll::Off( this, 0xff ); + + LockNodes(); + for( int i=0; i<256; ++i ) + { + if( GetNodeUnsafe( i ) ) + { + if( m_nodes[i]->GetCommandClass( SwitchAll::StaticGetCommandClassId() ) ) + { + SwitchAll::Off( this, (uint8)i ); + } + } + } + ReleaseNodes(); +} + +//----------------------------------------------------------------------------- +// +// Set the value of one of the configuration parameters of a device +//----------------------------------------------------------------------------- +bool Driver::SetConfigParam +( + uint8 const _nodeId, + uint8 const _param, + int32 _value, + uint8 _size +) +{ + bool res = false; + if( Node* node = GetNode( _nodeId ) ) + { + res = node->SetConfigParam( _param, _value, _size ); + ReleaseNodes(); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Request the value of one of the configuration parameters of a device +//----------------------------------------------------------------------------- +void Driver::RequestConfigParam +( + uint8 const _nodeId, + uint8 const _param +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + node->RequestConfigParam( _param ); + ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Gets the number of association groups reported by this node +//----------------------------------------------------------------------------- +uint8 Driver::GetNumGroups +( + uint8 const _nodeId +) +{ + uint8 numGroups = 0; + if( Node* node = GetNode( _nodeId ) ) + { + numGroups = node->GetNumGroups(); + ReleaseNodes(); + } + + return numGroups; +} + +//----------------------------------------------------------------------------- +// +// Gets the associations for a group +//----------------------------------------------------------------------------- +uint32 Driver::GetAssociations +( + uint8 const _nodeId, + uint8 const _groupIdx, + uint8** o_associations +) +{ + uint32 numAssociations = 0; + if( Node* node = GetNode( _nodeId ) ) + { + numAssociations = node->GetAssociations( _groupIdx, o_associations ); + ReleaseNodes(); + } + + return numAssociations; +} + +//----------------------------------------------------------------------------- +// +// Gets the maximum number of associations for a group +//----------------------------------------------------------------------------- +uint8 Driver::GetMaxAssociations +( + uint8 const _nodeId, + uint8 const _groupIdx +) +{ + uint8 maxAssociations = 0; + if( Node* node = GetNode( _nodeId ) ) + { + maxAssociations = node->GetMaxAssociations( _groupIdx ); + ReleaseNodes(); + } + + return maxAssociations; +} + +//----------------------------------------------------------------------------- +// +// Gets the label for a particular group +//----------------------------------------------------------------------------- +string Driver::GetGroupLabel +( + uint8 const _nodeId, + uint8 const _groupIdx +) +{ + string label = ""; + if( Node* node = GetNode( _nodeId ) ) + { + label = node->GetGroupLabel( _groupIdx ); + ReleaseNodes(); + } + + return label; +} + +//----------------------------------------------------------------------------- +// +// Adds a node to an association group +//----------------------------------------------------------------------------- +void Driver::AddAssociation +( + uint8 const _nodeId, + uint8 const _groupIdx, + uint8 const _targetNodeId +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + node->AddAssociation( _groupIdx, _targetNodeId ); + ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Removes a node from an association group +//----------------------------------------------------------------------------- +void Driver::RemoveAssociation +( + uint8 const _nodeId, + uint8 const _groupIdx, + uint8 const _targetNodeId +) +{ + if( Node* node = GetNode( _nodeId ) ) + { + node->RemoveAssociation( _groupIdx, _targetNodeId ); + ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Add a notification to the queue to be sent at a later, safe time. +//----------------------------------------------------------------------------- +void Driver::QueueNotification +( + Notification* _notification +) +{ + m_notifications.push_back( _notification ); + m_notificationsEvent->Set(); +} + +//----------------------------------------------------------------------------- +// +// Notify any watching objects of a value change +//----------------------------------------------------------------------------- +void Driver::NotifyWatchers +( +) +{ + list::iterator nit = m_notifications.begin(); + while( nit != m_notifications.end() ) + { + Notification* notification = m_notifications.front(); + m_notifications.pop_front(); + + Manager::Get()->NotifyWatchers( notification ); + + delete notification; + nit = m_notifications.begin(); + } + m_notificationsEvent->Reset(); +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +bool Driver::HandleRfPowerLevelSetResponse +( + uint8* _data +) +{ + bool res = true; + // the meaning of this command is currently unclear, and there + // isn't any returned response data, so just log the function call + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_ZW_R_F_POWER_LEVEL_SET" ); + + return res; +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +bool Driver::HandleSerialApiSetTimeoutsResponse +( + uint8* _data +) +{ + // the meaning of this command and its response is currently unclear + bool res = true; + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_SERIAL_API_SET_TIMEOUTS" ); + return res; +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +bool Driver::HandleMemoryGetByteResponse +( + uint8* _data +) +{ + bool res = true; + // the meaning of this command and its response is currently unclear + // it seems to return three bytes of data, so print them out + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_ZW_MEMORY_GET_BYTE, returned data: 0x%02hx 0x%02hx 0x%02hx", _data[0], _data[1], _data[2] ); + + return res; +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +bool Driver::HandleReadMemoryResponse +( + uint8* _data +) +{ + // the meaning of this command and its response is currently unclear + bool res = true; + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "Received reply to FUNC_ID_MEMORY_GET_BYTE" ); + return res; +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleGetVirtualNodesResponse +( + uint8* _data +) +{ + uint8 nodeId = GetNodeNumber( m_currentMsg ); + Log::Write( LogLevel_Info, nodeId, "Received reply to FUNC_ID_ZW_GET_VIRTUAL_NODES" ); + memcpy( m_virtualNeighbors, &_data[2], 29 ); + m_virtualNeighborsReceived = true; + bool bNeighbors = false; + for( int by=0; by<29; by++ ) + { + for( int bi=0; bi<8; bi++ ) + { + if( (_data[2+by] & (0x01< +// Gets the virtual neighbors for a network +//----------------------------------------------------------------------------- +uint32 Driver::GetVirtualNeighbors +( + uint8** o_neighbors +) +{ + int i; + uint32 numNeighbors = 0; + if( !m_virtualNeighborsReceived ) + { + *o_neighbors = NULL; + return 0; + } + for( i = 0; i < 29; i++ ) + { + for( unsigned char mask = 0x80; mask != 0; mask >>= 1 ) + if( m_virtualNeighbors[i] & mask ) + numNeighbors++; + } + + // handle the possibility that no neighbors are reported + if( !numNeighbors ) + { + *o_neighbors = NULL; + return 0; + } + + // create and populate an array with neighbor node ids + uint8* neighbors = new uint8[numNeighbors]; + uint32 index = 0; + for( int by=0; by<29; by++ ) + { + for( int bi=0; bi<8; bi++ ) + { + if( (m_virtualNeighbors[by] & (0x01< +// Get the virtual neighbour information from the controller +//----------------------------------------------------------------------------- +void Driver::RequestVirtualNeighbors +( + MsgQueue const _queue +) +{ + Msg* msg = new Msg( "Get Virtual Neighbor List", 0xff, REQUEST, FUNC_ID_ZW_GET_VIRTUAL_NODES, false ); + SendMsg( msg, _queue ); +} + +//----------------------------------------------------------------------------- +// +// Send node info frame on behalf of a virtual node. +//----------------------------------------------------------------------------- +void Driver::SendVirtualNodeInfo +( + uint8 const _FromNodeId, + uint8 const _ToNodeId +) +{ + char str[80]; + + snprintf( str, sizeof(str), "Send Virtual Node Info from %d to %d", _FromNodeId, _ToNodeId ); + Msg* msg = new Msg( str, 0xff, REQUEST, FUNC_ID_ZW_SEND_SLAVE_NODE_INFO, true ); + msg->Append( _FromNodeId ); // from the virtual node + msg->Append( _ToNodeId ); // to the handheld controller + msg->Append( TRANSMIT_OPTION_ACK ); + SendMsg( msg, MsgQueue_Command ); +} + +//----------------------------------------------------------------------------- +// +// Disable Slave Learn Mode. +//----------------------------------------------------------------------------- +void Driver::SendSlaveLearnModeOff +( +) +{ + if( !( IsPrimaryController() || IsInclusionController() ) ) + { + Msg* msg = new Msg( "Set Slave Learn Mode Off ", 0xff, REQUEST, FUNC_ID_ZW_SET_SLAVE_LEARN_MODE, true ); + msg->Append( 0 ); // filler node id + msg->Append( SLAVE_LEARN_MODE_DISABLE ); + SendMsg( msg, MsgQueue_Command ); + } +} + +//----------------------------------------------------------------------------- +// +// Save button info into file. +//----------------------------------------------------------------------------- +void Driver::SaveButtons +( +) +{ + char str[16]; + + // Create a new XML document to contain the driver configuration + TiXmlDocument doc; + TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "utf-8", "" ); + TiXmlElement* nodesElement = new TiXmlElement( "Nodes" ); + doc.LinkEndChild( decl ); + doc.LinkEndChild( nodesElement ); + + nodesElement->SetAttribute( "xmlns", "http://code.google.com/p/open-zwave/" ); + + snprintf( str, sizeof(str), "%d", 1 ); + nodesElement->SetAttribute( "version", str); + + LockNodes(); + for( int i = 1; i < 256; i++ ) + { + if( m_nodes[i] == NULL || m_nodes[i]->m_buttonMap.empty() ) + { + continue; + } + + TiXmlElement* nodeElement = new TiXmlElement( "Node" ); + + snprintf( str, sizeof(str), "%d", i ); + nodeElement->SetAttribute( "id", str ); + + for( map::iterator it = m_nodes[i]->m_buttonMap.begin(); it != m_nodes[i]->m_buttonMap.end(); ++it ) + { + TiXmlElement* valueElement = new TiXmlElement( "Button" ); + + snprintf( str, sizeof(str), "%d", it->first ); + valueElement->SetAttribute( "id", str ); + + snprintf( str, sizeof(str), "%d", it->second ); + TiXmlText* textElement = new TiXmlText( str ); + valueElement->LinkEndChild( textElement ); + + nodeElement->LinkEndChild( valueElement ); + } + + nodesElement->LinkEndChild( nodeElement ); + } + ReleaseNodes(); + + string userPath; + Options::Get()->GetOptionAsString( "UserPath", &userPath ); + + string filename = userPath + "zwbutton.xml"; + + doc.SaveFile( filename.c_str() ); +} +//----------------------------------------------------------------------------- +// +// Read button info per node from file. +//----------------------------------------------------------------------------- +void Driver::ReadButtons +( + uint8 const _nodeId +) +{ + int32 intVal; + int32 nodeId; + int32 buttonId; + char const* str; + + // Load the XML document that contains the driver configuration + string userPath; + Options::Get()->GetOptionAsString( "UserPath", &userPath ); + + string filename = userPath + "zwbutton.xml"; + + TiXmlDocument doc; + if( !doc.LoadFile( filename.c_str(), TIXML_ENCODING_UTF8 ) ) + { + Log::Write( LogLevel_Debug, "Driver::ReadButtons - zwbutton.xml file not found."); + return; + } + + TiXmlElement const* nodesElement = doc.RootElement(); + str = nodesElement->Value(); + if( str && strcmp( str, "Nodes" )) + { + Log::Write( LogLevel_Warning, "WARNING: Driver::ReadButtons - zwbutton.xml is malformed"); + return; + } + + // Version + if( TIXML_SUCCESS == nodesElement->QueryIntAttribute( "version", &intVal ) ) + { + if( (uint32)intVal != 1 ) + { + Log::Write( LogLevel_Info, "Driver::ReadButtons - %s is from an older version of OpenZWave and cannot be loaded.", "zwbutton.xml" ); + return; + } + } + else + { + Log::Write( LogLevel_Warning, "WARNING: Driver::ReadButtons - zwbutton.xml is from an older version of OpenZWave and cannot be loaded." ); + return; + } + + TiXmlElement const* nodeElement = nodesElement->FirstChildElement(); + while( nodeElement ) + { + str = nodeElement->Value(); + if( str && !strcmp( str, "Node" )) + { + Node* node = NULL; + if( TIXML_SUCCESS == nodeElement->QueryIntAttribute( "id", &intVal ) ) + { + if( _nodeId == intVal ) + { + node = GetNodeUnsafe( intVal ); + } + } + if( node != NULL ) + { + TiXmlElement const* buttonElement = nodeElement->FirstChildElement(); + while( buttonElement ) + { + str = buttonElement->Value(); + if( str && !strcmp( str, "Button")) + { + if (TIXML_SUCCESS != buttonElement->QueryIntAttribute( "id", &buttonId ) ) + { + Log::Write( LogLevel_Warning, "WARNING: Driver::ReadButtons - cannot find Button Id for node %d", _nodeId ); + return; + } + str = buttonElement->GetText(); + if( str ) + { + char *p; + nodeId = (int32)strtol( str, &p, 0 ); + } + else + { + Log::Write( LogLevel_Info, "Driver::ReadButtons - missing virtual node value for node %d button id %d", _nodeId, buttonId ); + return; + } + node->m_buttonMap[buttonId] = nodeId; + Notification* notification = new Notification( Notification::Type_CreateButton ); + notification->SetHomeAndNodeIds( m_homeId, nodeId ); + notification->SetButtonId( buttonId ); + QueueNotification( notification ); + } + buttonElement = buttonElement->NextSiblingElement(); + } + } + } + nodeElement = nodeElement->NextSiblingElement(); + } +} +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +bool Driver::HandleSetSlaveLearnModeResponse +( + uint8* _data +) +{ + bool res = true; + ControllerState state = ControllerState_InProgress; + uint8 nodeId = GetNodeNumber( m_currentMsg ); + if( _data[2] ) + { + Log::Write( LogLevel_Info, nodeId, "Received reply to FUNC_ID_ZW_SET_SLAVE_LEARN_MODE - command in progress" ); + } + else + { + // Failed + Log::Write( LogLevel_Warning, nodeId, "WARNING: Received reply to FUNC_ID_ZW_SET_SLAVE_LEARN_MODE - command failed" ); + state = ControllerState_Failed; + res = false; + SendSlaveLearnModeOff(); + } + + UpdateControllerState( state ); + return res; +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleSetSlaveLearnModeRequest +( + uint8* _data +) +{ + ControllerState state = ControllerState_Waiting; + uint8 nodeId = GetNodeNumber( m_currentMsg ); + + if( m_currentControllerCommand == NULL ) + { + return; + } + + SendSlaveLearnModeOff(); + switch( _data[3] ) + { + case SLAVE_ASSIGN_COMPLETE: + { + Log::Write( LogLevel_Info, nodeId, "SLAVE_ASSIGN_COMPLETE" ); + if( _data[4] == 0 ) // original node is 0 so adding + { + Log::Write( LogLevel_Info, nodeId, "Adding virtual node ID %d", _data[5] ); + Node* node = GetNodeUnsafe( m_currentControllerCommand->m_controllerCommandNode ); + if( node != NULL ) + { + node->m_buttonMap[m_currentControllerCommand->m_controllerCommandArg] = _data[5]; + SendVirtualNodeInfo( _data[5], m_currentControllerCommand->m_controllerCommandNode ); + } + } + else + if( _data[5] == 0 ) + { + Log::Write( LogLevel_Info, nodeId, "Removing virtual node ID %d", _data[4] ); + } + break; + } + case SLAVE_ASSIGN_NODEID_DONE: + { + Log::Write( LogLevel_Info, nodeId, "SLAVE_ASSIGN_NODEID_DONE" ); + if( _data[4] == 0 ) // original node is 0 so adding + { + Log::Write( LogLevel_Info, nodeId, "Adding virtual node ID %d", _data[5] ); + Node* node = GetNodeUnsafe( m_currentControllerCommand->m_controllerCommandNode ); + if( node != NULL ) + { + node->m_buttonMap[m_currentControllerCommand->m_controllerCommandArg] = _data[5]; + SendVirtualNodeInfo( _data[5], m_currentControllerCommand->m_controllerCommandNode ); + } + } + else + if( _data[5] == 0 ) + { + Log::Write( LogLevel_Info, nodeId, "Removing virtual node ID %d", _data[4] ); + } + break; + } + case SLAVE_ASSIGN_RANGE_INFO_UPDATE: + { + Log::Write( LogLevel_Info, nodeId, "SLAVE_ASSIGN_RANGE_INFO_UPDATE" ); + break; + } + } + m_currentControllerCommand->m_controllerAdded = false; + + UpdateControllerState( state ); +} + +//----------------------------------------------------------------------------- +// +// Process a response from the Z-Wave PC interface +//----------------------------------------------------------------------------- +bool Driver::HandleSendSlaveNodeInfoResponse +( + uint8* _data +) +{ + bool res = true; + ControllerState state = ControllerState_InProgress; + uint8 nodeId = GetNodeNumber( m_currentMsg ); + if( m_currentControllerCommand == NULL ) + { + return false; + } + if( _data[2] ) + { + Log::Write( LogLevel_Info, nodeId, "Received reply to FUNC_ID_ZW_SEND_SLAVE_NODE_INFO - command in progress" ); + } + else + { + // Failed + Log::Write( LogLevel_Info, nodeId, "Received reply to FUNC_ID_ZW_SEND_SLAVE_NODE_INFO - command failed" ); + state = ControllerState_Failed; + // Undo button map settings + Node* node = GetNodeUnsafe( m_currentControllerCommand->m_controllerCommandNode ); + if( node != NULL ) + { + node->m_buttonMap.erase( m_currentControllerCommand->m_controllerCommandArg ); + } + res = false; + } + + UpdateControllerState( state ); + return res; +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleSendSlaveNodeInfoRequest +( + uint8* _data +) +{ + if( m_currentControllerCommand == NULL ) + { + return; + } + if( _data[3] == 0 ) // finish up + { + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "SEND_SLAVE_NODE_INFO_COMPLETE OK" ); + SaveButtons(); + Notification* notification = new Notification( Notification::Type_CreateButton ); + notification->SetHomeAndNodeIds( m_homeId, m_currentControllerCommand->m_controllerCommandNode ); + notification->SetButtonId( m_currentControllerCommand->m_controllerCommandArg ); + QueueNotification( notification ); + + UpdateControllerState( ControllerState_Completed ); + RequestVirtualNeighbors( MsgQueue_Send ); + } + else // error. try again + { + HandleErrorResponse( _data[3], m_currentControllerCommand->m_controllerCommandNode, "SLAVE_NODE_INFO_COMPLETE" ); + Node* node = GetNodeUnsafe( m_currentControllerCommand->m_controllerCommandNode ); + if( node != NULL) + { + SendVirtualNodeInfo( node->m_buttonMap[m_currentControllerCommand->m_controllerCommandArg], m_currentControllerCommand->m_controllerCommandNode ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Process a request from the Z-Wave PC interface +//----------------------------------------------------------------------------- +void Driver::HandleApplicationSlaveCommandRequest +( + uint8* _data +) +{ + Log::Write( LogLevel_Info, GetNodeNumber( m_currentMsg ), "APPLICATION_SLAVE_COMMAND_HANDLER rxStatus %x dest %d source %d len %d", _data[2], _data[3], _data[4], _data[5] ); + Node* node = GetNodeUnsafe( _data[4] ); + if( node != NULL && _data[5] == 3 && _data[6] == 0x20 && _data[7] == 0x01 ) // only support Basic Set for now + { + map::iterator it = node->m_buttonMap.begin(); + for( ; it != node->m_buttonMap.end(); ++it ) + { + if( it->second == _data[3] ) + break; + } + if( it != node->m_buttonMap.end() ) + { + Notification *notification; + if( _data[8] == 0 ) + { + notification = new Notification( Notification::Type_ButtonOff ); + } + else + { + notification = new Notification( Notification::Type_ButtonOn ); + } + notification->SetHomeAndNodeIds( m_homeId, _data[4] ); + notification->SetButtonId( it->first ); + QueueNotification( notification ); + } + } +} + +//----------------------------------------------------------------------------- +// +// See if we can get node from incoming message data +//----------------------------------------------------------------------------- +uint8 Driver::NodeFromMessage +( + uint8 const* buffer +) +{ + uint8 nodeId = 0; + + if( buffer[1] >= 5 ) + { + switch( buffer[3] ) + { + case FUNC_ID_APPLICATION_COMMAND_HANDLER: nodeId = buffer[5]; break; + case FUNC_ID_ZW_APPLICATION_UPDATE: nodeId = buffer[5]; break; + } + } + return nodeId; +} +//----------------------------------------------------------------------------- +// +// Update a node's routing information +//----------------------------------------------------------------------------- +void Driver::UpdateNodeRoutes +( + uint8 const _nodeId, + bool _doUpdate // = false +) +{ + // Only for routing slaves + Node* node = GetNodeUnsafe( _nodeId ); + if( node != NULL && node->GetBasic() == 0x04 ) + { + uint8 numGroups = GetNumGroups( _nodeId ); + uint8 numNodes = 0; + uint8 nodes[5]; + uint8* associations; + uint8 i; + + // Determine up to 5 destinations + + memset( nodes, 0, sizeof(nodes) ); + for( i = 1; i <= numGroups && numNodes < sizeof(nodes) ; i++ ) + { + associations = NULL; + uint32 len = GetAssociations( _nodeId, i, &associations ); + for( uint8 j = 0; j < len; j++ ) + { + uint8 k; + for( k = 0; k < numNodes; k++ ) + { + if( nodes[k] == associations[j] ) + { + break; + } + } + if( k >= numNodes && numNodes < sizeof(nodes) ) // not in list so add it + { + nodes[numNodes++] = associations[j]; + } + } + if( associations != NULL ) + { + delete [] associations; + } + } + if( _doUpdate || numNodes != node->m_numRouteNodes || memcmp( nodes, node->m_routeNodes, sizeof(node->m_routeNodes) ) != 0 ) + { + // Figure out what to do if one of these fail. + BeginControllerCommand( ControllerCommand_DeleteAllReturnRoutes, NULL, NULL, true, _nodeId, 0 ); + for( i = 0; i < numNodes; i++ ) + { + BeginControllerCommand( ControllerCommand_AssignReturnRoute, NULL, NULL, true, _nodeId, nodes[i] ); + } + node->m_numRouteNodes = numNodes; + memcpy( node->m_routeNodes, nodes, sizeof(nodes) ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Return driver statistics +//----------------------------------------------------------------------------- +void Driver::GetDriverStatistics +( + DriverData* _data +) +{ + _data->m_SOFCnt = m_SOFCnt; + _data->m_ACKWaiting = m_ACKWaiting; + _data->m_readAborts = m_readAborts; + _data->m_badChecksum = m_badChecksum; + _data->m_readCnt = m_readCnt; + _data->m_writeCnt = m_writeCnt; + _data->m_CANCnt = m_CANCnt; + _data->m_NAKCnt = m_NAKCnt; + _data->m_ACKCnt = m_ACKCnt; + _data->m_OOFCnt = m_OOFCnt; + _data->m_dropped = m_dropped; + _data->m_retries = m_retries; + _data->m_callbacks = m_callbacks; + _data->m_badroutes = m_badroutes; + _data->m_noack = m_noack; + _data->m_netbusy = m_netbusy; + _data->m_notidle = m_notidle; + _data->m_nondelivery = m_nondelivery; + _data->m_routedbusy = m_routedbusy; + _data->m_broadcastReadCnt = m_broadcastReadCnt; + _data->m_broadcastWriteCnt = m_broadcastWriteCnt; +} + +//----------------------------------------------------------------------------- +// +// Return per node statistics +//----------------------------------------------------------------------------- +void Driver::GetNodeStatistics +( + uint8 const _nodeId, + Node::NodeData* _data +) +{ + Node* node = GetNode( _nodeId ); + if( node != NULL ) + { + node->GetNodeStatistics( _data ); + ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Report driver statistics to the driver's log +//----------------------------------------------------------------------------- +void Driver::LogDriverStatistics +( +) +{ + DriverData data; + + GetDriverStatistics(&data); + int32 totalElapsed = -m_startTime.TimeRemaining(); + int32 days = totalElapsed / (1000*60*60*24); + + totalElapsed -= days*1000*60*60*24; + int32 hours = totalElapsed/(1000*60*60); + + totalElapsed -= hours*1000*60*60; + int32 minutes = totalElapsed/(1000*60); + + Log::Write( LogLevel_Always, "***************************************************************************" ); + Log::Write( LogLevel_Always, "********************* Cumulative Network Statistics *********************" ); + Log::Write( LogLevel_Always, "*** General" ); + Log::Write( LogLevel_Always, "Driver run time: . . . %ld days, %ld hours, %ld minutes", days, hours, minutes); + Log::Write( LogLevel_Always, "Frames processed: . . . . . . . . . . . . . . . . . . . . %ld", data.m_SOFCnt ); + Log::Write( LogLevel_Always, "Total messages successfully received: . . . . . . . . . . %ld", data.m_readCnt ); + Log::Write( LogLevel_Always, "Total Messages successfully sent: . . . . . . . . . . . . %ld", data.m_writeCnt ); + Log::Write( LogLevel_Always, "ACKs received from controller: . . . . . . . . . . . . . %ld", data.m_ACKCnt ); + // Consider tracking and adding: + // Initialization messages + // Ad-hoc command messages + // Polling messages + // Messages inititated by network + // Others? + Log::Write( LogLevel_Always, "*** Errors" ); + Log::Write( LogLevel_Always, "Unsolicited messages received while waiting for ACK: . . %ld", data.m_ACKWaiting ); + Log::Write( LogLevel_Always, "Reads aborted due to timeouts: . . . . . . . . . . . . . %ld", data.m_readAborts ); + Log::Write( LogLevel_Always, "Bad checksum errors: . . . . . . . . . . . . . . . . . . %ld", data.m_badChecksum ); + Log::Write( LogLevel_Always, "CANs received from controller: . . . . . . . . . . . . . %ld", data.m_CANCnt ); + Log::Write( LogLevel_Always, "NAKs received from controller: . . . . . . . . . . . . . %ld", data.m_NAKCnt ); + Log::Write( LogLevel_Always, "Out of frame data flow errors: . . . . . . . . . . . . . %ld", data.m_OOFCnt ); + Log::Write( LogLevel_Always, "Messages retransmitted: . . . . . . . . . . . . . . . . . %ld", data.m_retries ); + Log::Write( LogLevel_Always, "Messages dropped and not delivered: . . . . . . . . . . . %ld", data.m_dropped ); + Log::Write( LogLevel_Always, "***************************************************************************" ); +} + +//----------------------------------------------------------------------------- +// +// Get the Network Key we will use for Security Command Class +//----------------------------------------------------------------------------- +uint8 *Driver::GetNetworkKey() { + std::string networkKey; + std::vector elems; + unsigned int tempkey[16]; + static uint8 keybytes[16]; + static bool keySet = false; + if (keySet == false) { + Options::Get()->GetOptionAsString("NetworkKey", &networkKey ); + OpenZWave::split(elems, networkKey, ",", true); + if (elems.size() != 16) { + Log::Write(LogLevel_Warning, "Invalid Network Key. Does not contain 16 Bytes - Contains %d", elems.size()); + Log::Write(LogLevel_Warning, "Raw Key: %s", networkKey.c_str()); + Log::Write(LogLevel_Warning, "Parsed Key:"); + int i = 0; + for (std::vector::iterator it = elems.begin(); it != elems.end(); it++) + Log::Write(LogLevel_Warning, "%d) - %s", ++i, (*it).c_str()); + assert(0); + exit(-1); + } + int i = 0; + for (std::vector::iterator it = elems.begin(); it != elems.end(); it++) { + if (0 == sscanf(OpenZWave::trim(*it).c_str(), "%x", &tempkey[i])) { + Log::Write(LogLevel_Warning, "Cannot Convert Network Key Byte %s to Key", (*it).c_str()); + assert(0); + exit(-1); + } else { + keybytes[i] = (tempkey[i] & 0xFF); + } + i++; + } + keySet = true; + } + return keybytes; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/Driver.h b/lib/ESPiLight/pilight/libs/openzwave/Driver.h new file mode 100644 index 0000000..79d1e4b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Driver.h @@ -0,0 +1,856 @@ +//----------------------------------------------------------------------------- +// +// Driver.h +// +// Communicates with a Z-Wave network +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Driver_H +#define _Driver_H + +#include +#include +#include + +#include "Defs.h" +#include "value_classes/ValueID.h" +#include "Node.h" +#include "platform/Event.h" +#include "platform/Mutex.h" +#include "platform/TimeStamp.h" + +namespace OpenZWave +{ + class Msg; + class Value; + class Event; + class Mutex; + class Controller; + class Thread; + class ControllerReplication; + class Notification; + + /** \brief The Driver class handles communication between OpenZWave + * and a device attached via a serial port (typically a controller). + */ + class OPENZWAVE_EXPORT Driver + { + friend class Manager; + friend class Node; + friend class Group; + friend class CommandClass; + friend class ControllerReplication; + friend class Value; + friend class ValueStore; + friend class ValueButton; + friend class Association; + friend class Basic; + friend class ManufacturerSpecific; + friend class NodeNaming; + friend class NoOperation; + friend class SceneActivation; + friend class WakeUp; + friend class Security; + + //----------------------------------------------------------------------------- + // Controller Interfaces + //----------------------------------------------------------------------------- + public: + enum ControllerInterface + { + ControllerInterface_Unknown = 0, + ControllerInterface_Serial, + ControllerInterface_Hid + }; + + //----------------------------------------------------------------------------- + // Construction / Destruction + //----------------------------------------------------------------------------- + private: + /** + * Creates threads, events and initializes member variables and the node array. + */ + Driver( string const& _controllerPath, ControllerInterface const& _interface ); + /** Sets "exit" flags and stops the three background threads (pollThread, serialThread + * and driverThread). Then clears out the send queue and node array. Notifies + * watchers and exits. + */ + virtual ~Driver(); + + /** + * Start the driverThread + */ + void Start(); + /** + * Entry point for driverThread + */ + static void DriverThreadEntryPoint( Event* _exitEvent, void* _context ); + /** + * ThreadProc for driverThread. This is where all the "action" takes place. + *

        + * First, the thread is initialized by calling Init(). If Init() fails, it will be retried + * every 5 seconds for the first two minutes and every 30 seconds thereafter. + *

        + * After the thread is successfully initialized, the thread enters a loop with the + * following elements: + * - Confirm that m_exit is still false (or exit from the thread if it is true) + * - Call ReadMsg() to consume any available messages from the controller + * - Call NotifyWatchers() to send any pending notifications + * - If the thread is not waiting for an ACK, a callback or a message reply, send [any][the next] queued message[s] + * - If there was no message read or sent (workDone=false), sleep for 5 seconds. If nothing happened + * within this time frame and something was expected (ACK, callback or reply), retrieve the + * last message from the send queue and examine GetSendAttempts(). If greater than 2, give up + * and remove the message from the queue. Otherwise, resend the message. + * - If something did happen [reset m_wakeEvent] + */ + void DriverThreadProc( Event* _exitEvent ); + /** + * Initialize the controller. Open the specified serial port, start the serialThread + * and pollThread, then send a NAK to the device [presumably to flush it]. + *

        + * Then queue the commands to retrieve the Z-Wave interface: + * - Get version + * - Get home and node IDs + * - Get controller capabilities + * - Get serial API capabilties + * - [Get SUC node ID] + * - Get init data [identifying the nodes on the network] + * Init() will return false if the serial port could not be opened. + */ + bool Init( uint32 _attempts ); + + /** + * Remove any messages to a node on the queues + * Used when deleting a node. + */ + void RemoveQueues( uint8 const _nodeId ); + + Thread* m_driverThread; /**< Thread for reading from the Z-Wave controller, and for creating and managing the other threads for sending, polling etc. */ + bool m_exit; /**< Flag that is set when the application is exiting. */ + bool m_init; /**< Set to true once the driver has been initialised */ + bool m_awakeNodesQueried; /**< Set to true once the driver has polled all awake nodes */ + bool m_allNodesQueried; /**< Set to true once the driver has polled all nodes */ + bool m_notifytransactions; + TimeStamp m_startTime; /**< Time this driver started (for log report purposes) */ + + //----------------------------------------------------------------------------- + // Configuration + //----------------------------------------------------------------------------- + private: + void RequestConfig(); // Get the network configuration from the Z-Wave network + bool ReadConfig(); // Read the configuration from a file + void WriteConfig(); // Save the configuration to a file + + //----------------------------------------------------------------------------- + // Controller + //----------------------------------------------------------------------------- + private: + // Controller Capabilities (return in FUNC_ID_ZW_GET_CONTROLLER_CAPABILITIES) + enum + { + ControllerCaps_Secondary = 0x01, /**< The controller is a secondary. */ + ControllerCaps_OnOtherNetwork = 0x02, /**< The controller is not using its default HomeID. */ + ControllerCaps_SIS = 0x04, /**< There is a SUC ID Server on the network. */ + ControllerCaps_RealPrimary = 0x08, /**< Controller was the primary before the SIS was added. */ + ControllerCaps_SUC = 0x10 /**< Controller is a static update controller. */ + }; + + // Init Capabilities (return in FUNC_ID_SERIAL_API_GET_INIT_DATA) + enum + { + InitCaps_Slave = 0x01, /**< */ + InitCaps_TimerSupport = 0x02, /**< Controller supports timers. */ + InitCaps_Secondary = 0x04, /**< Controller is a secondary. */ + InitCaps_SUC = 0x08 /**< Controller is a static update controller. */ + }; + + bool IsPrimaryController()const{ return ((m_initCaps & InitCaps_Secondary) == 0); } + bool IsStaticUpdateController()const{ return ((m_initCaps & InitCaps_SUC) != 0); } + bool IsBridgeController()const{ return (m_libraryType == 7); } + bool IsInclusionController()const{ return ((m_controllerCaps & ControllerCaps_SIS) != 0); } + + + uint32 GetHomeId()const{ return m_homeId; } + uint8 GetNodeId()const{ return m_nodeId; } + uint8 GetSUCNodeId()const{ return m_SUCNodeId; } + uint16 GetManufacturerId()const{ return m_manufacturerId; } + uint16 GetProductType()const{ return m_productType; } + uint16 GetProductId()const{ return m_productId; } + string GetControllerPath()const{ return m_controllerPath; } + ControllerInterface GetControllerInterfaceType()const{ return m_controllerInterfaceType; } + string GetLibraryVersion()const{ return m_libraryVersion; } + string GetLibraryTypeName()const{ return m_libraryTypeName; } + int32 GetSendQueueCount()const + { + int32 count = 0; + for( int32 i=0; i + * The response message contains a bitmap identifying which of the 232 possible nodes + * in the network are actually present. These bitmap values are compared with the + * node map (read in from zwcfg_0x[homeid].xml) to see if the node has already been registered + * by the OpenZWave library. If it has (the log will show it as "Known") and this is + * the first time this message was sent (m_init is false), then AddNodeQuery() is called + * to retrieve its current state. If this is a "New" node to OpenZWave, then InitNode() + * is called. + * \see AddNodeQuery, InitNode, GetNode, ReleaseNodes + */ + void HandleSerialAPIGetInitDataResponse( uint8* _data ); + void HandleGetNodeProtocolInfoResponse( uint8* _data ); + bool HandleRemoveFailedNodeResponse( uint8* _data ); + void HandleIsFailedNodeResponse( uint8* _data ); + bool HandleReplaceFailedNodeResponse( uint8* _data ); + bool HandleAssignReturnRouteResponse( uint8* _data ); + bool HandleDeleteReturnRouteResponse( uint8* _data ); + void HandleSendNodeInformationRequest( uint8* _data ); + void HandleSendDataResponse( uint8* _data, bool _replication ); + bool HandleNetworkUpdateResponse( uint8* _data ); + void HandleGetRoutingInfoResponse( uint8* _data ); + + void HandleSendDataRequest( uint8* _data, bool _replication ); + void HandleAddNodeToNetworkRequest( uint8* _data ); + void HandleCreateNewPrimaryRequest( uint8* _data ); + void HandleControllerChangeRequest( uint8* _data ); + void HandleSetLearnModeRequest( uint8* _data ); + void HandleRemoveFailedNodeRequest( uint8* _data ); + void HandleReplaceFailedNodeRequest( uint8* _data ); + void HandleRemoveNodeFromNetworkRequest( uint8* _data ); + void HandleApplicationCommandHandlerRequest( uint8* _data ); + void HandlePromiscuousApplicationCommandHandlerRequest( uint8* _data ); + void HandleAssignReturnRouteRequest( uint8* _data ); + void HandleDeleteReturnRouteRequest( uint8* _data ); + void HandleNodeNeighborUpdateRequest( uint8* _data ); + void HandleNetworkUpdateRequest( uint8* _data ); + bool HandleApplicationUpdateRequest( uint8* _data ); + bool HandleRfPowerLevelSetResponse( uint8* _data ); + bool HandleSerialApiSetTimeoutsResponse( uint8* _data ); + bool HandleMemoryGetByteResponse( uint8* _data ); + bool HandleReadMemoryResponse( uint8* _data ); + void HandleGetVirtualNodesResponse( uint8* _data ); + bool HandleSetSlaveLearnModeResponse( uint8* _data ); + void HandleSetSlaveLearnModeRequest( uint8* _data ); + bool HandleSendSlaveNodeInfoResponse( uint8* _data ); + void HandleSendSlaveNodeInfoRequest( uint8* _data ); + void HandleApplicationSlaveCommandRequest( uint8* _data ); + void HandleSerialAPIResetRequest( uint8* _data ); + + void CommonAddNodeStatusRequestHandler( uint8 _funcId, uint8* _data ); + + bool m_waitingForAck; // True when we are waiting for an ACK from the dongle + uint8 m_expectedCallbackId; // If non-zero, we wait for a message with this callback Id + uint8 m_expectedReply; // If non-zero, we wait for a message with this function Id + uint8 m_expectedCommandClassId; // If the expected reply is FUNC_ID_APPLICATION_COMMAND_HANDLER, this value stores the command class we're waiting to hear from + uint8 m_expectedNodeId; // If we are waiting for a FUNC_ID_APPLICATION_COMMAND_HANDLER, make sure we only accept it from this node. + + //----------------------------------------------------------------------------- + // Polling Z-Wave devices + //----------------------------------------------------------------------------- + private: + int32 GetPollInterval(){ return m_pollInterval ; } + void SetPollInterval( int32 _milliseconds, bool _bIntervalBetweenPolls ){ m_pollInterval = _milliseconds; m_bIntervalBetweenPolls = _bIntervalBetweenPolls; } + bool EnablePoll( const ValueID &_valueId, uint8 _intensity = 1 ); + bool DisablePoll( const ValueID &_valueId ); + bool isPolled( const ValueID &_valueId ); + void SetPollIntensity( const ValueID &_valueId, uint8 _intensity ); + static void PollThreadEntryPoint( Event* _exitEvent, void* _context ); + void PollThreadProc( Event* _exitEvent ); + + Thread* m_pollThread; // Thread for polling devices on the Z-Wave network + struct PollEntry + { + ValueID m_id; + uint8 m_pollCounter; + }; +OPENZWAVE_EXPORT_WARNINGS_OFF + list m_pollList; // List of nodes that need to be polled +OPENZWAVE_EXPORT_WARNINGS_ON + Mutex* m_pollMutex; // Serialize access to the polling list + int32 m_pollInterval; // Time interval during which all nodes must be polled + bool m_bIntervalBetweenPolls; // if true, the library intersperses m_pollInterval between polls; if false, the library attempts to complete all polls within m_pollInterval + + //----------------------------------------------------------------------------- + // Retrieving Node information + //----------------------------------------------------------------------------- + public: + uint8 GetNodeNumber( Msg const* _msg )const{ return ( _msg == NULL ? 0 : _msg->GetTargetNodeId() ); } + + private: + /** + * Creates a new Node object (deleting any previous Node object with the same nodeId) and + * queues a full query of the node's parameters (starting at the beginning of the query + * stages--Node::QueryStage_None). This function will send Notification::Type_NodeAdded + * and Notification::Type_NodeRemoved messages to identify these modifications. + * \param _nodeId The node ID of the node to create and query. + * \see Notification::Type_NodeAdded, Notification::Type_NodeRemoved, Node::QueryStage_None, + */ + void InitNode( uint8 const _nodeId, bool newNode = false ); + + void InitAllNodes(); // Delete all nodes and fetch the data from the Z-Wave network again. + + bool IsNodeListeningDevice( uint8 const _nodeId ); + bool IsNodeFrequentListeningDevice( uint8 const _nodeId ); + bool IsNodeBeamingDevice( uint8 const _nodeId ); + bool IsNodeRoutingDevice( uint8 const _nodeId ); + bool IsNodeSecurityDevice( uint8 const _nodeId ); + uint32 GetNodeMaxBaudRate( uint8 const _nodeId ); + uint8 GetNodeVersion( uint8 const _nodeId ); + uint8 GetNodeSecurity( uint8 const _nodeId ); + uint8 GetNodeBasic( uint8 const _nodeId ); + uint8 GetNodeGeneric( uint8 const _nodeId ); + uint8 GetNodeSpecific( uint8 const _nodeId ); + string GetNodeType( uint8 const _nodeId ); + uint32 GetNodeNeighbors( uint8 const _nodeId, uint8** o_neighbors ); + + string GetNodeManufacturerName( uint8 const _nodeId ); + string GetNodeProductName( uint8 const _nodeId ); + string GetNodeName( uint8 const _nodeId ); + string GetNodeLocation( uint8 const _nodeId ); + + string GetNodeManufacturerId( uint8 const _nodeId ); + string GetNodeProductType( uint8 const _nodeId ); + string GetNodeProductId( uint8 const _nodeId ); + void SetNodeManufacturerName( uint8 const _nodeId, string const& _manufacturerName ); + void SetNodeProductName( uint8 const _nodeId, string const& _productName ); + void SetNodeName( uint8 const _nodeId, string const& _nodeName ); + void SetNodeLocation( uint8 const _nodeId, string const& _location ); + void SetNodeLevel( uint8 const _nodeId, uint8 const _level ); + void SetNodeOn( uint8 const _nodeId ); + void SetNodeOff( uint8 const _nodeId ); + + Value* GetValue( ValueID const& _id ); + + bool IsAPICallSupported( uint8 const _apinum )const{ return (( m_apiMask[( _apinum - 1 ) >> 3] & ( 1 << (( _apinum - 1 ) & 0x07 ))) != 0 ); } + void SetAPICall( uint8 const _apinum, bool _toSet ) + { + if( _toSet ) + { + m_apiMask[( _apinum - 1 ) >> 3] |= ( 1 << (( _apinum - 1 ) & 0x07 )); + } + else + { + m_apiMask[( _apinum - 1 ) >> 3] &= ~( 1 << (( _apinum - 1 ) & 0x07 )); + } + } + uint8 NodeFromMessage( uint8 const* buffer ); + + //----------------------------------------------------------------------------- + // Controller commands + //----------------------------------------------------------------------------- + public: + /** + * Controller Commands. + * Commands to be used with the BeginControllerCommand method. + * \see Manager::BeginControllerCommand + */ + enum ControllerCommand + { + ControllerCommand_None = 0, /**< No command. */ + ControllerCommand_AddDevice, /**< Add a new device or controller to the Z-Wave network. */ + ControllerCommand_CreateNewPrimary, /**< Add a new controller to the Z-Wave network. Used when old primary fails. Requires SUC. */ + ControllerCommand_ReceiveConfiguration, /**< Receive Z-Wave network configuration information from another controller. */ + ControllerCommand_RemoveDevice, /**< Remove a device or controller from the Z-Wave network. */ + ControllerCommand_RemoveFailedNode, /**< Move a node to the controller's failed nodes list. This command will only work if the node cannot respond. */ + ControllerCommand_HasNodeFailed, /**< Check whether a node is in the controller's failed nodes list. */ + ControllerCommand_ReplaceFailedNode, /**< Replace a non-responding node with another. The node must be in the controller's list of failed nodes for this command to succeed. */ + ControllerCommand_TransferPrimaryRole, /**< Make a different controller the primary. */ + ControllerCommand_RequestNetworkUpdate, /**< Request network information from the SUC/SIS. */ + ControllerCommand_RequestNodeNeighborUpdate, /**< Get a node to rebuild its neighbour list. This method also does RequestNodeNeighbors */ + ControllerCommand_AssignReturnRoute, /**< Assign a network return routes to a device. */ + ControllerCommand_DeleteAllReturnRoutes, /**< Delete all return routes from a device. */ + ControllerCommand_SendNodeInformation, /**< Send a node information frame */ + ControllerCommand_ReplicationSend, /**< Send information from primary to secondary */ + ControllerCommand_CreateButton, /**< Create an id that tracks handheld button presses */ + ControllerCommand_DeleteButton /**< Delete id that tracks handheld button presses */ + }; + + /** + * Controller States. + * States reported via the callback handler passed into the BeginControllerCommand method. + * \see Manager::BeginControllerCommand + */ + enum ControllerState + { + ControllerState_Normal = 0, /**< No command in progress. */ + ControllerState_Starting, /**< The command is starting. */ + ControllerState_Cancel, /**< The command was cancelled. */ + ControllerState_Error, /**< Command invocation had error(s) and was aborted */ + ControllerState_Waiting, /**< Controller is waiting for a user action. */ + ControllerState_Sleeping, /**< Controller command is on a sleep queue wait for device. */ + ControllerState_InProgress, /**< The controller is communicating with the other device to carry out the command. */ + ControllerState_Completed, /**< The command has completed successfully. */ + ControllerState_Failed, /**< The command has failed. */ + ControllerState_NodeOK, /**< Used only with ControllerCommand_HasNodeFailed to indicate that the controller thinks the node is OK. */ + ControllerState_NodeFailed /**< Used only with ControllerCommand_HasNodeFailed to indicate that the controller thinks the node has failed. */ + }; + + /** + * Controller Errors + * Provide some more information about controller failures. + */ + enum ControllerError + { + ControllerError_None = 0, + ControllerError_ButtonNotFound, /**< Button */ + ControllerError_NodeNotFound, /**< Button */ + ControllerError_NotBridge, /**< Button */ + ControllerError_NotSUC, /**< CreateNewPrimary */ + ControllerError_NotSecondary, /**< CreateNewPrimary */ + ControllerError_NotPrimary, /**< RemoveFailedNode, AddNodeToNetwork */ + ControllerError_IsPrimary, /**< ReceiveConfiguration */ + ControllerError_NotFound, /**< RemoveFailedNode */ + ControllerError_Busy, /**< RemoveFailedNode, RequestNetworkUpdate */ + ControllerError_Failed, /**< RemoveFailedNode, RequestNetworkUpdate */ + ControllerError_Disabled, /**< RequestNetworkUpdate error */ + ControllerError_Overflow /**< RequestNetworkUpdate error */ + }; + + typedef void (*pfnControllerCallback_t)( ControllerState _state, ControllerError _err, void* _context ); + + private: + // The public interface is provided via the wrappers in the Manager class + void ResetController( Event* _evt ); + void SoftReset(); + void RequestNodeNeighbors( uint8 const _nodeId, uint32 const _requestFlags ); + + bool BeginControllerCommand( ControllerCommand _command, pfnControllerCallback_t _callback, void* _context, bool _highPower, uint8 _nodeId, uint8 _arg ); + bool CancelControllerCommand(); + void AddNodeStop( uint8 const _funcId ); // Handle different controller behaviors + + struct ControllerCommandItem + { + ControllerState m_controllerState; + bool m_controllerStateChanged; + bool m_controllerCommandDone; + ControllerCommand m_controllerCommand; + pfnControllerCallback_t m_controllerCallback; + ControllerError m_controllerReturnError; + void* m_controllerCallbackContext; + bool m_highPower; + bool m_controllerAdded; + uint8 m_controllerCommandNode; + uint8 m_controllerCommandArg; + }; + + ControllerCommandItem* m_currentControllerCommand; + + void DoControllerCommand(); + void UpdateControllerState( ControllerState const _state, ControllerError const _error = ControllerError_None ) + { + if( m_currentControllerCommand != NULL ) + { + if( _state != m_currentControllerCommand->m_controllerState ) + { + m_currentControllerCommand->m_controllerStateChanged = true; + m_currentControllerCommand->m_controllerState = _state; + switch( _state ) + { + case ControllerState_Error: + case ControllerState_Cancel: + case ControllerState_Failed: + case ControllerState_Sleeping: + case ControllerState_NodeFailed: + case ControllerState_NodeOK: + case ControllerState_Completed: + { + m_currentControllerCommand->m_controllerCommandDone = true; + m_sendMutex->Lock(); + m_queueEvent[MsgQueue_Controller]->Set(); + m_sendMutex->Unlock(); + break; + } + default: + { + break; + } + } + + } + if( _error != ControllerError_None ) + { + m_currentControllerCommand->m_controllerReturnError = _error; + } + } + } + + uint8 m_SUCNodeId; + + void UpdateNodeRoutes( uint8 const_nodeId, bool _doUpdate = false ); + + Event* m_controllerResetEvent; + + //----------------------------------------------------------------------------- + // Sending Z-Wave messages + //----------------------------------------------------------------------------- + public: + enum MsgQueue + { + MsgQueue_Command = 0, + MsgQueue_Security, + MsgQueue_NoOp, + MsgQueue_Controller, + MsgQueue_WakeUp, + MsgQueue_Send, + MsgQueue_Query, + MsgQueue_Poll, + MsgQueue_Count // Number of message queues + }; + + void SendMsg( Msg* _msg, MsgQueue const _queue ); + + /** + * Fetch the transmit options + */ + uint8 GetTransmitOptions()const{ return m_transmitOptions; } + + private: + /** + * If there are messages in the send queue (m_sendQueue), gets the next message in the + * queue and writes it to the serial port. In sending the message, SendMsg also initializes + * variables tracking the message's callback ID (m_expectedCallbackId), expected reply + * (m_expectedReply) and expected command class ID (m_expectedCommandClassId). It also + * sets m_waitingForAck to true and increments the message's send attempts counter. + *

        + * If there are no messages in the send queue, then SendMsg checks the query queue to + * see if there are any outstanding queries that can be processed (target node not asleep). + * If so, it retrieves the Node object that needs to be queried and calls that node's + * AdvanceQueries member function. If this call results in all of the node's queries to be + * completed, SendMsg will remove the node query item from the query queue. + * \return TRUE if data was written, FALSE if not + * \see Msg, m_sendQueue, m_expectedCallbackId, m_expectedReply, m_expectedCommandClassId, + * m_waitingForAck, Msg::GetSendAttempts, Node::AdvanceQueries, GetCurrentNodeQuery, + * RemoveNodeQuery, Node::AllQueriesCompleted + */ + bool WriteNextMsg( MsgQueue const _queue ); // Extracts the first message from the queue, and makes it the current one. + bool WriteMsg( string const &str); // Sends the current message to the Z-Wave network + void RemoveCurrentMsg(); // Deletes the current message and cleans up the callback etc states + bool MoveMessagesToWakeUpQueue( uint8 const _targetNodeId, bool const _move ); // If a node does not respond, and is of a type that can sleep, this method is used to move all its pending messages to another queue ready for when it mext wakes up. + bool HandleErrorResponse( uint8 const _error, uint8 const _nodeId, char const* _funcStr, bool _sleepCheck = false ); // Handle data errors and process consistently. If message is moved to wake-up queue, return true. + bool IsExpectedReply( uint8 const _nodeId ); // Determine if reply message is the one we are expecting + void SendQueryStageComplete( uint8 const _nodeId, Node::QueryStage const _stage ); + void RetryQueryStageComplete( uint8 const _nodeId, Node::QueryStage const _stage ); + void CheckCompletedNodeQueries(); // Send notifications if all awake and/or sleeping nodes have completed their queries + + // Requests to be sent to nodes are assigned to one of five queues. + // From highest to lowest priority, these are + // + // 0) The security queue, for handling encrypted messages. This is the + // highest priority send queue, because the security process inserts + // messages to handle the encryption process that must be sent before + // a new message can be wrapped. + // + // 1) The command queue, for controller commands. This is the 2nd highest + // priority send queue, because the controller command processes are not + // permitted to be interupted by other requests. + // + // 2) The controller queue exists to handle multi-step controller commands. These + // typically require user interaction or affect the network in some way. + // + // 3) The No Operation command class queue. This is used for device probing + // at startup as well as network diagostics. + // + // 4) The wakeup queue. This holds messages that have been held for a + // sleeping device that has now woken up. These get a high priority + // because such devices do not stay awake for very long. + // + // 5) The send queue. This is for normal messages, usually triggered by + // a user interaction with the application. + // + // 6) The query queue. For node query messages sent when a new node is + // discovered. The query process generates a large number of requests, + // so the query queue has a low priority to avoid making the system + // unresponsive. + // + // 7) The poll queue. Requests to devices that need their state polling + // at regular intervals. These are of the lowest priority, and are only + // sent when nothing else is going on + // + enum MsgQueueCmd + { + MsgQueueCmd_SendMsg = 0, + MsgQueueCmd_QueryStageComplete, + MsgQueueCmd_Controller + }; + + class MsgQueueItem + { + public: + MsgQueueItem() : + m_msg(NULL), + m_nodeId(0), + m_queryStage(Node::QueryStage_None), + m_retry(false), + m_cci(NULL) + {} + + bool operator == ( MsgQueueItem const& _other )const + { + if( _other.m_command == m_command ) + { + if( m_command == MsgQueueCmd_SendMsg ) + { + return( (*_other.m_msg) == (*m_msg) ); + } + else if( m_command == MsgQueueCmd_QueryStageComplete ) + { + return( (_other.m_nodeId == m_nodeId) && (_other.m_queryStage == m_queryStage) ); + } + else if( m_command == MsgQueueCmd_Controller ) + { + return( (_other.m_cci->m_controllerCommand == m_cci->m_controllerCommand) && (_other.m_cci->m_controllerCallback == m_cci->m_controllerCallback) ); + } + } + + return false; + } + + MsgQueueCmd m_command; + Msg* m_msg; + uint8 m_nodeId; + Node::QueryStage m_queryStage; + bool m_retry; + ControllerCommandItem* m_cci; + }; + +OPENZWAVE_EXPORT_WARNINGS_OFF + list m_msgQueue[MsgQueue_Count]; +OPENZWAVE_EXPORT_WARNINGS_ON + Event* m_queueEvent[MsgQueue_Count]; // Events for each queue, which are signalled when the queue is not empty + Mutex* m_sendMutex; // Serialize access to the queues + Msg* m_currentMsg; + MsgQueue m_currentMsgQueueSource; // identifies which queue held m_currentMsg + TimeStamp m_resendTimeStamp; + + //----------------------------------------------------------------------------- + // Network functions + //----------------------------------------------------------------------------- + private: + void TestNetwork( uint8 const _nodeId, uint32 const _count ); + + //----------------------------------------------------------------------------- + // Virtual Node commands + //----------------------------------------------------------------------------- + public: + /** + * Virtual Node Commands. + * Commands to be used with virtual nodes. + */ + private: + uint32 GetVirtualNeighbors( uint8** o_neighbors ); + void RequestVirtualNeighbors( MsgQueue const _queue ); + bool IsVirtualNode( uint8 const _nodeId )const{ return (( m_virtualNeighbors[( _nodeId - 1 ) >> 3] & 1 << (( _nodeId - 1 ) & 0x07 )) != 0 ); } + void SendVirtualNodeInfo( uint8 const _fromNodeId, uint8 const _ToNodeId ); + void SendSlaveLearnModeOff(); + void SaveButtons(); + void ReadButtons( uint8 const _nodeId ); + + bool m_virtualNeighborsReceived; + uint8 m_virtualNeighbors[NUM_NODE_BITFIELD_BYTES]; // Bitmask containing virtual neighbors + + //----------------------------------------------------------------------------- + // SwitchAll + //----------------------------------------------------------------------------- + private: + // The public interface is provided via the wrappers in the Manager class + void SwitchAllOn(); + void SwitchAllOff(); + + //----------------------------------------------------------------------------- + // Configuration Parameters (wrappers for the Node methods) + //----------------------------------------------------------------------------- + private: + // The public interface is provided via the wrappers in the Manager class + bool SetConfigParam( uint8 const _nodeId, uint8 const _param, int32 _value, uint8 const _size ); + void RequestConfigParam( uint8 const _nodeId, uint8 const _param ); + + //----------------------------------------------------------------------------- + // Groups (wrappers for the Node methods) + //----------------------------------------------------------------------------- + private: + // The public interface is provided via the wrappers in the Manager class + uint8 GetNumGroups( uint8 const _nodeId ); + uint32 GetAssociations( uint8 const _nodeId, uint8 const _groupIdx, uint8** o_associations ); + uint8 GetMaxAssociations( uint8 const _nodeId, uint8 const _groupIdx ); + string GetGroupLabel( uint8 const _nodeId, uint8 const _groupIdx ); + void AddAssociation( uint8 const _nodeId, uint8 const _groupIdx, uint8 const _targetNodeId ); + void RemoveAssociation( uint8 const _nodeId, uint8 const _groupIdx, uint8 const _targetNodeId ); + + //----------------------------------------------------------------------------- + // Notifications + //----------------------------------------------------------------------------- + private: + void QueueNotification( Notification* _notification ); // Adds a notification to the list. Notifications are queued until a point in the thread where we know we do not have any nodes locked. + void NotifyWatchers(); // Passes the notifications to all the registered watcher callbacks in turn. + +OPENZWAVE_EXPORT_WARNINGS_OFF + list m_notifications; +OPENZWAVE_EXPORT_WARNINGS_ON + Event* m_notificationsEvent; + + //----------------------------------------------------------------------------- + // Statistics + //----------------------------------------------------------------------------- + public: + struct DriverData + { + uint32 m_SOFCnt; // Number of SOF bytes received + uint32 m_ACKWaiting; // Number of unsolicited messages while waiting for an ACK + uint32 m_readAborts; // Number of times read were aborted due to timeouts + uint32 m_badChecksum; // Number of bad checksums + uint32 m_readCnt; // Number of messages successfully read + uint32 m_writeCnt; // Number of messages successfully sent + uint32 m_CANCnt; // Number of CAN bytes received + uint32 m_NAKCnt; // Number of NAK bytes received + uint32 m_ACKCnt; // Number of ACK bytes received + uint32 m_OOFCnt; // Number of bytes out of framing + uint32 m_dropped; // Number of messages dropped & not delivered + uint32 m_retries; // Number of messages retransmitted + uint32 m_callbacks; // Number of unexpected callbacks + uint32 m_badroutes; // Number of failed messages due to bad route response + uint32 m_noack; // Number of no ACK returned errors + uint32 m_netbusy; // Number of network busy/failure messages + uint32 m_notidle; + uint32 m_nondelivery; // Number of messages not delivered to network + uint32 m_routedbusy; // Number of messages received with routed busy status + uint32 m_broadcastReadCnt; // Number of broadcasts read + uint32 m_broadcastWriteCnt; // Number of broadcasts sent + }; + + void LogDriverStatistics(); + + private: + void GetDriverStatistics( DriverData* _data ); + void GetNodeStatistics( uint8 const _nodeId, Node::NodeData* _data ); + + uint32 m_SOFCnt; // Number of SOF bytes received + uint32 m_ACKWaiting; // Number of unsolcited messages while waiting for an ACK + uint32 m_readAborts; // Number of times read were aborted due to timeouts + uint32 m_badChecksum; // Number of bad checksums + uint32 m_readCnt; // Number of messages successfully read + uint32 m_writeCnt; // Number of messages successfully sent + uint32 m_CANCnt; // Number of CAN bytes received + uint32 m_NAKCnt; // Number of NAK bytes received + uint32 m_ACKCnt; // Number of ACK bytes received + uint32 m_OOFCnt; // Number of bytes out of framing + uint32 m_dropped; // Number of messages dropped & not delivered + uint32 m_retries; // Number of retransmitted messages + uint32 m_callbacks; // Number of unexpected callbacks + uint32 m_badroutes; // Number of failed messages due to bad route response + uint32 m_noack; // Number of no ACK returned errors + uint32 m_netbusy; // Number of network busy/failure messages + uint32 m_notidle; // Number of not idle messages + uint32 m_nondelivery; // Number of messages not delivered to network + uint32 m_routedbusy; // Number of messages received with routed busy status + uint32 m_broadcastReadCnt; // Number of broadcasts read + uint32 m_broadcastWriteCnt; // Number of broadcasts sent + //time_t m_commandStart; // Start time of last command + //time_t m_timeoutLost; // Cumulative time lost to timeouts + + + //----------------------------------------------------------------------------- + // Security Command Class Related (Version 1.1) + //----------------------------------------------------------------------------- + private: + uint8 *GetNetworkKey(); + }; + +} // namespace OpenZWave + +#endif // _Driver_H diff --git a/lib/ESPiLight/pilight/libs/openzwave/Group.cpp b/lib/ESPiLight/pilight/libs/openzwave/Group.cpp new file mode 100644 index 0000000..acd1776 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Group.cpp @@ -0,0 +1,422 @@ +//----------------------------------------------------------------------------- +// +// Group.cpp +// +// A set of associations in a Z-Wave device. +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include +#include "Group.h" +#include "Manager.h" +#include "Driver.h" +#include "Node.h" +#include "Notification.h" +#include "Options.h" +#include "command_classes/Association.h" +#include "command_classes/AssociationCommandConfiguration.h" + +#include "tinyxml.h" + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Group::Group +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _groupIdx, + uint8 const _maxAssociations +): + m_homeId( _homeId ), + m_nodeId( _nodeId ), + m_groupIdx( _groupIdx ), + m_maxAssociations( _maxAssociations ), + m_auto( false ) +{ + char str[16]; + snprintf( str, sizeof(str), "Group %d", m_groupIdx ); + m_label = str; + + // Auto-association by default is with group 1 or 255, with group 1 taking precedence. + // Group 255 is always created first, so if this is group 1, we need to turn off the + // auto flag in group 255. All this messing about is to support the various behaviours + // of certain Cooper devices. + if( _groupIdx == 255 ) + { + m_auto = true; + } + else if( _groupIdx == 1 ) + { + m_auto = true; + + // Clear the flag from Group 255, if it exists. + if( Driver* driver = Manager::Get()->GetDriver( m_homeId ) ) + { + if( Node* node = driver->GetNodeUnsafe( m_nodeId ) ) + { + if( Group* group = node->GetGroup( 255 ) ) + { + group->SetAuto( false ); + } + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Constructor (from XML) +//----------------------------------------------------------------------------- +Group::Group +( + uint32 const _homeId, + uint8 const _nodeId, + TiXmlElement const* _groupElement +): + m_homeId( _homeId ), + m_nodeId( _nodeId ), + m_groupIdx( 0 ), + m_maxAssociations( 0 ), + m_auto( false ) +{ + int intVal; + char const* str; + vector pending; + + if( TIXML_SUCCESS == _groupElement->QueryIntAttribute( "index", &intVal ) ) + { + m_groupIdx = (uint8)intVal; + } + + if( TIXML_SUCCESS == _groupElement->QueryIntAttribute( "max_associations", &intVal ) ) + { + m_maxAssociations = (uint8)intVal; + } + + str = _groupElement->Attribute( "auto" ); + if( str ) + { + m_auto = !strcmp( str, "true" ); + } + + str = _groupElement->Attribute( "label" ); + if( str ) + { + m_label = str; + } + + // Read the associations for this group + TiXmlElement const* associationElement = _groupElement->FirstChildElement(); + while( associationElement ) + { + char const* elementName = associationElement->Value(); + if( elementName && !strcmp( elementName, "Node" ) ) + { + if (associationElement->QueryIntAttribute( "id", &intVal ) == TIXML_SUCCESS) + pending.push_back( (uint8)intVal ); + } + + associationElement = associationElement->NextSiblingElement(); + } + + // Group must be added before OnGroupChanged is called so UpdateNodeRoutes can find it. + // Since we do not want to update return routes UpdateNodeRoutes won't find the group + // so nothing will go out from here. The not sending of return routes information + // only works by a side effect of not finding the group. + OnGroupChanged( pending ); +} + +//----------------------------------------------------------------------------- +// +// Write ourselves to an XML document +//----------------------------------------------------------------------------- +void Group::WriteXML +( + TiXmlElement* _groupElement +) +{ + char str[16]; + + snprintf( str, 16, "%d", m_groupIdx ); + _groupElement->SetAttribute( "index", str ); + + snprintf( str, 16, "%d", m_maxAssociations ); + _groupElement->SetAttribute( "max_associations", str ); + + _groupElement->SetAttribute( "label", m_label.c_str() ); + _groupElement->SetAttribute( "auto", m_auto ? "true" : "false" ); + + for( map::iterator it = m_associations.begin(); it != m_associations.end(); ++it ) + { + TiXmlElement* associationElement = new TiXmlElement( "Node" ); + + snprintf( str, 16, "%d", it->first ); + associationElement->SetAttribute( "id", str ); + + _groupElement->LinkEndChild( associationElement ); + } +} + +//----------------------------------------------------------------------------- +// +// Whether a group contains a particular node +//----------------------------------------------------------------------------- +bool Group::Contains +( + uint8 const _nodeId +) +{ + map::iterator it = m_associations.find( _nodeId ); + return( it != m_associations.end() ); +} + +//----------------------------------------------------------------------------- +// +// Associate a node with this group +//----------------------------------------------------------------------------- +void Group::AddAssociation +( + uint8 const _nodeId +) +{ + if( Driver* driver = Manager::Get()->GetDriver( m_homeId ) ) + { + if( Node* node = driver->GetNodeUnsafe( m_nodeId ) ) + { + if( Association* cc = static_cast( node->GetCommandClass( Association::StaticGetCommandClassId() ) ) ) + { + cc->Set( m_groupIdx, _nodeId ); + cc->QueryGroup( m_groupIdx, 0 ); + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Remove a node from this group +//----------------------------------------------------------------------------- +void Group::RemoveAssociation +( + uint8 const _nodeId +) +{ + if( Driver* driver = Manager::Get()->GetDriver( m_homeId ) ) + { + if( Node* node = driver->GetNodeUnsafe( m_nodeId ) ) + { + if( Association* cc = static_cast( node->GetCommandClass( Association::StaticGetCommandClassId() ) ) ) + { + cc->Remove( m_groupIdx, _nodeId ); + cc->QueryGroup( m_groupIdx, 0 ); + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Change the group contents and notify the watchers +//----------------------------------------------------------------------------- +void Group::OnGroupChanged +( + vector const& _associations +) +{ + bool notify = false; + + // If the number of associations is different, we'll save + // ourselves some work and clear the old set now. + if( _associations.size() != m_associations.size() ) + { + m_associations.clear(); + notify = true; + } + else + { + // Handle initial group creation case + if ( _associations.size() == 0 && m_associations.size() == 0 ) + { + notify = true; + } + } + + // Add the new associations. + uint8 oldSize = (uint8)m_associations.size(); + + uint8 i; + for( i=0; i<_associations.size(); ++i ) + { + m_associations[_associations[i]] = AssociationCommandVec(); + } + + if( (!notify) && ( oldSize != m_associations.size() ) ) + { + // The number of nodes in the original and new groups is the same, but + // the number of associations has grown. There must be different nodes + // in the original and new sets of nodes in the group. The easiest way + // to sort this out is to clear the associations and add the new nodes again. + m_associations.clear(); + for( i=0; i<_associations.size(); ++i ) + { + m_associations[_associations[i]] = AssociationCommandVec(); + } + notify = true; + } + + if( notify ) + { + // If the node supports COMMAND_CLASS_ASSOCIATION_COMMAND_CONFIGURATION, we need to request the command data. + if( Driver* driver = Manager::Get()->GetDriver( m_homeId ) ) + { + if( Node* node = driver->GetNodeUnsafe( m_nodeId ) ) + { + if( AssociationCommandConfiguration* cc = static_cast( node->GetCommandClass( AssociationCommandConfiguration::StaticGetCommandClassId() ) ) ) + { + for( map::iterator it = m_associations.begin(); it != m_associations.end(); ++it ) + { + cc->RequestCommands( m_groupIdx, it->first ); + } + } + } + } + + // Send notification that the group contents have changed + Notification* notification = new Notification( Notification::Type_Group ); + notification->SetHomeAndNodeIds( m_homeId, m_nodeId ); + notification->SetGroupIdx( m_groupIdx ); + Manager::Get()->GetDriver( m_homeId )->QueueNotification( notification ); + // Update routes on remote node if necessary + bool update = false; + Options::Get()->GetOptionAsBool( "PerformReturnRoutes", &update ); + if( update ) + { + Driver *drv = Manager::Get()->GetDriver( m_homeId ); + if (drv) + drv->UpdateNodeRoutes( m_nodeId ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Get a list of associations for this group +//----------------------------------------------------------------------------- +uint32 Group::GetAssociations +( + uint8** o_associations +) +{ + size_t numNodes = m_associations.size(); + if( !numNodes ) + { + *o_associations = NULL; + return 0; + } + + uint8* associations = new uint8[numNodes]; + uint32 i = 0; + for( map::iterator it = m_associations.begin(); it != m_associations.end(); ++it ) + { + associations[i++] = it->first; + } + + *o_associations = associations; + return (uint32) numNodes; +} + +//----------------------------------------------------------------------------- +// Command methods (COMMAND_CLASS_ASSOCIATION_COMMAND_CONFIGURATION) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Clear all the commands for the specified node +//----------------------------------------------------------------------------- +bool Group::ClearCommands +( + uint8 const _nodeId +) +{ + map::iterator it = m_associations.find( _nodeId ); + if( it != m_associations.end() ) + { + it->second.clear(); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Add a command to the list for the specified node +//----------------------------------------------------------------------------- +bool Group::AddCommand +( + uint8 const _nodeId, + uint8 const _length, + uint8 const* _data +) +{ + map::iterator it = m_associations.find( _nodeId ); + if( it != m_associations.end() ) + { + it->second.push_back( AssociationCommand( _length, _data ) ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Group::AssociationCommand::AssociationCommand +( + uint8 const _length, + uint8 const* _data +): + m_length( _length ) +{ + m_data = new uint8[_length]; + memcpy( m_data, _data, _length ); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +Group::AssociationCommand::~AssociationCommand +( +) +{ + delete [] m_data; +} + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/Group.h b/lib/ESPiLight/pilight/libs/openzwave/Group.h new file mode 100644 index 0000000..39f600e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Group.h @@ -0,0 +1,114 @@ +//----------------------------------------------------------------------------- +// +// Group.h +// +// A set of associations in a Z-Wave device. +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Group_H +#define _Group_H + +#include +#include +#include +#include "Defs.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class Node; + + /** \brief Manages a group of devices (various nodes associated with each other). + */ + class Group + { + friend class Node; + friend class Association; + + //----------------------------------------------------------------------------- + // Construction + //----------------------------------------------------------------------------- + public: + Group( uint32 const _homeId, uint8 const _nodeId, uint8 const _groupIdx, uint8 const _maxAssociations ); + Group( uint32 const _homeId, uint8 const _nodeId, TiXmlElement const* _valueElement ); + ~Group(){} + + void WriteXML( TiXmlElement* _groupElement ); + + //----------------------------------------------------------------------------- + // Association methods (COMMAND_CLASS_ASSOCIATION) + //----------------------------------------------------------------------------- + public: + string const& GetLabel()const{ return m_label; } + uint32 GetAssociations( uint8** o_associations ); + uint8 GetMaxAssociations()const{ return m_maxAssociations; } + uint8 GetIdx()const{ return m_groupIdx; } + bool Contains( uint8 const _nodeId ); + + private: + bool IsAuto()const{ return m_auto; } + void SetAuto( bool const _state ){ m_auto = _state; } + + void AddAssociation( uint8 const _nodeId ); + void RemoveAssociation( uint8 const _nodeId ); + void OnGroupChanged( vector const& _associations ); + + //----------------------------------------------------------------------------- + // Command methods (COMMAND_CLASS_ASSOCIATION_COMMAND_CONFIGURATION) + //----------------------------------------------------------------------------- + public: + bool ClearCommands( uint8 const _nodeId ); + bool AddCommand( uint8 const _nodeId, uint8 const _length, uint8 const* _data ); + + private: + class AssociationCommand + { + public: + AssociationCommand( uint8 const _length, uint8 const* _data ); + ~AssociationCommand(); + + private: + uint8 m_length; + uint8* m_data; + }; + + typedef vector AssociationCommandVec; + + //----------------------------------------------------------------------------- + // Member variables + //----------------------------------------------------------------------------- + private: + string m_label; + uint32 m_homeId; + uint8 m_nodeId; + uint8 m_groupIdx; + uint8 m_maxAssociations; + bool m_auto; // If true, the controller will automatically be associated with the group + map m_associations; + }; + +} //namespace OpenZWave + +#endif //_Group_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/Manager.cpp b/lib/ESPiLight/pilight/libs/openzwave/Manager.cpp new file mode 100644 index 0000000..621fbe1 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Manager.cpp @@ -0,0 +1,4049 @@ +//----------------------------------------------------------------------------- +// +// Manager.cpp +// +// The main public interface to OpenZWave. +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include +#include +#include + +#include "Defs.h" +#include "Manager.h" +#include "Driver.h" +#include "Node.h" +#include "Notification.h" +#include "Options.h" +#include "Scene.h" + +#include "platform/Mutex.h" +#include "platform/Event.h" +#include "platform/Log.h" + +#include "command_classes/CommandClasses.h" +#include "command_classes/CommandClass.h" +#include "command_classes/WakeUp.h" + +#include "value_classes/ValueID.h" +#include "value_classes/ValueBool.h" +#include "value_classes/ValueButton.h" +#include "value_classes/ValueByte.h" +#include "value_classes/ValueDecimal.h" +#include "value_classes/ValueInt.h" +#include "value_classes/ValueList.h" +#include "value_classes/ValueRaw.h" +#include "value_classes/ValueSchedule.h" +#include "value_classes/ValueShort.h" +#include "value_classes/ValueString.h" + +using namespace OpenZWave; + +Manager* Manager::s_instance = NULL; +extern uint16_t ozw_vers_major; +extern uint16_t ozw_vers_minor; +extern uint16_t ozw_vers_revision; + +//----------------------------------------------------------------------------- +// Construction +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Static creation of the singleton +//----------------------------------------------------------------------------- +Manager* Manager::Create +( +) +{ + if( Options::Get() && Options::Get()->AreLocked() ) + { + if( NULL == s_instance ) + { + s_instance = new Manager(); + } + return s_instance; + } + + // Options have not been created and locked. + Log::Create( "", false, true, LogLevel_Debug, LogLevel_Debug, LogLevel_None ); + Log::Write( LogLevel_Error, "Options have not been created and locked. Exiting..." ); + exit(1); + return NULL; +} + +//----------------------------------------------------------------------------- +// +// Static method to destroy the singleton. +//----------------------------------------------------------------------------- +void Manager::Destroy +( +) +{ + delete s_instance; + s_instance = NULL; +} + +//----------------------------------------------------------------------------- +// +// Static method to get the Version of OZW as a string. +//----------------------------------------------------------------------------- +std::string Manager::getVersionAsString() { + std::ostringstream versionstream; + versionstream << ozw_vers_major << "." << ozw_vers_minor << "." << ozw_vers_revision; + return versionstream.str(); +} +//----------------------------------------------------------------------------- +// +// Static method to get the Version of OZW. +//----------------------------------------------------------------------------- +ozwversion Manager::getVersion() { + return version(ozw_vers_major, ozw_vers_minor); +} + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Manager::Manager +( +): + m_notificationMutex( new Mutex() ) +{ + // Ensure the singleton instance is set + s_instance = this; + + // Create the log file (if enabled) + bool logging = false; + Options::Get()->GetOptionAsBool( "Logging", &logging ); + + string userPath = ""; + Options::Get()->GetOptionAsString( "UserPath", &userPath ); + + string logFileNameBase = "OZW_Log.txt"; + Options::Get()->GetOptionAsString( "LogFileName", &logFileNameBase ); + + bool bAppend = false; + Options::Get()->GetOptionAsBool( "AppendLogFile", &bAppend ); + + bool bConsoleOutput = true; + Options::Get()->GetOptionAsBool( "ConsoleOutput", &bConsoleOutput ); + + int nSaveLogLevel = (int) LogLevel_Detail; + Options::Get()->GetOptionAsInt( "SaveLogLevel", &nSaveLogLevel ); + + int nQueueLogLevel = (int) LogLevel_Debug; + Options::Get()->GetOptionAsInt( "QueueLogLevel", &nQueueLogLevel ); + + int nDumpTrigger = (int) LogLevel_Warning; + Options::Get()->GetOptionAsInt( "DumpTriggerLevel", &nDumpTrigger ); + + string logFilename = userPath + logFileNameBase; + Log::Create( logFilename, bAppend, bConsoleOutput, (LogLevel) nSaveLogLevel, (LogLevel) nQueueLogLevel, (LogLevel) nDumpTrigger ); + Log::SetLoggingState( logging ); + + CommandClasses::RegisterCommandClasses(); + Scene::ReadScenes(); + Log::Write(LogLevel_Always, "OpenZwave Version %s Starting Up", getVersionAsString().c_str()); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +Manager::~Manager +( +) +{ + // Clear the pending list + while( !m_pendingDrivers.empty() ) + { + list::iterator it = m_pendingDrivers.begin(); + delete *it; + m_pendingDrivers.erase( it ); + } + + // Clear the ready map + while( !m_readyDrivers.empty() ) + { + map::iterator it = m_readyDrivers.begin(); + delete it->second; + m_readyDrivers.erase( it ); + } + + m_notificationMutex->Release(); + + // Clear the watchers list + while( !m_watchers.empty() ) + { + list::iterator it = m_watchers.begin(); + delete *it; + m_watchers.erase( it ); + } + + // Clear the generic device class list + while( !Node::s_genericDeviceClasses.empty() ) + { + map::iterator git = Node::s_genericDeviceClasses.begin(); + delete git->second; + Node::s_genericDeviceClasses.erase( git ); + } + + Log::Destroy(); +} + +//----------------------------------------------------------------------------- +// Configuration +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Save the configuration of a driver to a file +//----------------------------------------------------------------------------- +void Manager::WriteConfig +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->WriteConfig(); + Log::Write( LogLevel_Info, "mgr, Manager::WriteConfig completed for driver with home ID of 0x%.8x", _homeId ); + } + else + { + Log::Write( LogLevel_Info, "mgr, Manager::WriteConfig failed - _homeId %d not found", _homeId ); + } + Scene::WriteXML( "zwscene.xml" ); +} + +//----------------------------------------------------------------------------- +// Drivers +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Add a new Z-Wave PC Interface +//----------------------------------------------------------------------------- +bool Manager::AddDriver +( + string const& _controllerPath, + Driver::ControllerInterface const& _interface +) +{ + // Make sure we don't already have a driver for this controller + + // Search the pending list + for( list::iterator pit = m_pendingDrivers.begin(); pit != m_pendingDrivers.end(); ++pit ) + { + if( _controllerPath == (*pit)->GetControllerPath() ) + { + Log::Write( LogLevel_Info, "mgr, Cannot add driver for controller %s - driver already exists", _controllerPath.c_str() ); + return false; + } + } + + // Search the ready map + for( map::iterator rit = m_readyDrivers.begin(); rit != m_readyDrivers.end(); ++rit ) + { + if( _controllerPath == rit->second->GetControllerPath() ) + { + Log::Write( LogLevel_Info, "mgr, Cannot add driver for controller %s - driver already exists", _controllerPath.c_str() ); + return false; + } + } + + Driver* driver = new Driver( _controllerPath, _interface ); + m_pendingDrivers.push_back( driver ); + driver->Start(); + + Log::Write( LogLevel_Info, "mgr, Added driver for controller %s", _controllerPath.c_str() ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Remove a Z-Wave PC Interface +//----------------------------------------------------------------------------- +bool Manager::RemoveDriver +( + string const& _controllerPath +) +{ + // Search the pending list + for( list::iterator pit = m_pendingDrivers.begin(); pit != m_pendingDrivers.end(); ++pit ) + { + if( _controllerPath == (*pit)->GetControllerPath() ) + { + delete *pit; + m_pendingDrivers.erase( pit ); + Log::Write( LogLevel_Info, "mgr, Driver for controller %s removed", _controllerPath.c_str() ); + return true; + } + } + + // Search the ready map + for( map::iterator rit = m_readyDrivers.begin(); rit != m_readyDrivers.end(); ++rit ) + { + if( _controllerPath == rit->second->GetControllerPath() ) + { + /* data race right here: + * Before, we were deleting the Driver Class direct from the Map... this was causing a datarace: + * 1) Driver::~Driver destructor starts deleting everything.... + * 2) This Triggers Notifications such as ValueDeleted etc + * 3) Notifications are delivered to applications, and applications start calling + * Manager Functions which require the Driver (such as IsPolled(valueid)) + * 4) Manager looks up the Driver in the m_readyDriver and returns a pointer to the Driver Class + * which is currently being destructed. + * 5) All Hell Breaks loose and we crash and burn. + * + * But we can't change this, as the Driver Destructor triggers internal GetDriver calls... which + * will crash and burn if they can't get a valid Driver back... + */ + Log::Write( LogLevel_Info, "mgr, Driver for controller %s pending removal", _controllerPath.c_str() ); + delete rit->second; + m_readyDrivers.erase( rit ); + Log::Write( LogLevel_Info, "mgr, Driver for controller %s removed", _controllerPath.c_str() ); + return true; + } + } + + Log::Write( LogLevel_Info, "mgr, Failed to remove driver for controller %s", _controllerPath.c_str() ); + return false; +} + +//----------------------------------------------------------------------------- +// +// Get a pointer to the driver for a Z-Wave PC Interface +//----------------------------------------------------------------------------- +Driver* Manager::GetDriver +( + uint32 const _homeId +) +{ + map::iterator it = m_readyDrivers.find( _homeId ); + if( it != m_readyDrivers.end() ) + { + return it->second; + } + + Log::Write( LogLevel_Error, "mgr, Manager::GetDriver failed - Home ID 0x%.8x is unknown", _homeId ); + //assert(0); << Don't assert as this might be a valid condition when we call RemoveDriver. See comments above. + return NULL; +} + +//----------------------------------------------------------------------------- +// +// Move a driver from pending to ready, and notify any watchers +//----------------------------------------------------------------------------- +void Manager::SetDriverReady +( + Driver* _driver, + bool success +) +{ + // Search the pending list + bool found = false; + for( list::iterator it = m_pendingDrivers.begin(); it != m_pendingDrivers.end(); ++it ) + { + if( (*it) == _driver ) + { + // Remove the driver from the pending list + m_pendingDrivers.erase( it ); + found = true; + break; + } + } + + if( found ) + { + if (success) { + Log::Write( LogLevel_Info, "mgr, Driver with Home ID of 0x%.8x is now ready.", _driver->GetHomeId() ); + Log::Write( LogLevel_Info, "" ); + } + + // Add the driver to the ready map + m_readyDrivers[_driver->GetHomeId()] = _driver; + + // Notify the watchers + Notification* notification = new Notification(success ? Notification::Type_DriverReady : Notification::Type_DriverFailed ); + notification->SetHomeAndNodeIds( _driver->GetHomeId(), _driver->GetNodeId() ); + _driver->QueueNotification( notification ); + } +} + +//----------------------------------------------------------------------------- +// +// +//----------------------------------------------------------------------------- +uint8 Manager::GetControllerNodeId +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetNodeId(); + } + + Log::Write( LogLevel_Info, "mgr, GetControllerNodeId() failed - _homeId %d not found", _homeId ); + return 0xff; +} + +//----------------------------------------------------------------------------- +// +// +//----------------------------------------------------------------------------- +uint8 Manager::GetSUCNodeId +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetSUCNodeId(); + } + + Log::Write( LogLevel_Info, "mgr, GetSUCNodeId() failed - _homeId %d not found", _homeId ); + return 0xff; +} + +//----------------------------------------------------------------------------- +// +// +//----------------------------------------------------------------------------- +bool Manager::IsPrimaryController +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->IsPrimaryController(); + } + + Log::Write( LogLevel_Info, "mgr, IsPrimaryController() failed - _homeId %d not found", _homeId ); + return false; +} + +//----------------------------------------------------------------------------- +// +// +//----------------------------------------------------------------------------- +bool Manager::IsStaticUpdateController +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->IsStaticUpdateController(); + } + + Log::Write( LogLevel_Info, "mgr, IsStaticUpdateController() failed - _homeId %d not found", _homeId ); + return false; +} + +//----------------------------------------------------------------------------- +// +// +//----------------------------------------------------------------------------- +bool Manager::IsBridgeController +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->IsBridgeController(); + } + + Log::Write( LogLevel_Info, "mgr, IsBridgeController() failed - _homeId %d not found", _homeId ); + return false; +} + +//----------------------------------------------------------------------------- +// +// +//----------------------------------------------------------------------------- +string Manager::GetLibraryVersion +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetLibraryVersion(); + } + + Log::Write( LogLevel_Info, "mgr, GetLibraryVersion() failed - _homeId %d not found", _homeId ); + return ""; +} + +//----------------------------------------------------------------------------- +// +// +//----------------------------------------------------------------------------- +string Manager::GetLibraryTypeName +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetLibraryTypeName(); + } + + Log::Write( LogLevel_Info, "mgr, GetLibraryTypeName() failed - _homeId %d not found", _homeId ); + return ""; +} + +//----------------------------------------------------------------------------- +// +// +//----------------------------------------------------------------------------- +int32 Manager::GetSendQueueCount +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetSendQueueCount(); + } + + Log::Write( LogLevel_Info, "mgr, GetSendQueueCount() failed - _homeId %d not found", _homeId ); + return -1; +} + +//----------------------------------------------------------------------------- +// +// Send driver statistics to the log file +//----------------------------------------------------------------------------- +void Manager::LogDriverStatistics +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->LogDriverStatistics(); + } + + Log::Write( LogLevel_Warning, "mgr, LogDriverStatistics() failed - _homeId %d not found", _homeId ); +} + +//----------------------------------------------------------------------------- +// +// Retrieve controller interface type +//----------------------------------------------------------------------------- +Driver::ControllerInterface Manager::GetControllerInterfaceType +( + uint32 const _homeId +) +{ + Driver::ControllerInterface ifType = Driver::ControllerInterface_Unknown; + if( Driver* driver = GetDriver( _homeId ) ) + { + ifType = driver->GetControllerInterfaceType(); + } + return ifType; +} + +//----------------------------------------------------------------------------- +// +// Retrieve controller interface path +//----------------------------------------------------------------------------- +string Manager::GetControllerPath +( + uint32 const _homeId +) +{ + string path = ""; + if( Driver* driver = GetDriver( _homeId ) ) + { + path = driver->GetControllerPath(); + } + return path; +} +//----------------------------------------------------------------------------- +// Polling Z-Wave values +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Return the polling interval +//----------------------------------------------------------------------------- +int32 Manager::GetPollInterval +( +) +{ + for( map::iterator rit = m_readyDrivers.begin(); rit != m_readyDrivers.end(); ++rit ) + { + return rit->second->GetPollInterval(); + } + for( list::iterator pit = m_pendingDrivers.begin(); pit != m_pendingDrivers.end(); ++pit ) + { + return (*pit)->GetPollInterval(); + } + return 0; + +} + +//----------------------------------------------------------------------------- +// +// Set the polling interval on all drivers +//----------------------------------------------------------------------------- +void Manager::SetPollInterval +( + int32 _milliseconds, + bool _bIntervalBetweenPolls +) +{ + for( list::iterator pit = m_pendingDrivers.begin(); pit != m_pendingDrivers.end(); ++pit ) + { + (*pit)->SetPollInterval( _milliseconds, _bIntervalBetweenPolls ); + } + + for( map::iterator rit = m_readyDrivers.begin(); rit != m_readyDrivers.end(); ++rit ) + { + rit->second->SetPollInterval( _milliseconds, _bIntervalBetweenPolls ); + } +} + +//----------------------------------------------------------------------------- +// +// Enable polling of a value +//----------------------------------------------------------------------------- +bool Manager::EnablePoll +( + ValueID const &_valueId, + uint8 const _intensity +) +{ + if( Driver* driver = GetDriver( _valueId.GetHomeId() ) ) + { + return( driver->EnablePoll( _valueId, _intensity ) ); + } + + Log::Write( LogLevel_Info, "mgr, EnablePoll failed - Driver with Home ID 0x%.8x is not available", _valueId.GetHomeId() ); + return false; +} + +//----------------------------------------------------------------------------- +// +// Disable polling of a value +//----------------------------------------------------------------------------- +bool Manager::DisablePoll +( + ValueID const &_valueId +) +{ + if( Driver* driver = GetDriver( _valueId.GetHomeId() ) ) + { + return( driver->DisablePoll( _valueId ) ); + } + + Log::Write( LogLevel_Info, "mgr, DisablePoll failed - Driver with Home ID 0x%.8x is not available", _valueId.GetHomeId() ); + return false; +} + +//----------------------------------------------------------------------------- +// +// Check polling status of a value +//----------------------------------------------------------------------------- +bool Manager::isPolled +( + ValueID const &_valueId +) +{ + if( Driver* driver = GetDriver( _valueId.GetHomeId() ) ) + { + return( driver->isPolled( _valueId ) ); + } + + Log::Write( LogLevel_Info, "mgr, isPolled failed - Driver with Home ID 0x%.8x is not available", _valueId.GetHomeId() ); + return false; +} + +//----------------------------------------------------------------------------- +// +// Change the intensity with which this value is polled +//----------------------------------------------------------------------------- +void Manager::SetPollIntensity +( + ValueID const &_valueId, + uint8 const _intensity +) +{ + if( Driver* driver = GetDriver( _valueId.GetHomeId() ) ) + { + return( driver->SetPollIntensity( _valueId, _intensity ) ); + } + + Log::Write( LogLevel_Error, "mgr, SetPollIntensity failed - Driver with Home ID 0x%.8x is not available", _valueId.GetHomeId() ); +} + +//----------------------------------------------------------------------------- +// +// Change the intensity with which this value is polled +//----------------------------------------------------------------------------- +uint8 Manager::GetPollIntensity +( + ValueID const &_valueId +) +{ + uint8 intensity = 0; + if( Driver* driver = GetDriver( _valueId.GetHomeId() ) ) + { + driver->LockNodes(); + if( Value* value = driver->GetValue( _valueId ) ) + { + intensity = value->GetPollIntensity(); + value->Release(); + } + driver->ReleaseNodes(); + } + + return intensity; +} + +//----------------------------------------------------------------------------- +// Retrieving Node information +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Fetch the data for a node from the Z-Wave network +//----------------------------------------------------------------------------- +bool Manager::RefreshNodeInfo +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + // Cause the node's data to be obtained from the Z-Wave network + // in the same way as if it had just been added. + Node* node = driver->GetNode( _nodeId ); + if( node ) + { + node->SetQueryStage( Node::QueryStage_ProtocolInfo ); + driver->ReleaseNodes(); + return true; + } + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Fetch the command class data for a node from the Z-Wave network +//----------------------------------------------------------------------------- +bool Manager::RequestNodeState +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + // Retreive the Node's session and dynamic data + Node* node = driver->GetNode( _nodeId ); + if( node ) + { + node->SetQueryStage( Node::QueryStage_Associations ); + driver->ReleaseNodes(); + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Fetch only the dynamic command class data for a node from the Z-Wave network +//----------------------------------------------------------------------------- +bool Manager::RequestNodeDynamic +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + // Retreive the Node's dynamic data + Node* node = driver->GetNode( _nodeId ); + if( node ) + { + node->SetQueryStage( Node::QueryStage_Dynamic ); + driver->ReleaseNodes(); + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Get whether the node is a listening device that does not go to sleep +//----------------------------------------------------------------------------- +bool Manager::IsNodeListeningDevice +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + bool res = false; + if( Driver* driver = GetDriver( _homeId ) ) + { + res = driver->IsNodeListeningDevice( _nodeId ); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Get whether the node is a listening device that does not go to sleep +//----------------------------------------------------------------------------- +bool Manager::IsNodeFrequentListeningDevice +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + bool res = false; + if( Driver* driver = GetDriver( _homeId ) ) + { + res = driver->IsNodeFrequentListeningDevice( _nodeId ); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Get whether the node is a beam capable device. +//----------------------------------------------------------------------------- +bool Manager::IsNodeBeamingDevice +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + bool res = false; + if( Driver* driver = GetDriver( _homeId ) ) + { + res = driver->IsNodeBeamingDevice( _nodeId ); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Get whether the node is a routing device that passes messages to other nodes +//----------------------------------------------------------------------------- +bool Manager::IsNodeRoutingDevice +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + bool res = false; + if( Driver* driver = GetDriver( _homeId ) ) + { + res = driver->IsNodeRoutingDevice( _nodeId ); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Get the security attribute for a node. +//----------------------------------------------------------------------------- +bool Manager::IsNodeSecurityDevice +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + bool security = 0; + if( Driver* driver = GetDriver( _homeId ) ) + { + security = driver->IsNodeSecurityDevice( _nodeId ); + } + + return security; +} + +//----------------------------------------------------------------------------- +// +// Get the maximum baud rate of a node's communications +//----------------------------------------------------------------------------- +uint32 Manager::GetNodeMaxBaudRate +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + uint32 baud = 0; + if( Driver* driver = GetDriver( _homeId ) ) + { + baud = driver->GetNodeMaxBaudRate( _nodeId ); + } + + return baud; +} + +//----------------------------------------------------------------------------- +// +// Get the version number of a node +//----------------------------------------------------------------------------- +uint8 Manager::GetNodeVersion +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + uint8 version = 0; + if( Driver* driver = GetDriver( _homeId ) ) + { + version = driver->GetNodeVersion( _nodeId ); + } + + return version; +} + +//----------------------------------------------------------------------------- +// +// Get the security byte of a node +//----------------------------------------------------------------------------- +uint8 Manager::GetNodeSecurity +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + uint8 version = 0; + if( Driver* driver = GetDriver( _homeId ) ) + { + version = driver->GetNodeSecurity( _nodeId ); + } + + return version; +} + +//----------------------------------------------------------------------------- +// +// Get the basic type of a node +//----------------------------------------------------------------------------- +uint8 Manager::GetNodeBasic +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + uint8 basic = 0; + if( Driver* driver = GetDriver( _homeId ) ) + { + basic = driver->GetNodeBasic( _nodeId ); + } + + return basic; +} + +//----------------------------------------------------------------------------- +// +// Get the generic type of a node +//----------------------------------------------------------------------------- +uint8 Manager::GetNodeGeneric +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + uint8 genericType = 0; + if( Driver* driver = GetDriver( _homeId ) ) + { + genericType = driver->GetNodeGeneric( _nodeId ); + } + + return genericType; +} + +//----------------------------------------------------------------------------- +// +// Get the specific type of a node +//----------------------------------------------------------------------------- +uint8 Manager::GetNodeSpecific +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + uint8 specific = 0; + if( Driver* driver = GetDriver( _homeId ) ) + { + specific = driver->GetNodeSpecific( _nodeId ); + } + + return specific; +} + +//----------------------------------------------------------------------------- +// +// Get a string describing the type of a node +//----------------------------------------------------------------------------- +string Manager::GetNodeType +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetNodeType( _nodeId ); + } + + return "Unknown"; +} + +//----------------------------------------------------------------------------- +// +// Get the bitmap of this node's neighbors +//----------------------------------------------------------------------------- +uint32 Manager::GetNodeNeighbors +( + uint32 const _homeId, + uint8 const _nodeId, + uint8** o_neighbors +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetNodeNeighbors( _nodeId, o_neighbors ); + } + + return 0; +} + +//----------------------------------------------------------------------------- +// +// Get the manufacturer name of a node +//----------------------------------------------------------------------------- +string Manager::GetNodeManufacturerName +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetNodeManufacturerName( _nodeId ); + } + + return "Unknown"; +} + +//----------------------------------------------------------------------------- +// +// Get the product name of a node +//----------------------------------------------------------------------------- +string Manager::GetNodeProductName +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetNodeProductName( _nodeId ); + } + + return "Unknown"; +} + +//----------------------------------------------------------------------------- +// +// Get the user-editable name of a node +//----------------------------------------------------------------------------- +string Manager::GetNodeName +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetNodeName( _nodeId ); + } + + return "Unknown"; +} + +//----------------------------------------------------------------------------- +// +// Get the location of a node +//----------------------------------------------------------------------------- +string Manager::GetNodeLocation +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetNodeLocation( _nodeId ); + } + + return "Unknown"; +} + +//----------------------------------------------------------------------------- +// +// Set the manufacturer name a node +//----------------------------------------------------------------------------- +void Manager::SetNodeManufacturerName +( + uint32 const _homeId, + uint8 const _nodeId, + string const& _manufacturerName +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->SetNodeManufacturerName( _nodeId, _manufacturerName ); + } +} + +//----------------------------------------------------------------------------- +// +// Set the product name of a node +//----------------------------------------------------------------------------- +void Manager::SetNodeProductName +( + uint32 const _homeId, + uint8 const _nodeId, + string const& _productName +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->SetNodeProductName( _nodeId, _productName ); + } +} + +//----------------------------------------------------------------------------- +// +// Set the node name value with the specified ID +//----------------------------------------------------------------------------- +void Manager::SetNodeName +( + uint32 const _homeId, + uint8 const _nodeId, + string const& _nodeName +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->SetNodeName( _nodeId, _nodeName ); + } +} + +//----------------------------------------------------------------------------- +// +// Set a string describing the location of a node +//----------------------------------------------------------------------------- +void Manager::SetNodeLocation +( + uint32 const _homeId, + uint8 const _nodeId, + string const& _location + +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->SetNodeLocation( _nodeId, _location ); + } +} + +//----------------------------------------------------------------------------- +// +// Get the manufacturer ID value of a node +//----------------------------------------------------------------------------- +string Manager::GetNodeManufacturerId +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetNodeManufacturerId( _nodeId ); + } + + return "Unknown"; +} + +//----------------------------------------------------------------------------- +// +// Get the product type value of a node +//----------------------------------------------------------------------------- +string Manager::GetNodeProductType +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetNodeProductType( _nodeId ); + } + + return "Unknown"; +} + +//----------------------------------------------------------------------------- +// +// Get the product Id value with the specified ID +//----------------------------------------------------------------------------- +string Manager::GetNodeProductId +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetNodeProductId( _nodeId ); + } + + return "Unknown"; +} + +//----------------------------------------------------------------------------- +// +// Helper method to turn a node on +//----------------------------------------------------------------------------- +void Manager::SetNodeOn +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->SetNodeOn( _nodeId ); + } +} + +//----------------------------------------------------------------------------- +// +// Helper method to turn a node off +//----------------------------------------------------------------------------- +void Manager::SetNodeOff +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->SetNodeOff( _nodeId ); + } +} + +//----------------------------------------------------------------------------- +// +// Helper method to return whether a particular class is available in a node +//----------------------------------------------------------------------------- +bool Manager::IsNodeInfoReceived +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + bool result = false; + + if( Driver* driver = GetDriver( _homeId ) ) + { + Node *node; + + // Need to lock and unlock nodes to check this information + driver->LockNodes(); + + if( (node = driver->GetNodeUnsafe( _nodeId ) ) != NULL) + { + result = node->NodeInfoReceived(); + } + + driver->ReleaseNodes(); + } + + return result; +} + +//----------------------------------------------------------------------------- +// +// Helper method to return whether a particular class is available in a node +//----------------------------------------------------------------------------- +bool Manager::GetNodeClassInformation +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _commandClassId, + string *_className, + uint8 *_classVersion +) +{ + bool result = false; + + if( Driver* driver = GetDriver( _homeId ) ) + { + Node *node; + + // Need to lock and unlock nodes to check this information + driver->LockNodes(); + + if( ( node = driver->GetNodeUnsafe( _nodeId ) ) != NULL ) + { + CommandClass *cc; + if( node->NodeInfoReceived() && ( ( cc = node->GetCommandClass( _commandClassId ) ) != NULL ) ) + { + if( _className ) + { + *_className = cc->GetCommandClassName(); + } + if( _classVersion ) + { + *_classVersion = cc->GetVersion(); + } + // Positive result + result = true; + } + } + + driver->ReleaseNodes(); + } + + return result; +} + +//----------------------------------------------------------------------------- +// +// Helper method to return whether a node is awake or sleeping +//----------------------------------------------------------------------------- +bool Manager::IsNodeAwake +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( IsNodeListeningDevice( _homeId, _nodeId ) ) + { + return true; // if listening then always awake + } + bool result = true; + if( Driver* driver = GetDriver( _homeId ) ) + { + // Need to lock and unlock nodes to check this information + driver->LockNodes(); + + if( Node* node = driver->GetNodeUnsafe( _nodeId ) ) + { + if( WakeUp* wcc = static_cast( node->GetCommandClass( WakeUp::StaticGetCommandClassId() ) ) ) + { + result = wcc->IsAwake(); + } + } + driver->ReleaseNodes(); + } + return result; +} + +//----------------------------------------------------------------------------- +// +// Helper method to return whether a node is on the network or not +//----------------------------------------------------------------------------- +bool Manager::IsNodeFailed +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + bool result = false; + if( Driver* driver = GetDriver( _homeId ) ) + { + if( Node* node = driver->GetNode( _nodeId ) ) + { + result = !node->IsNodeAlive(); + driver->ReleaseNodes(); + } + } + return result; +} + +//----------------------------------------------------------------------------- +// +// Helper method to return whether a node's query stage +//----------------------------------------------------------------------------- +string Manager::GetNodeQueryStage +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + string result = "Unknown"; + if( Driver* driver = GetDriver( _homeId ) ) + { + if( Node* node = driver->GetNode( _nodeId ) ) + { + result = node->GetQueryStageName( node->GetCurrentQueryStage() ); + driver->ReleaseNodes(); + } + } + return result; +} + +//----------------------------------------------------------------------------- +// +// Helper method to set the basic level of a node +//----------------------------------------------------------------------------- +void Manager::SetNodeLevel +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _level +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->SetNodeLevel( _nodeId, _level ); + } +} + +//----------------------------------------------------------------------------- +// Values +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Gets the user-friendly label for the value +//----------------------------------------------------------------------------- +string Manager::GetValueLabel +( + ValueID const& _id +) +{ + string label; + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( Value* value = driver->GetValue( _id ) ) + { + label = value->GetLabel(); + value->Release(); + } + driver->ReleaseNodes(); + } + + return label; +} + +//----------------------------------------------------------------------------- +// +// Sets the user-friendly label for the value +//----------------------------------------------------------------------------- +void Manager::SetValueLabel +( + ValueID const& _id, + string const& _value +) +{ + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( Value* value = driver->GetValue( _id ) ) + { + value->SetLabel( _value ); + value->Release(); + } + driver->ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Gets the units that the value is measured in +//----------------------------------------------------------------------------- +string Manager::GetValueUnits +( + ValueID const& _id +) +{ + string units; + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( Value* value = driver->GetValue( _id ) ) + { + units = value->GetUnits(); + value->Release(); + } + driver->ReleaseNodes(); + } + + return units; +} + +//----------------------------------------------------------------------------- +// +// Sets the units that the value is measured in +//----------------------------------------------------------------------------- +void Manager::SetValueUnits +( + ValueID const& _id, + string const& _value +) +{ + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( Value* value = driver->GetValue( _id ) ) + { + value->SetUnits( _value ); + value->Release(); + } + driver->ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Gets a help string describing the value's purpose and usage +//----------------------------------------------------------------------------- +string Manager::GetValueHelp +( + ValueID const& _id +) +{ + string help; + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( Value* value = driver->GetValue( _id ) ) + { + help = value->GetHelp(); + value->Release(); + } + driver->ReleaseNodes(); + } + + return help; +} + +//----------------------------------------------------------------------------- +// +// Sets a help string describing the value's purpose and usage +//----------------------------------------------------------------------------- +void Manager::SetValueHelp +( + ValueID const& _id, + string const& _value +) +{ + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( Value* value = driver->GetValue( _id ) ) + { + value->SetHelp( _value ); + value->Release(); + } + driver->ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Gets the minimum for a value +//----------------------------------------------------------------------------- +int32 Manager::GetValueMin +( + ValueID const& _id +) +{ + int32 limit = 0; + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( Value* value = driver->GetValue( _id ) ) + { + limit = value->GetMin(); + value->Release(); + } + driver->ReleaseNodes(); + } + + return limit; +} + +//----------------------------------------------------------------------------- +// +// Gets the maximum for a value +//----------------------------------------------------------------------------- +int32 Manager::GetValueMax +( + ValueID const& _id +) +{ + int32 limit = 0; + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( Value* value = driver->GetValue( _id ) ) + { + limit = value->GetMax(); + value->Release(); + } + driver->ReleaseNodes(); + } + + return limit; +} + +//----------------------------------------------------------------------------- +// +// Test whether the value is read-only +//----------------------------------------------------------------------------- +bool Manager::IsValueReadOnly +( + ValueID const& _id +) +{ + bool res = false; + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( Value* value = driver->GetValue( _id ) ) + { + res = value->IsReadOnly(); + value->Release(); + } + driver->ReleaseNodes(); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Test whether the value is write-only +//----------------------------------------------------------------------------- +bool Manager::IsValueWriteOnly +( + ValueID const& _id +) +{ + bool res = false; + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( Value* value = driver->GetValue( _id ) ) + { + res = value->IsWriteOnly(); + value->Release(); + } + driver->ReleaseNodes(); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Test whether the value has been set by a status message from the device +//----------------------------------------------------------------------------- +bool Manager::IsValueSet +( + ValueID const& _id +) +{ + bool res = false; + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( Value* value = driver->GetValue( _id ) ) + { + res = value->IsSet(); + value->Release(); + } + driver->ReleaseNodes(); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Test whether the value is currently being polled +//----------------------------------------------------------------------------- +bool Manager::IsValuePolled +( + ValueID const& _id +) +{ + bool res = false; + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( Value* value = driver->GetValue( _id ) ) + { + res = value->IsPolled(); + value->Release(); + } + driver->ReleaseNodes(); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Gets a value as a bool +//----------------------------------------------------------------------------- +bool Manager::GetValueAsBool +( + ValueID const& _id, + bool* o_value +) +{ + bool res = false; + + if( o_value ) + { + if( ValueID::ValueType_Bool == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueBool* value = static_cast( driver->GetValue( _id ) ) ) + { + *o_value = value->GetValue(); + value->Release(); + res = true; + } + driver->ReleaseNodes(); + } + } + else if( ValueID::ValueType_Button == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueButton* value = static_cast( driver->GetValue( _id ) ) ) + { + *o_value = value->IsPressed(); + value->Release(); + res = true; + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Gets a value as an 8-bit unsigned integer +//----------------------------------------------------------------------------- +bool Manager::GetValueAsByte +( + ValueID const& _id, + uint8* o_value +) +{ + bool res = false; + + if( o_value ) + { + if( ValueID::ValueType_Byte == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueByte* value = static_cast( driver->GetValue( _id ) ) ) + { + *o_value = value->GetValue(); + value->Release(); + res = true; + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Gets a value as a floating point number +//----------------------------------------------------------------------------- +bool Manager::GetValueAsFloat +( + ValueID const& _id, + float* o_value +) +{ + bool res = false; + + if( o_value ) + { + if( ValueID::ValueType_Decimal == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueDecimal* value = static_cast( driver->GetValue( _id ) ) ) + { + string str = value->GetValue(); + *o_value = (float)atof( str.c_str() ); + value->Release(); + res = true; + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Gets a value as a 32-bit signed integer +//----------------------------------------------------------------------------- +bool Manager::GetValueAsInt +( + ValueID const& _id, + int32* o_value +) +{ + bool res = false; + + if( o_value ) + { + if( ValueID::ValueType_Int == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueInt* value = static_cast( driver->GetValue( _id ) ) ) + { + *o_value = value->GetValue(); + value->Release(); + res = true; + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Gets a value as a collection of bytes +//----------------------------------------------------------------------------- +bool Manager::GetValueAsRaw +( + ValueID const& _id, + uint8** o_value, + uint8* o_length +) +{ + bool res = false; + + if( o_value && o_length ) + { + if( ValueID::ValueType_Raw == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueRaw* value = static_cast( driver->GetValue( _id ) ) ) + { + *o_length = value->GetLength(); + *o_value = new uint8[*o_length]; + memcpy( *o_value, value->GetValue(), *o_length ); + value->Release(); + res = true; + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Gets a value as a 16-bit signed integer +//----------------------------------------------------------------------------- +bool Manager::GetValueAsShort +( + ValueID const& _id, + int16* o_value +) +{ + bool res = false; + + if( o_value ) + { + if( ValueID::ValueType_Short == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueShort* value = static_cast( driver->GetValue( _id ) ) ) + { + *o_value = value->GetValue(); + value->Release(); + res = true; + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Creates a string representation of the value, regardless of type +//----------------------------------------------------------------------------- +bool Manager::GetValueAsString +( + ValueID const& _id, + string* o_value +) +{ + bool res = false; + char str[256] = {0}; + + if( o_value ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + + switch( _id.GetType() ) + { + case ValueID::ValueType_Bool: + { + if( ValueBool* value = static_cast( driver->GetValue( _id ) ) ) + { + *o_value = value->GetValue() ? "True" : "False"; + value->Release(); + res = true; + } + break; + } + case ValueID::ValueType_Byte: + { + if( ValueByte* value = static_cast( driver->GetValue( _id ) ) ) + { + snprintf( str, sizeof(str), "%u", value->GetValue() ); + *o_value = str; + value->Release(); + res = true; + } + break; + } + case ValueID::ValueType_Decimal: + { + if( ValueDecimal* value = static_cast( driver->GetValue( _id ) ) ) + { + *o_value = value->GetValue(); + value->Release(); + res = true; + } + break; + } + case ValueID::ValueType_Int: + { + if( ValueInt* value = static_cast( driver->GetValue( _id ) ) ) + { + snprintf( str, sizeof(str), "%d", value->GetValue() ); + *o_value = str; + value->Release(); + res = true; + } + break; + } + case ValueID::ValueType_List: + { + if( ValueList* value = static_cast( driver->GetValue( _id ) ) ) + { + ValueList::Item const& item = value->GetItem(); + *o_value = item.m_label; + value->Release(); + res = true; + } + break; + } + case ValueID::ValueType_Raw: + { + if( ValueRaw* value = static_cast( driver->GetValue( _id ) ) ) + { + *o_value = value->GetAsString(); + value->Release(); + res = true; + } + break; + } + case ValueID::ValueType_Short: + { + if( ValueShort* value = static_cast( driver->GetValue( _id ) ) ) + { + snprintf( str, sizeof(str), "%d", value->GetValue() ); + *o_value = str; + value->Release(); + res = true; + } + break; + } + case ValueID::ValueType_String: + { + if( ValueString* value = static_cast( driver->GetValue( _id ) ) ) + { + *o_value = value->GetValue(); + value->Release(); + res = true; + } + break; + } + case ValueID::ValueType_Button: + { + if( ValueButton* value = static_cast( driver->GetValue( _id ) ) ) + { + *o_value = value->IsPressed() ? "True" : "False"; + value->Release(); + res = true; + } + break; + } + default: + { + // To keep GCC happy + break; + } + } + + driver->ReleaseNodes(); + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Gets the selected item from a list value (returning a string) +//----------------------------------------------------------------------------- +bool Manager::GetValueListSelection +( + ValueID const& _id, + string* o_value +) +{ + bool res = false; + + if( o_value ) + { + if( ValueID::ValueType_List == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueList* value = static_cast( driver->GetValue( _id ) ) ) + { + ValueList::Item const& item = value->GetItem(); + if( &item != NULL ) + { + *o_value = item.m_label; + res = true; + } + value->Release(); + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Gets the selected item from a list value (returning the index) +//----------------------------------------------------------------------------- +bool Manager::GetValueListSelection +( + ValueID const& _id, + int32* o_value +) +{ + bool res = false; + + if( o_value ) + { + if( ValueID::ValueType_List == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueList* value = static_cast( driver->GetValue( _id ) ) ) + { + ValueList::Item const& item = value->GetItem(); + *o_value = item.m_value; + value->Release(); + res = true; + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Gets the list of items from a list value +//----------------------------------------------------------------------------- +bool Manager::GetValueListItems +( + ValueID const& _id, + vector* o_value +) +{ + bool res = false; + + if( o_value ) + { + if( ValueID::ValueType_List == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueList* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->GetItemLabels( o_value ); + value->Release(); + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Gets a value's scale as a uint8 +//----------------------------------------------------------------------------- +bool Manager::GetValueFloatPrecision +( + ValueID const& _id, + uint8* o_value +) +{ + bool res = false; + + if( o_value ) + { + if( ValueID::ValueType_Decimal == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueDecimal* value = static_cast( driver->GetValue( _id ) ) ) + { + *o_value = value->GetPrecision(); + value->Release(); + res = true; + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Sets the value from a bool +//----------------------------------------------------------------------------- +bool Manager::SetValue +( + ValueID const& _id, + bool const _value +) +{ + bool res = false; + + if( ValueID::ValueType_Bool == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + if( _id.GetNodeId() != driver->GetNodeId() ) + { + driver->LockNodes(); + if( ValueBool* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->Set( _value ); + value->Release(); + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Sets the value from a byte +//----------------------------------------------------------------------------- +bool Manager::SetValue +( + ValueID const& _id, + uint8 const _value +) +{ + bool res = false; + + if( ValueID::ValueType_Byte == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + if( _id.GetNodeId() != driver->GetNodeId() ) + { + driver->LockNodes(); + if( ValueByte* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->Set( _value ); + value->Release(); + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Sets the value from a floating point number +//----------------------------------------------------------------------------- +bool Manager::SetValue +( + ValueID const& _id, + float const _value +) +{ + bool res = false; + + if( ValueID::ValueType_Decimal == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + if( _id.GetNodeId() != driver->GetNodeId() ) + { + driver->LockNodes(); + if( ValueDecimal* value = static_cast( driver->GetValue( _id ) ) ) + { + char str[256]; + snprintf( str, sizeof(str), "%f", _value ); + + // remove trailing zeros (and the decimal point, if present) + // TODO: better way of figuring out which locale is being used ('.' or ',' to separate decimals) + size_t nLen; + if( ( strchr( str, '.' ) != NULL) || (strchr( str, ',' ) != NULL ) ) + { + for( nLen = strlen( str ) - 1; nLen > 0; nLen-- ) + { + if( str[nLen] == '0' ) + str[nLen] = 0; + else + break; + } + if( (str[nLen] == '.') || (str[nLen] == ',') ) + str[nLen] = 0; + } + + // now set the value + res = value->Set( str ); + value->Release(); + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Sets the value from a 32-bit signed integer +//----------------------------------------------------------------------------- +bool Manager::SetValue +( + ValueID const& _id, + int32 const _value +) +{ + bool res = false; + + if( ValueID::ValueType_Int == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + if( _id.GetNodeId() != driver->GetNodeId() ) + { + driver->LockNodes(); + if( ValueInt* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->Set( _value ); + value->Release(); + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Sets the value from a collection of bytes +//----------------------------------------------------------------------------- +bool Manager::SetValue +( + ValueID const& _id, + uint8 const* _value, + uint8 const _length +) +{ + bool res = false; + + if( ValueID::ValueType_Raw == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + if( _id.GetNodeId() != driver->GetNodeId() ) + { + driver->LockNodes(); + if( ValueRaw* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->Set( _value, _length ); + value->Release(); + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Sets the value from a 16-bit signed integer +//----------------------------------------------------------------------------- +bool Manager::SetValue +( + ValueID const& _id, + int16 const _value +) +{ + bool res = false; + + if( ValueID::ValueType_Short == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + if( _id.GetNodeId() != driver->GetNodeId() ) + { + driver->LockNodes(); + if( ValueShort* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->Set( _value ); + value->Release(); + } + driver->ReleaseNodes(); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Sets the selected item in a list by value +//----------------------------------------------------------------------------- +bool Manager::SetValueListSelection +( + ValueID const& _id, + string const& _selectedItem +) +{ + bool res = false; + + if( ValueID::ValueType_List == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + if( _id.GetNodeId() != driver->GetNodeId() ) + { + driver->LockNodes(); + if( ValueList* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->SetByLabel( _selectedItem ); + value->Release(); + } + driver->ReleaseNodes(); + } + + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Sets the value from a string +//----------------------------------------------------------------------------- +bool Manager::SetValue +( + ValueID const& _id, + string const& _value +) +{ + bool res = false; + + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + if( _id.GetNodeId() != driver->GetNodeId() ) + { + driver->LockNodes(); + + switch( _id.GetType() ) + { + case ValueID::ValueType_Bool: + { + if( ValueBool* value = static_cast( driver->GetValue( _id ) ) ) + { + if( !strcasecmp( "true", _value.c_str() ) ) + { + res = value->Set( true ); + } + else if( !strcasecmp( "false", _value.c_str() ) ) + { + res = value->Set( false ); + } + value->Release(); + } + break; + } + case ValueID::ValueType_Byte: + { + if( ValueByte* value = static_cast( driver->GetValue( _id ) ) ) + { + uint32 val = (uint32)atoi( _value.c_str() ); + if( val < 256 ) + { + res = value->Set( (uint8)val ); + } + value->Release(); + } + break; + } + case ValueID::ValueType_Decimal: + { + if( ValueDecimal* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->Set( _value ); + value->Release(); + } + break; + } + case ValueID::ValueType_Int: + { + if( ValueInt* value = static_cast( driver->GetValue( _id ) ) ) + { + int32 val = atoi( _value.c_str() ); + res = value->Set( val ); + value->Release(); + } + break; + } + case ValueID::ValueType_List: + { + if( ValueList* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->SetByLabel( _value ); + value->Release(); + } + break; + } + case ValueID::ValueType_Short: + { + if( ValueShort* value = static_cast( driver->GetValue( _id ) ) ) + { + int32 val = (uint32)atoi( _value.c_str() ); + if( ( val < 32768 ) && ( val >= -32768 ) ) + { + res = value->Set( (int16)val ); + } + value->Release(); + } + break; + } + case ValueID::ValueType_String: + { + if( ValueString* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->Set( _value ); + value->Release(); + } + break; + } + case ValueID::ValueType_Raw: + { + if( ValueRaw* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->SetFromString( _value ); + value->Release(); + } + break; + } + default: + { + // To keep GCC happy + break; + } + } + driver->ReleaseNodes(); + } + } + return res; +} + +//----------------------------------------------------------------------------- +// +// Instruct the driver to refresh this value by sending a message to the device +//----------------------------------------------------------------------------- +bool Manager::RefreshValue +( + ValueID const& _id +) +{ + bool bRet = false; // return value + + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + Node *node; + + // Need to lock and unlock nodes to check this information + driver->LockNodes(); + + if( (node = driver->GetNodeUnsafe( _id.GetNodeId() ) ) != NULL) + { + CommandClass* cc = node->GetCommandClass( _id.GetCommandClassId() ); + if (cc) { + uint8 index = _id.GetIndex(); + uint8 instance = _id.GetInstance(); + Log::Write( LogLevel_Info, "mgr, Refreshing node %d: %s index = %d instance = %d (to confirm a reported change)", node->m_nodeId, cc->GetCommandClassName().c_str(), index, instance ); + cc->RequestValue( 0, index, instance, Driver::MsgQueue_Send ); + bRet = true; + } else { + bRet = false; + } + } + driver->ReleaseNodes(); + } + return bRet; +} + +//----------------------------------------------------------------------------- +// +// Set the verify changes flag for the specified value +//----------------------------------------------------------------------------- +void Manager::SetChangeVerified +( + ValueID const& _id, + bool _verify +) +{ + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( Value* value = driver->GetValue( _id ) ) + { + value->SetChangeVerified( _verify ); + value->Release(); + } + driver->ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Starts an activity in a device. +//----------------------------------------------------------------------------- +bool Manager::PressButton +( + ValueID const& _id +) +{ + bool res = false; + + if( ValueID::ValueType_Button == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueButton* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->PressButton(); + value->Release(); + } + driver->ReleaseNodes(); + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Stops an activity in a device. +//----------------------------------------------------------------------------- +bool Manager::ReleaseButton +( + ValueID const& _id +) +{ + bool res = false; + + if( ValueID::ValueType_Button == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueButton* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->ReleaseButton(); + value->Release(); + } + driver->ReleaseNodes(); + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// Climate Control Schedules +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Get the number of switch points defined in a schedule +//----------------------------------------------------------------------------- +uint8 Manager::GetNumSwitchPoints +( + ValueID const& _id +) +{ +// bool res = false; + + uint8 numSwitchPoints = 0; + if( ValueID::ValueType_Schedule == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueSchedule* value = static_cast( driver->GetValue( _id ) ) ) + { + numSwitchPoints = value->GetNumSwitchPoints(); + value->Release(); + } + driver->ReleaseNodes(); + } + } + + return numSwitchPoints; +} + +//----------------------------------------------------------------------------- +// +// Set a switch point in the schedule +//----------------------------------------------------------------------------- +bool Manager::SetSwitchPoint +( + ValueID const& _id, + uint8 const _hours, + uint8 const _minutes, + int8 const _setback +) +{ + bool res = false; + + if( ValueID::ValueType_Schedule == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueSchedule* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->SetSwitchPoint( _hours, _minutes, _setback ); + value->Release(); + } + driver->ReleaseNodes(); + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Remove a switch point from the schedule +//----------------------------------------------------------------------------- +bool Manager::RemoveSwitchPoint +( + ValueID const& _id, + uint8 const _hours, + uint8 const _minutes +) +{ + bool res = false; + + if( ValueID::ValueType_Schedule == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueSchedule* value = static_cast( driver->GetValue( _id ) ) ) + { + uint8 idx; + res = value->FindSwitchPoint( _hours, _minutes, &idx ); + + if( res ) + { + res = value->RemoveSwitchPoint( idx ); + } + value->Release(); + } + driver->ReleaseNodes(); + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Clears all switch points from the schedule +//----------------------------------------------------------------------------- +void Manager::ClearSwitchPoints +( + ValueID const& _id +) +{ + if( ValueID::ValueType_Schedule == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueSchedule* value = static_cast( driver->GetValue( _id ) ) ) + { + value->ClearSwitchPoints(); + value->Release(); + } + driver->ReleaseNodes(); + } + } +} + +//----------------------------------------------------------------------------- +// +// Gets switch point data from the schedule +//----------------------------------------------------------------------------- +bool Manager::GetSwitchPoint +( + ValueID const& _id, + uint8 const _idx, + uint8* o_hours, + uint8* o_minutes, + int8* o_setback +) +{ + bool res = false; + + if( ValueID::ValueType_Schedule == _id.GetType() ) + { + if( Driver* driver = GetDriver( _id.GetHomeId() ) ) + { + driver->LockNodes(); + if( ValueSchedule* value = static_cast( driver->GetValue( _id ) ) ) + { + res = value->GetSwitchPoint( _idx, o_hours, o_minutes, o_setback ); + value->Release(); + } + driver->ReleaseNodes(); + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// SwitchAll +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// All devices that support the SwitchAll command class will be turned on +//----------------------------------------------------------------------------- +void Manager::SwitchAllOn +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->SwitchAllOn(); + } +} + +//----------------------------------------------------------------------------- +// +// All devices that support the SwitchAll command class will be turned off +//----------------------------------------------------------------------------- +void Manager::SwitchAllOff +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->SwitchAllOff(); + } +} + +//----------------------------------------------------------------------------- +// Configuration Parameters +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Set the value of one of the configuration parameters of a device +//----------------------------------------------------------------------------- +bool Manager::SetConfigParam +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _param, + int32 _value, + uint8 const _size +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->SetConfigParam( _nodeId, _param, _value, _size ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request the value of one of the configuration parameters of a device +//----------------------------------------------------------------------------- +void Manager::RequestConfigParam +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _param +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->RequestConfigParam( _nodeId, _param ); + } +} + +//----------------------------------------------------------------------------- +// +// Request the values of all of the known configuration parameters of a device +//----------------------------------------------------------------------------- +void Manager::RequestAllConfigParams +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + Node* node = driver->GetNode( _nodeId ); + if( node ) + { + node->SetQueryStage( Node::QueryStage_Configuration ); + driver->ReleaseNodes(); + } + } +} + +//----------------------------------------------------------------------------- +// Groups +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Gets the number of association groups reported by this node +//----------------------------------------------------------------------------- +uint8 Manager::GetNumGroups +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetNumGroups( _nodeId ); + } + + return 0; +} + +//----------------------------------------------------------------------------- +// +// Gets the associations for a group +//----------------------------------------------------------------------------- +uint32 Manager::GetAssociations +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _groupIdx, + uint8** o_associations +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetAssociations( _nodeId, _groupIdx, o_associations ); + } + + return 0; +} + +//----------------------------------------------------------------------------- +// +// Gets the maximum number of associations for a group +//----------------------------------------------------------------------------- +uint8 Manager::GetMaxAssociations +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _groupIdx +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetMaxAssociations( _nodeId, _groupIdx ); + } + + return 0; +} + +//----------------------------------------------------------------------------- +// +// Gets the label for a particular group +//----------------------------------------------------------------------------- +string Manager::GetGroupLabel +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _groupIdx +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->GetGroupLabel( _nodeId, _groupIdx ); + } + + return ""; +} + +//----------------------------------------------------------------------------- +// +// Adds a node to an association group +//----------------------------------------------------------------------------- +void Manager::AddAssociation +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _groupIdx, + uint8 const _targetNodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->AddAssociation( _nodeId, _groupIdx, _targetNodeId ); + } +} + +//----------------------------------------------------------------------------- +// +// Removes a node from an association group +//----------------------------------------------------------------------------- +void Manager::RemoveAssociation +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _groupIdx, + uint8 const _targetNodeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->RemoveAssociation( _nodeId, _groupIdx, _targetNodeId ); + } +} + + +//----------------------------------------------------------------------------- +// Notifications +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Add a watcher to the list +//----------------------------------------------------------------------------- +bool Manager::AddWatcher +( + pfnOnNotification_t _watcher, + void* _context +) +{ + // Ensure this watcher is not already on the list + m_notificationMutex->Lock(); + for( list::iterator it = m_watchers.begin(); it != m_watchers.end(); ++it ) + { + if( ((*it)->m_callback == _watcher ) && ( (*it)->m_context == _context ) ) + { + // Already in the list + m_notificationMutex->Unlock(); + return false; + } + } + + m_watchers.push_back( new Watcher( _watcher, _context ) ); + m_notificationMutex->Unlock(); + return true; +} + +//----------------------------------------------------------------------------- +// +// Remove a watcher from the list +//----------------------------------------------------------------------------- +bool Manager::RemoveWatcher +( + pfnOnNotification_t _watcher, + void* _context +) +{ + m_notificationMutex->Lock(); + list::iterator it = m_watchers.begin(); + while( it != m_watchers.end() ) + { + if( ((*it)->m_callback == _watcher ) && ( (*it)->m_context == _context ) ) + { + delete (*it); + m_watchers.erase( it ); + m_notificationMutex->Unlock(); + return true; + } + ++it; + } + + m_notificationMutex->Unlock(); + return false; +} + +//----------------------------------------------------------------------------- +// +// Notify any watching objects of a value change +//----------------------------------------------------------------------------- +void Manager::NotifyWatchers +( + Notification* _notification +) +{ + m_notificationMutex->Lock(); + for( list::iterator it = m_watchers.begin(); it != m_watchers.end(); ++it ) + { + Watcher* pWatcher = *it; + pWatcher->m_callback( _notification, pWatcher->m_context ); + } + m_notificationMutex->Unlock(); +} + +//----------------------------------------------------------------------------- +// Controller commands +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Reset controller and erase all node information +//----------------------------------------------------------------------------- +void Manager::ResetController +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + Event *event = new Event(); + driver->ResetController( event ); + Wait::Single( event ); + event->Release(); + string path = driver->GetControllerPath(); + Driver::ControllerInterface intf = driver->GetControllerInterfaceType(); + RemoveDriver( path ); + AddDriver( path, intf ); + Wait::Multiple( NULL, 0, 500 ); + } + RemoveAllScenes( _homeId ); +} + +//----------------------------------------------------------------------------- +// +// Soft-reset the Z-Wave controller chip +//----------------------------------------------------------------------------- +void Manager::SoftReset +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->SoftReset(); + } +} + +//----------------------------------------------------------------------------- +// +// Start the controller performing one of its network management functions +//----------------------------------------------------------------------------- +bool Manager::BeginControllerCommand +( + uint32 const _homeId, + Driver::ControllerCommand _command, + Driver::pfnControllerCallback_t _callback, // = NULL + void* _context, // = NULL + bool _highPower, // = false + uint8 _nodeId, // = 0xff + uint8 _arg // = 0 +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return driver->BeginControllerCommand( _command, _callback, _context, _highPower, _nodeId, _arg ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Stop the current controller function +//----------------------------------------------------------------------------- +bool Manager::CancelControllerCommand +( + uint32 const _homeId +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + return( driver->CancelControllerCommand() ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Send a number of test messages to a node and record results. +//----------------------------------------------------------------------------- +void Manager::TestNetworkNode +( + uint32 const _homeId, + uint8 const _nodeId, + uint32 const _count +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->TestNetwork( _nodeId, _count ); + } +} + +//----------------------------------------------------------------------------- +// +// Send a number of test messages to every node and record results. +//----------------------------------------------------------------------------- +void Manager::TestNetwork +( + uint32 const _homeId, + uint32 const _count +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->TestNetwork( 0, _count ); + } +} + +//----------------------------------------------------------------------------- +// +// Heal a single node in the network +//----------------------------------------------------------------------------- +void Manager::HealNetworkNode +( + uint32 const _homeId, + uint8 const _nodeId, + bool _doRR +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + Node* node = driver->GetNode( _nodeId ); + if( node ) + { + driver->BeginControllerCommand( Driver::ControllerCommand_RequestNodeNeighborUpdate, NULL, NULL, true, _nodeId, 0 ); + if( _doRR ) + { + driver->UpdateNodeRoutes( _nodeId, true ); + } + driver->ReleaseNodes(); + } + } +} + +//----------------------------------------------------------------------------- +// +// Heal the Z-Wave network one node at a time. +//----------------------------------------------------------------------------- +void Manager::HealNetwork +( + uint32 const _homeId, + bool _doRR +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->LockNodes(); + for( uint8 i=0; i<255; i++ ) + { + if( driver->m_nodes[i] != NULL ) + { + driver->BeginControllerCommand( Driver::ControllerCommand_RequestNodeNeighborUpdate, NULL, NULL, true, i, 0 ); + if( _doRR ) + { + driver->UpdateNodeRoutes( i, true ); + } + } + } + driver->ReleaseNodes(); + } +} + +//----------------------------------------------------------------------------- +// +// Return the number of defined scenes. +//----------------------------------------------------------------------------- +uint8 Manager::GetNumScenes +( +) +{ + return Scene::s_sceneCnt; +} + +//----------------------------------------------------------------------------- +// +// Return an array of all Scene Ids +//----------------------------------------------------------------------------- +uint8 Manager::GetAllScenes +( + uint8** _sceneIds +) +{ + *_sceneIds = NULL; + return Scene::GetAllScenes( _sceneIds ); +} + +//----------------------------------------------------------------------------- +// +// Remove every scene id +//----------------------------------------------------------------------------- +void Manager::RemoveAllScenes +( + uint32 const _homeId +) +{ + for( int i = 1; i < 256; i++ ) + { + if( _homeId == 0 ) // remove every device from every scene + { + RemoveScene( i ); + } + else + { + Scene *scene = Scene::Get( i ); + if( scene != NULL ) + { + scene->RemoveValues( _homeId ); + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Create a new scene and return new Scene ID. +//----------------------------------------------------------------------------- +uint8 Manager::CreateScene +( +) +{ + for( int i = 1; i < 256; i++ ) + { + Scene* scene = Scene::Get( i ); + if( scene != NULL ) + { + continue; + } + new Scene( i ); + return i; + } + return 0; +} + +//----------------------------------------------------------------------------- +// +// Remove scene and delete its contents +//----------------------------------------------------------------------------- +bool Manager::RemoveScene +( + uint8 const _sceneId +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + delete scene; + return true; + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Add a bool ValueID/value pair to the scene +//----------------------------------------------------------------------------- +bool Manager::AddSceneValue +( + uint8 const _sceneId, + ValueID const& _valueId, + bool const _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + return scene->AddValue( _valueId, _value ? "True" : "False"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Add a byte ValueID/value pair to the scene +//----------------------------------------------------------------------------- +bool Manager::AddSceneValue +( + uint8 const _sceneId, + ValueID const& _valueId, + uint8 const _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + char str[16]; + snprintf( str, sizeof(str), "%d", _value ); + return scene->AddValue( _valueId, str ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Add a decimal ValueID/value pair to the scene +//----------------------------------------------------------------------------- +bool Manager::AddSceneValue +( + uint8 const _sceneId, + ValueID const& _valueId, + float const _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + char str[16]; + snprintf( str, sizeof(str), "%f", _value ); + return scene->AddValue( _valueId, str ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Add an integer ValueID/value pair to the scene +//----------------------------------------------------------------------------- +bool Manager::AddSceneValue +( + uint8 const _sceneId, + ValueID const& _valueId, + int32 const _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + char str[16]; + snprintf( str, sizeof(str), "%d", _value ); + return scene->AddValue( _valueId, str ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Add a short ValueID/value pair to the scene +//----------------------------------------------------------------------------- +bool Manager::AddSceneValue +( + uint8 const _sceneId, + ValueID const& _valueId, + int16 const _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + char str[16]; + snprintf( str, sizeof(str), "%d", _value ); + return scene->AddValue( _valueId, str ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Add a string ValueID/value pair to the scene +//----------------------------------------------------------------------------- +bool Manager::AddSceneValue +( + uint8 const _sceneId, + ValueID const& _valueId, + string const& _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + return scene->AddValue( _valueId, _value ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Add a list selection item ValueID/value pair to the scene (as string) +//----------------------------------------------------------------------------- +bool Manager::AddSceneValueListSelection +( + uint8 const _sceneId, + ValueID const& _valueId, + string const& _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + return scene->AddValue( _valueId, _value ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Add a list selection item ValueID/value pair to the scene (as integer) +//----------------------------------------------------------------------------- +bool Manager::AddSceneValueListSelection +( + uint8 const _sceneId, + ValueID const& _valueId, + int32 const _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + char str[16]; + snprintf( str, sizeof(str), "%d", _value ); + return scene->AddValue( _valueId, str ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Remove a ValueID/value pair from the scene +//----------------------------------------------------------------------------- +bool Manager::RemoveSceneValue +( + uint8 const _sceneId, + ValueID const& _valueId +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + return scene->RemoveValue( _valueId ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Return a scene's Value ID +//----------------------------------------------------------------------------- +int Manager::SceneGetValues +( + uint8 const _sceneId, + vector* o_value +) +{ + o_value->clear(); + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + return scene->GetValues( o_value ); + } + return 0; +} + +//----------------------------------------------------------------------------- +// +// Return a scene's Value ID bool value +//----------------------------------------------------------------------------- +bool Manager::SceneGetValueAsBool +( + uint8 const _sceneId, + ValueID const& _valueId, + bool* o_value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + string str; + if( scene->GetValue( _valueId, &str ) ) + { + *o_value = !strcasecmp( "true", str.c_str() ); + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Return a scene's Value ID byte value +//----------------------------------------------------------------------------- +bool Manager::SceneGetValueAsByte +( + uint8 const _sceneId, + ValueID const& _valueId, + uint8* o_value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + string str; + if( scene->GetValue( _valueId, &str ) ) + { + *o_value = (uint8)atoi( str.c_str() ); + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Return a scene's Value ID float value +//----------------------------------------------------------------------------- +bool Manager::SceneGetValueAsFloat +( + uint8 const _sceneId, + ValueID const& _valueId, + float* o_value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + string str; + if( scene->GetValue( _valueId, &str ) ) + { + *o_value = (float)atof( str.c_str() ); + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Return a scene's Value ID integer value +//----------------------------------------------------------------------------- +bool Manager::SceneGetValueAsInt +( + uint8 const _sceneId, + ValueID const& _valueId, + int32* o_value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + string str; + if( scene->GetValue( _valueId, &str ) ) + { + *o_value = (int32)atoi( str.c_str() ); + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Return a scene's Value ID short value +//----------------------------------------------------------------------------- +bool Manager::SceneGetValueAsShort +( + uint8 const _sceneId, + ValueID const& _valueId, + int16* o_value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + string str; + if( scene->GetValue( _valueId, &str ) ) + { + *o_value = (int16)atoi( str.c_str() ); + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Return a scene's Value ID string value +//----------------------------------------------------------------------------- +bool Manager::SceneGetValueAsString +( + uint8 const _sceneId, + ValueID const& _valueId, + string* o_value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + if( scene->GetValue( _valueId, o_value ) ) + { + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Return a scene's Value ID list selection (as string) value +//----------------------------------------------------------------------------- +bool Manager::SceneGetValueListSelection +( + uint8 const _sceneId, + ValueID const& _valueId, + string* o_value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + if( scene->GetValue( _valueId, o_value ) ) + { + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Return a scene's Value ID list selection (as integer) value +//----------------------------------------------------------------------------- +bool Manager::SceneGetValueListSelection +( + uint8 const _sceneId, + ValueID const& _valueId, + int32* o_value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + string str; + if( scene->GetValue( _valueId, &str ) ) + { + *o_value = (int32)atoi( str.c_str() ); + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a scene's ValueID bool value. +//----------------------------------------------------------------------------- +bool Manager::SetSceneValue +( + uint8 const _sceneId, + ValueID const& _valueId, + bool const _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + return scene->SetValue( _valueId, _value ? "True" : "False" ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a scene's ValueID byte value. +//----------------------------------------------------------------------------- +bool Manager::SetSceneValue +( + uint8 const _sceneId, + ValueID const& _valueId, + uint8 const _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + char str[16]; + snprintf( str, sizeof(str), "%d", _value ); + return scene->SetValue( _valueId, str ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a scene's ValueID float value. +//----------------------------------------------------------------------------- +bool Manager::SetSceneValue +( + uint8 const _sceneId, + ValueID const& _valueId, + float const _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + char str[16]; + snprintf( str, sizeof(str), "%f", _value ); + return scene->SetValue( _valueId, str ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a scene's ValueID integer value. +//----------------------------------------------------------------------------- +bool Manager::SetSceneValue +( + uint8 const _sceneId, + ValueID const& _valueId, + int32 const _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + char str[16]; + snprintf( str, sizeof(str), "%d", _value ); + return scene->SetValue( _valueId, str ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a scene's ValueID short value. +//----------------------------------------------------------------------------- +bool Manager::SetSceneValue +( + uint8 const _sceneId, + ValueID const& _valueId, + int16 const _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + char str[16]; + snprintf( str, sizeof(str), "%d", _value ); + return scene->SetValue( _valueId, str ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a scene's ValueID string value. +//----------------------------------------------------------------------------- +bool Manager::SetSceneValue +( + uint8 const _sceneId, + ValueID const& _valueId, + string const& _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + return scene->SetValue( _valueId, _value ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a scene's ValueID list item value (as string). +//----------------------------------------------------------------------------- +bool Manager::SetSceneValueListSelection +( + uint8 const _sceneId, + ValueID const& _valueId, + string const& _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + return scene->SetValue( _valueId, _value ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a scene's ValueID list item value (as integer). +//----------------------------------------------------------------------------- +bool Manager::SetSceneValueListSelection +( + uint8 const _sceneId, + ValueID const& _valueId, + int32 const _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + char str[16]; + snprintf( str, sizeof(str), "%d", _value ); + return scene->SetValue( _valueId, str ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Return a scene's label +//----------------------------------------------------------------------------- +string Manager::GetSceneLabel +( + uint8 const _sceneId +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + return scene->GetLabel(); + } + return NULL; +} + +//----------------------------------------------------------------------------- +// +// Set a scene's label +//----------------------------------------------------------------------------- +void Manager::SetSceneLabel +( + uint8 const _sceneId, + string const& _value +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + scene->SetLabel( _value ); + } +} + +//----------------------------------------------------------------------------- +// +// Check if a Scene ID exists +//----------------------------------------------------------------------------- +bool Manager::SceneExists +( + uint8 const _sceneId +) +{ + return Scene::Get( _sceneId ) != NULL; +} + +//----------------------------------------------------------------------------- +// +// Perform all the settings for the given Scene ID +//----------------------------------------------------------------------------- +bool Manager::ActivateScene +( + uint8 const _sceneId +) +{ + Scene *scene = Scene::Get( _sceneId ); + if( scene != NULL ) + { + return scene->Activate(); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Retrieve driver based counters. +//----------------------------------------------------------------------------- +void Manager::GetDriverStatistics +( + uint32 const _homeId, + Driver::DriverData* _data +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->GetDriverStatistics( _data ); + } + +} + +//----------------------------------------------------------------------------- +// +// Retrieve driver based counters. +//----------------------------------------------------------------------------- +void Manager::GetNodeStatistics +( + uint32 const _homeId, + uint8 const _nodeId, + Node::NodeData* _data +) +{ + if( Driver* driver = GetDriver( _homeId ) ) + { + driver->GetNodeStatistics( _nodeId, _data ); + } + +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/Manager.h b/lib/ESPiLight/pilight/libs/openzwave/Manager.h new file mode 100644 index 0000000..2d49625 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Manager.h @@ -0,0 +1,1924 @@ +//----------------------------------------------------------------------------- +// +// Manager.h +// +// The main public interface to OpenZWave. +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Manager_H +#define _Manager_H + +#include +#include +#include +#include +#include +#include + +#include "Defs.h" +#include "Driver.h" +#include "value_classes/ValueID.h" + +namespace OpenZWave +{ + class Options; + class Node; + class Msg; + class Value; + class Event; + class Mutex; + class SerialPort; + class Thread; + class Notification; + class ValueBool; + class ValueByte; + class ValueDecimal; + class ValueInt; + class ValueList; + class ValueShort; + class ValueString; + class ValueRaw; + + /** \brief + * The main public interface to OpenZWave. + * + * \nosubgrouping + * A singleton class providing the main public interface to OpenZWave. + * The Manager class exposes all the functionality required to add + * Z-Wave support to an application. It handles the sending and receiving + * of Z-Wave messages as well as the configuration of a Z-Wave network + * and its devices, freeing the library user from the burden of learning + * the low-level details of the Z-Wave protocol. + *

        + * All Z-Wave functionality is accessed via the Manager class. While this + * does not make for the most efficient code structure, it does enable + * the library to handle potentially complex and hard-to-debug issues + * such as multi-threading and object lifespans behind the scenes. + * Application development is therefore simplified and less prone to bugs. + *

        + * There can be only one instance of the Manager class, and all applications + * will start by calling Manager::Create static method to create that instance. + * From then on, a call to the Manager::Get static method will return the + * pointer to the Manager object. On application exit, Manager::Destroy + * should be called to allow OpenZWave to clean up and delete any other + * objects it has created. + *

        + * Once the Manager has been created, a call should be made to Manager::AddWatcher + * to install a notification callback handler. This handler will receive + * notifications of Z-Wave network changes and updates to device values, and is + * an essential element of OpenZWave. + *

        + * Next, a call should be made to Manager::AddDriver for each Z-Wave controller + * attached to the PC. Each Driver will handle the sending and receiving of + * messages for all the devices in its controller's Z-Wave network. The Driver + * will read any previously saved configuration and then query the Z-Wave controller + * for any missing information. Once that process is complete, a DriverReady + * notification callback will be sent containing the Home ID of the controller, + * which is required by most of the other Manager class methods. + *

        + * [After the DriverReady notification is sent, the Driver will poll each node on + * the network to update information about each node. After all "awake" nodes + * have been polled, an "AllAwakeNodesQueried" notification is sent. This is when + * a client application can expect all of the node information (both static + * information, like the physical device's capabilities, session information + * (like [associations and/or names] and dynamic information (like temperature or + * on/off state) to be available. Finally, after all nodes (whether listening or + * sleeping) have been polled, an "AllNodesQueried" notification is sent.] + */ + class OPENZWAVE_EXPORT Manager + { + friend class Driver; + friend class CommandClass; + friend class Group; + friend class Node; + friend class Value; + friend class ValueStore; + friend class ValueButton; + + public: + typedef void (*pfnOnNotification_t)( Notification const* _pNotification, void* _context ); + + //----------------------------------------------------------------------------- + // Construction + //----------------------------------------------------------------------------- + /** \name Construction + * For creating and destroying the Manager singleton. + */ + /*@{*/ + public: + /** + * \brief Creates the Manager singleton object. + * The Manager provides the public interface to OpenZWave, exposing all the functionality required + * to add Z-Wave support to an application. There can be only one Manager in an OpenZWave application. + * An Options object must be created and Locked first, otherwise the call to Manager::Create will + * fail. Once the Manager has been created, call AddWatcher to install a notification callback handler, + * and then call the AddDriver method for each attached PC Z-Wave controller in turn. + * \param _options a locked Options object containing all the application's configurable option values. + * \return a pointer to the newly created Manager object, or NULL if creation failed. + * \see Options, Get, Destroy, AddWatcher, AddDriver + */ + static Manager* Create(); + + /** + * \brief Gets a pointer to the Manager object. + * \return pointer to the Manager object, or NULL if Create has not yet been called. + * \see Create, Destroy + */ + static Manager* Get(){ return s_instance; } + + /** + * \brief Deletes the Manager and cleans up any associated objects. + * \see Create, Get + */ + static void Destroy(); + + /** + * \brief Get the Version Number of OZW as a string + * \return a String representing the version number as MAJOR.MINOR.REVISION + */ + static std::string getVersionAsString(); + + /** + * \brief Get the Version Number as the Version Struct (Only Major/Minor returned) + * \return the version struct representing the version + */ + static ozwversion getVersion(); + /*@}*/ + + private: + Manager(); // Constructor, to be called only via the static Create method. + virtual ~Manager(); // Destructor, to be called only via the static Destroy method. + + bool m_exit; // Flag indicating that program exit is in progress. + static Manager* s_instance; // Pointer to the instance of the Manager singleton. + + //----------------------------------------------------------------------------- + // Configuration + //----------------------------------------------------------------------------- + /** \name Configuration + * For saving the Z-Wave network configuration so that the entire network does not need to be + * polled every time the application starts. + */ + /*@{*/ + public: + /** + * \brief Saves the configuration of a PC Controller's Z-Wave network to the application's user data folder. + * This method does not normally need to be called, since OpenZWave will save the state automatically + * during the shutdown process. It is provided here only as an aid to development. + * The configuration of each PC Controller's Z-Wave network is stored in a separate file. The filename + * consists of the 8 digit hexadecimal version of the controller's Home ID, prefixed with the string 'zwcfg_'. + * This convention allows OpenZWave to find the correct configuration file for a controller, even if it is + * attached to a different serial port, USB device path, etc. + * \param _homeId The Home ID of the Z-Wave controller to save. + */ + void WriteConfig( uint32 const _homeId ); + + /** + * \brief Gets a pointer to the locked Options object. + * \return pointer to the Options object. + * \see Create + */ + Options* GetOptions()const{ return m_options; } + /*@}*/ + + private: + Options* m_options; // Pointer to the locked Options object that was passed in during creation. + + //----------------------------------------------------------------------------- + // Drivers + //----------------------------------------------------------------------------- + /** \name Drivers + * Methods for adding and removing drivers and obtaining basic controller information. + */ + /*@{*/ + public: + /** + * \brief Creates a new driver for a Z-Wave controller. + * This method creates a Driver object for handling communications with a single Z-Wave controller. In the background, the + * driver first tries to read configuration data saved during a previous run. It then queries the controller directly for any + * missing information, and a refresh of the list of nodes that it controls. Once this information + * has been received, a DriverReady notification callback is sent, containing the Home ID of the controller. This Home ID is + * required by most of the OpenZWave Manager class methods. + * @param _controllerPath The string used to open the controller. On Windows this might be something like + * "\\.\COM3", or on Linux "/dev/ttyUSB0". + * \return True if a new driver was created, false if a driver for the controller already exists. + * \see Create, Get, RemoveDriver + */ + bool AddDriver( string const& _controllerPath, Driver::ControllerInterface const& _interface = Driver::ControllerInterface_Serial); + + /** + * \brief Removes the driver for a Z-Wave controller, and closes the controller. + * Drivers do not need to be explicitly removed before calling Destroy - this is handled automatically. + * \warning You should NOT call any Manager methods that require the Driver Reference (eg, in response to + * Notifications recieved about NodeRemoved etc) once you call this, as your application will most likely + * break + * @param _controllerPath The same string as was passed in the original call to AddDriver. + * @returns True if the driver was removed, false if it could not be found. + * @see Destroy, AddDriver + */ + bool RemoveDriver( string const& _controllerPath ); + + /** + * \brief Get the node ID of the Z-Wave controller. + * \param _homeId The Home ID of the Z-Wave controller. + * \return the node ID of the Z-Wave controller. + */ + uint8 GetControllerNodeId( uint32 const _homeId ); + + /** + * \brief Get the node ID of the Static Update Controller. + * \param _homeId The Home ID of the Z-Wave controller. + * \return the node ID of the Z-Wave controller. + */ + uint8 GetSUCNodeId( uint32 const _homeId ); + + /** + * \brief Query if the controller is a primary controller. + * The primary controller is the main device used to configure and control a Z-Wave network. + * There can only be one primary controller - all other controllers are secondary controllers. + *

        + * The only difference between a primary and secondary controller is that the primary is the + * only one that can be used to add or remove other devices. For this reason, it is usually + * better for the promary controller to be portable, since most devices must be added when + * installed in their final location. + *

        + * Calls to BeginControllerCommand will fail if the controller is not the primary. + * \param _homeId The Home ID of the Z-Wave controller. + * \return true if it is a primary controller, false if not. + */ + bool IsPrimaryController( uint32 const _homeId ); + + /** + * \brief Query if the controller is a static update controller. + * A Static Update Controller (SUC) is a controller that must never be moved in normal operation + * and which can be used by other nodes to receive information about network changes. + * \param _homeId The Home ID of the Z-Wave controller. + * \return true if it is a static update controller, false if not. + */ + bool IsStaticUpdateController( uint32 const _homeId ); + + /** + * \brief Query if the controller is using the bridge controller library. + * A bridge controller is able to create virtual nodes that can be associated + * with other controllers to enable events to be passed on. + * \param _homeId The Home ID of the Z-Wave controller. + * \return true if it is a bridge controller, false if not. + */ + bool IsBridgeController( uint32 const _homeId ); + + /** + * \brief Get the version of the Z-Wave API library used by a controller. + * \param _homeId The Home ID of the Z-Wave controller. + * \return a string containing the library version. For example, "Z-Wave 2.48". + */ + string GetLibraryVersion( uint32 const _homeId ); + + /** + * \brief Get a string containing the Z-Wave API library type used by a controller. + * The possible library types are: + * - Static Controller + * - Controller + * - Enhanced Slave + * - Slave + * - Installer + * - Routing Slave + * - Bridge Controller + * - Device Under Test + * The controller should never return a slave library type. + * For a more efficient test of whether a controller is a Bridge Controller, use + * the IsBridgeController method. + * \param _homeId The Home ID of the Z-Wave controller. + * \return a string containing the library type. + * \see GetLibraryVersion, IsBridgeController + */ + string GetLibraryTypeName( uint32 const _homeId ); + + /** + * \brief Get count of messages in the outgoing send queue. + * \param _homeId The Home ID of the Z-Wave controller. + * \return a integer message count + */ + int32 GetSendQueueCount( uint32 const _homeId ); + + /** + * \brief Send current driver statistics to the log file + * \param _homeId The Home ID of the Z-Wave controller. + */ + void LogDriverStatistics( uint32 const _homeId ); + + /** + * \brief Obtain controller interface type + * \param _homeId The Home ID of the Z-Wave controller. + */ + Driver::ControllerInterface GetControllerInterfaceType( uint32 const _homeId ); + + /** + * \brief Obtain controller interface name + * \param _homeId The Home ID of the Z-Wave controller. + */ + string GetControllerPath( uint32 const _homeId ); + /*@}*/ + + private: + Driver* GetDriver( uint32 const _homeId ); /**< Get a pointer to a Driver object from the HomeID. Only to be used by OpenZWave. */ + void SetDriverReady( Driver* _driver, bool success ); /**< Indicate that the Driver is ready to be used, and send the notification callback. */ + +OPENZWAVE_EXPORT_WARNINGS_OFF + list m_pendingDrivers; /**< Drivers that are in the process of reading saved data and querying their Z-Wave network for basic information. */ + map m_readyDrivers; /**< Drivers that are ready to be used by the application. */ +OPENZWAVE_EXPORT_WARNINGS_ON + + //----------------------------------------------------------------------------- + // Polling Z-Wave devices + //----------------------------------------------------------------------------- + /** \name Polling Z-Wave devices + * Methods for controlling the polling of Z-Wave devices. Modern devices will not + * require polling. Some old devices need to be polled as the only way to detect + * status changes. + */ + /*@{*/ + public: + /** + * \brief Get the time period between polls of a node's state. + */ + int32 GetPollInterval(); + + /** + * \brief Set the time period between polls of a node's state. + * Due to patent concerns, some devices do not report state changes automatically to the controller. + * These devices need to have their state polled at regular intervals. The length of the interval + * is the same for all devices. To even out the Z-Wave network traffic generated by polling, OpenZWave + * divides the polling interval by the number of devices that have polling enabled, and polls each + * in turn. It is recommended that if possible, the interval should not be set shorter than the + * number of polled devices in seconds (so that the network does not have to cope with more than one + * poll per second). + * \param _seconds The length of the polling interval in seconds. + */ + void SetPollInterval( int32 _milliseconds, bool _bIntervalBetweenPolls ); + + /** + * \brief Enable the polling of a device's state. + * \param _valueId The ID of the value to start polling. + * \return True if polling was enabled. + */ + bool EnablePoll( ValueID const &_valueId, uint8 const _intensity = 1 ); + + /** + * \brief Disable the polling of a device's state. + * \param _valueId The ID of the value to stop polling. + * \return True if polling was disabled. + */ + bool DisablePoll( ValueID const &_valueId ); + + /** + * \brief Determine the polling of a device's state. + * \param _valueId The ID of the value to check polling. + * \return True if polling is active. + */ + bool isPolled( ValueID const &_valueId ); + + /** + * \brief Set the frequency of polling (0=none, 1=every time through the list, 2-every other time, etc) + * \param _valueId The ID of the value whose intensity should be set + */ + void SetPollIntensity( ValueID const &_valueId, uint8 const _intensity ); + + /** + * \brief Get the polling intensity of a device's state. + * \param _valueId The ID of the value to check polling. + * \return Intensity, number of polling for one polling interval. + */ + uint8 GetPollIntensity( ValueID const &_valueId ); + + /*@}*/ + + //----------------------------------------------------------------------------- + // Node information + //----------------------------------------------------------------------------- + /** \name Node information + * Methods for accessing information on indivdual nodes. + */ + /*@{*/ + public: + /** + * \brief Trigger the fetching of fixed data about a node. + * Causes the node's data to be obtained from the Z-Wave network in the same way as if it had just been added. + * This method would normally be called automatically by OpenZWave, but if you know that a node has been + * changed, calling this method will force a refresh of all of the data held by the library. This can be especially + * useful for devices that were asleep when the application was first run. This is the + * same as the query state starting from the beginning. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return True if the request was sent successfully. + */ + bool RefreshNodeInfo( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Trigger the fetching of dynamic value data for a node. + * Causes the node's values to be requested from the Z-Wave network. This is the + * same as the query state starting from the associations state. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return True if the request was sent successfully. + */ + bool RequestNodeState( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Trigger the fetching of just the dynamic value data for a node. + * Causes the node's values to be requested from the Z-Wave network. This is the + * same as the query state starting from the dynamic state. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return True if the request was sent successfully. + */ + bool RequestNodeDynamic( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get whether the node is a listening device that does not go to sleep + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return True if it is a listening node. + */ + bool IsNodeListeningDevice( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get whether the node is a frequent listening device that goes to sleep but + * can be woken up by a beam. Useful to determine node and controller consistency. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return True if it is a frequent listening node. + */ + bool IsNodeFrequentListeningDevice( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get whether the node is a beam capable device. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return True if it is a beam capable node. + */ + bool IsNodeBeamingDevice( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get whether the node is a routing device that passes messages to other nodes + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return True if the node is a routing device + */ + bool IsNodeRoutingDevice( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get the security attribute for a node. True if node supports security features. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return true if security features implemented. + */ + bool IsNodeSecurityDevice( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get the maximum baud rate of a node's communications + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return the baud rate in bits per second. + */ + uint32 GetNodeMaxBaudRate( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get the version number of a node + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return the node's version number + */ + uint8 GetNodeVersion( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get the security byte of a node + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return the node's security byte + */ + uint8 GetNodeSecurity( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get the basic type of a node. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return the node's basic type. + */ + uint8 GetNodeBasic( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get the generic type of a node. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return the node's generic type. + */ + uint8 GetNodeGeneric( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get the specific type of a node. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return the node's specific type. + */ + uint8 GetNodeSpecific( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get a human-readable label describing the node + * The label is taken from the Z-Wave specific, generic or basic type, depending on which of those values are specified by the node. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return A string containing the label text. + */ + string GetNodeType( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get the bitmap of this node's neighbors + * + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \param _nodeNeighbors An array of 29 uint8s to hold the neighbor bitmap + */ + uint32 GetNodeNeighbors( uint32 const _homeId, uint8 const _nodeId, uint8** _nodeNeighbors ); + + /** + * \brief Get the manufacturer name of a device + * The manufacturer name would normally be handled by the Manufacturer Specific commmand class, + * taking the manufacturer ID reported by the device and using it to look up the name from the + * manufacturer_specific.xml file in the OpenZWave config folder. + * However, there are some devices that do not support the command class, so to enable the user + * to manually set the name, it is stored with the node data and accessed via this method rather + * than being reported via a command class Value object. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return A string containing the node's manufacturer name. + * \see SetNodeManufacturerName, GetNodeProductName, SetNodeProductName + */ + string GetNodeManufacturerName( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get the product name of a device + * The product name would normally be handled by the Manufacturer Specific commmand class, + * taking the product Type and ID reported by the device and using it to look up the name from the + * manufacturer_specific.xml file in the OpenZWave config folder. + * However, there are some devices that do not support the command class, so to enable the user + * to manually set the name, it is stored with the node data and accessed via this method rather + * than being reported via a command class Value object. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return A string containing the node's product name. + * \see SetNodeProductName, GetNodeManufacturerName, SetNodeManufacturerName + */ + string GetNodeProductName( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get the name of a node + * The node name is a user-editable label for the node that would normally be handled by the + * Node Naming commmand class, but many devices do not support it. So that a node can always + * be named, OpenZWave stores it with the node data, and provides access through this method + * and SetNodeName, rather than reporting it via a command class Value object. + * The maximum length of a node name is 16 characters. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return A string containing the node's name. + * \see SetNodeName, GetNodeLocation, SetNodeLocation + */ + string GetNodeName( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get the location of a node + * The node location is a user-editable string that would normally be handled by the Node Naming + * commmand class, but many devices do not support it. So that a node can always report its + * location, OpenZWave stores it with the node data, and provides access through this method + * and SetNodeLocation, rather than reporting it via a command class Value object. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return A string containing the node's location. + * \see SetNodeLocation, GetNodeName, SetNodeName + */ + string GetNodeLocation( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get the manufacturer ID of a device + * The manufacturer ID is a four digit hex code and would normally be handled by the Manufacturer + * Specific commmand class, but not all devices support it. Although the value reported by this + * method will be an empty string if the command class is not supported and cannot be set by the + * user, the manufacturer ID is still stored with the node data (rather than being reported via a + * command class Value object) to retain a consistent approach with the other manufacturer specific data. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return A string containing the node's manufacturer ID, or an empty string if the manufactuer + * specific command class is not supported by the device. + * \see GetNodeProductType, GetNodeProductId, GetNodeManufacturerName, GetNodeProductName + */ + string GetNodeManufacturerId( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get the product type of a device + * The product type is a four digit hex code and would normally be handled by the Manufacturer Specific + * commmand class, but not all devices support it. Although the value reported by this method will + * be an empty string if the command class is not supported and cannot be set by the user, the product + * type is still stored with the node data (rather than being reported via a command class Value object) + * to retain a consistent approach with the other manufacturer specific data. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return A string containing the node's product type, or an empty string if the manufactuer + * specific command class is not supported by the device. + * \see GetNodeManufacturerId, GetNodeProductId, GetNodeManufacturerName, GetNodeProductName + */ + string GetNodeProductType( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get the product ID of a device + * The product ID is a four digit hex code and would normally be handled by the Manufacturer Specific + * commmand class, but not all devices support it. Although the value reported by this method will + * be an empty string if the command class is not supported and cannot be set by the user, the product + * ID is still stored with the node data (rather than being reported via a command class Value object) + * to retain a consistent approach with the other manufacturer specific data. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return A string containing the node's product ID, or an empty string if the manufactuer + * specific command class is not supported by the device. + * \see GetNodeManufacturerId, GetNodeProductType, GetNodeManufacturerName, GetNodeProductName + */ + string GetNodeProductId( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Set the manufacturer name of a device + * The manufacturer name would normally be handled by the Manufacturer Specific commmand class, + * taking the manufacturer ID reported by the device and using it to look up the name from the + * manufacturer_specific.xml file in the OpenZWave config folder. + * However, there are some devices that do not support the command class, so to enable the user + * to manually set the name, it is stored with the node data and accessed via this method rather + * than being reported via a command class Value object. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \param _manufacturerName A string containing the node's manufacturer name. + * \see GetNodeManufacturerName, GetNodeProductName, SetNodeProductName + */ + void SetNodeManufacturerName( uint32 const _homeId, uint8 const _nodeId, string const& _manufacturerName ); + + /** + * \brief Set the product name of a device + * The product name would normally be handled by the Manufacturer Specific commmand class, + * taking the product Type and ID reported by the device and using it to look up the name from the + * manufacturer_specific.xml file in the OpenZWave config folder. + * However, there are some devices that do not support the command class, so to enable the user + * to manually set the name, it is stored with the node data and accessed via this method rather + * than being reported via a command class Value object. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \param _productName A string containing the node's product name. + * \see GetNodeProductName, GetNodeManufacturerName, SetNodeManufacturerName + */ + void SetNodeProductName( uint32 const _homeId, uint8 const _nodeId, string const& _productName ); + + /** + * \brief Set the name of a node + * The node name is a user-editable label for the node that would normally be handled by the + * Node Naming commmand class, but many devices do not support it. So that a node can always + * be named, OpenZWave stores it with the node data, and provides access through this method + * and GetNodeName, rather than reporting it via a command class Value object. + * If the device does support the Node Naming command class, the new name will be sent to the node. + * The maximum length of a node name is 16 characters. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \param _nodeName A string containing the node's name. + * \see GetNodeName, GetNodeLocation, SetNodeLocation + */ + void SetNodeName( uint32 const _homeId, uint8 const _nodeId, string const& _nodeName ); + + /** + * \brief Set the location of a node + * The node location is a user-editable string that would normally be handled by the Node Naming + * commmand class, but many devices do not support it. So that a node can always report its + * location, OpenZWave stores it with the node data, and provides access through this method + * and GetNodeLocation, rather than reporting it via a command class Value object. + * If the device does support the Node Naming command class, the new location will be sent to the node. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \param _location A string containing the node's location. + * \see GetNodeLocation, GetNodeName, SetNodeName + */ + void SetNodeLocation( uint32 const _homeId, uint8 const _nodeId, string const& _location ); + + /** + * \brief Turns a node on + * This is a helper method to simplify basic control of a node. It is the equivalent of + * changing the level reported by the node's Basic command class to 255, and will generate a + * ValueChanged notification from that class. This command will turn on the device at its + * last known level, if supported by the device, otherwise it will turn it on at 100%. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to be changed. + * \see SetNodeOff, SetNodeLevel + */ + void SetNodeOn( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Turns a node off + * This is a helper method to simplify basic control of a node. It is the equivalent of + * changing the level reported by the node's Basic command class to zero, and will generate + * a ValueChanged notification from that class. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to be changed. + * \see SetNodeOn, SetNodeLevel + */ + void SetNodeOff( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Sets the basic level of a node + * This is a helper method to simplify basic control of a node. It is the equivalent of + * changing the value reported by the node's Basic command class and will generate a + * ValueChanged notification from that class. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to be changed. + * \param _level The level to set the node. Valid values are 0-99 and 255. Zero is off and + * 99 is fully on. 255 will turn on the device at its last known level (if supported). + * \see SetNodeOn, SetNodeOff + */ + void SetNodeLevel( uint32 const _homeId, uint8 const _nodeId, uint8 const _level ); + + /** + * \brief Get whether the node information has been received + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return True if the node information has been received yet + */ + bool IsNodeInfoReceived( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get whether the node has the defined class available or not + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \param _commandClassId Id of the class to test for + * \return True if the node does have the class instantiated, will return name & version + */ + bool GetNodeClassInformation( uint32 const _homeId, uint8 const _nodeId, uint8 const _commandClassId, + string *_className = NULL, uint8 *_classVersion = NULL); + /** + * \brief Get whether the node is awake or asleep + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return True if the node is awake + */ + bool IsNodeAwake( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get whether the node is working or has failed + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return True if the node has failed and is no longer part of the network + */ + bool IsNodeFailed( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Get whether the node's query stage as a string + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to query. + * \return name of current query stage as a string. + */ + string GetNodeQueryStage( uint32 const _homeId, uint8 const _nodeId ); + + /*@}*/ + + //----------------------------------------------------------------------------- + // Values + //----------------------------------------------------------------------------- + /** \name Values + * Methods for accessing device values. All the methods require a ValueID, which will have been provided + * in the ValueAdded Notification callback when the the value was first discovered by OpenZWave. + */ + /*@{*/ + public: + /** + * \brief Gets the user-friendly label for the value. + * \param _id The unique identifier of the value. + * \return The value label. + * \see ValueID + */ + string GetValueLabel( ValueID const& _id ); + + /** + * \brief Sets the user-friendly label for the value. + * \param _id The unique identifier of the value. + * \param _value The new value of the label. + * \see ValueID + */ + void SetValueLabel( ValueID const& _id, string const& _value ); + + /** + * \brief Gets the units that the value is measured in. + * \param _id The unique identifier of the value. + * \return The value units. + * \see ValueID + */ + string GetValueUnits( ValueID const& _id ); + + /** + * \brief Sets the units that the value is measured in. + * \param _id The unique identifier of the value. + * \param _value The new value of the units. + * \see ValueID + */ + void SetValueUnits( ValueID const& _id, string const& _value ); + + /** + * \brief Gets a help string describing the value's purpose and usage. + * \param _id The unique identifier of the value. + * \return The value help text. + * \see ValueID + */ + string GetValueHelp( ValueID const& _id ); + + /** + * \brief Sets a help string describing the value's purpose and usage. + * \param _id The unique identifier of the value. + * \param _value The new value of the help text. + * \see ValueID + */ + void SetValueHelp( ValueID const& _id, string const& _value ); + + /** + * \brief Gets the minimum that this value may contain. + * \param _id The unique identifier of the value. + * \return The value minimum. + * \see ValueID + */ + int32 GetValueMin( ValueID const& _id ); + + /** + * \brief Gets the maximum that this value may contain. + * \param _id The unique identifier of the value. + * \return The value maximum. + * \see ValueID + */ + int32 GetValueMax( ValueID const& _id ); + + /** + * \brief Test whether the value is read-only. + * \param _id The unique identifier of the value. + * \return true if the value cannot be changed by the user. + * \see ValueID + */ + bool IsValueReadOnly( ValueID const& _id ); + + /** + * \brief Test whether the value is write-only. + * \param _id The unique identifier of the value. + * \return true if the value can only be written to and not read. + * \see ValueID + */ + bool IsValueWriteOnly( ValueID const& _id ); + + /** + * \brief Test whether the value has been set. + * \param _id The unique identifier of the value. + * \return true if the value has actually been set by a status message from the device, rather than simply being the default. + * \see ValueID + */ + bool IsValueSet( ValueID const& _id ); + + /** + * \brief Test whether the value is currently being polled. + * \param _id The unique identifier of the value. + * \return true if the value is being polled, otherwise false. + * \see ValueID + */ + bool IsValuePolled( ValueID const& _id ); + + /** + * \brief Gets a value as a bool. + * \param _id The unique identifier of the value. + * \param o_value Pointer to a bool that will be filled with the value. + * \return true if the value was obtained. Returns false if the value is not a ValueID::ValueType_Bool. The type can be tested with a call to ValueID::GetType. + * \see ValueID::GetType, GetValueAsByte, GetValueAsFloat, GetValueAsInt, GetValueAsShort, GetValueAsString, GetValueListSelection, GetValueListItems, GetValueAsRaw + */ + bool GetValueAsBool( ValueID const& _id, bool* o_value ); + + /** + * \brief Gets a value as an 8-bit unsigned integer. + * \param _id The unique identifier of the value. + * \param o_value Pointer to a uint8 that will be filled with the value. + * \return true if the value was obtained. Returns false if the value is not a ValueID::ValueType_Byte. The type can be tested with a call to ValueID::GetType + * \see ValueID::GetType, GetValueAsBool, GetValueAsFloat, GetValueAsInt, GetValueAsShort, GetValueAsString, GetValueListSelection, GetValueListItems, GetValueAsRaw + */ + bool GetValueAsByte( ValueID const& _id, uint8* o_value ); + + /** + * \brief Gets a value as a float. + * \param _id The unique identifier of the value. + * \param o_value Pointer to a float that will be filled with the value. + * \return true if the value was obtained. Returns false if the value is not a ValueID::ValueType_Decimal. The type can be tested with a call to ValueID::GetType + * \see ValueID::GetType, GetValueAsBool, GetValueAsByte, GetValueAsInt, GetValueAsShort, GetValueAsString, GetValueListSelection, GetValueListItems, GetValueAsRaw + */ + bool GetValueAsFloat( ValueID const& _id, float* o_value ); + + /** + * \brief Gets a value as a 32-bit signed integer. + * \param _id The unique identifier of the value. + * \param o_value Pointer to an int32 that will be filled with the value. + * \return true if the value was obtained. Returns false if the value is not a ValueID::ValueType_Int. The type can be tested with a call to ValueID::GetType + * \see ValueID::GetType, GetValueAsBool, GetValueAsByte, GetValueAsFloat, GetValueAsShort, GetValueAsString, GetValueListSelection, GetValueListItems, GetValueAsRaw + */ + bool GetValueAsInt( ValueID const& _id, int32* o_value ); + + /** + * \brief Gets a value as a 16-bit signed integer. + * \param _id The unique identifier of the value. + * \param o_value Pointer to an int16 that will be filled with the value. + * \return true if the value was obtained. Returns false if the value is not a ValueID::ValueType_Short. The type can be tested with a call to ValueID::GetType. + * \see ValueID::GetType, GetValueAsBool, GetValueAsByte, GetValueAsFloat, GetValueAsInt, GetValueAsString, GetValueListSelection, GetValueListItems, GetValueAsRaw + */ + bool GetValueAsShort( ValueID const& _id, int16* o_value ); + + /** + * \brief Gets a value as a string. + * Creates a string representation of a value, regardless of type. + * \param _id The unique identifier of the value. + * \param o_value Pointer to a string that will be filled with the value. + * \return true if the value was obtained. + * \see ValueID::GetType, GetValueAsBool, GetValueAsByte, GetValueAsFloat, GetValueAsInt, GetValueAsShort, GetValueListSelection, GetValueListItems, GetValueAsRaw + */ + bool GetValueAsString( ValueID const& _id, string* o_value ); + + /** + * \brief Gets a value as a collection of bytes. + * \param _id The unique identifier of the value. + * \param o_value Pointer to a uint8* that will be filled with the value. This return value will need to be freed as it was dynamically allocated. + * \param o_length Pointer to a uint8 that will be fill with the data length. + * \return true if the value was obtained. Returns false if the value is not a ValueID::ValueType_Raw. The type can be tested with a call to ValueID::GetType. + * \see ValueID::GetType, GetValueAsBool, GetValueAsByte, GetValueAsFloat, GetValueAsInt, GetValueAsShort, GetValueListSelection, GetValueListItems, GetValueAsRaw + */ + bool GetValueAsRaw( ValueID const& _id, uint8** o_value, uint8* o_length ); + + /** + * \brief Gets the selected item from a list (as a string). + * \param _id The unique identifier of the value. + * \param o_value Pointer to a string that will be filled with the selected item. + * \return True if the value was obtained. Returns false if the value is not a ValueID::ValueType_List. The type can be tested with a call to ValueID::GetType. + * \see ValueID::GetType, GetValueAsBool, GetValueAsByte, GetValueAsFloat, GetValueAsInt, GetValueAsShort, GetValueAsString, GetValueListItems, GetValueAsRaw + */ + bool GetValueListSelection( ValueID const& _id, string* o_value ); + + /** + * \brief Gets the selected item from a list (as an integer). + * \param _id The unique identifier of the value. + * \param o_value Pointer to an integer that will be filled with the selected item. + * \return True if the value was obtained. Returns false if the value is not a ValueID::ValueType_List. The type can be tested with a call to ValueID::GetType. + * \see ValueID::GetType, GetValueAsBool, GetValueAsByte, GetValueAsFloat, GetValueAsInt, GetValueAsShort, GetValueAsString, GetValueListItems, GetValueAsRaw + */ + bool GetValueListSelection( ValueID const& _id, int32* o_value ); + + /** + * \brief Gets the list of items from a list value. + * \param _id The unique identifier of the value. + * \param o_value Pointer to a vector of strings that will be filled with list items. The vector will be cleared before the items are added. + * \return true if the list items were obtained. Returns false if the value is not a ValueID::ValueType_List. The type can be tested with a call to ValueID::GetType. + * \see ValueID::GetType, GetValueAsBool, GetValueAsByte, GetValueAsFloat, GetValueAsInt, GetValueAsShort, GetValueAsString, GetValueListSelection, GetValueAsRaw + */ + bool GetValueListItems( ValueID const& _id, vector* o_value ); + + /** + * \brief Gets a float value's precision. + * \param _id The unique identifier of the value. + * \param o_value Pointer to a uint8 that will be filled with the precision value. + * \return true if the value was obtained. Returns false if the value is not a ValueID::ValueType_Decimal. The type can be tested with a call to ValueID::GetType + * \see ValueID::GetType, GetValueAsBool, GetValueAsByte, GetValueAsInt, GetValueAsShort, GetValueAsString, GetValueListSelection, GetValueListItems + */ + bool GetValueFloatPrecision( ValueID const& _id, uint8* o_value ); + + /** + * \brief Sets the state of a bool. + * Due to the possibility of a device being asleep, the command is assumed to suceed, and the value + * held by the node is updated directly. This will be reverted by a future status message from the device + * if the Z-Wave message actually failed to get through. Notification callbacks will be sent in both cases. + * \param _id The unique identifier of the bool value. + * \param _value The new value of the bool. + * \return true if the value was set. Returns false if the value is not a ValueID::ValueType_Bool. The type can be tested with a call to ValueID::GetType. + */ + bool SetValue( ValueID const& _id, bool const _value ); + + /** + * \brief Sets the value of a byte. + * Due to the possibility of a device being asleep, the command is assumed to suceed, and the value + * held by the node is updated directly. This will be reverted by a future status message from the device + * if the Z-Wave message actually failed to get through. Notification callbacks will be sent in both cases. + * \param _id The unique identifier of the byte value. + * \param _value The new value of the byte. + * \return true if the value was set. Returns false if the value is not a ValueID::ValueType_Byte. The type can be tested with a call to ValueID::GetType. + */ + bool SetValue( ValueID const& _id, uint8 const _value ); + + /** + * \brief Sets the value of a decimal. + * It is usually better to handle decimal values using strings rather than floats, to avoid floating point accuracy issues. + * Due to the possibility of a device being asleep, the command is assumed to succeed, and the value + * held by the node is updated directly. This will be reverted by a future status message from the device + * if the Z-Wave message actually failed to get through. Notification callbacks will be sent in both cases. + * \param _id The unique identifier of the decimal value. + * \param _value The new value of the decimal. + * \return true if the value was set. Returns false if the value is not a ValueID::ValueType_Decimal. The type can be tested with a call to ValueID::GetType. + */ + bool SetValue( ValueID const& _id, float const _value ); + + /** + * \brief Sets the value of a 32-bit signed integer. + * Due to the possibility of a device being asleep, the command is assumed to suceed, and the value + * held by the node is updated directly. This will be reverted by a future status message from the device + * if the Z-Wave message actually failed to get through. Notification callbacks will be sent in both cases. + * \param _id The unique identifier of the integer value. + * \param _value The new value of the integer. + * \return true if the value was set. Returns false if the value is not a ValueID::ValueType_Int. The type can be tested with a call to ValueID::GetType. + */ + bool SetValue( ValueID const& _id, int32 const _value ); + + /** + * \brief Sets the value of a 16-bit signed integer. + * Due to the possibility of a device being asleep, the command is assumed to suceed, and the value + * held by the node is updated directly. This will be reverted by a future status message from the device + * if the Z-Wave message actually failed to get through. Notification callbacks will be sent in both cases. + * \param _id The unique identifier of the integer value. + * \param _value The new value of the integer. + * \return true if the value was set. Returns false if the value is not a ValueID::ValueType_Short. The type can be tested with a call to ValueID::GetType. + */ + bool SetValue( ValueID const& _id, int16 const _value ); + + /** + * \brief Sets the value of a collection of bytes. + * Due to the possibility of a device being asleep, the command is assumed to suceed, and the value + * held by the node is updated directly. This will be reverted by a future status message from the device + * if the Z-Wave message actually failed to get through. Notification callbacks will be sent in both cases. + * \param _id The unique identifier of the raw value. + * \param _value The new collection of bytes. + * \return true if the value was set. Returns false if the value is not a ValueID::ValueType_Raw. The type can be tested with a call to ValueID::GetType. + */ + bool SetValue( ValueID const& _id, uint8 const* _value, uint8 const _length ); + + /** + * \brief Sets the value from a string, regardless of type. + * Due to the possibility of a device being asleep, the command is assumed to suceed, and the value + * held by the node is updated directly. This will be reverted by a future status message from the device + * if the Z-Wave message actually failed to get through. Notification callbacks will be sent in both cases. + * \param _id The unique identifier of the integer value. + * \param _value The new value of the string. + * \return true if the value was set. Returns false if the value could not be parsed into the correct type for the value. + */ + bool SetValue( ValueID const& _id, string const& _value ); + + /** + * \brief Sets the selected item in a list. + * Due to the possibility of a device being asleep, the command is assumed to suceed, and the value + * held by the node is updated directly. This will be reverted by a future status message from the device + * if the Z-Wave message actually failed to get through. Notification callbacks will be sent in both cases. + * \param _id The unique identifier of the list value. + * \param _selectedItem A string matching the new selected item in the list. + * \return true if the value was set. Returns false if the selection is not in the list, or if the value is not a ValueID::ValueType_List. + * The type can be tested with a call to ValueID::GetType + */ + bool SetValueListSelection( ValueID const& _id, string const& _selectedItem ); + + /** + * \brief Refreshes the specified value from the Z-Wave network. + * A call to this function causes the library to send a message to the network to retrieve the current value + * of the specified ValueID (just like a poll, except only one-time, not recurring). + * \param _id The unique identifier of the value to be refreshed. + * \return true if the driver and node were found; false otherwise + */ + bool RefreshValue( ValueID const& _id); + + /** + * \brief Sets a flag indicating whether value changes noted upon a refresh should be verified. If so, the + * library will immediately refresh the value a second time whenever a change is observed. This helps to filter + * out spurious data reported occasionally by some devices. + * \param _id The unique identifier of the value whose changes should or should not be verified. + * \param _verify if true, verify changes; if false, don't verify changes. + */ + void SetChangeVerified( ValueID const& _id, bool _verify ); + + /** + * \brief Starts an activity in a device. + * Since buttons are write-only values that do not report a state, no notification callbacks are sent. + * \param _id The unique identifier of the integer value. + * \return true if the activity was started. Returns false if the value is not a ValueID::ValueType_Button. The type can be tested with a call to ValueID::GetType. + */ + bool PressButton( ValueID const& _id ); + + /** + * \brief Stops an activity in a device. + * Since buttons are write-only values that do not report a state, no notification callbacks are sent. + * \param _id The unique identifier of the integer value. + * \return true if the activity was stopped. Returns false if the value is not a ValueID::ValueType_Button. The type can be tested with a call to ValueID::GetType. + */ + bool ReleaseButton( ValueID const& _id ); + /*@}*/ + + //----------------------------------------------------------------------------- + // Climate Control Schedules + //----------------------------------------------------------------------------- + /** \name Climate Control Schedules + * Methods for accessing schedule values. All the methods require a ValueID, which will have been provided + * in the ValueAdded Notification callback when the the value was first discovered by OpenZWave. + *

        The ValueType_Schedule is a specialized Value used to simplify access to the switch point schedule + * information held by a setback thermostat that supports the Climate Control Schedule command class. + * Each schedule contains up to nine switch points for a single day, consisting of a time in + * hours and minutes (24 hour clock) and a setback in tenths of a degree Celsius. The setback value can + * range from -128 (-12.8C) to 120 (12.0C). There are two special setback values - 121 is used to set + * Frost Protection mode, and 122 is used to set Energy Saving mode. + *

        The switch point methods only modify OpenZWave's copy of the schedule information. Once all changes + * have been made, they are sent to the device by calling SetSchedule. + */ + /*@{*/ + + /** + * \brief Get the number of switch points defined in a schedule. + * \param _id The unique identifier of the schedule value. + * \return the number of switch points defined in this schedule. Returns zero if the value is not a ValueID::ValueType_Schedule. The type can be tested with a call to ValueID::GetType. + */ + uint8 GetNumSwitchPoints( ValueID const& _id ); + + /** + * \brief Set a switch point in the schedule. + * Inserts a new switch point into the schedule, unless a switch point already exists at the specified + * time in which case that switch point is updated with the new setback value instead. + * A maximum of nine switch points can be set in the schedule. + * \param _id The unique identifier of the schedule value. + * \param _hours The hours part of the time when the switch point will trigger. The time is set using + * the 24-hour clock, so this value must be between 0 and 23. + * \param _minutes The minutes part of the time when the switch point will trigger. This value must be + * between 0 and 59. + * \param _setback The setback in tenths of a degree Celsius. The setback value can range from -128 (-12.8C) + * to 120 (12.0C). There are two special setback values - 121 is used to set Frost Protection mode, and + * 122 is used to set Energy Saving mode. + * \return true if successful. Returns false if the value is not a ValueID::ValueType_Schedule. The type can be tested with a call to ValueID::GetType. + * \see GetNumSwitchPoints, RemoveSwitchPoint, ClearSwitchPoints + */ + bool SetSwitchPoint( ValueID const& _id, uint8 const _hours, uint8 const _minutes, int8 const _setback ); + + /** + * \brief Remove a switch point from the schedule. + * Removes the switch point at the specified time from the schedule. + * \param _id The unique identifier of the schedule value. + * \param _hours The hours part of the time when the switch point will trigger. The time is set using + * the 24-hour clock, so this value must be between 0 and 23. + * \param _minutes The minutes part of the time when the switch point will trigger. This value must be + * between 0 and 59. + * \return true if successful. Returns false if the value is not a ValueID::ValueType_Schedule or if there + * is not switch point with the specified time values. The type can be tested with a call to ValueID::GetType. + * \see GetNumSwitchPoints, SetSwitchPoint, ClearSwitchPoints + */ + bool RemoveSwitchPoint( ValueID const& _id, uint8 const _hours, uint8 const _minutes ); + + /** + * \brief Clears all switch points from the schedule. + * \param _id The unique identifier of the schedule value. + * \see GetNumSwitchPoints, SetSwitchPoint, RemoveSwitchPoint + */ + void ClearSwitchPoints( ValueID const& _id ); + + /** + * \brief Gets switch point data from the schedule. + * Retrieves the time and setback values from a switch point in the schedule. + * \param _id The unique identifier of the schedule value. + * \param _idx The index of the switch point, between zero and one less than the value + * returned by GetNumSwitchPoints. + * \param o_hours a pointer to a uint8 that will be filled with the hours part of the switch point data. + * \param o_minutes a pointer to a uint8 that will be filled with the minutes part of the switch point data. + * \param o_setback a pointer to an int8 that will be filled with the setback value. This can range from -128 + * (-12.8C)to 120 (12.0C). There are two special setback values - 121 is used to set Frost Protection mode, and + * 122 is used to set Energy Saving mode. + * \return true if successful. Returns false if the value is not a ValueID::ValueType_Schedule. The type can be tested with a call to ValueID::GetType. + * \see GetNumSwitchPoints + */ + bool GetSwitchPoint( ValueID const& _id, uint8 const _idx, uint8* o_hours, uint8* o_minutes, int8* o_setback ); + + /*@}*/ + + //----------------------------------------------------------------------------- + // SwitchAll + //----------------------------------------------------------------------------- + /** \name SwitchAll + * Methods for switching all devices on or off together. The devices must support + * the SwitchAll command class. The command is first broadcast to all nodes, and + * then followed up with individual commands to each node (because broadcasts are + * not routed, the message might not otherwise reach all the nodes). + */ + /*@{*/ + + /** + * \brief Switch all devices on. + * All devices that support the SwitchAll command class will be turned on. + */ + void SwitchAllOn( uint32 const _homeId ); + + /** + * \brief Switch all devices off. + * All devices that support the SwitchAll command class will be turned off. + */ + void SwitchAllOff( uint32 const _homeId ); + + /*@}*/ + + //----------------------------------------------------------------------------- + // Configuration Parameters + //----------------------------------------------------------------------------- + /** \name Configuration Parameters + * Methods for accessing device configuration parameters. + * Configuration parameters are values that are managed by the Configuration command class. + * The values are device-specific and are not reported by the devices. Information on parameters + * is provided only in the device user manual. + *

        An ongoing task for the OpenZWave project is to create XML files describing the available + * parameters for every Z-Wave. See the config folder in the project source code for examples. + */ + /*@{*/ + public: + /** + * \brief Set the value of a configurable parameter in a device. + * Some devices have various parameters that can be configured to control the device behaviour. + * These are not reported by the device over the Z-Wave network, but can usually be found in + * the device's user manual. + * This method returns immediately, without waiting for confirmation from the device that the + * change has been made. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to configure. + * \param _param The index of the parameter. + * \param _value The value to which the parameter should be set. + * \param _size Is an optional number of bytes to be sent for the paramter _value. Defaults to 2. + * \return true if the a message setting the value was sent to the device. + * \see RequestConfigParam + */ + bool SetConfigParam( uint32 const _homeId, uint8 const _nodeId, uint8 const _param, int32 _value, uint8 const _size = 2 ); + + /** + * \brief Request the value of a configurable parameter from a device. + * Some devices have various parameters that can be configured to control the device behaviour. + * These are not reported by the device over the Z-Wave network, but can usually be found in + * the device's user manual. + * This method requests the value of a parameter from the device, and then returns immediately, + * without waiting for a response. If the parameter index is valid for this device, and the + * device is awake, the value will eventually be reported via a ValueChanged notification callback. + * The ValueID reported in the callback will have an index set the same as _param and a command class + * set to the same value as returned by a call to Configuration::StaticGetCommandClassId. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to configure. + * \param _param The index of the parameter. + * \see SetConfigParam, ValueID, Notification + */ + void RequestConfigParam( uint32 const _homeId, uint8 const _nodeId, uint8 const _param ); + + /** + * \brief Request the values of all known configurable parameters from a device. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node to configure. + * \see SetConfigParam, ValueID, Notification + */ + void RequestAllConfigParams( uint32 const _homeId, uint8 const _nodeId ); + /*@}*/ + + //----------------------------------------------------------------------------- + // Groups (wrappers for the Node methods) + //----------------------------------------------------------------------------- + /** \name Groups + * Methods for accessing device association groups. + */ + /*@{*/ + public: + /** + * \brief Gets the number of association groups reported by this node + * In Z-Wave, groups are numbered starting from one. For example, if a call to GetNumGroups returns 4, the _groupIdx + * value to use in calls to GetAssociations, AddAssociation and RemoveAssociation will be a number between 1 and 4. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node whose groups we are interested in. + * \return The number of groups. + * \see GetAssociations, GetMaxAssociations, AddAssociation, RemoveAssociation + */ + uint8 GetNumGroups( uint32 const _homeId, uint8 const _nodeId ); + + /** + * \brief Gets the associations for a group. + * Makes a copy of the list of associated nodes in the group, and returns it in an array of uint8's. + * The caller is responsible for freeing the array memory with a call to delete []. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node whose associations we are interested in. + * \param _groupIdx One-based index of the group (because Z-Wave product manuals use one-based group numbering). + * \param o_associations If the number of associations returned is greater than zero, o_associations will be set to point to an array containing the IDs of the associated nodes. + * \return The number of nodes in the associations array. If zero, the array will point to NULL, and does not need to be deleted. + * \see GetNumGroups, AddAssociation, RemoveAssociation, GetMaxAssociations + */ + uint32 GetAssociations( uint32 const _homeId, uint8 const _nodeId, uint8 const _groupIdx, uint8** o_associations ); + + /** + * \brief Gets the maximum number of associations for a group. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node whose associations we are interested in. + * \param _groupIdx one-based index of the group (because Z-Wave product manuals use one-based group numbering). + * \return The maximum number of nodes that can be associated into the group. + * \see GetNumGroups, AddAssociation, RemoveAssociation, GetAssociations + */ + uint8 GetMaxAssociations( uint32 const _homeId, uint8 const _nodeId, uint8 const _groupIdx ); + + /** + * \brief Returns a label for the particular group of a node. + * This label is populated by the device specific configuration files. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node whose associations are to be changed. + * \param _groupIdx One-based index of the group (because Z-Wave product manuals use one-based group numbering). + * \see GetNumGroups, GetAssociations, GetMaxAssociations, AddAssociation + */ + string GetGroupLabel( uint32 const _homeId, uint8 const _nodeId, uint8 const _groupIdx ); + + /** + * \brief Adds a node to an association group. + * Due to the possibility of a device being asleep, the command is assumed to suceed, and the association data + * held in this class is updated directly. This will be reverted by a future Association message from the device + * if the Z-Wave message actually failed to get through. Notification callbacks will be sent in both cases. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node whose associations are to be changed. + * \param _groupIdx One-based index of the group (because Z-Wave product manuals use one-based group numbering). + * \param _targetNodeId Identifier for the node that will be added to the association group. + * \see GetNumGroups, GetAssociations, GetMaxAssociations, RemoveAssociation + */ + void AddAssociation( uint32 const _homeId, uint8 const _nodeId, uint8 const _groupIdx, uint8 const _targetNodeId ); + + /** + * \brief Removes a node from an association group. + * Due to the possibility of a device being asleep, the command is assumed to suceed, and the association data + * held in this class is updated directly. This will be reverted by a future Association message from the device + * if the Z-Wave message actually failed to get through. Notification callbacks will be sent in both cases. + * \param _homeId The Home ID of the Z-Wave controller that manages the node. + * \param _nodeId The ID of the node whose associations are to be changed. + * \param _groupIdx One-based index of the group (because Z-Wave product manuals use one-based group numbering). + * \param _targetNodeId Identifier for the node that will be removed from the association group. + * \see GetNumGroups, GetAssociations, GetMaxAssociations, AddAssociation + */ + void RemoveAssociation( uint32 const _homeId, uint8 const _nodeId, uint8 const _groupIdx, uint8 const _targetNodeId ); + + /*@}*/ + + //----------------------------------------------------------------------------- + // Notifications + //----------------------------------------------------------------------------- + /** \name Notifications + * For notification of changes to the Z-Wave network or device values and associations. + */ + /*@{*/ + public: + /** + * \brief Add a notification watcher. + * In OpenZWave, all feedback from the Z-Wave network is sent to the application via callbacks. + * This method allows the application to add a notification callback handler, known as a "watcher" to OpenZWave. + * An application needs only add a single watcher - all notifications will be reported to it. + * \param _watcher pointer to a function that will be called by the notification system. + * \param _context pointer to user defined data that will be passed to the watcher function with each notification. + * \return true if the watcher was successfully added. + * \see RemoveWatcher, Notification + */ + bool AddWatcher( pfnOnNotification_t _watcher, void* _context ); + + /** + * \brief Remove a notification watcher. + * \param _watcher pointer to a function that must match that passed to a previous call to AddWatcher + * \param _context pointer to user defined data that must match the one passed in that same previous call to AddWatcher. + * \return true if the watcher was successfully removed. + * \see AddWatcher, Notification + */ + bool RemoveWatcher( pfnOnNotification_t _watcher, void* _context ); + /*@}*/ + + private: + void NotifyWatchers( Notification* _notification ); // Passes the notifications to all the registered watcher callbacks in turn. + + struct Watcher + { + pfnOnNotification_t m_callback; + void* m_context; + + Watcher + ( + pfnOnNotification_t _callback, + void* _context + ): + m_callback( _callback ), + m_context( _context ) + { + } + }; + +OPENZWAVE_EXPORT_WARNINGS_OFF + list m_watchers; // List of all the registered watchers. +OPENZWAVE_EXPORT_WARNINGS_ON + Mutex* m_notificationMutex; + + //----------------------------------------------------------------------------- + // Controller commands + //----------------------------------------------------------------------------- + /** \name Controller Commands + * Commands for Z-Wave network management using the PC Controller. + */ + /*@{*/ + public: + /** + * \brief Hard Reset a PC Z-Wave Controller. + * Resets a controller and erases its network configuration settings. The controller becomes a primary controller ready to add devices to a new network. + * \param _homeId The Home ID of the Z-Wave controller to be reset. + * \see SoftReset + */ + void ResetController( uint32 const _homeId ); + + /** + * \brief Soft Reset a PC Z-Wave Controller. + * Resets a controller without erasing its network configuration settings. + * \param _homeId The Home ID of the Z-Wave controller to be reset. + * \see SoftReset + */ + void SoftReset( uint32 const _homeId ); + + /** + * \brief Start a controller command process. + * \param _homeId The Home ID of the Z-Wave controller. + * \param _command The command to be sent to the controller. + * \param _callback pointer to a function that will be called at various stages during the command process + * to notify the user of progress or to request actions on the user's part. Defaults to NULL. + * \param _context pointer to user defined data that will be passed into to the callback function. Defaults to NULL. + * \param _highPower used only with the AddDevice, AddController, RemoveDevice and RemoveController commands. + * Usually when adding or removing devices, the controller operates at low power so that the controller must + * be physically close to the device for security reasons. If _highPower is true, the controller will + * operate at normal power levels instead. Defaults to false. + * \param _nodeId is the node ID used by the command if necessary. + * \param _arg is an optional argument, usually another node ID, that is used by the command. + * \return true if the command was accepted and has queued to be executed. + * \see CancelControllerCommand, HasNodeFailed, RemoveFailedNode, Driver::ControllerCommand, Driver::pfnControllerCallback_t, + *

        Commands + * - Driver::ControllerCommand_AddDevice - Add a new device or controller to the Z-Wave network. + * - Driver::ControllerCommand_CreateNewPrimary - Create a new primary controller when old primary fails. Requires SUC. + * - Driver::ControllerCommand_ReceiveConfiguration - Receive network configuration information from primary controller. Requires secondary. + * - Driver::ControllerCommand_RemoveDevice - Remove a device or controller from the Z-Wave network. + * - Driver::ControllerCommand_RemoveFailedNode - Remove a node from the network. The node must not be responding + * and be on the controller's failed node list. + * - Driver::ControllerCommand_HasNodeFailed - Check whether a node is in the controller's failed nodes list. + * - Driver::ControllerCommand_ReplaceFailedNode - Replace a failed device with another. If the node is not in + * the controller's failed nodes list, or the node responds, this command will fail. + * - Driver:: ControllerCommand_TransferPrimaryRole - Add a new controller to the network and + * make it the primary. The existing primary will become a secondary controller. + * - Driver::ControllerCommand_RequestNetworkUpdate - Update the controller with network information from the SUC/SIS. + * - Driver::ControllerCommand_RequestNodeNeighborUpdate - Get a node to rebuild its neighbour list. This method also does RequestNodeNeighbors afterwards. + * - Driver::ControllerCommand_AssignReturnRoute - Assign a network return route to a device. + * - Driver::ControllerCommand_DeleteAllReturnRoutes - Delete all network return routes from a device. + * - Driver::ControllerCommand_SendNodeInformation - Send a node information frame. + * - Driver::ControllerCommand_ReplicationSend - Send information from primary to secondary + * - Driver::ControllerCommand_CreateButton - Create a handheld button id. + * - Driver::ControllerCommand_DeleteButton - Delete a handheld button id. + *

        Callbacks + * - Driver::ControllerState_Starting, the controller command has begun + * - Driver::ControllerState_Waiting, the controller is waiting for a user action. A notice should be displayed + * to the user at this point, telling them what to do next. + * For the add, remove, replace and transfer primary role commands, the user needs to be told to press the + * inclusion button on the device that is going to be added or removed. For ControllerCommand_ReceiveConfiguration, + * they must set their other controller to send its data, and for ControllerCommand_CreateNewPrimary, set the other + * controller to learn new data. + * - Driver::ControllerState_InProgress - the controller is in the process of adding or removing the chosen node. It is now too late to cancel the command. + * - Driver::ControllerState_Complete - the controller has finished adding or removing the node, and the command is complete. + * - Driver::ControllerState_Failed - will be sent if the command fails for any reason. + */ + bool BeginControllerCommand( uint32 const _homeId, Driver::ControllerCommand _command, Driver::pfnControllerCallback_t _callback = NULL, void* _context = NULL, bool _highPower = false, uint8 _nodeId = 0xff, uint8 _arg = 0 ); + + /** + * \brief Cancels any in-progress command running on a controller. + * \param _homeId The Home ID of the Z-Wave controller. + * \return true if a command was running and was cancelled. + * \see BeginControllerCommand + */ + bool CancelControllerCommand( uint32 const _homeId ); + /*@}*/ + + //----------------------------------------------------------------------------- + // Network commands + //----------------------------------------------------------------------------- + /** \name Network Commands + * Commands for Z-Wave network for testing, routing and other internal + * operations. + */ + /*@{*/ + public: + /** + * \brief Test network node. + * Sends a series of messages to a network node for testing network reliability. + * \param _homeId The Home ID of the Z-Wave controller to be reset. + * \param _count This is the number of test messages to send. + * \see TestNetwork + */ + void TestNetworkNode( uint32 const _homeId, uint8 const _nodeId, uint32 const _count ); + + /** + * \brief Test network. + * Sends a series of messages to every node on the network for testing network reliability. + * \param _homeId The Home ID of the Z-Wave controller to be reset. + * \param _count This is the number of test messages to send. + * \see TestNetwork + */ + void TestNetwork( uint32 const _homeId, uint32 const _count ); + + /** + * \brief Heal network node by requesting the node rediscover their neighbors. + * Sends a ControllerCommand_RequestNodeNeighborUpdate to the node. + * \param _homeId The Home ID of the Z-Wave network to be healed. + * \param _nodeId The node to heal. + * \param _doRR Whether to perform return routes initialization. + */ + void HealNetworkNode( uint32 const _homeId, uint8 const _nodeId, bool _doRR ); + + /** + * \brief Heal network by requesting node's rediscover their neighbors. + * Sends a ControllerCommand_RequestNodeNeighborUpdate to every node. + * Can take a while on larger networks. + * \param _homeId The Home ID of the Z-Wave network to be healed. + * \param _doRR Whether to perform return routes initialization. + */ + void HealNetwork( uint32 const _homeId, bool _doRR ); + + /*@}*/ + + //----------------------------------------------------------------------------- + // Scene commands + //----------------------------------------------------------------------------- + /** \name Scene Commands + * Commands for Z-Wave scene interface. + */ + /*@{*/ + public: + /** + * \brief Gets the number of scenes that have been defined. + * \return The number of scenes. + * \see GetAllScenes, RemoveAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + uint8 GetNumScenes( ); + + /** + * \brief Gets a list of all the SceneIds. + * \param _sceneIds is a pointer to an array of integers. + * \return The number of scenes. If zero, _sceneIds will be NULL and doesn't need to be freed. + * \see GetNumScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + uint8 GetAllScenes( uint8** _sceneIds ); + + /** + * \brief Remove all the SceneIds. + * \param _homeId The Home ID of the Z-Wave controller. 0 for all devices from all scenes. + * \see GetAllScenes, GetNumScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + void RemoveAllScenes( uint32 const _homeId ); + + /** + * \brief Create a new Scene passing in Scene ID + * \return uint8 Scene ID used to reference the scene. 0 is failure result. + * \see GetNumScenes, GetAllScenes, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + + */ + uint8 CreateScene(); + + /** + * \brief Remove an existing Scene. + * \param _sceneId is an integer representing the unique Scene ID to be removed. + * \return true if scene was removed. + * \see GetNumScenes, GetAllScenes, CreateScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool RemoveScene( uint8 const _sceneId ); + + /** + * \brief Add a bool Value ID to an existing scene. + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the bool value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool AddSceneValue( uint8 const _sceneId, ValueID const& _valueId, bool const _value ); + + /** + * \brief Add a byte Value ID to an existing scene. + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the byte value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool AddSceneValue( uint8 const _sceneId, ValueID const& _valueId, uint8 const _value ); + + /** + * \brief Add a decimal Value ID to an existing scene. + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the float value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool AddSceneValue( uint8 const _sceneId, ValueID const& _valueId, float const _value ); + + /** + * \brief Add a 32-bit signed integer Value ID to an existing scene. + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the int32 value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool AddSceneValue( uint8 const _sceneId, ValueID const& _valueId, int32 const _value ); + + /** + * \brief Add a 16-bit signed integer Value ID to an existing scene. + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the int16 value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool AddSceneValue( uint8 const _sceneId, ValueID const& _valueId, int16 const _value ); + + /** + * \brief Add a string Value ID to an existing scene. + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the string value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool AddSceneValue( uint8 const _sceneId, ValueID const& _valueId, string const& _value ); + + /** + * \brief Add the selected item list Value ID to an existing scene (as a string). + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the string value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool AddSceneValueListSelection( uint8 const _sceneId, ValueID const& _valueId, string const& _value ); + + /** + * \brief Add the selected item list Value ID to an existing scene (as a integer). + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the integer value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool AddSceneValueListSelection( uint8 const _sceneId, ValueID const& _valueId, int32 const _value ); + + /** + * \brief Remove the Value ID from an existing scene. + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be removed. + * \return true if Value ID was removed. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool RemoveSceneValue( uint8 const _sceneId, ValueID const& _valueId ); + + /** + * \brief Retrieves the scene's list of values. + * \param _sceneId The Scene ID of the scene to retrieve the value from. + * \param o_value Pointer to an array of ValueIDs if return is non-zero. + * \return The number of nodes in the o_value array. If zero, the array will point to NULL and does not need to be deleted. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + int SceneGetValues( uint8 const _sceneId, vector* o_value ); + + /** + * \brief Retrieves a scene's value as a bool. + * \param _sceneId The Scene ID of the scene to retrieve the value from. + * \param _valueId The Value ID of the value to retrieve. + * \param o_value Pointer to a bool that will be filled with the returned value. + * \return true if the value was obtained. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SceneGetValueAsBool( uint8 const _sceneId, ValueID const& _valueId, bool* o_value ); + + /** + * \brief Retrieves a scene's value as an 8-bit unsigned integer. + * \param _sceneId The Scene ID of the scene to retrieve the value from. + * \param _valueId The Value ID of the value to retrieve. + * \param o_value Pointer to a uint8 that will be filled with the returned value. + * \return true if the value was obtained. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SceneGetValueAsByte( uint8 const _sceneId, ValueID const& _valueId, uint8* o_value ); + + /** + * \brief Retrieves a scene's value as a float. + * \param _sceneId The Scene ID of the scene to retrieve the value from. + * \param _valueId The Value ID of the value to retrieve. + * \param o_value Pointer to a float that will be filled with the returned value. + * \return true if the value was obtained. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SceneGetValueAsFloat( uint8 const _sceneId, ValueID const& _valueId, float* o_value ); + + /** + * \brief Retrieves a scene's value as a 32-bit signed integer. + * \param _sceneId The Scene ID of the scene to retrieve the value from. + * \param _valueId The Value ID of the value to retrieve. + * \param o_value Pointer to a int32 that will be filled with the returned value. + * \return true if the value was obtained. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SceneGetValueAsInt( uint8 const _sceneId, ValueID const& _valueId, int32* o_value ); + + /** + * \brief Retrieves a scene's value as a 16-bit signed integer. + * \param _sceneId The Scene ID of the scene to retrieve the value from. + * \param _valueId The Value ID of the value to retrieve. + * \param o_value Pointer to a int16 that will be filled with the returned value. + * \return true if the value was obtained. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SceneGetValueAsShort( uint8 const _sceneId, ValueID const& _valueId, int16* o_value ); + + /** + * \brief Retrieves a scene's value as a string. + * \param _sceneId The Scene ID of the scene to retrieve the value from. + * \param _valueId The Value ID of the value to retrieve. + * \param o_value Pointer to a string that will be filled with the returned value. + * \return true if the value was obtained. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SceneGetValueAsString( uint8 const _sceneId, ValueID const& _valueId, string* o_value ); + + /** + * \brief Retrieves a scene's value as a list (as a string). + * \param _sceneId The Scene ID of the scene to retrieve the value from. + * \param _valueId The Value ID of the value to retrieve. + * \param o_value Pointer to a string that will be filled with the returned value. + * \return true if the value was obtained. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SceneGetValueListSelection( uint8 const _sceneId, ValueID const& _valueId, string* o_value ); + + /** + * \brief Retrieves a scene's value as a list (as a integer). + * \param _sceneId The Scene ID of the scene to retrieve the value from. + * \param _valueId The Value ID of the value to retrieve. + * \param o_value Pointer to a integer that will be filled with the returned value. + * \return true if the value was obtained. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SceneGetValueListSelection( uint8 const _sceneId, ValueID const& _valueId, int32* o_value ); + + /** + * \brief Set a bool Value ID to an existing scene's ValueID + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the bool value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SetSceneValue( uint8 const _sceneId, ValueID const& _valueId, bool const _value ); + + /** + * \brief Set a byte Value ID to an existing scene's ValueID + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the byte value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SetSceneValue( uint8 const _sceneId, ValueID const& _valueId, uint8 const _value ); + + /** + * \brief Set a decimal Value ID to an existing scene's ValueID + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the float value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SetSceneValue( uint8 const _sceneId, ValueID const& _valueId, float const _value ); + + /** + * \brief Set a 32-bit signed integer Value ID to an existing scene's ValueID + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the int32 value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SetSceneValue( uint8 const _sceneId, ValueID const& _valueId, int32 const _value ); + + /** + * \brief Set a 16-bit integer Value ID to an existing scene's ValueID + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the int16 value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SetSceneValue( uint8 const _sceneId, ValueID const& _valueId, int16 const _value ); + + /** + * \brief Set a string Value ID to an existing scene's ValueID + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the string value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SetSceneValue( uint8 const _sceneId, ValueID const& _valueId, string const& _value ); + + /** + * \brief Set the list selected item Value ID to an existing scene's ValueID (as a string). + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the string value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SetSceneValueListSelection( uint8 const _sceneId, ValueID const& _valueId, string const& _value ); + + /** + * \brief Set the list selected item Value ID to an existing scene's ValueID (as a integer). + * \param _sceneId is an integer representing the unique Scene ID. + * \param _valueId is the Value ID to be added. + * \param _value is the integer value to be saved. + * \return true if Value ID was added. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists, ActivateScene + */ + bool SetSceneValueListSelection( uint8 const _sceneId, ValueID const& _valueId, int32 const _value ); + + /** + * \brief Returns a label for the particular scene. + * \param _sceneId The Scene ID + * \return The label string. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, SetSceneLabel, SceneExists, ActivateScene + */ + string GetSceneLabel( uint8 const _sceneId ); + + /** + * \brief Sets a label for the particular scene. + * \param _sceneId The Scene ID + * \param _value The new value of the label. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SceneExists, ActivateScene + */ + void SetSceneLabel( uint8 const _sceneId, string const& _value ); + + /** + * \brief Check if a Scene ID is defined. + * \param _sceneId The Scene ID. + * \return true if Scene ID exists. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, ActivateScene + */ + bool SceneExists( uint8 const _sceneId ); + + /** + * \brief Activate given scene to perform all its actions. + * \param _sceneId The Scene ID. + * \return true if it is successful. + * \see GetNumScenes, GetAllScenes, CreateScene, RemoveScene, AddSceneValue, RemoveSceneValue, SceneGetValues, SceneGetValueAsBool, SceneGetValueAsByte, SceneGetValueAsFloat, SceneGetValueAsInt, SceneGetValueAsShort, SceneGetValueAsString, SetSceneValue, GetSceneLabel, SetSceneLabel, SceneExists + */ + bool ActivateScene( uint8 const _sceneId ); + + /*@}*/ + + //----------------------------------------------------------------------------- + // Statistics interface + //----------------------------------------------------------------------------- + /** \name Statistics retrieval interface + * Commands for Z-Wave statistics interface. + */ + /*@{*/ + public: + /** + * \brief Retrieve statistics from driver + * \param _homeId The Home ID of the driver to obtain counters + * \param _data Pointer to structure DriverData to return values + */ + void GetDriverStatistics( uint32 const _homeId, Driver::DriverData* _data ); + + /** + * \brief Retrieve statistics per node + * \param _homeId The Home ID of the driver for the node + * \param _nodeId The node number + * \param _data Pointer to structure NodeData to return values + */ + void GetNodeStatistics( uint32 const _homeId, uint8 const _nodeId, Node::NodeData* _data ); + + }; + /*@}*/ +} // namespace OpenZWave + +#endif // _Manager_H diff --git a/lib/ESPiLight/pilight/libs/openzwave/Msg.cpp b/lib/ESPiLight/pilight/libs/openzwave/Msg.cpp new file mode 100644 index 0000000..200f658 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Msg.cpp @@ -0,0 +1,283 @@ +//----------------------------------------------------------------------------- +// +// Msg.cpp +// +// Represents a Z-Wave message +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "Defs.h" +#include "Msg.h" +#include "Node.h" +#include "platform/Log.h" +#include "command_classes/MultiInstance.h" + +using namespace OpenZWave; + +uint8 Msg::s_nextCallbackId = 1; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Msg::Msg +( + string const& _logText, + uint8 _targetNodeId, + uint8 const _msgType, + uint8 const _function, + bool const _bCallbackRequired, + bool const _bReplyRequired, // = true + uint8 const _expectedReply, // = 0 + uint8 const _expectedCommandClassId // = 0 +): + m_logText( _logText ), + m_bFinal( false ), + m_bCallbackRequired( _bCallbackRequired ), + m_callbackId( 0 ), + m_expectedReply( 0 ), + m_expectedCommandClassId( _expectedCommandClassId ), + m_length( 4 ), + m_targetNodeId( _targetNodeId ), + m_sendAttempts( 0 ), + m_maxSendAttempts( MAX_TRIES ), + m_instance( 1 ), + m_endPoint( 0 ), + m_flags( 0 ) +{ + if( _bReplyRequired ) + { + // Wait for this message before considering the transaction complete + m_expectedReply = _expectedReply ? _expectedReply : _function; + } + + m_buffer[0] = SOF; + m_buffer[1] = 0; // Length of the following data, filled in during Finalize. + m_buffer[2] = _msgType; + m_buffer[3] = _function; +} + +//----------------------------------------------------------------------------- +// +// Used to enable wrapping with MultiInstance/MultiChannel during finalize. +//----------------------------------------------------------------------------- +void Msg::SetInstance +( + CommandClass* _cc, + uint8 const _instance +) +{ + // Determine whether we should encapsulate the message in MultiInstance or MultiCommand + if( Node* node = _cc->GetNodeUnsafe() ) + { + MultiInstance* micc = static_cast( node->GetCommandClass( MultiInstance::StaticGetCommandClassId() ) ); + m_instance = _instance; + if( micc ) + { + if( micc->GetVersion() > 1 ) + { + m_endPoint = _cc->GetEndPoint( _instance ); + if( m_endPoint != 0 ) + { + // Set the flag bit to indicate MultiChannel rather than MultiInstance + m_flags |= m_MultiChannel; + m_expectedCommandClassId = MultiInstance::StaticGetCommandClassId(); + } + } + else if( m_instance > 1 ) + { + // Set the flag bit to indicate MultiInstance rather than MultiChannel + m_flags |= m_MultiInstance; + m_expectedCommandClassId = MultiInstance::StaticGetCommandClassId(); + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Add a byte to the message +//----------------------------------------------------------------------------- +void Msg::Append +( + uint8 const _data +) +{ + m_buffer[m_length++] = _data; +} + +//----------------------------------------------------------------------------- +// +// Fill in the length and checksum values for the message +//----------------------------------------------------------------------------- +void Msg::Finalize() +{ + if( m_bFinal ) + { + // Already finalized + return; + } + + // Deal with Multi-Channel/Instance encapsulation + if( ( m_flags & ( m_MultiChannel | m_MultiInstance ) ) != 0 ) + { + MultiEncap(); + } + + // Add the callback id + if( m_bCallbackRequired ) + { + // Set the length byte + m_buffer[1] = m_length; // Length of following data + + if( 0 == s_nextCallbackId ) + { + s_nextCallbackId = 1; + } + + m_buffer[m_length++] = s_nextCallbackId; + m_callbackId = s_nextCallbackId++; + } + else + { + // Set the length byte + m_buffer[1] = m_length - 1; // Length of following data + } + + // Calculate the checksum + uint8 checksum = 0xff; + for( uint32 i=1; i +// If this message has a callback ID, increment it and recalculate the checksum +//----------------------------------------------------------------------------- +void Msg::UpdateCallbackId() +{ + if( m_bCallbackRequired ) + { + // update the callback ID + m_buffer[m_length-2] = s_nextCallbackId; + m_callbackId = s_nextCallbackId++; + + // Recalculate the checksum + uint8 checksum = 0xff; + for( int32 i=1; i +// Create a string containing the raw data +//----------------------------------------------------------------------------- +string Msg::GetAsString() +{ + string str = m_logText; + + char byteStr[16]; + if( m_targetNodeId != 0xff ) + { + snprintf( byteStr, sizeof(byteStr), " (Node=%d)", m_targetNodeId ); + str += byteStr; + } + + str += ": "; + + for( uint32 i=0; i +// Encapsulate the data inside a MultiInstance/Multicommand message +//----------------------------------------------------------------------------- +void Msg::MultiEncap +( +) +{ + char str[256]; + if( m_buffer[3] != FUNC_ID_ZW_SEND_DATA ) + { + return; + } + + // Insert the encap header + if( ( m_flags & m_MultiChannel ) != 0 ) + { + // MultiChannel + for( uint32 i=m_length-1; i>=6; --i ) + { + m_buffer[i+4] = m_buffer[i]; + } + + m_buffer[5] += 4; + m_buffer[6] = MultiInstance::StaticGetCommandClassId(); + m_buffer[7] = MultiInstance::MultiChannelCmd_Encap; + m_buffer[8] = 1; + m_buffer[9] = m_endPoint; + m_length += 4; + + snprintf( str, sizeof(str), "MultiChannel Encapsulated (instance=%d): %s", m_instance, m_logText.c_str() ); + m_logText = str; + } + else + { + // MultiInstance + for( uint32 i=m_length-1; i>=6; --i ) + { + m_buffer[i+3] = m_buffer[i]; + } + + m_buffer[5] += 3; + m_buffer[6] = MultiInstance::StaticGetCommandClassId(); + m_buffer[7] = MultiInstance::MultiInstanceCmd_Encap; + m_buffer[8] = m_instance; + m_length += 3; + + snprintf( str, sizeof(str), "MultiInstance Encapsulated (instance=%d): %s", m_instance, m_logText.c_str() ); + m_logText = str; + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/Msg.h b/lib/ESPiLight/pilight/libs/openzwave/Msg.h new file mode 100644 index 0000000..b66c7ec --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Msg.h @@ -0,0 +1,173 @@ +//----------------------------------------------------------------------------- +// +// Msg.h +// +// Represents a Z-Wave message +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Msg_H +#define _Msg_H + +#include +#include +#include +#include "Defs.h" + +namespace OpenZWave +{ + class CommandClass; + + /** \brief Message object to be passed to and from devices on the Z-Wave network. + */ + class OPENZWAVE_EXPORT Msg + { + public: + enum MessageFlags + { + m_MultiChannel = 0x01, // Indicate MultiChannel encapsulation + m_MultiInstance = 0x02, // Indicate MultiInstance encapsulation + }; + + Msg( string const& _logtext, uint8 _targetNodeId, uint8 const _msgType, uint8 const _function, bool const _bCallbackRequired, bool const _bReplyRequired = true, uint8 const _expectedReply = 0, uint8 const _expectedCommandClassId = 0 ); + ~Msg(){} + + void SetInstance( CommandClass* _cc, uint8 const _instance ); // Used to enable wrapping with MultiInstance/MultiChannel during finalize. + + void Append( uint8 const _data ); + void Finalize(); + void UpdateCallbackId(); + + /** + * \brief Identifies the Node ID of the "target" node (if any) for this function. + * \return Node ID of the target. + */ + uint8 GetTargetNodeId()const{ return m_targetNodeId; } + + /** + * \brief Identifies the Callback ID (if any) for this message. Callback ID is a value (OpenZWave uses sequential IDs) that + * helps the application associate message responses with the original message request. + * \return Callback ID for this message. + */ + uint8 GetCallbackId()const{ return m_callbackId; } + + /** + * \brief Identifies the expected reply type (if any) for this message. The expected reply is a function code...one + * of the FUNC_ID... values defined in Defs.h. Many Z-Wave functions generate responses with the same function code + * (for example, a FUNC_ID_ZW_GET_VERSION message generates a FUNC_ID_ZW_GET_VERSION response. But other functions + * generate a different response. FUNC_ID_ZW_SEND_DATA triggers several responses, but ultimately, a "Get" sent with + * this function should result in a FUNC_ID_APPLICATION_COMMAND_HANDLER response. + * \return Expected reply (function code) for this message. + */ + uint8 GetExpectedReply()const{ return m_expectedReply; } + + /** + * \brief Identifies the expected Command Class ID (if any) for this message. + * \return Expected command class ID for this message. + */ + uint8 GetExpectedCommandClassId()const{ return m_expectedCommandClassId; } + + /** + * \brief For messages that request a Report for a specified command class, identifies the expected Instance + * for the variable being obtained in the report. + * \return Expected Instance value for this message. + */ + uint8 GetExpectedInstance()const{ return m_instance; } + + /** + * \brief For messages that request a Report for a specified command class, identifies the expected Index + * for the variable being obtained in the report. + * \return Expected Index value for this message. + */ +// uint8 GetExpectedIndex()const{ return m_expectedIndex; } + /** + * \brief get the LogText Associated with this message + * \return the LogText used during the constructor + */ + string GetLogText()const{ return m_logText; } + + uint32 GetLength()const{ return m_length; } + uint8* GetBuffer(){ return m_buffer; } + string GetAsString(); + + uint8 GetSendAttempts()const{ return m_sendAttempts; } + void SetSendAttempts( uint8 _count ){ m_sendAttempts = _count; } + + uint8 GetMaxSendAttempts()const{ return m_maxSendAttempts; } + void SetMaxSendAttempts( uint8 _count ){ if( _count < MAX_MAX_TRIES ) m_maxSendAttempts = _count; } + + bool IsWakeUpNoMoreInformationCommand() + { + return( m_bFinal && (m_length==11) && (m_buffer[3]==0x13) && (m_buffer[6]==0x84) && (m_buffer[7]==0x08) ); + } + bool IsNoOperation() + { + return( m_bFinal && (m_length==11) && (m_buffer[3]==0x13) && (m_buffer[6]==0x00) && (m_buffer[7]==0x00) ); + } + + bool operator == ( Msg const& _other )const + { + if( m_bFinal && _other.m_bFinal ) + { + // Do not include the callback Id or checksum in the comparison. + uint8 length = m_length - (m_bCallbackRequired ? 2: 1 ); + return( !memcmp( m_buffer, _other.m_buffer, length ) ); + } + + return false; + } + uint8 GetSendingCommandClass() { + if (m_buffer[3] == 0x13) { + return m_buffer[6]; + } + return 0; + + } + + private: + void MultiEncap(); // Encapsulate the data inside a MultiInstance/Multicommand message + + string m_logText; + bool m_bFinal; + bool m_bCallbackRequired; + + uint8 m_callbackId; + uint8 m_expectedReply; + uint8 m_expectedCommandClassId; + uint8 m_length; + uint8 m_buffer[256]; + + uint8 m_targetNodeId; + uint8 m_sendAttempts; + uint8 m_maxSendAttempts; + + uint8 m_instance; + uint8 m_endPoint; // Endpoint to use if the message must be wrapped in a multiInstance or multiChannel command class + uint8 m_flags; + + static uint8 s_nextCallbackId; // counter to get a unique callback id + }; + +} // namespace OpenZWave + +#endif //_Msg_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/Node.cpp b/lib/ESPiLight/pilight/libs/openzwave/Node.cpp new file mode 100644 index 0000000..6f460a9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Node.cpp @@ -0,0 +1,2896 @@ +//----------------------------------------------------------------------------- +// +// Node.cpp +// +// A node in the Z-Wave network. +// +// Copyright (c) 2009 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "Node.h" +#include "Defs.h" +#include "Group.h" +#include "Options.h" +#include "Manager.h" +#include "Driver.h" +#include "Notification.h" +#include "Msg.h" +#include "platform/Log.h" +#include "platform/Mutex.h" + +#include "tinyxml.h" + +#include "command_classes/CommandClasses.h" +#include "command_classes/CommandClass.h" +#include "command_classes/Association.h" +#include "command_classes/Basic.h" +#include "command_classes/Configuration.h" +#include "command_classes/ControllerReplication.h" +#include "command_classes/ManufacturerSpecific.h" +#include "command_classes/MultiInstance.h" +#include "command_classes/Security.h" +#include "command_classes/WakeUp.h" +#include "command_classes/NodeNaming.h" +#include "command_classes/NoOperation.h" +#include "command_classes/Version.h" +#include "command_classes/SwitchAll.h" + +#include "Scene.h" + +#include "value_classes/ValueID.h" +#include "value_classes/Value.h" +#include "value_classes/ValueBool.h" +#include "value_classes/ValueButton.h" +#include "value_classes/ValueByte.h" +#include "value_classes/ValueDecimal.h" +#include "value_classes/ValueInt.h" +#include "value_classes/ValueRaw.h" +#include "value_classes/ValueList.h" +#include "value_classes/ValueSchedule.h" +#include "value_classes/ValueShort.h" +#include "value_classes/ValueString.h" +#include "value_classes/ValueStore.h" + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// Statics +//----------------------------------------------------------------------------- +bool Node::s_deviceClassesLoaded = false; +map Node::s_basicDeviceClasses; +map Node::s_genericDeviceClasses; + +static char const* c_queryStageNames[] = +{ + "ProtocolInfo", + "Probe", + "WakeUp", + "ManufacturerSpecific1", + "NodeInfo", + "SecurityReport", + "ManufacturerSpecific2", + "Versions", + "Instances", + "Static", + "Probe1", + "Associations", + "Neighbors", + "Session", + "Dynamic", + "Configuration", + "Complete", + "None" +}; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Node::Node +( + uint32 const _homeId, + uint8 const _nodeId +): + m_queryStage( QueryStage_None ), + m_queryPending( false ), + m_queryConfiguration( false ), + m_queryRetries( 0 ), + m_protocolInfoReceived( false ), + m_nodeInfoReceived( false ), + m_manufacturerSpecificClassReceived( false ), + m_nodeInfoSupported( true ), + m_nodeAlive( true ), // assome live node + m_listening( true ), // assume we start out listening + m_frequentListening( false ), + m_beaming( false ), + m_routing( false ), + m_maxBaudRate( 0 ), + m_version( 0 ), + m_security( false ), + m_homeId( _homeId ), + m_nodeId( _nodeId ), + m_basic( 0 ), + m_generic( 0 ), + m_specific( 0 ), + m_type( "" ), + m_numRouteNodes( 0 ), + m_addingNode( false ), + m_manufacturerName( "" ), + m_productName( "" ), + m_nodeName( "" ), + m_location( "" ), + m_manufacturerId( "" ), + m_productType( "" ), + m_productId( "" ), + m_values( new ValueStore() ), + m_sentCnt( 0 ), + m_sentFailed( 0 ), + m_retries( 0 ), + m_receivedCnt( 0 ), + m_receivedDups( 0 ), + m_receivedUnsolicited( 0 ), + m_lastRequestRTT( 0 ), + m_lastResponseRTT( 0 ), + m_averageRequestRTT( 0 ), + m_averageResponseRTT( 0 ), + m_quality( 0 ), + m_lastReceivedMessage(), + m_errors( 0 ) +{ + memset( m_neighbors, 0, sizeof(m_neighbors) ); + memset( m_routeNodes, 0, sizeof(m_routeNodes) ); + AddCommandClass( 0 ); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +Node::~Node +( +) +{ + // Remove any messages from queues + GetDriver()->RemoveQueues( m_nodeId ); + + // Remove the values from the poll list + for( ValueStore::Iterator it = m_values->Begin(); it != m_values->End(); ++it ) + { + ValueID const& valueId = it->second->GetID(); + if( GetDriver()->isPolled( valueId ) ) + { + GetDriver()->DisablePoll( valueId ); + } + } + + Scene::RemoveValues( m_homeId, m_nodeId ); + + // Delete the values + delete m_values; + + // Delete the command classes + while( !m_commandClassMap.empty() ) + { + map::iterator it = m_commandClassMap.begin(); + delete it->second; + m_commandClassMap.erase( it ); + } + + // Delete the groups + while( !m_groups.empty() ) + { + map::iterator it = m_groups.begin(); + delete it->second; + m_groups.erase( it ); + } + + // Delete the button map + while( !m_buttonMap.empty() ) + { + map::iterator it = m_buttonMap.begin(); + m_buttonMap.erase( it ); + } +} + +//----------------------------------------------------------------------------- +// +// Proceed through the initialisation process +//----------------------------------------------------------------------------- +void Node::AdvanceQueries +( +) +{ + // For OpenZWave to discover everything about a node, we have to follow a certain + // order of queries, because the results of one stage may affect what is requested + // in the next stage. The stage is saved with the node data, so that any incomplete + // queries can be restarted the next time the application runs. + // The individual command classes also store some state as to whether they have + // had a response to certain queries. This state is initilized by the SetStaticRequests + // call in QueryStage_None. It is also saved, so we do not need to request state + // from every command class if some have previously responded. + // + // Each stage must generate all the messages for its particular stage as + // assumptions are made in later code (RemoveMsg) that this is the case. This means + // each stage is only visited once. + + Log::Write( LogLevel_Detail, m_nodeId, "AdvanceQueries queryPending=%d queryRetries=%d queryStage=%s live=%d", m_queryPending, m_queryRetries, c_queryStageNames[m_queryStage], m_nodeAlive ); + bool addQSC = false; // We only want to add a query stage complete if we did some work. + while( !m_queryPending && m_nodeAlive ) + { + switch( m_queryStage ) + { + case QueryStage_None: + { + // Init the node query process + m_queryStage = QueryStage_ProtocolInfo; + m_queryRetries = 0; + break; + } + case QueryStage_ProtocolInfo: + { + // determines, among other things, whether this node is a listener, its maximum baud rate and its device classes + if( !ProtocolInfoReceived() ) + { + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_ProtocolInfo" ); + Msg* msg = new Msg( "Get Node Protocol Info", m_nodeId, REQUEST, FUNC_ID_ZW_GET_NODE_PROTOCOL_INFO, false ); + msg->Append( m_nodeId ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Query ); + m_queryPending = true; + addQSC = true; + } + else + { + // This stage has been done already, so move to the Neighbours stage + m_queryStage = QueryStage_Probe; + m_queryRetries = 0; + } + break; + } + case QueryStage_Probe: + { + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_Probe" ); + // + // Send a NoOperation message to see if the node is awake + // and alive. Based on the response or lack of response + // will determine next step. + // + NoOperation* noop = static_cast( GetCommandClass( NoOperation::StaticGetCommandClassId() ) ); + if( GetDriver()->GetNodeId() != m_nodeId ) + { + noop->Set( true ); + m_queryPending = true; + addQSC = true; + } + else + { + m_queryStage = QueryStage_WakeUp; + m_queryRetries = 0; + } + break; + } + case QueryStage_WakeUp: + { + // For sleeping devices other than controllers, we need to defer the usual requests until + // we have told the device to send it's wake-up notifications to the PC controller. + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_WakeUp" ); + + WakeUp* wakeUp = static_cast( GetCommandClass( WakeUp::StaticGetCommandClassId() ) ); + + // if this device is a "sleeping device" and not a controller and not a + // FLiRS device. FLiRS will wake up when you send them something and they + // don't seem to support Wakeup + if( wakeUp && !IsController() && !IsFrequentListeningDevice() ) + { + // start the process of requesting node state from this sleeping device + wakeUp->Init(); + m_queryPending = true; + addQSC = true; + } + else + { + // this is not a sleeping device, so move to the ManufacturerSpecific1 stage + m_queryStage = QueryStage_ManufacturerSpecific1; + m_queryRetries = 0; + } + break; + } + case QueryStage_ManufacturerSpecific1: + { + // Obtain manufacturer, product type and product ID code from the node device + // Manufacturer Specific data is requested before the other command class data so + // that we can modify the supported command classes list through the product XML files. + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_ManufacturerSpecific1" ); + if( GetDriver()->GetNodeId() == m_nodeId ) + { + string configPath = ManufacturerSpecific::SetProductDetails( this, GetDriver()->GetManufacturerId(), GetDriver()->GetProductType(), GetDriver()->GetProductId() ); + if( configPath.length() > 0 ) + { + ManufacturerSpecific::LoadConfigXML( this, configPath ); + } + m_queryStage = QueryStage_NodeInfo; + m_queryRetries = 0; + } + else + { + ManufacturerSpecific* cc = static_cast( GetCommandClass( ManufacturerSpecific::StaticGetCommandClassId() ) ); + if( cc ) + { + m_queryPending = cc->RequestState( CommandClass::RequestFlag_Static, 1, Driver::MsgQueue_Query ); + addQSC = m_queryPending; + } + if( !m_queryPending ) + { + m_queryStage = QueryStage_NodeInfo; + m_queryRetries = 0; + } + } + break; + } + case QueryStage_NodeInfo: + { + if( !NodeInfoReceived() && m_nodeInfoSupported ) + { + // obtain from the node a list of command classes that it 1) supports and 2) controls (separated by a mark in the buffer) + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_NodeInfo" ); + Msg* msg = new Msg( "Request Node Info", m_nodeId, REQUEST, FUNC_ID_ZW_REQUEST_NODE_INFO, false, true, FUNC_ID_ZW_APPLICATION_UPDATE ); + msg->Append( m_nodeId ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Query ); + m_queryPending = true; + addQSC = true; + } + else + { + // This stage has been done already, so move to the Manufacturer Specific stage + m_queryStage = QueryStage_SecurityReport; + m_queryRetries = 0; + } + break; + } + case QueryStage_SecurityReport: + { + /* For Devices that Support the Security Class, we have to request a list of + * Command Classes that Require Security. + */ + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_SecurityReport" ); + + Security* seccc = static_cast( GetCommandClass( Security::StaticGetCommandClassId() ) ); + + if( seccc ) + { + // start the process of requesting node state from this sleeping device + m_queryPending = seccc->Init(); + /* Dont add a Notification Callback here, as this is a multipacket exchange. + * the Security Command Class will automatically advance the Query Stage + * when we recieve a SecurityCmd_SupportedReport + */ + addQSC = false; + } + else + { + // this is not a Security Device, so move onto the next querystage + m_queryStage = QueryStage_ManufacturerSpecific2; + m_queryRetries = 0; + } + + break; + } + case QueryStage_ManufacturerSpecific2: + { + if( !m_manufacturerSpecificClassReceived ) + { + // Obtain manufacturer, product type and product ID code from the node device + // Manufacturer Specific data is requested before the other command class data so + // that we can modify the supported command classes list through the product XML files. + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_ManufacturerSpecific2" ); + ManufacturerSpecific* cc = static_cast( GetCommandClass( ManufacturerSpecific::StaticGetCommandClassId() ) ); + if( cc ) + { + m_queryPending = cc->RequestState( CommandClass::RequestFlag_Static, 1, Driver::MsgQueue_Query ); + addQSC = m_queryPending; + } + if( !m_queryPending ) + { + m_queryStage = QueryStage_Versions; + m_queryRetries = 0; + } + } + else + { + ManufacturerSpecific* cc = static_cast( GetCommandClass( ManufacturerSpecific::StaticGetCommandClassId() ) ); + if( cc ) + { + cc->ReLoadConfigXML(); + } + m_queryStage = QueryStage_Versions; + m_queryRetries = 0; + } + break; + } + case QueryStage_Versions: + { + // Get the version information (if the device supports COMMAND_CLASS_VERSION + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_Versions" ); + Version* vcc = static_cast( GetCommandClass( Version::StaticGetCommandClassId() ) ); + if( vcc ) + { + for( map::const_iterator it = m_commandClassMap.begin(); it != m_commandClassMap.end(); ++it ) + { + CommandClass* cc = it->second; + if( cc->GetMaxVersion() > 1 ) + { + // Get the version for each supported command class that + // we have implemented at greater than version one. + m_queryPending |= vcc->RequestCommandClassVersion( it->second ); + } + } + addQSC = m_queryPending; + } + // advance to Instances stage when finished + if( !m_queryPending ) + { + m_queryStage = QueryStage_Instances; + m_queryRetries = 0; + } + break; + } + case QueryStage_Instances: + { + // if the device at this node supports multiple instances, obtain a list of these instances + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_Instances" ); + MultiInstance* micc = static_cast( GetCommandClass( MultiInstance::StaticGetCommandClassId() ) ); + if( micc ) + { + m_queryPending = micc->RequestInstances(); + addQSC = m_queryPending; + } + + // when done, advance to the Static stage + if( !m_queryPending ) + { + m_queryStage = QueryStage_Static; + m_queryRetries = 0; + + Log::Write( LogLevel_Info, m_nodeId, "Essential node queries are complete" ); + Notification* notification = new Notification( Notification::Type_EssentialNodeQueriesComplete ); + notification->SetHomeAndNodeIds( m_homeId, m_nodeId ); + GetDriver()->QueueNotification( notification ); + } + break; + } + case QueryStage_Static: + { + // Request any other static values associated with each command class supported by this node + // examples are supported thermostat operating modes, setpoints and fan modes + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_Static" ); + for( map::const_iterator it = m_commandClassMap.begin(); it != m_commandClassMap.end(); ++it ) + { + if( !it->second->IsAfterMark() ) + { + m_queryPending |= it->second->RequestStateForAllInstances( CommandClass::RequestFlag_Static, Driver::MsgQueue_Query ); + } + } + addQSC = m_queryPending; + + if( !m_queryPending ) + { + // when all (if any) static information has been retrieved, advance to the Associations stage + m_queryStage = QueryStage_Associations; + m_queryRetries = 0; + } + break; + } + case QueryStage_Probe1: + { + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_Probe1" ); + // + // Send a NoOperation message to see if the node is awake + // and alive. Based on the response or lack of response + // will determine next step. Called here when configuration exists. + // + NoOperation* noop = static_cast( GetCommandClass( NoOperation::StaticGetCommandClassId() ) ); + if( GetDriver()->GetNodeId() != m_nodeId ) + { + noop->Set( true ); + m_queryPending = true; + addQSC = true; + } + else + { + m_queryStage = QueryStage_Associations; + m_queryRetries = 0; + } + break; + } + case QueryStage_Associations: + { + // if this device supports COMMAND_CLASS_ASSOCIATION, determine to which groups this node belong + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_Associations" ); + Association* acc = static_cast( GetCommandClass( Association::StaticGetCommandClassId() ) ); + if( acc ) + { + acc->RequestAllGroups( 0 ); + m_queryPending = true; + addQSC = true; + } + else + { + // if this device doesn't support Associations, move to retrieve Session information + m_queryStage = QueryStage_Neighbors; + m_queryRetries = 0; + } + break; + } + case QueryStage_Neighbors: + { + // retrieves this node's neighbors and stores the neighbor bitmap in the node object + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_Neighbors" ); + GetDriver()->RequestNodeNeighbors( m_nodeId, 0 ); + m_queryPending = true; + addQSC = true; + break; + } + case QueryStage_Session: + { + // Request the session values from the command classes in turn + // examples of Session information are: current thermostat setpoints, node names and climate control schedules + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_Session" ); + for( map::const_iterator it = m_commandClassMap.begin(); it != m_commandClassMap.end(); ++it ) + { + if( !it->second->IsAfterMark() ) + { + m_queryPending |= it->second->RequestStateForAllInstances( CommandClass::RequestFlag_Session, Driver::MsgQueue_Query ); + } + } + addQSC = m_queryPending; + if( !m_queryPending ) + { + m_queryStage = QueryStage_Dynamic; + m_queryRetries = 0; + } + break; + } + case QueryStage_Dynamic: + { + // Request the dynamic values from the node, that can change at any time + // Examples include on/off state, heating mode, temperature, etc. + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_Dynamic" ); + m_queryPending = RequestDynamicValues(); + addQSC = m_queryPending; + + if( !m_queryPending ) + { + m_queryStage = QueryStage_Configuration; + m_queryRetries = 0; + } + break; + } + case QueryStage_Configuration: + { + // Request the configurable parameter values from the node. + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_Configuration" ); + if( m_queryConfiguration ) + { + if( RequestAllConfigParams( 0 ) ) + { + m_queryPending = true; + addQSC = true; + } + m_queryConfiguration = false; + } + if( !m_queryPending ) + { + m_queryStage = QueryStage_Complete; + m_queryRetries = 0; + } + break; + } + case QueryStage_Complete: + { + ClearAddingNode(); + // Notify the watchers that the queries are complete for this node + Log::Write( LogLevel_Detail, m_nodeId, "QueryStage_Complete" ); + Notification* notification = new Notification( Notification::Type_NodeQueriesComplete ); + notification->SetHomeAndNodeIds( m_homeId, m_nodeId ); + GetDriver()->QueueNotification( notification ); + + // Check whether all nodes are now complete + GetDriver()->CheckCompletedNodeQueries(); + return; + } + default: + { + break; + } + } + } + + if( addQSC && m_nodeAlive ) + { + // Add a marker to the query queue so this advance method + // gets called again once this stage has completed. + GetDriver()->SendQueryStageComplete( m_nodeId, m_queryStage ); + } +} + +//----------------------------------------------------------------------------- +// +// We are done with a stage in the query process +//----------------------------------------------------------------------------- +void Node::QueryStageComplete +( + QueryStage const _stage +) +{ + // Check that we are actually on the specified stage + if( _stage != m_queryStage ) + { + return; + } + + if( m_queryStage != QueryStage_Complete ) + { + // Move to the next stage + m_queryPending = false; + m_queryStage = (QueryStage)( (uint32)m_queryStage + 1 ); + if( m_queryStage == QueryStage_Probe1 ) + { + m_queryStage = (QueryStage)( (uint32)m_queryStage + 1 ); + } + m_queryRetries = 0; + } +} + +//----------------------------------------------------------------------------- +// +// Retry a stage up to the specified maximum +//----------------------------------------------------------------------------- +void Node::QueryStageRetry +( + QueryStage const _stage, + uint8 const _maxAttempts // = 0 +) +{ + Log::Write( LogLevel_Info, m_nodeId, "QueryStageRetry stage %s requested stage %s max %d retries %d pending %d", c_queryStageNames[_stage], c_queryStageNames[m_queryStage], _maxAttempts, m_queryRetries, m_queryPending); + + // Check that we are actually on the specified stage + if( _stage != m_queryStage ) + { + return; + } + + m_queryPending = false; + if( _maxAttempts && ( ++m_queryRetries >= _maxAttempts ) ) + { + m_queryRetries = 0; + // We've retried too many times. Move to the next stage but only if + // we aren't in any of the probe stages. + if( m_queryStage != QueryStage_Probe && m_queryStage != QueryStage_Probe1 ) + { + m_queryStage = (Node::QueryStage)( (uint32)(m_queryStage + 1) ); + } + } + // Repeat the current query stage + GetDriver()->RetryQueryStageComplete( m_nodeId, m_queryStage ); +} + +//----------------------------------------------------------------------------- +// +// Set the query stage (but only to an earlier stage) +//----------------------------------------------------------------------------- +void Node::SetQueryStage +( + QueryStage const _stage, + bool const _advance // = true +) +{ + if( (int)_stage < (int)m_queryStage ) + { + m_queryStage = _stage; + m_queryPending = false; + + if( QueryStage_Configuration == _stage ) + { + m_queryConfiguration = true; + } + } + + if( _advance ) + { + AdvanceQueries(); + } +} + +//----------------------------------------------------------------------------- +// +// Gets the query stage name +//----------------------------------------------------------------------------- +string Node::GetQueryStageName +( + QueryStage const _stage +) +{ + return c_queryStageNames[_stage]; +} + +//----------------------------------------------------------------------------- +// +// Gets the neighbors of a node +//----------------------------------------------------------------------------- +uint32 Node::GetNeighbors +( + uint8** o_neighbors +) +{ + // determine how many neighbors there are + int i; + uint32 numNeighbors = 0; + if( m_queryStage < QueryStage_Session ) + { + *o_neighbors = NULL; + return 0; + } + for( i = 0; i < 29; i++ ) + { + for( unsigned char mask = 0x80; mask != 0; mask >>= 1 ) + if( ( m_neighbors[i] & mask ) != 0 ) + numNeighbors++; + } + + // handle the possibility that no neighbors are reported + if( !numNeighbors ) + { + *o_neighbors = NULL; + return 0; + } + + // create and populate an array with neighbor node ids + uint8* neighbors = new uint8[numNeighbors]; + uint32 index = 0; + for( int by=0; by<29; by++ ) + { + for( int bi=0; bi<8; bi++ ) + { + if( (m_neighbors[by] & ( 0x01< +// Read the node config from XML +//----------------------------------------------------------------------------- +void Node::ReadXML +( + TiXmlElement const* _node +) +{ + char const* str; + int intVal; + + str = _node->Attribute( "query_stage" ); + if( str ) + { + // After restoring state from a file, we need to at least refresh the association, session and dynamic values. + QueryStage queryStage = QueryStage_Associations; + for( uint32 i=0; i<(uint32)QueryStage_Associations; ++i ) + { + if( !strcmp( str, c_queryStageNames[i] ) ) + { + queryStage = (QueryStage)i; + break; + } + } + + SetQueryStage( queryStage, false ); + } + + if( m_queryStage != QueryStage_None ) + { + if( m_queryStage > QueryStage_ProtocolInfo ) + { + // Notify the watchers of the protocol info. + // We do the notification here so that it gets into the queue ahead of + // any other notifications generated by adding command classes etc. + m_protocolInfoReceived = true; + Notification* notification = new Notification( Notification::Type_NodeProtocolInfo ); + notification->SetHomeAndNodeIds( m_homeId, m_nodeId ); + GetDriver()->QueueNotification( notification ); + } + + if( m_queryStage > QueryStage_NodeInfo ) + { + m_nodeInfoReceived = true; + } + + if( m_queryStage > QueryStage_Instances ) + { + Notification* notification = new Notification( Notification::Type_EssentialNodeQueriesComplete ); + notification->SetHomeAndNodeIds( m_homeId, m_nodeId ); + GetDriver()->QueueNotification( notification ); + } + } + + str = _node->Attribute( "name" ); + if( str ) + { + m_nodeName = str; + } + + str = _node->Attribute( "location" ); + if( str ) + { + m_location = str; + } + + if( TIXML_SUCCESS == _node->QueryIntAttribute( "basic", &intVal ) ) + { + m_basic = (uint8)intVal; + } + + if( TIXML_SUCCESS == _node->QueryIntAttribute( "generic", &intVal ) ) + { + m_generic = (uint8)intVal; + } + + if( TIXML_SUCCESS == _node->QueryIntAttribute( "specific", &intVal ) ) + { + m_specific = (uint8)intVal; + } + + str = _node->Attribute( "type" ); + if( str ) + { + m_type = str; + } + + m_listening = true; + str = _node->Attribute( "listening" ); + if( str ) + { + m_listening = !strcmp( str, "true" ); + } + + m_frequentListening = false; + str = _node->Attribute( "frequentListening" ); + if( str ) + { + m_frequentListening = !strcmp( str, "true" ); + } + + m_beaming = false; + str = _node->Attribute( "beaming" ); + if( str ) + { + m_beaming = !strcmp( str, "true" ); + } + + m_routing = true; + str = _node->Attribute( "routing" ); + if( str ) + { + m_routing = !strcmp( str, "true" ); + } + + m_maxBaudRate = 0; + if( TIXML_SUCCESS == _node->QueryIntAttribute( "max_baud_rate", &intVal ) ) + { + m_maxBaudRate = (uint32)intVal; + } + + m_version = 0; + if( TIXML_SUCCESS == _node->QueryIntAttribute( "version", &intVal ) ) + { + m_version = (uint8)intVal; + } + + m_security = false; + str = _node->Attribute( "security" ); + if( str ) + { + m_security = !strcmp( str, "true" ); + } + + m_nodeInfoSupported = true; + str = _node->Attribute( "nodeinfosupported" ); + if( str ) + { + m_nodeInfoSupported = !strcmp( str, "true" ); + } + + // Read the manufacturer info and create the command classes + TiXmlElement const* child = _node->FirstChildElement(); + while( child ) + { + str = child->Value(); + if( str ) + { + if( !strcmp( str, "CommandClasses" ) ) + { + ReadCommandClassesXML( child ); + } + else if( !strcmp( str, "Manufacturer" ) ) + { + str = child->Attribute( "id" ); + if( str ) + { + m_manufacturerId = str; + } + + str = child->Attribute( "name" ); + if( str ) + { + m_manufacturerName = str; + } + + TiXmlElement const* product = child->FirstChildElement(); + if( !strcmp( product->Value(), "Product" ) ) + { + str = product->Attribute( "type" ); + if( str ) + { + m_productType = str; + } + + str = product->Attribute( "id" ); + if( str ) + { + m_productId = str; + } + + str = product->Attribute( "name" ); + if( str ) + { + m_productName = str; + } + } + } + } + + // Move to the next child node + child = child->NextSiblingElement(); + } + + if( m_nodeName.length() > 0 || m_location.length() > 0 || m_manufacturerId.length() > 0 ) + { + // Notify the watchers of the name changes + Notification* notification = new Notification( Notification::Type_NodeNaming ); + notification->SetHomeAndNodeIds( m_homeId, m_nodeId ); + GetDriver()->QueueNotification( notification ); + } +} + +//----------------------------------------------------------------------------- +// +// Read the device's protocol configuration from XML +//----------------------------------------------------------------------------- +void Node::ReadDeviceProtocolXML +( + TiXmlElement const* _ccsElement +) +{ + TiXmlElement const* ccElement = _ccsElement->FirstChildElement(); + while( ccElement ) + { + char const* str = ccElement->Value(); + if( str && !strcmp( str, "Protocol" ) ) + { + str = ccElement->Attribute( "nodeinfosupported" ); + if( str ) + { + m_nodeInfoSupported = !strcmp( str, "true" ); + } + + // Some controllers support API calls that aren't advertised in their returned data. + // So provide a way to manipulate the returned data to reflect reality. + TiXmlElement const* childElement = _ccsElement->FirstChildElement(); + while( childElement ) + { + str = childElement->Value(); + if( str && !strcmp( str, "APIcall" ) ) + { + char const* funcStr = childElement->Attribute( "function" ); + char *p; + uint8 func = (uint8)strtol( funcStr, &p, 16 ); + if( p != funcStr ) + { + char const* presStr = ccElement->Attribute( "present" ); + GetDriver()->SetAPICall( func, !strcmp( presStr, "true" ) ); + } + } + childElement = childElement->NextSiblingElement(); + } + return; + } + ccElement = ccElement->NextSiblingElement(); + } +} + +//----------------------------------------------------------------------------- +// +// Read the command classes from XML +//----------------------------------------------------------------------------- +void Node::ReadCommandClassesXML +( + TiXmlElement const* _ccsElement +) +{ + char const* str; + int32 intVal; + + TiXmlElement const* ccElement = _ccsElement->FirstChildElement(); + while( ccElement ) + { + str = ccElement->Value(); + if( str && !strcmp( str, "CommandClass" ) ) + { + if( TIXML_SUCCESS == ccElement->QueryIntAttribute( "id", &intVal ) ) + { + uint8 id = (uint8)intVal; + + // Check whether this command class is to be removed (product XMLs might + // request this if a class is not implemented properly by the device) + bool remove = false; + char const* action = ccElement->Attribute( "action" ); + if( action && !strcasecmp( action, "remove" ) ) + { + remove = true; + } + + CommandClass* cc = GetCommandClass( id ); + if( remove ) + { + // Remove support for the command class + RemoveCommandClass( id ); + } + else + { + if( NULL == cc ) + { + // Command class support does not exist yet, so we create it + cc = AddCommandClass( id ); + } + + if( NULL != cc ) + { + cc->ReadXML( ccElement ); + } + } + } + } + + ccElement = ccElement->NextSiblingElement(); + } +} + +//----------------------------------------------------------------------------- +// +// Save the static node configuration data +//----------------------------------------------------------------------------- +void Node::WriteXML +( + TiXmlElement* _driverElement +) +{ + char str[32]; + + TiXmlElement* nodeElement = new TiXmlElement( "Node" ); + _driverElement->LinkEndChild( nodeElement ); + + snprintf( str, 32, "%d", m_nodeId ); + nodeElement->SetAttribute( "id", str ); + + nodeElement->SetAttribute( "name", m_nodeName.c_str() ); + nodeElement->SetAttribute( "location", m_location.c_str() ); + + snprintf( str, 32, "%d", m_basic ); + nodeElement->SetAttribute( "basic", str ); + + snprintf( str, 32, "%d", m_generic ); + nodeElement->SetAttribute( "generic", str ); + + snprintf( str, 32, "%d", m_specific ); + nodeElement->SetAttribute( "specific", str ); + + nodeElement->SetAttribute( "type", m_type.c_str() ); + + nodeElement->SetAttribute( "listening", m_listening ? "true" : "false" ); + nodeElement->SetAttribute( "frequentListening", m_frequentListening ? "true" : "false" ); + nodeElement->SetAttribute( "beaming", m_beaming ? "true" : "false" ); + nodeElement->SetAttribute( "routing", m_routing ? "true" : "false" ); + + snprintf( str, 32, "%d", m_maxBaudRate ); + nodeElement->SetAttribute( "max_baud_rate", str ); + + snprintf( str, 32, "%d", m_version ); + nodeElement->SetAttribute( "version", str ); + + if( m_security ) + { + nodeElement->SetAttribute( "security", "true" ); + } + + if( !m_nodeInfoSupported ) + { + nodeElement->SetAttribute( "nodeinfosupported", "false" ); + } + + nodeElement->SetAttribute( "query_stage", c_queryStageNames[m_queryStage] ); + + // Write the manufacturer and product data in the same format + // as used in the ManyfacturerSpecfic.xml file. This will + // allow new devices to be added via a simple cut and paste. + TiXmlElement* manufacturerElement = new TiXmlElement( "Manufacturer" ); + nodeElement->LinkEndChild( manufacturerElement ); + + manufacturerElement->SetAttribute( "id", m_manufacturerId.c_str() ); + manufacturerElement->SetAttribute( "name", m_manufacturerName.c_str() ); + + TiXmlElement* productElement = new TiXmlElement( "Product" ); + manufacturerElement->LinkEndChild( productElement ); + + productElement->SetAttribute( "type", m_productType.c_str() ); + productElement->SetAttribute( "id", m_productId.c_str() ); + productElement->SetAttribute( "name", m_productName.c_str() ); + + // Write the command classes + TiXmlElement* ccsElement = new TiXmlElement( "CommandClasses" ); + nodeElement->LinkEndChild( ccsElement ); + + for( map::const_iterator it = m_commandClassMap.begin(); it != m_commandClassMap.end(); ++it ) + { + if( it->second->GetCommandClassId() == NoOperation::StaticGetCommandClassId() ) // don't output NoOperation + { + continue; + } + TiXmlElement* ccElement = new TiXmlElement( "CommandClass" ); + ccsElement->LinkEndChild( ccElement ); + it->second->WriteXML( ccElement ); + } +} + +//----------------------------------------------------------------------------- +// +// Handle the FUNC_ID_ZW_GET_NODE_PROTOCOL_INFO response +//----------------------------------------------------------------------------- +void Node::UpdateProtocolInfo +( + uint8 const* _data +) +{ + if( ProtocolInfoReceived() ) + { + // We already have this info + return; + } + + if( _data[4] == 0 ) + { + // Node doesn't exist if Generic class is zero. + Log::Write( LogLevel_Info, m_nodeId, " Protocol Info for Node %d reports node nonexistent", m_nodeId ); + SetNodeAlive( false ); + return; + } + + // Notify the watchers of the protocol info. + // We do the notification here so that it gets into the queue ahead of + // any other notifications generated by adding command classes etc. + Notification* notification = new Notification( Notification::Type_NodeProtocolInfo ); + notification->SetHomeAndNodeIds( m_homeId, m_nodeId ); + GetDriver()->QueueNotification( notification ); + + // Capabilities + m_listening = ( ( _data[0] & 0x80 ) != 0 ); + m_routing = ( ( _data[0] & 0x40 ) != 0 ); + + m_maxBaudRate = 9600; + if( ( _data[0] & 0x38 ) == 0x10 ) + { + m_maxBaudRate = 40000; + } + + m_version = ( _data[0] & 0x07 ) + 1; + + m_frequentListening = ( ( _data[1] & ( SecurityFlag_Sensor250ms | SecurityFlag_Sensor1000ms ) ) != 0 ); + m_beaming = ( ( _data[1] & SecurityFlag_BeamCapability ) != 0 ); + + // Security + m_security = ( ( _data[1] & SecurityFlag_Security ) != 0 ); + + // Optional flag is true if the device reports optional command classes. + // NOTE: We stopped using this because not all devices report it properly, + // and now just request the optional classes regardless. + // bool optional = (( _data[1] & 0x80 ) != 0 ); + + Log::Write( LogLevel_Info, m_nodeId, " Protocol Info for Node %d:", m_nodeId ); + if( m_listening ) + Log::Write( LogLevel_Info, m_nodeId, " Listening = true" ); + else + { + Log::Write( LogLevel_Info, m_nodeId, " Listening = false" ); + Log::Write( LogLevel_Info, m_nodeId, " Frequent = %s", m_frequentListening ? "true" : "false" ); + } + Log::Write( LogLevel_Info, m_nodeId, " Beaming = %s", m_beaming ? "true" : "false" ); + Log::Write( LogLevel_Info, m_nodeId, " Routing = %s", m_routing ? "true" : "false" ); + Log::Write( LogLevel_Info, m_nodeId, " Max Baud Rate = %d", m_maxBaudRate ); + Log::Write( LogLevel_Info, m_nodeId, " Version = %d", m_version ); + Log::Write( LogLevel_Info, m_nodeId, " Security = %s", m_security ? "true" : "false" ); + + // Set up the device class based data for the node, including mandatory command classes + SetDeviceClasses( _data[3], _data[4], _data[5] ); + // Do this for every controller. A little extra work but it won't be a large file. + if( IsController() ) + { + GetDriver()->ReadButtons( m_nodeId ); + } + m_protocolInfoReceived = true; +} + +void Node::SetSecuredClasses +( + uint8 const* _data, + uint8 const _length +) +{ + uint32 i; + Log::Write( LogLevel_Info, m_nodeId, " Secured command classes for node %d:", m_nodeId ); + + bool afterMark = false; + for( i=0; i<_length; ++i ) + { + if( _data[i] == 0xef ) + { + // COMMAND_CLASS_MARK. + // Marks the end of the list of supported command classes. The remaining classes + // are those that can be controlled by the device. These classes are created + // without values. Messages received cause notification events instead. + afterMark = true; + continue; + } + /* Check if this is a CC that is already registered with the node */ + if (CommandClass *pCommandClass = GetCommandClass(_data[i])) + { + if (pCommandClass->IsSecureSupported()) { + pCommandClass->SetSecured(); + Log::Write( LogLevel_Info, m_nodeId, " %s (Secured)", pCommandClass->GetCommandClassName().c_str() ); + } else { + Log::Write( LogLevel_Info, m_nodeId, " %s (Downgraded)", pCommandClass->GetCommandClassName().c_str() ); + } + } + /* it might be a new CC we havn't seen as part of the NIF */ + else if( CommandClasses::IsSupported( _data[i] ) ) + { + if( CommandClass* pCommandClass = AddCommandClass( _data[i] ) ) + { + // If this class came after the COMMAND_CLASS_MARK, then we do not create values. + if( afterMark ) + { + pCommandClass->SetAfterMark(); + } + if (pCommandClass->IsSecureSupported()) { + pCommandClass->SetSecured(); + Log::Write( LogLevel_Info, m_nodeId, " %s (Secured)", pCommandClass->GetCommandClassName().c_str() ); + } else { + Log::Write( LogLevel_Info, m_nodeId, " %s (Downgraded)", pCommandClass->GetCommandClassName().c_str() ); + } + // Start with an instance count of one. If the device supports COMMMAND_CLASS_MULTI_INSTANCE + // then some command class instance counts will increase once the responses to the RequestState + // call at the end of this method have been processed. + pCommandClass->SetInstance( 1 ); + + } + } + else + { + Log::Write( LogLevel_Info, m_nodeId, " Secure CommandClass 0x%.2x - NOT SUPPORTED", _data[i] ); + } + } + Log::Write( LogLevel_Info, m_nodeId, " UnSecured command classes for node %d:", m_nodeId ); + for( map::const_iterator it = m_commandClassMap.begin(); it != m_commandClassMap.end(); ++it ) + { + if (!it->second->IsSecured()) + Log::Write( LogLevel_Info, m_nodeId, " %s (Unsecured)", it->second->GetCommandClassName().c_str() ); + } + + +} +//----------------------------------------------------------------------------- +// +// Set up the command classes from the node info frame +//----------------------------------------------------------------------------- +void Node::UpdateNodeInfo +( + uint8 const* _data, + uint8 const _length +) +{ + if( !NodeInfoReceived() ) + { + // Add the command classes specified by the device + Log::Write( LogLevel_Info, m_nodeId, " Optional command classes for node %d:", m_nodeId ); + + bool newCommandClasses = false; + uint32 i; + + bool afterMark = false; + for( i=0; i<_length; ++i ) + { + if( _data[i] == 0xef ) + { + // COMMAND_CLASS_MARK. + // Marks the end of the list of supported command classes. The remaining classes + // are those that can be controlled by the device. These classes are created + // without values. Messages received cause notification events instead. + afterMark = true; + + if( !newCommandClasses ) + { + Log::Write( LogLevel_Info, m_nodeId, " None" ); + } + Log::Write( LogLevel_Info, m_nodeId, " Optional command classes controlled by node %d:", m_nodeId ); + newCommandClasses = false; + continue; + } + + if( CommandClasses::IsSupported( _data[i] ) ) + { + if( CommandClass* pCommandClass = AddCommandClass( _data[i] ) ) + { + // If this class came after the COMMAND_CLASS_MARK, then we do not create values. + if( afterMark ) + { + pCommandClass->SetAfterMark(); + } + + // Start with an instance count of one. If the device supports COMMMAND_CLASS_MULTI_INSTANCE + // then some command class instance counts will increase once the responses to the RequestState + // call at the end of this method have been processed. + pCommandClass->SetInstance( 1 ); + newCommandClasses = true; + Log::Write( LogLevel_Info, m_nodeId, " %s", pCommandClass->GetCommandClassName().c_str() ); + } + } + else + { + Log::Write( LogLevel_Info, m_nodeId, " CommandClass 0x%.2x - NOT REQUIRED", _data[i] ); + } + } + + if( !newCommandClasses ) + { + // No additional command classes over the mandatory ones. + Log::Write( LogLevel_Info, m_nodeId, " None" ); + } + + SetStaticRequests(); + m_nodeInfoReceived = true; + } + else + { + // We probably only need to do the dynamic stuff + SetQueryStage( QueryStage_Dynamic ); + } + + // Treat the node info frame as a sign that the node is awake + if( WakeUp* wakeUp = static_cast( GetCommandClass( WakeUp::StaticGetCommandClassId() ) ) ) + { + wakeUp->SetAwake( true ); + } +} + +//----------------------------------------------------------------------------- +// +// Track alive state of a node for dead node detection. +//----------------------------------------------------------------------------- +void Node::SetNodeAlive +( + bool const _isAlive +) +{ + Notification* notification; + + if( _isAlive ) + { + Log::Write( LogLevel_Error, m_nodeId, "WARNING: node revived" ); + m_nodeAlive = true; + m_errors = 0; + if( m_queryStage != Node::QueryStage_Complete ) + { + m_queryRetries = 0; // restart at last stage + AdvanceQueries(); + } + notification = new Notification( Notification::Type_Notification ); + notification->SetHomeAndNodeIds( m_homeId, m_nodeId ); + notification->SetNotification( Notification::Code_Alive ); + } + else + { + Log::Write( LogLevel_Error, m_nodeId, "ERROR: node presumed dead" ); + m_nodeAlive = false; + if( m_queryStage != Node::QueryStage_Complete ) + { + // Check whether all nodes are now complete + GetDriver()->CheckCompletedNodeQueries(); + } + notification = new Notification( Notification::Type_Notification ); + notification->SetHomeAndNodeIds( m_homeId, m_nodeId ); + notification->SetNotification( Notification::Code_Dead ); + } + GetDriver()->QueueNotification( notification ); +} + +//----------------------------------------------------------------------------- +// +// The first time we hear from a node, we set flags to indicate the +// need to request certain static data from the device. This is so that +// we can track which data has been received, and which has not. +//----------------------------------------------------------------------------- +void Node::SetStaticRequests +( +) +{ + uint8 request = 0; + + if( GetCommandClass( MultiInstance::StaticGetCommandClassId() ) ) + { + // Request instances + request |= (uint8)CommandClass::StaticRequest_Instances; + } + + if( GetCommandClass( Version::StaticGetCommandClassId() ) ) + { + // Request versions + request |= (uint8)CommandClass::StaticRequest_Version; + } + + if( request ) + { + for( map::const_iterator it = m_commandClassMap.begin(); it != m_commandClassMap.end(); ++it ) + { + it->second->SetStaticRequest( request ); + } + SetQueryStage( QueryStage_ManufacturerSpecific2 ); + } +} + +//----------------------------------------------------------------------------- +// +// Set the name of the node +//----------------------------------------------------------------------------- +void Node::SetNodeName +( + string const& _nodeName +) +{ + m_nodeName = _nodeName; + // Notify the watchers of the name changes + Notification* notification = new Notification( Notification::Type_NodeNaming ); + notification->SetHomeAndNodeIds( m_homeId, m_nodeId ); + GetDriver()->QueueNotification( notification ); + if( NodeNaming* cc = static_cast( GetCommandClass( NodeNaming::StaticGetCommandClassId() ) ) ) + { + // The node supports naming, so we try to write the name into the device + cc->SetName( _nodeName ); + } +} + +//----------------------------------------------------------------------------- +// +// Set the location of the node +//----------------------------------------------------------------------------- +void Node::SetLocation +( + string const& _location +) +{ + m_location = _location; + // Notify the watchers of the name changes + Notification* notification = new Notification( Notification::Type_NodeNaming ); + notification->SetHomeAndNodeIds( m_homeId, m_nodeId ); + GetDriver()->QueueNotification( notification ); + if( NodeNaming* cc = static_cast( GetCommandClass( NodeNaming::StaticGetCommandClassId() ) ) ) + { + // The node supports naming, so we try to write the location into the device + cc->SetLocation( _location ); + } +} + +//----------------------------------------------------------------------------- +// +// Handle a command class message +//----------------------------------------------------------------------------- +void Node::ApplicationCommandHandler +( + uint8 const* _data +) +{ + if( CommandClass* pCommandClass = GetCommandClass( _data[5] ) ) + { + pCommandClass->ReceivedCntIncr(); + pCommandClass->HandleMsg( &_data[6], _data[4] ); + } + else + { + if( _data[5] == ControllerReplication::StaticGetCommandClassId() ) + { + // This is a controller replication message, and we do not support it. + // We have to at least acknowledge the message to avoid locking the sending device. + Log::Write( LogLevel_Info, m_nodeId, "ApplicationCommandHandler - Default acknowledgement of controller replication data" ); + + Msg* msg = new Msg( "Replication Command Complete", m_nodeId, REQUEST, FUNC_ID_ZW_REPLICATION_COMMAND_COMPLETE, false ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Command ); + } + else + { + Log::Write( LogLevel_Info, m_nodeId, "ApplicationCommandHandler - Unhandled Command Class 0x%.2x", _data[5] ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Get the specified command class object if supported, otherwise NULL +//----------------------------------------------------------------------------- +CommandClass* Node::GetCommandClass +( + uint8 const _commandClassId +)const +{ + map::const_iterator it = m_commandClassMap.find( _commandClassId ); + if( it != m_commandClassMap.end() ) + { + return it->second; + } + + // Not found + return NULL; +} + +//----------------------------------------------------------------------------- +// +// Add a command class to the node +//----------------------------------------------------------------------------- +CommandClass* Node::AddCommandClass +( + uint8 const _commandClassId +) +{ + if( GetCommandClass( _commandClassId ) ) + { + // Class and instance have already been added + return NULL; + } + + // Create the command class object and add it to our map + if( CommandClass* pCommandClass = CommandClasses::CreateCommandClass( _commandClassId, m_homeId, m_nodeId ) ) + { + m_commandClassMap[_commandClassId] = pCommandClass; + return pCommandClass; + } + else + { + Log::Write( LogLevel_Info, m_nodeId, "AddCommandClass - Unsupported Command Class 0x%.2x", _commandClassId ); + } + + return NULL; +} + +//----------------------------------------------------------------------------- +// +// Remove a command class from the node +//----------------------------------------------------------------------------- +void Node::RemoveCommandClass +( + uint8 const _commandClassId +) +{ + map::iterator it = m_commandClassMap.find( _commandClassId ); + if( it == m_commandClassMap.end() ) + { + // Class is not found + return; + } + + // Remove all the values associated with this class + if( ValueStore* store = GetValueStore() ) + { + store->RemoveCommandClassValues( _commandClassId ); + } + + // Destroy the command class object and remove it from our map + Log::Write( LogLevel_Info, m_nodeId, "RemoveCommandClass - Removed support for %s", it->second->GetCommandClassName().c_str() ); + + delete it->second; + m_commandClassMap.erase( it ); +} + +//----------------------------------------------------------------------------- +// +// Set a configuration parameter in a device +//----------------------------------------------------------------------------- +bool Node::SetConfigParam +( + uint8 const _param, + int32 _value, + uint8 const _size +) +{ + if( Configuration* cc = static_cast( GetCommandClass( Configuration::StaticGetCommandClassId() ) ) ) + { + // First try to find an existing value representing the parameter, and set that. + if( Value* value = cc->GetValue( 1, _param ) ) + { + switch( value->GetID().GetType() ) + { + case ValueID::ValueType_Bool: + { + ValueBool* valueBool = static_cast( value ); + valueBool->Set( _value != 0 ); + break; + } + case ValueID::ValueType_Byte: + { + ValueByte* valueByte = static_cast( value ); + valueByte->Set( (uint8)_value ); + break; + } + case ValueID::ValueType_Short: + { + ValueShort* valueShort = static_cast( value ); + valueShort->Set( (uint16)_value ); + break; + } + case ValueID::ValueType_Int: + { + ValueInt* valueInt = static_cast( value ); + valueInt->Set( _value ); + break; + } + case ValueID::ValueType_List: + { + ValueList* valueList = static_cast( value ); + valueList->SetByValue( _value ); + break; + } + default: + { + } + } + + return true; + } + + // Failed to find an existing value object representing this + // configuration parameter, so we try using the default or + // included size through the Configuration command class. + cc->Set( _param, _value, _size ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request the value of a configuration parameter from the device +//----------------------------------------------------------------------------- +void Node::RequestConfigParam +( + uint8 const _param +) +{ + if( Configuration* cc = static_cast( GetCommandClass( Configuration::StaticGetCommandClassId() ) ) ) + { + cc->RequestValue( 0, _param, 1, Driver::MsgQueue_Send ); + } +} + +//----------------------------------------------------------------------------- +// +// Request the values of all known configuration parameters from the device +//----------------------------------------------------------------------------- +bool Node::RequestAllConfigParams +( + uint32 const _requestFlags +) +{ + bool res = false; + if( Configuration* cc = static_cast( GetCommandClass( Configuration::StaticGetCommandClassId() ) ) ) + { + // Go through all the values in the value store, and request all those which are in the Configuration command class + for( ValueStore::Iterator it = m_values->Begin(); it != m_values->End(); ++it ) + { + Value* value = it->second; + if( value->GetID().GetCommandClassId() == Configuration::StaticGetCommandClassId() && !value->IsWriteOnly() ) + { + res |= cc->RequestValue( _requestFlags, value->GetID().GetIndex(), 1, Driver::MsgQueue_Send ); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Request an update of all known dynamic values from the device +//----------------------------------------------------------------------------- +bool Node::RequestDynamicValues +( +) +{ + bool res = false; + for( map::const_iterator it = m_commandClassMap.begin(); it != m_commandClassMap.end(); ++it ) + { + if( !it->second->IsAfterMark() ) + { + res |= it->second->RequestStateForAllInstances( CommandClass::RequestFlag_Dynamic, Driver::MsgQueue_Send ); + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Helper method to set a device's basic level +//----------------------------------------------------------------------------- +void Node::SetLevel +( + uint8 const _level +) +{ + // Level is 0-99, with 0 = off and 99 = fully on. 255 = turn on at last level. + uint8 adjustedLevel = _level; + if( ( _level > 99 ) && ( _level < 255 ) ) + { + adjustedLevel = 99; + } + + if( Basic* cc = static_cast( GetCommandClass( Basic::StaticGetCommandClassId() ) ) ) + { + cc->Set( adjustedLevel ); + } +} + +//----------------------------------------------------------------------------- +// +// Helper method to set a device to be on +//----------------------------------------------------------------------------- +void Node::SetNodeOn +( +) +{ + // Level is 0-99, with 0 = off and 99 = fully on. 255 = turn on at last level. + if( Basic* cc = static_cast( GetCommandClass( Basic::StaticGetCommandClassId() ) ) ) + { + cc->Set( 255 ); + } +} + +//----------------------------------------------------------------------------- +// +// Helper method to set a device to be off +//----------------------------------------------------------------------------- +void Node::SetNodeOff +( +) +{ + // Level is 0-99, with 0 = off and 99 = fully on. 255 = turn on at last level. + if( Basic* cc = static_cast( GetCommandClass( Basic::StaticGetCommandClassId() ) ) ) + { + cc->Set( 0 ); + } +} + +//----------------------------------------------------------------------------- +// +// Helper to create a ValueID +//----------------------------------------------------------------------------- +ValueID Node::CreateValueID +( + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _valueIndex, + ValueID::ValueType const _type +) +{ + return ValueID( m_homeId, m_nodeId, _genre, _commandClassId, _instance, _valueIndex, _type ); +} + +//----------------------------------------------------------------------------- +// +// Helper to create a new bool value and add it to the value store +//----------------------------------------------------------------------------- +bool Node::CreateValueBool +( + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _valueIndex, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + bool const _default, + uint8 const _pollIntensity +) +{ + ValueBool* value = new ValueBool( m_homeId, m_nodeId, _genre, _commandClassId, _instance, _valueIndex, _label, _units, _readOnly, _writeOnly, _default, _pollIntensity ); + ValueStore* store = GetValueStore(); + if( store->AddValue( value ) ) + { + value->Release(); + return true; + } + + value->Release(); + return false; +} + +//----------------------------------------------------------------------------- +// +// Helper to create a new trigger value and add it to the value store +//----------------------------------------------------------------------------- +bool Node::CreateValueButton +( + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _valueIndex, + string const& _label, + uint8 const _pollIntensity +) +{ + ValueButton* value = new ValueButton( m_homeId, m_nodeId, _genre, _commandClassId, _instance, _valueIndex, _label, _pollIntensity ); + ValueStore* store = GetValueStore(); + if( store->AddValue( value ) ) + { + value->Release(); + return true; + } + + value->Release(); + return false; +} + +//----------------------------------------------------------------------------- +// +// Helper to create a new byte value and add it to the value store +//----------------------------------------------------------------------------- +bool Node::CreateValueByte +( + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _valueIndex, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + uint8 const _default, + uint8 const _pollIntensity +) +{ + ValueByte* value = new ValueByte( m_homeId, m_nodeId, _genre, _commandClassId, _instance, _valueIndex, _label, _units, _readOnly, _writeOnly, _default, _pollIntensity ); + ValueStore* store = GetValueStore(); + if( store->AddValue( value ) ) + { + value->Release(); + return true; + } + + value->Release(); + return false; +} + +//----------------------------------------------------------------------------- +// +// Helper to create a new decimal value and add it to the value store +//----------------------------------------------------------------------------- +bool Node::CreateValueDecimal +( + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _valueIndex, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + string const& _default, + uint8 const _pollIntensity +) +{ + ValueDecimal* value = new ValueDecimal( m_homeId, m_nodeId, _genre, _commandClassId, _instance, _valueIndex, _label, _units, _readOnly, _writeOnly, _default, _pollIntensity ); + ValueStore* store = GetValueStore(); + if( store->AddValue( value ) ) + { + value->Release(); + return true; + } + + value->Release(); + return false; +} + +//----------------------------------------------------------------------------- +// +// Helper to create a new int value and add it to the value store +//----------------------------------------------------------------------------- +bool Node::CreateValueInt +( + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _valueIndex, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + int32 const _default, + uint8 const _pollIntensity +) +{ + ValueInt* value = new ValueInt( m_homeId, m_nodeId, _genre, _commandClassId, _instance, _valueIndex, _label, _units, _readOnly, _writeOnly, _default, _pollIntensity ); + ValueStore* store = GetValueStore(); + if( store->AddValue( value ) ) + { + value->Release(); + return true; + } + + value->Release(); + return false; +} + +//----------------------------------------------------------------------------- +// +// Helper to create a new list value and add it to the value store +//----------------------------------------------------------------------------- +bool Node::CreateValueList +( + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _valueIndex, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + uint8 const _size, + vector const& _items, + int32 const _default, + uint8 const _pollIntensity +) +{ + ValueList* value = new ValueList( m_homeId, m_nodeId, _genre, _commandClassId, _instance, _valueIndex, _label, _units, _readOnly, _writeOnly, _items, _default, _pollIntensity, _size ); + ValueStore* store = GetValueStore(); + if( store->AddValue( value ) ) + { + value->Release(); + return true; + } + + value->Release(); + return false; +} + +//----------------------------------------------------------------------------- +// +// Helper to create a new raw value and add it to the value store +//----------------------------------------------------------------------------- +bool Node::CreateValueRaw +( + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _valueIndex, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + uint8 const* _default, + uint8 const _length, + uint8 const _pollIntensity +) +{ + ValueRaw* value = new ValueRaw( m_homeId, m_nodeId, _genre, _commandClassId, _instance, _valueIndex, _label, _units, _readOnly, _writeOnly, _default, _length, _pollIntensity ); + ValueStore* store = GetValueStore(); + if( store->AddValue( value ) ) + { + value->Release(); + return true; + } + + value->Release(); + return false; +} + +//----------------------------------------------------------------------------- +// +// Helper to create a new schedule value and add it to the value store +//----------------------------------------------------------------------------- +bool Node::CreateValueSchedule +( + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _valueIndex, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + uint8 const _pollIntensity +) +{ + ValueSchedule* value = new ValueSchedule( m_homeId, m_nodeId, _genre, _commandClassId, _instance, _valueIndex, _label, _units, _readOnly, _writeOnly, _pollIntensity ); + ValueStore* store = GetValueStore(); + if( store->AddValue( value ) ) + { + value->Release(); + return true; + } + + value->Release(); + return false; +} + +//----------------------------------------------------------------------------- +// +// Helper to create a new short value and add it to the value store +//----------------------------------------------------------------------------- +bool Node::CreateValueShort +( + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _valueIndex, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + int16 const _default, + uint8 const _pollIntensity +) +{ + ValueShort* value = new ValueShort( m_homeId, m_nodeId, _genre, _commandClassId, _instance, _valueIndex, _label, _units, _readOnly, _writeOnly, _default, _pollIntensity ); + ValueStore* store = GetValueStore(); + if( store->AddValue( value ) ) + { + value->Release(); + return true; + } + + value->Release(); + return false; +} + +//----------------------------------------------------------------------------- +// +// Helper to create a new string value and add it to the value store +//----------------------------------------------------------------------------- +bool Node::CreateValueString +( + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _valueIndex, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + string const& _default, + uint8 const _pollIntensity +) +{ + ValueString* value = new ValueString( m_homeId, m_nodeId, _genre, _commandClassId, _instance, _valueIndex, _label, _units, _readOnly, _writeOnly, _default, _pollIntensity ); + ValueStore* store = GetValueStore(); + if( store->AddValue( value ) ) + { + value->Release(); + return true; + } + + value->Release(); + return false; +} + +//----------------------------------------------------------------------------- +// +// Helper to remove an existing list value from the value store +//----------------------------------------------------------------------------- +void Node::RemoveValueList +( + ValueList* _value +) +{ + ValueStore* store = GetValueStore(); + store->RemoveValue( _value->GetID().GetValueStoreKey() ); +} + +//----------------------------------------------------------------------------- +// +// Get the value object with the specified ID +//----------------------------------------------------------------------------- +bool Node::CreateValueFromXML +( + uint8 const _commandClassId, + TiXmlElement const* _valueElement +) +{ + Value* value = NULL; + + // Create the value + ValueID::ValueType type = Value::GetTypeEnumFromName( _valueElement->Attribute( "type" ) ); + + switch( type ) + { + case ValueID::ValueType_Bool: { value = new ValueBool(); break; } + case ValueID::ValueType_Byte: { value = new ValueByte(); break; } + case ValueID::ValueType_Decimal: { value = new ValueDecimal(); break; } + case ValueID::ValueType_Int: { value = new ValueInt(); break; } + case ValueID::ValueType_List: { value = new ValueList(); break; } + case ValueID::ValueType_Schedule: { value = new ValueSchedule(); break; } + case ValueID::ValueType_Short: { value = new ValueShort(); break; } + case ValueID::ValueType_String: { value = new ValueString(); break; } + case ValueID::ValueType_Button: { value = new ValueButton(); break; } + case ValueID::ValueType_Raw: { value = new ValueRaw(); break; } + default: { Log::Write( LogLevel_Info, m_nodeId, "Unknown ValueType in XML: %s", _valueElement->Attribute( "type" ) ); break; } + } + + if( value ) + { + value->ReadXML( m_homeId, m_nodeId, _commandClassId, _valueElement ); + + ValueStore* store = GetValueStore(); + if( store->AddValue( value ) ) + { + value->Release(); + return true; + } + + value->Release(); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Apply XML differences to a value +//----------------------------------------------------------------------------- +void Node::ReadValueFromXML +( + uint8 const _commandClassId, + TiXmlElement const* _valueElement +) +{ + int32 intVal; + + ValueID::ValueGenre genre = Value::GetGenreEnumFromName( _valueElement->Attribute( "genre" ) ); + ValueID::ValueType type = Value::GetTypeEnumFromName( _valueElement->Attribute( "type" ) ); + + uint8 instance = 0; + if( TIXML_SUCCESS == _valueElement->QueryIntAttribute( "instance", &intVal ) ) + { + instance = (uint8)intVal; + } + + uint8 index = 0; + if( TIXML_SUCCESS == _valueElement->QueryIntAttribute( "index", &intVal ) ) + { + index = (uint8)intVal; + } + + ValueID id = ValueID( m_homeId, m_nodeId, genre, _commandClassId, instance, index, type ); + + // Try to get the value from the ValueStore (everything except configuration parameters + // should already have been created when the command class instance count was read in). + // Create it if it doesn't already exist. + if( ValueStore* store = GetValueStore() ) + { + if( Value* value = store->GetValue( id.GetValueStoreKey() ) ) + { + value->ReadXML( m_homeId, m_nodeId, _commandClassId, _valueElement ); + value->Release(); + } + else + { + CreateValueFromXML( _commandClassId, _valueElement ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Get the value object with the specified ID +//----------------------------------------------------------------------------- +Value* Node::GetValue +( + ValueID const& _id +) +{ + // This increments the value's reference count + return GetValueStore()->GetValue( _id.GetValueStoreKey() ); +} + +//----------------------------------------------------------------------------- +// +// Get the value object with the specified settings +//----------------------------------------------------------------------------- +Value* Node::GetValue +( + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _valueIndex +) +{ + Value* value = NULL; + ValueStore* store = GetValueStore(); + // This increments the value's reference count + value = store->GetValue( ValueID::GetValueStoreKey( _commandClassId, _instance, _valueIndex ) ); + return value; +} + +//----------------------------------------------------------------------------- +// +// Remove the value object with the specified settings +//----------------------------------------------------------------------------- +bool Node::RemoveValue +( + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _valueIndex +) +{ + ValueStore* store = GetValueStore(); + return store->RemoveValue( ValueID::GetValueStoreKey( _commandClassId, _instance, _valueIndex ) ); +} + +//----------------------------------------------------------------------------- +// +// Get a Group from the node's map +//----------------------------------------------------------------------------- +Group* Node::GetGroup +( + uint8 const _groupIdx +) +{ + map::iterator it = m_groups.find( _groupIdx ); + if( it == m_groups.end() ) + { + return NULL; + } + + return it->second; +} + +//----------------------------------------------------------------------------- +// +// Add a group into the node's map +//----------------------------------------------------------------------------- +void Node::AddGroup +( + Group* _group +) +{ + map::iterator it = m_groups.find( _group->GetIdx() ); + if( it != m_groups.end() ) + { + // There is already a group with this id. We will replace it. + delete it->second; + m_groups.erase( it ); + } + + m_groups[_group->GetIdx()] = _group; +} + +//----------------------------------------------------------------------------- +// +// Save the group data +//----------------------------------------------------------------------------- +void Node::WriteGroups +( + TiXmlElement* _associationsElement +) +{ + for( map::iterator it = m_groups.begin(); it != m_groups.end(); ++it ) + { + Group* group = it->second; + + TiXmlElement* groupElement = new TiXmlElement( "Group" ); + _associationsElement->LinkEndChild( groupElement ); + group->WriteXML( groupElement ); + } +} + +//----------------------------------------------------------------------------- +// +// Gets the number of association groups reported by this node +//----------------------------------------------------------------------------- +uint8 Node::GetNumGroups +( +) +{ + return (uint8) m_groups.size(); +} + +//----------------------------------------------------------------------------- +// +// Gets the associations for a group +//----------------------------------------------------------------------------- +uint32 Node::GetAssociations +( + uint8 const _groupIdx, + uint8** o_associations +) +{ + uint32 numAssociations = 0; + if( Group* group = GetGroup( _groupIdx ) ) + { + numAssociations = group->GetAssociations( o_associations ); + } + + return numAssociations; +} + +//----------------------------------------------------------------------------- +// +// Gets the maximum number of associations for a group +//----------------------------------------------------------------------------- +uint8 Node::GetMaxAssociations +( + uint8 const _groupIdx +) +{ + uint8 maxAssociations = 0; + if( Group* group = GetGroup( _groupIdx ) ) + { + maxAssociations = group->GetMaxAssociations(); + } + + return maxAssociations; +} + +//----------------------------------------------------------------------------- +// +// Gets the label for a particular group +//----------------------------------------------------------------------------- +string Node::GetGroupLabel +( + uint8 const _groupIdx +) +{ + string label = ""; + if( Group* group = GetGroup( _groupIdx ) ) + { + label = group->GetLabel(); + } + + return label; +} + +//----------------------------------------------------------------------------- +// +// Adds a node to an association group +//----------------------------------------------------------------------------- +void Node::AddAssociation +( + uint8 const _groupIdx, + uint8 const _targetNodeId +) +{ + if( Group* group = GetGroup( _groupIdx ) ) + { + group->AddAssociation( _targetNodeId ); + } +} + +//----------------------------------------------------------------------------- +// +// Removes a node from an association group +//----------------------------------------------------------------------------- +void Node::RemoveAssociation +( + uint8 const _groupIdx, + uint8 const _targetNodeId +) +{ + if( Group* group = GetGroup( _groupIdx ) ) + { + group->RemoveAssociation( _targetNodeId ); + } +} + +//----------------------------------------------------------------------------- +// +// Automatically associate the controller with certain groups +//----------------------------------------------------------------------------- +void Node::AutoAssociate +( +) +{ + bool autoAssociate = false; + Options::Get()->GetOptionAsBool( "Associate", &autoAssociate ); + if( autoAssociate ) + { + // Try to automatically associate with any groups that have been flagged. + uint8 controllerNodeId = GetDriver()->GetNodeId(); + + for( map::iterator it = m_groups.begin(); it != m_groups.end(); ++it ) + { + Group* group = it->second; + if( group->IsAuto() && !group->Contains( controllerNodeId ) ) + { + // Associate the controller into the group + Log::Write( LogLevel_Info, m_nodeId, "Adding the controller to group %d (%s) of node %d", group->GetIdx(), group->GetLabel().c_str(), GetNodeId() ); + group->AddAssociation( controllerNodeId ); + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Get a pointer to our driver +//----------------------------------------------------------------------------- +Driver* Node::GetDriver +( +)const +{ + return( Manager::Get()->GetDriver( m_homeId ) ); +} + +//----------------------------------------------------------------------------- +// Device Classes +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Use the device class data to get a label for a MultiChannel EndPoint. +//----------------------------------------------------------------------------- +string Node::GetEndPointDeviceClassLabel +( + uint8 const _generic, + uint8 const _specific +) +{ + char str[32]; + string label; + + snprintf( str, sizeof(str), "Generic 0x%.2x Specific 0x%.2x", _generic, _specific ); + label = str; + + // Read in the device class data if it has not been read already. + if( !s_deviceClassesLoaded ) + { + ReadDeviceClasses(); + } + + // Get the Generic device class label + map::iterator git = s_genericDeviceClasses.find( _generic ); + if( git != s_genericDeviceClasses.end() ) + { + GenericDeviceClass* genericDeviceClass = git->second; + label = genericDeviceClass->GetLabel(); + + // Override with any specific device class label + if( DeviceClass* specificDeviceClass = genericDeviceClass->GetSpecificDeviceClass( _specific ) ) + { + label = specificDeviceClass->GetLabel(); + } + } + + return label; +} + +//----------------------------------------------------------------------------- +// +// Set the device class data for the node +//----------------------------------------------------------------------------- +bool Node::SetDeviceClasses +( + uint8 const _basic, + uint8 const _generic, + uint8 const _specific +) +{ + m_basic = _basic; + m_generic = _generic; + m_specific = _specific; + + // Read in the device class data if it has not been read already. + if( !s_deviceClassesLoaded ) + { + ReadDeviceClasses(); + } + + // Get the basic device class label + map::iterator bit = s_basicDeviceClasses.find( _basic ); + if( bit != s_basicDeviceClasses.end() ) + { + m_type = bit->second; + Log::Write( LogLevel_Info, m_nodeId, " Basic device class (0x%.2x) - %s", m_basic, m_type.c_str() ); + } + else + { + Log::Write( LogLevel_Info, m_nodeId, " Basic device class unknown" ); + } + + // Apply any Generic device class data + uint8 basicMapping = 0; + map::iterator git = s_genericDeviceClasses.find( _generic ); + if( git != s_genericDeviceClasses.end() ) + { + GenericDeviceClass* genericDeviceClass = git->second; + m_type = genericDeviceClass->GetLabel(); + + Log::Write( LogLevel_Info, m_nodeId, " Generic device Class (0x%.2x) - %s", m_generic, m_type.c_str() ); + + // Add the mandatory command classes for this generic class type + AddMandatoryCommandClasses( genericDeviceClass->GetMandatoryCommandClasses() ); + + // Get the command class that COMMAND_CLASS_BASIC maps to. + basicMapping = genericDeviceClass->GetBasicMapping(); + + // Apply any Specific device class data + if( DeviceClass* specificDeviceClass = genericDeviceClass->GetSpecificDeviceClass( _specific ) ) + { + m_type = specificDeviceClass->GetLabel(); + + Log::Write( LogLevel_Info, m_nodeId, " Specific device class (0x%.2x) - %s", m_specific, m_type.c_str() ); + + // Add the mandatory command classes for this specific class type + AddMandatoryCommandClasses( specificDeviceClass->GetMandatoryCommandClasses() ); + + if( specificDeviceClass->GetBasicMapping() ) + { + // Override the generic device class basic mapping with the specific device class one. + basicMapping = specificDeviceClass->GetBasicMapping(); + } + } + else + { + Log::Write( LogLevel_Info, m_nodeId, " No specific device class defined" ); + } + } + else + { + Log::Write( LogLevel_Info, m_nodeId, " No generic or specific device classes defined" ); + } + + // Deal with sleeping devices + if( !m_listening && !IsFrequentListeningDevice()) + { + // Device does not always listen, so we need the WakeUp handler. We can't + // wait for the command class list because the request for the command + // classes may need to go in the wakeup queue itself! + if( CommandClass* pCommandClass = AddCommandClass( WakeUp::StaticGetCommandClassId() ) ) + { + pCommandClass->SetInstance( 1 ); + } + } + + // Apply any COMMAND_CLASS_BASIC remapping + if( Basic* cc = static_cast( GetCommandClass( Basic::StaticGetCommandClassId() ) ) ) + { + cc->SetMapping( basicMapping ); + } + + // Write the mandatory command classes to the log + if( !m_commandClassMap.empty() ) + { + map::const_iterator cit; + + Log::Write( LogLevel_Info, m_nodeId, " Mandatory Command Classes for Node %d:", m_nodeId ); + bool reportedClasses = false; + for( cit = m_commandClassMap.begin(); cit != m_commandClassMap.end(); ++cit ) + { + if( !cit->second->IsAfterMark() && cit->second->GetCommandClassId() != NoOperation::StaticGetCommandClassId() ) + { + Log::Write( LogLevel_Info, m_nodeId, " %s", cit->second->GetCommandClassName().c_str() ); + reportedClasses = true; + } + } + if( !reportedClasses ) + { + Log::Write( LogLevel_Info, m_nodeId, " None" ); + } + + Log::Write( LogLevel_Info, m_nodeId, " Mandatory Command Classes controlled by Node %d:", m_nodeId ); + reportedClasses = false; + for( cit = m_commandClassMap.begin(); cit != m_commandClassMap.end(); ++cit ) + { + if( cit->second->IsAfterMark() ) + { + Log::Write( LogLevel_Info, m_nodeId, " %s", cit->second->GetCommandClassName().c_str() ); + reportedClasses = true; + } + } + if( !reportedClasses ) + { + Log::Write( LogLevel_Info, m_nodeId, " None" ); + } + } + + return true; +} + +//----------------------------------------------------------------------------- +// +// Add mandatory command classes to the node +//----------------------------------------------------------------------------- +bool Node::AddMandatoryCommandClasses +( + uint8 const* _commandClasses +) +{ + if( NULL == _commandClasses ) + { + // No command classes to add + return false; + } + + int i=0; + bool afterMark = false; + while( uint8 cc = _commandClasses[i++] ) + { + if( cc == 0xef ) + { + // COMMAND_CLASS_MARK. + // Marks the end of the list of supported command classes. The remaining classes + // are those that can be controlled by this device, which we can ignore. + afterMark = true; + continue; + } + + if( CommandClasses::IsSupported( cc ) ) + { + if( CommandClass* commandClass = AddCommandClass( cc ) ) + { + // If this class came after the COMMAND_CLASS_MARK, then we do not create values. + if( afterMark ) + { + commandClass->SetAfterMark(); + } + + // Start with an instance count of one. If the device supports COMMMAND_CLASS_MULTI_INSTANCE + // then some command class instance counts will increase. + commandClass->SetInstance( 1 ); + } + } + } + + return true; +} + +//----------------------------------------------------------------------------- +// +// Read the static device class data from the device_classes.xml file +//----------------------------------------------------------------------------- +void Node::ReadDeviceClasses +( +) +{ + // Load the XML document that contains the device class information + string configPath; + Options::Get()->GetOptionAsString( "ConfigPath", &configPath ); + + string filename = configPath + string("device_classes.xml"); + + TiXmlDocument doc; + if( !doc.LoadFile( filename.c_str(), TIXML_ENCODING_UTF8 ) ) + { + Log::Write( LogLevel_Info, "Failed to load device_classes.xml" ); + Log::Write( LogLevel_Info, "Check that the config path provided when creating the Manager points to the correct location." ); + return; + } + + TiXmlElement const* deviceClassesElement = doc.RootElement(); + + // Read the basic and generic device classes + TiXmlElement const* child = deviceClassesElement->FirstChildElement(); + while( child ) + { + char const* str = child->Value(); + if( str ) + { + char const* keyStr = child->Attribute( "key" ); + if( keyStr ) + { + char* pStop; + uint8 key = (uint8)strtol( keyStr, &pStop, 16 ); + + if( !strcmp( str, "Generic" ) ) + { + s_genericDeviceClasses[key] = new GenericDeviceClass( child ); + } + else if( !strcmp( str, "Basic" ) ) + { + char const* label = child->Attribute( "label" ); + if( label ) + { + s_basicDeviceClasses[key] = label; + } + } + } + } + + child = child->NextSiblingElement(); + } + + s_deviceClassesLoaded = true; +} + +//----------------------------------------------------------------------------- +// +// Return driver statistics +//----------------------------------------------------------------------------- +void Node::GetNodeStatistics +( + NodeData* _data +) +{ + _data->m_sentCnt = m_sentCnt; + _data->m_sentFailed = m_sentFailed; + _data->m_retries = m_retries; + _data->m_receivedCnt = m_receivedCnt; + _data->m_receivedDups = m_receivedDups; + _data->m_receivedUnsolicited = m_receivedUnsolicited; + _data->m_lastRequestRTT = m_lastRequestRTT; + _data->m_lastResponseRTT = m_lastResponseRTT; + _data->m_sentTS = m_sentTS.GetAsString(); + _data->m_receivedTS = m_receivedTS.GetAsString(); + _data->m_averageRequestRTT = m_averageRequestRTT; + _data->m_averageResponseRTT = m_averageResponseRTT; + _data->m_quality = m_quality; + memcpy( _data->m_lastReceivedMessage, m_lastReceivedMessage, sizeof(m_lastReceivedMessage) ); + for( map::const_iterator it = m_commandClassMap.begin(); it != m_commandClassMap.end(); ++it ) + { + CommandClassData ccData; + ccData.m_commandClassId = it->second->GetCommandClassId(); + ccData.m_sentCnt = it->second->GetSentCnt(); + ccData.m_receivedCnt = it->second->GetReceivedCnt(); + _data->m_ccData.push_back( ccData ); + } +} + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Node::DeviceClass::DeviceClass +( + TiXmlElement const* _el +): + m_mandatoryCommandClasses(NULL), + m_basicMapping(0) +{ + char const* str = _el->Attribute( "label" ); + if( str ) + { + m_label = str; + } + + str = _el->Attribute( "command_classes" ); + if( str ) + { + // Parse the comma delimted command class + // list into a temporary vector. + vector ccs; + char* pos = const_cast(str); + while( *pos ) + { + ccs.push_back( (uint8)strtol( pos, &pos, 16 ) ); + if( (*pos) == ',' ) + { + ++pos; + } + } + + // Copy the vector contents into an array. + size_t numCCs = ccs.size(); + m_mandatoryCommandClasses = new uint8[numCCs+1]; + m_mandatoryCommandClasses[numCCs] = 0; // Zero terminator + + for( uint32 i=0; iAttribute( "basic" ); + if( str ) + { + char* pStop; + m_basicMapping = (uint8)strtol( str, &pStop, 16 ); + } +} + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Node::GenericDeviceClass::GenericDeviceClass +( + TiXmlElement const* _el +): + DeviceClass( _el ) +{ + // Add any specific device classes + TiXmlElement const* child = _el->FirstChildElement(); + while( child ) + { + char const* str = child->Value(); + if( str && !strcmp( str, "Specific" ) ) + { + char const* keyStr = child->Attribute( "key" ); + if( keyStr ) + { + char* pStop; + uint8 key = (uint8)strtol( keyStr, &pStop, 16 ); + + m_specificDeviceClasses[key] = new DeviceClass( child ); + } + } + + child = child->NextSiblingElement(); + } +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +Node::GenericDeviceClass::~GenericDeviceClass +( +) +{ + while( !m_specificDeviceClasses.empty() ) + { + map::iterator it = m_specificDeviceClasses.begin(); + delete it->second; + m_specificDeviceClasses.erase( it ); + } +} + +//----------------------------------------------------------------------------- +// +// Get a specific device class object +//----------------------------------------------------------------------------- +Node::DeviceClass* Node::GenericDeviceClass::GetSpecificDeviceClass +( + uint8 const& _specific +) +{ + map::iterator it = m_specificDeviceClasses.find( _specific ); + if( it != m_specificDeviceClasses.end() ) + { + return it->second; + } + + return NULL; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/Node.h b/lib/ESPiLight/pilight/libs/openzwave/Node.h new file mode 100644 index 0000000..2264b9e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Node.h @@ -0,0 +1,577 @@ +//----------------------------------------------------------------------------- +// +// Node.h +// +// A node in the Z-Wave network +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Node_H +#define _Node_H + +#include +#include +#include +#include +#include "Defs.h" +#include "value_classes/ValueID.h" +#include "value_classes/ValueList.h" +#include "Msg.h" +#include "platform/TimeStamp.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class CommandClass; + class Driver; + class Group; + class ValueStore; + class Value; + class ValueBool; + class ValueButton; + class ValueByte; + class ValueDecimal; + class ValueInt; + class ValueSchedule; + class ValueShort; + class ValueString; + class Mutex; + + /** \brief The Node class describes a Z-Wave node object...typically a device on the + * Z-Wave network. + */ + class Node + { + friend class Manager; + friend class Driver; + friend class Group; + friend class Value; + friend class ValueButton; + friend class Alarm; + friend class Association; + friend class AssociationCommandConfiguration; + friend class Basic; + friend class Battery; + friend class ClimateControlSchedule; + friend class Clock; + friend class CommandClass; + friend class ControllerReplication; + friend class EnergyProduction; + friend class Hail; + friend class Indicator; + friend class Language; + friend class Lock; + friend class ManufacturerSpecific; + friend class Meter; + friend class MeterPulse; + friend class MultiInstance; + friend class NodeNaming; + friend class Protection; + friend class Security; + friend class SensorAlarm; + friend class SensorBinary; + friend class SensorMultilevel; + friend class SwitchAll; + friend class SwitchBinary; + friend class SwitchMultilevel; + friend class SwitchToggleBinary; + friend class SwitchToggleMultilevel; + friend class ThermostatFanMode; + friend class ThermostatFanState; + friend class ThermostatMode; + friend class ThermostatOperatingState; + friend class ThermostatSetpoint; + friend class Version; + friend class WakeUp; + + //----------------------------------------------------------------------------- + // Construction + //----------------------------------------------------------------------------- + public: + /** Constructor initializes the node object, associating it with a specific + * network (_homeId) and network node (_nodeId). + * \param _homeId The homeId of the network to which this node is connected. + * \param _nodeId The nodeId of this node. + */ + Node( uint32 const _homeId, uint8 const _nodeId ); + /** Destructor cleans up memory allocated to node and its child objects. + */ + virtual ~Node(); + + private: + /** Returns a pointer to the driver (interface with a Z-Wave controller) + * associated with this node. + */ + Driver* GetDriver()const; + + //----------------------------------------------------------------------------- + // Initialization + //----------------------------------------------------------------------------- + public: + enum QueryStage + { + QueryStage_ProtocolInfo, /**< Retrieve protocol information */ + QueryStage_Probe, /**< Ping device to see if alive */ + QueryStage_WakeUp, /**< Start wake up process if a sleeping node */ + QueryStage_ManufacturerSpecific1, /**< Retrieve manufacturer name and product ids if ProtocolInfo lets us */ + QueryStage_NodeInfo, /**< Retrieve info about supported, controlled command classes */ + QueryStage_SecurityReport, /**< Retrive a list of Command Classes that require Security */ + QueryStage_ManufacturerSpecific2, /**< Retrieve manufacturer name and product ids */ + QueryStage_Versions, /**< Retrieve version information */ + QueryStage_Instances, /**< Retrieve information about multiple command class instances */ + QueryStage_Static, /**< Retrieve static information (doesn't change) */ + QueryStage_Probe1, /**< Ping a device upon starting with configuration */ + QueryStage_Associations, /**< Retrieve information about associations */ + QueryStage_Neighbors, /**< Retrieve node neighbor list */ + QueryStage_Session, /**< Retrieve session information (changes infrequently) */ + QueryStage_Dynamic, /**< Retrieve dynamic information (changes frequently) */ + QueryStage_Configuration, /**< Retrieve configurable parameter information (only done on request) */ + QueryStage_Complete, /**< Query process is completed for this node */ + QueryStage_None /**< Query process hasn't started for this node */ + }; + + + /** + * This function advances the query process (see Remarks below for more detail on the + * process). It iterates through the various query stages enumerated in Node::QueryStage. + * + * \remark + * For OpenZWave to discover everything about a node, we have to follow a certain + * order of queries, because the results of one stage may affect what is requested + * in the next stage. The stage is saved with the node data, so that any incomplete + * queries can be restarted the next time the application runs. + *

        + * The individual command classes also store some state information as to whether + * they have had a response to certain queries. This state information is + * initilized by the SetStaticRequests call in QueryStage_None. It is also saved, + * so we do not need to request state from every command class if some have previously + * responded. + */ + void AdvanceQueries(); + + /** + * Signal that a specific query stage has been completed for this node. This will + * only work if the query process for this node is indeed at the specified stage. + * Otherwise, the function returns with no action. + * \param _stage The current stage of the query process. + */ + void QueryStageComplete( QueryStage const _stage ); + + /** + * Retry the specified query stage (up to _maxAttempts retries). This will + * only work if the query process for this node is indeed at the specified stage. + * Otherwise, the function returns with no action. + * \param _stage The query stage to retry. + * \param _maxAttempts + */ + void QueryStageRetry( QueryStage const _stage, uint8 const _maxAttempts = 0 ); // maxAttempts of zero means no limit + + /** + * This function sets the query stage for the node (but only to an earlier stage). + * If a later stage is specified than the current one, it is ignored. + * \param _stage The desired query stage. + * \see m_queryStage, m_queryPending + */ + void SetQueryStage( QueryStage const _stage, bool const _advance = true ); + + /** + * Returns the current query stage enum. + * \return Enum value with the current query stage. + * \see m_queryStage + */ + Node::QueryStage GetCurrentQueryStage() { return m_queryStage; } + + /** + * Returns the specified query stage string. + * \param _stage The query stage. + * \return Specified query stage string. + * \see m_queryStage, m_queryPending + */ + string GetQueryStageName( QueryStage const _stage ); + + /** + * Returns whether the library thinks a node is functioning properly + * \return boolean status of node. + */ + bool IsNodeAlive()const{ return m_nodeAlive; } + + /** + * This function handles a response to the FUNC_ID_ZW_GET_NODE_PROTOCOL_INFO + * command for this node. If protocol information has already been retrieved + * for the node, the function simply returns. Otherwise, it populates several + * member variables about the device at this node: + * - m_routing (whether it is a routing node (capable of passing commands along to other nodes in the network) or not + * - m_maxBaudRate (the maximum baud rate at which this device can communicate) + * - m_version (TODO) + * - m_security (whether device supports security features) + * - m_listening (device is powered and listening constantly) + * - m_frequentListening (device can be woken up with a beam) + * - m_beaming (device is beam capable) + */ + void UpdateProtocolInfo( uint8 const* _data ); + void UpdateNodeInfo( uint8 const* _data, uint8 const _length ); + + bool ProtocolInfoReceived()const{ return m_protocolInfoReceived; } + bool NodeInfoReceived()const{ return m_nodeInfoReceived; } + + bool AllQueriesCompleted()const{ return( QueryStage_Complete == m_queryStage ); } + + /** + * Handle dead node detection tracking. + * Use this routine to set state of nodes. + * Tracks state as well as send notifications. + */ + void SetNodeAlive( bool const _isAlive ); + + private: + void SetStaticRequests(); + + QueryStage m_queryStage; + bool m_queryPending; + bool m_queryConfiguration; + uint8 m_queryRetries; + bool m_protocolInfoReceived; + bool m_nodeInfoReceived; + bool m_manufacturerSpecificClassReceived; + bool m_nodeInfoSupported; + bool m_nodeAlive; + + //----------------------------------------------------------------------------- + // Capabilities + //----------------------------------------------------------------------------- + public: + // Security flags + enum + { + SecurityFlag_Security = 0x01, + SecurityFlag_Controller = 0x02, + SecurityFlag_SpecificDevice = 0x04, + SecurityFlag_RoutingSlave = 0x08, + SecurityFlag_BeamCapability = 0x10, + SecurityFlag_Sensor250ms = 0x20, + SecurityFlag_Sensor1000ms = 0x40, + SecurityFlag_OptionalFunctionality = 0x80 + }; + + // Node Ids + enum + { + NodeBroadcast = 0xff + }; + + bool IsListeningDevice()const{ return m_listening; } + bool IsFrequentListeningDevice()const{ return m_frequentListening; } + bool IsBeamingDevice()const{ return m_beaming; } + bool IsRoutingDevice()const{ return m_routing; } + bool IsSecurityDevice()const{ return m_security; } + uint32 GetMaxBaudRate()const{ return m_maxBaudRate; } + uint8 GetVersion()const{ return m_version; } + uint8 GetSecurity()const{ return m_security; } + + uint8 GetNodeId()const{ return m_nodeId; } + + uint8 GetBasic()const{ return m_basic; } + uint8 GetGeneric()const{ return m_generic; } + uint8 GetSpecific()const{ return m_specific; } + string const& GetType()const{ return m_type; } + uint32 GetNeighbors( uint8** o_associations ); + bool IsController()const{ return ( m_basic == 0x01 || m_basic == 0x02 ) && ( m_generic == 0x01 || m_generic == 0x02 ); } + bool IsAddingNode() const { return m_addingNode; } /* These three *AddingNode functions are used to tell if we this node is just being discovered. Currently used by the Security CC to initiate the Network Key Exchange */ + void SetAddingNode() { m_addingNode = true; } + void ClearAddingNode() { m_addingNode = false; } + + private: + bool m_listening; + bool m_frequentListening; + bool m_beaming; + bool m_routing; + uint32 m_maxBaudRate; + uint8 m_version; + bool m_security; + uint32 m_homeId; + uint8 m_nodeId; + uint8 m_basic; //*< Basic device class (0x01-Controller, 0x02-Static Controller, 0x03-Slave, 0x04-Routing Slave + uint8 m_generic; + uint8 m_specific; + string m_type; // Label representing the specific/generic/basic value + uint8 m_neighbors[29]; // Bitmask containing the neighbouring nodes + uint8 m_numRouteNodes; // number of node routes + uint8 m_routeNodes[5]; // nodes to route to + map m_buttonMap; // Map button IDs into virtual node numbers + bool m_addingNode; + + //----------------------------------------------------------------------------- + // Device Naming + //----------------------------------------------------------------------------- + private: + // Manufacturer, Product and Name are stored here so they can be set by the + // user even if the device does not support the relevant command classes. + string GetManufacturerName()const{ return m_manufacturerName; } + string GetProductName()const{ return m_productName; } + string GetNodeName()const{ return m_nodeName; } + string GetLocation()const{ return m_location; } + + string GetManufacturerId()const{ return m_manufacturerId; } + string GetProductType()const{ return m_productType; } + string GetProductId()const{ return m_productId; } + + void SetManufacturerName( string const& _manufacturerName ){ m_manufacturerName = _manufacturerName; } + void SetProductName( string const& _productName ){ m_productName = _productName; } + void SetNodeName( string const& _nodeName ); + void SetLocation( string const& _location ); + + void SetManufacturerId( string const& _manufacturerId ){ m_manufacturerId = _manufacturerId; } + void SetProductType( string const& _productType ){ m_productType = _productType; } + void SetProductId( string const& _productId ){ m_productId = _productId; } + + string m_manufacturerName; + string m_productName; + string m_nodeName; + string m_location; + + string m_manufacturerId; + string m_productType; + string m_productId; + + //----------------------------------------------------------------------------- + // Command Classes + //----------------------------------------------------------------------------- + public: + /** + * This function retrieves a pointer to the requested command class object (if supported by this node). + * \param _commandClassId Class ID (a single byte value) identifying the command class requested. + * \return Pointer to the requested CommandClass object if supported, otherwise NULL. + * \see CommandClass, m_commandClassMap + */ + CommandClass* GetCommandClass( uint8 const _commandClassId )const; + void ApplicationCommandHandler( uint8 const* _data ); + + /** + * This function sets up Secured Command Classes. It iterates over the existing command classes marking them + * as Secured if they exist, and if they don't, it creates new Command Classes and sets them up as Secured + * @param _data a list of Command Classes that are Secured by the Device + * @param _length the length of the _data string + */ + void SetSecuredClasses( uint8 const* _data, uint8 const _length ); + + private: + /** + * Creates the specified command class object and adds it to the node (via the + * m_commandClassMap) if it doesn't exist. + * No new object is created if it already exists for this node. + * \param _commandClassId Class ID (a single byte value) identifying the command class requested. + * \return Pointer to the CommandClass object just added to the map (NULL if the object + * was already there or if the CommandClass object creation failed). + * \see CommandClass, CommandClasses::CreateCommandClass, m_commandClassMap + */ + CommandClass* AddCommandClass( uint8 const _commandClassId ); + /** + * Removes a command class object from the node (via the m_commandClassMap). Before removing the + * object, this function also removes any values stored in the object's ValueStore. + * \param _commandClassId Class ID (a single byte value) identifying the command class to be removed. + * \see m_commandClassMap, ValueStore, GetValueStore, ValueStore::RemoveCommandClassValues + */ + void RemoveCommandClass( uint8 const _commandClassId ); + void ReadXML( TiXmlElement const* _nodeElement ); + void ReadDeviceProtocolXML( TiXmlElement const* _ccsElement ); + void ReadCommandClassesXML( TiXmlElement const* _ccsElement ); + void WriteXML( TiXmlElement* _nodeElement ); + + map m_commandClassMap; /**< Map of command class ids and pointers to associated command class objects */ + + //----------------------------------------------------------------------------- + // Basic commands (helpers that go through the basic command class) + //----------------------------------------------------------------------------- + public: + void SetLevel( uint8 const _level ); + + //----------------------------------------------------------------------------- + // On/Off commands (helpers that go through the basic or switchall command class) + //----------------------------------------------------------------------------- + public: + void SetNodeOn(); + void SetNodeOff(); + + //----------------------------------------------------------------------------- + // Values (handled by the command classes) + //----------------------------------------------------------------------------- + public: + ValueID CreateValueID( ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _valueIndex, ValueID::ValueType const _type ); + + Value* GetValue( ValueID const& _id ); + Value* GetValue( uint8 const _commandClassId, uint8 const _instance, uint8 const _valueIndex ); + bool RemoveValue( uint8 const _commandClassId, uint8 const _instance, uint8 const _valueIndex ); + + // Helpers for creating values + bool CreateValueBool( ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _valueIndex, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, bool const _default, uint8 const _pollIntensity ); + bool CreateValueButton( ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _valueIndex, string const& _label, uint8 const _pollIntensity ); + bool CreateValueByte( ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _valueIndex, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, uint8 const _default, uint8 const _pollIntensity ); + bool CreateValueDecimal( ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _valueIndex, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, string const& _default, uint8 const _pollIntensity ); + bool CreateValueInt( ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _valueIndex, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, int32 const _default, uint8 const _pollIntensity ); + bool CreateValueList( ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _valueIndex, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, uint8 const _size, vector const& _items, int32 const _default, uint8 const _pollIntensity ); + bool CreateValueRaw( ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _valueIndex, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, uint8 const* _default, uint8 const _length, uint8 const _pollIntensity ); + bool CreateValueSchedule( ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _valueIndex, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, uint8 const _pollIntensity ); + bool CreateValueShort( ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _valueIndex, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, int16 const _default, uint8 const _pollIntensity ); + bool CreateValueString( ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _valueIndex, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, string const& _default, uint8 const _pollIntensity ); + + // helpers for removing values + void RemoveValueList( ValueList* _value ); + + void ReadValueFromXML( uint8 const _commandClassId, TiXmlElement const* _valueElement ); + bool CreateValueFromXML( uint8 const _commandClassId, TiXmlElement const* _valueElement ); + + private: + ValueStore* GetValueStore()const{ return m_values; } + + ValueStore* m_values; // Values reported via command classes + + //----------------------------------------------------------------------------- + // Configuration Parameters (handled by the Configuration command class) + //----------------------------------------------------------------------------- + private: + bool SetConfigParam( uint8 const _param, int32 _value, uint8 const _size ); + void RequestConfigParam( uint8 const _param ); + bool RequestAllConfigParams( uint32 const _requestFlags ); + + //----------------------------------------------------------------------------- + // Dynamic Values (used by query and other command classes for updating) + //----------------------------------------------------------------------------- + private: + bool RequestDynamicValues(); + //----------------------------------------------------------------------------- + // Groups + //----------------------------------------------------------------------------- + private: + // The public interface is provided via the wrappers in the Manager class + uint8 GetNumGroups(); + uint32 GetAssociations( uint8 const _groupIdx, uint8** o_associations ); + uint8 GetMaxAssociations( uint8 const _groupIdx ); + string GetGroupLabel( uint8 const _groupIdx ); + void AddAssociation( uint8 const _groupIdx, uint8 const _targetNodeId ); + void RemoveAssociation( uint8 const _groupIdx, uint8 const _targetNodeId ); + void AutoAssociate(); + + // The following methods are not exposed + Group* GetGroup( uint8 const _groupIdx ); // Get a pointer to a Group object. This must only be called while holding the node Lock. + void AddGroup( Group* _group ); // The groups are fixed properties of a device, so there is no need for a matching RemoveGroup. + void WriteGroups( TiXmlElement* _associationsElement ); // Write the group data out to XNL + + map m_groups; // Maps group indices to Group objects. + + //----------------------------------------------------------------------------- + // Device Classes (static data read from the device_classes.xml file) + //----------------------------------------------------------------------------- + private: + // Container for device class info + class DeviceClass + { + public: + DeviceClass( TiXmlElement const* _el ); + ~DeviceClass(){ delete [] m_mandatoryCommandClasses; } + + uint8 const* GetMandatoryCommandClasses(){ return m_mandatoryCommandClasses; } + uint8 GetBasicMapping(){ return m_basicMapping; } + string const& GetLabel(){ return m_label; } + + private: + uint8* m_mandatoryCommandClasses; // Zero terminated array of mandatory command classes for this device type. + uint8 m_basicMapping; // Command class that COMMAND_CLASS_BASIC maps on to, or zero if there is no mapping. + string m_label; // Descriptive label for the device. + }; + + // Container for generic device class info + class GenericDeviceClass : public DeviceClass + { + public: + GenericDeviceClass( TiXmlElement const* _el ); + ~GenericDeviceClass(); + + DeviceClass* GetSpecificDeviceClass( uint8 const& _specific ); + + private: + map m_specificDeviceClasses; + }; + + + bool SetDeviceClasses( uint8 const _basic, uint8 const _generic, uint8 const _specific ); // Set the device class data for the node + bool AddMandatoryCommandClasses( uint8 const* _commandClasses ); // Add mandatory command classes as specified in the device_classes.xml to the node. + void ReadDeviceClasses(); // Read the static device class data from the device_classes.xml file + string GetEndPointDeviceClassLabel( uint8 const _generic, uint8 const _specific ); + + static bool s_deviceClassesLoaded; // True if the xml file has alreayd been loaded + static map s_basicDeviceClasses; // Map of basic device classes. + static map s_genericDeviceClasses; // Map of generic device classes. + + //----------------------------------------------------------------------------- + // Statistics + //----------------------------------------------------------------------------- + public: + struct CommandClassData + { + uint8 m_commandClassId; + uint32 m_sentCnt; + uint32 m_receivedCnt; + }; + + struct NodeData + { + uint32 m_sentCnt; + uint32 m_sentFailed; + uint32 m_retries; + uint32 m_receivedCnt; + uint32 m_receivedDups; + uint32 m_receivedUnsolicited; + string m_sentTS; + string m_receivedTS; + uint32 m_lastRequestRTT; + uint32 m_averageRequestRTT; // ms + uint32 m_lastResponseRTT; + uint32 m_averageResponseRTT; + uint8 m_quality; // Node quality measure + uint8 m_lastReceivedMessage[254]; + list m_ccData; + }; + + private: + void GetNodeStatistics( NodeData* _data ); + + uint32 m_sentCnt; // Number of messages sent from this node. + uint32 m_sentFailed; // Number of sent messages failed + uint32 m_retries; // Number of message retries + uint32 m_receivedCnt; // Number of messages received from this node. + uint32 m_receivedDups; // Number of duplicated messages received; + uint32 m_receivedUnsolicited; // Number of messages received unsolicited + uint32 m_lastRequestRTT; // Last message request RTT + uint32 m_lastResponseRTT; // Last message response RTT + TimeStamp m_sentTS; // Last message sent time + TimeStamp m_receivedTS; // Last message received time + uint32 m_averageRequestRTT; // Average Request round trip time. + uint32 m_averageResponseRTT; // Average Reponse round trip time. + uint8 m_quality; // Node quality measure + uint8 m_lastReceivedMessage[254]; // Place to hold last received message + uint8 m_errors; // Count errors for dead node detection + }; + +} //namespace OpenZWave + +#endif //_Node_H diff --git a/lib/ESPiLight/pilight/libs/openzwave/Notification.h b/lib/ESPiLight/pilight/libs/openzwave/Notification.h new file mode 100644 index 0000000..715375b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Notification.h @@ -0,0 +1,195 @@ +//----------------------------------------------------------------------------- +// +// Notification.h +// +// Contains details of a Z-Wave event reported to the user +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Notification_H +#define _Notification_H + +#include "Defs.h" +#include "value_classes/ValueID.h" + +namespace OpenZWave +{ + /** \brief Provides a container for data sent via the notification callback + * handler installed by a call to Manager::AddWatcher. + * + * A notification object is only ever created or deleted internally by + * OpenZWave. + */ + class OPENZWAVE_EXPORT Notification + { + friend class Manager; + friend class Driver; + friend class Node; + friend class Group; + friend class Value; + friend class ValueStore; + friend class Basic; + friend class ManufacturerSpecific; + friend class NodeNaming; + friend class NoOperation; + friend class SceneActivation; + friend class WakeUp; + + public: + /** + * Notification types. + * Notifications of various Z-Wave events sent to the watchers + * registered with the Manager::AddWatcher method. + * \see Manager::AddWatcher + */ + enum NotificationType + { + Type_ValueAdded = 0, /**< A new node value has been added to OpenZWave's list. These notifications occur after a node has been discovered, and details of its command classes have been received. Each command class may generate one or more values depending on the complexity of the item being represented. */ + Type_ValueRemoved, /**< A node value has been removed from OpenZWave's list. This only occurs when a node is removed. */ + Type_ValueChanged, /**< A node value has been updated from the Z-Wave network and it is different from the previous value. */ + Type_ValueRefreshed, /**< A node value has been updated from the Z-Wave network. */ + Type_Group, /**< The associations for the node have changed. The application should rebuild any group information it holds about the node. */ + Type_NodeNew, /**< A new node has been found (not already stored in zwcfg*.xml file) */ + Type_NodeAdded, /**< A new node has been added to OpenZWave's list. This may be due to a device being added to the Z-Wave network, or because the application is initializing itself. */ + Type_NodeRemoved, /**< A node has been removed from OpenZWave's list. This may be due to a device being removed from the Z-Wave network, or because the application is closing. */ + Type_NodeProtocolInfo, /**< Basic node information has been receievd, such as whether the node is a listening device, a routing device and its baud rate and basic, generic and specific types. It is after this notification that you can call Manager::GetNodeType to obtain a label containing the device description. */ + Type_NodeNaming, /**< One of the node names has changed (name, manufacturer, product). */ + Type_NodeEvent, /**< A node has triggered an event. This is commonly caused when a node sends a Basic_Set command to the controller. The event value is stored in the notification. */ + Type_PollingDisabled, /**< Polling of a node has been successfully turned off by a call to Manager::DisablePoll */ + Type_PollingEnabled, /**< Polling of a node has been successfully turned on by a call to Manager::EnablePoll */ + Type_SceneEvent, /**< Scene Activation Set received */ + Type_CreateButton, /**< Handheld controller button event created */ + Type_DeleteButton, /**< Handheld controller button event deleted */ + Type_ButtonOn, /**< Handheld controller button on pressed event */ + Type_ButtonOff, /**< Handheld controller button off pressed event */ + Type_DriverReady, /**< A driver for a PC Z-Wave controller has been added and is ready to use. The notification will contain the controller's Home ID, which is needed to call most of the Manager methods. */ + Type_DriverFailed, /**< Driver failed to load */ + Type_DriverReset, /**< All nodes and values for this driver have been removed. This is sent instead of potentially hundreds of individual node and value notifications. */ + Type_EssentialNodeQueriesComplete, /**< The queries on a node that are essential to its operation have been completed. The node can now handle incoming messages. */ + Type_NodeQueriesComplete, /**< All the initialisation queries on a node have been completed. */ + Type_AwakeNodesQueried, /**< All awake nodes have been queried, so client application can expected complete data for these nodes. */ + Type_AllNodesQueriedSomeDead, /**< All nodes have been queried but some dead nodes found. */ + Type_AllNodesQueried, /**< All nodes have been queried, so client application can expected complete data. */ + Type_Notification, /**< An error has occured that we need to report. */ + Type_DriverRemoved /**< The Driver is being removed. (either due to Error or by request) Do Not Call Any Driver Related Methods after recieving this call */ + }; + + /** + * Notification codes. + * Notifications of the type Type_Notification convey some + * extra information defined here. + */ + enum NotificationCode + { + Code_MsgComplete = 0, /**< Completed messages */ + Code_Timeout, /**< Messages that timeout will send a Notification with this code. */ + Code_NoOperation, /**< Report on NoOperation message sent completion */ + Code_Awake, /**< Report when a sleeping node wakes up */ + Code_Sleep, /**< Report when a node goes to sleep */ + Code_Dead, /**< Report when a node is presumed dead */ + Code_Alive /**< Report when a node is revived */ + }; + + /** + * Get the type of this notification. + * \return the notification type. + * \see NotificationType + */ + NotificationType GetType()const{ return m_type; } + + /** + * Get the Home ID of the driver sending this notification. + * \return the driver Home ID + */ + uint32 GetHomeId()const{ return m_valueId.GetHomeId(); } + + /** + * Get the ID of any node involved in this notification. + * \return the node's ID + */ + uint8 GetNodeId()const{ return m_valueId.GetNodeId(); } + + /** + * Get the unique ValueID of any value involved in this notification. + * \return the value's ValueID + */ + ValueID const& GetValueID()const{ return m_valueId; } + + /** + * Get the index of the association group that has been changed. Only valid in NotificationType::Type_Group notifications. + * \return the group index. + */ + uint8 GetGroupIdx()const{ assert(Type_Group==m_type); return m_byte; } + + /** + * Get the event value of a notification. Only valid in NotificationType::Type_NodeEvent notifications. + * \return the event value. + */ + uint8 GetEvent()const{ assert(Type_NodeEvent==m_type); return m_byte; } + + /** + * Get the button id of a notification. Only valid in NotificationType::Type_CreateButton, DeleteButton, + * ButtonOn and ButtonOff notifications. + * \return the button id. + */ + uint8 GetButtonId()const{ assert(Type_CreateButton==m_type || Type_DeleteButton==m_type || Type_ButtonOn==m_type || Type_ButtonOff==m_type); return m_byte; } + + /** + * Get the scene Id of a notification. Only valid in NotificationType::Type_SceneEvent notifications. + * \return the event value. + */ + uint8 GetSceneId()const{ assert(Type_SceneEvent==m_type); return m_byte; } + + /** + * Get the notification code from a notification. Only valid for NotificationType::Type_Notification notifications. + * \return the notification code. + */ + uint8 GetNotification()const{ assert(Type_Notification==m_type); return m_byte; } + + /** + * Helper function to simplify wrapping the notification class. Should not normally need to be called. + * \return the internal byte value of the notification. + */ + uint8 GetByte()const{ return m_byte; } + + private: + Notification( NotificationType _type ): m_type( _type ), m_byte(0){} + ~Notification(){} + + void SetHomeAndNodeIds( uint32 const _homeId, uint8 const _nodeId ){ m_valueId = ValueID( _homeId, _nodeId ); } + void SetHomeNodeIdAndInstance ( uint32 const _homeId, uint8 const _nodeId, uint32 const _instance ){ m_valueId = ValueID( _homeId, _nodeId, _instance ); } + void SetValueId( ValueID const& _valueId ){ m_valueId = _valueId; } + void SetGroupIdx( uint8 const _groupIdx ){ assert(Type_Group==m_type); m_byte = _groupIdx; } + void SetEvent( uint8 const _event ){ assert(Type_NodeEvent==m_type); m_byte = _event; } + void SetSceneId( uint8 const _sceneId ){ assert(Type_SceneEvent==m_type); m_byte = _sceneId; } + void SetButtonId( uint8 const _buttonId ){ assert(Type_CreateButton==m_type||Type_DeleteButton==m_type||Type_ButtonOn==m_type||Type_ButtonOff==m_type); m_byte = _buttonId; } + void SetNotification( uint8 const _noteId ){ assert(Type_Notification==m_type); m_byte = _noteId; } + + NotificationType m_type; + ValueID m_valueId; + uint8 m_byte; + }; + +} //namespace OpenZWave + +#endif //_Notification_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/Options.cpp b/lib/ESPiLight/pilight/libs/openzwave/Options.cpp new file mode 100644 index 0000000..45ab58d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Options.cpp @@ -0,0 +1,603 @@ +//----------------------------------------------------------------------------- +// +// Options.h +// +// Program options read from XML files or the command line. +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include +#include + +#include "Defs.h" +#include "Options.h" +#include "Utils.h" +#include "Manager.h" +#include "platform/Log.h" +#include "platform/FileOps.h" +#include "tinyxml.h" + +using namespace OpenZWave; + +Options* Options::s_instance = NULL; + +//----------------------------------------------------------------------------- +// +// Static method to create an Options object +//----------------------------------------------------------------------------- +Options* Options::Create +( + string const& _configPath, + string const& _userPath, + string const& _commandLine +) +{ + if( s_instance == NULL ) + { + string configPath = _configPath; + string userPath = _userPath; + + // Make sure a trailing path delimiter is present + if( configPath.size() > 0 && configPath[configPath.size() - 1] != '/' ) + { + configPath += "/"; + } + if( userPath.size() > 0 && userPath[userPath.size() - 1] != '/' ) + { + userPath += "/"; + } + + FileOps::Create(); + if( !FileOps::FolderExists( configPath ) ) + { + Log::Create( "", false, true, LogLevel_Debug, LogLevel_Debug, LogLevel_None ); + /* Try some default directories */ + if ( FileOps::FolderExists( "config/" ) ) + { + Log::Write( LogLevel_Error, "Cannot find a path to the configuration files at %s, Using config/ instead...", configPath.c_str() ); + configPath = "config/"; + } else if (FileOps::FolderExists("/etc/openzwave/" ) ) + { + Log::Write( LogLevel_Error, "Cannot find a path to the configuration files at %s, Using /etc/openzwave/ instead...", configPath.c_str() ); + configPath = "/etc/openzwave/"; +#ifdef SYSCONFDIR + } else if ( FileOps::FolderExists(SYSCONFDIR ) ) + { + Log::Write( LogLevel_Error, "Cannot find a path to the configuration files at %s, Using %s instead...", configPath.c_str(), SYSCONFDIR); + configPath = SYSCONFDIR; +#endif + } else { + Log::Write( LogLevel_Error, "Cannot find a path to the configuration files at %s. Exiting...", configPath.c_str() ); + exit( 1 ); + } + } + FileOps::Destroy(); + s_instance = new Options( configPath, userPath, _commandLine ); + + // Add the default options + s_instance->AddOptionString( "ConfigPath", configPath, false ); // Path to the OpenZWave config folder. + s_instance->AddOptionString( "UserPath", userPath, false ); // Path to the user's data folder. + + s_instance->AddOptionBool( "Logging", true ); // Enable logging of library activity. + s_instance->AddOptionString( "LogFileName", "OZW_Log.txt", false ); // Name of the log file (can be changed via Log::SetLogFileName) + s_instance->AddOptionBool( "AppendLogFile", false ); // Append new session logs to existing log file (false = overwrite) + s_instance->AddOptionBool( "ConsoleOutput", true ); // Display log information on console (as well as save to disk) + s_instance->AddOptionInt( "SaveLogLevel", LogLevel_Detail ); // Save (to file) log messages equal to or above LogLevel_Detail + s_instance->AddOptionInt( "QueueLogLevel", LogLevel_Debug ); // Save (in RAM) log messages equal to or above LogLevel_Debug + s_instance->AddOptionInt( "DumpTriggerLevel", LogLevel_None ); // Default is to never dump RAM-stored log messages + + s_instance->AddOptionBool( "Associate", true ); // Enable automatic association of the controller with group one of every device. + s_instance->AddOptionString( "Exclude", string(""), true ); // Remove support for the listed command classes. + s_instance->AddOptionString( "Include", string(""), true ); // Only handle the specified command classes. The Exclude option is ignored if anything is listed here. + s_instance->AddOptionBool( "NotifyTransactions", false ); // Notifications when transaction complete is reported. + s_instance->AddOptionString( "Interface", string(""), true ); // Identify the serial port to be accessed (TODO: change the code so more than one serial port can be specified and HID) + s_instance->AddOptionBool( "SaveConfiguration", true ); // Save the XML configuration upon driver close. + s_instance->AddOptionInt( "DriverMaxAttempts", 0); + + s_instance->AddOptionInt( "PollInterval", 30000); // 30 seconds (can easily poll 30 values in this time; ~120 values is the effective limit for 30 seconds) + s_instance->AddOptionBool( "IntervalBetweenPolls", false ); // if false, try to execute the entire poll list within the PollInterval time frame + // if true, wait for PollInterval milliseconds between polls + s_instance->AddOptionBool( "SuppressValueRefresh", false ); // if true, notifications for refreshed (but unchanged) values will not be sent + s_instance->AddOptionBool( "PerformReturnRoutes", true ); // if true, return routes will be updated + s_instance->AddOptionString( "NetworkKey", string(""), false); + s_instance->AddOptionBool( "RefreshAllUserCodes", false ); // if true, during startup, we refresh all the UserCodes the device reports it supports. If False, we stop after we get the first "Available" slot (Some devices have 250+ usercode slots! - That makes our Session Stage Very Long ) + s_instance->AddOptionInt( "RetryTimeout", RETRY_TIMEOUT); // How long do we wait to timeout messages sent + s_instance->AddOptionBool( "EnableSIS", true); // Automatically become a SUC if there is no SUC on the network. + s_instance->AddOptionBool( "AssumeAwake", true); // Assume Devices that Support the Wakeup CC are awake when we first query them.... + s_instance->AddOptionBool( "NotifyOnDriverUnload", false); // Should we send the Node/Value Notifications on Driver Unloading - Read comments in Driver::~Driver() method about possible race conditions + } + + return s_instance; +} + +//----------------------------------------------------------------------------- +// +// Static method to destroy an Options object +//----------------------------------------------------------------------------- +bool Options::Destroy +( +) +{ + if( Manager::Get() ) + { + // Cannot delete Options because Manager object still exists + assert(0); + return false; + } + + delete s_instance; + s_instance = NULL; + + return true; +} + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Options::Options +( + string const& _configPath, + string const& _userPath, + string const& _commandLine +): + m_xml ("options.xml"), + m_commandLine( _commandLine ), + m_SystemPath (_configPath), + m_LocalPath (_userPath), + m_locked( false ) +{ +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +Options::~Options +( +) +{ + // Clear the options map + while( !m_options.empty() ) + { + map::iterator it = m_options.begin(); + delete it->second; + m_options.erase( it ); + } +} + +//----------------------------------------------------------------------------- +// +// Add a boolean option. +//----------------------------------------------------------------------------- +bool Options::AddOptionBool +( + string const& _name, + bool const _value +) +{ + // get (or create) option + Option* option = AddOption( _name ); + + if (option == NULL) return false; + + // set unique option members + option->m_type = Options::OptionType_Bool; + option->m_valueBool = _value; + + // save in m_options map + string lowerName = ToLower( _name ); + m_options[lowerName] = option; + return true; +} + +//----------------------------------------------------------------------------- +// +// Add an integer option. +//----------------------------------------------------------------------------- +bool Options::AddOptionInt +( + string const& _name, + int32 const _value +) +{ + // get (or create) option + Option* option = AddOption( _name ); + + if (option == NULL) return false; + + // set unique option members + option->m_type = Options::OptionType_Int; + option->m_valueInt = _value; + + // save in m_options map + string lowerName = ToLower( _name ); + m_options[lowerName] = option; + return true; +} + +//----------------------------------------------------------------------------- +// +// Add a string option. +//----------------------------------------------------------------------------- +bool Options::AddOptionString +( + string const& _name, + string const& _value, + bool const _append +) +{ + // get (or create) option + Option* option = AddOption( _name ); + + if (option == NULL) return false; + + // set unique option members + option->m_type = Options::OptionType_String; + option->m_valueString = _value; + option->m_append = _append; + + // save in m_options map + string lowerName = ToLower( _name ); + m_options[lowerName] = option; + return true; +} + +//----------------------------------------------------------------------------- +// +// Get the value of a boolean option. +//----------------------------------------------------------------------------- +bool Options::GetOptionAsBool +( + string const& _name, + bool* o_value +) +{ + Option* option = Find( _name ); + if( o_value && option && ( OptionType_Bool == option->m_type ) ) + { + *o_value = option->m_valueBool; + return true; + } + + Log::Write( LogLevel_Warning, "Specified option [%s] was not found.", _name.c_str() ); + return false; +} + +//----------------------------------------------------------------------------- +// +// Get the value of an integer option. +//----------------------------------------------------------------------------- +bool Options::GetOptionAsInt +( + string const& _name, + int32* o_value +) +{ + Option* option = Find( _name ); + if( o_value && option && ( OptionType_Int == option->m_type ) ) + { + *o_value = option->m_valueInt; + return true; + } + + Log::Write( LogLevel_Warning, "Specified option [%s] was not found.", _name.c_str() ); + return false; +} + +//----------------------------------------------------------------------------- +// +// Get the value of a string option. +//----------------------------------------------------------------------------- +bool Options::GetOptionAsString +( + string const& _name, + string* o_value +) +{ + Option* option = Find( _name ); + if( o_value && option && ( OptionType_String == option->m_type ) ) + { + *o_value = option->m_valueString; + return true; + } + + Log::Write( LogLevel_Warning, "Specified option [%s] was not found.", _name.c_str() ); + return false; +} + +//----------------------------------------------------------------------------- +// +// Get the type of value stored in an option. +//----------------------------------------------------------------------------- +Options::OptionType Options::GetOptionType +( + string const& _name +) +{ + Option* option = Find( _name ); + if( option ) + { + return option->m_type; + } + + // Option not found + Log::Write( LogLevel_Warning, "Specified option [%s] was not found.", _name.c_str() ); + return OptionType_Invalid; +} + +//----------------------------------------------------------------------------- +// +// Read all the option XMLs and Command Lines, and lock their values. +//----------------------------------------------------------------------------- +bool Options::Lock +( +) +{ + if( m_locked ) + { + Log::Write( LogLevel_Error, "Options are already final (locked)." ); + return false; + } + + ParseOptionsXML( m_SystemPath + m_xml ); + ParseOptionsXML( m_LocalPath + m_xml); + ParseOptionsString( m_commandLine ); + m_locked = true; + + return true; +} + +//----------------------------------------------------------------------------- +// +// Parse a string containing program options, such as a command line +//----------------------------------------------------------------------------- +bool Options::ParseOptionsString +( + string const& _commandLine +) +{ + bool res = true; + + size_t pos = 0; + size_t start = 0; + while( 1 ) + { + // find start of first option name + pos = _commandLine.find_first_of( "--", start ); + if( string::npos == pos ) + { + break; + } + start = pos + 2; + + // found an option. Get the name. + string optionName; + pos = _commandLine.find( " ", start ); + if( string::npos == pos ) + { + optionName = _commandLine.substr( start ); + start = pos; + } + else + { + optionName = _commandLine.substr( start, pos-start ); + start = pos + 1; + } + + // Find the matching option object + Option* option = Find( optionName ); + if( option ) + { + // Read the values + int numValues = 0; + bool parsing = true; + while( parsing ) + { + string value; + size_t back = start; + pos = _commandLine.find( " ", start ); + if( string::npos == pos ) + { + // Last value in string + value = _commandLine.substr( start ); + parsing = false; + start = pos; + } + else + { + value = _commandLine.substr( start, pos-start ); + start = pos+1; + } + + if( !value.compare( 0, 2, "--" ) ) + { + // Value is actually the next option. + if( !numValues ) + { + // No values were read for this option + // This is ok only for bool options, where we assume no value means "true". + if( OptionType_Bool == option->m_type ) + { + option->m_valueBool = true; + } + else + { + res = false; + } + } + start = back; // back up to the beginning of the next option + break; + } + else if( value.size() > 0 ) + { + // Set the value + option->SetValueFromString( value ); + numValues++; + } + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Parse an XML file containing program options +//----------------------------------------------------------------------------- +bool Options::ParseOptionsXML +( + string const& _filename +) +{ + TiXmlDocument doc; + if( !doc.LoadFile( _filename.c_str(), TIXML_ENCODING_UTF8 ) ) + { + Log::Write(LogLevel_Warning, "Failed to Parse %s: %s", _filename.c_str(), doc.ErrorDesc()); + return false; + } + Log::Write(LogLevel_Info, "Reading %s for Options", _filename.c_str()); + + TiXmlElement const* optionsElement = doc.RootElement(); + + // Read the options + TiXmlElement const* optionElement = optionsElement->FirstChildElement(); + while( optionElement ) + { + char const* str = optionElement->Value(); + if( str && !strcmp( str, "Option" ) ) + { + char const* name = optionElement->Attribute( "name" ); + if( name ) + { + Option* option = Find( name ); + if( option ) + { + char const* value = optionElement->Attribute( "value" ); + if( value ) + { + // Set the value + option->SetValueFromString( value ); + } + } + } + } + + optionElement = optionElement->NextSiblingElement(); + } + + return true; +} + +//----------------------------------------------------------------------------- +// +// General setup for adding a specific option +//----------------------------------------------------------------------------- +Options::Option* Options::AddOption +( + string const& _name +) +{ + if( m_locked ) + { + Log::Write( LogLevel_Error, "Options have been locked. No more may be added." ); + return NULL; + } + + // get a pointer to the option (and create a new Option if it doesn't already exist) + Option* option = Find( _name ); + if( option == NULL ) + { + option = new Option( _name ); + } + + return option; +} + +//----------------------------------------------------------------------------- +// +// Find an option by name +//----------------------------------------------------------------------------- +Options::Option* Options::Find +( + string const& _name +) +{ + string lowername = ToLower( _name ); + map::iterator it = m_options.find( lowername ); + if( it != m_options.end() ) + { + return it->second; + } + + return NULL; +} + +//----------------------------------------------------------------------------- +// +// Find an option by name +//----------------------------------------------------------------------------- +bool Options::Option::SetValueFromString +( + string const& _value +) +{ + if( OptionType_Bool == m_type ) + { + string lowerValue = ToLower( _value ); + if( ( lowerValue == "true" ) || ( lowerValue == "1" ) ) + { + m_valueBool = true; + return true; + } + + if( ( lowerValue == "false" ) || ( lowerValue == "0" ) ) + { + m_valueBool = false; + return true; + } + + return false; + } + + if( OptionType_Int == m_type ) + { + m_valueInt = (int32)atol( _value.c_str() ); + return true; + } + + if( OptionType_String == m_type ) + { + if( m_append && ( m_valueString.size() > 0 ) ) + { + m_valueString += ( string(",") + _value ); + } + else + { + m_valueString = _value; + } + return true; + } + + return false; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/Options.h b/lib/ESPiLight/pilight/libs/openzwave/Options.h new file mode 100644 index 0000000..ffa02e6 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Options.h @@ -0,0 +1,254 @@ +//----------------------------------------------------------------------------- +// +// Options.h +// +// Program options read from XML files or the command line. +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Options_H +#define _Options_H + +#include +#include +#include + +#include "Defs.h" + +namespace OpenZWave +{ + /** \brief Manages library options read from XML files or the command line. + * + * A class that manages program options read from XML files or the command line. + * The OpenZWave Manager class requires a complete and locked Options + * object when created. The Options are therefore one of the first things that + * any OpenZWave application must deal with. + * Options are first read from an XML file called options.xml located in the + * User data folder (the path to which is supplied to the Options::Create method). + * This is the same folder that will be used by the Manager to save the state of + * each controller in the Z-Wave network, to avoid querying them for their entire + * state every time the application starts up. + * The second source of program options is a string, which will normally be the + * command line used to launch the application. + * In this way, common options can be specified in the XML, but over-ridden if + * necessary by the command line. + * The Options process is as follows: + * 1) Create an Options object, providing paths to the OpenZWave config folder, + * the User data folder and any command line string containing program options. + * 2) Call Options::AddOptionBool, Options::AddOptionInt or Options::AddOptionString + * to add any application-specific configurable options. In this way, the Options + * class can be used for non-OpenZWave options as well. (OpenZWave options must + * be specified in step #1 above (either via xml file or a command line string). + * 3) Call Options::Lock. This will cause the option values to be read from + * the options.xml file and the command line string, and will lock the options + * so that no more calls aside from GetOptionAs may be made. + * 4) Create the OpenZWave Manager object. + */ + class OPENZWAVE_EXPORT Options + { + public: + enum OptionType + { + OptionType_Invalid = 0, + OptionType_Bool, + OptionType_Int, + OptionType_String + }; + + /** + * Creates an object to manage the program options. + * \param _configPath a string containing the path to the OpenZWave library config + * folder, which contains XML descriptions of Z-Wave manufacturers and products. + * \param _userPath a string containing the path to the application's user data + * folder where the OpenZWave should store the Z-Wave network configuration and state. + * The _userPath is also the folder where OpenZWave will look for the file Options.xml + * which contains program option values. The file should be in the form outlined below, + * with one or more Option elements containing a name and value attribute. Multiple + * values with the same option name should be listed separately. Note that option names + * are case insensitive. + * \code + * + * + * + * \endcode + * \param _commandLine a string containing the program's command line options. + * Command line options are parsed after the options.xml file, and so take precedence. + * Options are identified by a leading -- (two minus signs). The following items + * in the string are treated as values for this option, until the next -- is + * reached. For boolean options only, it is possible to omit the value, in which case + * the value is assumed to be "true". Note that option names are case insensitive, and + * that option values should be separated by a space. + * \return Pointer to the newly created Options object. + * \see Get, Destroy, AddOption, GetOptionAs, Lock + */ + static Options* Create( string const& _configPath, string const& _userPath, string const& _commandLine ); + + /** + * Deletes the Options and cleans up any associated objects. + * The application is responsible for destroying the Options object, + * but this must not be done until after the Manager object has been + * destroyed. + * \param _options Pointer to the Options object to be destroyed. + * \return true if the Options object was destroyed. If the manager + * object still exists, this call will return false. + * \see Create, Get + */ + static bool Destroy(); + + /** + * Gets a pointer to the Options singleton object. + * \return a pointer to the Options singleton object. + * \see Create, Destroy + */ + static Options* Get(){ return s_instance; } + + /** + * Locks the options. + * Reads in option values from the XML options file and command line string and + * marks the options as locked. Once locked, no more calls to AddOption + * can be made. + * The options must be locked before the Manager::Create method is called. + * \see AddOption + */ + bool Lock(); + + /** + * Add a boolean option to the program. + * Adds an option to the program whose value can then be read from a file or command line. + * All calls to AddOptionInt must be made before Lock. + * \param _name the name of the option. Option names are case insensitive and must be unique. + * \param _default the default value for this option. + * \see GetOptionAsBool + */ + bool AddOptionBool( string const& _name, bool const _default ); + + /** + * Add an integer option to the program. + * Adds an option to the program whose value can then be read from a file or command line. + * All calls to AddOptionInt must be made before Lock. + * \param _name the name of the option. Option names are case insensitive and must be unique. + * \param _default the default value for this option. + * \see GetOptionAsInt + */ + bool AddOptionInt( string const& _name, int32 const _default ); + + /** + * Add a string option to the program. + * Adds an option to the program whose value can then be read from a file or command line. + * All calls to AddOptionString must be made before Lock. + * \param _name the name of the option. Option names are case insensitive and must be unique. + * \param _default the default value for this option. + * \param _append Setting append to true will cause values read from the command line + * or XML file to be concatenated into a comma delimited list. If _append is false, + * newer values will overwrite older ones. + * \see GetOptionAsString + */ + bool AddOptionString( string const& _name, string const& _default, bool const _append ); + + /** + * Get the value of a boolean option. + * \param _name the name of the option. Option names are case insensitive. + * \param o_value a pointer to the item that will be filled with the option value. + * \return true if the option value was fetched successfully, false if the + * option does not exist, or does not contain a boolean value + * \see AddOptionBool, GetOptionType + */ + bool GetOptionAsBool( string const& _name, bool* o_value ); + + /** + * Get the value of an integer option. + * \param _name the name of the option. Option names are case insensitive. + * \param o_value a pointer to the item that will be filled with the option value. + * \return true if the option value was fetched successfully, false if the + * option does not exist, or does not contain an integer value + * \see AddOptionInt, GetOptionType + */ + bool GetOptionAsInt( string const& _name, int32* o_value ); + + /** + * Get the value of a string option. + * \param _name the name of the option. Option names are case insensitive. + * \param o_value a pointer to the item that will be filled with the option value. + * \return true if the option value was fetched successfully, false if the + * option does not exist, or does not contain a string value + * \see AddOptionString, GetOptionType + */ + bool GetOptionAsString( string const& _name, string* o_value ); + + /** + * Get the type of value stored in an option. + * \param _name the name of the option. Option names are case insensitive. + * \return An enum value representing the type of the option value. If the + * option does not exist, OptionType_Invalid is returned. + * \see GetOptionAsBool, GetOptionAsInt, GetOptionAsString + */ + OptionType GetOptionType( string const& _name ); + + /** + * Test whether the options have been locked. + * \return true if the options have been locked. + * \see Lock + */ + bool AreLocked()const{ return m_locked; } + + + private: + class Option + { + friend class Options; + + public: + Option( string const& _name ): m_name( _name ), m_append( false ){} + bool SetValueFromString( string const& _value ); + + Options::OptionType m_type; + string m_name; + bool m_valueBool; + int32 m_valueInt; + string m_valueString; + bool m_append; + }; + + Options( string const& _configPath, string const& _userPath, string const& _commandLine ); // Constructor, to be called only via the static Create method. + ~Options(); // Destructor, to be called only via the static Destroy method. + + bool ParseOptionsString( string const& _options ); // Parse a string containing program options, such as a command line. + bool ParseOptionsXML( string const& _filename ); // Parse an XML file containing program options. + Option* AddOption( string const& _name ); // check lock and create (or open existing) option + Option* Find( string const& _name ); + +OPENZWAVE_EXPORT_WARNINGS_OFF + map m_options; // Map of option names to values. +OPENZWAVE_EXPORT_WARNINGS_ON + string m_xml; // Path to XML options file. + string m_commandLine; // String containing command line options. + string m_SystemPath; + string m_LocalPath; + bool m_locked; // If true, the options are final and AddOption can no longer be called. + static Options* s_instance; + }; +} // namespace OpenZWave + +#endif // _Options_H diff --git a/lib/ESPiLight/pilight/libs/openzwave/Scene.cpp b/lib/ESPiLight/pilight/libs/openzwave/Scene.cpp new file mode 100644 index 0000000..e828ede --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Scene.cpp @@ -0,0 +1,481 @@ +//----------------------------------------------------------------------------- +// +// Scene.cpp +// +// A collection of ValueIDs to be used together. +// +// Copyright (c) 2011 Greg Satz +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include +#include "Manager.h" +#include "platform/Log.h" +#include "value_classes/Value.h" +#include "value_classes/ValueID.h" +#include "Scene.h" +#include "Options.h" + +#include "tinyxml.h" + +using namespace OpenZWave; + +uint32 const c_sceneVersion = 1; + +//----------------------------------------------------------------------------- +// Statics +//----------------------------------------------------------------------------- +uint8 Scene::s_sceneCnt = 0; +Scene* Scene::s_scenes[256] = { 0 }; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Scene::Scene +( + uint8 const _sceneId +): + m_sceneId( _sceneId ), + m_label( "" ) +{ + s_scenes[_sceneId] = this; + s_sceneCnt++; +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +Scene::~Scene +( +) +{ + while( !m_values.empty() ) + { + SceneStorage* ss = m_values.back(); + m_values.pop_back(); + delete ss; + } + + s_sceneCnt--; + s_scenes[m_sceneId] = NULL; +} + +//----------------------------------------------------------------------------- +// +// Write ourselves to an XML document +//----------------------------------------------------------------------------- +void Scene::WriteXML +( + string const& _name +) +{ + char str[16]; + + // Create a new XML document to contain the driver configuration + TiXmlDocument doc; + TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "utf-8", "" ); + TiXmlElement* scenesElement = new TiXmlElement( "Scenes" ); + doc.LinkEndChild( decl ); + doc.LinkEndChild( scenesElement ); + + scenesElement->SetAttribute( "xmlns", "http://code.google.com/p/open-zwave/" ); + + snprintf( str, sizeof(str), "%d", c_sceneVersion ); + scenesElement->SetAttribute( "version", str); + + for( int i = 1; i < 256; i++ ) + { + if( s_scenes[i] == NULL ) + { + continue; + } + + TiXmlElement* sceneElement = new TiXmlElement( "Scene" ); + + snprintf( str, sizeof(str), "%d", i ); + sceneElement->SetAttribute( "id", str ); + sceneElement->SetAttribute( "label", s_scenes[i]->m_label.c_str() ); + + for( vector::iterator vt = s_scenes[i]->m_values.begin(); vt != s_scenes[i]->m_values.end(); ++vt ) + { + TiXmlElement* valueElement = new TiXmlElement( "Value" ); + + snprintf( str, sizeof(str), "0x%.8x", (*vt)->m_id.GetHomeId() ); + valueElement->SetAttribute( "homeId", str ); + + snprintf( str, sizeof(str), "%d", (*vt)->m_id.GetNodeId() ); + valueElement->SetAttribute( "nodeId", str ); + + valueElement->SetAttribute( "genre", Value::GetGenreNameFromEnum((*vt)->m_id.GetGenre()) ); + + snprintf( str, sizeof(str), "%d", (*vt)->m_id.GetCommandClassId() ); + valueElement->SetAttribute( "commandClassId", str ); + + snprintf( str, sizeof(str), "%d", (*vt)->m_id.GetInstance() ); + valueElement->SetAttribute( "instance", str ); + + snprintf( str, sizeof(str), "%d", (*vt)->m_id.GetIndex() ); + valueElement->SetAttribute( "index", str ); + + valueElement->SetAttribute( "type", Value::GetTypeNameFromEnum((*vt)->m_id.GetType()) ); + + TiXmlText* textElement = new TiXmlText( (*vt)->m_value.c_str() ); + valueElement->LinkEndChild( textElement ); + + sceneElement->LinkEndChild( valueElement ); + } + + scenesElement->LinkEndChild( sceneElement ); + } + + string userPath; + Options::Get()->GetOptionAsString( "UserPath", &userPath ); + + string filename = userPath + _name; + + doc.SaveFile( filename.c_str() ); +} + +//----------------------------------------------------------------------------- +// +// Read scene configuration from an XML document +//----------------------------------------------------------------------------- +bool Scene::ReadScenes +( +) +{ + int32 intVal; + char const* str; + + // Load the XML document that contains the driver configuration + string userPath; + Options::Get()->GetOptionAsString( "UserPath", &userPath ); + + string filename = userPath + "zwscene.xml"; + + TiXmlDocument doc; + if( !doc.LoadFile( filename.c_str(), TIXML_ENCODING_UTF8 ) ) + { + return false; + } + + TiXmlElement const* scenesElement = doc.RootElement(); + + // Version + if( TIXML_SUCCESS == scenesElement->QueryIntAttribute( "version", &intVal ) ) + { + if( (uint32)intVal != c_sceneVersion ) + { + Log::Write( LogLevel_Alert, "Driver::ReadScenes - %s is from an older version of OpenZWave and cannot be loaded.", filename.c_str() ); + return false; + } + } + else + { + Log::Write( LogLevel_Alert, "Driver::ReadScenes - %s is from an older version of OpenZWave and cannot be loaded.", filename.c_str() ); + return false; + } + + TiXmlElement const* sceneElement = scenesElement->FirstChildElement(); + while( sceneElement ) + { + Scene* scene = NULL; + + if( TIXML_SUCCESS == sceneElement->QueryIntAttribute( "id", &intVal ) ) + { + scene = new Scene( (uint8)intVal ); + } + + if( scene == NULL ) + { + continue; + } + + str = sceneElement->Attribute( "label" ); + if( str ) + { + scene->m_label = str; + } + + // Read the ValueId for this scene + TiXmlElement const* valueElement = sceneElement->FirstChildElement(); + while( valueElement ) + { + char const* elementName = valueElement->Value(); + if( elementName && !strcmp( elementName, "Value" ) ) + { + uint32 homeId = 0; + str = valueElement->Attribute( "homeId" ); + if( str ) + { + char *p; + homeId = (uint32)strtol( str, &p, 0 ); + } + uint8 nodeId = 0; + if (TIXML_SUCCESS == valueElement->QueryIntAttribute( "nodeId", &intVal ) ) + { + nodeId = intVal; + } + ValueID::ValueGenre genre = Value::GetGenreEnumFromName( valueElement->Attribute( "genre" ) ); + uint8 commandClassId = 0; + if (TIXML_SUCCESS == valueElement->QueryIntAttribute( "commandClassId", &intVal ) ) + { + commandClassId = intVal; + } + uint8 instance = 0; + if (TIXML_SUCCESS == valueElement->QueryIntAttribute( "instance", &intVal ) ) + { + instance = intVal; + } + uint8 index = 0; + if (TIXML_SUCCESS == valueElement->QueryIntAttribute( "index", &intVal ) ) + { + index = intVal; + } + ValueID::ValueType type = Value::GetTypeEnumFromName( valueElement->Attribute( "type" ) ); + char const* data = valueElement->GetText(); + + scene->m_values.push_back( new SceneStorage( ValueID(homeId, nodeId, genre, commandClassId, instance, index, type), data ) ); + } + + valueElement = valueElement->NextSiblingElement(); + } + sceneElement = sceneElement->NextSiblingElement(); + } + return true; +} + +//----------------------------------------------------------------------------- +// +// Return the Scene object given the Scene Id +//----------------------------------------------------------------------------- +Scene* Scene::Get +( + uint8 const _sceneId +) +{ + if ( s_scenes[_sceneId] != NULL ) + { + return s_scenes[_sceneId]; + } + return NULL; +} + +//----------------------------------------------------------------------------- +// +// Return an array of uint8 of used Scene IDs and the count +//----------------------------------------------------------------------------- +uint8 Scene::GetAllScenes +( + uint8** _sceneIds +) +{ + if( s_sceneCnt > 0 ) + { + *_sceneIds = new uint8[s_sceneCnt]; + int j = 0; + for( int i = 1; i < 256; i++ ) + { + if (s_scenes[i] != NULL) + { + (*_sceneIds)[j++] = s_scenes[i]->m_sceneId; + } + } + } + return s_sceneCnt; +} + +//----------------------------------------------------------------------------- +// +// Add a ValueID and a string to the scene. +//----------------------------------------------------------------------------- +bool Scene::AddValue +( + ValueID const& _valueId, + string const& _value +) +{ + m_values.push_back( new SceneStorage( _valueId, _value ) ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Remove the first ValueID found +//----------------------------------------------------------------------------- +bool Scene::RemoveValue +( + ValueID const& _valueId +) +{ + for( vector::iterator it = m_values.begin(); it != m_values.end(); ++it ) + { + if( (*it)->m_id == _valueId ) + { + delete *it; + m_values.erase( it ); + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Remove all ValueIDs from given Home ID +//----------------------------------------------------------------------------- +void Scene::RemoveValues +( + uint32 const _homeId +) +{ + again: + for( vector::iterator it = m_values.begin(); it != m_values.end(); ++it ) + { + if( (*it)->m_id.GetHomeId() == _homeId ) + { + delete *it; + m_values.erase( it ); + goto again; + } + } + // If the scene is now empty, delete it. + if( m_values.empty() ) + { + delete this; + } +} + +//----------------------------------------------------------------------------- +// +// Remove all ValueIDs from given Home ID and node ID +//----------------------------------------------------------------------------- +void Scene::RemoveValues +( + uint32 const _homeId, + uint8 const _nodeId +) +{ + for( int i = 1; i < 256; i++ ) + { + Scene *scene = Scene::Get( i ); + if( scene != NULL ) + { + again: + for( vector::iterator it = scene->m_values.begin(); it != scene->m_values.end(); ++it ) + { + if( (*it)->m_id.GetHomeId() == _homeId && (*it)->m_id.GetNodeId() == _nodeId ) + { + delete *it; + scene->m_values.erase( it ); + goto again; + } + } + // If the scene is now empty, delete it. + if( scene->m_values.empty() ) + { + delete scene; + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Return all ValueIDs for the given scene. +//----------------------------------------------------------------------------- +int Scene::GetValues +( + vector* o_value +) +{ + int size = (int) m_values.size(); + if( size > 0 ) + { + for( vector::iterator it = m_values.begin(); it != m_values.end(); ++it ) + { + o_value->push_back( (*it)->m_id ); + } + } + return size; +} + +//----------------------------------------------------------------------------- +// +// Return a ValueID's value as string +//----------------------------------------------------------------------------- +bool Scene::GetValue +( + ValueID const& _valueId, + string* o_value +) +{ + for( vector::iterator it = m_values.begin(); it != m_values.end(); ++it ) + { + if( (*it)->m_id == _valueId ) + { + *o_value = (*it)->m_value; + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a ValueID's value as string +//----------------------------------------------------------------------------- +bool Scene::SetValue +( + ValueID const& _valueId, + string const& _value +) +{ + for( vector::iterator it = m_values.begin(); it != m_values.end(); ++it ) + { + if( (*it)->m_id == _valueId ) + { + (*it)->m_value = _value; + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Execute scene activation by running each ValueId/value +//----------------------------------------------------------------------------- +bool Scene::Activate +( +) +{ + bool res = true; + for( vector::iterator it = m_values.begin(); it != m_values.end(); ++it ) + { + if ( !Manager::Get()->SetValue( (*it)->m_id, (*it)->m_value ) ) + { + res = false; + } + } + return res; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/Scene.h b/lib/ESPiLight/pilight/libs/openzwave/Scene.h new file mode 100644 index 0000000..26739ea --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Scene.h @@ -0,0 +1,105 @@ +//----------------------------------------------------------------------------- +// +// Scene.h +// +// A collection of ValueIDs to be used together. +// +// Copyright (c) 2011 Greg Satz +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Scene_H +#define _Scene_H + +#include +#include + +#include "Defs.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class ValueID; + + /** \brief Collection of ValueIDs to be treated as a unit. + */ + class Scene + { + friend class Manager; + friend class Driver; + friend class Node; + + //----------------------------------------------------------------------------- + // Construction + //----------------------------------------------------------------------------- + private: + Scene( uint8 const _sceneId ); + ~Scene(); + + static void WriteXML( string const& _name ); + static bool ReadScenes(); + + //----------------------------------------------------------------------------- + // Scene functions + //----------------------------------------------------------------------------- + private: + static Scene* Get( uint8 const _sceneId ); + static uint8 GetAllScenes( uint8** _sceneIds ); + + string const& GetLabel()const{ return m_label; } + void SetLabel( string const &_label ){ m_label = _label; } + + bool AddValue( ValueID const& _valueId, string const& _value ); + bool RemoveValue( ValueID const& _valueId ); + void RemoveValues( uint32 const _homeId ); + static void RemoveValues( uint32 const _homeId, uint8 const _nodeId ); + int GetValues( vector* o_value ); + bool GetValue( ValueID const& _valueId, string* o_value ); + bool SetValue( ValueID const& _valueId, string const& _value ); + bool Activate(); + + //----------------------------------------------------------------------------- + // ValueID/value storage + //----------------------------------------------------------------------------- + private: + class SceneStorage + { + public: + SceneStorage( ValueID const& _id, string const& _value ): m_id( _id ), m_value( _value ) {}; + ~SceneStorage() {}; + + ValueID const m_id; + string m_value; + }; + //----------------------------------------------------------------------------- + // Member variables + //----------------------------------------------------------------------------- + private: + uint8 m_sceneId; + string m_label; + vector m_values; + static uint8 s_sceneCnt; + static Scene* s_scenes[256]; + }; + +} //namespace OpenZWave + +#endif //_Scene_H diff --git a/lib/ESPiLight/pilight/libs/openzwave/Utils.cpp b/lib/ESPiLight/pilight/libs/openzwave/Utils.cpp new file mode 100644 index 0000000..466908c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Utils.cpp @@ -0,0 +1,116 @@ +//----------------------------------------------------------------------------- +// +// Utils.h +// +// Miscellaneous helper functions +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + + +#include "Defs.h" +#include "Utils.h" + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Convert a string to all upper-case. +//----------------------------------------------------------------------------- +string OpenZWave::ToUpper +( + string const& _str +) +{ + string upper = _str; + transform( upper.begin(), upper.end(), upper.begin(), ::toupper ); + return upper; +} + +//----------------------------------------------------------------------------- +// +// Convert a string to all lower-case. +//----------------------------------------------------------------------------- +string OpenZWave::ToLower +( + string const& _str +) +{ + string lower = _str; + transform( lower.begin(), lower.end(), lower.begin(), ::tolower ); + return lower; +} + +//----------------------------------------------------------------------------- +// +// Remove WhiteSpaces from the begining and end of a string +//----------------------------------------------------------------------------- + +std::string &OpenZWave::trim +( + std::string &s +) +{ + if(s.size() == 0) + { + return s; + } + + int val = 0; + for (size_t cur = 0; cur < s.size(); cur++) + { + if(s[cur] != ' ' && isalnum(s[cur])) + { + s[val] = s[cur]; + val++; + } + } + s.resize(val); + return s; +} + +//----------------------------------------------------------------------------- +// +// Split a String into a vector, seperated by anything specified in seperators. +//----------------------------------------------------------------------------- +void OpenZWave::split +( + std::vector& lst, + const std::string& input, + const std::string& separators, + bool remove_empty +) +{ + std::ostringstream word; + for (size_t n = 0; n < input.size(); ++n) + { + if (std::string::npos == separators.find(input[n])) + word << input[n]; + else + { + if (!word.str().empty() || !remove_empty) + lst.push_back(word.str()); + word.str(""); + } + } + if (!word.str().empty() || !remove_empty) + lst.push_back(word.str()); +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/Utils.h b/lib/ESPiLight/pilight/libs/openzwave/Utils.h new file mode 100644 index 0000000..76db22f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/Utils.h @@ -0,0 +1,76 @@ +//----------------------------------------------------------------------------- +// +// Utils.h +// +// Miscellaneous helper functions +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Utils_H +#define _Utils_H + +#include +#include +#include +#include +#include + +namespace OpenZWave +{ + /** + * Convert a string to all upper-case. + * \param _str the string to be converted. + * \return the upper-case string. + * \see ToLower, Trim + */ + string ToUpper( string const& _str ); + + /** + * Convert a string to all lower-case. + * \param _str the string to be converted. + * \return the lower-case string. + * \see ToUpper, Trim + */ + string ToLower( string const& _str ); + + /** + * Split a String into a Vector, seperated by seperators + * \param lst the vector to store the results in + * \param input the input string to split + * \param seperators a string containing a list of valid seperators + * \param remove_empty if after spliting a string, the any of the results are a empty string, should we preseve them or not + */ + void split (std::vector& lst, const std::string& input, const std::string& separators, bool remove_empty = true); + + /** + * Trim Whitespace from the start and end of a string. + * \param s the string to trim + * \return the trimmed string + */ + std::string &trim ( std::string &s ); + +} // namespace OpenZWave + +#endif + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/ZWaveCommandClasses.h b/lib/ESPiLight/pilight/libs/openzwave/ZWaveCommandClasses.h new file mode 100644 index 0000000..cf59590 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/ZWaveCommandClasses.h @@ -0,0 +1,83 @@ +#ifndef _ZWAVE_COMMAND_CLASSES_H_ +#define _ZWAVE_COMMAND_CLASSES_H_ + +#define COMMAND_CLASS_NO_OPERATION 0x00 +#define COMMAND_CLASS_BASIC 0x20 +#define COMMAND_CLASS_CONTROLLER_REPLICATION 0x21 +#define COMMAND_CLASS_APPLICATION_STATUS 0x22 +#define COMMAND_CLASS_ZIP_SERVICES 0x23 +#define COMMAND_CLASS_ZIP_SERVER 0x24 +#define COMMAND_CLASS_SWITCH_BINARY 0x25 +#define COMMAND_CLASS_SWITCH_MULTILEVEL 0x26 +#define COMMAND_CLASS_SWITCH_ALL 0x27 +#define COMMAND_CLASS_SWITCH_TOGGLE_BINARY 0x28 +#define COMMAND_CLASS_SWITCH_TOGGLE_MULTILEVEL 0x29 +#define COMMAND_CLASS_CHIMNEY_FAN 0x2A +#define COMMAND_CLASS_SCENE_ACTIVATION 0x2B +#define COMMAND_CLASS_SCENE_ACTUATOR_CONF 0x2C +#define COMMAND_CLASS_SCENE_CONTROLLER_CONF 0x2D +#define COMMAND_CLASS_ZIP_CLIENT 0x2E +#define COMMAND_CLASS_ZIP_ADV_SERVICES 0x2F +#define COMMAND_CLASS_SENSOR_BINARY 0x30 +#define COMMAND_CLASS_SENSOR_MULTILEVEL 0x31 +#define COMMAND_CLASS_METER 0x32 +#define COMMAND_CLASS_COLOR_CONTROL 0x33 +#define COMMAND_CLASS_ZIP_ADV_CLIENT 0x34 +#define COMMAND_CLASS_METER_PULSE 0x35 +#define COMMAND_CLASS_THERMOSTAT_HEATING 0x38 +#define COMMAND_CLASS_THERMOSTAT_MODE 0x40 +#define COMMAND_CLASS_THERMOSTAT_OPERATING_STATE 0x42 +#define COMMAND_CLASS_THERMOSTAT_SETPOINT 0x43 +#define COMMAND_CLASS_THERMOSTAT_FAN_MODE 0x44 +#define COMMAND_CLASS_THERMOSTAT_FAN_STATE 0x45 +#define COMMAND_CLASS_CLIMATE_CONTROL_SCHEDULE 0x46 +#define COMMAND_CLASS_THERMOSTAT_SETBACK 0x47 +#define COMMAND_CLASS_BASIC_WINDOW_COVERING 0x50 +#define COMMAND_CLASS_MTP_WINDOW_COVERING 0x51 +#define COMMAND_CLASS_MULTI_INSTANCE 0x60 +#define COMMAND_CLASS_DOOR_LOCK 0x62 +#define COMMAND_CLASS_USER_CODE 0x63 +#define COMMAND_CLASS_CONFIGURATION 0x70 +#define COMMAND_CLASS_ALARM 0x71 +#define COMMAND_CLASS_MANUFACTURER_SPECIFIC 0x72 +#define COMMAND_CLASS_POWERLEVEL 0x73 +#define COMMAND_CLASS_PROTECTION 0x75 +#define COMMAND_CLASS_LOCK 0x76 +#define COMMAND_CLASS_NODE_NAMING 0x77 +#define COMMAND_CLASS_FIRMWARE_UPDATE_MD 0x7A +#define COMMAND_CLASS_GROUPING_NAME 0x7B +#define COMMAND_CLASS_REMOTE_ASSOCIATION_ACTIVATE 0x7C +#define COMMAND_CLASS_REMOTE_ASSOCIATION 0x7D +#define COMMAND_CLASS_BATTERY 0x80 +#define COMMAND_CLASS_CLOCK 0x81 +#define COMMAND_CLASS_HAIL 0x82 +#define COMMAND_CLASS_WAKE_UP 0x84 +#define COMMAND_CLASS_ASSOCIATION 0x85 +#define COMMAND_CLASS_VERSION 0x86 +#define COMMAND_CLASS_INDICATOR 0x87 +#define COMMAND_CLASS_PROPRIETARY 0x88 +#define COMMAND_CLASS_LANGUAGE 0x89 +#define COMMAND_CLASS_TIME 0x8A +#define COMMAND_CLASS_TIME_PARAMETERS 0x8B +#define COMMAND_CLASS_GEOGRAPHIC_LOCATION 0x8C +#define COMMAND_CLASS_COMPOSITE 0x8D +#define COMMAND_CLASS_MULTI_INSTANCE_ASSOCIATION 0x8E +#define COMMAND_CLASS_MULTI_CMD 0x8F +#define COMMAND_CLASS_ENERGY_PRODUCTION 0x90 +#define COMMAND_CLASS_MANUFACTURER_PROPRIETARY 0x91 +#define COMMAND_CLASS_SCREEN_MD 0x92 +#define COMMAND_CLASS_SCREEN_ATTRIBUTES 0x93 +#define COMMAND_CLASS_SIMPLE_AV_CONTROL 0x94 +#define COMMAND_CLASS_AV_CONTENT_DIRECTORY_MD 0x95 +#define COMMAND_CLASS_AV_RENDERER_STATUS 0x96 +#define COMMAND_CLASS_AV_CONTENT_SEARCH_MD 0x97 +#define COMMAND_CLASS_SECURITY 0x98 +#define COMMAND_CLASS_AV_TAGGING_MD 0x99 +#define COMMAND_CLASS_IP_CONFIGURATION 0x9A +#define COMMAND_CLASS_ASSOCIATION_COMMAND_CONFIGURATION 0x9B +#define COMMAND_CLASS_SENSOR_ALARM 0x9C +#define COMMAND_CLASS_SILENCE_ALARM 0x9D +#define COMMAND_CLASS_SENSOR_CONFIGURATION 0x9E +#define COMMAND_CLASS_NON_INTEROPERABLE 0xF0 + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/aes/CMakeLists.txt b/lib/ESPiLight/pilight/libs/openzwave/aes/CMakeLists.txt new file mode 100644 index 0000000..b529462 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/aes/CMakeLists.txt @@ -0,0 +1,6 @@ +project(openzwave_aes) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/openzwave/aes/aes.h b/lib/ESPiLight/pilight/libs/openzwave/aes/aes.h new file mode 100644 index 0000000..8835ebf --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/aes/aes.h @@ -0,0 +1,203 @@ +/* +--------------------------------------------------------------------------- +Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. + +The redistribution and use of this software (with or without changes) +is allowed without the payment of fees or royalties provided that: + + source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation. + +This software is provided 'as is' with no explicit or implied warranties +in respect of its operation, including, but not limited to, correctness +and fitness for purpose. +--------------------------------------------------------------------------- +Issue Date: 20/12/2007 + + This file contains the definitions required to use AES in C. See aesopt.h + for optimisation details. +*/ + +#ifndef _AES_H +#define _AES_H + +#include + +/* This include is used to find 8 & 32 bit unsigned integer types */ +#include "brg_types.h" + +#if defined(__cplusplus) +extern "C" +{ +#endif + +#define AES_128 /* if a fast 128 bit key scheduler is needed */ +#define AES_192 /* if a fast 192 bit key scheduler is needed */ +#define AES_256 /* if a fast 256 bit key scheduler is needed */ +#define AES_VAR /* if variable key size scheduler is needed */ +#define AES_MODES /* if support is needed for modes */ + +/* The following must also be set in assembler files if being used */ + +#define AES_ENCRYPT /* if support for encryption is needed */ +#define AES_DECRYPT /* if support for decryption is needed */ + +#define AES_BLOCK_SIZE 16 /* the AES block size in bytes */ +#define N_COLS 4 /* the number of columns in the state */ + +/* The key schedule length is 11, 13 or 15 16-byte blocks for 128, */ +/* 192 or 256-bit keys respectively. That is 176, 208 or 240 bytes */ +/* or 44, 52 or 60 32-bit words. */ + +#if defined( AES_VAR ) || defined( AES_256 ) +#define KS_LENGTH 60 +#elif defined( AES_192 ) +#define KS_LENGTH 52 +#else +#define KS_LENGTH 44 +#endif + +#define AES_RETURN INT_RETURN + +/* the character array 'inf' in the following structures is used */ +/* to hold AES context information. This AES code uses cx->inf.b[0] */ +/* to hold the number of rounds multiplied by 16. The other three */ +/* elements can be used by code that implements additional modes */ + +typedef union +{ uint32_t l; + uint8_t b[4]; +} aes_inf; + +#ifdef _WIN64 +__declspec(align(16)) +#endif +typedef struct +{ uint32_t ks[KS_LENGTH]; + aes_inf inf; +} aes_encrypt_ctx; + +#ifdef _WIN64 +__declspec(align(16)) +#endif +typedef struct +{ uint32_t ks[KS_LENGTH]; + aes_inf inf; +} aes_decrypt_ctx; + +/* This routine must be called before first use if non-static */ +/* tables are being used */ + +AES_RETURN aes_init1(void); + +/* Key lengths in the range 16 <= key_len <= 32 are given in bytes, */ +/* those in the range 128 <= key_len <= 256 are given in bits */ + +#if defined( AES_ENCRYPT ) + +#if defined( AES_128 ) || defined( AES_VAR) +AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]); +#endif + +#if defined( AES_192 ) || defined( AES_VAR) +AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]); +#endif + +#if defined( AES_256 ) || defined( AES_VAR) +AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]); +#endif + +#if defined( AES_VAR ) +AES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1]); +#endif + +AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1]); + +#endif + +#if defined( AES_DECRYPT ) + +#if defined( AES_128 ) || defined( AES_VAR) +AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]); +#endif + +#if defined( AES_192 ) || defined( AES_VAR) +AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]); +#endif + +#if defined( AES_256 ) || defined( AES_VAR) +AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]); +#endif + +#if defined( AES_VAR ) +AES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1]); +#endif + +AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out, const aes_decrypt_ctx cx[1]); + +#endif + +#if defined( AES_MODES ) + +/* Multiple calls to the following subroutines for multiple block */ +/* ECB, CBC, CFB, OFB and CTR mode encryption can be used to handle */ +/* long messages incrementally provided that the context AND the iv */ +/* are preserved between all such calls. For the ECB and CBC modes */ +/* each individual call within a series of incremental calls must */ +/* process only full blocks (i.e. len must be a multiple of 16) but */ +/* the CFB, OFB and CTR mode calls can handle multiple incremental */ +/* calls of any length. Each mode is reset when a new AES key is */ +/* set but ECB and CBC operations can be reset without setting a */ +/* new key by setting a new IV value. To reset CFB, OFB and CTR */ +/* without setting the key, aes_mode_reset() must be called and the */ +/* IV must be set. NOTE: All these calls update the IV on exit so */ +/* this has to be reset if a new operation with the same IV as the */ +/* previous one is required (or decryption follows encryption with */ +/* the same IV array). */ + +AES_RETURN aes_test_alignment_detection(unsigned int n); + +AES_RETURN aes_ecb_encrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, const aes_encrypt_ctx cx[1]); + +AES_RETURN aes_ecb_decrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, const aes_decrypt_ctx cx[1]); + +AES_RETURN aes_cbc_encrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, const aes_encrypt_ctx cx[1]); + +AES_RETURN aes_cbc_decrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, const aes_decrypt_ctx cx[1]); + +AES_RETURN aes_mode_reset(aes_encrypt_ctx cx[1]); + +AES_RETURN aes_cfb_encrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, aes_encrypt_ctx cx[1]); + +AES_RETURN aes_cfb_decrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, aes_encrypt_ctx cx[1]); + +#define aes_ofb_encrypt aes_ofb_crypt +#define aes_ofb_decrypt aes_ofb_crypt + +AES_RETURN aes_ofb_crypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, aes_encrypt_ctx cx[1]); + +typedef void cbuf_inc(unsigned char *cbuf); + +#define aes_ctr_encrypt aes_ctr_crypt +#define aes_ctr_decrypt aes_ctr_crypt + +AES_RETURN aes_ctr_crypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *cbuf, cbuf_inc ctr_inc, aes_encrypt_ctx cx[1]); + +#endif + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/aes/aes_modes.c b/lib/ESPiLight/pilight/libs/openzwave/aes/aes_modes.c new file mode 100644 index 0000000..42bc8d0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/aes/aes_modes.c @@ -0,0 +1,947 @@ +/* +--------------------------------------------------------------------------- +Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. + +The redistribution and use of this software (with or without changes) +is allowed without the payment of fees or royalties provided that: + + source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation. + +This software is provided 'as is' with no explicit or implied warranties +in respect of its operation, including, but not limited to, correctness +and fitness for purpose. +--------------------------------------------------------------------------- +Issue Date: 20/12/2007 + + These subroutines implement multiple block AES modes for ECB, CBC, CFB, + OFB and CTR encryption, The code provides support for the VIA Advanced + Cryptography Engine (ACE). + + NOTE: In the following subroutines, the AES contexts (ctx) must be + 16 byte aligned if VIA ACE is being used +*/ + +#include +#include +#include + +#include "aesopt.h" + +#if defined( AES_MODES ) +#if defined(__cplusplus) +extern "C" +{ +#endif + +#if defined( _WIN32 ) && ( _WIN32 > 800 ) +#pragma intrinsic(memcpy) +#endif + +#define BFR_BLOCKS 8 + +/* These values are used to detect long word alignment in order to */ +/* speed up some buffer operations. This facility may not work on */ +/* some machines so this define can be commented out if necessary */ + +#define FAST_BUFFER_OPERATIONS + +#define lp32(x) ((uint32_t*)(x)) + +#if defined( USE_VIA_ACE_IF_PRESENT ) + +#include "aes_via_ace.h" + +#pragma pack(16) + +aligned_array(unsigned long, enc_gen_table, 12, 16) = NEH_ENC_GEN_DATA; +aligned_array(unsigned long, enc_load_table, 12, 16) = NEH_ENC_LOAD_DATA; +aligned_array(unsigned long, enc_hybrid_table, 12, 16) = NEH_ENC_HYBRID_DATA; +aligned_array(unsigned long, dec_gen_table, 12, 16) = NEH_DEC_GEN_DATA; +aligned_array(unsigned long, dec_load_table, 12, 16) = NEH_DEC_LOAD_DATA; +aligned_array(unsigned long, dec_hybrid_table, 12, 16) = NEH_DEC_HYBRID_DATA; + +/* NOTE: These control word macros must only be used after */ +/* a key has been set up because they depend on key size */ +/* See the VIA ACE documentation for key type information */ +/* and aes_via_ace.h for non-default NEH_KEY_TYPE values */ + +#ifndef NEH_KEY_TYPE +# define NEH_KEY_TYPE NEH_HYBRID +#endif + +#if NEH_KEY_TYPE == NEH_LOAD +#define kd_adr(c) ((uint8_t*)(c)->ks) +#elif NEH_KEY_TYPE == NEH_GENERATE +#define kd_adr(c) ((uint8_t*)(c)->ks + (c)->inf.b[0]) +#elif NEH_KEY_TYPE == NEH_HYBRID +#define kd_adr(c) ((uint8_t*)(c)->ks + ((c)->inf.b[0] == 160 ? 160 : 0)) +#else +#error no key type defined for VIA ACE +#endif + +#else + +#define aligned_array(type, name, no, stride) type name[no] +#define aligned_auto(type, name, no, stride) type name[no] + +#endif + +#if defined( _WIN32 ) && _WIN32 > 1200 + +#define via_cwd(cwd, ty, dir, len) \ + unsigned long* cwd = (dir##_##ty##_table + ((len - 128) >> 4)) + +#else + +#define via_cwd(cwd, ty, dir, len) \ + aligned_auto(unsigned long, cwd, 4, 16); \ + cwd[1] = cwd[2] = cwd[3] = 0; \ + cwd[0] = neh_##dir##_##ty##_key(len) + +#endif + +/* test the code for detecting and setting pointer alignment */ + +AES_RETURN aes_test_alignment_detection(unsigned int n) /* 4 <= n <= 16 */ +{ uint8_t p[16]; + uint32_t i, count_eq = 0, count_neq = 0; + + if(n < 4 || n > 16) + return EXIT_FAILURE; + + for(i = 0; i < n; ++i) + { + uint8_t *qf = ALIGN_FLOOR(p + i, n), + *qh = ALIGN_CEIL(p + i, n); + + if(qh == qf) + ++count_eq; + else if(qh == qf + n) + ++count_neq; + else + return EXIT_FAILURE; + } + return (count_eq != 1 || count_neq != n - 1 ? EXIT_FAILURE : EXIT_SUCCESS); +} + +AES_RETURN aes_mode_reset(aes_encrypt_ctx ctx[1]) +{ + ctx->inf.b[2] = 0; + return EXIT_SUCCESS; +} + +AES_RETURN aes_ecb_encrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, const aes_encrypt_ctx ctx[1]) +{ int nb = len >> 4; + + if(len & (AES_BLOCK_SIZE - 1)) + return EXIT_FAILURE; + +#if defined( USE_VIA_ACE_IF_PRESENT ) + + if(ctx->inf.b[1] == 0xff) + { uint8_t *ksp = (uint8_t*)(ctx->ks); + via_cwd(cwd, hybrid, enc, 2 * ctx->inf.b[0] - 192); + + if(ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; + + if(!ALIGN_OFFSET( ibuf, 16 ) && !ALIGN_OFFSET( obuf, 16 )) + { + via_ecb_op5(ksp, cwd, ibuf, obuf, nb); + } + else + { aligned_auto(uint8_t, buf, BFR_BLOCKS * AES_BLOCK_SIZE, 16); + uint8_t *ip, *op; + + while(nb) + { + int m = (nb > BFR_BLOCKS ? BFR_BLOCKS : nb); + + ip = (ALIGN_OFFSET( ibuf, 16 ) ? buf : ibuf); + op = (ALIGN_OFFSET( obuf, 16 ) ? buf : obuf); + + if(ip != ibuf) + memcpy(buf, ibuf, m * AES_BLOCK_SIZE); + + via_ecb_op5(ksp, cwd, ip, op, m); + + if(op != obuf) + memcpy(obuf, buf, m * AES_BLOCK_SIZE); + + ibuf += m * AES_BLOCK_SIZE; + obuf += m * AES_BLOCK_SIZE; + nb -= m; + } + } + + return EXIT_SUCCESS; + } + +#endif + +#if !defined( ASSUME_VIA_ACE_PRESENT ) + while(nb--) + { + if(aes_encrypt(ibuf, obuf, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } +#endif + return EXIT_SUCCESS; +} + +AES_RETURN aes_ecb_decrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, const aes_decrypt_ctx ctx[1]) +{ int nb = len >> 4; + + if(len & (AES_BLOCK_SIZE - 1)) + return EXIT_FAILURE; + +#if defined( USE_VIA_ACE_IF_PRESENT ) + + if(ctx->inf.b[1] == 0xff) + { uint8_t *ksp = kd_adr(ctx); + via_cwd(cwd, hybrid, dec, 2 * ctx->inf.b[0] - 192); + + if(ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; + + if(!ALIGN_OFFSET( ibuf, 16 ) && !ALIGN_OFFSET( obuf, 16 )) + { + via_ecb_op5(ksp, cwd, ibuf, obuf, nb); + } + else + { aligned_auto(uint8_t, buf, BFR_BLOCKS * AES_BLOCK_SIZE, 16); + uint8_t *ip, *op; + + while(nb) + { + int m = (nb > BFR_BLOCKS ? BFR_BLOCKS : nb); + + ip = (ALIGN_OFFSET( ibuf, 16 ) ? buf : ibuf); + op = (ALIGN_OFFSET( obuf, 16 ) ? buf : obuf); + + if(ip != ibuf) + memcpy(buf, ibuf, m * AES_BLOCK_SIZE); + + via_ecb_op5(ksp, cwd, ip, op, m); + + if(op != obuf) + memcpy(obuf, buf, m * AES_BLOCK_SIZE); + + ibuf += m * AES_BLOCK_SIZE; + obuf += m * AES_BLOCK_SIZE; + nb -= m; + } + } + + return EXIT_SUCCESS; + } + +#endif + +#if !defined( ASSUME_VIA_ACE_PRESENT ) + while(nb--) + { + if(aes_decrypt(ibuf, obuf, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } +#endif + return EXIT_SUCCESS; +} + +AES_RETURN aes_cbc_encrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, const aes_encrypt_ctx ctx[1]) +{ int nb = len >> 4; + + if(len & (AES_BLOCK_SIZE - 1)) + return EXIT_FAILURE; + +#if defined( USE_VIA_ACE_IF_PRESENT ) + + if(ctx->inf.b[1] == 0xff) + { uint8_t *ksp = (uint8_t*)(ctx->ks), *ivp = iv; + aligned_auto(uint8_t, liv, AES_BLOCK_SIZE, 16); + via_cwd(cwd, hybrid, enc, 2 * ctx->inf.b[0] - 192); + + if(ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; + + if(ALIGN_OFFSET( iv, 16 )) /* ensure an aligned iv */ + { + ivp = liv; + memcpy(liv, iv, AES_BLOCK_SIZE); + } + + if(!ALIGN_OFFSET( ibuf, 16 ) && !ALIGN_OFFSET( obuf, 16 ) && !ALIGN_OFFSET( iv, 16 )) + { + via_cbc_op7(ksp, cwd, ibuf, obuf, nb, ivp, ivp); + } + else + { aligned_auto(uint8_t, buf, BFR_BLOCKS * AES_BLOCK_SIZE, 16); + uint8_t *ip, *op; + + while(nb) + { + int m = (nb > BFR_BLOCKS ? BFR_BLOCKS : nb); + + ip = (ALIGN_OFFSET( ibuf, 16 ) ? buf : ibuf); + op = (ALIGN_OFFSET( obuf, 16 ) ? buf : obuf); + + if(ip != ibuf) + memcpy(buf, ibuf, m * AES_BLOCK_SIZE); + + via_cbc_op7(ksp, cwd, ip, op, m, ivp, ivp); + + if(op != obuf) + memcpy(obuf, buf, m * AES_BLOCK_SIZE); + + ibuf += m * AES_BLOCK_SIZE; + obuf += m * AES_BLOCK_SIZE; + nb -= m; + } + } + + if(iv != ivp) + memcpy(iv, ivp, AES_BLOCK_SIZE); + + return EXIT_SUCCESS; + } + +#endif + +#if !defined( ASSUME_VIA_ACE_PRESENT ) +# ifdef FAST_BUFFER_OPERATIONS + if(!ALIGN_OFFSET( ibuf, 4 ) && !ALIGN_OFFSET( iv, 4 )) + while(nb--) + { + lp32(iv)[0] ^= lp32(ibuf)[0]; + lp32(iv)[1] ^= lp32(ibuf)[1]; + lp32(iv)[2] ^= lp32(ibuf)[2]; + lp32(iv)[3] ^= lp32(ibuf)[3]; + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + memcpy(obuf, iv, AES_BLOCK_SIZE); + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } + else +# endif + while(nb--) + { + iv[ 0] ^= ibuf[ 0]; iv[ 1] ^= ibuf[ 1]; + iv[ 2] ^= ibuf[ 2]; iv[ 3] ^= ibuf[ 3]; + iv[ 4] ^= ibuf[ 4]; iv[ 5] ^= ibuf[ 5]; + iv[ 6] ^= ibuf[ 6]; iv[ 7] ^= ibuf[ 7]; + iv[ 8] ^= ibuf[ 8]; iv[ 9] ^= ibuf[ 9]; + iv[10] ^= ibuf[10]; iv[11] ^= ibuf[11]; + iv[12] ^= ibuf[12]; iv[13] ^= ibuf[13]; + iv[14] ^= ibuf[14]; iv[15] ^= ibuf[15]; + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + memcpy(obuf, iv, AES_BLOCK_SIZE); + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } +#endif + return EXIT_SUCCESS; +} + +AES_RETURN aes_cbc_decrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, const aes_decrypt_ctx ctx[1]) +{ unsigned char tmp[AES_BLOCK_SIZE]; + int nb = len >> 4; + + if(len & (AES_BLOCK_SIZE - 1)) + return EXIT_FAILURE; + +#if defined( USE_VIA_ACE_IF_PRESENT ) + + if(ctx->inf.b[1] == 0xff) + { uint8_t *ksp = kd_adr(ctx), *ivp = iv; + aligned_auto(uint8_t, liv, AES_BLOCK_SIZE, 16); + via_cwd(cwd, hybrid, dec, 2 * ctx->inf.b[0] - 192); + + if(ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; + + if(ALIGN_OFFSET( iv, 16 )) /* ensure an aligned iv */ + { + ivp = liv; + memcpy(liv, iv, AES_BLOCK_SIZE); + } + + if(!ALIGN_OFFSET( ibuf, 16 ) && !ALIGN_OFFSET( obuf, 16 ) && !ALIGN_OFFSET( iv, 16 )) + { + via_cbc_op6(ksp, cwd, ibuf, obuf, nb, ivp); + } + else + { aligned_auto(uint8_t, buf, BFR_BLOCKS * AES_BLOCK_SIZE, 16); + uint8_t *ip, *op; + + while(nb) + { + int m = (nb > BFR_BLOCKS ? BFR_BLOCKS : nb); + + ip = (ALIGN_OFFSET( ibuf, 16 ) ? buf : ibuf); + op = (ALIGN_OFFSET( obuf, 16 ) ? buf : obuf); + + if(ip != ibuf) + memcpy(buf, ibuf, m * AES_BLOCK_SIZE); + + via_cbc_op6(ksp, cwd, ip, op, m, ivp); + + if(op != obuf) + memcpy(obuf, buf, m * AES_BLOCK_SIZE); + + ibuf += m * AES_BLOCK_SIZE; + obuf += m * AES_BLOCK_SIZE; + nb -= m; + } + } + + if(iv != ivp) + memcpy(iv, ivp, AES_BLOCK_SIZE); + + return EXIT_SUCCESS; + } +#endif + +#if !defined( ASSUME_VIA_ACE_PRESENT ) +# ifdef FAST_BUFFER_OPERATIONS + if(!ALIGN_OFFSET( obuf, 4 ) && !ALIGN_OFFSET( iv, 4 )) + while(nb--) + { + memcpy(tmp, ibuf, AES_BLOCK_SIZE); + if(aes_decrypt(ibuf, obuf, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + lp32(obuf)[0] ^= lp32(iv)[0]; + lp32(obuf)[1] ^= lp32(iv)[1]; + lp32(obuf)[2] ^= lp32(iv)[2]; + lp32(obuf)[3] ^= lp32(iv)[3]; + memcpy(iv, tmp, AES_BLOCK_SIZE); + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } + else +# endif + while(nb--) + { + memcpy(tmp, ibuf, AES_BLOCK_SIZE); + if(aes_decrypt(ibuf, obuf, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + obuf[ 0] ^= iv[ 0]; obuf[ 1] ^= iv[ 1]; + obuf[ 2] ^= iv[ 2]; obuf[ 3] ^= iv[ 3]; + obuf[ 4] ^= iv[ 4]; obuf[ 5] ^= iv[ 5]; + obuf[ 6] ^= iv[ 6]; obuf[ 7] ^= iv[ 7]; + obuf[ 8] ^= iv[ 8]; obuf[ 9] ^= iv[ 9]; + obuf[10] ^= iv[10]; obuf[11] ^= iv[11]; + obuf[12] ^= iv[12]; obuf[13] ^= iv[13]; + obuf[14] ^= iv[14]; obuf[15] ^= iv[15]; + memcpy(iv, tmp, AES_BLOCK_SIZE); + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } +#endif + return EXIT_SUCCESS; +} + +AES_RETURN aes_cfb_encrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, aes_encrypt_ctx ctx[1]) +{ int cnt = 0, b_pos = (int)ctx->inf.b[2], nb; + + if(b_pos) /* complete any partial block */ + { + while(b_pos < AES_BLOCK_SIZE && cnt < len) + { + *obuf++ = (iv[b_pos++] ^= *ibuf++); + cnt++; + } + + b_pos = (b_pos == AES_BLOCK_SIZE ? 0 : b_pos); + } + + if((nb = (len - cnt) >> 4) != 0) /* process whole blocks */ + { +#if defined( USE_VIA_ACE_IF_PRESENT ) + + if(ctx->inf.b[1] == 0xff) + { int m; + uint8_t *ksp = (uint8_t*)(ctx->ks), *ivp = iv; + aligned_auto(uint8_t, liv, AES_BLOCK_SIZE, 16); + via_cwd(cwd, hybrid, enc, 2 * ctx->inf.b[0] - 192); + + if(ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; + + if(ALIGN_OFFSET( iv, 16 )) /* ensure an aligned iv */ + { + ivp = liv; + memcpy(liv, iv, AES_BLOCK_SIZE); + } + + if(!ALIGN_OFFSET( ibuf, 16 ) && !ALIGN_OFFSET( obuf, 16 )) + { + via_cfb_op7(ksp, cwd, ibuf, obuf, nb, ivp, ivp); + ibuf += nb * AES_BLOCK_SIZE; + obuf += nb * AES_BLOCK_SIZE; + cnt += nb * AES_BLOCK_SIZE; + } + else /* input, output or both are unaligned */ + { aligned_auto(uint8_t, buf, BFR_BLOCKS * AES_BLOCK_SIZE, 16); + uint8_t *ip, *op; + + while(nb) + { + m = (nb > BFR_BLOCKS ? BFR_BLOCKS : nb), nb -= m; + + ip = (ALIGN_OFFSET( ibuf, 16 ) ? buf : ibuf); + op = (ALIGN_OFFSET( obuf, 16 ) ? buf : obuf); + + if(ip != ibuf) + memcpy(buf, ibuf, m * AES_BLOCK_SIZE); + + via_cfb_op7(ksp, cwd, ip, op, m, ivp, ivp); + + if(op != obuf) + memcpy(obuf, buf, m * AES_BLOCK_SIZE); + + ibuf += m * AES_BLOCK_SIZE; + obuf += m * AES_BLOCK_SIZE; + cnt += m * AES_BLOCK_SIZE; + } + } + + if(ivp != iv) + memcpy(iv, ivp, AES_BLOCK_SIZE); + } +#else +# ifdef FAST_BUFFER_OPERATIONS + if(!ALIGN_OFFSET( ibuf, 4 ) && !ALIGN_OFFSET( obuf, 4 ) && !ALIGN_OFFSET( iv, 4 )) + while(cnt + AES_BLOCK_SIZE <= len) + { + assert(b_pos == 0); + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + lp32(obuf)[0] = lp32(iv)[0] ^= lp32(ibuf)[0]; + lp32(obuf)[1] = lp32(iv)[1] ^= lp32(ibuf)[1]; + lp32(obuf)[2] = lp32(iv)[2] ^= lp32(ibuf)[2]; + lp32(obuf)[3] = lp32(iv)[3] ^= lp32(ibuf)[3]; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + cnt += AES_BLOCK_SIZE; + } + else +# endif + while(cnt + AES_BLOCK_SIZE <= len) + { + assert(b_pos == 0); + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + obuf[ 0] = iv[ 0] ^= ibuf[ 0]; obuf[ 1] = iv[ 1] ^= ibuf[ 1]; + obuf[ 2] = iv[ 2] ^= ibuf[ 2]; obuf[ 3] = iv[ 3] ^= ibuf[ 3]; + obuf[ 4] = iv[ 4] ^= ibuf[ 4]; obuf[ 5] = iv[ 5] ^= ibuf[ 5]; + obuf[ 6] = iv[ 6] ^= ibuf[ 6]; obuf[ 7] = iv[ 7] ^= ibuf[ 7]; + obuf[ 8] = iv[ 8] ^= ibuf[ 8]; obuf[ 9] = iv[ 9] ^= ibuf[ 9]; + obuf[10] = iv[10] ^= ibuf[10]; obuf[11] = iv[11] ^= ibuf[11]; + obuf[12] = iv[12] ^= ibuf[12]; obuf[13] = iv[13] ^= ibuf[13]; + obuf[14] = iv[14] ^= ibuf[14]; obuf[15] = iv[15] ^= ibuf[15]; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + cnt += AES_BLOCK_SIZE; + } +#endif + } + + while(cnt < len) + { + if(!b_pos && aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + + while(cnt < len && b_pos < AES_BLOCK_SIZE) + { + *obuf++ = (iv[b_pos++] ^= *ibuf++); + cnt++; + } + + b_pos = (b_pos == AES_BLOCK_SIZE ? 0 : b_pos); + } + + ctx->inf.b[2] = (uint8_t)b_pos; + return EXIT_SUCCESS; +} + +AES_RETURN aes_cfb_decrypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, aes_encrypt_ctx ctx[1]) +{ int cnt = 0, b_pos = (int)ctx->inf.b[2], nb; + + if(b_pos) /* complete any partial block */ + { uint8_t t; + + while(b_pos < AES_BLOCK_SIZE && cnt < len) + { + t = *ibuf++; + *obuf++ = t ^ iv[b_pos]; + iv[b_pos++] = t; + cnt++; + } + + b_pos = (b_pos == AES_BLOCK_SIZE ? 0 : b_pos); + } + + if((nb = (len - cnt) >> 4) != 0) /* process whole blocks */ + { +#if defined( USE_VIA_ACE_IF_PRESENT ) + + if(ctx->inf.b[1] == 0xff) + { int m; + uint8_t *ksp = (uint8_t*)(ctx->ks), *ivp = iv; + aligned_auto(uint8_t, liv, AES_BLOCK_SIZE, 16); + via_cwd(cwd, hybrid, dec, 2 * ctx->inf.b[0] - 192); + + if(ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; + + if(ALIGN_OFFSET( iv, 16 )) /* ensure an aligned iv */ + { + ivp = liv; + memcpy(liv, iv, AES_BLOCK_SIZE); + } + + if(!ALIGN_OFFSET( ibuf, 16 ) && !ALIGN_OFFSET( obuf, 16 )) + { + via_cfb_op6(ksp, cwd, ibuf, obuf, nb, ivp); + ibuf += nb * AES_BLOCK_SIZE; + obuf += nb * AES_BLOCK_SIZE; + cnt += nb * AES_BLOCK_SIZE; + } + else /* input, output or both are unaligned */ + { aligned_auto(uint8_t, buf, BFR_BLOCKS * AES_BLOCK_SIZE, 16); + uint8_t *ip, *op; + + while(nb) + { + m = (nb > BFR_BLOCKS ? BFR_BLOCKS : nb), nb -= m; + + ip = (ALIGN_OFFSET( ibuf, 16 ) ? buf : ibuf); + op = (ALIGN_OFFSET( obuf, 16 ) ? buf : obuf); + + if(ip != ibuf) /* input buffer is not aligned */ + memcpy(buf, ibuf, m * AES_BLOCK_SIZE); + + via_cfb_op6(ksp, cwd, ip, op, m, ivp); + + if(op != obuf) /* output buffer is not aligned */ + memcpy(obuf, buf, m * AES_BLOCK_SIZE); + + ibuf += m * AES_BLOCK_SIZE; + obuf += m * AES_BLOCK_SIZE; + cnt += m * AES_BLOCK_SIZE; + } + } + + if(ivp != iv) + memcpy(iv, ivp, AES_BLOCK_SIZE); + } +#else +# ifdef FAST_BUFFER_OPERATIONS + if(!ALIGN_OFFSET( ibuf, 4 ) && !ALIGN_OFFSET( obuf, 4 ) &&!ALIGN_OFFSET( iv, 4 )) + while(cnt + AES_BLOCK_SIZE <= len) + { uint32_t t; + + assert(b_pos == 0); + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + t = lp32(ibuf)[0], lp32(obuf)[0] = t ^ lp32(iv)[0], lp32(iv)[0] = t; + t = lp32(ibuf)[1], lp32(obuf)[1] = t ^ lp32(iv)[1], lp32(iv)[1] = t; + t = lp32(ibuf)[2], lp32(obuf)[2] = t ^ lp32(iv)[2], lp32(iv)[2] = t; + t = lp32(ibuf)[3], lp32(obuf)[3] = t ^ lp32(iv)[3], lp32(iv)[3] = t; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + cnt += AES_BLOCK_SIZE; + } + else +# endif + while(cnt + AES_BLOCK_SIZE <= len) + { uint8_t t; + + assert(b_pos == 0); + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + t = ibuf[ 0], obuf[ 0] = t ^ iv[ 0], iv[ 0] = t; + t = ibuf[ 1], obuf[ 1] = t ^ iv[ 1], iv[ 1] = t; + t = ibuf[ 2], obuf[ 2] = t ^ iv[ 2], iv[ 2] = t; + t = ibuf[ 3], obuf[ 3] = t ^ iv[ 3], iv[ 3] = t; + t = ibuf[ 4], obuf[ 4] = t ^ iv[ 4], iv[ 4] = t; + t = ibuf[ 5], obuf[ 5] = t ^ iv[ 5], iv[ 5] = t; + t = ibuf[ 6], obuf[ 6] = t ^ iv[ 6], iv[ 6] = t; + t = ibuf[ 7], obuf[ 7] = t ^ iv[ 7], iv[ 7] = t; + t = ibuf[ 8], obuf[ 8] = t ^ iv[ 8], iv[ 8] = t; + t = ibuf[ 9], obuf[ 9] = t ^ iv[ 9], iv[ 9] = t; + t = ibuf[10], obuf[10] = t ^ iv[10], iv[10] = t; + t = ibuf[11], obuf[11] = t ^ iv[11], iv[11] = t; + t = ibuf[12], obuf[12] = t ^ iv[12], iv[12] = t; + t = ibuf[13], obuf[13] = t ^ iv[13], iv[13] = t; + t = ibuf[14], obuf[14] = t ^ iv[14], iv[14] = t; + t = ibuf[15], obuf[15] = t ^ iv[15], iv[15] = t; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + cnt += AES_BLOCK_SIZE; + } +#endif + } + + while(cnt < len) + { uint8_t t; + + if(!b_pos && aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + + while(cnt < len && b_pos < AES_BLOCK_SIZE) + { + t = *ibuf++; + *obuf++ = t ^ iv[b_pos]; + iv[b_pos++] = t; + cnt++; + } + + b_pos = (b_pos == AES_BLOCK_SIZE ? 0 : b_pos); + } + + ctx->inf.b[2] = (uint8_t)b_pos; + return EXIT_SUCCESS; +} + +AES_RETURN aes_ofb_crypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *iv, aes_encrypt_ctx ctx[1]) +{ int cnt = 0, b_pos = (int)ctx->inf.b[2], nb; + + if(b_pos) /* complete any partial block */ + { + while(b_pos < AES_BLOCK_SIZE && cnt < len) + { + *obuf++ = iv[b_pos++] ^ *ibuf++; + cnt++; + } + + b_pos = (b_pos == AES_BLOCK_SIZE ? 0 : b_pos); + } + + if((nb = (len - cnt) >> 4) != 0) /* process whole blocks */ + { +#if defined( USE_VIA_ACE_IF_PRESENT ) + + if(ctx->inf.b[1] == 0xff) + { int m; + uint8_t *ksp = (uint8_t*)(ctx->ks), *ivp = iv; + aligned_auto(uint8_t, liv, AES_BLOCK_SIZE, 16); + via_cwd(cwd, hybrid, enc, 2 * ctx->inf.b[0] - 192); + + if(ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; + + if(ALIGN_OFFSET( iv, 16 )) /* ensure an aligned iv */ + { + ivp = liv; + memcpy(liv, iv, AES_BLOCK_SIZE); + } + + if(!ALIGN_OFFSET( ibuf, 16 ) && !ALIGN_OFFSET( obuf, 16 )) + { + via_ofb_op6(ksp, cwd, ibuf, obuf, nb, ivp); + ibuf += nb * AES_BLOCK_SIZE; + obuf += nb * AES_BLOCK_SIZE; + cnt += nb * AES_BLOCK_SIZE; + } + else /* input, output or both are unaligned */ + { aligned_auto(uint8_t, buf, BFR_BLOCKS * AES_BLOCK_SIZE, 16); + uint8_t *ip, *op; + + while(nb) + { + m = (nb > BFR_BLOCKS ? BFR_BLOCKS : nb), nb -= m; + + ip = (ALIGN_OFFSET( ibuf, 16 ) ? buf : ibuf); + op = (ALIGN_OFFSET( obuf, 16 ) ? buf : obuf); + + if(ip != ibuf) + memcpy(buf, ibuf, m * AES_BLOCK_SIZE); + + via_ofb_op6(ksp, cwd, ip, op, m, ivp); + + if(op != obuf) + memcpy(obuf, buf, m * AES_BLOCK_SIZE); + + ibuf += m * AES_BLOCK_SIZE; + obuf += m * AES_BLOCK_SIZE; + cnt += m * AES_BLOCK_SIZE; + } + } + + if(ivp != iv) + memcpy(iv, ivp, AES_BLOCK_SIZE); + } +#else +# ifdef FAST_BUFFER_OPERATIONS + if(!ALIGN_OFFSET( ibuf, 4 ) && !ALIGN_OFFSET( obuf, 4 ) && !ALIGN_OFFSET( iv, 4 )) + while(cnt + AES_BLOCK_SIZE <= len) + { + assert(b_pos == 0); + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + lp32(obuf)[0] = lp32(iv)[0] ^ lp32(ibuf)[0]; + lp32(obuf)[1] = lp32(iv)[1] ^ lp32(ibuf)[1]; + lp32(obuf)[2] = lp32(iv)[2] ^ lp32(ibuf)[2]; + lp32(obuf)[3] = lp32(iv)[3] ^ lp32(ibuf)[3]; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + cnt += AES_BLOCK_SIZE; + } + else +# endif + while(cnt + AES_BLOCK_SIZE <= len) + { + assert(b_pos == 0); + if(aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + obuf[ 0] = iv[ 0] ^ ibuf[ 0]; obuf[ 1] = iv[ 1] ^ ibuf[ 1]; + obuf[ 2] = iv[ 2] ^ ibuf[ 2]; obuf[ 3] = iv[ 3] ^ ibuf[ 3]; + obuf[ 4] = iv[ 4] ^ ibuf[ 4]; obuf[ 5] = iv[ 5] ^ ibuf[ 5]; + obuf[ 6] = iv[ 6] ^ ibuf[ 6]; obuf[ 7] = iv[ 7] ^ ibuf[ 7]; + obuf[ 8] = iv[ 8] ^ ibuf[ 8]; obuf[ 9] = iv[ 9] ^ ibuf[ 9]; + obuf[10] = iv[10] ^ ibuf[10]; obuf[11] = iv[11] ^ ibuf[11]; + obuf[12] = iv[12] ^ ibuf[12]; obuf[13] = iv[13] ^ ibuf[13]; + obuf[14] = iv[14] ^ ibuf[14]; obuf[15] = iv[15] ^ ibuf[15]; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + cnt += AES_BLOCK_SIZE; + } +#endif + } + + while(cnt < len) + { + if(!b_pos && aes_encrypt(iv, iv, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + + while(cnt < len && b_pos < AES_BLOCK_SIZE) + { + *obuf++ = iv[b_pos++] ^ *ibuf++; + cnt++; + } + + b_pos = (b_pos == AES_BLOCK_SIZE ? 0 : b_pos); + } + + ctx->inf.b[2] = (uint8_t)b_pos; + return EXIT_SUCCESS; +} + +#define BFR_LENGTH (BFR_BLOCKS * AES_BLOCK_SIZE) + +AES_RETURN aes_ctr_crypt(const unsigned char *ibuf, unsigned char *obuf, + int len, unsigned char *cbuf, cbuf_inc ctr_inc, aes_encrypt_ctx ctx[1]) +{ unsigned char *ip; + int i, blen, b_pos = (int)(ctx->inf.b[2]); + +#if defined( USE_VIA_ACE_IF_PRESENT ) + aligned_auto(uint8_t, buf, BFR_LENGTH, 16); + if(ctx->inf.b[1] == 0xff && ALIGN_OFFSET( ctx, 16 )) + return EXIT_FAILURE; +#else + uint8_t buf[BFR_LENGTH]; +#endif + + if(b_pos) + { + memcpy(buf, cbuf, AES_BLOCK_SIZE); + if(aes_ecb_encrypt(buf, buf, AES_BLOCK_SIZE, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + + while(b_pos < AES_BLOCK_SIZE && len) + { + *obuf++ = *ibuf++ ^ buf[b_pos++]; + --len; + } + + if(len) + ctr_inc(cbuf), b_pos = 0; + } + + while(len) + { + blen = (len > BFR_LENGTH ? BFR_LENGTH : len), len -= blen; + + for(i = 0, ip = buf; i < (blen >> 4); ++i) + { + memcpy(ip, cbuf, AES_BLOCK_SIZE); + ctr_inc(cbuf); + ip += AES_BLOCK_SIZE; + } + + if(blen & (AES_BLOCK_SIZE - 1)) + memcpy(ip, cbuf, AES_BLOCK_SIZE), i++; + +#if defined( USE_VIA_ACE_IF_PRESENT ) + if(ctx->inf.b[1] == 0xff) + { + via_cwd(cwd, hybrid, enc, 2 * ctx->inf.b[0] - 192); + via_ecb_op5((ctx->ks), cwd, buf, buf, i); + } + else +#endif + if(aes_ecb_encrypt(buf, buf, i * AES_BLOCK_SIZE, ctx) != EXIT_SUCCESS) + return EXIT_FAILURE; + + i = 0; ip = buf; +# ifdef FAST_BUFFER_OPERATIONS + if(!ALIGN_OFFSET( ibuf, 4 ) && !ALIGN_OFFSET( obuf, 4 ) && !ALIGN_OFFSET( ip, 4 )) + while(i + AES_BLOCK_SIZE <= blen) + { + lp32(obuf)[0] = lp32(ibuf)[0] ^ lp32(ip)[0]; + lp32(obuf)[1] = lp32(ibuf)[1] ^ lp32(ip)[1]; + lp32(obuf)[2] = lp32(ibuf)[2] ^ lp32(ip)[2]; + lp32(obuf)[3] = lp32(ibuf)[3] ^ lp32(ip)[3]; + i += AES_BLOCK_SIZE; + ip += AES_BLOCK_SIZE; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } + else +#endif + while(i + AES_BLOCK_SIZE <= blen) + { + obuf[ 0] = ibuf[ 0] ^ ip[ 0]; obuf[ 1] = ibuf[ 1] ^ ip[ 1]; + obuf[ 2] = ibuf[ 2] ^ ip[ 2]; obuf[ 3] = ibuf[ 3] ^ ip[ 3]; + obuf[ 4] = ibuf[ 4] ^ ip[ 4]; obuf[ 5] = ibuf[ 5] ^ ip[ 5]; + obuf[ 6] = ibuf[ 6] ^ ip[ 6]; obuf[ 7] = ibuf[ 7] ^ ip[ 7]; + obuf[ 8] = ibuf[ 8] ^ ip[ 8]; obuf[ 9] = ibuf[ 9] ^ ip[ 9]; + obuf[10] = ibuf[10] ^ ip[10]; obuf[11] = ibuf[11] ^ ip[11]; + obuf[12] = ibuf[12] ^ ip[12]; obuf[13] = ibuf[13] ^ ip[13]; + obuf[14] = ibuf[14] ^ ip[14]; obuf[15] = ibuf[15] ^ ip[15]; + i += AES_BLOCK_SIZE; + ip += AES_BLOCK_SIZE; + ibuf += AES_BLOCK_SIZE; + obuf += AES_BLOCK_SIZE; + } + + while(i++ < blen) + *obuf++ = *ibuf++ ^ ip[b_pos++]; + } + + ctx->inf.b[2] = (uint8_t)b_pos; + return EXIT_SUCCESS; +} + +#if defined(__cplusplus) +} +#endif +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/aes/aescpp.h b/lib/ESPiLight/pilight/libs/openzwave/aes/aescpp.h new file mode 100644 index 0000000..1ceefd7 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/aes/aescpp.h @@ -0,0 +1,141 @@ +/* +--------------------------------------------------------------------------- +Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. + +The redistribution and use of this software (with or without changes) +is allowed without the payment of fees or royalties provided that: + + source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation. + +This software is provided 'as is' with no explicit or implied warranties +in respect of its operation, including, but not limited to, correctness +and fitness for purpose. +--------------------------------------------------------------------------- +Issue Date: 20/12/2007 + + This file contains the definitions required to use AES (Rijndael) in C++. +*/ + +#ifndef _AESCPP_H +#define _AESCPP_H + +#include "aes.h" + +#if defined( AES_ENCRYPT ) + +class AESencrypt +{ +public: + aes_encrypt_ctx cx[1]; + AESencrypt(void) { aes_init1(); }; +#if defined(AES_128) + AESencrypt(const unsigned char key[]) + { aes_encrypt_key128(key, cx); } + AES_RETURN key128(const unsigned char key[]) + { return aes_encrypt_key128(key, cx); } +#endif +#if defined(AES_192) + AES_RETURN key192(const unsigned char key[]) + { return aes_encrypt_key192(key, cx); } +#endif +#if defined(AES_256) + AES_RETURN key256(const unsigned char key[]) + { return aes_encrypt_key256(key, cx); } +#endif +#if defined(AES_VAR) + AES_RETURN key(const unsigned char key[], int key_len) + { return aes_encrypt_key(key, key_len, cx); } +#endif + AES_RETURN encrypt(const unsigned char in[], unsigned char out[]) const + { return aes_encrypt(in, out, cx); } +#ifndef AES_MODES + AES_RETURN ecb_encrypt(const unsigned char in[], unsigned char out[], int nb) const + { while(nb--) + { aes_encrypt(in, out, cx), in += AES_BLOCK_SIZE, out += AES_BLOCK_SIZE; } + } +#endif +#ifdef AES_MODES + AES_RETURN mode_reset(void) { return aes_mode_reset(cx); } + + AES_RETURN ecb_encrypt(const unsigned char in[], unsigned char out[], int nb) const + { return aes_ecb_encrypt(in, out, nb, cx); } + + AES_RETURN cbc_encrypt(const unsigned char in[], unsigned char out[], int nb, + unsigned char iv[]) const + { return aes_cbc_encrypt(in, out, nb, iv, cx); } + + AES_RETURN cfb_encrypt(const unsigned char in[], unsigned char out[], int nb, + unsigned char iv[]) + { return aes_cfb_encrypt(in, out, nb, iv, cx); } + + AES_RETURN cfb_decrypt(const unsigned char in[], unsigned char out[], int nb, + unsigned char iv[]) + { return aes_cfb_decrypt(in, out, nb, iv, cx); } + + AES_RETURN ofb_crypt(const unsigned char in[], unsigned char out[], int nb, + unsigned char iv[]) + { return aes_ofb_crypt(in, out, nb, iv, cx); } + + typedef void ctr_fn(unsigned char ctr[]); + + AES_RETURN ctr_crypt(const unsigned char in[], unsigned char out[], int nb, + unsigned char iv[], ctr_fn cf) + { return aes_ctr_crypt(in, out, nb, iv, cf, cx); } + +#endif + +}; + +#endif + +#if defined( AES_DECRYPT ) + +class AESdecrypt +{ +public: + aes_decrypt_ctx cx[1]; + AESdecrypt(void) { aes_init1(); }; +#if defined(AES_128) + AESdecrypt(const unsigned char key[]) + { aes_decrypt_key128(key, cx); } + AES_RETURN key128(const unsigned char key[]) + { return aes_decrypt_key128(key, cx); } +#endif +#if defined(AES_192) + AES_RETURN key192(const unsigned char key[]) + { return aes_decrypt_key192(key, cx); } +#endif +#if defined(AES_256) + AES_RETURN key256(const unsigned char key[]) + { return aes_decrypt_key256(key, cx); } +#endif +#if defined(AES_VAR) + AES_RETURN key(const unsigned char key[], int key_len) + { return aes_decrypt_key(key, key_len, cx); } +#endif + AES_RETURN decrypt(const unsigned char in[], unsigned char out[]) const + { return aes_decrypt(in, out, cx); } +#ifndef AES_MODES + AES_RETURN ecb_decrypt(const unsigned char in[], unsigned char out[], int nb) const + { while(nb--) + { aes_decrypt(in, out, cx), in += AES_BLOCK_SIZE, out += AES_BLOCK_SIZE; } + } +#endif +#ifdef AES_MODES + + AES_RETURN ecb_decrypt(const unsigned char in[], unsigned char out[], int nb) const + { return aes_ecb_decrypt(in, out, nb, cx); } + + AES_RETURN cbc_decrypt(const unsigned char in[], unsigned char out[], int nb, + unsigned char iv[]) const + { return aes_cbc_decrypt(in, out, nb, iv, cx); } +#endif +}; + +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/aes/aescrypt.c b/lib/ESPiLight/pilight/libs/openzwave/aes/aescrypt.c new file mode 100644 index 0000000..f1b70e3 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/aes/aescrypt.c @@ -0,0 +1,301 @@ +/* +--------------------------------------------------------------------------- +Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. + +The redistribution and use of this software (with or without changes) +is allowed without the payment of fees or royalties provided that: + + source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation. + +This software is provided 'as is' with no explicit or implied warranties +in respect of its operation, including, but not limited to, correctness +and fitness for purpose. +--------------------------------------------------------------------------- +Issue Date: 20/12/2007 +*/ + +#include "aesopt.h" +#include "aestab.h" + +#if defined( USE_INTEL_AES_IF_PRESENT ) +#include +#else +/* map names here to provide the external API ('name' -> 'aes_name') */ +# define aes_xi(x) aes_ ## x +#endif + +#if defined(__cplusplus) +extern "C" +{ +#endif + +#define si(y,x,k,c) (s(y,c) = word_in(x, c) ^ (k)[c]) +#define so(y,x,c) word_out(y, c, s(x,c)) + +#if defined(ARRAYS) +#define locals(y,x) x[4],y[4] +#else +#define locals(y,x) x##0,x##1,x##2,x##3,y##0,y##1,y##2,y##3 +#endif + +#define l_copy(y, x) s(y,0) = s(x,0); s(y,1) = s(x,1); \ + s(y,2) = s(x,2); s(y,3) = s(x,3); +#define state_in(y,x,k) si(y,x,k,0); si(y,x,k,1); si(y,x,k,2); si(y,x,k,3) +#define state_out(y,x) so(y,x,0); so(y,x,1); so(y,x,2); so(y,x,3) +#define round(rm,y,x,k) rm(y,x,k,0); rm(y,x,k,1); rm(y,x,k,2); rm(y,x,k,3) + +#if ( FUNCS_IN_C & ENCRYPTION_IN_C ) + +/* Visual C++ .Net v7.1 provides the fastest encryption code when using + Pentium optimiation with small code but this is poor for decryption + so we need to control this with the following VC++ pragmas +*/ + +#if defined( _WIN32 ) && !defined( _WIN64 ) +#pragma optimize( "s", on ) +#endif + +/* Given the column (c) of the output state variable, the following + macros give the input state variables which are needed in its + computation for each row (r) of the state. All the alternative + macros give the same end values but expand into different ways + of calculating these values. In particular the complex macro + used for dynamically variable block sizes is designed to expand + to a compile time constant whenever possible but will expand to + conditional clauses on some branches (I am grateful to Frank + Yellin for this construction) +*/ + +#define fwd_var(x,r,c)\ + ( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\ + : r == 1 ? ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0))\ + : r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\ + : ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2))) + +#if defined(FT4_SET) +#undef dec_fmvars +#define fwd_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,n),fwd_var,rf1,c)) +#elif defined(FT1_SET) +#undef dec_fmvars +#define fwd_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,upr,t_use(f,n),fwd_var,rf1,c)) +#else +#define fwd_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ fwd_mcol(no_table(x,t_use(s,box),fwd_var,rf1,c))) +#endif + +#if defined(FL4_SET) +#define fwd_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,l),fwd_var,rf1,c)) +#elif defined(FL1_SET) +#define fwd_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,ups,t_use(f,l),fwd_var,rf1,c)) +#else +#define fwd_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ no_table(x,t_use(s,box),fwd_var,rf1,c)) +#endif + +AES_RETURN aes_xi(encrypt)(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1]) +{ uint32_t locals(b0, b1); + const uint32_t *kp; +#if defined( dec_fmvars ) + dec_fmvars; /* declare variables for fwd_mcol() if needed */ +#endif + + if(cx->inf.b[0] != 10 * 16 && cx->inf.b[0] != 12 * 16 && cx->inf.b[0] != 14 * 16) + return EXIT_FAILURE; + + kp = cx->ks; + state_in(b0, in, kp); + +#if (ENC_UNROLL == FULL) + + switch(cx->inf.b[0]) + { + case 14 * 16: + round(fwd_rnd, b1, b0, kp + 1 * N_COLS); + round(fwd_rnd, b0, b1, kp + 2 * N_COLS); + kp += 2 * N_COLS; + case 12 * 16: + round(fwd_rnd, b1, b0, kp + 1 * N_COLS); + round(fwd_rnd, b0, b1, kp + 2 * N_COLS); + kp += 2 * N_COLS; + case 10 * 16: + round(fwd_rnd, b1, b0, kp + 1 * N_COLS); + round(fwd_rnd, b0, b1, kp + 2 * N_COLS); + round(fwd_rnd, b1, b0, kp + 3 * N_COLS); + round(fwd_rnd, b0, b1, kp + 4 * N_COLS); + round(fwd_rnd, b1, b0, kp + 5 * N_COLS); + round(fwd_rnd, b0, b1, kp + 6 * N_COLS); + round(fwd_rnd, b1, b0, kp + 7 * N_COLS); + round(fwd_rnd, b0, b1, kp + 8 * N_COLS); + round(fwd_rnd, b1, b0, kp + 9 * N_COLS); + round(fwd_lrnd, b0, b1, kp +10 * N_COLS); + } + +#else + +#if (ENC_UNROLL == PARTIAL) + { uint32_t rnd; + for(rnd = 0; rnd < (cx->inf.b[0] >> 5) - 1; ++rnd) + { + kp += N_COLS; + round(fwd_rnd, b1, b0, kp); + kp += N_COLS; + round(fwd_rnd, b0, b1, kp); + } + kp += N_COLS; + round(fwd_rnd, b1, b0, kp); +#else + { uint32_t rnd; + for(rnd = 0; rnd < (cx->inf.b[0] >> 4) - 1; ++rnd) + { + kp += N_COLS; + round(fwd_rnd, b1, b0, kp); + l_copy(b0, b1); + } +#endif + kp += N_COLS; + round(fwd_lrnd, b0, b1, kp); + } +#endif + + state_out(out, b0); + return EXIT_SUCCESS; +} + +#endif + +#if ( FUNCS_IN_C & DECRYPTION_IN_C) + +/* Visual C++ .Net v7.1 provides the fastest encryption code when using + Pentium optimiation with small code but this is poor for decryption + so we need to control this with the following VC++ pragmas +*/ + +#if defined( _WIN32 ) && !defined( _WIN64 ) +#pragma optimize( "t", on ) +#endif + +/* Given the column (c) of the output state variable, the following + macros give the input state variables which are needed in its + computation for each row (r) of the state. All the alternative + macros give the same end values but expand into different ways + of calculating these values. In particular the complex macro + used for dynamically variable block sizes is designed to expand + to a compile time constant whenever possible but will expand to + conditional clauses on some branches (I am grateful to Frank + Yellin for this construction) +*/ + +#define inv_var(x,r,c)\ + ( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\ + : r == 1 ? ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2))\ + : r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\ + : ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0))) + +#if defined(IT4_SET) +#undef dec_imvars +#define inv_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,n),inv_var,rf1,c)) +#elif defined(IT1_SET) +#undef dec_imvars +#define inv_rnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,upr,t_use(i,n),inv_var,rf1,c)) +#else +#define inv_rnd(y,x,k,c) (s(y,c) = inv_mcol((k)[c] ^ no_table(x,t_use(i,box),inv_var,rf1,c))) +#endif + +#if defined(IL4_SET) +#define inv_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,l),inv_var,rf1,c)) +#elif defined(IL1_SET) +#define inv_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ one_table(x,ups,t_use(i,l),inv_var,rf1,c)) +#else +#define inv_lrnd(y,x,k,c) (s(y,c) = (k)[c] ^ no_table(x,t_use(i,box),inv_var,rf1,c)) +#endif + +/* This code can work with the decryption key schedule in the */ +/* order that is used for encrytpion (where the 1st decryption */ +/* round key is at the high end ot the schedule) or with a key */ +/* schedule that has been reversed to put the 1st decryption */ +/* round key at the low end of the schedule in memory (when */ +/* AES_REV_DKS is defined) */ + +#ifdef AES_REV_DKS +#define key_ofs 0 +#define rnd_key(n) (kp + n * N_COLS) +#else +#define key_ofs 1 +#define rnd_key(n) (kp - n * N_COLS) +#endif + +AES_RETURN aes_xi(decrypt)(const unsigned char *in, unsigned char *out, const aes_decrypt_ctx cx[1]) +{ uint32_t locals(b0, b1); +#if defined( dec_imvars ) + dec_imvars; /* declare variables for inv_mcol() if needed */ +#endif + const uint32_t *kp; + + if(cx->inf.b[0] != 10 * 16 && cx->inf.b[0] != 12 * 16 && cx->inf.b[0] != 14 * 16) + return EXIT_FAILURE; + + kp = cx->ks + (key_ofs ? (cx->inf.b[0] >> 2) : 0); + state_in(b0, in, kp); + +#if (DEC_UNROLL == FULL) + + kp = cx->ks + (key_ofs ? 0 : (cx->inf.b[0] >> 2)); + switch(cx->inf.b[0]) + { + case 14 * 16: + round(inv_rnd, b1, b0, rnd_key(-13)); + round(inv_rnd, b0, b1, rnd_key(-12)); + case 12 * 16: + round(inv_rnd, b1, b0, rnd_key(-11)); + round(inv_rnd, b0, b1, rnd_key(-10)); + case 10 * 16: + round(inv_rnd, b1, b0, rnd_key(-9)); + round(inv_rnd, b0, b1, rnd_key(-8)); + round(inv_rnd, b1, b0, rnd_key(-7)); + round(inv_rnd, b0, b1, rnd_key(-6)); + round(inv_rnd, b1, b0, rnd_key(-5)); + round(inv_rnd, b0, b1, rnd_key(-4)); + round(inv_rnd, b1, b0, rnd_key(-3)); + round(inv_rnd, b0, b1, rnd_key(-2)); + round(inv_rnd, b1, b0, rnd_key(-1)); + round(inv_lrnd, b0, b1, rnd_key( 0)); + } + +#else + +#if (DEC_UNROLL == PARTIAL) + { uint32_t rnd; + for(rnd = 0; rnd < (cx->inf.b[0] >> 5) - 1; ++rnd) + { + kp = rnd_key(1); + round(inv_rnd, b1, b0, kp); + kp = rnd_key(1); + round(inv_rnd, b0, b1, kp); + } + kp = rnd_key(1); + round(inv_rnd, b1, b0, kp); +#else + { uint32_t rnd; + for(rnd = 0; rnd < (cx->inf.b[0] >> 4) - 1; ++rnd) + { + kp = rnd_key(1); + round(inv_rnd, b1, b0, kp); + l_copy(b0, b1); + } +#endif + kp = rnd_key(1); + round(inv_lrnd, b0, b1, kp); + } +#endif + + state_out(out, b0); + return EXIT_SUCCESS; +} + +#endif + +#if defined(__cplusplus) +} +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/aes/aeskey.c b/lib/ESPiLight/pilight/libs/openzwave/aes/aeskey.c new file mode 100644 index 0000000..16e9607 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/aes/aeskey.c @@ -0,0 +1,554 @@ +/* +--------------------------------------------------------------------------- +Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. + +The redistribution and use of this software (with or without changes) +is allowed without the payment of fees or royalties provided that: + + source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation. + +This software is provided 'as is' with no explicit or implied warranties +in respect of its operation, including, but not limited to, correctness +and fitness for purpose. +--------------------------------------------------------------------------- +Issue Date: 20/12/2007 +*/ + +#include "aesopt.h" +#include "aestab.h" + +#if defined( USE_INTEL_AES_IF_PRESENT ) +# include "aes_ni.h" +#else +/* map names here to provide the external API ('name' -> 'aes_name') */ +# define aes_xi(x) aes_ ## x +#endif + +#ifdef USE_VIA_ACE_IF_PRESENT +# include "aes_via_ace.h" +#endif + +#if defined(__cplusplus) +extern "C" +{ +#endif + +/* Initialise the key schedule from the user supplied key. The key + length can be specified in bytes, with legal values of 16, 24 + and 32, or in bits, with legal values of 128, 192 and 256. These + values correspond with Nk values of 4, 6 and 8 respectively. + + The following macros implement a single cycle in the key + schedule generation process. The number of cycles needed + for each cx->n_col and nk value is: + + nk = 4 5 6 7 8 + ------------------------------ + cx->n_col = 4 10 9 8 7 7 + cx->n_col = 5 14 11 10 9 9 + cx->n_col = 6 19 15 12 11 11 + cx->n_col = 7 21 19 16 13 14 + cx->n_col = 8 29 23 19 17 14 +*/ + +#if defined( REDUCE_CODE_SIZE ) +# define ls_box ls_sub + uint32_t ls_sub(const uint32_t t, const uint32_t n); +# define inv_mcol im_sub + uint32_t im_sub(const uint32_t x); +# ifdef ENC_KS_UNROLL +# undef ENC_KS_UNROLL +# endif +# ifdef DEC_KS_UNROLL +# undef DEC_KS_UNROLL +# endif +#endif + +#if (FUNCS_IN_C & ENC_KEYING_IN_C) + +#if defined(AES_128) || defined( AES_VAR ) + +#define ke4(k,i) \ +{ k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \ + k[4*(i)+5] = ss[1] ^= ss[0]; \ + k[4*(i)+6] = ss[2] ^= ss[1]; \ + k[4*(i)+7] = ss[3] ^= ss[2]; \ +} + +AES_RETURN aes_xi(encrypt_key128)(const unsigned char *key, aes_encrypt_ctx cx[1]) +{ uint32_t ss[4]; + + cx->ks[0] = ss[0] = word_in(key, 0); + cx->ks[1] = ss[1] = word_in(key, 1); + cx->ks[2] = ss[2] = word_in(key, 2); + cx->ks[3] = ss[3] = word_in(key, 3); + +#ifdef ENC_KS_UNROLL + ke4(cx->ks, 0); ke4(cx->ks, 1); + ke4(cx->ks, 2); ke4(cx->ks, 3); + ke4(cx->ks, 4); ke4(cx->ks, 5); + ke4(cx->ks, 6); ke4(cx->ks, 7); + ke4(cx->ks, 8); +#else + { uint32_t i; + for(i = 0; i < 9; ++i) + ke4(cx->ks, i); + } +#endif + ke4(cx->ks, 9); + cx->inf.l = 0; + cx->inf.b[0] = 10 * 16; + +#ifdef USE_VIA_ACE_IF_PRESENT + if(VIA_ACE_AVAILABLE) + cx->inf.b[1] = 0xff; +#endif + return EXIT_SUCCESS; +} + +#endif + +#if defined(AES_192) || defined( AES_VAR ) + +#define kef6(k,i) \ +{ k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \ + k[6*(i)+ 7] = ss[1] ^= ss[0]; \ + k[6*(i)+ 8] = ss[2] ^= ss[1]; \ + k[6*(i)+ 9] = ss[3] ^= ss[2]; \ +} + +#define ke6(k,i) \ +{ kef6(k,i); \ + k[6*(i)+10] = ss[4] ^= ss[3]; \ + k[6*(i)+11] = ss[5] ^= ss[4]; \ +} + +AES_RETURN aes_xi(encrypt_key192)(const unsigned char *key, aes_encrypt_ctx cx[1]) +{ uint32_t ss[6]; + + cx->ks[0] = ss[0] = word_in(key, 0); + cx->ks[1] = ss[1] = word_in(key, 1); + cx->ks[2] = ss[2] = word_in(key, 2); + cx->ks[3] = ss[3] = word_in(key, 3); + cx->ks[4] = ss[4] = word_in(key, 4); + cx->ks[5] = ss[5] = word_in(key, 5); + +#ifdef ENC_KS_UNROLL + ke6(cx->ks, 0); ke6(cx->ks, 1); + ke6(cx->ks, 2); ke6(cx->ks, 3); + ke6(cx->ks, 4); ke6(cx->ks, 5); + ke6(cx->ks, 6); +#else + { uint32_t i; + for(i = 0; i < 7; ++i) + ke6(cx->ks, i); + } +#endif + kef6(cx->ks, 7); + cx->inf.l = 0; + cx->inf.b[0] = 12 * 16; + +#ifdef USE_VIA_ACE_IF_PRESENT + if(VIA_ACE_AVAILABLE) + cx->inf.b[1] = 0xff; +#endif + return EXIT_SUCCESS; +} + +#endif + +#if defined(AES_256) || defined( AES_VAR ) + +#define kef8(k,i) \ +{ k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \ + k[8*(i)+ 9] = ss[1] ^= ss[0]; \ + k[8*(i)+10] = ss[2] ^= ss[1]; \ + k[8*(i)+11] = ss[3] ^= ss[2]; \ +} + +#define ke8(k,i) \ +{ kef8(k,i); \ + k[8*(i)+12] = ss[4] ^= ls_box(ss[3],0); \ + k[8*(i)+13] = ss[5] ^= ss[4]; \ + k[8*(i)+14] = ss[6] ^= ss[5]; \ + k[8*(i)+15] = ss[7] ^= ss[6]; \ +} + +AES_RETURN aes_xi(encrypt_key256)(const unsigned char *key, aes_encrypt_ctx cx[1]) +{ uint32_t ss[8]; + + cx->ks[0] = ss[0] = word_in(key, 0); + cx->ks[1] = ss[1] = word_in(key, 1); + cx->ks[2] = ss[2] = word_in(key, 2); + cx->ks[3] = ss[3] = word_in(key, 3); + cx->ks[4] = ss[4] = word_in(key, 4); + cx->ks[5] = ss[5] = word_in(key, 5); + cx->ks[6] = ss[6] = word_in(key, 6); + cx->ks[7] = ss[7] = word_in(key, 7); + +#ifdef ENC_KS_UNROLL + ke8(cx->ks, 0); ke8(cx->ks, 1); + ke8(cx->ks, 2); ke8(cx->ks, 3); + ke8(cx->ks, 4); ke8(cx->ks, 5); +#else + { uint32_t i; + for(i = 0; i < 6; ++i) + ke8(cx->ks, i); + } +#endif + kef8(cx->ks, 6); + cx->inf.l = 0; + cx->inf.b[0] = 14 * 16; + +#ifdef USE_VIA_ACE_IF_PRESENT + if(VIA_ACE_AVAILABLE) + cx->inf.b[1] = 0xff; +#endif + return EXIT_SUCCESS; +} + +#endif + +#endif + +#if (FUNCS_IN_C & DEC_KEYING_IN_C) + +/* this is used to store the decryption round keys */ +/* in forward or reverse order */ + +#ifdef AES_REV_DKS +#define v(n,i) ((n) - (i) + 2 * ((i) & 3)) +#else +#define v(n,i) (i) +#endif + +#if DEC_ROUND == NO_TABLES +#define ff(x) (x) +#else +#define ff(x) inv_mcol(x) +#if defined( dec_imvars ) +#define d_vars dec_imvars +#endif +#endif + +#if defined(AES_128) || defined( AES_VAR ) + +#define k4e(k,i) \ +{ k[v(40,(4*(i))+4)] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \ + k[v(40,(4*(i))+5)] = ss[1] ^= ss[0]; \ + k[v(40,(4*(i))+6)] = ss[2] ^= ss[1]; \ + k[v(40,(4*(i))+7)] = ss[3] ^= ss[2]; \ +} + +#if 1 + +#define kdf4(k,i) \ +{ ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; \ + ss[1] = ss[1] ^ ss[3]; \ + ss[2] = ss[2] ^ ss[3]; \ + ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \ + ss[i % 4] ^= ss[4]; \ + ss[4] ^= k[v(40,(4*(i)))]; k[v(40,(4*(i))+4)] = ff(ss[4]); \ + ss[4] ^= k[v(40,(4*(i))+1)]; k[v(40,(4*(i))+5)] = ff(ss[4]); \ + ss[4] ^= k[v(40,(4*(i))+2)]; k[v(40,(4*(i))+6)] = ff(ss[4]); \ + ss[4] ^= k[v(40,(4*(i))+3)]; k[v(40,(4*(i))+7)] = ff(ss[4]); \ +} + +#define kd4(k,i) \ +{ ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \ + ss[i % 4] ^= ss[4]; ss[4] = ff(ss[4]); \ + k[v(40,(4*(i))+4)] = ss[4] ^= k[v(40,(4*(i)))]; \ + k[v(40,(4*(i))+5)] = ss[4] ^= k[v(40,(4*(i))+1)]; \ + k[v(40,(4*(i))+6)] = ss[4] ^= k[v(40,(4*(i))+2)]; \ + k[v(40,(4*(i))+7)] = ss[4] ^= k[v(40,(4*(i))+3)]; \ +} + +#define kdl4(k,i) \ +{ ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; ss[i % 4] ^= ss[4]; \ + k[v(40,(4*(i))+4)] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; \ + k[v(40,(4*(i))+5)] = ss[1] ^ ss[3]; \ + k[v(40,(4*(i))+6)] = ss[0]; \ + k[v(40,(4*(i))+7)] = ss[1]; \ +} + +#else + +#define kdf4(k,i) \ +{ ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ff(ss[0]); \ + ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ff(ss[1]); \ + ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ff(ss[2]); \ + ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ff(ss[3]); \ +} + +#define kd4(k,i) \ +{ ss[4] = ls_box(ss[3],3) ^ t_use(r,c)[i]; \ + ss[0] ^= ss[4]; ss[4] = ff(ss[4]); k[v(40,(4*(i))+ 4)] = ss[4] ^= k[v(40,(4*(i)))]; \ + ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[4] ^= k[v(40,(4*(i))+ 1)]; \ + ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[4] ^= k[v(40,(4*(i))+ 2)]; \ + ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[4] ^= k[v(40,(4*(i))+ 3)]; \ +} + +#define kdl4(k,i) \ +{ ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ss[0]; \ + ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[1]; \ + ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[2]; \ + ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[3]; \ +} + +#endif + +AES_RETURN aes_xi(decrypt_key128)(const unsigned char *key, aes_decrypt_ctx cx[1]) +{ uint32_t ss[5]; +#if defined( d_vars ) + d_vars; +#endif + + cx->ks[v(40,(0))] = ss[0] = word_in(key, 0); + cx->ks[v(40,(1))] = ss[1] = word_in(key, 1); + cx->ks[v(40,(2))] = ss[2] = word_in(key, 2); + cx->ks[v(40,(3))] = ss[3] = word_in(key, 3); + +#ifdef DEC_KS_UNROLL + kdf4(cx->ks, 0); kd4(cx->ks, 1); + kd4(cx->ks, 2); kd4(cx->ks, 3); + kd4(cx->ks, 4); kd4(cx->ks, 5); + kd4(cx->ks, 6); kd4(cx->ks, 7); + kd4(cx->ks, 8); kdl4(cx->ks, 9); +#else + { uint32_t i; + for(i = 0; i < 10; ++i) + k4e(cx->ks, i); +#if !(DEC_ROUND == NO_TABLES) + for(i = N_COLS; i < 10 * N_COLS; ++i) + cx->ks[i] = inv_mcol(cx->ks[i]); +#endif + } +#endif + cx->inf.l = 0; + cx->inf.b[0] = 10 * 16; + +#ifdef USE_VIA_ACE_IF_PRESENT + if(VIA_ACE_AVAILABLE) + cx->inf.b[1] = 0xff; +#endif + return EXIT_SUCCESS; +} + +#endif + +#if defined(AES_192) || defined( AES_VAR ) + +#define k6ef(k,i) \ +{ k[v(48,(6*(i))+ 6)] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \ + k[v(48,(6*(i))+ 7)] = ss[1] ^= ss[0]; \ + k[v(48,(6*(i))+ 8)] = ss[2] ^= ss[1]; \ + k[v(48,(6*(i))+ 9)] = ss[3] ^= ss[2]; \ +} + +#define k6e(k,i) \ +{ k6ef(k,i); \ + k[v(48,(6*(i))+10)] = ss[4] ^= ss[3]; \ + k[v(48,(6*(i))+11)] = ss[5] ^= ss[4]; \ +} + +#define kdf6(k,i) \ +{ ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ff(ss[0]); \ + ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ff(ss[1]); \ + ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ff(ss[2]); \ + ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ff(ss[3]); \ + ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ff(ss[4]); \ + ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ff(ss[5]); \ +} + +#define kd6(k,i) \ +{ ss[6] = ls_box(ss[5],3) ^ t_use(r,c)[i]; \ + ss[0] ^= ss[6]; ss[6] = ff(ss[6]); k[v(48,(6*(i))+ 6)] = ss[6] ^= k[v(48,(6*(i)))]; \ + ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[6] ^= k[v(48,(6*(i))+ 1)]; \ + ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[6] ^= k[v(48,(6*(i))+ 2)]; \ + ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[6] ^= k[v(48,(6*(i))+ 3)]; \ + ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ss[6] ^= k[v(48,(6*(i))+ 4)]; \ + ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ss[6] ^= k[v(48,(6*(i))+ 5)]; \ +} + +#define kdl6(k,i) \ +{ ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ss[0]; \ + ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[1]; \ + ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[2]; \ + ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[3]; \ +} + +AES_RETURN aes_xi(decrypt_key192)(const unsigned char *key, aes_decrypt_ctx cx[1]) +{ uint32_t ss[7]; +#if defined( d_vars ) + d_vars; +#endif + + cx->ks[v(48,(0))] = ss[0] = word_in(key, 0); + cx->ks[v(48,(1))] = ss[1] = word_in(key, 1); + cx->ks[v(48,(2))] = ss[2] = word_in(key, 2); + cx->ks[v(48,(3))] = ss[3] = word_in(key, 3); + +#ifdef DEC_KS_UNROLL + cx->ks[v(48,(4))] = ff(ss[4] = word_in(key, 4)); + cx->ks[v(48,(5))] = ff(ss[5] = word_in(key, 5)); + kdf6(cx->ks, 0); kd6(cx->ks, 1); + kd6(cx->ks, 2); kd6(cx->ks, 3); + kd6(cx->ks, 4); kd6(cx->ks, 5); + kd6(cx->ks, 6); kdl6(cx->ks, 7); +#else + cx->ks[v(48,(4))] = ss[4] = word_in(key, 4); + cx->ks[v(48,(5))] = ss[5] = word_in(key, 5); + { uint32_t i; + + for(i = 0; i < 7; ++i) + k6e(cx->ks, i); + k6ef(cx->ks, 7); +#if !(DEC_ROUND == NO_TABLES) + for(i = N_COLS; i < 12 * N_COLS; ++i) + cx->ks[i] = inv_mcol(cx->ks[i]); +#endif + } +#endif + cx->inf.l = 0; + cx->inf.b[0] = 12 * 16; + +#ifdef USE_VIA_ACE_IF_PRESENT + if(VIA_ACE_AVAILABLE) + cx->inf.b[1] = 0xff; +#endif + return EXIT_SUCCESS; +} + +#endif + +#if defined(AES_256) || defined( AES_VAR ) + +#define k8ef(k,i) \ +{ k[v(56,(8*(i))+ 8)] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \ + k[v(56,(8*(i))+ 9)] = ss[1] ^= ss[0]; \ + k[v(56,(8*(i))+10)] = ss[2] ^= ss[1]; \ + k[v(56,(8*(i))+11)] = ss[3] ^= ss[2]; \ +} + +#define k8e(k,i) \ +{ k8ef(k,i); \ + k[v(56,(8*(i))+12)] = ss[4] ^= ls_box(ss[3],0); \ + k[v(56,(8*(i))+13)] = ss[5] ^= ss[4]; \ + k[v(56,(8*(i))+14)] = ss[6] ^= ss[5]; \ + k[v(56,(8*(i))+15)] = ss[7] ^= ss[6]; \ +} + +#define kdf8(k,i) \ +{ ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ff(ss[0]); \ + ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ff(ss[1]); \ + ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ff(ss[2]); \ + ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ff(ss[3]); \ + ss[4] ^= ls_box(ss[3],0); k[v(56,(8*(i))+12)] = ff(ss[4]); \ + ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ff(ss[5]); \ + ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ff(ss[6]); \ + ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ff(ss[7]); \ +} + +#define kd8(k,i) \ +{ ss[8] = ls_box(ss[7],3) ^ t_use(r,c)[i]; \ + ss[0] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+ 8)] = ss[8] ^= k[v(56,(8*(i)))]; \ + ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[8] ^= k[v(56,(8*(i))+ 1)]; \ + ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[8] ^= k[v(56,(8*(i))+ 2)]; \ + ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[8] ^= k[v(56,(8*(i))+ 3)]; \ + ss[8] = ls_box(ss[3],0); \ + ss[4] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+12)] = ss[8] ^= k[v(56,(8*(i))+ 4)]; \ + ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ss[8] ^= k[v(56,(8*(i))+ 5)]; \ + ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ss[8] ^= k[v(56,(8*(i))+ 6)]; \ + ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ss[8] ^= k[v(56,(8*(i))+ 7)]; \ +} + +#define kdl8(k,i) \ +{ ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ss[0]; \ + ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[1]; \ + ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[2]; \ + ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[3]; \ +} + +AES_RETURN aes_xi(decrypt_key256)(const unsigned char *key, aes_decrypt_ctx cx[1]) +{ uint32_t ss[9]; +#if defined( d_vars ) + d_vars; +#endif + + cx->ks[v(56,(0))] = ss[0] = word_in(key, 0); + cx->ks[v(56,(1))] = ss[1] = word_in(key, 1); + cx->ks[v(56,(2))] = ss[2] = word_in(key, 2); + cx->ks[v(56,(3))] = ss[3] = word_in(key, 3); + +#ifdef DEC_KS_UNROLL + cx->ks[v(56,(4))] = ff(ss[4] = word_in(key, 4)); + cx->ks[v(56,(5))] = ff(ss[5] = word_in(key, 5)); + cx->ks[v(56,(6))] = ff(ss[6] = word_in(key, 6)); + cx->ks[v(56,(7))] = ff(ss[7] = word_in(key, 7)); + kdf8(cx->ks, 0); kd8(cx->ks, 1); + kd8(cx->ks, 2); kd8(cx->ks, 3); + kd8(cx->ks, 4); kd8(cx->ks, 5); + kdl8(cx->ks, 6); +#else + cx->ks[v(56,(4))] = ss[4] = word_in(key, 4); + cx->ks[v(56,(5))] = ss[5] = word_in(key, 5); + cx->ks[v(56,(6))] = ss[6] = word_in(key, 6); + cx->ks[v(56,(7))] = ss[7] = word_in(key, 7); + { uint32_t i; + + for(i = 0; i < 6; ++i) + k8e(cx->ks, i); + k8ef(cx->ks, 6); +#if !(DEC_ROUND == NO_TABLES) + for(i = N_COLS; i < 14 * N_COLS; ++i) + cx->ks[i] = inv_mcol(cx->ks[i]); +#endif + } +#endif + cx->inf.l = 0; + cx->inf.b[0] = 14 * 16; + +#ifdef USE_VIA_ACE_IF_PRESENT + if(VIA_ACE_AVAILABLE) + cx->inf.b[1] = 0xff; +#endif + return EXIT_SUCCESS; +} + +#endif + +#endif + +#if defined( AES_VAR ) + +AES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1]) +{ + switch(key_len) + { + case 16: case 128: return aes_encrypt_key128(key, cx); + case 24: case 192: return aes_encrypt_key192(key, cx); + case 32: case 256: return aes_encrypt_key256(key, cx); + default: return EXIT_FAILURE; + } +} + +AES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1]) +{ + switch(key_len) + { + case 16: case 128: return aes_decrypt_key128(key, cx); + case 24: case 192: return aes_decrypt_key192(key, cx); + case 32: case 256: return aes_decrypt_key256(key, cx); + default: return EXIT_FAILURE; + } +} + +#endif + +#if defined(__cplusplus) +} +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/aes/aesopt.h b/lib/ESPiLight/pilight/libs/openzwave/aes/aesopt.h new file mode 100644 index 0000000..715fa93 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/aes/aesopt.h @@ -0,0 +1,769 @@ +/* +--------------------------------------------------------------------------- +Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. + +The redistribution and use of this software (with or without changes) +is allowed without the payment of fees or royalties provided that: + + source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation. + +This software is provided 'as is' with no explicit or implied warranties +in respect of its operation, including, but not limited to, correctness +and fitness for purpose. +--------------------------------------------------------------------------- +Issue Date: 20/12/2007 + + This file contains the compilation options for AES (Rijndael) and code + that is common across encryption, key scheduling and table generation. + + OPERATION + + These source code files implement the AES algorithm Rijndael designed by + Joan Daemen and Vincent Rijmen. This version is designed for the standard + block size of 16 bytes and for key sizes of 128, 192 and 256 bits (16, 24 + and 32 bytes). + + This version is designed for flexibility and speed using operations on + 32-bit words rather than operations on bytes. It can be compiled with + either big or little endian internal byte order but is faster when the + native byte order for the processor is used. + + THE CIPHER INTERFACE + + The cipher interface is implemented as an array of bytes in which lower + AES bit sequence indexes map to higher numeric significance within bytes. + + uint8_t (an unsigned 8-bit type) + uint32_t (an unsigned 32-bit type) + struct aes_encrypt_ctx (structure for the cipher encryption context) + struct aes_decrypt_ctx (structure for the cipher decryption context) + AES_RETURN the function return type + + C subroutine calls: + + AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]); + AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]); + AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]); + AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out, + const aes_encrypt_ctx cx[1]); + + AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]); + AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]); + AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]); + AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out, + const aes_decrypt_ctx cx[1]); + + IMPORTANT NOTE: If you are using this C interface with dynamic tables make sure that + you call aes_init() before AES is used so that the tables are initialised. + + C++ aes class subroutines: + + Class AESencrypt for encryption + + Construtors: + AESencrypt(void) + AESencrypt(const unsigned char *key) - 128 bit key + Members: + AES_RETURN key128(const unsigned char *key) + AES_RETURN key192(const unsigned char *key) + AES_RETURN key256(const unsigned char *key) + AES_RETURN encrypt(const unsigned char *in, unsigned char *out) const + + Class AESdecrypt for encryption + Construtors: + AESdecrypt(void) + AESdecrypt(const unsigned char *key) - 128 bit key + Members: + AES_RETURN key128(const unsigned char *key) + AES_RETURN key192(const unsigned char *key) + AES_RETURN key256(const unsigned char *key) + AES_RETURN decrypt(const unsigned char *in, unsigned char *out) const +*/ + +#if !defined( _AESOPT_H ) +#define _AESOPT_H + +#if defined( __cplusplus ) +#include "aescpp.h" +#else +#include "aes.h" +#endif + +/* PLATFORM SPECIFIC INCLUDES */ + +#include "brg_endian.h" + +/* CONFIGURATION - THE USE OF DEFINES + + Later in this section there are a number of defines that control the + operation of the code. In each section, the purpose of each define is + explained so that the relevant form can be included or excluded by + setting either 1's or 0's respectively on the branches of the related + #if clauses. The following local defines should not be changed. +*/ + +#define ENCRYPTION_IN_C 1 +#define DECRYPTION_IN_C 2 +#define ENC_KEYING_IN_C 4 +#define DEC_KEYING_IN_C 8 + +#define NO_TABLES 0 +#define ONE_TABLE 1 +#define FOUR_TABLES 4 +#define NONE 0 +#define PARTIAL 1 +#define FULL 2 + +/* --- START OF USER CONFIGURED OPTIONS --- */ + +/* 1. BYTE ORDER WITHIN 32 BIT WORDS + + The fundamental data processing units in Rijndael are 8-bit bytes. The + input, output and key input are all enumerated arrays of bytes in which + bytes are numbered starting at zero and increasing to one less than the + number of bytes in the array in question. This enumeration is only used + for naming bytes and does not imply any adjacency or order relationship + from one byte to another. When these inputs and outputs are considered + as bit sequences, bits 8*n to 8*n+7 of the bit sequence are mapped to + byte[n] with bit 8n+i in the sequence mapped to bit 7-i within the byte. + In this implementation bits are numbered from 0 to 7 starting at the + numerically least significant end of each byte (bit n represents 2^n). + + However, Rijndael can be implemented more efficiently using 32-bit + words by packing bytes into words so that bytes 4*n to 4*n+3 are placed + into word[n]. While in principle these bytes can be assembled into words + in any positions, this implementation only supports the two formats in + which bytes in adjacent positions within words also have adjacent byte + numbers. This order is called big-endian if the lowest numbered bytes + in words have the highest numeric significance and little-endian if the + opposite applies. + + This code can work in either order irrespective of the order used by the + machine on which it runs. Normally the internal byte order will be set + to the order of the processor on which the code is to be run but this + define can be used to reverse this in special situations + + WARNING: Assembler code versions rely on PLATFORM_BYTE_ORDER being set. + This define will hence be redefined later (in section 4) if necessary +*/ + +#if 1 +# define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER +#elif 0 +# define ALGORITHM_BYTE_ORDER IS_LITTLE_ENDIAN +#elif 0 +# define ALGORITHM_BYTE_ORDER IS_BIG_ENDIAN +#else +# error The algorithm byte order is not defined +#endif + +/* 2. Intel AES AND VIA ACE SUPPORT */ + +#if defined( __GNUC__ ) && defined( __i386__ ) \ + || defined(_WIN32) && defined(_M_IX86) \ + && !(defined(_WIN64) || defined(_WIN32_WCE) || defined(_WIN32) && (_WIN32 <= 800)) +# define VIA_ACE_POSSIBLE +#endif + +/* Define this option if support for the Intel AESNI is required (not + currently available with GCC). If AESNI is known to be present, then + defining ASSUME_INTEL_AES_VIA_PRESENT will replace the ordinary + encryption/decryption. If USE_INTEL_AES_IF_PRESENT is defined then + AESNI will be used if it is detected (both present and enabled). + + AESNI uses a decryption key schedule with the first decryption + round key at the high end of the key scedule with the following + round keys at lower positions in memory. So AES_REV_DKS must NOT + be defined when AESNI will be used. ALthough it is unlikely that + assembler code will be used with an AESNI build, if it is then + AES_REV_DKS must NOT be defined when such assembler files are + built +*/ +#if 0 && defined( _WIN64 ) && defined( _WIN32 ) +# define INTEL_AES_POSSIBLE +#endif + +#if defined( INTEL_AES_POSSIBLE ) && !defined( USE_INTEL_AES_IF_PRESENT ) +# define USE_INTEL_AES_IF_PRESENT +#endif + +/* Define this option if support for the VIA ACE is required. This uses + inline assembler instructions and is only implemented for the Microsoft, + Intel and GCC compilers. If VIA ACE is known to be present, then defining + ASSUME_VIA_ACE_PRESENT will remove the ordinary encryption/decryption + code. If USE_VIA_ACE_IF_PRESENT is defined then VIA ACE will be used if + it is detected (both present and enabled) but the normal AES code will + also be present. + + When VIA ACE is to be used, all AES encryption contexts MUST be 16 byte + aligned; other input/output buffers do not need to be 16 byte aligned + but there are very large performance gains if this can be arranged. + VIA ACE also requires the decryption key schedule to be in reverse + order (which later checks below ensure). + + AES_REV_DKS must be set for assembler code used with a VIA ACE build +*/ + +#if 0 && defined( VIA_ACE_POSSIBLE ) && !defined( USE_VIA_ACE_IF_PRESENT ) +# define USE_VIA_ACE_IF_PRESENT +#endif + +#if 0 && defined( VIA_ACE_POSSIBLE ) && !defined( ASSUME_VIA_ACE_PRESENT ) +# define ASSUME_VIA_ACE_PRESENT +# endif + +/* 3. ASSEMBLER SUPPORT + + This define (which can be on the command line) enables the use of the + assembler code routines for encryption, decryption and key scheduling + as follows: + + ASM_X86_V1C uses the assembler (aes_x86_v1.asm) with large tables for + encryption and decryption and but with key scheduling in C + ASM_X86_V2 uses assembler (aes_x86_v2.asm) with compressed tables for + encryption, decryption and key scheduling + ASM_X86_V2C uses assembler (aes_x86_v2.asm) with compressed tables for + encryption and decryption and but with key scheduling in C + ASM_AMD64_C uses assembler (aes_amd64.asm) with compressed tables for + encryption and decryption and but with key scheduling in C + + Change one 'if 0' below to 'if 1' to select the version or define + as a compilation option. +*/ + +#if 0 && !defined( ASM_X86_V1C ) +# define ASM_X86_V1C +#elif 0 && !defined( ASM_X86_V2 ) +# define ASM_X86_V2 +#elif 0 && !defined( ASM_X86_V2C ) +# define ASM_X86_V2C +#elif 0 && !defined( ASM_AMD64_C ) +# define ASM_AMD64_C +#endif + +#if (defined ( ASM_X86_V1C ) || defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )) \ + && !defined( _M_IX86 ) || defined( ASM_AMD64_C ) && !defined( _M_X64 ) +# error Assembler code is only available for x86 and AMD64 systems +#endif + +/* 4. FAST INPUT/OUTPUT OPERATIONS. + + On some machines it is possible to improve speed by transferring the + bytes in the input and output arrays to and from the internal 32-bit + variables by addressing these arrays as if they are arrays of 32-bit + words. On some machines this will always be possible but there may + be a large performance penalty if the byte arrays are not aligned on + the normal word boundaries. On other machines this technique will + lead to memory access errors when such 32-bit word accesses are not + properly aligned. The option SAFE_IO avoids such problems but will + often be slower on those machines that support misaligned access + (especially so if care is taken to align the input and output byte + arrays on 32-bit word boundaries). If SAFE_IO is not defined it is + assumed that access to byte arrays as if they are arrays of 32-bit + words will not cause problems when such accesses are misaligned. +*/ +#if 1 && !defined( _WIN32 ) +# define SAFE_IO +#endif + +/* 5. LOOP UNROLLING + + The code for encryption and decrytpion cycles through a number of rounds + that can be implemented either in a loop or by expanding the code into a + long sequence of instructions, the latter producing a larger program but + one that will often be much faster. The latter is called loop unrolling. + There are also potential speed advantages in expanding two iterations in + a loop with half the number of iterations, which is called partial loop + unrolling. The following options allow partial or full loop unrolling + to be set independently for encryption and decryption +*/ +#if 1 +# define ENC_UNROLL FULL +#elif 0 +# define ENC_UNROLL PARTIAL +#else +# define ENC_UNROLL NONE +#endif + +#if 1 +# define DEC_UNROLL FULL +#elif 0 +# define DEC_UNROLL PARTIAL +#else +# define DEC_UNROLL NONE +#endif + +#if 1 +# define ENC_KS_UNROLL +#endif + +#if 1 +# define DEC_KS_UNROLL +#endif + +/* 6. FAST FINITE FIELD OPERATIONS + + If this section is included, tables are used to provide faster finite + field arithmetic (this has no effect if FIXED_TABLES is defined). +*/ +#if 1 +# define FF_TABLES +#endif + +/* 7. INTERNAL STATE VARIABLE FORMAT + + The internal state of Rijndael is stored in a number of local 32-bit + word varaibles which can be defined either as an array or as individual + names variables. Include this section if you want to store these local + varaibles in arrays. Otherwise individual local variables will be used. +*/ +#if 1 +# define ARRAYS +#endif + +/* 8. FIXED OR DYNAMIC TABLES + + When this section is included the tables used by the code are compiled + statically into the binary file. Otherwise the subroutine aes_init() + must be called to compute them before the code is first used. +*/ +#if 1 && !(defined( _WIN32 ) && ( _WIN32 <= 800 )) +# define FIXED_TABLES +#endif + +/* 9. MASKING OR CASTING FROM LONGER VALUES TO BYTES + + In some systems it is better to mask longer values to extract bytes + rather than using a cast. This option allows this choice. +*/ +#if 0 +# define to_byte(x) ((uint8_t)(x)) +#else +# define to_byte(x) ((x) & 0xff) +#endif + +/* 10. TABLE ALIGNMENT + + On some sytsems speed will be improved by aligning the AES large lookup + tables on particular boundaries. This define should be set to a power of + two giving the desired alignment. It can be left undefined if alignment + is not needed. This option is specific to the Microsft VC++ compiler - + it seems to sometimes cause trouble for the VC++ version 6 compiler. +*/ + +#if 1 && defined( _WIN32 ) && ( _WIN32 >= 1300 ) +# define TABLE_ALIGN 32 +#endif + +/* 11. REDUCE CODE AND TABLE SIZE + + This replaces some expanded macros with function calls if AES_ASM_V2 or + AES_ASM_V2C are defined +*/ + +#if 0 && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )) +# define REDUCE_CODE_SIZE +#endif + +/* 12. TABLE OPTIONS + + This cipher proceeds by repeating in a number of cycles known as 'rounds' + which are implemented by a round function which can optionally be speeded + up using tables. The basic tables are each 256 32-bit words, with either + one or four tables being required for each round function depending on + how much speed is required. The encryption and decryption round functions + are different and the last encryption and decrytpion round functions are + different again making four different round functions in all. + + This means that: + 1. Normal encryption and decryption rounds can each use either 0, 1 + or 4 tables and table spaces of 0, 1024 or 4096 bytes each. + 2. The last encryption and decryption rounds can also use either 0, 1 + or 4 tables and table spaces of 0, 1024 or 4096 bytes each. + + Include or exclude the appropriate definitions below to set the number + of tables used by this implementation. +*/ + +#if 1 /* set tables for the normal encryption round */ +# define ENC_ROUND FOUR_TABLES +#elif 0 +# define ENC_ROUND ONE_TABLE +#else +# define ENC_ROUND NO_TABLES +#endif + +#if 1 /* set tables for the last encryption round */ +# define LAST_ENC_ROUND FOUR_TABLES +#elif 0 +# define LAST_ENC_ROUND ONE_TABLE +#else +# define LAST_ENC_ROUND NO_TABLES +#endif + +#if 1 /* set tables for the normal decryption round */ +# define DEC_ROUND FOUR_TABLES +#elif 0 +# define DEC_ROUND ONE_TABLE +#else +# define DEC_ROUND NO_TABLES +#endif + +#if 1 /* set tables for the last decryption round */ +# define LAST_DEC_ROUND FOUR_TABLES +#elif 0 +# define LAST_DEC_ROUND ONE_TABLE +#else +# define LAST_DEC_ROUND NO_TABLES +#endif + +/* The decryption key schedule can be speeded up with tables in the same + way that the round functions can. Include or exclude the following + defines to set this requirement. +*/ +#if 1 +# define KEY_SCHED FOUR_TABLES +#elif 0 +# define KEY_SCHED ONE_TABLE +#else +# define KEY_SCHED NO_TABLES +#endif + +/* ---- END OF USER CONFIGURED OPTIONS ---- */ + +/* VIA ACE support is only available for VC++ and GCC */ + +#if !defined( _WIN32 ) && !defined( __GNUC__ ) +# if defined( ASSUME_VIA_ACE_PRESENT ) +# undef ASSUME_VIA_ACE_PRESENT +# endif +# if defined( USE_VIA_ACE_IF_PRESENT ) +# undef USE_VIA_ACE_IF_PRESENT +# endif +#endif + +#if defined( ASSUME_VIA_ACE_PRESENT ) && !defined( USE_VIA_ACE_IF_PRESENT ) +# define USE_VIA_ACE_IF_PRESENT +#endif + +/* define to reverse decryption key schedule */ +#if 1 || defined( USE_VIA_ACE_IF_PRESENT ) && !defined ( AES_REV_DKS ) +# define AES_REV_DKS +#endif + +/* Intel AESNI uses a decryption key schedule in the encryption order */ +#if defined( USE_INTEL_AES_IF_PRESENT ) && defined ( AES_REV_DKS ) +# undef AES_REV_DKS +#endif + +/* Assembler support requires the use of platform byte order */ + +#if ( defined( ASM_X86_V1C ) || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C ) ) \ + && (ALGORITHM_BYTE_ORDER != PLATFORM_BYTE_ORDER) +# undef ALGORITHM_BYTE_ORDER +# define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER +#endif + +/* In this implementation the columns of the state array are each held in + 32-bit words. The state array can be held in various ways: in an array + of words, in a number of individual word variables or in a number of + processor registers. The following define maps a variable name x and + a column number c to the way the state array variable is to be held. + The first define below maps the state into an array x[c] whereas the + second form maps the state into a number of individual variables x0, + x1, etc. Another form could map individual state colums to machine + register names. +*/ + +#if defined( ARRAYS ) +# define s(x,c) x[c] +#else +# define s(x,c) x##c +#endif + +/* This implementation provides subroutines for encryption, decryption + and for setting the three key lengths (separately) for encryption + and decryption. Since not all functions are needed, masks are set + up here to determine which will be implemented in C +*/ + +#if !defined( AES_ENCRYPT ) +# define EFUNCS_IN_C 0 +#elif defined( ASSUME_VIA_ACE_PRESENT ) || defined( ASM_X86_V1C ) \ + || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C ) +# define EFUNCS_IN_C ENC_KEYING_IN_C +#elif !defined( ASM_X86_V2 ) +# define EFUNCS_IN_C ( ENCRYPTION_IN_C | ENC_KEYING_IN_C ) +#else +# define EFUNCS_IN_C 0 +#endif + +#if !defined( AES_DECRYPT ) +# define DFUNCS_IN_C 0 +#elif defined( ASSUME_VIA_ACE_PRESENT ) || defined( ASM_X86_V1C ) \ + || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C ) +# define DFUNCS_IN_C DEC_KEYING_IN_C +#elif !defined( ASM_X86_V2 ) +# define DFUNCS_IN_C ( DECRYPTION_IN_C | DEC_KEYING_IN_C ) +#else +# define DFUNCS_IN_C 0 +#endif + +#define FUNCS_IN_C ( EFUNCS_IN_C | DFUNCS_IN_C ) + +/* END OF CONFIGURATION OPTIONS */ + +#define RC_LENGTH (5 * (AES_BLOCK_SIZE / 4 - 2)) + +/* Disable or report errors on some combinations of options */ + +#if ENC_ROUND == NO_TABLES && LAST_ENC_ROUND != NO_TABLES +# undef LAST_ENC_ROUND +# define LAST_ENC_ROUND NO_TABLES +#elif ENC_ROUND == ONE_TABLE && LAST_ENC_ROUND == FOUR_TABLES +# undef LAST_ENC_ROUND +# define LAST_ENC_ROUND ONE_TABLE +#endif + +#if ENC_ROUND == NO_TABLES && ENC_UNROLL != NONE +# undef ENC_UNROLL +# define ENC_UNROLL NONE +#endif + +#if DEC_ROUND == NO_TABLES && LAST_DEC_ROUND != NO_TABLES +# undef LAST_DEC_ROUND +# define LAST_DEC_ROUND NO_TABLES +#elif DEC_ROUND == ONE_TABLE && LAST_DEC_ROUND == FOUR_TABLES +# undef LAST_DEC_ROUND +# define LAST_DEC_ROUND ONE_TABLE +#endif + +#if DEC_ROUND == NO_TABLES && DEC_UNROLL != NONE +# undef DEC_UNROLL +# define DEC_UNROLL NONE +#endif + +#if defined( bswap32 ) +# define aes_sw32 bswap32 +#elif defined( bswap_32 ) +# define aes_sw32 bswap_32 +#else +# define brot(x,n) (((uint32_t)(x) << n) | ((uint32_t)(x) >> (32 - n))) +# define aes_sw32(x) ((brot((x),8) & 0x00ff00ff) | (brot((x),24) & 0xff00ff00)) +#endif + +/* upr(x,n): rotates bytes within words by n positions, moving bytes to + higher index positions with wrap around into low positions + ups(x,n): moves bytes by n positions to higher index positions in + words but without wrap around + bval(x,n): extracts a byte from a word + + WARNING: The definitions given here are intended only for use with + unsigned variables and with shift counts that are compile + time constants +*/ + +#if ( ALGORITHM_BYTE_ORDER == IS_LITTLE_ENDIAN ) +# define upr(x,n) (((uint32_t)(x) << (8 * (n))) | ((uint32_t)(x) >> (32 - 8 * (n)))) +# define ups(x,n) ((uint32_t) (x) << (8 * (n))) +# define bval(x,n) to_byte((x) >> (8 * (n))) +# define bytes2word(b0, b1, b2, b3) \ + (((uint32_t)(b3) << 24) | ((uint32_t)(b2) << 16) | ((uint32_t)(b1) << 8) | (b0)) +#endif + +#if ( ALGORITHM_BYTE_ORDER == IS_BIG_ENDIAN ) +# define upr(x,n) (((uint32_t)(x) >> (8 * (n))) | ((uint32_t)(x) << (32 - 8 * (n)))) +# define ups(x,n) ((uint32_t) (x) >> (8 * (n))) +# define bval(x,n) to_byte((x) >> (24 - 8 * (n))) +# define bytes2word(b0, b1, b2, b3) \ + (((uint32_t)(b0) << 24) | ((uint32_t)(b1) << 16) | ((uint32_t)(b2) << 8) | (b3)) +#endif + +#if defined( SAFE_IO ) +# define word_in(x,c) bytes2word(((const uint8_t*)(x)+4*c)[0], ((const uint8_t*)(x)+4*c)[1], \ + ((const uint8_t*)(x)+4*c)[2], ((const uint8_t*)(x)+4*c)[3]) +# define word_out(x,c,v) { ((uint8_t*)(x)+4*c)[0] = bval(v,0); ((uint8_t*)(x)+4*c)[1] = bval(v,1); \ + ((uint8_t*)(x)+4*c)[2] = bval(v,2); ((uint8_t*)(x)+4*c)[3] = bval(v,3); } +#elif ( ALGORITHM_BYTE_ORDER == PLATFORM_BYTE_ORDER ) +# define word_in(x,c) (*((uint32_t*)(x)+(c))) +# define word_out(x,c,v) (*((uint32_t*)(x)+(c)) = (v)) +#else +# define word_in(x,c) aes_sw32(*((uint32_t*)(x)+(c))) +# define word_out(x,c,v) (*((uint32_t*)(x)+(c)) = aes_sw32(v)) +#endif + +/* the finite field modular polynomial and elements */ + +#define WPOLY 0x011b +#define BPOLY 0x1b + +/* multiply four bytes in GF(2^8) by 'x' {02} in parallel */ + +#define gf_c1 0x80808080 +#define gf_c2 0x7f7f7f7f +#define gf_mulx(x) ((((x) & gf_c2) << 1) ^ ((((x) & gf_c1) >> 7) * BPOLY)) + +/* The following defines provide alternative definitions of gf_mulx that might + give improved performance if a fast 32-bit multiply is not available. Note + that a temporary variable u needs to be defined where gf_mulx is used. + +#define gf_mulx(x) (u = (x) & gf_c1, u |= (u >> 1), ((x) & gf_c2) << 1) ^ ((u >> 3) | (u >> 6)) +#define gf_c4 (0x01010101 * BPOLY) +#define gf_mulx(x) (u = (x) & gf_c1, ((x) & gf_c2) << 1) ^ ((u - (u >> 7)) & gf_c4) +*/ + +/* Work out which tables are needed for the different options */ + +#if defined( ASM_X86_V1C ) +# if defined( ENC_ROUND ) +# undef ENC_ROUND +# endif +# define ENC_ROUND FOUR_TABLES +# if defined( LAST_ENC_ROUND ) +# undef LAST_ENC_ROUND +# endif +# define LAST_ENC_ROUND FOUR_TABLES +# if defined( DEC_ROUND ) +# undef DEC_ROUND +# endif +# define DEC_ROUND FOUR_TABLES +# if defined( LAST_DEC_ROUND ) +# undef LAST_DEC_ROUND +# endif +# define LAST_DEC_ROUND FOUR_TABLES +# if defined( KEY_SCHED ) +# undef KEY_SCHED +# define KEY_SCHED FOUR_TABLES +# endif +#endif + +#if ( FUNCS_IN_C & ENCRYPTION_IN_C ) || defined( ASM_X86_V1C ) +# if ENC_ROUND == ONE_TABLE +# define FT1_SET +# elif ENC_ROUND == FOUR_TABLES +# define FT4_SET +# else +# define SBX_SET +# endif +# if LAST_ENC_ROUND == ONE_TABLE +# define FL1_SET +# elif LAST_ENC_ROUND == FOUR_TABLES +# define FL4_SET +# elif !defined( SBX_SET ) +# define SBX_SET +# endif +#endif + +#if ( FUNCS_IN_C & DECRYPTION_IN_C ) || defined( ASM_X86_V1C ) +# if DEC_ROUND == ONE_TABLE +# define IT1_SET +# elif DEC_ROUND == FOUR_TABLES +# define IT4_SET +# else +# define ISB_SET +# endif +# if LAST_DEC_ROUND == ONE_TABLE +# define IL1_SET +# elif LAST_DEC_ROUND == FOUR_TABLES +# define IL4_SET +# elif !defined(ISB_SET) +# define ISB_SET +# endif +#endif + +#if !(defined( REDUCE_CODE_SIZE ) && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C ))) +# if ((FUNCS_IN_C & ENC_KEYING_IN_C) || (FUNCS_IN_C & DEC_KEYING_IN_C)) +# if KEY_SCHED == ONE_TABLE +# if !defined( FL1_SET ) && !defined( FL4_SET ) +# define LS1_SET +# endif +# elif KEY_SCHED == FOUR_TABLES +# if !defined( FL4_SET ) +# define LS4_SET +# endif +# elif !defined( SBX_SET ) +# define SBX_SET +# endif +# endif +# if (FUNCS_IN_C & DEC_KEYING_IN_C) +# if KEY_SCHED == ONE_TABLE +# define IM1_SET +# elif KEY_SCHED == FOUR_TABLES +# define IM4_SET +# elif !defined( SBX_SET ) +# define SBX_SET +# endif +# endif +#endif + +/* generic definitions of Rijndael macros that use tables */ + +#define no_table(x,box,vf,rf,c) bytes2word( \ + box[bval(vf(x,0,c),rf(0,c))], \ + box[bval(vf(x,1,c),rf(1,c))], \ + box[bval(vf(x,2,c),rf(2,c))], \ + box[bval(vf(x,3,c),rf(3,c))]) + +#define one_table(x,op,tab,vf,rf,c) \ + ( tab[bval(vf(x,0,c),rf(0,c))] \ + ^ op(tab[bval(vf(x,1,c),rf(1,c))],1) \ + ^ op(tab[bval(vf(x,2,c),rf(2,c))],2) \ + ^ op(tab[bval(vf(x,3,c),rf(3,c))],3)) + +#define four_tables(x,tab,vf,rf,c) \ + ( tab[0][bval(vf(x,0,c),rf(0,c))] \ + ^ tab[1][bval(vf(x,1,c),rf(1,c))] \ + ^ tab[2][bval(vf(x,2,c),rf(2,c))] \ + ^ tab[3][bval(vf(x,3,c),rf(3,c))]) + +#define vf1(x,r,c) (x) +#define rf1(r,c) (r) +#define rf2(r,c) ((8+r-c)&3) + +/* perform forward and inverse column mix operation on four bytes in long word x in */ +/* parallel. NOTE: x must be a simple variable, NOT an expression in these macros. */ + +#if !(defined( REDUCE_CODE_SIZE ) && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C ))) + +#if defined( FM4_SET ) /* not currently used */ +# define fwd_mcol(x) four_tables(x,t_use(f,m),vf1,rf1,0) +#elif defined( FM1_SET ) /* not currently used */ +# define fwd_mcol(x) one_table(x,upr,t_use(f,m),vf1,rf1,0) +#else +# define dec_fmvars uint32_t g2 +# define fwd_mcol(x) (g2 = gf_mulx(x), g2 ^ upr((x) ^ g2, 3) ^ upr((x), 2) ^ upr((x), 1)) +#endif + +#if defined( IM4_SET ) +# define inv_mcol(x) four_tables(x,t_use(i,m),vf1,rf1,0) +#elif defined( IM1_SET ) +# define inv_mcol(x) one_table(x,upr,t_use(i,m),vf1,rf1,0) +#else +# define dec_imvars uint32_t g2, g4, g9 +# define inv_mcol(x) (g2 = gf_mulx(x), g4 = gf_mulx(g2), g9 = (x) ^ gf_mulx(g4), g4 ^= g9, \ + (x) ^ g2 ^ g4 ^ upr(g2 ^ g9, 3) ^ upr(g4, 2) ^ upr(g9, 1)) +#endif + +#if defined( FL4_SET ) +# define ls_box(x,c) four_tables(x,t_use(f,l),vf1,rf2,c) +#elif defined( LS4_SET ) +# define ls_box(x,c) four_tables(x,t_use(l,s),vf1,rf2,c) +#elif defined( FL1_SET ) +# define ls_box(x,c) one_table(x,upr,t_use(f,l),vf1,rf2,c) +#elif defined( LS1_SET ) +# define ls_box(x,c) one_table(x,upr,t_use(l,s),vf1,rf2,c) +#else +# define ls_box(x,c) no_table(x,t_use(s,box),vf1,rf2,c) +#endif + +#endif + +#if defined( ASM_X86_V1C ) && defined( AES_DECRYPT ) && !defined( ISB_SET ) +# define ISB_SET +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/aes/aestab.c b/lib/ESPiLight/pilight/libs/openzwave/aes/aestab.c new file mode 100644 index 0000000..6ae64a7 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/aes/aestab.c @@ -0,0 +1,391 @@ +/* +--------------------------------------------------------------------------- +Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. + +The redistribution and use of this software (with or without changes) +is allowed without the payment of fees or royalties provided that: + + source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation. + +This software is provided 'as is' with no explicit or implied warranties +in respect of its operation, including, but not limited to, correctness +and fitness for purpose. +--------------------------------------------------------------------------- +Issue Date: 20/12/2007 +*/ + +#define DO_TABLES + +#include "aes.h" +#include "aesopt.h" + +#if defined(FIXED_TABLES) + +#define sb_data(w) {\ + w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\ + w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\ + w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\ + w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\ + w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\ + w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\ + w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\ + w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\ + w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\ + w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\ + w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\ + w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\ + w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\ + w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\ + w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\ + w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\ + w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\ + w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\ + w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\ + w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\ + w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\ + w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\ + w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\ + w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\ + w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\ + w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\ + w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\ + w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\ + w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\ + w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\ + w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\ + w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) } + +#define isb_data(w) {\ + w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),\ + w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),\ + w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),\ + w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),\ + w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),\ + w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),\ + w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),\ + w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),\ + w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),\ + w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),\ + w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),\ + w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),\ + w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),\ + w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),\ + w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),\ + w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),\ + w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),\ + w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),\ + w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),\ + w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),\ + w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),\ + w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),\ + w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),\ + w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),\ + w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),\ + w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),\ + w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),\ + w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),\ + w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),\ + w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),\ + w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),\ + w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d) } + +#define mm_data(w) {\ + w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),\ + w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),\ + w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),\ + w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),\ + w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),\ + w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),\ + w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),\ + w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),\ + w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),\ + w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),\ + w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),\ + w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),\ + w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),\ + w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),\ + w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),\ + w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),\ + w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),\ + w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),\ + w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),\ + w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),\ + w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),\ + w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),\ + w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),\ + w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),\ + w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),\ + w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),\ + w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),\ + w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),\ + w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),\ + w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),\ + w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),\ + w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff) } + +#define rc_data(w) {\ + w(0x01), w(0x02), w(0x04), w(0x08), w(0x10),w(0x20), w(0x40), w(0x80),\ + w(0x1b), w(0x36) } + +#define h0(x) (x) + +#define w0(p) bytes2word(p, 0, 0, 0) +#define w1(p) bytes2word(0, p, 0, 0) +#define w2(p) bytes2word(0, 0, p, 0) +#define w3(p) bytes2word(0, 0, 0, p) + +#define u0(p) bytes2word(f2(p), p, p, f3(p)) +#define u1(p) bytes2word(f3(p), f2(p), p, p) +#define u2(p) bytes2word(p, f3(p), f2(p), p) +#define u3(p) bytes2word(p, p, f3(p), f2(p)) + +#define v0(p) bytes2word(fe(p), f9(p), fd(p), fb(p)) +#define v1(p) bytes2word(fb(p), fe(p), f9(p), fd(p)) +#define v2(p) bytes2word(fd(p), fb(p), fe(p), f9(p)) +#define v3(p) bytes2word(f9(p), fd(p), fb(p), fe(p)) + +#endif + +#if defined(FIXED_TABLES) || !defined(FF_TABLES) + +#define f2(x) ((x<<1) ^ (((x>>7) & 1) * WPOLY)) +#define f4(x) ((x<<2) ^ (((x>>6) & 1) * WPOLY) ^ (((x>>6) & 2) * WPOLY)) +#define f8(x) ((x<<3) ^ (((x>>5) & 1) * WPOLY) ^ (((x>>5) & 2) * WPOLY) \ + ^ (((x>>5) & 4) * WPOLY)) +#define f3(x) (f2(x) ^ x) +#define f9(x) (f8(x) ^ x) +#define fb(x) (f8(x) ^ f2(x) ^ x) +#define fd(x) (f8(x) ^ f4(x) ^ x) +#define fe(x) (f8(x) ^ f4(x) ^ f2(x)) + +#else + +#define f2(x) ((x) ? pow[log[x] + 0x19] : 0) +#define f3(x) ((x) ? pow[log[x] + 0x01] : 0) +#define f9(x) ((x) ? pow[log[x] + 0xc7] : 0) +#define fb(x) ((x) ? pow[log[x] + 0x68] : 0) +#define fd(x) ((x) ? pow[log[x] + 0xee] : 0) +#define fe(x) ((x) ? pow[log[x] + 0xdf] : 0) + +#endif + +#include "aestab.h" + +#if defined(__cplusplus) +extern "C" +{ +#endif + +#if defined(FIXED_TABLES) + +/* implemented in case of wrong call for fixed tables */ + +AES_RETURN aes_init1(void) +{ + return EXIT_SUCCESS; +} + +#else /* Generate the tables for the dynamic table option */ + +#if defined(FF_TABLES) + +#define gf_inv(x) ((x) ? pow[ 255 - log[x]] : 0) + +#else + +/* It will generally be sensible to use tables to compute finite + field multiplies and inverses but where memory is scarse this + code might sometimes be better. But it only has effect during + initialisation so its pretty unimportant in overall terms. +*/ + +/* return 2 ^ (n - 1) where n is the bit number of the highest bit + set in x with x in the range 1 < x < 0x00000200. This form is + used so that locals within fi can be bytes rather than words +*/ + +static uint8_t hibit(const uint32_t x) +{ uint8_t r = (uint8_t)((x >> 1) | (x >> 2)); + + r |= (r >> 2); + r |= (r >> 4); + return (r + 1) >> 1; +} + +/* return the inverse of the finite field element x */ + +static uint8_t gf_inv(const uint8_t x) +{ uint8_t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0; + + if(x < 2) + return x; + + for( ; ; ) + { + if(n1) + while(n2 >= n1) /* divide polynomial p2 by p1 */ + { + n2 /= n1; /* shift smaller polynomial left */ + p2 ^= (p1 * n2) & 0xff; /* and remove from larger one */ + v2 ^= v1 * n2; /* shift accumulated value and */ + n2 = hibit(p2); /* add into result */ + } + else + return v1; + + if(n2) /* repeat with values swapped */ + while(n1 >= n2) + { + n1 /= n2; + p1 ^= p2 * n1; + v1 ^= v2 * n1; + n1 = hibit(p1); + } + else + return v2; + } +} + +#endif + +/* The forward and inverse affine transformations used in the S-box */ +uint8_t fwd_affine(const uint8_t x) +{ uint32_t w = x; + w ^= (w << 1) ^ (w << 2) ^ (w << 3) ^ (w << 4); + return 0x63 ^ ((w ^ (w >> 8)) & 0xff); +} + +uint8_t inv_affine(const uint8_t x) +{ uint32_t w = x; + w = (w << 1) ^ (w << 3) ^ (w << 6); + return 0x05 ^ ((w ^ (w >> 8)) & 0xff); +} + +static int init = 0; + +AES_RETURN aes_init1(void) +{ uint32_t i, w; + +#if defined(FF_TABLES) + + uint8_t pow[512], log[256]; + + if(init) + return EXIT_SUCCESS; + /* log and power tables for GF(2^8) finite field with + WPOLY as modular polynomial - the simplest primitive + root is 0x03, used here to generate the tables + */ + + i = 0; w = 1; + do + { + pow[i] = (uint8_t)w; + pow[i + 255] = (uint8_t)w; + log[w] = (uint8_t)i++; + w ^= (w << 1) ^ (w & 0x80 ? WPOLY : 0); + } + while (w != 1); + +#else + if(init) + return EXIT_SUCCESS; +#endif + + for(i = 0, w = 1; i < RC_LENGTH; ++i) + { + t_set(r,c)[i] = bytes2word(w, 0, 0, 0); + w = f2(w); + } + + for(i = 0; i < 256; ++i) + { uint8_t b; + + b = fwd_affine(gf_inv((uint8_t)i)); + w = bytes2word(f2(b), b, b, f3(b)); + +#if defined( SBX_SET ) + t_set(s,box)[i] = b; +#endif + +#if defined( FT1_SET ) /* tables for a normal encryption round */ + t_set(f,n)[i] = w; +#endif +#if defined( FT4_SET ) + t_set(f,n)[0][i] = w; + t_set(f,n)[1][i] = upr(w,1); + t_set(f,n)[2][i] = upr(w,2); + t_set(f,n)[3][i] = upr(w,3); +#endif + w = bytes2word(b, 0, 0, 0); + +#if defined( FL1_SET ) /* tables for last encryption round (may also */ + t_set(f,l)[i] = w; /* be used in the key schedule) */ +#endif +#if defined( FL4_SET ) + t_set(f,l)[0][i] = w; + t_set(f,l)[1][i] = upr(w,1); + t_set(f,l)[2][i] = upr(w,2); + t_set(f,l)[3][i] = upr(w,3); +#endif + +#if defined( LS1_SET ) /* table for key schedule if t_set(f,l) above is*/ + t_set(l,s)[i] = w; /* not of the required form */ +#endif +#if defined( LS4_SET ) + t_set(l,s)[0][i] = w; + t_set(l,s)[1][i] = upr(w,1); + t_set(l,s)[2][i] = upr(w,2); + t_set(l,s)[3][i] = upr(w,3); +#endif + + b = gf_inv(inv_affine((uint8_t)i)); + w = bytes2word(fe(b), f9(b), fd(b), fb(b)); + +#if defined( IM1_SET ) /* tables for the inverse mix column operation */ + t_set(i,m)[b] = w; +#endif +#if defined( IM4_SET ) + t_set(i,m)[0][b] = w; + t_set(i,m)[1][b] = upr(w,1); + t_set(i,m)[2][b] = upr(w,2); + t_set(i,m)[3][b] = upr(w,3); +#endif + +#if defined( ISB_SET ) + t_set(i,box)[i] = b; +#endif +#if defined( IT1_SET ) /* tables for a normal decryption round */ + t_set(i,n)[i] = w; +#endif +#if defined( IT4_SET ) + t_set(i,n)[0][i] = w; + t_set(i,n)[1][i] = upr(w,1); + t_set(i,n)[2][i] = upr(w,2); + t_set(i,n)[3][i] = upr(w,3); +#endif + w = bytes2word(b, 0, 0, 0); +#if defined( IL1_SET ) /* tables for last decryption round */ + t_set(i,l)[i] = w; +#endif +#if defined( IL4_SET ) + t_set(i,l)[0][i] = w; + t_set(i,l)[1][i] = upr(w,1); + t_set(i,l)[2][i] = upr(w,2); + t_set(i,l)[3][i] = upr(w,3); +#endif + } + init = 1; + return EXIT_SUCCESS; +} + +#endif + +#if defined(__cplusplus) +} +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/aes/aestab.h b/lib/ESPiLight/pilight/libs/openzwave/aes/aestab.h new file mode 100644 index 0000000..d95a5fc --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/aes/aestab.h @@ -0,0 +1,173 @@ +/* +--------------------------------------------------------------------------- +Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. + +The redistribution and use of this software (with or without changes) +is allowed without the payment of fees or royalties provided that: + + source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation. + +This software is provided 'as is' with no explicit or implied warranties +in respect of its operation, including, but not limited to, correctness +and fitness for purpose. +--------------------------------------------------------------------------- +Issue Date: 20/12/2007 + + This file contains the code for declaring the tables needed to implement + AES. The file aesopt.h is assumed to be included before this header file. + If there are no global variables, the definitions here can be used to put + the AES tables in a structure so that a pointer can then be added to the + AES context to pass them to the AES routines that need them. If this + facility is used, the calling program has to ensure that this pointer is + managed appropriately. In particular, the value of the t_dec(in,it) item + in the table structure must be set to zero in order to ensure that the + tables are initialised. In practice the three code sequences in aeskey.c + that control the calls to aes_init() and the aes_init() routine itself will + have to be changed for a specific implementation. If global variables are + available it will generally be preferable to use them with the precomputed + FIXED_TABLES option that uses static global tables. + + The following defines can be used to control the way the tables + are defined, initialised and used in embedded environments that + require special features for these purposes + + the 't_dec' construction is used to declare fixed table arrays + the 't_set' construction is used to set fixed table values + the 't_use' construction is used to access fixed table values + + 256 byte tables: + + t_xxx(s,box) => forward S box + t_xxx(i,box) => inverse S box + + 256 32-bit word OR 4 x 256 32-bit word tables: + + t_xxx(f,n) => forward normal round + t_xxx(f,l) => forward last round + t_xxx(i,n) => inverse normal round + t_xxx(i,l) => inverse last round + t_xxx(l,s) => key schedule table + t_xxx(i,m) => key schedule table + + Other variables and tables: + + t_xxx(r,c) => the rcon table +*/ + +#if !defined( _AESTAB_H ) +#define _AESTAB_H + +#if defined(__cplusplus) +extern "C" { +#endif + +#define t_dec(m,n) t_##m##n +#define t_set(m,n) t_##m##n +#define t_use(m,n) t_##m##n + +#if defined(FIXED_TABLES) +# if !defined( __GNUC__ ) && (defined( __MSDOS__ ) || defined( __WIN16__ )) +/* make tables far data to avoid using too much DGROUP space (PG) */ +# define CONST const far +# else +# define CONST const +# endif +#else +# define CONST +#endif + +#if defined(DO_TABLES) +# define EXTERN +#else +# define EXTERN extern +#endif + +#if defined(_WIN32) && defined(TABLE_ALIGN) +#define ALIGN __declspec(align(TABLE_ALIGN)) +#else +#define ALIGN +#endif + +#if defined( __WATCOMC__ ) && ( __WATCOMC__ >= 1100 ) +# define XP_DIR __cdecl +#else +# define XP_DIR +#endif + +#if defined(DO_TABLES) && defined(FIXED_TABLES) +#define d_1(t,n,b,e) EXTERN ALIGN CONST XP_DIR t n[256] = b(e) +#define d_4(t,n,b,e,f,g,h) EXTERN ALIGN CONST XP_DIR t n[4][256] = { b(e), b(f), b(g), b(h) } +EXTERN ALIGN CONST uint32_t t_dec(r,c)[RC_LENGTH] = rc_data(w0); +#else +#define d_1(t,n,b,e) EXTERN ALIGN CONST XP_DIR t n[256] +#define d_4(t,n,b,e,f,g,h) EXTERN ALIGN CONST XP_DIR t n[4][256] +EXTERN ALIGN CONST uint32_t t_dec(r,c)[RC_LENGTH]; +#endif + +#if defined( SBX_SET ) + d_1(uint8_t, t_dec(s,box), sb_data, h0); +#endif +#if defined( ISB_SET ) + d_1(uint8_t, t_dec(i,box), isb_data, h0); +#endif + +#if defined( FT1_SET ) + d_1(uint32_t, t_dec(f,n), sb_data, u0); +#endif +#if defined( FT4_SET ) + d_4(uint32_t, t_dec(f,n), sb_data, u0, u1, u2, u3); +#endif + +#if defined( FL1_SET ) + d_1(uint32_t, t_dec(f,l), sb_data, w0); +#endif +#if defined( FL4_SET ) + d_4(uint32_t, t_dec(f,l), sb_data, w0, w1, w2, w3); +#endif + +#if defined( IT1_SET ) + d_1(uint32_t, t_dec(i,n), isb_data, v0); +#endif +#if defined( IT4_SET ) + d_4(uint32_t, t_dec(i,n), isb_data, v0, v1, v2, v3); +#endif + +#if defined( IL1_SET ) + d_1(uint32_t, t_dec(i,l), isb_data, w0); +#endif +#if defined( IL4_SET ) + d_4(uint32_t, t_dec(i,l), isb_data, w0, w1, w2, w3); +#endif + +#if defined( LS1_SET ) +#if defined( FL1_SET ) +#undef LS1_SET +#else + d_1(uint32_t, t_dec(l,s), sb_data, w0); +#endif +#endif + +#if defined( LS4_SET ) +#if defined( FL4_SET ) +#undef LS4_SET +#else + d_4(uint32_t, t_dec(l,s), sb_data, w0, w1, w2, w3); +#endif +#endif + +#if defined( IM1_SET ) + d_1(uint32_t, t_dec(i,m), mm_data, v0); +#endif +#if defined( IM4_SET ) + d_4(uint32_t, t_dec(i,m), mm_data, v0, v1, v2, v3); +#endif + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/aes/brg_endian.h b/lib/ESPiLight/pilight/libs/openzwave/aes/brg_endian.h new file mode 100644 index 0000000..b44c5cb --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/aes/brg_endian.h @@ -0,0 +1,126 @@ +/* +--------------------------------------------------------------------------- +Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. + +The redistribution and use of this software (with or without changes) +is allowed without the payment of fees or royalties provided that: + + source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation. + +This software is provided 'as is' with no explicit or implied warranties +in respect of its operation, including, but not limited to, correctness +and fitness for purpose. +--------------------------------------------------------------------------- +Issue Date: 20/12/2007 +*/ + +#ifndef _BRG_ENDIAN_H +#define _BRG_ENDIAN_H + +#define IS_BIG_ENDIAN 4321 /* byte 0 is most significant (mc68k) */ +#define IS_LITTLE_ENDIAN 1234 /* byte 0 is least significant (i386) */ + +/* Include files where endian defines and byteswap functions may reside */ +#if defined( __sun ) +# include +#elif defined( __FreeBSD__ ) || defined( __OpenBSD__ ) || defined( __NetBSD__ ) +# include +#elif defined( BSD ) && ( BSD >= 199103 ) || defined( __APPLE__ ) || \ + defined( __CYGWIN32__ ) || defined( __DJGPP__ ) || defined( __osf__ ) +# include +#elif defined( __linux__ ) || defined( __GNUC__ ) || defined( __GNU_LIBRARY__ ) +# if !defined( __MINGW32__ ) && !defined( _AIX ) +# include +# if !defined( __BEOS__ ) +# include +# endif +# endif +#endif + +/* Now attempt to set the define for platform byte order using any */ +/* of the four forms SYMBOL, _SYMBOL, __SYMBOL & __SYMBOL__, which */ +/* seem to encompass most endian symbol definitions */ + +#if defined( BIG_ENDIAN ) && defined( LITTLE_ENDIAN ) +# if defined( BYTE_ORDER ) && BYTE_ORDER == BIG_ENDIAN +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +# elif defined( BYTE_ORDER ) && BYTE_ORDER == LITTLE_ENDIAN +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +# endif +#elif defined( BIG_ENDIAN ) +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +#elif defined( LITTLE_ENDIAN ) +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +#endif + +#if defined( _BIG_ENDIAN ) && defined( _LITTLE_ENDIAN ) +# if defined( _BYTE_ORDER ) && _BYTE_ORDER == _BIG_ENDIAN +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +# elif defined( _BYTE_ORDER ) && _BYTE_ORDER == _LITTLE_ENDIAN +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +# endif +#elif defined( _BIG_ENDIAN ) +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +#elif defined( _LITTLE_ENDIAN ) +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +#endif + +#if defined( __BIG_ENDIAN ) && defined( __LITTLE_ENDIAN ) +# if defined( __BYTE_ORDER ) && __BYTE_ORDER == __BIG_ENDIAN +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +# elif defined( __BYTE_ORDER ) && __BYTE_ORDER == __LITTLE_ENDIAN +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +# endif +#elif defined( __BIG_ENDIAN ) +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +#elif defined( __LITTLE_ENDIAN ) +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +#endif + +#if defined( __BIG_ENDIAN__ ) && defined( __LITTLE_ENDIAN__ ) +# if defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __BIG_ENDIAN__ +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +# elif defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __LITTLE_ENDIAN__ +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +# endif +#elif defined( __BIG_ENDIAN__ ) +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +#elif defined( __LITTLE_ENDIAN__ ) +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +#endif + +/* if the platform byte order could not be determined, then try to */ +/* set this define using common machine defines */ +#if !defined(PLATFORM_BYTE_ORDER) + +#if defined( __alpha__ ) || defined( __alpha ) || defined( i386 ) || \ + defined( __i386__ ) || defined( _M_I86 ) || defined( _M_IX86 ) || \ + defined( __OS2__ ) || defined( sun386 ) || defined( __TURBOC__ ) || \ + defined( vax ) || defined( vms ) || defined( VMS ) || \ + defined( __VMS ) || defined( _M_X64 ) +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN + +#elif defined( AMIGA ) || defined( applec ) || defined( __AS400__ ) || \ + defined( _CRAY ) || defined( __hppa ) || defined( __hp9000 ) || \ + defined( ibm370 ) || defined( mc68000 ) || defined( m68k ) || \ + defined( __MRC__ ) || defined( __MVS__ ) || defined( __MWERKS__ ) || \ + defined( sparc ) || defined( __sparc) || defined( SYMANTEC_C ) || \ + defined( __VOS__ ) || defined( __TIGCC__ ) || defined( __TANDEM ) || \ + defined( THINK_C ) || defined( __VMCMS__ ) || defined( _AIX ) +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN + +#elif 0 /* **** EDIT HERE IF NECESSARY **** */ +# define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN +#elif 0 /* **** EDIT HERE IF NECESSARY **** */ +# define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN +#else +# error Please edit lines 126 or 128 in brg_endian.h to set the platform byte order +#endif + +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/aes/brg_types.h b/lib/ESPiLight/pilight/libs/openzwave/aes/brg_types.h new file mode 100644 index 0000000..0d16baa --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/aes/brg_types.h @@ -0,0 +1,191 @@ +/* +--------------------------------------------------------------------------- +Copyright (c) 1998-2013, Brian Gladman, Worcester, UK. All rights reserved. + +The redistribution and use of this software (with or without changes) +is allowed without the payment of fees or royalties provided that: + + source code distributions include the above copyright notice, this + list of conditions and the following disclaimer; + + binary distributions include the above copyright notice, this list + of conditions and the following disclaimer in their documentation. + +This software is provided 'as is' with no explicit or implied warranties +in respect of its operation, including, but not limited to, correctness +and fitness for purpose. +--------------------------------------------------------------------------- +Issue Date: 20/12/2007 + + The unsigned integer types defined here are of the form uint_t where + is the length of the type; for example, the unsigned 32-bit type is + 'uint32_t'. These are NOT the same as the 'C99 integer types' that are + defined in the inttypes.h and stdint.h headers since attempts to use these + types have shown that support for them is still highly variable. However, + since the latter are of the form uint_t, a regular expression search + and replace (in VC++ search on 'uint_{:z}t' and replace with 'uint\1_t') + can be used to convert the types used here to the C99 standard types. +*/ + +#ifndef _BRG_TYPES_H +#define _BRG_TYPES_H + +#if defined(__cplusplus) +extern "C" { +#endif + +#include +#include + +#if defined( _WIN32 ) && ( _WIN32 >= 1300 ) +# include +# define ptrint_t intptr_t +#elif defined( __ECOS__ ) +# define intptr_t unsigned int +# define ptrint_t intptr_t +#elif defined( __GNUC__ ) && ( __GNUC__ >= 3 ) +# define ptrint_t intptr_t +#else +# define ptrint_t int +#endif + +#ifndef BRG_UI32 +# define BRG_UI32 +# if UINT_MAX == 4294967295u +# define li_32(h) 0x##h##u +# elif ULONG_MAX == 4294967295u +# define li_32(h) 0x##h##ul +# elif defined( _CRAY ) +# error This code needs 32-bit data types, which Cray machines do not provide +# else +# error Please define uint32_t as a 32-bit unsigned integer type in brg_types.h +# endif +#endif + +#ifndef BRG_UI64 +# if defined( __BORLANDC__ ) && !defined( __MSDOS__ ) +# define BRG_UI64 +# define li_64(h) 0x##h##ui64 +# elif defined( _WIN32 ) && ( _WIN32 < 1300 ) /* 1300 == VC++ 7.0 */ +# define BRG_UI64 +# define li_64(h) 0x##h##ui64 +# elif defined( __sun ) && defined( ULONG_MAX ) && ULONG_MAX == 0xfffffffful +# define BRG_UI64 +# define li_64(h) 0x##h##ull +# elif defined( __MVS__ ) +# define BRG_UI64 +# define li_64(h) 0x##h##ull +# elif defined( UINT_MAX ) && UINT_MAX > 4294967295u +# if UINT_MAX == 18446744073709551615u +# define BRG_UI64 +# define li_64(h) 0x##h##u +# endif +# elif defined( ULONG_MAX ) && ULONG_MAX > 4294967295u +# if ULONG_MAX == 18446744073709551615ul +# define BRG_UI64 +# define li_64(h) 0x##h##ul +# endif +# elif defined( ULLONG_MAX ) && ULLONG_MAX > 4294967295u +# if ULLONG_MAX == 18446744073709551615ull +# define BRG_UI64 +# define li_64(h) 0x##h##ull +# endif +# elif defined( ULONG_LONG_MAX ) && ULONG_LONG_MAX > 4294967295u +# if ULONG_LONG_MAX == 18446744073709551615ull +# define BRG_UI64 +# define li_64(h) 0x##h##ull +# endif +# endif +#endif + +#if !defined( BRG_UI64 ) +# if defined( NEED_UINT_64T ) +# error Please define uint64_t as an unsigned 64 bit type in brg_types.h +# endif +#endif + +#ifndef RETURN_VALUES +# define RETURN_VALUES +# if defined( DLL_EXPORT ) +# if defined( _WIN32 ) || defined ( __INTEL_COMPILER ) +# define VOID_RETURN __declspec( dllexport ) void __stdcall +# define INT_RETURN __declspec( dllexport ) int __stdcall +# elif defined( __GNUC__ ) +# define VOID_RETURN __declspec( __dllexport__ ) void +# define INT_RETURN __declspec( __dllexport__ ) int +# else +# error Use of the DLL is only available on the Microsoft, Intel and GCC compilers +# endif +# elif defined( DLL_IMPORT ) +# if defined( _WIN32 ) || defined ( __INTEL_COMPILER ) +# define VOID_RETURN __declspec( dllimport ) void __stdcall +# define INT_RETURN __declspec( dllimport ) int __stdcall +# elif defined( __GNUC__ ) +# define VOID_RETURN __declspec( __dllimport__ ) void +# define INT_RETURN __declspec( __dllimport__ ) int +# else +# error Use of the DLL is only available on the Microsoft, Intel and GCC compilers +# endif +# elif defined( __WATCOMC__ ) +# define VOID_RETURN void __cdecl +# define INT_RETURN int __cdecl +# else +# define VOID_RETURN void +# define INT_RETURN int +# endif +#endif + +/* These defines are used to detect and set the memory alignment of pointers. + Note that offsets are in bytes. + + ALIGN_OFFSET(x,n) return the positive or zero offset of + the memory addressed by the pointer 'x' + from an address that is aligned on an + 'n' byte boundary ('n' is a power of 2) + + ALIGN_FLOOR(x,n) return a pointer that points to memory + that is aligned on an 'n' byte boundary + and is not higher than the memory address + pointed to by 'x' ('n' is a power of 2) + + ALIGN_CEIL(x,n) return a pointer that points to memory + that is aligned on an 'n' byte boundary + and is not lower than the memory address + pointed to by 'x' ('n' is a power of 2) +*/ + +#define ALIGN_OFFSET(x,n) (((ptrint_t)(x)) & ((n) - 1)) +#define ALIGN_FLOOR(x,n) ((uint8_t*)(x) - ( ((ptrint_t)(x)) & ((n) - 1))) +#define ALIGN_CEIL(x,n) ((uint8_t*)(x) + (-((ptrint_t)(x)) & ((n) - 1))) + +/* These defines are used to declare buffers in a way that allows + faster operations on longer variables to be used. In all these + defines 'size' must be a power of 2 and >= 8. NOTE that the + buffer size is in bytes but the type length is in bits + + UNIT_TYPEDEF(x,size) declares a variable 'x' of length + 'size' bits + + BUFR_TYPEDEF(x,size,bsize) declares a buffer 'x' of length 'bsize' + bytes defined as an array of variables + each of 'size' bits (bsize must be a + multiple of size / 8) + + UNIT_CAST(x,size) casts a variable to a type of + length 'size' bits + + UPTR_CAST(x,size) casts a pointer to a pointer to a + varaiable of length 'size' bits +*/ + +#define UI_TYPE(size) uint##size##_t +#define UNIT_TYPEDEF(x,size) typedef UI_TYPE(size) x +#define BUFR_TYPEDEF(x,size,bsize) typedef UI_TYPE(size) x[bsize / (size >> 3)] +#define UNIT_CAST(x,size) ((UI_TYPE(size) )(x)) +#define UPTR_CAST(x,size) ((UI_TYPE(size)*)(x)) + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Alarm.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Alarm.cpp new file mode 100644 index 0000000..870d123 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Alarm.cpp @@ -0,0 +1,148 @@ +//----------------------------------------------------------------------------- +// +// Alarm.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_ALARM +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "Alarm.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueByte.h" + +using namespace OpenZWave; + +enum AlarmCmd +{ + AlarmCmd_Get = 0x04, + AlarmCmd_Report = 0x05 +}; + +enum +{ + AlarmIndex_Type = 0, + AlarmIndex_Level +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool Alarm::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Dynamic ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool Alarm::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( IsGetSupported() ) + { + Msg* msg = new Msg( "AlarmCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( AlarmCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "AlarmCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Alarm::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if (AlarmCmd_Report == (AlarmCmd)_data[0]) + { + // We have received a report from the Z-Wave device + Log::Write( LogLevel_Info, GetNodeId(), "Received Alarm report: type=%d, level=%d", _data[1], _data[2] ); + + ValueByte* value; + if( (value = static_cast( GetValue( _instance, AlarmIndex_Type ) )) ) + { + value->OnValueRefreshed( _data[1] ); + value->Release(); + } + if( (value = static_cast( GetValue( _instance, AlarmIndex_Level ) )) ) + { + value->OnValueRefreshed( _data[2] ); + value->Release(); + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void Alarm::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueByte( ValueID::ValueGenre_User, GetCommandClassId(), _instance, AlarmIndex_Type, "Alarm Type", "", true, false, 0, 0 ); + node->CreateValueByte( ValueID::ValueGenre_User, GetCommandClassId(), _instance, AlarmIndex_Level, "Alarm Level", "", true, false, 0, 0 ); + } +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Alarm.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Alarm.h new file mode 100644 index 0000000..becc4a9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Alarm.h @@ -0,0 +1,71 @@ +//----------------------------------------------------------------------------- +// +// Alarm.h +// +// Implementation of the Z-Wave COMMAND_CLASS_ALARM +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Alarm_H +#define _Alarm_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueByte; + + /** \brief Implements COMMAND_CLASS_ALARM (0x71), a Z-Wave device command class. + */ + class Alarm: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Alarm( _homeId, _nodeId ); } + virtual ~Alarm(){} + + /** \brief Get command class ID (1 byte) identifying this command class. */ + static uint8 const StaticGetCommandClassId(){ return 0x71; } + /** \brief Get a string containing the name of this command class. */ + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_ALARM"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + /** \brief Get command class ID (1 byte) identifying this command class. (Inherited from CommandClass) */ + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + /** \brief Get a string containing the name of this command class. (Inherited from CommandClass) */ + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + /** \brief Handle a response to a message associated with this command class. (Inherited from CommandClass) */ + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + virtual uint8 GetMaxVersion(){ return 2; } + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + Alarm( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ApplicationStatus.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ApplicationStatus.cpp new file mode 100644 index 0000000..94b1525 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ApplicationStatus.cpp @@ -0,0 +1,93 @@ +//----------------------------------------------------------------------------- +// +// ApplicationStatus.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_APPLICATION_STATUS +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "ApplicationStatus.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../platform/Log.h" + +using namespace OpenZWave; + +enum ApplicationStatusCmd +{ + ApplicationStatusCmd_Busy = 0x01, + ApplicationStatusCmd_RejectedRequest = 0x02 +}; + + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool ApplicationStatus::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( ApplicationStatusCmd_Busy == (ApplicationStatusCmd)_data[0] ) + { + char msg[64]; + switch( _data[1] ) + { + case 0: + { + snprintf( msg, sizeof(msg), "Try again later" ); + break; + } + case 1: + { + snprintf( msg, sizeof(msg), "Try again in %d seconds", _data[2] ); + break; + } + case 2: + { + snprintf( msg, sizeof(msg), "Request queued, will be executed later" ); + break; + } + default: + { + // Invalid status + snprintf( msg, sizeof(msg), "Unknown status %d", _data[1] ); + } + } + Log::Write( LogLevel_Info, GetNodeId(), "Received Application Status Busy: %s", msg ); + return true; + } + + if( ApplicationStatusCmd_RejectedRequest == (ApplicationStatusCmd)_data[0] ) + { + Log::Write( LogLevel_Info, "Received Application Rejected Request: Status=%d", _data[1] ); + return true; + } + + return false; +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ApplicationStatus.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ApplicationStatus.h new file mode 100644 index 0000000..02a491b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ApplicationStatus.h @@ -0,0 +1,58 @@ +//----------------------------------------------------------------------------- +// +// ApplicationStatus.h +// +// Implementation of the Z-Wave COMMAND_CLASS_APPLICATION_STATUS +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ApplicationStatus_H +#define _ApplicationStatus_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_APPLICATION_STATUS (0x22), a Z-Wave device command class. + */ + class ApplicationStatus: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new ApplicationStatus( _homeId, _nodeId ); } + virtual ~ApplicationStatus(){} + + static uint8 const StaticGetCommandClassId(){ return 0x22; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_APPLICATION_STATUS"; } + + // From CommandClass + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + private: + ApplicationStatus( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Association.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Association.cpp new file mode 100644 index 0000000..534ecfb --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Association.cpp @@ -0,0 +1,390 @@ +//----------------------------------------------------------------------------- +// +// Association.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_ASSOCIATION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "../tinyxml.h" +#include "CommandClasses.h" +#include "Association.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../Node.h" +#include "../Group.h" +#include "../platform/Log.h" + +using namespace OpenZWave; + +enum AssociationCmd +{ + AssociationCmd_Set = 0x01, + AssociationCmd_Get = 0x02, + AssociationCmd_Report = 0x03, + AssociationCmd_Remove = 0x04, + AssociationCmd_GroupingsGet = 0x05, + AssociationCmd_GroupingsReport = 0x06 +}; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Association::Association +( + uint32 const _homeId, + uint8 const _nodeId +): + CommandClass( _homeId, _nodeId ), + m_queryAll(false), + m_numGroups(0) +{ + SetStaticRequest( StaticRequest_Values ); +} + +//----------------------------------------------------------------------------- +// +// Read the saved association data +//----------------------------------------------------------------------------- +void Association::ReadXML +( + TiXmlElement const* _ccElement +) +{ + CommandClass::ReadXML( _ccElement ); + + TiXmlElement const* associationsElement = _ccElement->FirstChildElement(); + while( associationsElement ) + { + char const* str = associationsElement->Value(); + if( str && !strcmp( str, "Associations" ) ) + { + int intVal; + if( TIXML_SUCCESS == associationsElement->QueryIntAttribute( "num_groups", &intVal ) ) + { + m_numGroups = (uint8)intVal; + } + + TiXmlElement const* groupElement = associationsElement->FirstChildElement(); + while( groupElement ) + { + if( Node* node = GetNodeUnsafe() ) + { + Group* group = new Group( GetHomeId(), GetNodeId(), groupElement ); + node->AddGroup( group ); + } + + groupElement = groupElement->NextSiblingElement(); + } + + break; + } + + associationsElement = associationsElement->NextSiblingElement(); + } +} + +//----------------------------------------------------------------------------- +// +// Save the association data +//----------------------------------------------------------------------------- +void Association::WriteXML +( + TiXmlElement* _ccElement +) +{ + CommandClass::WriteXML( _ccElement ); + + if( Node* node = GetNodeUnsafe() ) + { + TiXmlElement* associationsElement = new TiXmlElement( "Associations" ); + + char str[8]; + snprintf( str, 8, "%d", m_numGroups ); + associationsElement->SetAttribute( "num_groups", str ); + + _ccElement->LinkEndChild( associationsElement ); + node->WriteGroups( associationsElement ); + } +} + +//----------------------------------------------------------------------------- +// +// Nothing to do for Association +//----------------------------------------------------------------------------- +bool Association::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( ( _requestFlags & RequestFlag_Static ) && HasStaticRequest( StaticRequest_Values ) ) + { + // Request the supported group info + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Nothing to do for Association +//----------------------------------------------------------------------------- +bool Association::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _instance != 1 ) + { + // This command class doesn't work with multiple instances + return false; + } + // Request the supported group info + Msg* msg = new Msg( "Get Association Groupings", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( AssociationCmd_GroupingsGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Request the contents of each group in turn +//----------------------------------------------------------------------------- +void Association::RequestAllGroups +( + uint32 const _requestFlags +) +{ + m_queryAll = true; + + // Request the contents of the individual groups in turn. + if( m_numGroups == 0xff ) + { + // We start with group 255, and will then move to group 1, 2 etc and stop when we find a group with a maxAssociations of zero. + Log::Write( LogLevel_Info, GetNodeId(), "Number of association groups reported for node %d is 255, which requires special case handling.", GetNodeId() ); + QueryGroup( 0xff, _requestFlags ); + } + else + { + // We start with group 1, and will then move to group 2, 3 etc and stop when the group index is greater than m_numGroups. + Log::Write( LogLevel_Info, GetNodeId(), "Number of association groups reported for node %d is %d.", GetNodeId(), m_numGroups ); + QueryGroup( 1, _requestFlags ); + } +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Association::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + bool handled = false; + uint32 i; + + if( Node* node = GetNodeUnsafe() ) + { + if( AssociationCmd_GroupingsReport == (AssociationCmd)_data[0] ) + { + // Retrieve the number of groups this device supports. + // The groups will be queried with the session data. + m_numGroups = _data[1]; + Log::Write( LogLevel_Info, GetNodeId(), "Received Association Groupings report from node %d. Number of groups is %d", GetNodeId(), m_numGroups ); + ClearStaticRequest( StaticRequest_Values ); + handled = true; + } + else if( AssociationCmd_Report == (AssociationCmd)_data[0] ) + { + // Get the group info + uint8 groupIdx = _data[1]; + uint8 maxAssociations = _data[2]; // If the maxAssociations is zero, this is not a supported group. + uint8 numReportsToFollow = _data[3]; // If a device supports a lot of associations, they may come in more than one message. + + if( maxAssociations ) + { + if( _length >= 5 ) + { + uint8 numAssociations = _length - 5; + + Log::Write( LogLevel_Info, GetNodeId(), "Received Association report from node %d, group %d, containing %d associations", GetNodeId(), groupIdx, numAssociations ); + if( numAssociations ) + { + Log::Write( LogLevel_Info, GetNodeId(), " The group contains:" ); + for( i=0; iGetGroup( groupIdx ); + if( NULL == group ) + { + // Group has not been created yet + group = new Group( GetHomeId(), GetNodeId(), groupIdx, maxAssociations ); + node->AddGroup( group ); + } + + // Update the group with its new contents + group->OnGroupChanged( m_pendingMembers ); + m_pendingMembers.clear(); + } + } + else + { + // maxAssociations is zero, so we've reached the end of the query process + Log::Write( LogLevel_Info, GetNodeId(), "Max associations for node %d, group %d is zero. Querying associations for this node is complete.", GetNodeId(), groupIdx ); + node->AutoAssociate(); + m_queryAll = false; + } + + if( m_queryAll ) + { + // Work out which is the next group we will query. + // If we are currently on group 255, the next group will be 1. + uint8 nextGroup = groupIdx + 1; + if( !nextGroup ) + { + nextGroup = 1; + } + + if( nextGroup <= m_numGroups ) + { + // Query the next group + QueryGroup( nextGroup, 0 ); + } + else + { + // We're all done + Log::Write( LogLevel_Info, GetNodeId(), "Querying associations for node %d is complete.", GetNodeId() ); + node->AutoAssociate(); + m_queryAll = false; + } + } + + handled = true; + } + } + + return handled; +} + +//----------------------------------------------------------------------------- +// +// Request details of an association group +//----------------------------------------------------------------------------- +void Association::QueryGroup +( + uint8 _groupIdx, + uint32 const _requestFlags +) +{ + if ( IsGetSupported() ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Get Associations for group %d of node %d", _groupIdx, GetNodeId() ); + Msg* msg = new Msg( "Get Associations", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( AssociationCmd_Get ); + msg->Append( _groupIdx ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "AssociationCmd_Get Not Supported on this node"); + } + return; +} +//----------------------------------------------------------------------------- +// +// Add an association between devices +//----------------------------------------------------------------------------- +void Association::Set +( + uint8 _groupIdx, + uint8 _targetNodeId +) +{ + Log::Write( LogLevel_Info, GetNodeId(), "Association::Set - Adding node %d to group %d of node %d", _targetNodeId, _groupIdx, GetNodeId() ); + + Msg* msg = new Msg( "Association Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->Append( GetNodeId() ); + msg->Append( 4 ); + msg->Append( GetCommandClassId() ); + msg->Append( AssociationCmd_Set ); + msg->Append( _groupIdx ); + msg->Append( _targetNodeId ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); +} + +//----------------------------------------------------------------------------- +// +// Remove an association between devices +//----------------------------------------------------------------------------- +void Association::Remove +( + uint8 _groupIdx, + uint8 _targetNodeId +) +{ + Log::Write( LogLevel_Info, GetNodeId(), "Association::Remove - Removing node %d from group %d of node %d", _targetNodeId, _groupIdx, GetNodeId() ); + + Msg* msg = new Msg( "Association Remove", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->Append( GetNodeId() ); + msg->Append( 4 ); + msg->Append( GetCommandClassId() ); + msg->Append( AssociationCmd_Remove ); + msg->Append( _groupIdx ); + msg->Append( _targetNodeId ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Association.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Association.h new file mode 100644 index 0000000..552ca57 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Association.h @@ -0,0 +1,75 @@ +//----------------------------------------------------------------------------- +// +// Association.h +// +// Implementation of the Z-Wave COMMAND_CLASS_ASSOCIATION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Association_H +#define _Association_H + +#include +#include "CommandClass.h" + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_ASSOCIATION (0x85), a Z-Wave device command class. + */ + class Association: public CommandClass + { + friend class Group; + + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Association( _homeId, _nodeId ); } + virtual ~Association(){} + + static uint8 const StaticGetCommandClassId(){ return 0x85; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_ASSOCIATION"; } + + // From CommandClass + virtual void ReadXML( TiXmlElement const* _ccElement ); + virtual void WriteXML( TiXmlElement* _ccElement ); + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + void RequestAllGroups( uint32 const _requestFlags ); + void Set( uint8 const _group, uint8 const _nodeId ); + void Remove( uint8 const _group, uint8 const _nodeId ); + + private: + Association( uint32 const _homeId, uint8 const _nodeId ); + void QueryGroup( uint8 _groupIdx, uint32 const _requestFlags ); + void AutoAssociate(); + + bool m_queryAll; // When true, once a group has been queried, we request the next one. + uint8 m_numGroups; // Number of groups supported by the device. 255 is reported by certain manufacturers and requires special handling. + vector m_pendingMembers; // Used to build a list of group members from multiple reports + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/AssociationCommandConfiguration.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/AssociationCommandConfiguration.cpp new file mode 100644 index 0000000..4f101e0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/AssociationCommandConfiguration.cpp @@ -0,0 +1,281 @@ +//----------------------------------------------------------------------------- +// +// AssociationCommandConfiguration.cpp +// +// Implementation of the COMMAND_CLASS_ASSOCIATION_COMMAND_CONFIGURATION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "AssociationCommandConfiguration.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Group.h" +#include "../Driver.h" +#include "../platform/Log.h" +#include "../value_classes/ValueBool.h" +#include "../value_classes/ValueByte.h" +#include "../value_classes/ValueShort.h" + +using namespace OpenZWave; + +enum AssociationCommandConfigurationCmd +{ + AssociationCommandConfigurationCmd_SupportedRecordsGet = 0x01, + AssociationCommandConfigurationCmd_SupportedRecordsReport = 0x02, + AssociationCommandConfigurationCmd_Set = 0x03, + AssociationCommandConfigurationCmd_Get = 0x04, + AssociationCommandConfigurationCmd_Report = 0x05 +}; + +enum +{ + AssociationCommandConfigurationIndex_MaxCommandLength = 0, + AssociationCommandConfigurationIndex_CommandsAreValues, + AssociationCommandConfigurationIndex_CommandsAreConfigurable, + AssociationCommandConfigurationIndex_NumFreeCommands, + AssociationCommandConfigurationIndex_MaxCommands +}; + + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool AssociationCommandConfiguration::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Session ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool AssociationCommandConfiguration::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _instance != 1 ) + { + // This command class doesn't work with multiple instances + return false; + } + + Msg* msg = new Msg( "AssociationCommandConfigurationCmd_SupportedRecordsGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( AssociationCommandConfigurationCmd_SupportedRecordsGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Request the command data +//----------------------------------------------------------------------------- +void AssociationCommandConfiguration::RequestCommands +( + uint8 const _groupIdx, + uint8 const _nodeId +) +{ + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "AssociationCommandConfigurationCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 4 ); + msg->Append( GetCommandClassId() ); + msg->Append( AssociationCommandConfigurationCmd_Get ); + msg->Append( _groupIdx ); + msg->Append( _nodeId ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + } else { + Log::Write( LogLevel_Info, GetNodeId(), "AssociationCommandConfigurationCmd_Get Not Supported on this node"); + } +} +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool AssociationCommandConfiguration::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if (AssociationCommandConfigurationCmd_SupportedRecordsReport == (AssociationCommandConfigurationCmd)_data[0]) + { + uint8 maxCommandLength = _data[1] >> 2; + bool commandsAreValues = ( (_data[1] & 0x02) != 0 ); + bool commandsAreConfigurable = ( (_data[1] & 0x01) != 0 ); + int16 numFreeCommands = (((int16)_data[2])<<16) | (int16)_data[3]; + int16 maxCommands = (((int16)_data[4])<<16) | (int16)_data[5]; + + Log::Write( LogLevel_Info, GetNodeId(), "Received AssociationCommandConfiguration Supported Records Report:" ); + Log::Write( LogLevel_Info, GetNodeId(), " Maximum command length = %d bytes", maxCommandLength ); + Log::Write( LogLevel_Info, GetNodeId(), " Maximum number of commands = %d", maxCommands ); + Log::Write( LogLevel_Info, GetNodeId(), " Number of free commands = %d", numFreeCommands ); + Log::Write( LogLevel_Info, GetNodeId(), " Commands are %s and are %s", commandsAreValues ? "values" : "not values", commandsAreConfigurable ? "configurable" : "not configurable" ); + + ValueBool* valueBool; + ValueByte* valueByte; + ValueShort* valueShort; + + if( (valueByte = static_cast( GetValue( _instance, AssociationCommandConfigurationIndex_MaxCommandLength ) )) ) + { + valueByte->OnValueRefreshed( maxCommandLength ); + valueByte->Release(); + } + + if( (valueBool = static_cast( GetValue( _instance, AssociationCommandConfigurationIndex_CommandsAreValues ) )) ) + { + valueBool->OnValueRefreshed( commandsAreValues ); + valueBool->Release(); + } + + if( (valueBool = static_cast( GetValue( _instance, AssociationCommandConfigurationIndex_CommandsAreConfigurable ) )) ) + { + valueBool->OnValueRefreshed( commandsAreConfigurable ); + valueBool->Release(); + } + + if( (valueShort = static_cast( GetValue( _instance, AssociationCommandConfigurationIndex_NumFreeCommands ) )) ) + { + valueShort->OnValueRefreshed( numFreeCommands ); + valueShort->Release(); + } + + if( (valueShort = static_cast( GetValue( _instance, AssociationCommandConfigurationIndex_MaxCommands ) )) ) + { + valueShort->OnValueRefreshed( maxCommands ); + valueShort->Release(); + } + return true; + } + + if (AssociationCommandConfigurationCmd_Report == (AssociationCommandConfigurationCmd)_data[0]) + { + uint8 groupIdx = _data[1]; + uint8 nodeIdx = _data[2]; + bool firstReports = ( ( _data[3] & 0x80 ) != 0 ); // True if this is the first message containing commands for this group and node. + uint8 numReports = _data[3] & 0x0f; + + Log::Write( LogLevel_Info, GetNodeId(), "Received AssociationCommandConfiguration Report from:" ); + Log::Write( LogLevel_Info, GetNodeId(), " Commands for node %d in group %d,", nodeIdx, groupIdx ); + + if( Node* node = GetNodeUnsafe() ) + { + Group* group = node->GetGroup( groupIdx ); + if( NULL == group ) + { + if( firstReports ) + { + // This is the first report message, so we should clear any existing command data + group->ClearCommands( nodeIdx ); + } + + uint8 const* start = &_data[4]; + + for( uint8 i=0; iAddCommand( nodeIdx, length, start+1 ); + start += length; + } + } + } + + return true; + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void AssociationCommandConfiguration::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueByte ( ValueID::ValueGenre_System, GetCommandClassId(), _instance, AssociationCommandConfigurationIndex_MaxCommandLength, "Max Command Length", "", true, false, 0, 0 ); + node->CreateValueBool ( ValueID::ValueGenre_System, GetCommandClassId(), _instance, AssociationCommandConfigurationIndex_CommandsAreValues, "Commands are Values", "", true, false, false, 0 ); + node->CreateValueBool ( ValueID::ValueGenre_System, GetCommandClassId(), _instance, AssociationCommandConfigurationIndex_CommandsAreConfigurable, "Commands are Configurable", "", true, false, false, 0 ); + node->CreateValueShort( ValueID::ValueGenre_System, GetCommandClassId(), _instance, AssociationCommandConfigurationIndex_NumFreeCommands, "Free Commands", "", true, false, 0, 0 ); + node->CreateValueShort( ValueID::ValueGenre_System, GetCommandClassId(), _instance, AssociationCommandConfigurationIndex_MaxCommands, "Max Commands", "", true, false, 0, 0 ); + } +} + +//----------------------------------------------------------------------------- +// +// Set a command for the association +//----------------------------------------------------------------------------- +void AssociationCommandConfiguration::SetCommand +( + uint8 const _groupIdx, + uint8 const _nodeId, + uint8 const _length, + uint8 const* _data +) +{ + Msg* msg = new Msg( "AssociationCommandConfigurationCmd_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( _length + 5 ); + msg->Append( GetCommandClassId() ); + msg->Append( AssociationCommandConfigurationCmd_Set ); + msg->Append( _groupIdx ); + msg->Append( _nodeId ); + msg->Append( _length ); + + for( uint8 i=0; i<_length; ++i ) + { + msg->Append( _data[i] ); + } + + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); +} + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/AssociationCommandConfiguration.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/AssociationCommandConfiguration.h new file mode 100644 index 0000000..dd9abe7 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/AssociationCommandConfiguration.h @@ -0,0 +1,70 @@ +//----------------------------------------------------------------------------- +// +// AssociationCommandConfiguration.h +// +// Implementation of the COMMAND_CLASS_ASSOCIATION_COMMAND_CONFIGURATION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _AssociationCommandConfiguration_H +#define _AssociationCommandConfiguration_H + +#include "CommandClass.h" +#include "../value_classes/ValueBool.h" +#include "../value_classes/ValueByte.h" +#include "../value_classes/ValueShort.h" + + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_ASSOCIATION_COMMAND_CONFIGURATION (0x9b), a Z-Wave device command class. + */ + + class AssociationCommandConfiguration: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new AssociationCommandConfiguration( _homeId, _nodeId ); } + virtual ~AssociationCommandConfiguration(){} + + static uint8 const StaticGetCommandClassId(){ return 0x9b; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_ASSOCIATION_COMMAND_CONFIGURATION"; } + + void RequestCommands( uint8 const _groupIdx, uint8 const _nodeId ); + void SetCommand( uint8 const _groupIdx, uint8 const _nodeId, uint8 const _length, uint8 const* _data ); + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + AssociationCommandConfiguration( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Basic.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Basic.cpp new file mode 100644 index 0000000..fd2f7db --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Basic.cpp @@ -0,0 +1,345 @@ +//----------------------------------------------------------------------------- +// +// Basic.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_BASIC +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "Basic.h" +#include "Association.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../Notification.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueByte.h" +#include "NoOperation.h" + +#include "../tinyxml.h" + +using namespace OpenZWave; + +enum BasicCmd +{ + BasicCmd_Set = 0x01, + BasicCmd_Get = 0x02, + BasicCmd_Report = 0x03 +}; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Basic::Basic +( + uint32 const _homeId, + uint8 const _nodeId +): + CommandClass( _homeId, _nodeId ), + m_mapping( 0 ), + m_ignoreMapping( false ), + m_setAsReport( false ) +{ +} + +//----------------------------------------------------------------------------- +// +// Read configuration. +//----------------------------------------------------------------------------- +void Basic::ReadXML +( + TiXmlElement const* _ccElement +) +{ + CommandClass::ReadXML( _ccElement ); + + char const* str = _ccElement->Attribute("ignoremapping"); + if( str ) + { + m_ignoreMapping = !strcmp( str, "true"); + } + + int32 intVal; + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "mapping", &intVal ) ) + { + if( intVal < 256 && intVal != 0 ) + { + SetMapping( (uint8)intVal, false ); + } + } + + str = _ccElement->Attribute("setasreport"); + if( str ) + { + m_setAsReport = !strcmp( str, "true"); + } +} + +//----------------------------------------------------------------------------- +// +// Save changed configuration +//----------------------------------------------------------------------------- +void Basic::WriteXML +( + TiXmlElement* _ccElement +) +{ + CommandClass::WriteXML( _ccElement ); + + if( m_ignoreMapping ) + { + _ccElement->SetAttribute( "ignoremapping", "true" ); + } + + char str[32]; + if( m_mapping != 0 ) + { + snprintf( str, sizeof(str), "%d", m_mapping ); + _ccElement->SetAttribute( "mapping", str ); + } + + if( m_setAsReport ) + { + _ccElement->SetAttribute( "setasreport", "true" ); + } +} + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool Basic::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Dynamic ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool Basic::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "BasicCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( BasicCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "BasicCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Basic::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( BasicCmd_Report == (BasicCmd)_data[0] ) + { + // Level + Log::Write( LogLevel_Info, GetNodeId(), "Received Basic report from node %d: level=%d", GetNodeId(), _data[1] ); + if( !m_ignoreMapping && m_mapping != 0 ) + { + UpdateMappedClass( _instance, m_mapping, _data[1] ); + } + else if( ValueByte* value = static_cast( GetValue( _instance, 0 ) ) ) + { + value->OnValueRefreshed( _data[1] ); + value->Release(); + } + return true; + } + + if( BasicCmd_Set == (BasicCmd)_data[0] ) + { + if( m_setAsReport ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received Basic set from node %d: level=%d. Treating it as a Basic report.", GetNodeId(), _data[1] ); + if( !m_ignoreMapping && m_mapping != 0 ) + { + UpdateMappedClass( _instance, m_mapping, _data[1] ); + } + else if( ValueByte* value = static_cast( GetValue( _instance, 0 ) ) ) + { + value->OnValueRefreshed( _data[1] ); + value->Release(); + } + } + else + { + // Commmand received from the node. Handle as a notification event + Log::Write( LogLevel_Info, GetNodeId(), "Received Basic set from node %d: level=%d. Sending event notification.", GetNodeId(), _data[1] ); + + Notification* notification = new Notification( Notification::Type_NodeEvent ); + notification->SetHomeNodeIdAndInstance( GetHomeId(), GetNodeId(), _instance ); + notification->SetEvent( _data[1] ); + GetDriver()->QueueNotification( notification ); + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a value on the Z-Wave device +//----------------------------------------------------------------------------- +bool Basic::SetValue +( + Value const& _value +) +{ + if( ValueID::ValueType_Byte == _value.GetID().GetType() ) + { + ValueByte const* value = static_cast(&_value); + + Log::Write( LogLevel_Info, GetNodeId(), "Basic::Set - Setting node %d to level %d", GetNodeId(), value->GetValue() ); + Msg* msg = new Msg( "Basic Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( BasicCmd_Set ); + msg->Append( value->GetValue() ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void Basic::CreateVars +( + uint8 const _instance +) +{ + if( m_mapping == 0 ) + { + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueByte( ValueID::ValueGenre_Basic, GetCommandClassId(), _instance, 0, "Basic", "", false, false, 0, 0 ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Helper method to set the level +//----------------------------------------------------------------------------- +void Basic::Set +( + uint8 const _level +) +{ + // This may look like a long winded way to do this, but + // it ensures that all the proper notifications get sent. + if( ValueByte* value = static_cast( GetValue( 1, 0 ) ) ) + { + value->Set( _level ); + value->Release(); + } +} + +//----------------------------------------------------------------------------- +// +// Map COMMAND_CLASS_BASIC messages to another command class +//----------------------------------------------------------------------------- +bool Basic::SetMapping +( + uint8 const _commandClassId, + bool const _doLog +) +{ + bool res = false; + + if( _commandClassId != NoOperation::StaticGetCommandClassId() ) + { + if( _doLog ) + { + char str[16]; + snprintf( str, sizeof(str), "0x%02x", _commandClassId ); + string ccstr = str; + if( Node const* node = GetNodeUnsafe() ) + { + if( CommandClass* cc = node->GetCommandClass( _commandClassId ) ) + { + ccstr = cc->GetCommandClassName(); + } + } + if( m_ignoreMapping ) + { + Log::Write( LogLevel_Info, GetNodeId(), " COMMAND_CLASS_BASIC will not be mapped to %s (ignored)", ccstr.c_str() ); + } + else + { + Log::Write( LogLevel_Info, GetNodeId(), " COMMAND_CLASS_BASIC will be mapped to %s", ccstr.c_str() ); + } + } + m_mapping = _commandClassId; + RemoveValue( 1, 0 ); + res = true; + } + + if( m_mapping == 0 && _doLog ) + { + Log::Write( LogLevel_Info, GetNodeId(), " COMMAND_CLASS_BASIC is not mapped" ); + } + return res; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Basic.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Basic.h new file mode 100644 index 0000000..fc583d6 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Basic.h @@ -0,0 +1,77 @@ +//----------------------------------------------------------------------------- +// +// Basic.h +// +// Implementation of the Z-Wave COMMAND_CLASS_BASIC +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Basic_H +#define _Basic_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueByte; + + /** \brief Implements COMMAND_CLASS_BASIC (0x20), a Z-Wave device command class. + */ + class Basic: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Basic( _homeId, _nodeId ); } + virtual ~Basic(){} + + static uint8 const StaticGetCommandClassId(){ return 0x20; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_BASIC"; } + + bool SetMapping( uint8 const _commandClassId, bool const _doLog = true ); // Map COMMAND_CLASS_BASIC messages to another command class + uint8 GetMapping(){ return m_mapping; } + + // From CommandClass + virtual void ReadXML( TiXmlElement const* _ccElement ); + virtual void WriteXML( TiXmlElement* _ccElement ); + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + void Set( uint8 const _level ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + Basic( uint32 const _homeId, uint8 const _nodeId ); + + uint8 m_mapping; + bool m_ignoreMapping; + bool m_setAsReport; + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/BasicWindowCovering.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/BasicWindowCovering.cpp new file mode 100644 index 0000000..550bd53 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/BasicWindowCovering.cpp @@ -0,0 +1,118 @@ +//----------------------------------------------------------------------------- +// +// BasicWindowCovering.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_BASIC_WINDOW_COVERING +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "BasicWindowCovering.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../Node.h" +#include "../platform/Log.h" +#include "../value_classes/ValueButton.h" + +using namespace OpenZWave; + +enum BasicWindowCoveringCmd +{ + BasicWindowCoveringCmd_StartLevelChange = 0x01, + BasicWindowCoveringCmd_StopLevelChange = 0x02 +}; + +enum +{ + BasicWindowCoveringIndex_Open = 0, + BasicWindowCoveringIndex_Close +}; + +//----------------------------------------------------------------------------- +// +// Set a value on the Z-Wave device +//----------------------------------------------------------------------------- +bool BasicWindowCovering::SetValue +( + Value const& _value +) +{ + if( ValueID::ValueType_Button == _value.GetID().GetType() ) + { + ValueButton const* button = static_cast(&_value); + + uint8 action = 0x40; + if( button->GetID().GetIndex() ) // Open is index zero, so non-zero is close. + { + // Close + action = 0; + } + + if( button && button->IsPressed() ) + { + Log::Write( LogLevel_Info, GetNodeId(), "BasicWindowCovering - Start Level Change (%s)", action ? "Open" : "Close" ); + Msg* msg = new Msg( "Basic Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( BasicWindowCoveringCmd_StartLevelChange ); + msg->Append( action ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + else + { + Log::Write( LogLevel_Info, GetNodeId(), "BasicWindowCovering - Stop Level Change" ); + Msg* msg = new Msg( "Basic Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( BasicWindowCoveringCmd_StopLevelChange ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void BasicWindowCovering::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueButton( ValueID::ValueGenre_User, GetCommandClassId(), _instance, BasicWindowCoveringIndex_Open, "Open", 0 ); + node->CreateValueButton( ValueID::ValueGenre_User, GetCommandClassId(), _instance, BasicWindowCoveringIndex_Close, "Close", 0 ); + } +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/BasicWindowCovering.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/BasicWindowCovering.h new file mode 100644 index 0000000..90e3fb2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/BasicWindowCovering.h @@ -0,0 +1,64 @@ +//----------------------------------------------------------------------------- +// +// BasicWindowCovering.h +// +// Implementation of the Z-Wave COMMAND_CLASS_BASIC_WINDOW_COVERING +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _BasicWindowCovering_H +#define _BasicWindowCovering_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueButton; + + /** \brief Implements COMMAND_CLASS_BASIC_WINDOW_COVERING (0x50), a Z-Wave device command class. + */ + class BasicWindowCovering: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new BasicWindowCovering( _homeId, _nodeId ); } + virtual ~BasicWindowCovering(){} + + static uint8 const StaticGetCommandClassId(){ return 0x50; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_BASIC_WINDOW_COVERING"; } + + // From CommandClass + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ){ return false; } + virtual bool SetValue( Value const& _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + BasicWindowCovering( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Battery.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Battery.cpp new file mode 100644 index 0000000..8519ed9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Battery.cpp @@ -0,0 +1,146 @@ +//----------------------------------------------------------------------------- +// +// Battery.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_BATTERY +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "Battery.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueByte.h" + +using namespace OpenZWave; + +enum BatteryCmd +{ + BatteryCmd_Get = 0x02, + BatteryCmd_Report = 0x03 +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool Battery::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Dynamic ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool Battery::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _instance != 1 ) + { + // This command class doesn't work with multiple instances + return false; + } + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "BatteryCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( BatteryCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "BatteryCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Battery::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if (BatteryCmd_Report == (BatteryCmd)_data[0]) + { + // We have received a battery level report from the Z-Wave device. + // Devices send 0xff instead of zero for a low battery warning. + uint8 batteryLevel = _data[1]; + if( batteryLevel == 0xff ) + { + batteryLevel = 0; + } + + Log::Write( LogLevel_Info, GetNodeId(), "Received Battery report from node %d: level=%d", GetNodeId(), batteryLevel ); + + if( ValueByte* value = static_cast( GetValue( _instance, 0 ) ) ) + { + value->OnValueRefreshed( batteryLevel ); + value->Release(); + } + return true; + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void Battery::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueByte( ValueID::ValueGenre_User, GetCommandClassId(), _instance, 0, "Battery Level", "%", true, false, 100, 0 ); + } +} + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Battery.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Battery.h new file mode 100644 index 0000000..7f550ea --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Battery.h @@ -0,0 +1,65 @@ +//----------------------------------------------------------------------------- +// +// Battery.h +// +// Implementation of the Z-Wave COMMAND_CLASS_BATTERY +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Battery_H +#define _Battery_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueByte; + + /** \brief Implements COMMAND_CLASS_BATTERY (0x80), a Z-Wave device command class. + */ + class Battery: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Battery( _homeId, _nodeId ); } + virtual ~Battery(){} + + static uint8 const StaticGetCommandClassId(){ return 0x80; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_BATTERY"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + Battery( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/CMakeLists.txt b/lib/ESPiLight/pilight/libs/openzwave/command_classes/CMakeLists.txt new file mode 100644 index 0000000..1b2bee0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/CMakeLists.txt @@ -0,0 +1,6 @@ +project(openzwave_command_classes) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.cpp") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/CRC16Encap.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/CRC16Encap.cpp new file mode 100644 index 0000000..98c8a95 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/CRC16Encap.cpp @@ -0,0 +1,50 @@ +//----------------------------------------------------------------------------- +// +// CRC16Encap.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_CRC_16_ENCAP +// +// Copyright (c) 2012 Greg Satz +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "CRC16Encap.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool CRC16Encap::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + return false; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/CRC16Encap.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/CRC16Encap.h new file mode 100644 index 0000000..db51ad9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/CRC16Encap.h @@ -0,0 +1,57 @@ +//----------------------------------------------------------------------------- +// +// CRC16Encap.h +// +// Implementation of the Z-Wave COMMAND_CLASS_CRC_16_ENCAP +// +// Copyright (c) 2012 Greg Satz +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _CRC16_ENCAP_H +#define _CRC16_ENCAP_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_CRC_16_ENCAP (0x56), a Z-Wave device command class. + */ + class CRC16Encap: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new CRC16Encap( _homeId, _nodeId ); } + virtual ~CRC16Encap(){} + + static uint8 const StaticGetCommandClassId(){ return 0x56; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_CRC_16_ENCAP"; } + + // From CommandClass + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + private: + CRC16Encap( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ClimateControlSchedule.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ClimateControlSchedule.cpp new file mode 100644 index 0000000..d2108d8 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ClimateControlSchedule.cpp @@ -0,0 +1,428 @@ +//----------------------------------------------------------------------------- +// +// ClimateControlSchedule.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_CLIMATE_CONTROL_SCHEDULE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "ClimateControlSchedule.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../Node.h" +#include "../platform/Log.h" +#include "../value_classes/ValueByte.h" +#include "../value_classes/ValueList.h" +#include "../value_classes/ValueSchedule.h" + +#include "../tinyxml.h" + +using namespace OpenZWave; + +enum ClimateControlScheduleCmd +{ + ClimateControlScheduleCmd_Set = 0x01, + ClimateControlScheduleCmd_Get, + ClimateControlScheduleCmd_Report, + ClimateControlScheduleCmd_ChangedGet, + ClimateControlScheduleCmd_ChangedReport, + ClimateControlScheduleCmd_OverrideSet, + ClimateControlScheduleCmd_OverrideGet, + ClimateControlScheduleCmd_OverrideReport +}; + +enum +{ + ClimateControlScheduleIndex_OverrideState = 8, + ClimateControlScheduleIndex_OverrideSetback = 9 +}; + +static char const* c_dayNames[] = +{ + "Invalid", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday" +}; + +static char const* c_overrideStateNames[] = +{ + "None", + "Temporary", + "Permanent", + "Invalid" +}; + + +//----------------------------------------------------------------------------- +// +// Read the saved change-counter value +//----------------------------------------------------------------------------- +void ClimateControlSchedule::ReadXML +( + TiXmlElement const* _ccElement +) +{ + CommandClass::ReadXML( _ccElement ); + + int intVal; + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "change_counter", &intVal ) ) + { + m_changeCounter = (uint8)intVal; + } +} + +//----------------------------------------------------------------------------- +// +// Write the change-counter value +//----------------------------------------------------------------------------- +void ClimateControlSchedule::WriteXML +( + TiXmlElement* _ccElement +) +{ + CommandClass::WriteXML( _ccElement ); + + char str[8]; + snprintf( str, 8, "%d", m_changeCounter ); + _ccElement->SetAttribute( "change_counter", str ); +} + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool ClimateControlSchedule::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Session ) + { + // See if the schedule has changed since last time + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool ClimateControlSchedule::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + // See if the schedule has changed since last time + Msg* msg = new Msg( "ClimateControlScheduleCmd_ChangedGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( ClimateControlScheduleCmd_ChangedGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool ClimateControlSchedule::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( ClimateControlScheduleCmd_Report == (ClimateControlScheduleCmd)_data[0] ) + { + uint8 day = _data[1] & 0x07; + + if (day > 7) /* size of c_dayNames */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "Day Value was greater than range. Setting to Invalid"); + day = 0; + } + + Log::Write( LogLevel_Info, GetNodeId(), "Received climate control schedule report for %s", c_dayNames[day] ); + + if( ValueSchedule* value = static_cast( GetValue( _instance, day ) ) ) + { + // Remove any existing data + value->ClearSwitchPoints(); + + // Parse the switch point data + for( uint8 i=2; i<29; i+=3 ) + { + uint8 setback = _data[i+2]; + if( setback == 0x7f ) + { + // Switch point is unused, so we stop parsing here + break; + } + + uint8 hours = _data[i] & 0x1f; + uint8 minutes = _data[i+1] & 0x3f; + + if( setback == 0x79 ) + { + Log::Write( LogLevel_Info, GetNodeId(), " Switch point at %02d:%02d, Frost Protection Mode", hours, minutes, c_dayNames[day] ); + } + else if( setback == 0x7a ) + { + Log::Write( LogLevel_Info, GetNodeId(), " Switch point at %02d:%02d, Energy Saving Mode", hours, minutes, c_dayNames[day] ); + } + else + { + Log::Write( LogLevel_Info, GetNodeId(), " Switch point at %02d:%02d, Setback %+.1fC", hours, minutes, ((float)setback)*0.1f ); + } + + value->SetSwitchPoint( hours, minutes, setback ); + } + + if( !value->GetNumSwitchPoints() ) + { + Log::Write( LogLevel_Info, GetNodeId(), " No Switch points have been set" ); + } + + // Notify the user + value->OnValueRefreshed(); + value->Release(); + } + + return true; + } + + if( ClimateControlScheduleCmd_ChangedReport == (ClimateControlScheduleCmd)_data[0] ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received climate control schedule changed report:" ); + + if( _data[1] ) + { + if( _data[1] != m_changeCounter ) + { + m_changeCounter = _data[1]; + + // The schedule has changed and is not in override mode, so request reports for each day + for( int i=1; i<=7; ++i ) + { + char str[64]; + snprintf( str, 64, "Get climate control schedule for %s", c_dayNames[i] ); + + Msg* msg = new Msg( str, GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( ClimateControlScheduleCmd_Get ); + msg->Append( i ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + } + } + } + else + { + // Device is in override mode, so we request details of that instead + Msg* msg = new Msg( "Get climate control schedule override state", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( ClimateControlScheduleCmd_OverrideGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + } + return true; + } + + if( ClimateControlScheduleCmd_OverrideReport == (ClimateControlScheduleCmd)_data[0] ) + { + uint8 overrideState = _data[1] & 0x03; + if (overrideState > 3) /* size of c_overrideStateNames */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "overrideState Value was greater than range. Setting to Invalid"); + overrideState = 3; + } + + Log::Write( LogLevel_Info, GetNodeId(), "Received climate control schedule override report:" ); + Log::Write( LogLevel_Info, GetNodeId(), " Override State: %s:", c_overrideStateNames[overrideState] ); + + if( ValueList* valueList = static_cast( GetValue( _instance, ClimateControlScheduleIndex_OverrideState ) ) ) + { + valueList->OnValueRefreshed( (int)overrideState ); + valueList->Release(); + } + + uint8 setback = _data[2]; + if( overrideState ) + { + if( setback == 0x79 ) + { + Log::Write( LogLevel_Info, GetNodeId(), " Override Setback: Frost Protection Mode" ); + } + else if( setback == 0x7a ) + { + Log::Write( LogLevel_Info, GetNodeId(), " Override Setback: Energy Saving Mode" ); + } + else + { + Log::Write( LogLevel_Info, GetNodeId(), " Override Setback: %+.1fC", ((float)setback)*0.1f ); + } + } + + if( ValueByte* valueByte = static_cast( GetValue( _instance, ClimateControlScheduleIndex_OverrideSetback ) ) ) + { + valueByte->OnValueRefreshed( setback ); + valueByte->Release(); + } + + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a value in the device +//----------------------------------------------------------------------------- +bool ClimateControlSchedule::SetValue +( + Value const& _value +) +{ +// bool res = false; + uint8 instance = _value.GetID().GetInstance(); + uint8 idx = _value.GetID().GetIndex(); + + if( idx < 8 ) + { + // Set a schedule + ValueSchedule const* value = static_cast(&_value); + + char str[64]; + snprintf( str, 64, "Set the climate control schedule for %s on node %d", c_dayNames[idx], GetNodeId() ); + + Msg* msg = new Msg( str, GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, instance ); + msg->Append( GetNodeId() ); + msg->Append( 30 ); + msg->Append( GetCommandClassId() ); + msg->Append( ClimateControlScheduleCmd_Set ); + msg->Append( idx ); // Day of week + + for( uint8 i=0; i<9; ++i ) + { + uint8 hours; + uint8 minutes; + int8 setback; + if( value->GetSwitchPoint( i, &hours, &minutes, &setback ) ) + { + msg->Append( hours ); + msg->Append( minutes ); + msg->Append( setback ); + } + else + { + // Unused switch point + msg->Append( 0 ); + msg->Append( 0 ); + msg->Append( 0x7f ); + } + } + + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + } + else + { + // Set an override + ValueList* state = static_cast( GetValue( instance, ClimateControlScheduleIndex_OverrideState ) ); + ValueByte* setback = static_cast( GetValue( instance, ClimateControlScheduleIndex_OverrideSetback ) ); + + if( state && setback ) + { + ValueList::Item const& item = state->GetItem(); + + Msg* msg = new Msg( "Set climate control schedule override state", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, instance ); + msg->Append( GetNodeId() ); + msg->Append( 4 ); + msg->Append( GetCommandClassId() ); + msg->Append( ClimateControlScheduleCmd_OverrideSet ); + msg->Append( (uint8)item.m_value ); + msg->Append( setback->GetValue() ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + } + } + + return true; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void ClimateControlSchedule::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + // Add a ValueSchedule for each day of the week. + for( uint8 i=0; i<7; ++i ) + { + node->CreateValueSchedule( ValueID::ValueGenre_User, GetCommandClassId(), _instance, i+1, c_dayNames[i+1], "", false, false, 0 ); + } + + // Add values for the override state and setback + vector items; + + ValueList::Item item; + for( uint8 i=0; i<3; ++i ) + { + item.m_label = c_overrideStateNames[i]; + item.m_value = i; + items.push_back( item ); + } + + node->CreateValueList( ValueID::ValueGenre_User, GetCommandClassId(), _instance, ClimateControlScheduleIndex_OverrideState, "Override State", "", false, false, 1, items, 0, 0 ); + node->CreateValueByte( ValueID::ValueGenre_User, GetCommandClassId(), _instance, ClimateControlScheduleIndex_OverrideSetback, "Override Setback", "", false, false, 0, 0 ); + } +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ClimateControlSchedule.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ClimateControlSchedule.h new file mode 100644 index 0000000..36f0abc --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ClimateControlSchedule.h @@ -0,0 +1,71 @@ +//----------------------------------------------------------------------------- +// +// ClimateControlSchedule.h +// +// Implementation of the Z-Wave COMMAND_CLASS_CLIMATE_CONTROL_SCHEDULE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ClimateControlSchedule_H +#define _ClimateControlSchedule_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueSchedule; + class ValueList; + class ValueByte; + + /** \brief Implements COMMAND_CLASS_CLIMATE_CONTROL_SCHEDULE (0x46), a Z-Wave device command class. + */ + class ClimateControlSchedule: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new ClimateControlSchedule( _homeId, _nodeId ); } + virtual ~ClimateControlSchedule(){} + + static uint8 const StaticGetCommandClassId(){ return 0x46; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_CLIMATE_CONTROL_SCHEDULE"; } + + // From CommandClass + virtual void ReadXML( TiXmlElement const* _ccElement ); + virtual void WriteXML( TiXmlElement* _ccElement ); + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + ClimateControlSchedule( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ), m_changeCounter( 0 ){} + uint8 m_changeCounter; + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Clock.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Clock.cpp new file mode 100644 index 0000000..267e006 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Clock.cpp @@ -0,0 +1,237 @@ +//----------------------------------------------------------------------------- +// +// Clock.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_CLOCK +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "Clock.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueByte.h" +#include "../value_classes/ValueList.h" + +using namespace OpenZWave; + +enum ClockCmd +{ + ClockCmd_Set = 0x04, + ClockCmd_Get = 0x05, + ClockCmd_Report = 0x06 +}; + +enum +{ + ClockIndex_Day = 0, + ClockIndex_Hour, + ClockIndex_Minute +}; + +static char const* c_dayNames[] = +{ + "Invalid", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday" +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool Clock::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Dynamic ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool Clock::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "ClockCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( ClockCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "ClockCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Clock::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if (ClockCmd_Report == (ClockCmd)_data[0]) + { + uint8 day = _data[1] >> 5; + uint8 hour = _data[1] & 0x1f; + uint8 minute = _data[2]; + + if (day > 7) /* size of c_dayNames */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "Day Value was greater than range. Setting to Invalid"); + day = 0; + } + + Log::Write( LogLevel_Info, GetNodeId(), "Received Clock report: %s %.2d:%.2d", c_dayNames[day], hour, minute ); + + + if( ValueList* dayValue = static_cast( GetValue( _instance, ClockIndex_Day ) ) ) + { + dayValue->OnValueRefreshed( day ); + dayValue->Release(); + } + if( ValueByte* hourValue = static_cast( GetValue( _instance, ClockIndex_Hour ) ) ) + { + hourValue->OnValueRefreshed( hour ); + hourValue->Release(); + } + if( ValueByte* minuteValue = static_cast( GetValue( _instance, ClockIndex_Minute ) ) ) + { + minuteValue->OnValueRefreshed( minute ); + minuteValue->Release(); + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a value in the Z-Wave device +//----------------------------------------------------------------------------- +bool Clock::SetValue +( + Value const& _value +) +{ + bool ret = false; + + uint8 instance = _value.GetID().GetInstance(); + + ValueList* dayValue = static_cast( GetValue( instance, ClockIndex_Day ) ); + ValueByte* hourValue = static_cast( GetValue( instance, ClockIndex_Hour ) ); + ValueByte* minuteValue = static_cast( GetValue( instance, ClockIndex_Minute ) ); + + if( dayValue && hourValue && minuteValue ) + { + uint8 day = dayValue->GetItem().m_value; + uint8 hour = hourValue->GetValue(); + uint8 minute = minuteValue->GetValue(); + + Msg* msg = new Msg( "ClockCmd_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, instance ); + msg->Append( GetNodeId() ); + msg->Append( 4 ); + msg->Append( GetCommandClassId() ); + msg->Append( ClockCmd_Set ); + msg->Append( ( day << 5 ) | hour ); + msg->Append( minute ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + ret = true; + } + + if( dayValue != NULL ) + { + dayValue->Release(); + } + if( hourValue != NULL ) + { + hourValue->Release(); + } + if( minuteValue != NULL ) + { + minuteValue->Release(); + } + return ret; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void Clock::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + vector items; + for( int i=1; i<=7; ++i ) + { + ValueList::Item item; + item.m_label = c_dayNames[i]; + item.m_value = i; + items.push_back( item ); + } + + node->CreateValueList( ValueID::ValueGenre_User, GetCommandClassId(), _instance, ClockIndex_Day, "Day", "", false, false, 1, items, 0, 0 ); + node->CreateValueByte( ValueID::ValueGenre_User, GetCommandClassId(), _instance, ClockIndex_Hour, "Hour", "", false, false, 12, 0 ); + node->CreateValueByte( ValueID::ValueGenre_User, GetCommandClassId(), _instance, ClockIndex_Minute, "Minute", "", false, false, 0, 0 ); + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Clock.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Clock.h new file mode 100644 index 0000000..4f8c1bc --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Clock.h @@ -0,0 +1,67 @@ +//----------------------------------------------------------------------------- +// +// Clock.h +// +// Implementation of the Z-Wave COMMAND_CLASS_CLOCK +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Clock_H +#define _Clock_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueByte; + class ValueList; + + /** \brief Implements COMMAND_CLASS_CLOCK (0x81), a Z-Wave device command class. + */ + class Clock: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Clock( _homeId, _nodeId ); } + virtual ~Clock(){} + + static uint8 const StaticGetCommandClassId(){ return 0x81; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_CLOCK"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + Clock( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClass.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClass.cpp new file mode 100644 index 0000000..e06a76d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClass.cpp @@ -0,0 +1,805 @@ +//----------------------------------------------------------------------------- +// +// CommandClass.cpp +// +// Base class for all Z-Wave Command Classes +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include +#include +#include "../tinyxml.h" +#include "CommandClass.h" +#include "Basic.h" +#include "MultiInstance.h" +#include "CommandClasses.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../Manager.h" +#include "../platform/Log.h" +#include "../value_classes/ValueStore.h" + +using namespace OpenZWave; + +static uint8 const c_sizeMask = 0x07; +static uint8 const c_scaleMask = 0x18; +static uint8 const c_scaleShift = 0x03; +static uint8 const c_precisionMask = 0xe0; +static uint8 const c_precisionShift = 0x05; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +CommandClass::CommandClass +( + uint32 const _homeId, + uint8 const _nodeId +): + m_homeId( _homeId ), + m_nodeId( _nodeId ), + m_version( 1 ), + m_afterMark( false ), + m_createVars( true ), + m_overridePrecision( -1 ), + m_getSupported( true ), + m_isSecured( false ), + m_SecureSupport( true ), + m_staticRequests( 0 ), + m_sentCnt( 0 ), + m_receivedCnt( 0 ) +{ +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +CommandClass::~CommandClass +( +) +{ + while( !m_endPointMap.empty() ) + { + map::iterator it = m_endPointMap.begin(); + m_endPointMap.erase( it ); + } + while ( !m_RefreshClassValues.empty() ) + { + for (unsigned int i = 0; i < m_RefreshClassValues.size(); i++) + { + RefreshValue *rcc = m_RefreshClassValues.at(i); + while(!rcc->RefreshClasses.empty()) { + delete rcc->RefreshClasses.back(); + rcc->RefreshClasses.pop_back(); + } +// for (unsigned int j = 0; j < rcc->RefreshClasses.size(); i++) +// { +// delete rcc->RefreshClasses[j]; +// } + rcc->RefreshClasses.clear(); + delete rcc; + } + m_RefreshClassValues.clear(); + } + +} + +//----------------------------------------------------------------------------- +// +// Get a pointer to our driver +//----------------------------------------------------------------------------- +Driver* CommandClass::GetDriver +( +)const +{ + return( Manager::Get()->GetDriver( m_homeId ) ); +} + +//----------------------------------------------------------------------------- +// +// Get a pointer to our node without locking the mutex +//----------------------------------------------------------------------------- +Node* CommandClass::GetNodeUnsafe +( +)const +{ + return( GetDriver()->GetNodeUnsafe( m_nodeId ) ); +} + +//----------------------------------------------------------------------------- +// +// Get a pointer to a value by its instance and index +//----------------------------------------------------------------------------- +Value* CommandClass::GetValue +( + uint8 const _instance, + uint8 const _index +) +{ + Value* value = NULL; + if( Node* node = GetNodeUnsafe() ) + { + value = node->GetValue( GetCommandClassId(), _instance, _index ); + } + return value; +} + +//----------------------------------------------------------------------------- +// +// Remove a value by its instance and index +//----------------------------------------------------------------------------- +bool CommandClass::RemoveValue +( + uint8 const _instance, + uint8 const _index +) +{ + if( Node* node = GetNodeUnsafe() ) + { + return node->RemoveValue( GetCommandClassId(), _instance, _index ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Instances as set by the MultiInstance V1 command class +//----------------------------------------------------------------------------- +void CommandClass::SetInstances +( + uint8 const _instances +) +{ + // Ensure we have a set of reported variables for each new instance + if( !m_afterMark ) + { + for( uint8 i=0; i<_instances; ++i ) + { + SetInstance( i+1 ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Instances as set by the MultiChannel (i.e. MultiInstance V2) command class +//----------------------------------------------------------------------------- +void CommandClass::SetInstance +( + uint8 const _endPoint +) +{ + if( !m_instances.IsSet( _endPoint ) ) + { + m_instances.Set( _endPoint ); + if( IsCreateVars() ) + { + CreateVars( _endPoint ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Read the saved command class data +//----------------------------------------------------------------------------- +void CommandClass::ReadXML +( + TiXmlElement const* _ccElement +) +{ + int32 intVal; + char const* str; + + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "version", &intVal ) ) + { + m_version = (uint8)intVal; + } + + uint8 instances = 1; + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "instances", &intVal ) ) + { + instances = (uint8)intVal; + } + + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "request_flags", &intVal ) ) + { + m_staticRequests = (uint8)intVal; + } + + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "override_precision", &intVal ) ) + { + m_overridePrecision = (int8)intVal; + } + + str = _ccElement->Attribute( "after_mark" ); + if( str ) + { + m_afterMark = !strcmp( str, "true" ); + } + + str = _ccElement->Attribute( "create_vars" ); + if( str ) + { + m_createVars = !strcmp( str, "true" ); + } + + // Make sure previously created values are removed if create_vars=false + if( !m_createVars ) + { + if( Node* node = GetNodeUnsafe() ) + { + node->GetValueStore()->RemoveCommandClassValues( GetCommandClassId() ); + } + } + + str = _ccElement->Attribute( "getsupported" ); + if( str ) + { + m_getSupported = !strcmp( str, "true" ); + } + + str = _ccElement->Attribute( "issecured" ); + if( str ) + { + m_isSecured = !strcmp( str, "true" ); + } + // Setting the instance count will create all the values. + SetInstances( instances ); + + // Apply any differences from the saved XML to the values + TiXmlElement const* child = _ccElement->FirstChildElement(); + while( child ) + { + str = child->Value(); + if( str ) + { + if( !strcmp( str, "Instance" ) ) + { + uint8 instance = 0; + // Add an instance to the command class + if( TIXML_SUCCESS == child->QueryIntAttribute( "index", &intVal ) ) + { + instance = (uint8)intVal; + SetInstance( instance ); + } + // See if its associated endpoint is present + if( TIXML_SUCCESS == child->QueryIntAttribute( "endpoint", &intVal ) ) + { + uint8 endpoint = (uint8)intVal; + SetEndPoint( instance, endpoint ); + } + } + else if( !strcmp( str, "Value" ) ) + { + // Apply any differences from the saved XML to the value + GetNodeUnsafe()->ReadValueFromXML( GetCommandClassId(), child ); + } + else if (!strcmp( str, "TriggerRefreshValue" ) ) + { + ReadValueRefreshXML(child); + } + } + + child = child->NextSiblingElement(); + } +} + +//----------------------------------------------------------------------------- +// +// Read the config that contains a list of Values that should be refreshed when +// we recieve u updated Value from a device. (This helps Yale Door Locks, which send a +// Alarm Report instead of DoorLock Report when the status of the Door Lock is changed +//----------------------------------------------------------------------------- +void CommandClass::ReadValueRefreshXML +( + TiXmlElement const* _ccElement +) +{ + + char const* str; + bool ok = false; + const char *genre; + RefreshValue *rcc = new RefreshValue(); + rcc->cc = GetCommandClassId(); + genre = _ccElement->Attribute( "Genre" ); + rcc->genre = Value::GetGenreEnumFromName(genre); + _ccElement->QueryIntAttribute( "Instance", (int*)&rcc->instance); + _ccElement->QueryIntAttribute( "Index", (int*)&rcc->index); + Log::Write(LogLevel_Info, GetNodeId(), "Value Refresh triggered by CommandClass: %s, Genre: %d, Instance: %d, Index: %d for:", GetCommandClassName().c_str(), rcc->genre, rcc->instance, rcc->index); + TiXmlElement const* child = _ccElement->FirstChildElement(); + while( child ) + { + str = child->Value(); + if( str ) + { + if ( !strcmp(str, "RefreshClassValue")) + { + RefreshValue *arcc = new RefreshValue(); + if (child->QueryIntAttribute( "CommandClass", (int*)&arcc->cc) != TIXML_SUCCESS) { + Log::Write(LogLevel_Warning, GetNodeId(), " Invalid XML - CommandClass Attribute is wrong type or missing"); + continue; + } + if (child->QueryIntAttribute( "RequestFlags", (int*)&arcc->genre) != TIXML_SUCCESS) { + Log::Write(LogLevel_Warning, GetNodeId(), " Invalid XML - RequestFlags Attribute is wrong type or missing"); + continue; + } + if (child->QueryIntAttribute( "Instance", (int*)&arcc->instance) != TIXML_SUCCESS) { + Log::Write(LogLevel_Warning, GetNodeId(), " Invalid XML - Instance Attribute is wrong type or missing"); + continue; + } + if (child->QueryIntAttribute( "Index", (int*)&arcc->index) != TIXML_SUCCESS) { + Log::Write(LogLevel_Warning, GetNodeId(), " Invalid XML - Index Attribute is wrong type or missing"); + continue; + } + Log::Write(LogLevel_Info, GetNodeId(), " CommandClass: %s, RequestFlags: %d, Instance: %d, Index: %d", CommandClasses::GetName(arcc->cc).c_str(), arcc->genre, arcc->instance, arcc->index); + rcc->RefreshClasses.push_back(arcc); + ok = true; + } + else + { + Log::Write(LogLevel_Warning, GetNodeId(), "Got Unhandled Child Entry in TriggerRefreshValue XML Config: %s", str); + } + } + child = child->NextSiblingElement(); + } + if (ok == true) { + m_RefreshClassValues.push_back( rcc ); + } else { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed to add a RefreshClassValue from XML"); + delete rcc; + } +} + +//----------------------------------------------------------------------------- +// +// Scan our m_RefreshClassValues vector to see if we should call any other +// Command Classes to refresh their value +//----------------------------------------------------------------------------- + +bool CommandClass::CheckForRefreshValues ( + Value const* _value +) +{ + if (m_RefreshClassValues.empty()) + { + //Log::Write(LogLevel_Debug, GetNodeId(), "Bailing out of CheckForRefreshValues"); + return false; + } + Node* node = GetNodeUnsafe(); + if( node != NULL ) + { + for (uint32 i = 0; i < m_RefreshClassValues.size(); i++) + { + RefreshValue *rcc = m_RefreshClassValues.at(i); + //Log::Write(LogLevel_Debug, GetNodeId(), "Checking Value Against RefreshClassList: CommandClass %s = %s, Genre %d = %d, Instance %d = %d, Index %d = %d", CommandClasses::GetName(rcc->cc).c_str(), CommandClasses::GetName(_value->GetID().GetCommandClassId()).c_str(), rcc->genre, _value->GetID().GetGenre(), rcc->instance, _value->GetID().GetInstance(), rcc->index, _value->GetID().GetIndex()); + if ((rcc->genre == _value->GetID().GetGenre()) && (rcc->instance == _value->GetID().GetInstance()) && (rcc->index == _value->GetID().GetIndex()) ) + { + /* we got a match..... */ + for (uint32 j = 0; j < rcc->RefreshClasses.size(); j++) + { + RefreshValue *arcc = rcc->RefreshClasses.at(j); + Log::Write(LogLevel_Debug, GetNodeId(), "Requesting Refresh of Value: CommandClass: %s Genre %d, Instance %d, Index %d", CommandClasses::GetName(arcc->cc).c_str(), arcc->genre, arcc->instance, arcc->index); + if( CommandClass* cc = node->GetCommandClass( arcc->cc ) ) + { + cc->RequestValue(arcc->genre, arcc->index, arcc->instance, Driver::MsgQueue_Send); + } + } + } + } + } + else /* Driver */ + { + Log::Write(LogLevel_Warning, GetNodeId(), "Can't get Node"); + } + return true; +} + +//----------------------------------------------------------------------------- +// +// Save the static node configuration data +//----------------------------------------------------------------------------- +void CommandClass::WriteXML +( + TiXmlElement* _ccElement +) +{ + char str[32]; + + snprintf( str, sizeof(str), "%d", GetCommandClassId() ); + _ccElement->SetAttribute( "id", str ); + _ccElement->SetAttribute( "name", GetCommandClassName().c_str() ); + + snprintf( str, sizeof(str), "%d", GetVersion() ); + _ccElement->SetAttribute( "version", str ); + + if( m_staticRequests ) + { + snprintf( str, sizeof(str), "%d", m_staticRequests ); + _ccElement->SetAttribute( "request_flags", str ); + } + + if( m_overridePrecision >= 0 ) + { + snprintf( str, sizeof(str), "%d", m_overridePrecision ); + _ccElement->SetAttribute( "override_precision", str ); + } + + if( m_afterMark ) + { + _ccElement->SetAttribute( "after_mark", "true" ); + } + + if( !m_createVars ) + { + _ccElement->SetAttribute( "create_vars", "false" ); + } + + if( !m_getSupported ) + { + _ccElement->SetAttribute( "getsupported", "false" ); + } + if ( m_isSecured ) + { + _ccElement->SetAttribute( "issecured", "true" ); + } + + + // Write out the instances + for( Bitfield::Iterator it = m_instances.Begin(); it != m_instances.End(); ++ it ) + { + TiXmlElement* instanceElement = new TiXmlElement( "Instance" ); + _ccElement->LinkEndChild( instanceElement ); + + snprintf( str, sizeof(str), "%d", *it ); + instanceElement->SetAttribute( "index", str ); + + map::iterator eit = m_endPointMap.find( *it ); + if( eit != m_endPointMap.end() ) + { + snprintf( str, sizeof(str), "%d", eit->second ); + instanceElement->SetAttribute( "endpoint", str ); + } + } + + // Write out the values for this command class + ValueStore* store = GetNodeUnsafe()->GetValueStore(); + for( ValueStore::Iterator it = store->Begin(); it != store->End(); ++it ) + { + Value* value = it->second; + if( value->GetID().GetCommandClassId() == GetCommandClassId() ) + { + TiXmlElement* valueElement = new TiXmlElement( "Value" ); + _ccElement->LinkEndChild( valueElement ); + value->WriteXML( valueElement ); + } + } + // Write out the TriggerRefreshValue if it exists + for (uint32 i = 0; i < m_RefreshClassValues.size(); i++) + { + RefreshValue *rcc = m_RefreshClassValues.at(i); + TiXmlElement* RefreshElement = new TiXmlElement("TriggerRefreshValue"); + _ccElement->LinkEndChild( RefreshElement ); + RefreshElement->SetAttribute("Genre", Value::GetGenreNameFromEnum((ValueID::ValueGenre)rcc->genre)); + RefreshElement->SetAttribute("Instance", rcc->instance); + RefreshElement->SetAttribute("Index", rcc->index); + for (uint32 j = 0; j < rcc->RefreshClasses.size(); j++) + { + RefreshValue *arcc = rcc->RefreshClasses.at(j); + TiXmlElement *ClassElement = new TiXmlElement("RefreshClassValue"); + RefreshElement->LinkEndChild(ClassElement); + ClassElement->SetAttribute("CommandClass", arcc->cc); + ClassElement->SetAttribute("RequestFlags", arcc->genre); + ClassElement->SetAttribute("Instance", arcc->instance); + ClassElement->SetAttribute("Index", arcc->index); + } + } +} + +//----------------------------------------------------------------------------- +// +// Read a value from a variable length sequence of bytes +//----------------------------------------------------------------------------- +string CommandClass::ExtractValue +( + uint8 const* _data, + uint8* _scale, + uint8* _precision, + uint8 _valueOffset // = 1 +)const +{ + uint8 const size = _data[0] & c_sizeMask; + uint8 const precision = (_data[0] & c_precisionMask) >> c_precisionShift; + + if( _scale ) + { + *_scale = (_data[0] & c_scaleMask) >> c_scaleShift; + } + + if( _precision ) + { + *_precision = precision; + } + + uint32 value = 0; + uint8 i; + for( i=0; idecimal_point); + + // Copy the buffer into res + res += &numBuf[start]; + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Add a value to a message as a sequence of bytes +//----------------------------------------------------------------------------- +void CommandClass::AppendValue +( + Msg* _msg, + string const& _value, + uint8 const _scale +)const +{ + uint8 precision; + uint8 size; + int32 val = ValueToInteger( _value, &precision, &size ); + + _msg->Append( (precision<0; --i, shift-=8 ) + { + _msg->Append( (uint8)(val >> shift) ); + } +} + +//----------------------------------------------------------------------------- +// +// Get the number of bytes that would be added by a call to AppendValue +//----------------------------------------------------------------------------- +uint8 const CommandClass::GetAppendValueSize +( + string const& _value +)const +{ + uint8 size; + ValueToInteger( _value, NULL, &size ); + return size; +} + +//----------------------------------------------------------------------------- +// +// Convert a decimal string to an integer and report the precision and +// number of bytes required to store the value. +//----------------------------------------------------------------------------- +int32 CommandClass::ValueToInteger +( + string const& _value, + uint8* o_precision, + uint8* o_size +)const +{ + int32 val; + uint8 precision; + + // Find the decimal point + size_t pos = _value.find_first_of( "." ); + if( pos == string::npos ) + pos = _value.find_first_of( "," ); + + if( pos == string::npos ) + { + // No decimal point + precision = 0; + + // Convert the string to an integer + val = atol( _value.c_str() ); + } + else + { + // Remove the decimal point and convert to an integer + precision = (uint8) ((_value.size()-pos)-1); + + string str = _value.substr( 0, pos ) + _value.substr( pos+1 ); + val = atol( str.c_str() ); + } + + if ( m_overridePrecision > 0 ) + { + while ( precision < m_overridePrecision ) { + precision++; + val *= 10; + } + } + + if ( o_precision ) *o_precision = precision; + + if( o_size ) + { + // Work out the size as either 1, 2 or 4 bytes + *o_size = 4; + if( val < 0 ) + { + if( ( val & 0xffffff80 ) == 0xffffff80 ) + { + *o_size = 1; + } + else if( ( val & 0xffff8000 ) == 0xffff8000 ) + { + *o_size = 2; + } + } + else + { + if( ( val & 0xffffff00 ) == 0 ) + { + *o_size = 1; + } + else if( ( val & 0xffff0000 ) == 0 ) + { + *o_size = 2; + } + } + } + + return val; +} + +//----------------------------------------------------------------------------- +// +// Update the mapped class if there is one with BASIC level +//----------------------------------------------------------------------------- +void CommandClass::UpdateMappedClass +( + uint8 const _instance, + uint8 const _classId, + uint8 const _level +) +{ + if( _classId ) + { + if( Node* node = GetNodeUnsafe() ) + { + CommandClass* cc = node->GetCommandClass( _classId ); + if( node->GetCurrentQueryStage() == Node::QueryStage_Complete && cc != NULL ) + { + cc->SetValueBasic( _instance, _level ); + } + } + } +} + +//----------------------------------------------------------------------------- +// +// The static data for this command class has been read from the device +//----------------------------------------------------------------------------- +void CommandClass::ClearStaticRequest +( + uint8 _request +) +{ + m_staticRequests &= ~_request; +} + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool CommandClass::RequestStateForAllInstances +( + uint32 const _requestFlags, + Driver::MsgQueue const _queue +) +{ + bool res = false; + if( m_createVars ) + { + if( Node* node = GetNodeUnsafe() ) + { + MultiInstance* multiInstance = static_cast( node->GetCommandClass( MultiInstance::StaticGetCommandClassId() ) ); + if( multiInstance != NULL ) + { + for( Bitfield::Iterator it = m_instances.Begin(); it != m_instances.End(); ++it ) + { + res |= RequestState( _requestFlags, (uint8)*it, _queue ); + } + } + else + { + res = RequestState( _requestFlags, 1, _queue ); + } + } + } + + return res; +} + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClass.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClass.h new file mode 100644 index 0000000..b1cc861 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClass.h @@ -0,0 +1,198 @@ +//----------------------------------------------------------------------------- +// +// CommandClass.h +// +// Base class for all Z-Wave Command Classes +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _CommandClass_H +#define _CommandClass_H + +#include +#include +#include +#include "../Defs.h" +#include "../Bitfield.h" +#include "../Driver.h" + +namespace OpenZWave +{ + class Msg; + class Node; + class Value; + + /** \brief Base class for all Z-Wave command classes. + */ + class OPENZWAVE_EXPORT CommandClass + { + + public: + enum + { + RequestFlag_Static = 0x00000001, /**< Values that never change. */ + RequestFlag_Session = 0x00000002, /**< Values that change infrequently, and so only need to be requested at start up, or via a manual refresh. */ + RequestFlag_Dynamic = 0x00000004, /**< Values that change and will be requested if polling is enabled on the node. */ + }; + + CommandClass( uint32 const _homeId, uint8 const _nodeId ); + virtual ~CommandClass(); + + virtual void ReadXML( TiXmlElement const* _ccElement ); + virtual void WriteXML( TiXmlElement* _ccElement ); + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ){ return false; } + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ) { return false; } + + virtual uint8 const GetCommandClassId()const = 0; + virtual string const GetCommandClassName()const = 0; + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ) = 0; + virtual bool SetValue( Value const& _value ){ return false; } + virtual void SetValueBasic( uint8 const _instance, uint8 const _level ){} // Class specific handling of BASIC value mapping + virtual void SetVersion( uint8 const _version ){ m_version = _version; } + + bool RequestStateForAllInstances( uint32 const _requestFlags, Driver::MsgQueue const _queue ); + bool CheckForRefreshValues(Value const* _value ); + + // The highest version number of the command class implemented by OpenZWave. We only need + // to do version gets on command classes that override this with a number greater than one. + virtual uint8 GetMaxVersion(){ return 1; } + + uint8 GetVersion()const{ return m_version; } + Bitfield const* GetInstances()const{ return &m_instances; } + uint32 GetHomeId()const{ return m_homeId; } + uint8 GetNodeId()const{ return m_nodeId; } + Driver* GetDriver()const; + Node* GetNodeUnsafe()const; + Value* GetValue( uint8 const _instance, uint8 const _index ); + bool RemoveValue( uint8 const _instance, uint8 const _index ); + uint8 GetEndPoint( uint8 const _instance ) + { + map::iterator it = m_endPointMap.find( _instance ); + return( it == m_endPointMap.end() ? 0 : it->second ); + } + uint8 GetInstance( uint8 const _endPoint ) + { + for( map::iterator it = m_endPointMap.begin(); it != m_endPointMap.end(); ++it ) + { + if( _endPoint == it->second ) + { + return it->first; + } + } + return 0; + } + + void SetInstances( uint8 const _instances ); + void SetInstance( uint8 const _endPoint ); + void SetAfterMark(){ m_afterMark = true; } + void SetEndPoint( uint8 const _instance, uint8 const _endpoint){ m_endPointMap[_instance] = _endpoint; } + bool IsAfterMark()const{ return m_afterMark; } + bool IsCreateVars()const{ return m_createVars; } + bool IsGetSupported()const{ return m_getSupported; } + bool IsSecured()const{ return m_isSecured; } + void SetSecured(){ m_isSecured = true; } + bool IsSecureSupported()const { return m_SecureSupport; } + void ClearSecureSupport() { m_SecureSupport = false; } + void SetSecureSupport() { m_SecureSupport = true; } + + // Helper methods + string ExtractValue( uint8 const* _data, uint8* _scale, uint8* _precision, uint8 _valueOffset = 1 )const; + + /** + * Append a floating-point value to a message. + * \param _msg The message to which the value should be appended. + * \param _value A string containing a decimal number to be appended. + * \param _scale A byte indicating the scale corresponding to this value (e.g., 1=F and 0=C for temperatures). + * \see Msg + */ + void AppendValue( Msg* _msg, string const& _value, uint8 const _scale )const; + uint8 const GetAppendValueSize( string const& _value )const; + int32 ValueToInteger( string const& _value, uint8* o_precision, uint8* o_size )const; + + void UpdateMappedClass( uint8 const _instance, uint8 const _classId, uint8 const _value ); // Update mapped class's value from BASIC class + + typedef struct RefreshValue { + uint8 cc; + uint8 genre; + uint8 instance; + uint8 index; + std::vector RefreshClasses; + } RefreshValue; + + protected: + virtual void CreateVars( uint8 const _instance ){} + void ReadValueRefreshXML ( TiXmlElement const* _ccElement ); + + public: + virtual void CreateVars( uint8 const _instance, uint8 const _index ){} + + private: + uint32 m_homeId; + uint8 m_nodeId; + uint8 m_version; + Bitfield m_instances; +OPENZWAVE_EXPORT_WARNINGS_OFF + map m_endPointMap; +OPENZWAVE_EXPORT_WARNINGS_ON + bool m_afterMark; // Set to true if the command class is listed after COMMAND_CLASS_MARK, and should not create any values. + bool m_createVars; // Do we want to create variables + int8 m_overridePrecision; // Override precision when writing values if >=0 + bool m_getSupported; // Get operation supported + bool m_isSecured; // is this command class secured with the Security Command Class + bool m_SecureSupport; // Does this commandclass support secure encryption (eg, the Security CC doesn't encrypt itself, so it doesn't support encryption) + std::vector m_RefreshClassValues; // what Command Class Values should we refresh ? + + //----------------------------------------------------------------------------- + // Record which items of static data have been read from the device + //----------------------------------------------------------------------------- + public: + enum StaticRequest + { + StaticRequest_Instances = 0x01, + StaticRequest_Values = 0x02, + StaticRequest_Version = 0x04 + }; + + bool HasStaticRequest( uint8 _request )const{ return( (m_staticRequests & _request) != 0 ); } + void SetStaticRequest( uint8 _request ){ m_staticRequests |= _request; } + void ClearStaticRequest( uint8 _request ); + + private: + uint8 m_staticRequests; + + //----------------------------------------------------------------------------- + // Statistics + //----------------------------------------------------------------------------- + public: + uint32 GetSentCnt()const{ return m_sentCnt; } + uint32 GetReceivedCnt()const{ return m_receivedCnt; } + void SentCntIncr(){ m_sentCnt++; } + void ReceivedCntIncr(){ m_receivedCnt++; } + + private: + uint32 m_sentCnt; // Number of messages sent from this command class. + uint32 m_receivedCnt; // Number of messages received from this commandclass. + }; + +} // namespace OpenZWave + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClasses.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClasses.cpp new file mode 100644 index 0000000..dfccc21 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClasses.cpp @@ -0,0 +1,316 @@ +//----------------------------------------------------------------------------- +// +// CommandClasses.cpp +// +// Singleton holding methods to create each command class object +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include + +#include "CommandClasses.h" + +using namespace OpenZWave; + +#include "Alarm.h" +#include "ApplicationStatus.h" +#include "Association.h" +#include "AssociationCommandConfiguration.h" +#include "Basic.h" +#include "BasicWindowCovering.h" +#include "Battery.h" +#include "ClimateControlSchedule.h" +#include "Clock.h" +#include "Configuration.h" +#include "ControllerReplication.h" +#include "CRC16Encap.h" +#include "DoorLock.h" +#include "DoorLockLogging.h" +#include "EnergyProduction.h" +#include "Hail.h" +#include "Indicator.h" +#include "Language.h" +#include "Lock.h" +#include "ManufacturerSpecific.h" +#include "Meter.h" +#include "MeterPulse.h" +#include "MultiCmd.h" +#include "MultiInstance.h" +#include "MultiInstanceAssociation.h" +#include "NodeNaming.h" +#include "NoOperation.h" +#include "Powerlevel.h" +#include "Proprietary.h" +#include "Protection.h" +#include "SceneActivation.h" +#include "Security.h" +#include "SensorAlarm.h" +#include "SensorBinary.h" +#include "SensorMultilevel.h" +#include "SwitchAll.h" +#include "SwitchBinary.h" +#include "SwitchMultilevel.h" +#include "SwitchToggleBinary.h" +#include "SwitchToggleMultilevel.h" +#include "TimeParameters.h" +#include "ThermostatFanMode.h" +#include "ThermostatFanState.h" +#include "ThermostatMode.h" +#include "ThermostatOperatingState.h" +#include "ThermostatSetpoint.h" +#include "UserCode.h" +#include "Version.h" +#include "WakeUp.h" + +#include "../value_classes/ValueBool.h" +#include "../value_classes/ValueButton.h" +#include "../value_classes/ValueByte.h" +#include "../value_classes/ValueDecimal.h" +#include "../value_classes/ValueInt.h" +#include "../value_classes/ValueList.h" +#include "../value_classes/ValueSchedule.h" +#include "../value_classes/ValueShort.h" +#include "../value_classes/ValueString.h" + +#include "../Manager.h" +#include "../Options.h" +#include "../Utils.h" + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +CommandClasses::CommandClasses +( +) +{ + memset( m_commandClassCreators, 0, sizeof(pfnCreateCommandClass_t)*256 ); + memset( m_supportedCommandClasses, 0, sizeof(uint32)*8 ); +} + +//----------------------------------------------------------------------------- +// +// Static method to determine whether a command class is supported +//----------------------------------------------------------------------------- +bool CommandClasses::IsSupported +( + uint8 const _commandClassId +) +{ + // Test the bit representing the command class + return( (Get().m_supportedCommandClasses[_commandClassId>>5] & (1u<<(_commandClassId&0x1f))) != 0 ); +} +string CommandClasses::GetName( + uint8 const _commandClassId +) +{ + for (std::map::iterator it = Get().m_namesToIDs.begin(); it != Get().m_namesToIDs.end(); it++) { + if (it->second == _commandClassId) + return it->first; + } + return string("Unknown"); +} +//----------------------------------------------------------------------------- +// +// Static method to register a command class creator method +//----------------------------------------------------------------------------- +void CommandClasses::Register +( + uint8 const _commandClassId, + string const& _commandClassName, + pfnCreateCommandClass_t _creator +) +{ + m_commandClassCreators[_commandClassId] = _creator; + + // Set the bit representing the command class + Get().m_supportedCommandClasses[_commandClassId>>5] |= (1u<<(_commandClassId&0x1f)); + + m_namesToIDs[_commandClassName] = _commandClassId; +} + +//----------------------------------------------------------------------------- +// +// Create a command class object using the registered method +//----------------------------------------------------------------------------- +CommandClass* CommandClasses::CreateCommandClass +( + uint8 const _commandClassId, + uint32 const _homeId, + uint8 const _nodeId +) +{ + // Get a pointer to the required CommandClass's Create method + pfnCreateCommandClass_t creator = Get().m_commandClassCreators[_commandClassId]; + if( NULL == creator ) + { + return NULL; + } + + // Create an instance of the command class + return creator( _homeId, _nodeId ); +} + +//----------------------------------------------------------------------------- +// +// Register all our implemented command classes +//----------------------------------------------------------------------------- +void CommandClasses::RegisterCommandClasses +( +) +{ + CommandClasses& cc = Get(); + cc.Register( Alarm::StaticGetCommandClassId(), Alarm::StaticGetCommandClassName(), Alarm::Create ); + cc.Register( ApplicationStatus::StaticGetCommandClassId(), ApplicationStatus::StaticGetCommandClassName(), ApplicationStatus::Create ); + cc.Register( Association::StaticGetCommandClassId(), Association::StaticGetCommandClassName(), Association::Create ); + cc.Register( AssociationCommandConfiguration::StaticGetCommandClassId(), AssociationCommandConfiguration::StaticGetCommandClassName(), AssociationCommandConfiguration::Create ); + cc.Register( Basic::StaticGetCommandClassId(), Basic::StaticGetCommandClassName(), Basic::Create ); + cc.Register( BasicWindowCovering::StaticGetCommandClassId(), BasicWindowCovering::StaticGetCommandClassName(), BasicWindowCovering::Create ); + cc.Register( Battery::StaticGetCommandClassId(), Battery::StaticGetCommandClassName(), Battery::Create ); + cc.Register( ClimateControlSchedule::StaticGetCommandClassId(), ClimateControlSchedule::StaticGetCommandClassName(), ClimateControlSchedule::Create ); + cc.Register( Clock::StaticGetCommandClassId(), Clock::StaticGetCommandClassName(), Clock::Create ); + cc.Register( Configuration::StaticGetCommandClassId(), Configuration::StaticGetCommandClassName(), Configuration::Create ); + cc.Register( ControllerReplication::StaticGetCommandClassId(), ControllerReplication::StaticGetCommandClassName(), ControllerReplication::Create ); + cc.Register( CRC16Encap::StaticGetCommandClassId(), CRC16Encap::StaticGetCommandClassName(), CRC16Encap::Create ); + cc.Register( DoorLock::StaticGetCommandClassId(), DoorLock::StaticGetCommandClassName(), DoorLock::Create ); + cc.Register( DoorLockLogging::StaticGetCommandClassId(), DoorLockLogging::StaticGetCommandClassName(), DoorLockLogging::Create); + cc.Register( EnergyProduction::StaticGetCommandClassId(), EnergyProduction::StaticGetCommandClassName(), EnergyProduction::Create ); + cc.Register( Hail::StaticGetCommandClassId(), Hail::StaticGetCommandClassName(), Hail::Create ); + cc.Register( Indicator::StaticGetCommandClassId(), Indicator::StaticGetCommandClassName(), Indicator::Create ); + cc.Register( Language::StaticGetCommandClassId(), Language::StaticGetCommandClassName(), Language::Create ); + cc.Register( Lock::StaticGetCommandClassId(), Lock::StaticGetCommandClassName(), Lock::Create ); + cc.Register( ManufacturerSpecific::StaticGetCommandClassId(), ManufacturerSpecific::StaticGetCommandClassName(), ManufacturerSpecific::Create ); + cc.Register( Meter::StaticGetCommandClassId(), Meter::StaticGetCommandClassName(), Meter::Create ); + cc.Register( MeterPulse::StaticGetCommandClassId(), MeterPulse::StaticGetCommandClassName(), MeterPulse::Create ); + cc.Register( MultiCmd::StaticGetCommandClassId(), MultiCmd::StaticGetCommandClassName(), MultiCmd::Create ); + cc.Register( MultiInstance::StaticGetCommandClassId(), MultiInstance::StaticGetCommandClassName(), MultiInstance::Create ); + cc.Register( MultiInstanceAssociation::StaticGetCommandClassId(), MultiInstanceAssociation::StaticGetCommandClassName(), MultiInstanceAssociation::Create ); + cc.Register( NodeNaming::StaticGetCommandClassId(), NodeNaming::StaticGetCommandClassName(), NodeNaming::Create ); + cc.Register( NoOperation::StaticGetCommandClassId(), NoOperation::StaticGetCommandClassName(), NoOperation::Create ); + cc.Register( Powerlevel::StaticGetCommandClassId(), Powerlevel::StaticGetCommandClassName(), Powerlevel::Create ); + cc.Register( Proprietary::StaticGetCommandClassId(), Proprietary::StaticGetCommandClassName(), Proprietary::Create ); + cc.Register( Protection::StaticGetCommandClassId(), Protection::StaticGetCommandClassName(), Protection::Create ); + cc.Register( SceneActivation::StaticGetCommandClassId(), SceneActivation::StaticGetCommandClassName(), SceneActivation::Create ); + cc.Register( Security::StaticGetCommandClassId(), Security::StaticGetCommandClassName(), Security::Create); + cc.Register( SensorAlarm::StaticGetCommandClassId(), SensorAlarm::StaticGetCommandClassName(), SensorAlarm::Create ); + cc.Register( SensorBinary::StaticGetCommandClassId(), SensorBinary::StaticGetCommandClassName(), SensorBinary::Create ); + cc.Register( SensorMultilevel::StaticGetCommandClassId(), SensorMultilevel::StaticGetCommandClassName(), SensorMultilevel::Create ); + cc.Register( SwitchAll::StaticGetCommandClassId(), SwitchAll::StaticGetCommandClassName(), SwitchAll::Create ); + cc.Register( SwitchBinary::StaticGetCommandClassId(), SwitchBinary::StaticGetCommandClassName(), SwitchBinary::Create ); + cc.Register( SwitchMultilevel::StaticGetCommandClassId(), SwitchMultilevel::StaticGetCommandClassName(), SwitchMultilevel::Create ); + cc.Register( SwitchToggleBinary::StaticGetCommandClassId(), SwitchToggleBinary::StaticGetCommandClassName(), SwitchToggleBinary::Create ); + cc.Register( SwitchToggleMultilevel::StaticGetCommandClassId(), SwitchToggleMultilevel::StaticGetCommandClassName(), SwitchToggleMultilevel::Create ); + cc.Register( TimeParameters::StaticGetCommandClassId(), TimeParameters::StaticGetCommandClassName(), TimeParameters::Create); + cc.Register( ThermostatFanMode::StaticGetCommandClassId(), ThermostatFanMode::StaticGetCommandClassName(), ThermostatFanMode::Create ); + cc.Register( ThermostatFanState::StaticGetCommandClassId(), ThermostatFanState::StaticGetCommandClassName(), ThermostatFanState::Create ); + cc.Register( ThermostatMode::StaticGetCommandClassId(), ThermostatMode::StaticGetCommandClassName(), ThermostatMode::Create ); + cc.Register( ThermostatOperatingState::StaticGetCommandClassId(), ThermostatOperatingState::StaticGetCommandClassName(), ThermostatOperatingState::Create ); + cc.Register( ThermostatSetpoint::StaticGetCommandClassId(), ThermostatSetpoint::StaticGetCommandClassName(), ThermostatSetpoint::Create ); + cc.Register( UserCode::StaticGetCommandClassId(), UserCode::StaticGetCommandClassName(), UserCode::Create ); + cc.Register( Version::StaticGetCommandClassId(), Version::StaticGetCommandClassName(), Version::Create ); + cc.Register( WakeUp::StaticGetCommandClassId(), WakeUp::StaticGetCommandClassName(), WakeUp::Create ); + + // Now all the command classes have been registered, we can modify the + // supported command classes array according to the program options. + string str; + Options::Get()->GetOptionAsString( "Include", &str ); + if( str != "" ) + { + // The include list has entries, so we assume that it is a + // complete list of what should be supported. + // Any existing support is cleared first. + memset( cc.m_supportedCommandClasses, 0, sizeof(uint32)*8 ); + cc.ParseCommandClassOption( str, true ); + } + + // Apply the excluded command class option + Options::Get()->GetOptionAsString( "Exclude", &str ); + if( str != "" ) + { + cc.ParseCommandClassOption( str, false ); + } +} + +//----------------------------------------------------------------------------- +// +// Parse a comma delimited list of included/excluded command classes +//----------------------------------------------------------------------------- +void CommandClasses::ParseCommandClassOption +( + string const& _optionStr, + bool const _include +) +{ + size_t pos = 0; + size_t start = 0; + bool parsing = true; + while( parsing ) + { + string ccStr; + + pos = _optionStr.find_first_of( ",", start ); + if( string::npos == pos ) + { + ccStr = _optionStr.substr( start ); + parsing = false; + } + else + { + ccStr = _optionStr.substr( start, pos-start ); + start = pos + 1; + } + + if( ccStr != "" ) + { + uint8 ccIdx = GetCommandClassId( ccStr ); + if( _include ) + { + m_supportedCommandClasses[ccIdx>>5] |= (1u<<(ccIdx&0x1f)); + } + else + { + m_supportedCommandClasses[ccIdx>>5] &= ~(1u<<(ccIdx&0x1f)); + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Convert a command class name (e.g COMMAND_CLASS_BASIC) into its 8-bit ID +//----------------------------------------------------------------------------- +uint8 CommandClasses::GetCommandClassId +( + string const& _name +) +{ + string upperName = ToUpper( _name ); + map::iterator it = m_namesToIDs.find( upperName ); + if( it != m_namesToIDs.end() ) + { + return it->second; + } + + return 0xff; +} + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClasses.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClasses.h new file mode 100644 index 0000000..fc9f886 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/CommandClasses.h @@ -0,0 +1,79 @@ +//----------------------------------------------------------------------------- +// +// CommandClasses.h +// +// Singleton holding methods to create each command class object +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _CommandClasses_H +#define _CommandClasses_H + +#include +#include +#include "../Defs.h" + +namespace OpenZWave +{ + class CommandClass; + + /** \brief Manages a map of command classes supported by a specific Z-Wave node. + */ + class CommandClasses + { + public: + typedef CommandClass* (*pfnCreateCommandClass_t)( uint32 const _homeId, uint8 const _nodeId ); + + static void RegisterCommandClasses(); + static CommandClass* CreateCommandClass( uint8 const _commandClassId, uint32 const _homeId, uint8 const _nodeId ); + + static bool IsSupported( uint8 const _commandClassId ); + static string GetName(uint8 const _commandClassId); + private: + CommandClasses(); + CommandClasses( CommandClasses const& ); // prevent copy + CommandClasses& operator = ( CommandClasses const& ); // prevent assignment + + static CommandClasses& Get() + { + static CommandClasses instance; + return instance; + } + + void Register( uint8 const _commandClassId, string const& _commandClassName, pfnCreateCommandClass_t _create ); + void ParseCommandClassOption( string const& _optionStr, bool const _include ); + uint8 GetCommandClassId( string const& _name ); + + pfnCreateCommandClass_t m_commandClassCreators[256]; + map m_namesToIDs; + + // m_supportedCommandClasses uses single bits to mark whether OpenZWave supports a command class + // Checking this is not the same as looking for non-NULL entried in m_commandClassCreators, since + // this may be modified by the program options --Include and --Ingnore to filter out support + // for unwanted command classes. + uint32 m_supportedCommandClasses[8]; + }; + +} // namespace OpenZWave + + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Configuration.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Configuration.cpp new file mode 100644 index 0000000..bd7d49b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Configuration.cpp @@ -0,0 +1,277 @@ +//----------------------------------------------------------------------------- +// +// Configuration.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_CONFIGURATION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "Configuration.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../Node.h" +#include "../platform/Log.h" +#include "../value_classes/ValueBool.h" +#include "../value_classes/ValueButton.h" +#include "../value_classes/ValueByte.h" +#include "../value_classes/ValueInt.h" +#include "../value_classes/ValueList.h" +#include "../value_classes/ValueShort.h" + +using namespace OpenZWave; + +enum ConfigurationCmd +{ + ConfigurationCmd_Set = 0x04, + ConfigurationCmd_Get = 0x05, + ConfigurationCmd_Report = 0x06 +}; + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Configuration::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if (ConfigurationCmd_Report == (ConfigurationCmd)_data[0]) + { + // Extract the parameter index and value + uint8 parameter = _data[1]; + uint8 size = _data[2] & 0x07; + int32 paramValue = 0; + for( uint8 i=0; iGetID().GetType() ) + { + case ValueID::ValueType_Bool: + { + ValueBool* valueBool = static_cast( value ); + valueBool->OnValueRefreshed( paramValue != 0 ); + break; + } + case ValueID::ValueType_Byte: + { + ValueByte* valueByte = static_cast( value ); + valueByte->OnValueRefreshed( (uint8)paramValue ); + break; + } + case ValueID::ValueType_Short: + { + ValueShort* valueShort = static_cast( value ); + valueShort->OnValueRefreshed( (int16)paramValue ); + break; + } + case ValueID::ValueType_Int: + { + ValueInt* valueInt = static_cast( value ); + valueInt->OnValueRefreshed( paramValue ); + break; + } + case ValueID::ValueType_List: + { + ValueList* valueList = static_cast( value ); + valueList->OnValueRefreshed( paramValue ); + break; + } + default: + { + Log::Write( LogLevel_Info, GetNodeId(), "Invalid type (%d) for configuration parameter %d", value->GetID().GetType(), parameter ); + } + } + value->Release(); + } + else + { + char label[16]; + snprintf( label, 16, "Parameter #%d", parameter ); + + // Create a new value + if( Node* node = GetNodeUnsafe() ) + { + switch( size ) + { + case 1: + { + node->CreateValueByte( ValueID::ValueGenre_Config, GetCommandClassId(), _instance, parameter, label, "", false, false, (uint8)paramValue, 0 ); + break; + } + case 2: + { + node->CreateValueShort( ValueID::ValueGenre_Config, GetCommandClassId(), _instance, parameter, label, "", false, false, (int16)paramValue, 0 ); + break; + } + case 4: + { + node->CreateValueInt( ValueID::ValueGenre_Config, GetCommandClassId(), _instance, parameter, label, "", false, false, (int32)paramValue, 0 ); + break; + } + default: + { + Log::Write( LogLevel_Info, GetNodeId(), "Invalid size of %d bytes for configuration parameter %d", size, parameter ); + } + } + } + } + + Log::Write( LogLevel_Info, GetNodeId(), "Received Configuration report: Parameter=%d, Value=%d", parameter, paramValue ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a value in the Z-Wave device +//----------------------------------------------------------------------------- +bool Configuration::SetValue +( + Value const& _value +) +{ + uint8 param = _value.GetID().GetIndex(); + switch( _value.GetID().GetType() ) + { + case ValueID::ValueType_Bool: + { + ValueBool const& valueBool = static_cast( _value ); + Set( param, (int32)valueBool.GetValue(), 1 ); + return true; + } + case ValueID::ValueType_Byte: + { + ValueByte const& valueByte = static_cast( _value ); + Set( param, (int32)valueByte.GetValue(), 1 ); + return true; + } + case ValueID::ValueType_Short: + { + ValueShort const& valueShort = static_cast( _value ); + Set( param, (int32)valueShort.GetValue(), 2 ); + return true; + } + case ValueID::ValueType_Int: + { + ValueInt const& valueInt = static_cast( _value ); + Set( param, valueInt.GetValue(), 4 ); + return true; + } + case ValueID::ValueType_List: + { + ValueList const& valueList = static_cast( _value ); + Set( param, valueList.GetItem().m_value, valueList.GetSize() ); + return true; + } + case ValueID::ValueType_Button: + { + ValueButton const& valueButton = static_cast( _value ); + Set( param, valueButton.IsPressed(), 1 ); + return true; + } + default: + { + } + } + + Log::Write( LogLevel_Info, GetNodeId(), "Configuration::Set failed (bad value or value type) - Parameter=%d", param ); + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current parameter value from the device +//----------------------------------------------------------------------------- +bool Configuration::RequestValue +( + uint32 const _requestFlags, + uint8 const _parameter, // parameter number is encoded as the Index portion of ValueID + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _instance != 1 ) + { + // This command class doesn't work with multiple instances + return false; + } + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "ConfigurationCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( ConfigurationCmd_Get ); + msg->Append( _parameter ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "ConfigurationCmd_Get Not Supported on this node"); + } + return false; +} +//----------------------------------------------------------------------------- +// +// Set the device's +//----------------------------------------------------------------------------- +void Configuration::Set +( + uint8 const _parameter, + int32 const _value, + uint8 const _size +) +{ + Log::Write( LogLevel_Info, GetNodeId(), "Configuration::Set - Parameter=%d, Value=%d Size=%d", _parameter, _value, _size ); + + Msg* msg = new Msg( "ConfigurationCmd_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->Append( GetNodeId() ); + msg->Append( 4 + _size ); + msg->Append( GetCommandClassId() ); + msg->Append( ConfigurationCmd_Set ); + msg->Append( _parameter ); + msg->Append( _size ); + if( _size > 2 ) + { + msg->Append( (uint8)( ( _value>>24 ) & 0xff ) ); + msg->Append( (uint8)( ( _value>>16 ) & 0xff ) ); + } + if( _size > 1 ) + { + msg->Append( (uint8)( ( _value>>8 ) & 0xff ) ); + } + msg->Append( (uint8)( _value & 0xff ) ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Configuration.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Configuration.h new file mode 100644 index 0000000..ad38879 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Configuration.h @@ -0,0 +1,67 @@ +//----------------------------------------------------------------------------- +// +// Configuration.h +// +// Implementation of the Z-Wave COMMAND_CLASS_CONFIGURATION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Configuration_H +#define _Configuration_H + +#include +#include "CommandClass.h" + +namespace OpenZWave +{ + class Value; + + /** \brief Implements COMMAND_CLASS_CONFIGURATION (x70), a Z-Wave device command class. + */ + class Configuration: public CommandClass + { + friend class Node; + + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Configuration( _homeId, _nodeId ); } + virtual ~Configuration(){} + + static uint8 const StaticGetCommandClassId(){ return 0x70; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_CONFIGURATION"; } + + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _parameter, uint8 const _index, Driver::MsgQueue const _queue ); + void Set( uint8 const _parameter, int32 const _value, uint8 const _size ); + + // From CommandClass + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + private: + Configuration( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ControllerReplication.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ControllerReplication.cpp new file mode 100644 index 0000000..822ef17 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ControllerReplication.cpp @@ -0,0 +1,326 @@ +//----------------------------------------------------------------------------- +// +// ControllerReplication.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_CONTROLLER_REPLICATION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "ControllerReplication.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../Node.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueByte.h" +#include "../value_classes/ValueList.h" +#include "../value_classes/ValueButton.h" + +using namespace OpenZWave; + +enum ControllerReplicationCmd +{ + ControllerReplicationCmd_TransferGroup = 0x31, + ControllerReplicationCmd_TransferGroupName = 0x32, + ControllerReplicationCmd_TransferScene = 0x33, + ControllerReplicationCmd_TransferSceneName = 0x34 +}; + +enum +{ + ControllerReplicationIndex_NodeId = 0, + ControllerReplicationIndex_Function, + ControllerReplicationIndex_Replicate +}; + +static char const* c_controllerReplicationFunctionNames[] = +{ + "Groups", + "Group Names", + "Scenes", + "Scene Names", +}; + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +ControllerReplication::ControllerReplication +( + uint32 const _homeId, + uint8 const _nodeId +): + CommandClass( _homeId, _nodeId ), + m_busy( false ), + m_targetNodeId( 0 ), + m_funcId( 0 ), + m_nodeId( -1 ), + m_groupCount( -1 ), + m_groupIdx( -1 ) +{ +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool ControllerReplication::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + // When creating replication messages, use FUNC_ID_ZW_SEND_REPLICATION_DATA instead of FUNC_ID_ZW_SEND_DATA + // e.g. Msg* msg = new Msg( "TransferGroup", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_REPLICATION_DATA, true, false ); + + switch( _data[0] ) + { + case ControllerReplicationCmd_TransferGroup: + { + break; + } + case ControllerReplicationCmd_TransferGroupName: + { + break; + } + case ControllerReplicationCmd_TransferScene: + { + break; + } + case ControllerReplicationCmd_TransferSceneName: + { + break; + } + } + + Msg* msg = new Msg( "ControllerReplication Command Complete", GetNodeId(), REQUEST, FUNC_ID_ZW_REPLICATION_COMMAND_COMPLETE, false, false ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Command ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Set a value on the Z-Wave device +//----------------------------------------------------------------------------- +bool ControllerReplication::SetValue +( + Value const& _value +) +{ + bool res = false; + uint8 instance = _value.GetID().GetInstance(); + + switch( _value.GetID().GetIndex() ) + { + case ControllerReplicationIndex_NodeId: + { + if( ValueByte* value = static_cast( GetValue( instance, ControllerReplicationIndex_NodeId ) ) ) + { + value->OnValueRefreshed( (static_cast( &_value))->GetValue() ); + value->Release(); + res = true; + } + break; + } + case ControllerReplicationIndex_Function: + { + if( ValueList* value = static_cast( GetValue( instance, ControllerReplicationIndex_Function ) ) ) + { + ValueList::Item const& item = (static_cast( &_value))->GetItem(); + value->OnValueRefreshed( item.m_value ); + value->Release(); + res = true; + } + break; + } + case ControllerReplicationIndex_Replicate: + { + if( ValueButton* button = static_cast( GetValue( instance, ControllerReplicationIndex_Replicate ) ) ) + { + if( button->IsPressed() ) + { + res = StartReplication( instance ); + } + button->Release(); + } + break; + } + } + return res; +} + +//----------------------------------------------------------------------------- +// +// Set up the group and scene data to be sent to the other controller +//----------------------------------------------------------------------------- +bool ControllerReplication::StartReplication +( + uint8 const _instance +) +{ + if( m_busy ) + { + return false; + } + + if( ValueByte* value = static_cast( GetValue( _instance, ControllerReplicationIndex_NodeId ) ) ) + { + m_targetNodeId = value->GetValue(); + value->Release(); + } + else + { + return false; + } + + if( ValueList* value = static_cast( GetValue( _instance, ControllerReplicationIndex_Function ) ) ) + { + ValueList::Item const& item = value->GetItem(); + m_funcId = item.m_value; + value->Release(); + } + else + { + return false; + } + + // Store the Z-Wave command we should use when replication has completed. + m_nodeId = -1; + m_groupCount = -1; + m_groupIdx = -1; + m_busy = true; + + // Set up the groups and scenes to be sent + SendNextData(); + return true; +} + +//----------------------------------------------------------------------------- +// +// Send the next block of replication data +//----------------------------------------------------------------------------- +void ControllerReplication::SendNextData +( +) +{ + uint16 i = 255; + + if( !m_busy ) + { + return; + } + + while( 1 ) + { + if( m_groupIdx != -1 ) + { + m_groupIdx++; + if( m_groupIdx <= m_groupCount ) + { + break; + } + } + i = m_nodeId == -1 ? 0 : m_nodeId+1; + GetDriver()->LockNodes(); + while( i < 256 ) + { + if( GetDriver()->m_nodes[i] ) + { + m_groupCount = GetDriver()->m_nodes[i]->GetNumGroups(); + if( m_groupCount != 0 ) + { + m_groupName = GetDriver()->m_nodes[i]->GetGroupLabel( m_groupIdx ); + m_groupIdx = m_groupName.length() > 0 ? 0 : 1; + break; + } + } + i++; + } + GetDriver()->ReleaseNodes(); + m_nodeId = i; + break; + } + if( i < 255 ) + { + Msg* msg = new Msg( "Replication Send", m_targetNodeId, REQUEST, FUNC_ID_ZW_REPLICATION_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( m_targetNodeId ); + if( m_groupName.length() > 0 ) + { + msg->Append((uint8) (m_groupName.length() + 4 )); + msg->Append( GetCommandClassId() ); + msg->Append( ControllerReplicationCmd_TransferGroupName ); + msg->Append( 0 ); + msg->Append( m_groupIdx ); + for( uint8 j = 0; j < m_groupName.length(); j++ ) + { + msg->Append( m_groupName[j] ); + } + m_groupName = ""; + } + else + { + msg->Append( 5 ); + msg->Append( GetCommandClassId() ); + msg->Append( ControllerReplicationCmd_TransferGroup ); + msg->Append( 0 ); + msg->Append( m_groupIdx ); + msg->Append( m_nodeId ); + } + msg->Append( TRANSMIT_OPTION_ACK ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Command ); + } + else + { + GetDriver()->AddNodeStop( m_funcId ); + m_busy = false; + } +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void ControllerReplication::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueByte( ValueID::ValueGenre_System, GetCommandClassId(), _instance, ControllerReplicationIndex_NodeId, "Node", "", false, false, 0, 0 ); + vector items; + + ValueList::Item item; + for( uint8 i=0; i<4; ++i ) + { + item.m_label = c_controllerReplicationFunctionNames[i]; + item.m_value = ControllerReplicationCmd_TransferGroup + i; + items.push_back( item ); + } + + node->CreateValueList( ValueID::ValueGenre_System, GetCommandClassId(), _instance, ControllerReplicationIndex_Function, "Functions", "", false, false, 1, items, 0, 0 ); + node->CreateValueButton( ValueID::ValueGenre_System, GetCommandClassId(), _instance, ControllerReplicationIndex_Replicate, "Replicate", 0 ); + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ControllerReplication.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ControllerReplication.h new file mode 100644 index 0000000..047a58f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ControllerReplication.h @@ -0,0 +1,74 @@ +//----------------------------------------------------------------------------- +// +// ControllerReplication.h +// +// Implementation of the Z-Wave COMMAND_CLASS_CONTROLLER_REPLICATION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ControllerReplication_H +#define _ControllerReplication_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_CONTROLLER_REPLICATION (0x21), a Z-Wave device command class. + */ + class ControllerReplication: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new ControllerReplication( _homeId, _nodeId ); } + virtual ~ControllerReplication(){} + + static uint8 const StaticGetCommandClassId(){ return 0x21; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_CONTROLLER_REPLICATION"; } + + // From CommandClass + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + void SendNextData(); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + ControllerReplication( uint32 const _homeId, uint8 const _nodeId ); + bool StartReplication( uint8 const _instance ); + + + bool m_busy; + uint8 m_targetNodeId; + uint8 m_funcId; + int m_nodeId; + int m_groupCount; + int m_groupIdx; + string m_groupName; + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLock.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLock.cpp new file mode 100644 index 0000000..6b1404d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLock.cpp @@ -0,0 +1,586 @@ +//----------------------------------------------------------------------------- +// +// DoorLock.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_DOOR_LOCK +// +// Copyright (c) 2014 Justin Hammond +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "DoorLock.h" +#include "WakeUp.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueBool.h" +#include "../value_classes/ValueByte.h" +#include "../value_classes/ValueInt.h" + +#include "../tinyxml.h" + +using namespace OpenZWave; + +enum DoorLockCmd +{ + DoorLockCmd_Set = 0x01, + DoorLockCmd_Get = 0x02, + DoorLockCmd_Report = 0x03, + DoorLockCmd_Configuration_Set = 0x04, + DoorLockCmd_Configuration_Get = 0x05, + DoorLockCmd_Configuration_Report= 0x06 +}; + +enum TimeOutMode +{ + DoorLockConfig_NoTimeout = 0x01, + DoorLockConfig_Timeout = 0x02 +}; + +static char const* c_TimeOutModeNames[] = +{ + "No Timeout", + "Secure Lock after Timeout" +}; + +enum DoorLockControlState +{ + DoorLockControlState_Handle1 = 0x01, + DoorLockControlState_Handle2 = 0x02, + DoorLockControlState_Handle3 = 0x04, + DoorLockControlState_Handle4 = 0x08 +}; + +enum ValueIDSystemIndexes +{ + Value_Lock = 0x00, /* Simple On/Off Mode for Lock */ + Value_Lock_Mode = 0x01, /* To Set more Complex Lock Modes (Such as timeouts etc) */ + Value_System_Config_Mode = 0x02, /* To Set/Unset if Locks should return to Secured Mode after a timeout */ + Value_System_Config_Minutes = 0x03, /* If Timeouts are enabled, how many minutes before a Lock "AutoLocks" */ + Value_System_Config_Seconds = 0x04, /* If Timeouts are enabled, how many seconds beofre a Lock "Autolocks" */ + Value_System_Config_OutsideHandles = 0x05, /* What Outside Handles are controlled via Z-Wave (BitMask 1-4) */ + Value_System_Config_InsideHandles = 0x06, /* What inside Handles are control via ZWave (BitMask 1-4) */ +}; + +enum DoorLockState +{ + DoorLockState_Unsecured = 0x00, + DoorLockState_Unsecured_Timeout = 0x01, + DoorLockState_Inside_Unsecured = 0x10, + DoorLockState_Inside_Unsecured_Timeout = 0x11, + DoorLockState_Outside_Unsecured = 0x20, + DoorLockState_Outside_Unsecured_Timeout = 0x21, + DoorLockState_Secured = 0xFF +}; + + +static char const* c_LockStateNames[] = +{ + "Unsecure", + "Unsecured with Timeout", + "Inside Handle Unsecured", + "Inside Handle Unsecured with Timeout", + "Outside Handle Unsecured", + "Outside Handle Unsecured with Timeout", + "Secured", + "Invalid" +}; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +DoorLock::DoorLock +( + uint32 const _homeId, + uint8 const _nodeId +): + CommandClass( _homeId, _nodeId ), + m_timeoutsupported(0), + m_insidehandlemode(0), + m_outsidehandlemode(0), + m_timeoutmins(0xFE), + m_timeoutsecs(0xFE) +{ + SetStaticRequest( StaticRequest_Values ); +} + +//----------------------------------------------------------------------------- +// +// Class specific configuration +//----------------------------------------------------------------------------- +void DoorLock::ReadXML +( + TiXmlElement const* _ccElement +) +{ + int32 intVal; + + CommandClass::ReadXML( _ccElement ); + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "m_timeoutsupported", &intVal ) ) + { + m_timeoutsupported = intVal; + } + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "m_insidehandlemode", &intVal ) ) + { + m_insidehandlemode = intVal; + } + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "m_outsidehandlemode", &intVal ) ) + { + m_outsidehandlemode = intVal; + } + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "m_timeoutmins", &intVal ) ) + { + m_timeoutmins = intVal; + } + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "m_timeoutsecs", &intVal ) ) + { + m_timeoutsecs = intVal; + } +} + +//----------------------------------------------------------------------------- +// +// Class specific configuration +//----------------------------------------------------------------------------- +void DoorLock::WriteXML +( + TiXmlElement* _ccElement +) +{ + char str[32]; + + CommandClass::WriteXML( _ccElement ); + snprintf( str, sizeof(str), "%d", m_timeoutsupported ); + _ccElement->SetAttribute( "m_timeoutsupported", str); + + snprintf( str, sizeof(str), "%d", m_insidehandlemode ); + _ccElement->SetAttribute( "m_insidehandlemode", str); + + snprintf( str, sizeof(str), "%d", m_outsidehandlemode ); + _ccElement->SetAttribute( "m_outsidehandlemode", str); + + snprintf( str, sizeof(str), "%d", m_timeoutmins ); + _ccElement->SetAttribute( "m_timeoutmins", str); + + snprintf( str, sizeof(str), "%d", m_timeoutsecs ); + _ccElement->SetAttribute( "m_timeoutsecs", str); + +} + + + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool DoorLock::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + bool requests = false; + if( ( _requestFlags & RequestFlag_Static ) && HasStaticRequest( StaticRequest_Values ) ) + { + requests = RequestValue( _requestFlags, Value_System_Config_Mode, _instance, _queue ); + } + + if( _requestFlags & RequestFlag_Dynamic ) + { + requests |= RequestValue( _requestFlags, Value_Lock, _instance, _queue ); + } + + return requests; +} + + + + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool DoorLock::RequestValue +( + uint32 const _requestFlags, + uint8 const _what, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( _what >= Value_System_Config_Mode) { + Msg* msg = new Msg( "DoorLockCmd_Configuration_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( DoorLockCmd_Configuration_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + + } else if ((_what == Value_Lock) || (_what == Value_Lock_Mode)) { + + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "DoorLockCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( DoorLockCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "DoorLockCmd_Get Not Supported on this node"); + } + } + return false; +} + + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool DoorLock::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + + if( DoorLockCmd_Report == (DoorLockCmd)_data[0] ) + { + uint8 lockState = (_data[1] == 0xFF) ? 6 : _data[1]; + if (lockState > 6) /* size of c_LockStateNames minus Invalid Entry */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "LockState Value was greater than range. Setting to Invalid"); + lockState = 7; + } + + Log::Write( LogLevel_Info, GetNodeId(), "Received DoorLock report: DoorLock is %s", c_LockStateNames[lockState] ); + + if( ValueBool* value = static_cast( GetValue( _instance, Value_Lock ) ) ) + { + value->OnValueRefreshed( lockState == 0xFF ); + value->Release(); + } + if( ValueList* value = static_cast( GetValue( _instance, Value_Lock_Mode ) ) ) + { + value->OnValueRefreshed( lockState); + value->Release(); + } + return true; + } else if (DoorLockCmd_Configuration_Report == (DoorLockCmd)_data[0] ) + { + switch (_data[1]) { + case DoorLockConfig_NoTimeout: + m_timeoutsupported = DoorLockConfig_NoTimeout; + RemoveValue(_instance, Value_System_Config_Minutes); + RemoveValue(_instance, Value_System_Config_Seconds); + m_timeoutmins = 0xFE; + m_timeoutsecs = 0xFE; + break; + case DoorLockConfig_Timeout: + /* if we have a timeout, then create the Values for the timeout config */ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueInt( ValueID::ValueGenre_System, GetCommandClassId(), _instance, Value_System_Config_Minutes, "Timeout Minutes", "Mins", false, false, _data[3], 0 ); + node->CreateValueInt( ValueID::ValueGenre_System, GetCommandClassId(), _instance, Value_System_Config_Seconds, "Timeout Seconds", "Secs", false, false, _data[4], 0 ); + } + m_timeoutsupported = DoorLockConfig_Timeout; + m_timeoutmins = _data[3]; + m_timeoutsecs = _data[4]; + break; + default: + Log::Write(LogLevel_Warning, GetNodeId(), "Recieved a Unsupported Door Lock Config Report %d", _data[1]); + } + + if( ValueByte* value = static_cast( GetValue( _instance, Value_System_Config_OutsideHandles ) ) ) + { + value->OnValueRefreshed( ((_data[2] & 0xF0)>>4) ); + value->Release(); + m_outsidehandlemode = ((_data[2] & 0xF0)>>4); + } + if( ValueByte* value = static_cast( GetValue( _instance, Value_System_Config_InsideHandles ) ) ) + { + value->OnValueRefreshed( (_data[2] & 0x0F) ); + value->Release(); + m_insidehandlemode = (_data[2] & 0x0F); + } + + + ClearStaticRequest( StaticRequest_Values ); + + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Set the lock's state +//----------------------------------------------------------------------------- +bool DoorLock::SetValue +( + Value const& _value +) +{ + uint8 instance = _value.GetID().GetInstance(); + if( (Value_Lock == _value.GetID().GetIndex()) && ValueID::ValueType_Bool == _value.GetID().GetType() ) + { + ValueBool const* value = static_cast(&_value); + + Log::Write( LogLevel_Info, GetNodeId(), "Value_Lock::Set - Requesting lock to be %s", value->GetValue() ? "Locked" : "Unlocked" ); + Msg* msg = new Msg( "DoorLockCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( DoorLockCmd_Set ); + msg->Append( value->GetValue() ? 0xFF:0x00 ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + if ( (Value_Lock_Mode == _value.GetID().GetIndex()) && (ValueID::ValueType_List == _value.GetID().GetType()) ) + { + ValueList const* value = static_cast(&_value); + ValueList::Item const& item = value->GetItem(); + + + Log::Write( LogLevel_Info, GetNodeId(), "Value_Lock_Mode::Set - Requesting lock to be %s", item.m_label.c_str() ); + Msg* msg = new Msg( "DoorLockCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( DoorLockCmd_Set ); + msg->Append( item.m_value ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + /* if its any of our System Messages.... */ + if ( Value_System_Config_Mode >= _value.GetID().GetIndex() ) + { + bool sendmsg = true; + switch (_value.GetID().GetIndex()) { + /* this is a List */ + case Value_System_Config_Mode: + if (ValueID::ValueType_List != _value.GetID().GetType()) { + sendmsg = false; + break; + } + if( ValueList* value = static_cast( GetValue( instance, _value.GetID().GetIndex() ) ) ) + { + ValueList::Item const& item = (static_cast( &_value))->GetItem(); + value->OnValueRefreshed( item.m_value ); + value->Release(); + } + + break; + + /* these are a int */ + case Value_System_Config_Minutes: + case Value_System_Config_Seconds: + if (ValueID::ValueType_Int != _value.GetID().GetType()) { + sendmsg = false; + break; + } + if( ValueInt* value = static_cast( GetValue( instance, _value.GetID().GetIndex() ) ) ) + { + value->OnValueRefreshed( (static_cast( &_value))->GetValue() ); + value->Release(); + } + break; + /* these are a byte */ + case Value_System_Config_OutsideHandles: + case Value_System_Config_InsideHandles: + if (ValueID::ValueType_Byte != _value.GetID().GetType()) { + sendmsg = false; + break; + } + if( ValueByte* value = static_cast( GetValue( instance, _value.GetID().GetIndex() ) ) ) + { + value->OnValueRefreshed( (static_cast( &_value))->GetValue() ); + value->Release(); + } + break; + default: + Log::Write(LogLevel_Warning, GetNodeId(), "DoorLock::SetValue - Unhandled System_Config Variable %d", _value.GetID().GetIndex()); + sendmsg = false; + break; + } + + if (sendmsg) + { + bool ok = true; + if( ValueList* value = static_cast( GetValue( instance, Value_System_Config_Mode ) ) ) { + ValueList::Item const& item = value->GetItem(); + m_timeoutsupported = item.m_value; + } else { + ok = false; + Log::Write(LogLevel_Warning, GetNodeId(), "Failed To Retrieve Value_System_Config_Mode For SetValue"); + } + uint8 control = 0; + if( ValueByte* value = static_cast( GetValue( instance, Value_System_Config_OutsideHandles ) ) ) + { + control = (value->GetValue() << 4); + m_insidehandlemode = control; + } else { + ok = false; + Log::Write(LogLevel_Warning, GetNodeId(), "Failed To Retrieve Value_System_Config_OutsideHandles For SetValue"); + } + if( ValueByte* value = static_cast( GetValue( instance, Value_System_Config_InsideHandles ) ) ) + { + control += (value->GetValue() & 0x0F); + m_outsidehandlemode = (value->GetValue() & 0x0F); + } else { + ok = false; + Log::Write(LogLevel_Warning, GetNodeId(), "Failed To Retrieve Value_System_Config_InsideHandles For SetValue"); + } + if( ValueInt* value = static_cast( GetValue( instance, Value_System_Config_Minutes ) ) ) + { + m_timeoutmins = value->GetValue(); + } else { + /* Minutes and Seconds Might Not Exist, this is fine. Set to 0xFE */ + m_timeoutmins = 0xFE; + } + if( ValueInt* value = static_cast( GetValue( instance, Value_System_Config_Seconds ) ) ) + { + m_timeoutsecs = value->GetValue(); + } else { + /* Minutes and Seconds Might Not Exist, this is fine. Set to 0xFE */ + m_timeoutsecs = 0xFE; + } + if (ok) { + Msg* msg = new Msg( "DoorLockCmd_Configuration_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 6 ); + msg->Append( GetCommandClassId() ); + msg->Append( DoorLockCmd_Configuration_Set ); + msg->Append( m_timeoutsupported ); + msg->Append( control ); + msg->Append( m_timeoutmins ); + msg->Append( m_timeoutsecs ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + return false; + } + + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Update class values based in BASIC mapping +//----------------------------------------------------------------------------- +void DoorLock::SetValueBasic +( + uint8 const _instance, + uint8 const _value +) +{ + + + + // Send a request for new value to synchronize it with the BASIC set/report. + // In case the device is sleeping, we set the value anyway so the BASIC set/report + // stays in sync with it. We must be careful mapping the uint8 BASIC value + // into a class specific value. + // When the device wakes up, the real requested value will be retrieved. + RequestValue( 0, DoorLockCmd_Get, _instance, Driver::MsgQueue_Send ); + if( Node* node = GetNodeUnsafe() ) + { + if( WakeUp* wakeUp = static_cast( node->GetCommandClass( WakeUp::StaticGetCommandClassId() ) ) ) + { + if( !wakeUp->IsAwake() ) + { + if( ValueBool* value = static_cast( GetValue( _instance, Value_Lock ) ) ) + { + value->OnValueRefreshed( _value != 0 ); + value->Release(); + } + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void DoorLock::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueBool( ValueID::ValueGenre_User, GetCommandClassId(), _instance, Value_Lock, "Locked", "", false, false, false, 0 ); + + /* Complex Lock Option */ + { + vector items; + ValueList::Item item; + for( uint8 i=0; i<8; ++i ) + { + item.m_label = c_LockStateNames[i]; + item.m_value = (i < 6) ? i : 0xFF; + items.push_back( item ); + } + node->CreateValueList( ValueID::ValueGenre_User, GetCommandClassId(), _instance, Value_Lock_Mode, "Locked (Advanced)", "", false, false, 1, items, 0, 0 ); + + + } + + /* Timeout mode for Locks that support it */ + { + vector items; + ValueList::Item item; + for( uint8 i=0; i<2; ++i ) + { + item.m_label = c_TimeOutModeNames[i]; + item.m_value = i+1; + items.push_back( item ); + } + node->CreateValueList( ValueID::ValueGenre_System, GetCommandClassId(), _instance, Value_System_Config_Mode, "Timeout Mode", "", false, false, 1, items, 0, 0 ); + } + node->CreateValueByte( ValueID::ValueGenre_System, GetCommandClassId(), _instance, Value_System_Config_OutsideHandles, "Outside Handle Control", "", false, false, 0x0F, 0 ); + node->CreateValueByte( ValueID::ValueGenre_System, GetCommandClassId(), _instance, Value_System_Config_InsideHandles, "Inside Handle Control", "", false, false, 0x0F, 0 ); + + } +} + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLock.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLock.h new file mode 100644 index 0000000..1aae3f8 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLock.h @@ -0,0 +1,76 @@ +//----------------------------------------------------------------------------- +// +// DoorLock.h +// +// Implementation of the Z-Wave COMMAND_CLASS_DOOR_LOCK +// +// Copyright (c) 2014 Justin Hammond +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _DoorLock_H +#define _DoorLock_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueBool; + + /** \brief Implements COMMAND_CLASS_DOOR_LOCK (0x62), a Z-Wave device command class. + */ + class DoorLock: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new DoorLock( _homeId, _nodeId ); } + virtual ~DoorLock(){} + + static uint8 const StaticGetCommandClassId(){ return 0x62; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_DOOR_LOCK"; } + + // From CommandClass + virtual void ReadXML( TiXmlElement const* _ccElement ); + virtual void WriteXML( TiXmlElement* _ccElement ); + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + virtual void SetValueBasic( uint8 const _instance, uint8 const _value ); + + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + DoorLock( uint32 const _homeId, uint8 const _nodeId ); + uint8 m_timeoutsupported; + uint8 m_insidehandlemode; + uint8 m_outsidehandlemode; + uint8 m_timeoutmins; + uint8 m_timeoutsecs; + + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLockLogging.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLockLogging.cpp new file mode 100644 index 0000000..df0a1ce --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLockLogging.cpp @@ -0,0 +1,375 @@ +//----------------------------------------------------------------------------- +// +// DoorLockLogging.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_DOOR_LOCK_LOGGING +// +// Copyright (c) 2014 Justin Hammond +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "DoorLockLogging.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueBool.h" +#include "../value_classes/ValueByte.h" +#include "../value_classes/ValueInt.h" +#include "../value_classes/ValueString.h" + +#include "../tinyxml.h" + +using namespace OpenZWave; + +enum DoorLockLoggingCmd +{ + DoorLockLoggingCmd_RecordSupported_Get = 0x01, + DoorLockLoggingCmd_RecordSupported_Report = 0x02, + DoorLockLoggingCmd_Record_Get = 0x03, + DoorLockLoggingCmd_Record_Report = 0x04 +}; + +enum DoorLockEventType +{ + DoorLockEventType_LockCode = 0x01, + DoorLockEventType_UnLockCode = 0x02, + DoorLockEventType_LockButton = 0x03, + DoorLockEventType_UnLockButton = 0x04, + DoorLockEventType_LockCodeOOSchedule = 0x05, + DoorLockEventType_UnLockCodeOOSchedule = 0x06, + DoorLockEventType_IllegalCode = 0x07, + DoorLockEventType_LockManual = 0x08, + DoorLockEventType_UnLockManual = 0x09, + DoorLockEventType_LockAuto = 0x0A, + DoorLockEventType_UnLockAuto = 0x0B, + DoorLockEventType_LockRemoteCode = 0x0C, + DoorLockEventType_UnLockRemoteCode = 0x0D, + DoorLockEventType_LockRemote = 0x0E, + DoorLockEventType_UnLockRemote = 0x0F, + DoorLockEventType_LockRemoteCodeOOSchedule = 0x10, + DoorLockEventType_UnLockRemoteCodeOOSchedule = 0x11, + DoorLockEventType_RemoteIllegalCode = 0x12, + DoorLockEventType_LockManual2 = 0x13, + DoorLockEventType_UnlockManual2 = 0x14, + DoorLockEventType_LockSecured = 0x15, + DoorLockEventType_LockUnsecured = 0x16, + DoorLockEventType_UserCodeAdded = 0x17, + DoorLockEventType_UserCodeDeleted = 0x18, + DoorLockEventType_AllUserCodesDeleted = 0x19, + DoorLockEventType_MasterCodeChanged = 0x1A, + DoorLockEventType_UserCodeChanged = 0x1B, + DoorLockEventType_LockReset = 0x1C, + DoorLockEventType_ConfigurationChanged = 0x1D, + DoorLockEventType_LowBattery = 0x1E, + DoorLockEventType_NewBattery = 0x1F, + DoorLockEventType_Max = 0x20 +}; + +static char const* c_DoorLockEventType[] = +{ + "Locked via Access Code", + "Unlocked via Access Code", + "Locked via Lock Button", + "Unlocked via UnLock Botton", + "Lock Attempt via Out of Schedule Access Code", + "Unlock Attemp via Out of Schedule Access Code", + "Illegal Access Code Entered", + "Manually Locked", + "Manually UnLocked", + "Auto Locked", + "Auto Unlocked", + "Locked via Remote Out of Schedule Access Code", + "Unlocked via Remote Out of Schedule Access Code", + "Locked via Remote", + "Unlocked via Remote", + "Lock Attempt via Remote Out of Schedule Access Code", + "Unlock Attempt via Remote Out of Schedule Access Code", + "Illegal Remote Access Code", + "Manually Locked (2)", + "Manually Unlocked (2)", + "Lock Secured", + "Lock Unsecured", + "User Code Added", + "User Code Deleted", + "All User Codes Deleted", + "Master Code Changed", + "User Code Changed", + "Lock Reset", + "Configuration Changed", + "Low Battery", + "New Battery Installed", + "Unknown" +}; +/* size = 31 entries */ + +enum ValueIDSystemIndexes +{ + Value_System_Config_MaxRecords = 0x00, /* Max Number of Records the Device can Hold */ + Value_GetRecordNo = 0x01, /* Current Record Number after refresh */ + Value_LogRecord = 0x02 /* Simple String Representation of the Log Record - Tab Delimited Fields */ +}; + + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +DoorLockLogging::DoorLockLogging +( + uint32 const _homeId, + uint8 const _nodeId +): + CommandClass( _homeId, _nodeId ), + m_MaxRecords(0), + m_CurRecord(0) +{ + SetStaticRequest( StaticRequest_Values ); +} + +//----------------------------------------------------------------------------- +// +// Class specific configuration +//----------------------------------------------------------------------------- +void DoorLockLogging::ReadXML +( + TiXmlElement const* _ccElement +) +{ + int32 intVal; + + CommandClass::ReadXML( _ccElement ); + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "m_MaxRecords", &intVal ) ) + { + m_MaxRecords = intVal; + } +} + +//----------------------------------------------------------------------------- +// +// Class specific configuration +//----------------------------------------------------------------------------- +void DoorLockLogging::WriteXML +( + TiXmlElement* _ccElement +) +{ + char str[32]; + + CommandClass::WriteXML( _ccElement ); + snprintf( str, sizeof(str), "%d", m_MaxRecords ); + _ccElement->SetAttribute( "m_MaxRecords", str); +} + + + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool DoorLockLogging::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + bool requests = false; + if( ( _requestFlags & RequestFlag_Static ) && HasStaticRequest( StaticRequest_Values ) ) + { + requests = RequestValue( _requestFlags, DoorLockLoggingCmd_RecordSupported_Get, _instance, _queue ); + } + + if( _requestFlags & RequestFlag_Dynamic ) + { + requests |= RequestValue( _requestFlags, DoorLockLoggingCmd_Record_Get, _instance, _queue ); + } + + return requests; +} + + + + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool DoorLockLogging::RequestValue +( + uint32 const _requestFlags, + uint8 const _what, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( _what == DoorLockLoggingCmd_RecordSupported_Get) { + Msg* msg = new Msg( "DoorLockLoggingCmd_RecordSupported_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( DoorLockLoggingCmd_RecordSupported_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + + } else if (_what == DoorLockLoggingCmd_Record_Get) { + Msg* msg = new Msg( "DoorLockLoggingCmd_Record_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( DoorLockLoggingCmd_Record_Get ); + msg->Append( m_CurRecord ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } + return false; +} + + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool DoorLockLogging::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + + if( DoorLockLoggingCmd_RecordSupported_Report == (DoorLockLoggingCmd)_data[0] ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received DoorLockLoggingCmd_RecordSupported_Report: Max Records is %d ", _data[1]); + + if( ValueByte* value = static_cast( GetValue( _instance, Value_System_Config_MaxRecords ) ) ) + { + value->OnValueRefreshed( _data[1]); + value->Release(); + } + ClearStaticRequest( StaticRequest_Values ); + return true; + } else if (DoorLockLoggingCmd_Record_Report == (DoorLockLoggingCmd)_data[0] ) + { + uint8 EventType = _data[9]; + if (EventType >= DoorLockEventType_Max) + EventType = DoorLockEventType_Max; + + Log::Write (LogLevel_Info, GetNodeId(), "Recieved a DoorLockLogging Record %d which is \"%s\"", _data[1], c_DoorLockEventType[EventType-1]); + + if( ValueByte* value = static_cast( GetValue( _instance, Value_GetRecordNo ) ) ) + { + value->OnValueRefreshed( _data[1]); + value->Release(); + } + if( ValueString* value = static_cast( GetValue( _instance, Value_LogRecord ) ) ) + { + char msg[512]; + uint16 year = (_data[2] << 8) + (_data[3] & 0xFF); + uint8 month = (_data[4] & 0x0F); + uint8 day = (_data[5] & 0x1F); + uint8 hour = (_data[6] & 0x1F); + uint8 minute = (_data[7] & 0x3F); + uint8 second = (_data[8] & 0x3F); + bool valid = false; + if (((_data[6] & 0xE0) >> 5) > 0) + { + valid = true; + } + uint8 userid = (_data[10]); + uint8 usercodelength = (_data[11]); + char usercode[254]; + snprintf(usercode, sizeof(usercode), "UserCode:"); + if (usercodelength > 0) + for (int i = 0; i < usercodelength; i++ ) + { + snprintf(usercode, sizeof(usercode), "%s %d", usercode, (int)_data[12+i]); + } + + if (valid) { + snprintf(msg, sizeof(msg), "%02d/%02d/%02d %02d:%02d:%02d \tMessage: %s \tUserID: %d \t%s", (int)day, (int)month, (int)year, (int)hour, (int)minute, (int)second, c_DoorLockEventType[EventType], (int)userid, usercode); + } else + snprintf(msg, sizeof(msg), "Invalid Record"); + value->OnValueRefreshed(msg); + value->Release(); + } + return true; + + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Set the lock's state +//----------------------------------------------------------------------------- +bool DoorLockLogging::SetValue +( + Value const& _value +) +{ + if( (Value_GetRecordNo == _value.GetID().GetIndex()) && ValueID::ValueType_Byte == _value.GetID().GetType() ) + { + ValueByte const* value = static_cast(&_value); + + Log::Write( LogLevel_Info, GetNodeId(), "DoorLockLoggingCmd_Record_Get - Requesting Log Record %d", value->GetValue() ); + Msg* msg = new Msg( "DoorLockLoggingCmd_Record_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( DoorLockLoggingCmd_Record_Get ); + msg->Append( value->GetValue() ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + m_CurRecord = value->GetValue(); + return true; + } + return false; +} + + + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void DoorLockLogging::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueByte( ValueID::ValueGenre_System, GetCommandClassId(), _instance, Value_System_Config_MaxRecords, "Max Number of Records", "", true, false, 0x0, 0 ); + node->CreateValueByte( ValueID::ValueGenre_User, GetCommandClassId(), _instance, Value_GetRecordNo, "Current Record Number", "", false, false, 0x0, 0 ); + node->CreateValueString( ValueID::ValueGenre_User, GetCommandClassId(), _instance, Value_LogRecord, "Log Record", "", true, false, "", 0 ); + } +} + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLockLogging.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLockLogging.h new file mode 100644 index 0000000..9661d4d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/DoorLockLogging.h @@ -0,0 +1,69 @@ +//----------------------------------------------------------------------------- +// +// DoorLockLogging.h +// +// Implementation of the Z-Wave COMMAND_CLASS_DOOR_LOCK_LOGGING +// +// Copyright (c) 2014 Justin Hammond +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _DoorLockLogging_H +#define _DoorLockLogging_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueBool; + + /** \brief Implements COMMAND_CLASS_DOOR_LOCK_LOGGING (0x4C), a Z-Wave device command class. + */ + class DoorLockLogging: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new DoorLockLogging( _homeId, _nodeId ); } + virtual ~DoorLockLogging(){} + + static uint8 const StaticGetCommandClassId(){ return 0x4c; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_DOOR_LOCK_LOGGING"; } + + // From CommandClass + virtual void ReadXML( TiXmlElement const* _ccElement ); + virtual void WriteXML( TiXmlElement* _ccElement ); + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + DoorLockLogging( uint32 const _homeId, uint8 const _nodeId ); + uint8 m_MaxRecords; + uint8 m_CurRecord; + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/EnergyProduction.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/EnergyProduction.cpp new file mode 100644 index 0000000..cb87587 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/EnergyProduction.cpp @@ -0,0 +1,180 @@ +//----------------------------------------------------------------------------- +// +// EnergyProduction.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_ENERGY_PRODUCTION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "EnergyProduction.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueDecimal.h" + +using namespace OpenZWave; + +enum EnergyProductionCmd +{ + EnergyProductionCmd_Get = 0x02, + EnergyProductionCmd_Report = 0x03 +}; + +enum +{ + EnergyProductionIndex_Instant = 0, + EnergyProductionIndex_Total, + EnergyProductionIndex_Today, + EnergyProductionIndex_Time +}; + +static char const* c_energyParameterNames[] = +{ + "Instant energy production", + "Total energy production", + "Energy production today", + "Total production time" +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool EnergyProduction::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + bool request = false; + if( _requestFlags & RequestFlag_Dynamic ) + { + // Request each of the production values + request |= RequestValue( _requestFlags, EnergyProductionIndex_Instant, _instance, _queue ); + request |= RequestValue( _requestFlags, EnergyProductionIndex_Total, _instance, _queue ); + request |= RequestValue( _requestFlags, EnergyProductionIndex_Today, _instance, _queue ); + request |= RequestValue( _requestFlags, EnergyProductionIndex_Time, _instance, _queue ); + } + + return request; +} + +//----------------------------------------------------------------------------- +// +// Request current production from the device +//----------------------------------------------------------------------------- +bool EnergyProduction::RequestValue +( + uint32 const _requestFlags, + uint8 const _valueEnum, // one of EnergyProductionIndex enums + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if (_valueEnum > EnergyProductionIndex_Time) + { + Log::Write (LogLevel_Warning, GetNodeId(), "RequestValue _valueEnum was greater than range. Dropping"); + return false; + } + + if ( IsGetSupported() ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Requesting the %s value", c_energyParameterNames[_valueEnum] ); + Msg* msg = new Msg( "EnergyProductionCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( EnergyProductionCmd_Get ); + msg->Append( _valueEnum ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "EnergyProductionCmd_Get Not Supported on this node"); + } + return false; +} +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool EnergyProduction::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if (EnergyProductionCmd_Report == (EnergyProductionCmd)_data[0]) + { + uint8 scale; + uint8 precision = 0; + string value = ExtractValue( &_data[2], &scale, &precision ); + uint8 paramType = _data[1]; + if (paramType > 4) /* size of c_energyParameterNames minus Invalid Entry*/ + { + Log::Write (LogLevel_Warning, GetNodeId(), "paramType Value was greater than range. Dropping Message"); + return false; + } + + Log::Write( LogLevel_Info, GetNodeId(), "Received an Energy production report: %s = %s", c_energyParameterNames[_data[1]], value.c_str() ); + if( ValueDecimal* decimalValue = static_cast( GetValue( _instance, _data[1] ) ) ) + { + decimalValue->OnValueRefreshed( value ); + if( decimalValue->GetPrecision() != precision ) + { + decimalValue->SetPrecision( precision ); + } + decimalValue->Release(); + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void EnergyProduction::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueDecimal( ValueID::ValueGenre_User, GetCommandClassId(), _instance, (uint8)EnergyProductionIndex_Instant, c_energyParameterNames[EnergyProductionIndex_Instant], "W", true, false, "0.0", 0 ); + node->CreateValueDecimal( ValueID::ValueGenre_User, GetCommandClassId(), _instance, (uint8)EnergyProductionIndex_Total, c_energyParameterNames[EnergyProductionIndex_Total], "kWh", true, false, "0.0", 0 ); + node->CreateValueDecimal( ValueID::ValueGenre_User, GetCommandClassId(), _instance, (uint8)EnergyProductionIndex_Today, c_energyParameterNames[EnergyProductionIndex_Today], "kWh", true, false, "0.0", 0 ); + node->CreateValueDecimal( ValueID::ValueGenre_User, GetCommandClassId(), _instance, (uint8)EnergyProductionIndex_Time, c_energyParameterNames[EnergyProductionIndex_Time], "", true, false, "0.0", 0 ); + } +} + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/EnergyProduction.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/EnergyProduction.h new file mode 100644 index 0000000..e70e6df --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/EnergyProduction.h @@ -0,0 +1,65 @@ +//----------------------------------------------------------------------------- +// +// EnergyProduction.h +// +// Implementation of the Z-Wave COMMAND_CLASS_ENERGY_PRODUCTION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _EnergyProduction_H +#define _EnergyProduction_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueDecimal; + + /** \brief Implements COMMAND_CLASS_ENERGY_PRODUCTION (0x90), a Z-Wave device command class. + */ + class EnergyProduction: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new EnergyProduction( _homeId, _nodeId ); } + virtual ~EnergyProduction(){} + + static uint8 const StaticGetCommandClassId(){ return 0x90; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_ENERGY_PRODUCTION"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _valueEnum, uint8 const _dummy, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + EnergyProduction( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Hail.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Hail.cpp new file mode 100644 index 0000000..a3d5e35 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Hail.cpp @@ -0,0 +1,68 @@ +//----------------------------------------------------------------------------- +// +// Hail.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_HAIL +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "Hail.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +using namespace OpenZWave; + +enum HailCmdEnum +{ + HailCmd_Hail = 1 +}; + + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Hail::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( HailCmd_Hail == _data[0] ) + { + // We have received a hail from the Z-Wave device. + // Request an update of the dynamic values. + Log::Write( LogLevel_Info, GetNodeId(), "Received Hail command from node %d", GetNodeId() ); + if( Node* node = GetNodeUnsafe() ) + { + node->RequestDynamicValues(); + } + return true; + } + return false; +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Hail.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Hail.h new file mode 100644 index 0000000..e19a535 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Hail.h @@ -0,0 +1,58 @@ +//----------------------------------------------------------------------------- +// +// Hail.h +// +// Implementation of the Z-Wave COMMAND_CLASS_HAIL +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Hail_H +#define _Hail_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_HAIL (0x82), a Z-Wave device command class. + */ + class Hail: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Hail( _homeId, _nodeId ); } + virtual ~Hail(){} + + static uint8 const StaticGetCommandClassId(){ return 0x82; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_HAIL"; } + + // From CommandClass + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + private: + Hail( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Indicator.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Indicator.cpp new file mode 100644 index 0000000..d09b543 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Indicator.cpp @@ -0,0 +1,166 @@ +//----------------------------------------------------------------------------- +// +// Indicator.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_INDICATOR +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "Indicator.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueByte.h" + +using namespace OpenZWave; + +enum IndicatorCmd +{ + IndicatorCmd_Set = 0x01, + IndicatorCmd_Get = 0x02, + IndicatorCmd_Report = 0x03 +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool Indicator::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Dynamic ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool Indicator::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "IndicatorCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( IndicatorCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "IndicatorCmd_Get Not Supported on this node"); + } + return false; +} + + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Indicator::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( IndicatorCmd_Report == (IndicatorCmd)_data[0] ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received an Indicator report: Indicator=%d", _data[1] ); + + if( ValueByte* value = static_cast( GetValue( _instance, 0 ) ) ) + { + value->OnValueRefreshed( _data[1] != 0 ); + value->Release(); + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set the device's indicator value +//----------------------------------------------------------------------------- +bool Indicator::SetValue +( + Value const& _value +) +{ + if( ValueID::ValueType_Byte == _value.GetID().GetType() ) + { + ValueByte const* value = static_cast(&_value); + + Log::Write( LogLevel_Info, GetNodeId(), "Indicator::SetValue - Setting indicator to %d", value->GetValue()); + Msg* msg = new Msg( "Basic Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( IndicatorCmd_Set ); + msg->Append( value->GetValue() ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void Indicator::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueByte( ValueID::ValueGenre_User, GetCommandClassId(), _instance, 0, "Indicator", "", false, false, false, 0 ); + } +} + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Indicator.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Indicator.h new file mode 100644 index 0000000..272e98c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Indicator.h @@ -0,0 +1,66 @@ +//----------------------------------------------------------------------------- +// +// Indicator.h +// +// Implementation of the Z-Wave COMMAND_CLASS_INDICATOR +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Indicator_H +#define _Indicator_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueByte; + + /** \brief Implements COMMAND_CLASS_INDICATOR (0x87), a Z-Wave device command class. + */ + class Indicator: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Indicator( _homeId, _nodeId ); } + virtual ~Indicator(){} + + static uint8 const StaticGetCommandClassId(){ return 0x87; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_INDICATOR"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + Indicator( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Language.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Language.cpp new file mode 100644 index 0000000..2047e7b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Language.cpp @@ -0,0 +1,164 @@ +//----------------------------------------------------------------------------- +// +// Language.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_LANGUAGE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "Language.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueString.h" + +using namespace OpenZWave; + +enum LanguageCmd +{ + LanguageCmd_Set = 0x01, + LanguageCmd_Get = 0x02, + LanguageCmd_Report = 0x03 +}; + +enum +{ + LanguageIndex_Language = 0, + LanguageIndex_Country +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool Language::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( ( _requestFlags & RequestFlag_Static ) && HasStaticRequest( StaticRequest_Values ) ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool Language::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _instance != 1 ) + { + // This command class doesn't work with multiple instances + return false; + } + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "LanguageCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( LanguageCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "LanguageCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Language::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( LanguageCmd_Report == (LanguageCmd)_data[0] ) + { + char language[4]; + char country[3]; + + language[0] = _data[1]; + language[1] = _data[2]; + language[2] = _data[3]; + language[3] = 0; + + country[0] = _data[4]; + country[1] = _data[5]; + country[2] = 0; + + Log::Write( LogLevel_Info, GetNodeId(), "Received Language report: Language=%s, Country=%s", language, country ); + ClearStaticRequest( StaticRequest_Values ); + + if( ValueString* languageValue = static_cast( GetValue( _instance, LanguageIndex_Language ) ) ) + { + languageValue->OnValueRefreshed( language ); + languageValue->Release(); + } + if( ValueString* countryValue = static_cast( GetValue( _instance, LanguageIndex_Country ) ) ) + { + countryValue->OnValueRefreshed( country ); + countryValue->Release(); + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void Language::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueString( ValueID::ValueGenre_System, GetCommandClassId(), _instance, (uint8)LanguageIndex_Language, "Language", "", false, false, "", 0 ); + node->CreateValueString( ValueID::ValueGenre_System, GetCommandClassId(), _instance, (uint8)LanguageIndex_Country, "Country", "", false, false, "", 0 ); + } +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Language.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Language.h new file mode 100644 index 0000000..8daead3 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Language.h @@ -0,0 +1,65 @@ +//----------------------------------------------------------------------------- +// +// Language.h +// +// Implementation of the Z-Wave COMMAND_CLASS_LANGUAGE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Language_H +#define _Language_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueString; + + /** \brief Implements COMMAND_CLASS_LANGUAGE (0x89), a Z-Wave device command class. + */ + class Language: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Language( _homeId, _nodeId ); } + virtual ~Language(){} + + static uint8 const StaticGetCommandClassId(){ return 0x89; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_LANGUAGE"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + Language( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){ SetStaticRequest( StaticRequest_Values ); } + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Lock.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Lock.cpp new file mode 100644 index 0000000..4afd22a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Lock.cpp @@ -0,0 +1,166 @@ +//----------------------------------------------------------------------------- +// +// Lock.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_LOCK +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "Lock.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueBool.h" + +using namespace OpenZWave; + +enum LockCmd +{ + LockCmd_Set = 0x01, + LockCmd_Get = 0x02, + LockCmd_Report = 0x03 +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool Lock::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Dynamic ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool Lock::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "LockCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( LockCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "LockCmd_Get Not Supported on this node"); + } + return false; +} + + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Lock::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( LockCmd_Report == (LockCmd)_data[0] ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received Lock report: Lock is %s", _data[1] ? "Locked" : "Unlocked" ); + + if( ValueBool* value = static_cast( GetValue( _instance, 0 ) ) ) + { + value->OnValueRefreshed( _data[1] != 0 ); + value->Release(); + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set the lock's state +//----------------------------------------------------------------------------- +bool Lock::SetValue +( + Value const& _value +) +{ + if( ValueID::ValueType_Bool == _value.GetID().GetType() ) + { + ValueBool const* value = static_cast(&_value); + + Log::Write( LogLevel_Info, GetNodeId(), "Lock::Set - Requesting lock to be %s", value->GetValue() ? "Locked" : "Unlocked" ); + Msg* msg = new Msg( "LockCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( LockCmd_Set ); + msg->Append( value->GetValue() ? 0x01:0x00 ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void Lock::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueBool( ValueID::ValueGenre_User, GetCommandClassId(), _instance, 0, "Locked", "", false, false, false, 0 ); + } +} + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Lock.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Lock.h new file mode 100644 index 0000000..2a9ec94 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Lock.h @@ -0,0 +1,66 @@ +//----------------------------------------------------------------------------- +// +// Lock.h +// +// Implementation of the Z-Wave COMMAND_CLASS_LOCK +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Lock_H +#define _Lock_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueBool; + + /** \brief Implements COMMAND_CLASS_LOCK (0x76), a Z-Wave device command class. + */ + class Lock: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Lock( _homeId, _nodeId ); } + virtual ~Lock(){} + + static uint8 const StaticGetCommandClassId(){ return 0x76; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_LOCK"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + Lock( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ManufacturerSpecific.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ManufacturerSpecific.cpp new file mode 100644 index 0000000..0bddad9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ManufacturerSpecific.cpp @@ -0,0 +1,444 @@ +//----------------------------------------------------------------------------- +// +// ManufacturerSpecific.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_MANUFACTURER_SPECIFIC +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "ManufacturerSpecific.h" +#include "../tinyxml.h" + +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Options.h" +#include "../Manager.h" +#include "../Driver.h" +#include "../Notification.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueStore.h" +#include "../value_classes/ValueString.h" + +using namespace OpenZWave; + +enum ManufacturerSpecificCmd +{ + ManufacturerSpecificCmd_Get = 0x04, + ManufacturerSpecificCmd_Report = 0x05 +}; + +map ManufacturerSpecific::s_manufacturerMap; +map ManufacturerSpecific::s_productMap; +bool ManufacturerSpecific::s_bXmlLoaded = false; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool ManufacturerSpecific::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( ( _requestFlags & RequestFlag_Static ) && HasStaticRequest( StaticRequest_Values ) ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool ManufacturerSpecific::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _instance != 1 ) + { + // This command class doesn't work with multiple instances + return false; + } + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "ManufacturerSpecificCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( ManufacturerSpecificCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "ManufacturerSpecificCmd_Get Not Supported on this node"); + } + return false; +} + +string ManufacturerSpecific::SetProductDetails +( + Node* node, + uint16 manufacturerId, + uint16 productType, + uint16 productId +) +{ + char str[64]; + + if (!s_bXmlLoaded) LoadProductXML(); + + snprintf( str, sizeof(str), "Unknown: id=%.4x", manufacturerId ); + string manufacturerName = str; + + snprintf( str, sizeof(str), "Unknown: type=%.4x, id=%.4x", productType, productId ); + string productName = str; + + string configPath = ""; + + // Try to get the real manufacturer and product names + map::iterator mit = s_manufacturerMap.find( manufacturerId ); + if( mit != s_manufacturerMap.end() ) + { + // Replace the id with the real name + manufacturerName = mit->second; + + // Get the product + map::iterator pit = s_productMap.find( Product::GetKey( manufacturerId, productType, productId ) ); + if( pit != s_productMap.end() ) + { + productName = pit->second->GetProductName(); + configPath = pit->second->GetConfigPath(); + } + } + + // Set the values into the node + + // Only set the manufacturer and product name if they are + // empty - we don't want to overwrite any user defined names. + if( node->GetManufacturerName() == "" ) + { + node->SetManufacturerName( manufacturerName ); + } + + if( node->GetProductName() == "" ) + { + node->SetProductName( productName ); + } + + snprintf( str, sizeof(str), "%.4x", manufacturerId ); + node->SetManufacturerId( str ); + + snprintf( str, sizeof(str), "%.4x", productType ); + node->SetProductType( str ); + + snprintf( str, sizeof(str), "%.4x", productId ); + node->SetProductId( str ); + + return configPath; +} + + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool ManufacturerSpecific::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( ManufacturerSpecificCmd_Report == (ManufacturerSpecificCmd)_data[0] ) + { + + // first two bytes are manufacturer id code + uint16 manufacturerId = (((uint16)_data[1])<<8) | (uint16)_data[2]; + + // next four are product type and product id + uint16 productType = (((uint16)_data[3])<<8) | (uint16)_data[4]; + uint16 productId = (((uint16)_data[5])<<8) | (uint16)_data[6]; + + if( Node* node = GetNodeUnsafe() ) + { + // Attempt to create the config parameters + string configPath = SetProductDetails( node, manufacturerId, productType, productId); + if( configPath.size() > 0 ) + { + LoadConfigXML( node, configPath ); + } + + Log::Write( LogLevel_Info, GetNodeId(), "Received manufacturer specific report from node %d: Manufacturer=%s, Product=%s", + GetNodeId(), node->GetManufacturerName().c_str(), node->GetProductName().c_str() ); + ClearStaticRequest( StaticRequest_Values ); + node->m_manufacturerSpecificClassReceived = true; + } + + // Notify the watchers of the name changes + Notification* notification = new Notification( Notification::Type_NodeNaming ); + notification->SetHomeAndNodeIds( GetHomeId(), GetNodeId() ); + GetDriver()->QueueNotification( notification ); + + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Load the XML that maps manufacturer and product IDs to human-readable names +//----------------------------------------------------------------------------- +bool ManufacturerSpecific::LoadProductXML +( +) +{ + s_bXmlLoaded = true; + + // Parse the Z-Wave manufacturer and product XML file. + string configPath; + Options::Get()->GetOptionAsString( "ConfigPath", &configPath ); + + string filename = configPath + "manufacturer_specific.xml"; + + TiXmlDocument* pDoc = new TiXmlDocument(); + if( !pDoc->LoadFile( filename.c_str(), TIXML_ENCODING_UTF8 ) ) + { + delete pDoc; + Log::Write( LogLevel_Info, "Unable to load %s", filename.c_str() ); + return false; + } + + TiXmlElement const* root = pDoc->RootElement(); + + char const* str; + char* pStopChar; + + TiXmlElement const* manufacturerElement = root->FirstChildElement(); + while( manufacturerElement ) + { + str = manufacturerElement->Value(); + if( str && !strcmp( str, "Manufacturer" ) ) + { + // Read in the manufacturer attributes + str = manufacturerElement->Attribute( "id" ); + if( !str ) + { + Log::Write( LogLevel_Info, "Error in manufacturer_specific.xml at line %d - missing manufacturer id attribute", manufacturerElement->Row() ); + delete pDoc; + return false; + } + uint16 manufacturerId = (uint16)strtol( str, &pStopChar, 16 ); + + str = manufacturerElement->Attribute( "name" ); + if( !str ) + { + Log::Write( LogLevel_Info, "Error in manufacturer_specific.xml at line %d - missing manufacturer name attribute", manufacturerElement->Row() ); + delete pDoc; + return false; + } + + // Add this manufacturer to the map + s_manufacturerMap[manufacturerId] = str; + + // Parse all the products for this manufacturer + TiXmlElement const* productElement = manufacturerElement->FirstChildElement(); + while( productElement ) + { + str = productElement->Value(); + if( str && !strcmp( str, "Product" ) ) + { + str = productElement->Attribute( "type" ); + if( !str ) + { + Log::Write( LogLevel_Info, "Error in manufacturer_specific.xml at line %d - missing product type attribute", productElement->Row() ); + delete pDoc; + return false; + } + uint16 productType = (uint16)strtol( str, &pStopChar, 16 ); + + str = productElement->Attribute( "id" ); + if( !str ) + { + Log::Write( LogLevel_Info, "Error in manufacturer_specific.xml at line %d - missing product id attribute", productElement->Row() ); + delete pDoc; + return false; + } + uint16 productId = (uint16)strtol( str, &pStopChar, 16 ); + + str = productElement->Attribute( "name" ); + if( !str ) + { + Log::Write( LogLevel_Info, "Error in manufacturer_specific.xml at line %d - missing product name attribute", productElement->Row() ); + delete pDoc; + return false; + } + string productName = str; + + // Optional config path + string configPath; + str = productElement->Attribute( "config" ); + if( str ) + { + configPath = str; + } + + // Add the product to the map + Product* product = new Product( manufacturerId, productType, productId, productName, configPath ); + if ( s_productMap[product->GetKey()] != NULL ) + { + Product *c = s_productMap[product->GetKey()]; + Log::Write( LogLevel_Info, "Product name collision: %s type %x id %x manufacturerid %x, collides with %s, type %x id %x manufacturerid %x", productName.c_str(), productType, productId, manufacturerId, c->GetProductName().c_str(), c->GetProductType(), c->GetProductId(), c->GetManufacturerId()); + delete product; + } + else + { + s_productMap[product->GetKey()] = product; + } + } + + // Move on to the next product. + productElement = productElement->NextSiblingElement(); + } + } + + // Move on to the next manufacturer. + manufacturerElement = manufacturerElement->NextSiblingElement(); + } + + delete pDoc; + return true; +} + +//----------------------------------------------------------------------------- +// +// Free the XML that maps manufacturer and product IDs +//----------------------------------------------------------------------------- +void ManufacturerSpecific::UnloadProductXML +( +) +{ + if (s_bXmlLoaded) + { + map::iterator pit = s_productMap.begin(); + while( !s_productMap.empty() ) + { + delete pit->second; + s_productMap.erase( pit ); + pit = s_productMap.begin(); + } + + map::iterator mit = s_manufacturerMap.begin(); + while( !s_manufacturerMap.empty() ) + { + s_manufacturerMap.erase( mit ); + mit = s_manufacturerMap.begin(); + } + + s_bXmlLoaded = false; + } +} + +//----------------------------------------------------------------------------- +// +// Try to find and load an XML file describing the device's config params +//----------------------------------------------------------------------------- +bool ManufacturerSpecific::LoadConfigXML +( + Node* _node, + string const& _configXML +) +{ + string configPath; + Options::Get()->GetOptionAsString( "ConfigPath", &configPath ); + + string filename = configPath + _configXML; + + TiXmlDocument* doc = new TiXmlDocument(); + Log::Write( LogLevel_Info, _node->GetNodeId(), " Opening config param file %s", filename.c_str() ); + if( !doc->LoadFile( filename.c_str(), TIXML_ENCODING_UTF8 ) ) + { + delete doc; + Log::Write( LogLevel_Info, _node->GetNodeId(), "Unable to find or load Config Param file %s", filename.c_str() ); + return false; + } + + Node::QueryStage qs = _node->GetCurrentQueryStage(); + if( qs == Node::QueryStage_ManufacturerSpecific1 ) + { + _node->ReadDeviceProtocolXML( doc->RootElement() ); + } + else + { + if( !_node->m_manufacturerSpecificClassReceived ) + { + _node->ReadDeviceProtocolXML( doc->RootElement() ); + } + _node->ReadCommandClassesXML( doc->RootElement() ); + } + + delete doc; + return true; +} + +//----------------------------------------------------------------------------- +// +// Reload previously discovered device configuration. +//----------------------------------------------------------------------------- +void ManufacturerSpecific::ReLoadConfigXML +( +) +{ + if( Node* node = GetNodeUnsafe() ) + { + if (!s_bXmlLoaded) LoadProductXML(); + + uint16 manufacturerId = (uint16)strtol( node->GetManufacturerId().c_str(), NULL, 16 ); + uint16 productType = (uint16)strtol( node->GetProductType().c_str(), NULL, 16 ); + uint16 productId = (uint16)strtol( node->GetProductId().c_str(), NULL, 16 ); + + map::iterator mit = s_manufacturerMap.find( manufacturerId ); + if( mit != s_manufacturerMap.end() ) + { + map::iterator pit = s_productMap.find( Product::GetKey( manufacturerId, productType, productId ) ); + if( pit != s_productMap.end() ) + { + string configPath = pit->second->GetConfigPath(); + if( configPath.size() > 0 ) + { + LoadConfigXML( node, configPath ); + } + } + } + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ManufacturerSpecific.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ManufacturerSpecific.h new file mode 100644 index 0000000..d316d06 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ManufacturerSpecific.h @@ -0,0 +1,116 @@ +//----------------------------------------------------------------------------- +// +// ManufacturerSpecific.h +// +// Implementation of the Z-Wave COMMAND_CLASS_MANUFACTURER_SPECIFIC +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ManufacturerSpecific_H +#define _ManufacturerSpecific_H + +#include +#include "CommandClass.h" + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_MANUFACTURER_SPECIFIC (0x72), a Z-Wave device command class. + */ + class ManufacturerSpecific: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new ManufacturerSpecific( _homeId, _nodeId ); } + virtual ~ManufacturerSpecific(){ UnloadProductXML(); } + + static uint8 const StaticGetCommandClassId(){ return 0x72; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_MANUFACTURER_SPECIFIC"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + static string SetProductDetails( Node *_node, uint16 _manufacturerId, uint16 _productType, uint16 _productId ); + static bool LoadConfigXML( Node* _node, string const& _configXML ); + + void ReLoadConfigXML(); + + private: + ManufacturerSpecific( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){ SetStaticRequest( StaticRequest_Values ); } + static bool LoadProductXML(); + static void UnloadProductXML(); + + class Product + { + public: + Product + ( + uint16 _manufacturerId, + uint16 _productType, + uint16 _productId, + string const& _productName, + string const& _configPath + ): + m_manufacturerId( _manufacturerId ), + m_productType( _productType ), + m_productId( _productId ), + m_productName( _productName ), + m_configPath( _configPath ) + { + } + + int64 GetKey()const + { + return( GetKey( m_manufacturerId, m_productType, m_productId ) ); + } + + static int64 GetKey( uint16 _manufacturerId, uint16 _productType, uint16 _productId ) + { + int64 key = (((int64)_manufacturerId)<<32) | (((int64)_productType)<<16) | (int64)_productId; + return key; + } + + uint16 GetManufacturerId()const{ return m_manufacturerId; } + uint16 GetProductType()const{ return m_productType; } + uint16 GetProductId()const{ return m_productId; } + string GetProductName()const{ return m_productName; } + string GetConfigPath()const{ return m_configPath; } + + private: + uint16 m_manufacturerId; + uint16 m_productType; + uint16 m_productId; + string m_productName; + string m_configPath; + }; + + static map s_manufacturerMap; + static map s_productMap; + static bool s_bXmlLoaded; + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Meter.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Meter.cpp new file mode 100644 index 0000000..fda399d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Meter.cpp @@ -0,0 +1,562 @@ +//----------------------------------------------------------------------------- +// +// Meter.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_METER +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "Meter.h" +#include "MultiInstance.h" +#include "../Defs.h" +#include "../Bitfield.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueDecimal.h" +#include "../value_classes/ValueList.h" +#include "../value_classes/ValueButton.h" +#include "../value_classes/ValueInt.h" +#include "../value_classes/ValueBool.h" + +using namespace OpenZWave; + +enum MeterCmd +{ + MeterCmd_Get = 0x01, + MeterCmd_Report = 0x02, + // Version 2 + MeterCmd_SupportedGet = 0x03, + MeterCmd_SupportedReport = 0x04, + MeterCmd_Reset = 0x05 +}; + +enum MeterType +{ + MeterType_Electric = 1, + MeterType_Gas, + MeterType_Water +}; + +enum +{ + MeterIndex_Exporting = 32, + MeterIndex_Reset +}; + + +static char const* c_meterTypes[] = +{ + "Unknown", + "Electric", + "Gas", + "Water" +}; + +static char const* c_electricityUnits[] = +{ + "kWh", + "kVAh", + "W", + "pulses", + "V", + "A", + "Power Factor", + "" +}; + +static char const* c_gasUnits[] = +{ + "cubic meters", + "cubic feet", + "", + "pulses", + "", + "", + "", + "" +}; + +static char const* c_waterUnits[] = +{ + "cubic meters", + "cubic feet", + "US gallons", + "pulses", + "", + "", + "", + "" +}; + +static char const* c_electricityLabels[] = +{ + "Energy", + "Energy", + "Power", + "Count", + "Voltage", + "Current", + "Power Factor", + "Unknown" +}; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Meter::Meter +( + uint32 const _homeId, + uint8 const _nodeId +): + CommandClass( _homeId, _nodeId ) +{ + SetStaticRequest( StaticRequest_Values ); +} + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool Meter::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + bool res = false; + if( GetVersion() > 1 ) + { + if( _requestFlags & RequestFlag_Static ) + { + Msg* msg = new Msg( "MeterCmd_SupportedGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( MeterCmd_SupportedGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + res = true; + } + } + + if( _requestFlags & RequestFlag_Dynamic ) + { + res |= RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool Meter::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + bool res = false; + if ( !IsGetSupported()) + { + Log::Write( LogLevel_Info, GetNodeId(), "MeterCmd_Get Not Supported on this node"); + return false; + } + for( uint8 i=0; i<8; ++i ) + { + uint8 baseIndex = i<<2; + + Value* value = GetValue( _instance, baseIndex ); + if( value != NULL ) + { + value->Release(); + Msg* msg = new Msg( "MeterCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( MeterCmd_Get ); + msg->Append( (uint8)( i << 3 ) ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + res |= true; + } + } + return res; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Meter::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + bool handled = false; + if (MeterCmd_SupportedReport == (MeterCmd)_data[0]) + { + handled = HandleSupportedReport( _data, _length, _instance ); + } + else if (MeterCmd_Report == (MeterCmd)_data[0]) + { + handled = HandleReport( _data, _length, _instance ); + } + + return handled; +} + +//----------------------------------------------------------------------------- +// +// Create the values for this command class based on the reported parameters +//----------------------------------------------------------------------------- +bool Meter::HandleSupportedReport +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance +) +{ + bool canReset = ((_data[1] & 0x80) != 0); + int8 meterType = (MeterType)(_data[1] & 0x1f); + if (meterType > 4) /* size of c_meterTypes */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "meterType Value was greater than range. Dropping Message"); + return false; + } + + + ClearStaticRequest( StaticRequest_Version ); + if( Node* node = GetNodeUnsafe() ) + { + string msg; + msg = c_meterTypes[meterType]; + msg += ": "; + // Create the list of supported scales + uint8 scaleSupported = _data[2]; + if( GetVersion() == 2 ) + { + // Only four scales are allowed in version 2 + scaleSupported &= 0x0f; + } + + for( uint8 i=0; i<8; ++i ) + { + if( scaleSupported & (1<( GetValue( _instance, baseIndex ) ) ) + { + value->SetLabel( c_electricityLabels[i] ); + value->SetUnits( c_electricityUnits[i] ); + value->Release(); + } + else + { + node->CreateValueDecimal( ValueID::ValueGenre_User, GetCommandClassId(), _instance, baseIndex, c_electricityLabels[i], c_electricityUnits[i], true, false, "0.0", 0 ); + } + if( i != 0 ) + msg += ", "; + msg += c_electricityUnits[i]; + break; + } + case MeterType_Gas: + { + if( ValueDecimal* value = static_cast( GetValue( _instance, baseIndex ) ) ) + { + value->SetLabel( c_meterTypes[MeterType_Gas] ); + value->SetUnits( c_gasUnits[i] ); + value->Release(); + } + else + { + node->CreateValueDecimal( ValueID::ValueGenre_User, GetCommandClassId(), _instance, baseIndex, c_meterTypes[meterType], c_gasUnits[i], true, false, "0.0", 0 ); + } + if( i != 0 ) + msg += ", "; + msg += c_gasUnits[i]; + break; + } + case MeterType_Water: + { + if( ValueDecimal* value = static_cast( GetValue( _instance, baseIndex ) ) ) + { + value->SetLabel( c_meterTypes[MeterType_Water] ); + value->SetUnits( c_waterUnits[i] ); + value->Release(); + } + else + { + node->CreateValueDecimal( ValueID::ValueGenre_User, GetCommandClassId(), _instance, baseIndex, c_meterTypes[meterType], c_waterUnits[i], true, false, "0.0", 0 ); + } + if( i != 0 ) + msg += ", "; + msg += c_waterUnits[i]; + break; + } + default: + { + break; + } + } + } + } + + // Create the export flag + node->CreateValueBool( ValueID::ValueGenre_User, GetCommandClassId(), _instance, MeterIndex_Exporting, "Exporting", "", true, false, false, 0 ); + + // Create the reset button + if( canReset ) + { + node->CreateValueButton( ValueID::ValueGenre_System, GetCommandClassId(), _instance, MeterIndex_Reset, "Reset", 0 ); + } + + Log::Write( LogLevel_Info, GetNodeId(), "Received Meter supported report from node %d, %s", GetNodeId(), msg.c_str() ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Read the reported meter value +//----------------------------------------------------------------------------- +bool Meter::HandleReport +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance +) +{ + // Import or Export (only valid in version > 1) + bool exporting = false; + if( GetVersion() > 1 ) + { + exporting = ((_data[1] & 0x60) == 0x40 ); + if( ValueBool* value = static_cast( GetValue( _instance, MeterIndex_Exporting ) ) ) + { + value->OnValueRefreshed( exporting ); + value->Release(); + } + } + + // Get the value and scale + uint8 scale; + uint8 precision = 0; + string valueStr = ExtractValue( &_data[2], &scale, &precision ); + + if (scale > 7) /* size of c_electricityLabels, c_electricityUnits, c_gasUnits, c_waterUnits */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "Scale was greater than range. Setting to Invalid"); + scale = 7; + } + + + if( GetVersion() == 1 ) + { + // In version 1, we don't know the scale until we get the first value report + string label; + string units; + int8 meterType = (MeterType)(_data[1] & 0x1f); + if (meterType > 4) /* size of c_meterTypes */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "meterType Value was greater than range. Dropping Message"); + return false; + } + + switch( (MeterType)(_data[1] & 0x1f) ) + { + case MeterType_Electric: + { + // Electricity Meter + label = c_electricityLabels[scale]; + units = c_electricityUnits[scale]; + break; + } + case MeterType_Gas: + { + // Gas Meter + label = c_meterTypes[MeterType_Gas]; + units = c_gasUnits[scale]; + break; + } + case MeterType_Water: + { + // Water Meter + label = c_meterTypes[MeterType_Water]; + units = c_waterUnits[scale]; + break; + } + default: + { + break; + } + } + + if( ValueDecimal* value = static_cast( GetValue( _instance, 0 ) ) ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received Meter report from node %d: %s=%s%s", GetNodeId(), label.c_str(), valueStr.c_str(), units.c_str() ); + value->SetLabel( label ); + value->SetUnits( units ); + value->OnValueRefreshed( valueStr ); + if( value->GetPrecision() != precision ) + { + value->SetPrecision( precision ); + } + value->Release(); + } + } + else + { + // Version 2 and above + uint8 baseIndex = scale << 2; + if( GetVersion() > 2 ) + { + // In version 3, an extra scale bit is stored in the meter type byte. + scale |= ((_data[1]&0x80)>>5); + baseIndex = scale << 2; + } + + if( ValueDecimal* value = static_cast( GetValue( _instance, baseIndex ) ) ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received Meter report from node %d: %s%s=%s%s", GetNodeId(), exporting ? "Exporting ": "", value->GetLabel().c_str(), valueStr.c_str(), value->GetUnits().c_str() ); + value->OnValueRefreshed( valueStr ); + if( value->GetPrecision() != precision ) + { + value->SetPrecision( precision ); + } + value->Release(); + + // Read any previous value and time delta + uint8 size = _data[2] & 0x07; + uint16 delta = (uint16)( (_data[3+size]<<8) | _data[4+size]); + + if( delta ) + { + // There is only a previous value if the time delta is non-zero + ValueDecimal* previous = static_cast( GetValue( _instance, baseIndex+1 ) ); + if( NULL == previous ) + { + // We need to create a value to hold the previous + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueDecimal( ValueID::ValueGenre_User, GetCommandClassId(), _instance, baseIndex+1, "Previous Reading", value->GetUnits().c_str(), true, false, "0.0", 0 ); + previous = static_cast( GetValue( _instance, baseIndex+1 ) ); + } + } + if( previous ) + { + precision = 0; + valueStr = ExtractValue( &_data[2], &scale, &precision, 3+size ); + Log::Write( LogLevel_Info, GetNodeId(), " Previous value was %s%s, received %d seconds ago.", valueStr.c_str(), previous->GetUnits().c_str(), delta ); + previous->OnValueRefreshed( valueStr ); + if( previous->GetPrecision() != precision ) + { + previous->SetPrecision( precision ); + } + previous->Release(); + } + + // Time delta + ValueInt* interval = static_cast( GetValue( _instance, baseIndex+2 ) ); + if( NULL == interval ) + { + // We need to create a value to hold the time delta + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueInt( ValueID::ValueGenre_User, GetCommandClassId(), _instance, baseIndex+2, "Interval", "seconds", true, false, 0, 0 ); + interval = static_cast( GetValue( _instance, baseIndex+2 ) ); + } + } + if( interval ) + { + interval->OnValueRefreshed( (int32)delta ); + interval->Release(); + } + } + } + } + + return true; +} + +//----------------------------------------------------------------------------- +// +// Set the device's scale, or reset its accumulated values. +//----------------------------------------------------------------------------- +bool Meter::SetValue +( + Value const& _value +) +{ + if( MeterIndex_Reset == _value.GetID().GetIndex() ) + { + ValueButton const* button = static_cast(&_value); + if( button->IsPressed() ) + { + Msg* msg = new Msg( "MeterCmd_Reset", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( MeterCmd_Reset ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void Meter::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueDecimal( ValueID::ValueGenre_User, GetCommandClassId(), _instance, 0, "Unknown", "", true, false, "0.0", 0 ); + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Meter.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Meter.h new file mode 100644 index 0000000..10f061c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Meter.h @@ -0,0 +1,72 @@ +//----------------------------------------------------------------------------- +// +// Meter.h +// +// Implementation of the Z-Wave COMMAND_CLASS_METER +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Meter_H +#define _Meter_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueDecimal; + + /** \brief Implements COMMAND_CLASS_METER (0x32), a Z-Wave device command class. + */ + class Meter: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Meter( _homeId, _nodeId ); } + virtual ~Meter(){} + + static uint8 const StaticGetCommandClassId(){ return 0x32; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_METER"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + virtual uint8 GetMaxVersion(){ return 3; } + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + Meter( uint32 const _homeId, uint8 const _nodeId ); + + bool HandleSupportedReport( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + bool HandleReport( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + }; + +} // namespace OpenZWave + + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/MeterPulse.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MeterPulse.cpp new file mode 100644 index 0000000..0b57e5a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MeterPulse.cpp @@ -0,0 +1,143 @@ +//----------------------------------------------------------------------------- +// +// MeterPulse.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_METER_PULSE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "MeterPulse.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueInt.h" + +using namespace OpenZWave; + +enum MeterPulseCmd +{ + MeterPulseCmd_Get = 0x04, + MeterPulseCmd_Report = 0x05 +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool MeterPulse::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Dynamic ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool MeterPulse::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "MeterPulseCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( MeterPulseCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "MeterPulseCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool MeterPulse::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( MeterPulseCmd_Report == (MeterPulseCmd)_data[0] ) + { + int32 count = 0; + for( uint8 i=0; i<4; ++i ) + { + count <<= 8; + count |= (uint32)_data[i+1]; + } + + Log::Write( LogLevel_Info, GetNodeId(), "Received a meter pulse count: Count=%d", count ); + if( ValueInt* value = static_cast( GetValue( _instance, 0 ) ) ) + { + value->OnValueRefreshed( count ); + value->Release(); + } + + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void MeterPulse::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueInt( ValueID::ValueGenre_User, GetCommandClassId(), _instance, 0, "Count", "", true, false, 0, 0 ); + } +} + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/MeterPulse.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MeterPulse.h new file mode 100644 index 0000000..2f267d2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MeterPulse.h @@ -0,0 +1,65 @@ +//----------------------------------------------------------------------------- +// +// MeterPulse.h +// +// Implementation of the Z-Wave COMMAND_CLASS_METER_PULSE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _MeterPulse_H +#define _MeterPulse_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueInt; + + /** \brief Implements COMMAND_CLASS_METER_PULSE (0x35), a Z-Wave device command class. + */ + class MeterPulse: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new MeterPulse( _homeId, _nodeId ); } + virtual ~MeterPulse(){} + + static uint8 const StaticGetCommandClassId(){ return 0x35; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_METER_PULSE"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + MeterPulse( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiCmd.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiCmd.cpp new file mode 100644 index 0000000..f5b2898 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiCmd.cpp @@ -0,0 +1,77 @@ +//----------------------------------------------------------------------------- +// +// MultiCmd.h +// +// Implementation of the Z-Wave COMMAND_CLASS_MULTI_CMD +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "MultiCmd.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool MultiCmd::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( MultiCmdCmd_Encap == (MultiCmdCmd)_data[0] ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received encapsulated multi-command from node %d", GetNodeId() ); + + if( Node const* node = GetNodeUnsafe() ) + { + // Iterate over commands + uint8 base = 2; + for( uint8 i=0; i<_data[1]; ++i ) + { + uint8 length = _data[base]; + uint8 commandClassId = _data[base+1]; + + if( CommandClass* pCommandClass = node->GetCommandClass( commandClassId ) ) + { + pCommandClass->HandleMsg( &_data[base+2], length-1 ); + } + + base += (length + 1); + } + } + + Log::Write( LogLevel_Info, GetNodeId(), "End of encapsulated multi-command from node %d", GetNodeId() ); + return true; + } + return false; +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiCmd.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiCmd.h new file mode 100644 index 0000000..5cbb855 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiCmd.h @@ -0,0 +1,63 @@ +//----------------------------------------------------------------------------- +// +// MultiCmd.h +// +// Implementation of the Z-Wave COMMAND_CLASS_MULTI_CMD +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _MultiCmd_H +#define _MultiCmd_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_MULTI_CMD (0x8f), a Z-Wave device command class. + */ + class MultiCmd: public CommandClass + { + public: + enum MultiCmdCmd + { + MultiCmdCmd_Encap = 0x01 + }; + + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new MultiCmd( _homeId, _nodeId ); } + virtual ~MultiCmd(){} + + static uint8 const StaticGetCommandClassId(){ return 0x8f; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_MULTI_CMD"; } + + // From CommandClass + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + private: + MultiCmd( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstance.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstance.cpp new file mode 100644 index 0000000..d05b999 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstance.cpp @@ -0,0 +1,676 @@ +//----------------------------------------------------------------------------- +// +// MultiInstance.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_MULTI_INSTANCE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "../tinyxml.h" +#include "CommandClasses.h" +#include "Basic.h" +#include "MultiInstance.h" +#include "NoOperation.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../Node.h" +#include "../platform/Log.h" + +using namespace OpenZWave; + +// Reduced set of Generic Device classes sorted to reduce +// the likely number of calls to MultiChannelCmd_EndPointFind. +uint8 const c_genericClass[] = +{ + 0x21, // Multilevel Sensor + 0x20, // Binary Sensor + 0x31, // Meter + 0x08, // Thermostat + 0x11, // Multilevel Switch + 0x10, // Binary Switch + 0x12, // Remote Switch + 0xa1, // Alarm Sensor + 0x16, // Ventilation + 0x30, // Pulse Meter + 0x40, // Entry Control + 0x13, // Toggle Switch + 0x03, // AV Control Point + 0x04, // Display + 0x00 // End of list +}; + +char const* c_genericClassName[] = +{ + "Multilevel Sensor", + "Binary Sensor", + "Meter", + "Thermostat", + "Multilevel Switch", + "Binary Switch", + "Remote Switch", + "Alarm Sensor", + "Ventilation", + "Pulse Meter", + "Entry Control", + "Toggle Switch", + "AV Control Point", + "Display", + "Unknown" +}; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +MultiInstance::MultiInstance +( + uint32 const _homeId, + uint8 const _nodeId +): +CommandClass( _homeId, _nodeId ), +m_numEndPoints( 0 ), +m_numEndPointsHint( 0 ), +m_endPointMap( MultiInstanceMapAll ), +m_endPointFindSupported( false ) +{ +} + +//----------------------------------------------------------------------------- +// +// Class specific configuration +//----------------------------------------------------------------------------- +void MultiInstance::ReadXML +( + TiXmlElement const* _ccElement +) +{ + int32 intVal; + char const* str; + + CommandClass::ReadXML( _ccElement ); + + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "endpoints", &intVal ) ) + { + m_numEndPointsHint = (uint8)intVal; + } + + str = _ccElement->Attribute("mapping"); + if( str ) + { + if( strcmp( str, "all") == 0 ) + { + m_endPointMap = MultiInstanceMapAll; + } + else if( strcmp( str, "endpoints") == 0 ) + { + m_endPointMap = MultiInstanceMapEndPoints; + } + else + { + Log::Write( LogLevel_Info, GetNodeId(), "Bad value for mapping: %s", str); + } + } + + str = _ccElement->Attribute("findsupport"); + if( str ) + { + m_endPointFindSupported = !strcmp( str, "true"); + } + str = _ccElement->Attribute("ignoreUnsolicitedMultiChnCapReport"); + if( str ) + { + m_ignoreUnsolicitedMultiChannelCapabilityReport = !strcmp( str, "true"); + } +} + +//----------------------------------------------------------------------------- +// +// Class specific configuration +//----------------------------------------------------------------------------- +void MultiInstance::WriteXML +( + TiXmlElement* _ccElement +) +{ + char str[32]; + + CommandClass::WriteXML( _ccElement ); + if( m_numEndPointsHint != 0 ) + { + snprintf( str, sizeof(str), "%d", m_numEndPointsHint ); + _ccElement->SetAttribute( "endpoints", str); + } + + if( m_endPointMap == MultiInstanceMapEndPoints ) + { + _ccElement->SetAttribute( "mapping", "endpoints" ); + } + + if( m_endPointFindSupported ) + { + _ccElement->SetAttribute( "findsupport", "true" ); + } +} + +//----------------------------------------------------------------------------- +// +// Request number of instances of the specified command class from the device +//----------------------------------------------------------------------------- +bool MultiInstance::RequestInstances +( +) +{ + bool res = false; + + if( GetVersion() == 1 ) + { + if( Node* node = GetNodeUnsafe() ) + { + // MULTI_INSTANCE + char str[128]; + for( map::const_iterator it = node->m_commandClassMap.begin(); it != node->m_commandClassMap.end(); ++it ) + { + CommandClass* cc = it->second; + if( cc->GetCommandClassId() == NoOperation::StaticGetCommandClassId() ) + { + continue; + } + if( cc->HasStaticRequest( StaticRequest_Instances ) ) + { + snprintf( str, sizeof( str ), "MultiInstanceCmd_Get for %s", cc->GetCommandClassName().c_str() ); + + Msg* msg = new Msg( str, GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( MultiInstanceCmd_Get ); + msg->Append( cc->GetCommandClassId() ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Query ); + res = true; + } + } + } + } + else + { + // MULTI_CHANNEL + char str[128]; + snprintf( str, sizeof( str ), "MultiChannelCmd_EndPointGet for node %d", GetNodeId() ); + + Msg* msg = new Msg( str, GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( MultiChannelCmd_EndPointGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Query ); + res = true; + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool MultiInstance::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + bool handled = false; + Node* node = GetNodeUnsafe(); + if( node != NULL ) + { + handled = true; + switch( (MultiInstanceCmd)_data[0] ) + { + case MultiInstanceCmd_Report: + { + HandleMultiInstanceReport( _data, _length ); + break; + } + case MultiInstanceCmd_Encap: + { + HandleMultiInstanceEncap( _data, _length ); + break; + } + case MultiChannelCmd_EndPointReport: + { + HandleMultiChannelEndPointReport( _data, _length ); + break; + } + case MultiChannelCmd_CapabilityReport: + { + HandleMultiChannelCapabilityReport( _data, _length ); + break; + } + case MultiChannelCmd_EndPointFindReport: + { + HandleMultiChannelEndPointFindReport( _data, _length ); + break; + } + case MultiChannelCmd_Encap: + { + HandleMultiChannelEncap( _data, _length ); + break; + } + default: + { + handled = false; + break; + } + } + } + + return handled; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +void MultiInstance::HandleMultiInstanceReport +( + uint8 const* _data, + uint32 const _length +) +{ + if( Node* node = GetNodeUnsafe() ) + { + uint8 commandClassId = _data[1]; + uint8 instances = _data[2]; + + if( CommandClass* pCommandClass = node->GetCommandClass( commandClassId ) ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received MultiInstanceReport from node %d for %s: Number of instances = %d", GetNodeId(), pCommandClass->GetCommandClassName().c_str(), instances ); + pCommandClass->SetInstances( instances ); + pCommandClass->ClearStaticRequest( StaticRequest_Instances ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +void MultiInstance::HandleMultiInstanceEncap +( + uint8 const* _data, + uint32 const _length +) +{ + if( Node* node = GetNodeUnsafe() ) + { + uint8 instance = _data[1]; + if( GetVersion() > 1 ) + { + instance &= 0x7f; + } + uint8 commandClassId = _data[2]; + + if( CommandClass* pCommandClass = node->GetCommandClass( commandClassId ) ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received a MultiInstanceEncap from node %d, instance %d, for Command Class %s", GetNodeId(), instance, pCommandClass->GetCommandClassName().c_str() ); + pCommandClass->ReceivedCntIncr(); + pCommandClass->HandleMsg( &_data[3], _length-3, instance ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +void MultiInstance::HandleMultiChannelEndPointReport +( + uint8 const* _data, + uint32 const _length +) +{ + int len; + + if( m_numEndPoints != 0 ) + { + return; + } + + m_numEndPointsCanChange = (( _data[1] & 0x80 ) != 0 ); // Number of endpoints can change. + m_endPointsAreSameClass = (( _data[1] & 0x40 ) != 0 ); // All endpoints are the same command class. + m_numEndPoints = _data[2] & 0x7f; + if( m_numEndPointsHint != 0 ) + { + m_numEndPoints = m_numEndPointsHint; // don't use device's number + } + + len = m_numEndPoints; + if( m_endPointsAreSameClass ) // only need to check single end point + { + len = 1; + Log::Write( LogLevel_Info, GetNodeId(), "Received MultiChannelEndPointReport from node %d. All %d endpoints are the same.", GetNodeId(), m_numEndPoints ); + } + else + { + Log::Write( LogLevel_Info, GetNodeId(), "Received MultiChannelEndPointReport from node %d. %d endpoints are not all the same.", GetNodeId(), m_numEndPoints ); + } + + // This code assumes the endpoints are all in numeric sequential order. + // Since the end point finds do not appear to work this is the best estimate. + for( uint8 i = 1; i <= len; i++ ) + { + + // Send a single capability request to each endpoint + char str[128]; + snprintf( str, sizeof( str ), "MultiChannelCmd_CapabilityGet for endpoint %d", i ); + Msg* msg = new Msg( str, GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( MultiChannelCmd_CapabilityGet ); + msg->Append( i ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + } +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +void MultiInstance::HandleMultiChannelCapabilityReport +( + uint8 const* _data, + uint32 const _length +) +{ + + bool dynamic = ((_data[1] & 0x80)!=0); + + + if( Node* node = GetNodeUnsafe() ) + { + /* if you having problems with Dynamic Devices not correctly + * updating the commandclasses, see this email thread: + * https://groups.google.com/d/topic/openzwave/IwepxScRAVo/discussion + */ + if ((m_ignoreUnsolicitedMultiChannelCapabilityReport && (node->GetCurrentQueryStage() != Node::QueryStage_Instances)) + && !dynamic && m_endPointCommandClasses.size() > 0) { + Log::Write(LogLevel_Error, GetNodeId(), "Recieved a Unsolicited MultiChannelEncap when we are not in QueryState_Instances"); + return; + } + + uint8 endPoint = _data[1] & 0x7f; + + Log::Write( LogLevel_Info, GetNodeId(), "Received MultiChannelCapabilityReport from node %d for endpoint %d", GetNodeId(), endPoint ); + Log::Write( LogLevel_Info, GetNodeId(), " Endpoint is%sdynamic, and is a %s", dynamic ? " " : " not ", node->GetEndPointDeviceClassLabel( _data[2], _data[3] ).c_str() ); + Log::Write( LogLevel_Info, GetNodeId(), " Command classes supported by the endpoint are:" ); + + // Store the command classes for later use + bool afterMark = false; + m_endPointCommandClasses.clear(); + uint8 numCommandClasses = _length - 5; + for( uint8 i = 0; i < numCommandClasses; ++i ) + { + uint8 commandClassId = _data[i+4]; + if( commandClassId == 0xef ) + { + afterMark = true; + continue; + } + + m_endPointCommandClasses.insert( commandClassId ); + + // Ensure the node supports this command class + CommandClass* cc = node->GetCommandClass( commandClassId ); + if( !cc ) + { + cc = node->AddCommandClass( commandClassId ); + if( cc && afterMark ) + { + cc->SetAfterMark(); + } + } + if( cc ) + { + Log::Write( LogLevel_Info, GetNodeId(), " %s", cc->GetCommandClassName().c_str() ); + } + } + + // Create internal library instances for each command class in the list + // Also set up mapping from intances to endpoints for encapsulation + Basic* basic = static_cast( node->GetCommandClass( Basic::StaticGetCommandClassId() ) ); + if( m_endPointsAreSameClass ) // Create all the same instances here + { + int len; + + if( m_endPointMap == MultiInstanceMapAll ) // Include the non-endpoint instance + { + endPoint = 0; + len = m_numEndPoints + 1; + } + else + { + endPoint = 1; + len = m_numEndPoints; + } + + // Create all the command classes for all the endpoints + for( uint8 i = 1; i <= len; i++ ) + { + for( set::iterator it = m_endPointCommandClasses.begin(); it != m_endPointCommandClasses.end(); ++it ) + { + uint8 commandClassId = *it; + CommandClass* cc = node->GetCommandClass( commandClassId ); + if( cc ) + { + cc->SetInstance( i ); + if( m_endPointMap != MultiInstanceMapAll || i != 1 ) + { + cc->SetEndPoint( i, endPoint ); + } + // If we support the BASIC command class and it is mapped to a command class + // assigned to this end point, make sure the BASIC command class is also associated + // with this end point. + if( basic != NULL && basic->GetMapping() == commandClassId ) + { + basic->SetInstance( i ); + if( m_endPointMap != MultiInstanceMapAll || i != 1 ) + { + basic->SetEndPoint( i, endPoint ); + } + } + } + } + endPoint++; + } + } + else // Endpoints are different + { + for( set::iterator it = m_endPointCommandClasses.begin(); it != m_endPointCommandClasses.end(); ++it ) + { + uint8 commandClassId = *it; + CommandClass* cc = node->GetCommandClass( commandClassId ); + if( cc ) + { + uint8 i; + // Find the next free instance of this class + for( i = 1; i <= 127; i++ ) + { + if( m_endPointMap == MultiInstanceMapAll ) // Include the non-endpoint instance + { + if( !cc->GetInstances()->IsSet( i ) ) + { + break; + } + } + // Reuse non-endpoint instances first time we see it + else if( i == 1 && cc->GetInstances()->IsSet( i ) && cc->GetEndPoint( i ) == 0 ) + { + break; + } + // Find the next free instance + else if( !cc->GetInstances()->IsSet( i ) ) + { + break; + } + } + cc->SetInstance( i ); + cc->SetEndPoint( i, endPoint ); + // If we support the BASIC command class and it is mapped to a command class + // assigned to this end point, make sure the BASIC command class is also associated + // with this end point. + if( basic != NULL && basic->GetMapping() == commandClassId ) + { + basic->SetInstance( i ); + basic->SetEndPoint( i, endPoint ); + } + } + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +void MultiInstance::HandleMultiChannelEndPointFindReport +( + uint8 const* _data, + uint32 const _length +) +{ + Log::Write( LogLevel_Info, GetNodeId(), "Received MultiChannelEndPointFindReport from node %d", GetNodeId() ); + uint8 numEndPoints = _length - 5; + for( uint8 i=0; i::iterator it=m_endPointCommandClasses.begin(); it!=m_endPointCommandClasses.end(); ++it ) + { + uint8 commandClassId = *it; + CommandClass* cc = node->GetCommandClass( commandClassId ); + if( cc ) + { + Log::Write( LogLevel_Info, GetNodeId(), " Endpoint %d: Adding %s", endPoint, cc->GetCommandClassName().c_str() ); + cc->SetInstance( endPoint ); + } + } + } + } + else + { + // Endpoints are different, so request the capabilities + char str[128]; + snprintf( str, 128, "MultiChannelCmd_CapabilityGet for node %d, endpoint %d", GetNodeId(), endPoint ); + Msg* msg = new Msg( str, GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( MultiChannelCmd_CapabilityGet ); + msg->Append( endPoint ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + } + } + + m_numEndPointsFound += numEndPoints; + if( !m_endPointsAreSameClass ) + { + if( _data[1] == 0 ) + { + // No more reports to follow this one, so we can continue the search. + if( m_numEndPointsFound < numEndPoints ) + { + // We have not yet found all the endpoints, so move to the next generic class request + ++m_endPointFindIndex; + if (m_endPointFindIndex <= 13) /* we are finished */ + { + if( c_genericClass[m_endPointFindIndex] > 0 ) + { + if (m_endPointFindIndex > 13) /* size of c_genericClassName minus Unknown Entry */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "m_endPointFindIndex Value was greater than range. Setting to Unknown"); + m_endPointFindIndex = 14; + } + + char str[128]; + snprintf( str, 128, "MultiChannelCmd_EndPointFind for generic device class 0x%.2x (%s)", c_genericClass[m_endPointFindIndex], c_genericClassName[m_endPointFindIndex] ); + Msg* msg = new Msg( str, GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 4 ); + msg->Append( GetCommandClassId() ); + msg->Append( MultiChannelCmd_EndPointFind ); + msg->Append( c_genericClass[m_endPointFindIndex] ); // Generic device class + msg->Append( 0xff ); // Any specific device class + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + } + } else { + Log::Write (LogLevel_Warning, GetNodeId(), "m_endPointFindIndex is higher than range. Not Sending MultiChannelCmd_EndPointFind message"); + } + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +void MultiInstance::HandleMultiChannelEncap +( + uint8 const* _data, + uint32 const _length +) +{ + if( Node* node = GetNodeUnsafe() ) + { + uint8 endPoint = _data[1] & 0x7f; + uint8 commandClassId = _data[3]; + if( CommandClass* pCommandClass = node->GetCommandClass( commandClassId ) ) + { + uint8 instance = pCommandClass->GetInstance( endPoint ); + if( instance == 0 ) + { + Log::Write( LogLevel_Error, GetNodeId(), "Cannot find endpoint map to instance for Command Class %s endpoint %d", pCommandClass->GetCommandClassName().c_str(), endPoint ); + } + else + { + Log::Write( LogLevel_Info, GetNodeId(), "Received a MultiChannelEncap from node %d, endpoint %d for Command Class %s", GetNodeId(), endPoint, pCommandClass->GetCommandClassName().c_str() ); + pCommandClass->HandleMsg( &_data[4], _length-4, instance ); + } + } else { + Log::Write(LogLevel_Error, GetNodeId(), "Recieved a MultiChannelEncap for endpoint %d for Command Class %d, which we can't find", endPoint, commandClassId); + } + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstance.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstance.h new file mode 100644 index 0000000..da7be17 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstance.h @@ -0,0 +1,111 @@ +//----------------------------------------------------------------------------- +// +// MultiInstance.h +// +// Implementation of the Z-Wave COMMAND_CLASS_MULTI_INSTANCE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _MultiInstance_H +#define _MultiInstance_H + +#include +#include "CommandClass.h" + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_MULTI_INSTANCE (0x60), a Z-Wave device command class. + */ + class MultiInstance: public CommandClass + { + public: + enum MultiInstanceCmd + { + MultiInstanceCmd_Get = 0x04, + MultiInstanceCmd_Report = 0x05, + MultiInstanceCmd_Encap = 0x06, + + // Version 2 + MultiChannelCmd_EndPointGet = 0x07, + MultiChannelCmd_EndPointReport = 0x08, + MultiChannelCmd_CapabilityGet = 0x09, + MultiChannelCmd_CapabilityReport = 0x0a, + MultiChannelCmd_EndPointFind = 0x0b, + MultiChannelCmd_EndPointFindReport = 0x0c, + MultiChannelCmd_Encap = 0x0d + }; + + enum MultiInstanceMapping + { + MultiInstanceMapAll, + MultiInstanceMapEndPoints, + MultiInstanceMapOther + }; + + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new MultiInstance( _homeId, _nodeId ); } + virtual ~MultiInstance(){} + + static uint8 const StaticGetCommandClassId(){ return 0x60; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_MULTI_INSTANCE/CHANNEL"; } + + bool RequestInstances(); + + // From CommandClass + virtual void ReadXML( TiXmlElement const* _ccElement ); + virtual void WriteXML( TiXmlElement* _ccElement ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual uint8 GetMaxVersion(){ return 2; } + + MultiInstanceMapping GetEndPointMap(){ return m_endPointMap; } + + private: + MultiInstance( uint32 const _homeId, uint8 const _nodeId ); + + void HandleMultiInstanceReport( uint8 const* _data, uint32 const _length ); + void HandleMultiInstanceEncap( uint8 const* _data, uint32 const _length ); + void HandleMultiChannelEndPointReport( uint8 const* _data, uint32 const _length ); + void HandleMultiChannelCapabilityReport( uint8 const* _data, uint32 const _length ); + void HandleMultiChannelEndPointFindReport( uint8 const* _data, uint32 const _length ); + void HandleMultiChannelEncap( uint8 const* _data, uint32 const _length ); + + bool m_numEndPointsCanChange; + bool m_endPointsAreSameClass; + uint8 m_numEndPoints; + + // Finding endpoints + uint8 m_endPointFindIndex; + uint8 m_numEndPointsFound; + set m_endPointCommandClasses; + + // configuration + uint8 m_numEndPointsHint; // for nodes that do not report correct number of end points + MultiInstanceMapping m_endPointMap; // Determine how to map end points to value id instances + bool m_endPointFindSupported; // for nodes that (someday may) support endpointfind + bool m_ignoreUnsolicitedMultiChannelCapabilityReport; + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstanceAssociation.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstanceAssociation.cpp new file mode 100644 index 0000000..a6bd8b5 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstanceAssociation.cpp @@ -0,0 +1,61 @@ +//----------------------------------------------------------------------------- +// +// MultiInstanceAssociation.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_MULTI_INSTANCE_ASSOCIATION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "MultiInstanceAssociation.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../platform/Log.h" + +using namespace OpenZWave; + +enum MultiInstanceAssociationCmd +{ + MultiInstanceAssociationCmd_Set = 0x01, + MultiInstanceAssociationCmd_Get = 0x02, + MultiInstanceAssociationCmd_Report = 0x03, + MultiInstanceAssociationCmd_Remove = 0x04, + MultiInstanceAssociationCmd_GroupingsGet = 0x05, + MultiInstanceAssociationCmd_GroupingsReport = 0x06 +}; + + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool MultiInstanceAssociation::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + return false; +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstanceAssociation.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstanceAssociation.h new file mode 100644 index 0000000..53da98e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/MultiInstanceAssociation.h @@ -0,0 +1,59 @@ +//----------------------------------------------------------------------------- +// +// MultiInstanceAssociation.h +// +// Implementation of the Z-Wave COMMAND_CLASS_MULTI_INSTANCE_ASSOCIATION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _MultiInstanceAssociation_H +#define _MultiInstanceAssociation_H + +#include +#include "CommandClass.h" + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_MULTI_INSTANCE_ASSOCIATION (0x8E), a Z-Wave device command class. + */ + class MultiInstanceAssociation: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new MultiInstanceAssociation( _homeId, _nodeId ); } + virtual ~MultiInstanceAssociation(){} + + static uint8 const StaticGetCommandClassId(){ return 0x8e; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_MULTI_INSTANCE_ASSOCIATION"; } + + // From CommandClass + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + private: + MultiInstanceAssociation( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/NoOperation.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/NoOperation.cpp new file mode 100644 index 0000000..42e65df --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/NoOperation.cpp @@ -0,0 +1,76 @@ +//----------------------------------------------------------------------------- +// +// NoOperation.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_NO_OPERATION +// +// Copyright (c) 2012 Greg Satz +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "NoOperation.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool NoOperation::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + // We have received a no operation from the Z-Wave device. + Log::Write( LogLevel_Info, GetNodeId(), "Received NoOperation command from node %d", GetNodeId() ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Send a No Operation message class. +//----------------------------------------------------------------------------- +void NoOperation::Set +( + bool const _route, + Driver::MsgQueue _queue // = Driver::MsgQueue_NoOp +) +{ + Log::Write( LogLevel_Info, GetNodeId(), "NoOperation::Set - Routing=%s", _route ? "true" : "false" ); + + Msg* msg = new Msg( "NoOperation_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( 0 ); + if( _route ) + msg->Append( GetDriver()->GetTransmitOptions() ); + else + msg->Append( TRANSMIT_OPTION_ACK | TRANSMIT_OPTION_NO_ROUTE ); + GetDriver()->SendMsg( msg, _queue ); +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/NoOperation.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/NoOperation.h new file mode 100644 index 0000000..e5b73b2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/NoOperation.h @@ -0,0 +1,60 @@ +//----------------------------------------------------------------------------- +// +// NoOperation.h +// +// Implementation of the Z-Wave COMMAND_CLASS_NO_OPERATION +// +// Copyright (c) 2012 Greg Satz +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _NoOperation_H +#define _NoOperation_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_NO_OPERATION (0x00), a Z-Wave device command class. + */ + class NoOperation: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new NoOperation( _homeId, _nodeId ); } + virtual ~NoOperation(){} + + static uint8 const StaticGetCommandClassId(){ return 0x00; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_NO_OPERATION"; } + + void Set( bool const _route, Driver::MsgQueue const _queue = Driver::MsgQueue_NoOp ); + + // From CommandClass + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + private: + NoOperation( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/NodeNaming.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/NodeNaming.cpp new file mode 100644 index 0000000..f12e64b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/NodeNaming.cpp @@ -0,0 +1,531 @@ +//----------------------------------------------------------------------------- +// +// NodeNaming.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_NODE_NAMING +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "NodeNaming.h" +#include "Association.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../Notification.h" +#include "../platform/Log.h" + +using namespace OpenZWave; + +enum NodeNamingCmd +{ + NodeNamingCmd_Set = 0x01, + NodeNamingCmd_Get = 0x02, + NodeNamingCmd_Report = 0x03, + NodeNamingCmd_LocationSet = 0x04, + NodeNamingCmd_LocationGet = 0x05, + NodeNamingCmd_LocationReport = 0x06 +}; + +enum StringEncoding +{ + StringEncoding_ASCII = 0, + StringEncoding_ExtendedASCII, + StringEncoding_UTF16 +}; + +// Mapping of characters 0x80 and above to Unicode. +uint16 const c_extendedAsciiToUnicode[] = +{ + 0x20ac, // 0x80 - Euro Sign + 0x0081, // 0x81 - + 0x201a, // 0x82 - Single Low-9 Quotation Mark + 0x0192, // 0x83 - Latin Small Letter F With Hook + 0x201e, // 0x84 - Double Low-9 Quotation Mark + 0x2026, // 0x85 - Horizontal Ellipsis + 0x2020, // 0x86 - Dagger + 0x2021, // 0x87 - Double Dagger + 0x02c6, // 0x88 - Modifier Letter Circumflex Accent + 0x2030, // 0x89 - Per Mille Sign + 0x0160, // 0x8a - Latin Capital Letter S With Caron + 0x2039, // 0x8b - Single Left-Pointing Angle Quotation Mark + 0x0152, // 0x8c - Latin Capital Ligature Oe + 0x008d, // 0x8d - + 0x017d, // 0x8e - Latin Capital Letter Z With Caron + 0x008f, // 0x8f - + + 0x0090, // 0x90 - + 0x2018, // 0x91 - Left Single Quotation Mark + 0x2019, // 0x92 - Right Single Quotation Mark + 0x201c, // 0x93 - Left Double Quotation Mark + 0x201d, // 0x94 - Right Double Quotation Mark + 0x2022, // 0x95 - Bullet + 0x2013, // 0x96 - En Dash + 0x2014, // 0x97 - Em Dash + 0x02dc, // 0x98 - Small Tilde + 0x2122, // 0x99 - Trade Mark Sign + 0x0161, // 0x9a - Latin Small Letter S With Caron + 0x203a, // 0x9b - Single Right-Pointing Angle Quotation Mark + 0x0153, // 0x9c - Latin Small Ligature Oe + 0x009d, // 0x9d - + 0x017e, // 0x9e - Latin Small Letter Z With Caron + 0x0178, // 0x9f - Latin Capital Letter Y With Diaeresis + + 0x00a0, // 0xa0 - No-Break Space + 0x00a1, // 0xa1 - Inverted Exclamation Mark + 0x00a2, // 0xa2 - Cent Sign + 0x00a3, // 0xa3 - Pound Sign + 0x00a4, // 0xa4 - Currency Sign + 0x00a5, // 0xa5 - Yen Sign + 0x00a6, // 0xa6 - Broken Bar + 0x00a7, // 0xa7 - Section Sign + 0x00a8, // 0xa8 - Diaeresis + 0x00a9, // 0xa9 - Copyright Sign + 0x00aa, // 0xaa - Feminine Ordinal Indicator + 0x00ab, // 0xab - Left-Pointing Double Angle Quotation Mark + 0x00ac, // 0xac - Not Sign + 0x00ad, // 0xad - Soft Hyphen + 0x00ae, // 0xae - Registered Sign + 0x00af, // 0xaf - Macron + + 0x00b0, // 0xb0 - Degree Sign + 0x00b1, // 0xb1 - Plus-Minus Sign + 0x00b2, // 0xb2 - Superscript Two + 0x00b3, // 0xb3 - Superscript Three + 0x00b4, // 0xb4 - Acute Accent + 0x00b5, // 0xb5 - Micro Sign + 0x00b6, // 0xb6 - Pilcrow Sign + 0x00b7, // 0xb7 - Middle Dot + 0x00b8, // 0xb8 - Cedilla + 0x00b9, // 0xb9 - Superscript One + 0x00ba, // 0xba - Masculine Ordinal Indicator + 0x00bb, // 0xbb - Right-Pointing Double Angle Quotation Mark + 0x00bc, // 0xbc - Vulgar Fraction One Quarter + 0x00bd, // 0xbd - Vulgar Fraction One Half + 0x00be, // 0xbe - Vulgar Fraction Three Quarters + 0x00bf, // 0xbf - Inverted Question Mark + + 0x00c0, // 0xc0 - Latin Capital Letter A With Grave + 0x00c1, // 0xc1 - Latin Capital Letter A With Acute + 0x00c2, // 0xc2 - Latin Capital Letter A With Circumflex + 0x00c3, // 0xc3 - Latin Capital Letter A With Tilde + 0x00c4, // 0xc4 - Latin Capital Letter A With Diaeresis + 0x00c5, // 0xc5 - Latin Capital Letter A With Ring Above + 0x00c6, // 0xc6 - Latin Capital Ligature Ae + 0x00c7, // 0xc7 - Latin Capital Letter C With Cedilla + 0x00c8, // 0xc8 - Latin Capital Letter E With Grave + 0x00c9, // 0xc9 - Latin Capital Letter E With Acute + 0x00ca, // 0xca - Latin Capital Letter E With Circumflex + 0x00cb, // 0xcb - Latin Capital Letter E With Diaeresis + 0x00cc, // 0xcc - Latin Capital Letter I With Grave + 0x00cd, // 0xcd - Latin Capital Letter I With Acute + 0x00ce, // 0xce - Latin Capital Letter I With Circumflex + 0x00cf, // 0xcf - Latin Capital Letter I With Diaeresis + + 0x00d0, // 0xd0 - Latin Capital Letter Eth + 0x00d1, // 0xd1 - Latin Capital Letter N With Tilde + 0x00d2, // 0xd2 - Latin Capital Letter O With Grave + 0x00d3, // 0xd3 - Latin Capital Letter O With Acute + 0x00d4, // 0xd4 - Latin Capital Letter O With Circumflex + 0x00d5, // 0xd5 - Latin Capital Letter O With Tilde + 0x00d6, // 0xd6 - Latin Capital Letter O With Diaeresis + 0x00d7, // 0xd7 - Multiplication Sign + 0x00d8, // 0xd8 - Latin Capital Letter O With Stroke + 0x00d9, // 0xd9 - Latin Capital Letter U With Grave + 0x00da, // 0xda - Latin Capital Letter U With Acute + 0x00db, // 0xdb - Latin Capital Letter U With Circumflex + 0x00dc, // 0xdc - Latin Capital Letter U With Diaeresis + 0x00dd, // 0xdd - Latin Capital Letter Y With Acute + 0x00de, // 0xde - Latin Capital Letter Thorn + 0x00df, // 0xdf - Latin Small Letter Sharp S + + 0x00e0, // 0xe0 - Latin Small Letter A With Grave + 0x00e1, // 0xe1 - Latin Small Letter A With Acute + 0x00e2, // 0xe2 - Latin Small Letter A With Circumflex + 0x00e3, // 0xe3 - Latin Small Letter A With Tilde + 0x00e4, // 0xe4 - Latin Small Letter A With Diaeresis + 0x00e5, // 0xe5 - Latin Small Letter A With Ring Above + 0x00e6, // 0xe6 - Latin Small Ligature Ae + 0x00e7, // 0xe7 - Latin Small Letter C With Cedilla + 0x00e8, // 0xe8 - Latin Small Letter E With Grave + 0x00e9, // 0xe9 - Latin Small Letter E With Acute + 0x00ea, // 0xea - Latin Small Letter E With Circumflex + 0x00eb, // 0xeb - Latin Small Letter E With Diaeresis + 0x00ec, // 0xec - Latin Small Letter I With Grave + 0x00ed, // 0xed - Latin Small Letter I With Acute + 0x00ee, // 0xee - Latin Small Letter I With Circumflex + 0x00ef, // 0xef - Latin Small Letter I With Diaeresis + + 0x00f0, // 0xf0 - Latin Small Letter Eth + 0x00f1, // 0xf1 - Latin Small Letter N With Tilde + 0x00f2, // 0xf2 - Latin Small Letter O With Grave + 0x00f3, // 0xf3 - Latin Small Letter O With Acute + 0x00f4, // 0xf4 - Latin Small Letter O With Circumflex + 0x00f5, // 0xf5 - Latin Small Letter O With Tilde + 0x00f6, // 0xf6 - Latin Small Letter O With Diaeresis + 0x00f7, // 0xf7 - Division Sign + 0x00f8, // 0xf8 - Latin Small Letter O With Stroke + 0x00f9, // 0xf9 - Latin Small Letter U With Grave + 0x00fa, // 0xfa - Latin Small Letter U With Acute + 0x00fb, // 0xfb - Latin Small Letter U With Circumflex + 0x00fc, // 0xfc - Latin Small Letter U With Diaeresis + 0x00fd, // 0xfd - Latin Small Letter Y With Acute + 0x00fe, // 0xfe - Latin Small Letter Thorn + 0x00ff // 0xff - Latin Small Letter Y With Diaeresis +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool NodeNaming::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + bool res = false; + if( _requestFlags & RequestFlag_Session ) + { + if( Node* node = GetNodeUnsafe() ) + { + if( node->m_nodeName == "" ) + { + // If we don't already have a user-defined name, fetch it from the device + res |= RequestValue( _requestFlags, NodeNamingCmd_Get, _instance, _queue ); + } + + if( node->m_location == "" ) + { + // If we don't already have a user-defined location, fetch it from the device + res |= RequestValue( _requestFlags, NodeNamingCmd_LocationGet, _instance, _queue ); + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool NodeNaming::RequestValue +( + uint32 const _requestFlags, + uint8 const _getTypeEnum, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _instance != 1 ) + { + // This command class doesn't work with multiple instances + return false; + } + + Msg* msg; + if( _getTypeEnum == NodeNamingCmd_Get ) + { + if ( IsGetSupported() ) + { + msg = new Msg( "NodeNamingCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( NodeNamingCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "NodeNamingCmd_Get Not Supported on this node"); + } + return false; + } + + if( _getTypeEnum == NodeNamingCmd_LocationGet ) + { + // If we don't already have a user-defined name, fetch it from the device + msg = new Msg( "NodeNamingCmd_LocationGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( NodeNamingCmd_LocationGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool NodeNaming::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + bool updated = false; + if( Node* node = GetNodeUnsafe() ) + { + if( NodeNamingCmd_Report == (NodeNamingCmd)_data[0] ) + { + string name = ExtractString( _data, _length ); + if( node->m_nodeName == "" ) + { + // We only overwrite the name if it is empty + node->m_nodeName = name; + Log::Write( LogLevel_Info, GetNodeId(), "Received the name: %s.", name.c_str() ); + updated = true; + } + } + else if( NodeNamingCmd_LocationReport == (NodeNamingCmd)_data[0] ) + { + string location = ExtractString( _data, _length ); + if( node->m_location == "" ) + { + // We only overwrite the location if it is empty + node->m_location = location; + Log::Write( LogLevel_Info, GetNodeId(), "Received the location: %s.", location.c_str() ); + updated = true; + } + } + } + + if( updated ) + { + Notification* notification = new Notification( Notification::Type_NodeNaming ); + notification->SetHomeAndNodeIds( GetHomeId(), GetNodeId() ); + GetDriver()->QueueNotification( notification ); + } + + return true; +} + +//----------------------------------------------------------------------------- +// +// Set the name in the device +//----------------------------------------------------------------------------- +void NodeNaming::SetName +( + string const& _name +) +{ + size_t length = _name.size(); + if( length > 16 ) + { + length = 16; + } + + Log::Write( LogLevel_Info, GetNodeId(), "NodeNaming::Set - Naming to '%s'", _name.c_str() ); + Msg* msg = new Msg( "NodeNaming Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->Append( GetNodeId() ); + msg->Append( (uint8)(length + 3) ); + msg->Append( GetCommandClassId() ); + msg->Append( NodeNamingCmd_Set ); + msg->Append( (uint8)StringEncoding_ASCII ); + + for( uint32 i=0; iAppend( _name[i] ); + } + + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); +} + +//----------------------------------------------------------------------------- +// +// Set the location in the device +//----------------------------------------------------------------------------- +void NodeNaming::SetLocation +( + string const& _location +) +{ + size_t length = _location.size(); + if( length > 16 ) + { + length = 16; + } + + Log::Write( LogLevel_Info, GetNodeId(), "NodeNaming::SetLocation - Setting location to '%s'", _location.c_str() ); + Msg* msg = new Msg( "NodeNaming Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->Append( GetNodeId() ); + msg->Append( (uint8)(length + 3) ); + msg->Append( GetCommandClassId() ); + msg->Append( NodeNamingCmd_LocationSet ); + msg->Append( (uint8)StringEncoding_ASCII ); + + for( uint32 i=0; iAppend( _location[i] ); + } + + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); +} + +//----------------------------------------------------------------------------- +// +// Extract a string from the report data +//----------------------------------------------------------------------------- +string NodeNaming::ExtractString +( + uint8 const* _data, + uint32 const _length +) +{ + uint8 i; + char str[32]; + uint32 pos = 0; + + str[0] = 0; + StringEncoding encoding = (StringEncoding)( _data[1] & 0x07 ); + + if( _length >= 3 ) + { + // Get the length of the string (maximum allowed is 16 bytes) + uint8 numBytes = _length - 3; + if( numBytes > 16 ) + { + numBytes = 16; + } + + switch( encoding ) + { + case StringEncoding_ASCII: + { + // Copy data as-is + for( i=0; i= 0x80 ) + { + uint16 utf16 = c_extendedAsciiToUnicode[ch-0x80]; + pos = ConvertUFT16ToUTF8( utf16, str, pos ); + } + else + { + str[pos++] = (char)ch; + } + } + break; + } + case StringEncoding_UTF16: + { + // Convert UTF-16 characters to UTF-8 + for( i=0; i +// Convert a UTF-16 string into UTF-8 encoding. +//----------------------------------------------------------------------------- +uint32 NodeNaming::ConvertUFT16ToUTF8 +( + uint16 _utf16, + char* _buffer, + uint32 pos +) +{ + static uint16 surrogate = 0; + + if( ( surrogate != 0 ) && ( ( _utf16 & 0xdc00 ) == 0xdc00 ) ) + { + // UTF-16 surrogate character pair converts to four UTF-8 characters. + // We have the second member of the pair, so we can do the conversion now. + _buffer[pos++] = (char)( ((surrogate>>7) & 0x0007) | 0x00f0 ); + _buffer[pos++] = (char)( ((surrogate>>1) & 0x0020) | ((surrogate>>2) & 0x000f) | 0x0090 ); + _buffer[pos++] = (char)( ((_utf16>>6) & 0x000f) | ((surrogate<<4) & 0x0030) | 0x0080 ); + _buffer[pos++] = (char)( (_utf16 & 0x003f) | 0x0080 ); + } + else + { + surrogate = 0; + if( _utf16 & 0xff80 ) + { + if( _utf16 & 0xf800 ) + { + if( ( _utf16 & 0xd800 ) == 0xd800 ) + { + // UTF-16 surrogate character pair converts to four UTF-8 characters. + // We have the first member of the pair, so we store it for next time. + surrogate = _utf16; + } + else + { + // UTF-16 character can be represented by three UTF-8 characters. + _buffer[pos++] = (char)( (_utf16>>12) | 0x00e0 ); + _buffer[pos++] = (char)( ((_utf16>>6) & 0x003f) | 0x0080 ); + _buffer[pos++] = (char)( (_utf16 & 0x003f) | 0x0080 ); + } + } + else + { + // UTF-16 character can be represented by two UTF-8 characters. + _buffer[pos++] = (char)( (_utf16>>6) | 0x00c0 ); + _buffer[pos++] = (char)( (_utf16 & 0x003f) | 0x0080 ); + } + } + else + { + // UTF-16 character matches single ascii character. + _buffer[pos++] = (char)_utf16; + } + } + + return pos; +} + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/NodeNaming.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/NodeNaming.h new file mode 100644 index 0000000..ebf552b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/NodeNaming.h @@ -0,0 +1,66 @@ +//----------------------------------------------------------------------------- +// +// NodeNaming.h +// +// Implementation of the Z-Wave COMMAND_CLASS_NODE_NAMING +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _NodeNaming_H +#define _NodeNaming_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_NODE_NAMING (0x77), a Z-Wave device command class. + */ + class NodeNaming: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new NodeNaming( _homeId, _nodeId ); } + virtual ~NodeNaming(){} + + static uint8 const StaticGetCommandClassId(){ return 0x77; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_NODE_NAMING"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + void SetName( string const& _name ); + void SetLocation( string const& _location ); + + private: + NodeNaming( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + + string ExtractString( uint8 const* _data, uint32 const _length ); + uint32 ConvertUFT16ToUTF8( uint16 _utf16, char* _buffer, uint32 pos ); + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Powerlevel.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Powerlevel.cpp new file mode 100644 index 0000000..f49499b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Powerlevel.cpp @@ -0,0 +1,501 @@ +//----------------------------------------------------------------------------- +// +// Powerlevel.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_POWERLEVEL +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include + +#include "CommandClasses.h" +#include "Powerlevel.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueByte.h" +#include "../value_classes/ValueShort.h" +#include "../value_classes/ValueList.h" +#include "../value_classes/ValueButton.h" + +using namespace OpenZWave; + +enum PowerlevelCmd +{ + PowerlevelCmd_Set = 0x01, + PowerlevelCmd_Get = 0x02, + PowerlevelCmd_Report = 0x03, + PowerlevelCmd_TestNodeSet = 0x04, + PowerlevelCmd_TestNodeGet = 0x05, + PowerlevelCmd_TestNodeReport = 0x06 +}; + +enum +{ + PowerlevelIndex_Powerlevel = 0, + PowerlevelIndex_Timeout, + PowerlevelIndex_Set, + PowerlevelIndex_TestNode, + PowerlevelIndex_TestPowerlevel, + PowerlevelIndex_TestFrames, + PowerlevelIndex_Test, + PowerlevelIndex_Report, + PowerlevelIndex_TestStatus, + PowerlevelIndex_TestAckFrames +}; + +static char const* c_powerLevelNames[] = +{ + "Normal", + "-1dB", + "-2dB", + "-3dB", + "-4dB", + "-5dB", + "-6dB", + "-7dB", + "-8dB", + "-9dB", + "Unknown" +}; + +static char const* c_powerLevelStatusNames[] = +{ + "Failed", + "Success", + "In Progress", + "Unknown" +}; + + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool Powerlevel::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Session ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool Powerlevel::RequestValue +( + uint32 const _requestFlags, + uint8 const _index, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _index == 0 ) + { + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "Powerlevel_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( PowerlevelCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "Powerlevel_Get Not Supported on this node"); + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Powerlevel::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( PowerlevelCmd_Report == (PowerlevelCmd)_data[0] ) + { + PowerLevelEnum powerLevel = (PowerLevelEnum)_data[1]; + if (powerLevel > 9) /* size of c_powerLevelNames minus Unknown*/ + { + Log::Write (LogLevel_Warning, GetNodeId(), "powerLevel Value was greater than range. Setting to Invalid"); + powerLevel = (PowerLevelEnum)10; + } + uint8 timeout = _data[2]; + + Log::Write( LogLevel_Info, GetNodeId(), "Received a PowerLevel report: PowerLevel=%s, Timeout=%d", c_powerLevelNames[powerLevel], timeout ); + if( ValueList* value = static_cast( GetValue( _instance, PowerlevelIndex_Powerlevel ) ) ) + { + value->OnValueRefreshed( (int)powerLevel ); + value->Release(); + } + if( ValueByte* value = static_cast( GetValue( _instance, PowerlevelIndex_Timeout ) ) ) + { + value->OnValueRefreshed( timeout ); + value->Release(); + } + return true; + } + + if( PowerlevelCmd_TestNodeReport == (PowerlevelCmd)_data[0] ) + { + uint8 testNode = _data[1]; + PowerLevelStatusEnum status = (PowerLevelStatusEnum)_data[2]; + uint16 ackCount = (((uint16)_data[3])<<8) | (uint16)_data[4]; + + if (status > 2) /* size of c_powerLevelStatusNames minus Unknown */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "status Value was greater than range. Setting to Unknown"); + status = (PowerLevelStatusEnum)3; + } + + Log::Write( LogLevel_Info, GetNodeId(), "Received a PowerLevel Test Node report: Test Node=%d, Status=%s, Test Frame ACK Count=%d", testNode, c_powerLevelStatusNames[status], ackCount ); + if( ValueByte* value = static_cast( GetValue( _instance, PowerlevelIndex_TestNode ) ) ) + { + value->OnValueRefreshed( testNode ); + value->Release(); + } + if( ValueList* value = static_cast( GetValue( _instance, PowerlevelIndex_TestStatus ) ) ) + { + value->OnValueRefreshed( (int)status ); + value->Release(); + } + if( ValueShort* value = static_cast( GetValue( _instance, PowerlevelIndex_TestAckFrames ) ) ) + { + value->OnValueRefreshed( (short)ackCount ); + value->Release(); + } + return true; + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a value on the Z-Wave device +//----------------------------------------------------------------------------- +bool Powerlevel::SetValue +( + Value const& _value +) +{ + bool res = false; + uint8 instance = _value.GetID().GetInstance(); + + switch( _value.GetID().GetIndex() ) + { + case PowerlevelIndex_Powerlevel: + { + if( ValueList* value = static_cast( GetValue( instance, PowerlevelIndex_Powerlevel ) ) ) + { + ValueList::Item const& item = (static_cast( &_value))->GetItem(); + value->OnValueRefreshed( item.m_value ); + value->Release(); + } + res = true; + break; + } + case PowerlevelIndex_Timeout: + { + if( ValueByte* value = static_cast( GetValue( instance, PowerlevelIndex_Timeout ) ) ) + { + value->OnValueRefreshed( (static_cast( &_value))->GetValue() ); + value->Release(); + } + res = true; + break; + } + case PowerlevelIndex_Set: + { + // Set + if( ValueButton* button = static_cast( GetValue( instance, PowerlevelIndex_Set ) ) ) + { + if( button->IsPressed() ) + { + res = Set( instance ); + } + button->Release(); + } + break; + } + case PowerlevelIndex_TestNode: + { + if( ValueByte* value = static_cast( GetValue( instance, PowerlevelIndex_TestNode ) ) ) + { + value->OnValueRefreshed( (static_cast( &_value))->GetValue() ); + value->Release(); + } + res = true; + break; + } + case PowerlevelIndex_TestPowerlevel: + { + if( ValueList* value = static_cast( GetValue( instance, PowerlevelIndex_TestPowerlevel ) ) ) + { + ValueList::Item const& item = (static_cast( &_value))->GetItem(); + value->OnValueRefreshed( item.m_value ); + value->Release(); + } + res = true; + break; + } + case PowerlevelIndex_TestFrames: + { + if( ValueShort* value = static_cast( GetValue( instance, PowerlevelIndex_TestFrames ) ) ) + { + value->OnValueRefreshed( (static_cast( &_value))->GetValue() ); + value->Release(); + } + res = true; + break; + } + case PowerlevelIndex_Test: + { + // Test + if( ValueButton* button = static_cast( GetValue( instance, PowerlevelIndex_Test ) ) ) + { + if( button->IsPressed() ) + { + res = Test( instance ); + } + button->Release(); + } + break; + } + case PowerlevelIndex_Report: + { + // Test + if( ValueButton* button = static_cast( GetValue( instance, PowerlevelIndex_Report ) ) ) + { + if( button->IsPressed() ) + { + res = Report( instance ); + } + button->Release(); + } + break; + } + } + return res; +} + +//----------------------------------------------------------------------------- +// +// Set the transmit power of a node for a specified time +//----------------------------------------------------------------------------- +bool Powerlevel::Set +( + uint8 const _instance +) +{ + PowerLevelEnum powerLevel; + uint8 timeout; + + if( ValueList* value = static_cast( GetValue( _instance, PowerlevelIndex_Powerlevel ) ) ) + { + ValueList::Item const& item = value->GetItem(); + powerLevel = (PowerLevelEnum)item.m_value; + value->Release(); + } + else + { + return false; + } + + if( ValueByte* value = static_cast( GetValue( _instance, PowerlevelIndex_Timeout ) ) ) + { + timeout = value->GetValue(); + value->Release(); + } + else + { + return false; + } + if (powerLevel > 9) /* size of c_powerLevelNames minus Unknown */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "powerLevel Value was greater than range. Dropping"); + /* Drop it */ + return false; + } + + + Log::Write( LogLevel_Info, GetNodeId(), "Setting the power level to %s for %d seconds", c_powerLevelNames[powerLevel], timeout ); + Msg* msg = new Msg( "PowerlevelCmd_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 4 ); + msg->Append( GetCommandClassId() ); + msg->Append( PowerlevelCmd_Set ); + msg->Append( (uint8)powerLevel ); + msg->Append( timeout ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Test node to node communications +//----------------------------------------------------------------------------- +bool Powerlevel::Test +( + uint8 const _instance +) +{ + uint8 testNodeId; + PowerLevelEnum powerLevel; + uint16 numFrames; + + if( ValueByte* value = static_cast( GetValue( _instance, PowerlevelIndex_TestNode ) ) ) + { + testNodeId = value->GetValue(); + value->Release(); + } + else + { + return false; + } + + if( ValueList* value = static_cast( GetValue( _instance, PowerlevelIndex_TestPowerlevel ) ) ) + { + ValueList::Item const& item = value->GetItem(); + powerLevel = (PowerLevelEnum)item.m_value; + value->Release(); + } + else + { + return false; + } + + if( ValueShort* value = static_cast( GetValue( _instance, PowerlevelIndex_TestFrames ) ) ) + { + numFrames = value->GetValue(); + value->Release(); + } + else + { + return false; + } + if (powerLevel > 9) /* size of c_powerLevelNames minus Unknown */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "powerLevel Value was greater than range. Dropping"); + return false; + } + + + Log::Write( LogLevel_Info, GetNodeId(), "Running a Power Level Test: Target Node = %d, Power Level = %s, Number of Frames = %d", testNodeId, c_powerLevelNames[powerLevel], numFrames ); + Msg* msg = new Msg( "PowerlevelCmd_TestNodeSet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 6 ); + msg->Append( GetCommandClassId() ); + msg->Append( PowerlevelCmd_TestNodeSet ); + msg->Append( testNodeId ); + msg->Append( (uint8)powerLevel ); + msg->Append( (uint8)(numFrames >> 8) ); + msg->Append( (uint8)(numFrames & 0x00ff) ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Request test report +//----------------------------------------------------------------------------- +bool Powerlevel::Report +( + uint8 const _instance +) +{ + Log::Write( LogLevel_Info, GetNodeId(), "Power Level Report" ); + Msg* msg = new Msg( "PowerlevelCmd_TestNodeGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 6 ); + msg->Append( GetCommandClassId() ); + msg->Append( PowerlevelCmd_TestNodeGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void Powerlevel::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + vector items; + + ValueList::Item item; + for( uint8 i=0; i<10; ++i ) + { + item.m_label = c_powerLevelNames[i]; + item.m_value = i; + items.push_back( item ); + } + + node->CreateValueList( ValueID::ValueGenre_System, GetCommandClassId(), _instance, PowerlevelIndex_Powerlevel, "Powerlevel", "dB", false, false, 1, items, 0, 0 ); + node->CreateValueByte( ValueID::ValueGenre_System, GetCommandClassId(), _instance, PowerlevelIndex_Timeout, "Timeout", "seconds", false, false, 0, 0 ); + node->CreateValueButton( ValueID::ValueGenre_System, GetCommandClassId(), _instance, PowerlevelIndex_Set, "Set Powerlevel", 0 ); + node->CreateValueByte( ValueID::ValueGenre_System, GetCommandClassId(), _instance, PowerlevelIndex_TestNode, "Test Node", "", false, false, 0, 0 ); + node->CreateValueList( ValueID::ValueGenre_System, GetCommandClassId(), _instance, PowerlevelIndex_TestPowerlevel, "Test Powerlevel", "dB", false, false, 1, items, 0, 0 ); + node->CreateValueShort( ValueID::ValueGenre_System, GetCommandClassId(), _instance, PowerlevelIndex_TestFrames, "Frame Count", "", false, false, 0, 0 ); + node->CreateValueButton( ValueID::ValueGenre_System, GetCommandClassId(), _instance, PowerlevelIndex_Test, "Test", 0 ); + node->CreateValueButton( ValueID::ValueGenre_System, GetCommandClassId(), _instance, PowerlevelIndex_Report, "Report", 0 ); + + items.clear(); + for( uint8 i=0; i<3; ++i ) + { + item.m_label = c_powerLevelStatusNames[i]; + item.m_value = i; + items.push_back( item ); + } + node->CreateValueList( ValueID::ValueGenre_System, GetCommandClassId(), _instance, PowerlevelIndex_TestStatus, "Test Status", "", true, false, 1, items, 0, 0 ); + node->CreateValueShort( ValueID::ValueGenre_System, GetCommandClassId(), _instance, PowerlevelIndex_TestAckFrames, "Acked Frames", "", true, false, 0, 0 ); + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Powerlevel.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Powerlevel.h new file mode 100644 index 0000000..614a20d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Powerlevel.h @@ -0,0 +1,91 @@ +//----------------------------------------------------------------------------- +// +// Powerlevel.h +// +// Implementation of the Z-Wave COMMAND_CLASS_POWERLEVEL +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Powerlevel_H +#define _Powerlevel_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueList; + + /** \brief Implements COMMAND_CLASS_POWERLEVEL (0x73), a Z-Wave device command class. + */ + class Powerlevel: public CommandClass + { + public: + enum PowerLevelEnum + { + PowerLevel_Normal = 0, + PowerLevel_Minus1dB, + PowerLevel_Minus2dB, + PowerLevel_Minus3dB, + PowerLevel_Minus4dB, + PowerLevel_Minus5dB, + PowerLevel_Minus6dB, + PowerLevel_Minus7dB, + PowerLevel_Minus8dB, + PowerLevel_Minus9dB + }; + + enum PowerLevelStatusEnum + { + PowerLevelStatus_Failed = 0, + PowerLevelStatus_Success, + PowerLevelStatus_InProgress + }; + + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Powerlevel( _homeId, _nodeId ); } + virtual ~Powerlevel(){} + + static uint8 const StaticGetCommandClassId(){ return 0x73; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_POWERLEVEL"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + Powerlevel( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + + bool Set( uint8 const _instance ); + bool Test( uint8 const _instance ); + bool Report( uint8 const _instance ); + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Proprietary.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Proprietary.cpp new file mode 100644 index 0000000..01d469c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Proprietary.cpp @@ -0,0 +1,62 @@ +//----------------------------------------------------------------------------- +// +// Proprietary.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_PROPRIETARY +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "Proprietary.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../platform/Log.h" + +using namespace OpenZWave; + +enum ProprietaryCmd +{ + ProprietaryCmd_Set = 0x01, + ProprietaryCmd_Get = 0x02, + ProprietaryCmd_Report = 0x03 +}; + + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Proprietary::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if (ProprietaryCmd_Report == (ProprietaryCmd)_data[0]) + { + return true; + } + return false; +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Proprietary.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Proprietary.h new file mode 100644 index 0000000..8398dd5 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Proprietary.h @@ -0,0 +1,58 @@ +//----------------------------------------------------------------------------- +// +// Proprietary.h +// +// Implementation of the Z-Wave COMMAND_CLASS_PROPRIETARY +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Proprietary_H +#define _Proprietary_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_PROPRIETARY (0x88), a Z-Wave device command class. + */ + class Proprietary: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Proprietary( _homeId, _nodeId ); } + virtual ~Proprietary(){} + + static uint8 const StaticGetCommandClassId(){ return 0x88; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_PROPRIETARY"; } + + // From CommandClass + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + private: + Proprietary( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Protection.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Protection.cpp new file mode 100644 index 0000000..cd0560b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Protection.cpp @@ -0,0 +1,190 @@ +//----------------------------------------------------------------------------- +// +// Protection.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_PROTECTION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include + +#include "CommandClasses.h" +#include "Protection.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueList.h" + +using namespace OpenZWave; + +enum ProtectionCmd +{ + ProtectionCmd_Set = 0x01, + ProtectionCmd_Get = 0x02, + ProtectionCmd_Report = 0x03 +}; + +static char const* c_protectionStateNames[] = +{ + "Unprotected", + "Protection by Sequence", + "No Operation Possible", + "Unknown" +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool Protection::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Session ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool Protection::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "ProtectionCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( ProtectionCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "ProtectionCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Protection::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if (ProtectionCmd_Report == (ProtectionCmd)_data[0]) + { + int8 stateValue = _data[1]; + if (stateValue > 2) /* size of c_protectionStateNames minus Invalid */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "State Value was greater than range. Setting to Invalid"); + stateValue = 3; + } + Log::Write( LogLevel_Info, GetNodeId(), "Received a Protection report: %s", c_protectionStateNames[_data[1]] ); + if( ValueList* value = static_cast( GetValue( _instance, 0 ) ) ) + { + value->OnValueRefreshed( (int)_data[1] ); + value->Release(); + } + + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set the device's protection state +//----------------------------------------------------------------------------- +bool Protection::SetValue +( + Value const& _value +) +{ + if( ValueID::ValueType_List == _value.GetID().GetType() ) + { + ValueList const* value = static_cast(&_value); + ValueList::Item const& item = value->GetItem(); + + Log::Write( LogLevel_Info, GetNodeId(), "Protection::Set - Setting protection state to '%s'", item.m_label.c_str() ); + Msg* msg = new Msg( "Protection Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( ProtectionCmd_Set ); + msg->Append( (uint8)item.m_value ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void Protection::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + vector items; + + ValueList::Item item; + for( uint8 i=0; i<3; ++i ) + { + item.m_label = c_protectionStateNames[i]; + item.m_value = i; + items.push_back( item ); + } + + node->CreateValueList( ValueID::ValueGenre_System, GetCommandClassId(), _instance, 0, "Protection", "", false, false, 1, items, 0, 0 ); + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Protection.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Protection.h new file mode 100644 index 0000000..9f3048d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Protection.h @@ -0,0 +1,73 @@ +//----------------------------------------------------------------------------- +// +// Protection.h +// +// Implementation of the Z-Wave COMMAND_CLASS_PROTECTION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Protection_H +#define _Protection_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueList; + + /** \brief Implements COMMAND_CLASS_PROTECTION (0x75), a Z-Wave device command class. + */ + class Protection: public CommandClass + { + public: + enum ProtectionEnum + { + Protection_Unprotected = 0, + Protection_Sequence, + Protection_NOP + }; + + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Protection( _homeId, _nodeId ); } + virtual ~Protection(){} + + static uint8 const StaticGetCommandClassId(){ return 0x75; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_PROTECTION"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + Protection( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SceneActivation.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SceneActivation.cpp new file mode 100644 index 0000000..7c28cca --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SceneActivation.cpp @@ -0,0 +1,78 @@ +//----------------------------------------------------------------------------- +// +// SceneActivation.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_SCENE_ACTIVATION +// +// Copyright (c) 2012 Greg Satz +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "SceneActivation.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../Notification.h" +#include "../platform/Log.h" + +using namespace OpenZWave; + +enum SceneActivationCmd +{ + SceneActivationCmd_Set = 0x01 +}; + + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool SceneActivation::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( SceneActivationCmd_Set == (SceneActivationCmd)_data[0] ) + { + // Scene Activation Set received so send notification + char msg[64]; + if( _data[2] == 0 ) + snprintf( msg, sizeof(msg), "now" ); + else if( _data[2] <= 0x7F ) + snprintf( msg, sizeof(msg), "%d seconds", _data[2] ); + else if( _data[2] <= 0xFE ) + snprintf( msg, sizeof(msg), "%d minutes", _data[2] ); + else + snprintf( msg, sizeof(msg), "via configuration" ); + Log::Write( LogLevel_Info, GetNodeId(), "Received Scene Activation set from node %d: scene id=%d %s. Sending event notification.", GetNodeId(), _data[1], msg ); + Notification* notification = new Notification( Notification::Type_SceneEvent ); + notification->SetHomeAndNodeIds( GetHomeId(), GetNodeId() ); + notification->SetSceneId( _data[1] ); + GetDriver()->QueueNotification( notification ); + return true; + } + + return false; +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SceneActivation.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SceneActivation.h new file mode 100644 index 0000000..f8a63a6 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SceneActivation.h @@ -0,0 +1,64 @@ +//----------------------------------------------------------------------------- +// +// SceneActivation.h +// +// Implementation of the Z-Wave COMMAND_CLASS_SCENE_ACTIVATION +// +// Copyright (c) 2012 Greg Satz +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _SceneActivation_H +#define _SceneActivation_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueByte; + + /** \brief Implements COMMAND_CLASS_SCENEACTIVATION (0x2B), a Z-Wave device command class. + */ + class SceneActivation: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new SceneActivation( _homeId, _nodeId ); } + virtual ~SceneActivation(){} + + /** \brief Get command class ID (1 byte) identifying this command class. */ + static uint8 const StaticGetCommandClassId(){ return 0x2B; } + /** \brief Get a string containing the name of this command class. */ + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_SCENE_ACTIVATION"; } + + // From CommandClass + /** \brief Get command class ID (1 byte) identifying this command class. (Inherited from CommandClass) */ + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + /** \brief Get a string containing the name of this command class. (Inherited from CommandClass) */ + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + /** \brief Handle a response to a message associated with this command class. (Inherited from CommandClass) */ + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + private: + SceneActivation( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Security.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Security.cpp new file mode 100644 index 0000000..f2a8eb2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Security.cpp @@ -0,0 +1,1061 @@ +//----------------------------------------------------------------------------- +// +// Security.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_Security +// +// Copyright (c) 2011 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include + + +#include "CommandClasses.h" +#include "Security.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueBool.h" + + +using namespace OpenZWave; + + +#define UNUSED(x) (void)(x) + + +/* in order to communicate with a Secure Device, we need to send the Network Key to the + * Device with a SecurityCmd_NetworkKeySet packet containing our Network Key. + * Fairly simple right? + * + * BUT + * + * The NetworkKeySet should be done during a inclusion of the device (there is technically a timeout) + * and not at any random time. This means that when including Secure Devices, we must use the OZW AddNode + * Controller Commands, and then once the Inclusion is complete, initiate a NetworkKeySet. Including a + * Secure Device by say using the button on a Z-Stick is technically not possible, as OZW needs to send + * the Network Key right away after negotiating the SecurityScheme (before the timeout). + * + */ + +enum SecurityCmd +{ + SecurityCmd_SupportedGet = 0x02, + SecurityCmd_SupportedReport = 0x03, + SecurityCmd_SchemeGet = 0x04, + SecurityCmd_SchemeReport = 0x05, + SecurityCmd_NetworkKeySet = 0x06, + SecurityCmd_NetworkKeyVerify = 0x07, + SecurityCmd_SchemeInherit = 0x08, + SecurityCmd_NonceGet = 0x40, + SecurityCmd_NonceReport = 0x80, + SecurityCmd_MessageEncap = 0x81, + SecurityCmd_MessageEncapNonceGet = 0xc1 +}; + +enum SecurityScheme +{ + SecurityScheme_Zero = 0x00, +}; + + +uint8_t SecuritySchemes[1][16] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } +}; + +uint8_t EncryptPassword[16] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA}; +uint8_t AuthPassword[16] = {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55}; + +void PrintHex(std::string prefix, uint8_t const *data, uint32 const length) { + char byteStr[16]; + std::string str; + for( uint32 i=0; iRelease(); + delete this->AuthKey; + delete this->EncryptKey; +} + +//----------------------------------------------------------------------------- +// +// Read configuration. +//----------------------------------------------------------------------------- +void Security::ReadXML +( + TiXmlElement const* _ccElement +) +{ + CommandClass::ReadXML( _ccElement ); +} + +//----------------------------------------------------------------------------- +// +// Save changed configuration +//----------------------------------------------------------------------------- +void Security::WriteXML +( + TiXmlElement* _ccElement +) +{ + CommandClass::WriteXML( _ccElement ); +} + + + +void Security::SetupNetworkKey +( +) +{ +//#define TESTENC 1 + +#if TESTENC +// uint8_t iv[16] = { 0x81, 0x42, 0xd1, 0x51, 0xf1, 0x59, 0x3d, 0x70, 0xd5, 0xe3, 0x6c, 0xcb, 0x02, 0xd0, 0x3f, 0x5c, /* */ }; + uint8_t iv[16] = { 0xee, 0x2c, 0x1c, 0x0e, 0xe1, 0x54, 0xe7, 0xfa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa /* */ }; +// uint8_t pck[] = { 0x25, 0x68, 0x06, 0xc5, 0xb3, 0xee, 0x2c, 0x17, 0x26, 0x7e, 0xf0, 0x84, 0xd4, 0xc3, 0xba, 0xed, 0xe5, 0xb9, 0x55}; + uint8_t pck[] = { 0x65, 0xce, 0x5e, 0x75, 0xec, 0xe6, 0x09, 0x9b}; + /* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 */ + uint8_t out[50]; + memset(&out[0], 0, 50); + this->nk = SecuritySchemes[0]; + +#endif +#if 0 + + this->nk = GetDriver->GetNetworkKey(); +#endif + if ((GetNodeUnsafe()->IsAddingNode() == true) && (m_networkkeyset == false)) { + Log::Write(LogLevel_Info, GetNodeId(), " Using Scheme0 Network Key for Key Exchange (AddingNode: %s KeySet: %s)", GetNodeUnsafe()->IsAddingNode() ? "true" : "false", m_networkkeyset ? "true" : "false" ); + this->nk = SecuritySchemes[0]; + } else { + Log::Write(LogLevel_Info, GetNodeId(), " Using Configured Network Key (AddingNode: %s KeySet: %s)", GetNodeUnsafe()->IsAddingNode() ? "true" : "false", m_networkkeyset ? "true" : "false" ); + this->nk = GetDriver()->GetNetworkKey(); + } +#ifdef DEBUG + PrintHex("Network Key", this->nk, 16); +#endif + this->AuthKey = new aes_encrypt_ctx; + this->EncryptKey = new aes_encrypt_ctx; + + if (aes_init1() == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed to Init AES Engine"); + return; + } + + if (aes_encrypt_key128(this->nk, this->EncryptKey) == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed to Set Initial Network Key for Encryption"); + return; + } + + if (aes_encrypt_key128(this->nk, this->AuthKey) == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed to Set Initial Network Key for Authentication"); + return; + } + + uint8 tmpEncKey[32]; + uint8 tmpAuthKey[32]; + aes_mode_reset(this->EncryptKey); + aes_mode_reset(this->AuthKey); + + if (aes_ecb_encrypt(EncryptPassword, tmpEncKey, 16, this->EncryptKey) == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed to Generate Encrypted Network Key for Encryption"); + return; + } + if (aes_ecb_encrypt(AuthPassword, tmpAuthKey, 16, this->AuthKey) == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed to Generate Encrypted Network Key for Authentication"); + return; + } + + + aes_mode_reset(this->EncryptKey); + aes_mode_reset(this->AuthKey); + if (aes_encrypt_key128(tmpEncKey, this->EncryptKey) == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed to set Encrypted Network Key for Encryption"); + return; + } + if (aes_encrypt_key128(tmpAuthKey, this->AuthKey) == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed to set Encrypted Network Key for Authentication"); + return; + } + aes_mode_reset(this->EncryptKey); + aes_mode_reset(this->AuthKey); +#if TESTENC + PrintHex("Key", this->nk, 16); + PrintHex("Packet Encryption Key", tmpEncKey, 16); + PrintHex("IV", iv, 16); + PrintHex("input", pck, 19); + if (aes_ofb_decrypt(pck, out, 19, iv, this->EncryptKey) == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed to Decrypt Packet"); + return; + } + PrintHex("Pck", out, 19); + //exit(-1); + +#endif + //uint8 tmpiv[8] = { 0x16, 0xc2, 0x96, 0x60, 0x46, 0x33, 0x69, 0x04 }; + /* expected output = 0x06, 0xcc, 0xab, 0x1a, 0x86, 0x91, 0x39, 0xfd + * expected Auth = 0x64, 0x42, 0x26, 0x59, 0xf3, 0x04, 0x72, 0x16 + * plaintext packet = 0x62, 0x03, 0x00, 0x10, 0x02, 0xfe, 0xfe + */ + //this->EncryptMessage(tmpiv); + +} +bool Security::Init +( +) +{ + /* if we are adding this node, then instead to a SchemeGet Command instead - This + * will start the Network Key Exchange + */ + if (GetNodeUnsafe()->IsAddingNode()) { + Msg * msg = new Msg ("SecurityCmd_SchemeGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( SecurityCmd_SchemeGet ); + msg->Append( 0 ); + msg->Append( GetDriver()->GetTransmitOptions() ); + /* SchemeGet is unencrypted */ + GetDriver()->SendMsg(msg, Driver::MsgQueue_Security); + } else { + Msg* msg = new Msg( "SecurityCmd_SupportedGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SecurityCmd_SupportedGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + this->SendMsg( msg); + } + + return true; +} +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool Security::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ +#if 0 + if( _requestFlags & RequestFlag_Static ) + { + + } + return false; +#endif + return true; +} + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool Security::RequestValue +( + uint32 const _requestFlags, + uint8 const _index, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + Log::Write(LogLevel_Info, GetNodeId(), "Got a RequestValue Call"); + return true; +} + + +bool Security::HandleSupportedReport +( + uint8 const* _data, + uint32 const _length +) +{ + +#ifdef DEBUG + PrintHex("Security Classes", _data, _length); +#endif + GetNodeUnsafe()->SetSecuredClasses(_data, _length); + /* advance the Query Stage */ + GetNodeUnsafe()->QueryStageComplete(Node::QueryStage_SecurityReport); + GetNodeUnsafe()->AdvanceQueries(); + return true; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Security::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + switch( (SecurityCmd)_data[0] ) + { + case SecurityCmd_SupportedReport: + { + /* this is a list of CommandClasses that should be Encrypted. + * and it might contain new command classes that were not present in the NodeInfoFrame + * so we have to run through, mark existing Command Classes as SetSecured (so SendMsg in the Driver + * class will route the unecrypted messages to our SendMsg) and for New Command + * Classes, create them, and of course, also do a SetSecured on them. + * + * This means we must do a SecurityCmd_SupportedGet request ASAP so we dont have + * Command Classes created after the Discovery Phase is completed! + */ + Log::Write(LogLevel_Info, GetNodeId(), "Received SecurityCmd_SupportedReport from node %d", GetNodeId() ); + HandleSupportedReport(&_data[2], _length-2); + break; + } + case SecurityCmd_SchemeReport: + { + Log::Write(LogLevel_Info, GetNodeId(), "Received SecurityCmd_SchemeReport from node %d: %d", GetNodeId(), _data[1]); + uint8 schemes = _data[1]; + if (m_schemeagreed == true) { + Log::Write(LogLevel_Warning, GetNodeId(), " Already Received a SecurityCmd_SchemeReport from the node. Ignoring"); + break; + } + if( schemes == SecurityScheme_Zero ) + { + /* We're good to go. We now should send our NetworkKey to the device if this is the first + * time we have seen it + */ + Log::Write(LogLevel_Info, GetNodeId(), " Security scheme agreed." ); + /* create the NetworkKey Packet. EncryptMessage will encrypt it for us (And request the NONCE) */ + Msg * msg = new Msg ("SecurityCmd_NetworkKeySet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 18 ); + msg->Append( GetCommandClassId() ); + msg->Append( SecurityCmd_NetworkKeySet ); + for (int i = 0; i < 16; i++) + msg->Append(GetDriver()->GetNetworkKey()[i]); + msg->Append( GetDriver()->GetTransmitOptions() ); + this->SendMsg( msg); + m_schemeagreed = true; + } + else + { + /* No common security scheme. The device should continue as an unsecured node. + * but Some Command Classes might not be present... + */ + Log::Write(LogLevel_Warning, GetNodeId(), " No common security scheme. The device will continue as an unsecured node." ); + } + break; + } + case SecurityCmd_NetworkKeySet: + { + /* we shouldn't get a NetworkKeySet from a node if we are the controller + * as we send it out to the Devices + */ + Log::Write(LogLevel_Info, GetNodeId(), "Received SecurityCmd_NetworkKeySet from node %d", GetNodeId() ); + break; + } + case SecurityCmd_NetworkKeyVerify: + { + /* if we can decrypt this packet, then we are assured that our NetworkKeySet is successfull + * and thus should set the Flag referenced in SecurityCmd_SchemeReport + */ + Log::Write(LogLevel_Info, GetNodeId(), "Received SecurityCmd_NetworkKeyVerify from node %d", GetNodeId() ); + /* now as for our SupportedGet */ + Msg* msg = new Msg( "SecurityCmd_SupportedGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SecurityCmd_SupportedGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + this->SendMsg( msg); + + break; + } + case SecurityCmd_SchemeInherit: + { + /* only used in a Controller Replication Type enviroment. + * + */ + Log::Write(LogLevel_Info, GetNodeId(), "Received SecurityCmd_SchemeInherit from node %d", GetNodeId() ); + break; + } + case SecurityCmd_NonceGet: + { + /* the Device wants to send us a Encrypted Packet, and thus requesting for our latest NONCE + * + */ + Log::Write(LogLevel_Info, GetNodeId(), "Received SecurityCmd_NonceGet from node %d", GetNodeId() ); + SendNonceReport(); + break; + } + case SecurityCmd_NonceReport: + { + /* we recieved a NONCE from a device, so assume that there is something in a queue to send + * out + */ + Log::Write(LogLevel_Info, GetNodeId(), "Received SecurityCmd_NonceReport from node %d", GetNodeId() ); + EncryptMessage( &_data[1] ); + m_waitingForNonce = false; + break; + } + case SecurityCmd_MessageEncap: + { + /* We recieved a Encrypted single packet from the Device. Decrypt it. + * + */ + Log::Write(LogLevel_Info, GetNodeId(), "Received SecurityCmd_MessageEncap from node %d", GetNodeId() ); + DecryptMessage( _data, _length ); + break; + } + case SecurityCmd_MessageEncapNonceGet: + { + /* we recieved a encrypted packet from the device, and the device is also asking us to send a + * new NONCE to it, hence there must be multiple packets. + */ + Log::Write(LogLevel_Info, GetNodeId(), "Received SecurityCmd_MessageEncapNonceGet from node %d", GetNodeId() ); + DecryptMessage( _data, _length ); + /* Regardless of the success/failure of Decrypting, send a new NONCE */ + SendNonceReport(); + break; + } + default: + { + return false; + } + } + + return true; +} + +//----------------------------------------------------------------------------- +// +// Queue a message to be securely sent by the Z-Wave PC Interface +//----------------------------------------------------------------------------- +void Security::SendMsg +( + Msg* _msg +) +{ + _msg->Finalize(); + + uint8* buffer = _msg->GetBuffer(); + if( _msg->GetLength() < 7 ) + { + // Message too short + assert(0); + return; + } + + if( buffer[3] != FUNC_ID_ZW_SEND_DATA ) + { + // Invalid message type + assert(0); + return; + } + + uint8 length = buffer[5]; + if( length > 28 ) + { + // Message must be split into two parts + SecurityPayload *payload1 = new SecurityPayload(); + payload1->m_length = 28; + payload1->m_part = 1; + memcpy( payload1->m_data, &buffer[6], payload1->m_length ); + payload1->logmsg = _msg->GetLogText(); + QueuePayload( payload1 ); + + SecurityPayload *payload2 = new SecurityPayload(); + payload2->m_length = length-28; + payload2->m_part = 2; + memcpy( payload2->m_data, &buffer[34], payload2->m_length ); + payload2->logmsg = _msg->GetLogText(); + QueuePayload( payload2 ); + } + else + { + // The entire message can be encapsulated as one + SecurityPayload *payload = new SecurityPayload(); + payload->m_length = length; + payload->m_part = 0; // Zero means not split into separate messages + memcpy( payload->m_data, &buffer[6], payload->m_length ); + payload->logmsg = _msg->GetLogText(); + QueuePayload( payload ); + } + delete _msg; +} + +//----------------------------------------------------------------------------- +// +// Queue data to be encapsulated by the Security Command Class, on +// receipt of a nonce value from the remote node. +//----------------------------------------------------------------------------- +void Security::QueuePayload +( + SecurityPayload *_payload +) +{ + m_queueMutex->Lock(); + m_queue.push_back( _payload ); + + if( !m_waitingForNonce ) + { + // Request a nonce from the node. Its arrival + // will trigger the sending of the first payload + RequestNonce(); + } + + m_queueMutex->Unlock(); +} + + +//----------------------------------------------------------------------------- +// +// Encrypt and send a Z-Wave message securely. +//----------------------------------------------------------------------------- +bool Security::EncryptMessage +( + uint8 const* _nonce +) +{ +#if 1 + if( m_nonceTimer.GetMilliseconds() > 10000 ) + { + // The nonce was not received within 10 seconds + // of us sending the nonce request. Send it again + RequestNonce(); + return false; + } + + // Fetch the next payload from the queue and encapsulate it + m_queueMutex->Lock(); + if( m_queue.empty() ) + { + // Nothing to do + m_queueMutex->Release(); + return false; + } + + SecurityPayload * payload = m_queue.front(); + m_queue.pop_front(); + //uint32 queueSize = m_queue.size(); + m_queueMutex->Unlock(); +#else + uint32 queueSize = m_queue.size(); + struct SecurityPayload payload; + payload.m_length = 7; + payload.m_part = 0; + uint8 tmpdata[7] = {0x62, 0x03, 0x00, 0x10, 0x02, 0xfe, 0xfe}; + for (int i = 0; i < payload.m_length; i++) + payload.m_data[i] = tmpdata[i]; +#endif + // Encapsulate the message fragment + /* MessageEncapNonceGet doesn't seem to work */ + //Msg* msg = new Msg( (queueSize>1) ? "SecurityCmd_MessageEncapNonceGet" : "SecurityCmd_MessageEncap", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + string LogMessage("SecurityCmd_MessageEncap ("); + LogMessage.append(payload->logmsg); + LogMessage.append(")"); + Msg* msg = new Msg( LogMessage, GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( payload->m_length + 20 ); + msg->Append( GetCommandClassId() ); + //msg->Append( (queueSize>1) ? SecurityCmd_MessageEncapNonceGet : SecurityCmd_MessageEncap ); + msg->Append( SecurityCmd_MessageEncap ); + /* create the iv + * + */ + uint8 initializationVector[16]; + /* the first 8 bytes of a outgoing IV are random */ + for (int i = 0; i < 8; i++) { + //initializationVector[i] = (rand()%0xFF)+1; + initializationVector[i] = 0xAA; + } + /* the remaining 8 bytes are the NONCE we got from the device */ + for (int i = 0; i < 8; i++) { + initializationVector[8+i] = _nonce[i]; + } + + /* Append the first 8 bytes of the initialization vector + * to the message. The remaining 8 bytes are the NONCE we recieved from + * the node, and is ommitted from sending back to the Node. But we use the full 16 bytes to + * as the IV to encrypt out message. + */ + for(int i=0; i<8; ++i ) + { + msg->Append( initializationVector[i] ); + } + + // Append the sequence data + uint8 sequence = 0; + if( payload->m_part == 0 ) + { + sequence = 0; + } + else if( payload->m_part == 1 ) + { + sequence = (++m_sequenceCounter) & 0x0f; + sequence |= 0x10; // Sequenced, first frame + } + if( payload->m_part == 2 ) + { + sequence = m_sequenceCounter & 0x0f; + sequence |= 0x30; // Sequenced, second frame + } + /* at most, the payload will be 28 bytes + 1 byte for the Sequence. */ + uint8 plaintextmsg[32]; + plaintextmsg[0] = sequence; + for (int i = 0; i < payload->m_length; i++) + plaintextmsg[i+1] = payload->m_data[i]; + + /* Append the message payload after encrypting it with AES-OFB (key is EncryptPassword, + * full IV (16 bytes - 8 Random and 8 NONCE) and payload.m_data + */ + PrintHex("Input Packet:", plaintextmsg, payload->m_length+1); +#ifdef DEBUG + PrintHex("IV:", initializationVector, 16); +#endif + uint8 encryptedpayload[30]; + aes_mode_reset(this->EncryptKey); + if (aes_ofb_encrypt(plaintextmsg, encryptedpayload, payload->m_length+1, initializationVector, this->EncryptKey) == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed to Encrypt Packet"); + delete msg; + return false; + } +#ifdef DEBUG + PrintHex("Encrypted Output", encryptedpayload, payload->m_length+1); + + /* The Following Code attempts to Decrypt the Packet and Verify */ + + /* the first 8 bytes of a outgoing IV are random */ + for (int i = 0; i < 8; i++) { + //initializationVector[i] = (rand()%0xFF)+1; + initializationVector[i] = 0xAA; + } + /* the remaining 8 bytes are the NONCE we got from the device */ + for (int i = 0; i < 8; i++) { + initializationVector[8+i] = _nonce[i]; + } + aes_mode_reset(this->EncryptKey); + uint8 tmpoutput[16]; + if (aes_ofb_encrypt(encryptedpayload, tmpoutput, payload->m_length+1, initializationVector, this->EncryptKey) == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed to Encrypt Packet"); + delete msg; + return false; + } + + PrintHex("Decrypted output", tmpoutput, payload->m_length+1); +#endif + for(int i=0; im_length+1; ++i ) + { + msg->Append( encryptedpayload[i] ); + } + + // Append the nonce identifier :) + msg->Append(_nonce[0]); + + /* Append space for the authentication data Set with AES-CBCMAC (key is AuthPassword, + * Full IV (16 bytes - 8 random and 8 NONCE) and sequence|SrcNode|DstNode|payload.m_length|payload.m_data + * + */ + /* Regenerate IV */ + /* the first 8 bytes of a outgoing IV are random */ + for (int i = 0; i < 8; i++) { + //initializationVector[i] = (rand()%0xFF)+1; + initializationVector[i] = 0xAA; + } + /* the remaining 8 bytes are the NONCE we got from the device */ + for (int i = 0; i < 8; i++) { + initializationVector[8+i] = _nonce[i]; + } + uint8 mac[8]; + this->GenerateAuthentication(&msg->GetBuffer()[7], msg->GetLength()+2, GetDriver()->GetNodeId(), GetNodeId(), initializationVector, mac); + for(int i=0; i<8; ++i ) + { + msg->Append( mac[i] ); + } +#ifdef DEBUG + PrintHex("Auth", mac, 8); +#endif + msg->Append( GetDriver()->GetTransmitOptions() ); +#ifdef DEBUG + PrintHex("Outgoing", msg->GetBuffer(), msg->GetLength()); +#endif + GetDriver()->SendMsg(msg, Driver::MsgQueue_Security); + + /* finally, if the message we just sent is a NetworkKeySet, then we need to reset our Network Key here + * as the reply we will get back will be encrypted with the new Network key + */ + if ((this->m_networkkeyset == false) && (payload->m_data[0] == 0x98) && (payload->m_data[1] == 0x06)) { + Log::Write(LogLevel_Info, GetNodeId(), "Reseting Network Key after Inclusion"); + this->m_networkkeyset = true; + SetupNetworkKey(); + } + + delete payload; + return true; +} + +bool Security::createIVFromPacket_inbound(uint8 const* _data, uint8 *iv) { + + for (int i = 0; i < 8; i++) { + iv[i] = _data[1+i]; + } + for (int i = 0; i < 8; i++) { + iv[8+i] = this->currentNonce[i]; + } + return true; +} +bool Security::createIVFromPacket_outbound(uint8 const* _data, uint8 *iv) { + + + for (int i = 0; i < 8; i++) { + iv[i] = this->currentNonce[i]; + } + for (int i = 0; i < 8; i++) { + iv[8+i] = _data[1+i]; + } + return true; +} + + + +//----------------------------------------------------------------------------- +// +// Decrypt a security-encapsulated message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Security::DecryptMessage +( + uint8 const* _data, + uint32 const _length +) +{ + if( m_nonceTimer.GetMilliseconds() > 10000 ) + { + // The message was not received within 10 seconds + // of us sending the nonce report. + + // TBD - clear any partial message that has been stored. + + return false; + } + + uint8 iv[17]; + createIVFromPacket_inbound(_data, iv); /* first 8 bytes of Packet are the Random Value generated by the Device + * 2nd 8 bytes of the IV are our nonce we sent previously + */ + uint8 decryptpacket[32]; + memset(&decryptpacket[0], 0, 32); + uint32 encryptedpacketsize = _length-11-8; + uint8 encyptedpacket[32]; + + for (uint32 i = 0; i < 32; i++) { + if (i >= encryptedpacketsize) { + /* pad the remaining fields */ + encyptedpacket[i] = 0; + } else { + encyptedpacket[i] = _data[9+i]; + } + } +#ifdef DEBUG + Log::Write(LogLevel_Debug, GetNodeId(), "Encrypted Packet Sizes: %d (Total) %d (Payload)", _length, encryptedpacketsize); + PrintHex("IV", iv, 16); + PrintHex("Encrypted", encyptedpacket, 16); + /* 8 - IV - 2 - Command Header */ + PrintHex("Auth", &_data[8+encryptedpacketsize+2], 8); +#endif + aes_mode_reset(this->EncryptKey); +#if 0 + uint8_t iv[16] = { 0x81, 0x42, 0xd1, 0x51, 0xf1, 0x59, 0x3d, 0x70, 0xd5, 0xe3, 0x6c, 0xcb, 0x02, 0xd0, 0x3f, 0x5c, /* */ }; + uint8_t pck[] = { 0x25, 0x68, 0x06, 0xc5, 0xb3, 0xee, 0x2c, 0x17, 0x26, 0x7e, 0xf0, 0x84, 0xd4, 0xc3, 0xba, 0xed, 0xe5, 0xb9, 0x55}; + if (aes_ofb_decrypt(pck, decryptpacket, 19, iv, this->EncryptKey) == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed to Decrypt Packet"); + return false; + } + PrintHex("Pck", decryptpacket, 19); +#else + if (aes_ofb_decrypt(encyptedpacket, decryptpacket, encryptedpacketsize, iv, this->EncryptKey) == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed to Decrypt Packet"); + if (m_queue.size() > 1) + RequestNonce(); + return false; + } + PrintHex("Decrypted", decryptpacket, encryptedpacketsize); +#endif + uint8 mac[32]; + /* we have to regenerate the IV as the ofb decryption routine will alter it. */ + createIVFromPacket_inbound(_data, iv); + + this->GenerateAuthentication(_data, _length, GetNodeId(), GetDriver()->GetNodeId(), iv, mac); + if (memcmp(&_data[8+encryptedpacketsize+2], mac, 8) != 0) { + Log::Write(LogLevel_Warning, GetNodeId(), "MAC Authentication of Packet Failed. Dropping"); + if (m_queue.size() > 1) + RequestNonce(); + return false; + } + /* XXX TODO: Check the Sequence Header Frame to see if this is the first part of a + * message, or 2nd part, or a entire message. + * + * I havn't actually seen a Z-Wave Message thats too big to fit in a encrypted message + * yet, so we will look at this if such a message actually exists! + */ + + /* if the command class is us, send it back to our HandleMessage */ + if (decryptpacket[1] == this->StaticGetCommandClassId()) { + /* drop the sequence header, and the command class when we pass through to our handler */ + this->HandleMsg(&decryptpacket[2], encryptedpacketsize-2); + } else { + /* send to the Command Class for processing.... */ + if( Node* node = GetNodeUnsafe() ) + { + uint8 commandClassId = decryptpacket[1]; + + if( CommandClass* pCommandClass = node->GetCommandClass( commandClassId ) ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received a SecurityCmd_MessageEncap from node %d for Command Class %s", GetNodeId(), pCommandClass->GetCommandClassName().c_str() ); + pCommandClass->ReceivedCntIncr(); + pCommandClass->HandleMsg( &decryptpacket[2], encryptedpacketsize-2); + } else { + Log::Write( LogLevel_Info, GetNodeId(), "ApplicationCommandHandler - Unhandled Command Class 0x%.2x", decryptpacket[1] ); + } + } + } + if (m_queue.size() > 0) + RequestNonce(); + if (m_secured == false) { + if( ValueBool* value = static_cast( GetValue( 1, 0 ) ) ) + { + value->OnValueRefreshed( true ); + value->Release(); + } + m_secured = true; + } + return true; + +} + +//----------------------------------------------------------------------------- +// +// Generate authentication data from a security-encrypted message +//----------------------------------------------------------------------------- +bool Security::GenerateAuthentication +( + uint8 const* _data, // Starting from the command class command + uint32 const _length, + uint8 const _sendingNode, + uint8 const _receivingNode, + uint8 *iv, + uint8* _authentication // 8-byte buffer that will be filled with the authentication data +) +{ + // Build a buffer containing a 4-byte header and the encrypted + // message data, padded with zeros to a 16-byte boundary. + uint8 buffer[256]; + uint8 tmpauth[16]; + memset(buffer, 0, 256); + memset(tmpauth, 0, 16); + buffer[0] = _data[0]; // Security command class command + buffer[1] = _sendingNode; + buffer[2] = _receivingNode; + buffer[3] = _length - 19; // Subtract 19 to account for the 9 security command class bytes that come before and after the encrypted data + memcpy( &buffer[4], &_data[9], _length-19 ); // Encrypted message + + uint8 bufsize = _length - 19 + 4; /* the size of buffer */ +#ifdef DEBUG + PrintHex("Raw Auth (minus IV)", buffer, bufsize); + Log::Write(LogLevel_Debug, GetNodeId(), "Raw Auth (Minus IV) Size: %d (%d)", bufsize, bufsize+16); +#endif + + aes_mode_reset(this->AuthKey); + /* encrypt the IV with ecb */ + if (aes_ecb_encrypt(iv, tmpauth, 16, this->AuthKey) == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed Initial ECB Encrypt of Auth Packet"); + return false; + } + + /* our temporary holding var */ + uint8 encpck[16]; + + int block = 0; + /* reset our encpck temp var */ + memset(encpck, 0, 16); + /* now xor the buffer with our encrypted IV */ + for (int i = 0; i < bufsize; i++) { + encpck[block] = buffer[i]; + block++; + /* if we hit a blocksize, then encrypt */ + if (block == 16) { + for (int j = 0; j < 16; j++) { + /* here we do our xor */ + tmpauth[j] = encpck[j] ^ tmpauth[j]; + /* and reset encpck for good measure */ + encpck[j] = 0; + } + /* reset our block counter back to 0 */ + block = 0; + aes_mode_reset(this->AuthKey); + if (aes_ecb_encrypt(tmpauth, tmpauth, 16, this->AuthKey) == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed Subsequent (%d) ECB Encrypt of Auth Packet", i); + return false; + } + } + } + /* any left over data that isn't a full block size*/ + if (block > 0) { + for (int i= 0; i < 16; i++) { + /* encpck from block to 16 is already gauranteed to be 0 + * so its safe to xor it with out tmpmac */ + tmpauth[i] = encpck[i] ^ tmpauth[i]; + } + aes_mode_reset(this->AuthKey); + if (aes_ecb_encrypt(tmpauth, tmpauth, 16, this->AuthKey) == EXIT_FAILURE) { + Log::Write(LogLevel_Warning, GetNodeId(), "Failed Final ECB Encrypt of Auth Packet"); + return false; + } + } + /* we only care about the first 8 bytes of tmpauth as the mac */ +#ifdef DEBUG + PrintHex("Computed Auth", tmpauth, 8); +#endif + /* so only copy 8 bytes to the _authentication var */ + memcpy(_authentication, tmpauth, 8); + return true; +} + +//----------------------------------------------------------------------------- +// +// Request a nonce from the node +//----------------------------------------------------------------------------- +void Security::RequestNonce +( +) +{ + if (m_waitingForNonce == true) + return; + m_waitingForNonce = true; + + Msg* msg = new Msg( "SecurityCmd_NonceGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SecurityCmd_NonceGet ); + msg->Append( TRANSMIT_OPTION_ACK | TRANSMIT_OPTION_AUTO_ROUTE ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Security); + + // Reset the nonce timer. The nonce report + // must be received within 10 seconds. + m_nonceTimer.Reset(); +} + +//----------------------------------------------------------------------------- +// +// Send a nonce to the node +//----------------------------------------------------------------------------- +void Security::SendNonceReport +( +) +{ + //uint8 publicNonce[8]; + + /* this should be pretty random */ + for (int i = 0; i < 8; i++) { + //this->currentNonce[i] = (rand()%0xFF)+1; + this->currentNonce[i] = 0xAA; + } + + + Msg* msg = new Msg( "SecurityCmd_NonceReport", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 10 ); + msg->Append( GetCommandClassId() ); + msg->Append( SecurityCmd_NonceReport ); + for( int i=0; i<8; ++i ) + { + msg->Append( this->currentNonce[i] ); + } + msg->Append( TRANSMIT_OPTION_ACK | TRANSMIT_OPTION_AUTO_ROUTE ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Security); + + // Reset the nonce timer. The encapsulated message + // must be received within 10 seconds. + m_nonceTimer.Reset(); +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void Security::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueBool( ValueID::ValueGenre_System, GetCommandClassId(), _instance, 0, "Secured", "", true, false, false, 0 ); + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Security.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Security.h new file mode 100644 index 0000000..2916403 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Security.h @@ -0,0 +1,124 @@ +//----------------------------------------------------------------------------- +// +// Security.h +// +// Implementation of the Z-Wave COMMAND_CLASS_Security +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Security_H +#define _Security_H + +#include +#include "../aes/aescpp.h" +#include "CommandClass.h" + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_SECURITY (0x98), a Z-Wave device command class. + */ + + typedef struct SecurityPayload { + uint8 m_length; + uint8 m_part; + uint8 m_data[32]; + string logmsg; + } SecurityPayload; + + /* This should probably go into its own file, but its so simple... and only the Security Command Class uses it currently + */ + + class Timer { + public: + Timer() { + this->Reset(); + }; + virtual ~Timer() {}; + void Reset() { + start = clock(); + } + inline uint64 GetMilliseconds() { + return (uint64 )(((clock() - start) / (double)CLOCKS_PER_SEC) / 1000); + } + private: + clock_t start; + }; + + class Security: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Security( _homeId, _nodeId ); } + virtual ~Security(); + + static uint8 const StaticGetCommandClassId(){ return 0x98; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_SECURITY"; } + bool Init(); + // From CommandClass + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + void ReadXML(TiXmlElement const* _ccElement); + void WriteXML(TiXmlElement* _ccElement); + void SendMsg( Msg* _msg ); + + protected: + void CreateVars( uint8 const _instance ); + + private: + Security( uint32 const _homeId, uint8 const _nodeId ); + bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue); + bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue); + bool HandleSupportedReport(uint8 const* _data, uint32 const _length); + void SendNonceReport(); + void RequestNonce(); + bool GenerateAuthentication( uint8 const* _data, uint32 const _length, uint8 const _sendingNode, uint8 const _receivingNode, uint8 *iv, uint8* _authentication); + bool DecryptMessage( uint8 const* _data, uint32 const _length ); + bool EncryptMessage( uint8 const* _nonce ); + void QueuePayload( SecurityPayload * _payload ); + bool createIVFromPacket_inbound(uint8 const* _data, uint8 *iv); + bool createIVFromPacket_outbound(uint8 const* _data, uint8 *iv); + void SetupNetworkKey(); + + Mutex *m_queueMutex; + list m_queue; // Messages waiting to be sent when the device wakes up + bool m_waitingForNonce; + uint8 m_sequenceCounter; + Timer m_nonceTimer; + uint8 currentNonce[8]; + bool m_networkkeyset; + + aes_encrypt_ctx *AuthKey; + aes_encrypt_ctx *EncryptKey; + uint8 *nk; + bool m_schemeagreed; + bool m_secured; + + + + + + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorAlarm.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorAlarm.cpp new file mode 100644 index 0000000..f1ce58f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorAlarm.cpp @@ -0,0 +1,215 @@ +//----------------------------------------------------------------------------- +// +// SensorAlarm.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_SENSOR_ALARM +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "SensorAlarm.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueByte.h" + +using namespace OpenZWave; + +enum SensorAlarmCmd +{ + SensorAlarmCmd_Get = 0x01, + SensorAlarmCmd_Report = 0x02, + SensorAlarmCmd_SupportedGet = 0x03, + SensorAlarmCmd_SupportedReport = 0x04 +}; + +static char const* c_alarmTypeName[] = +{ + "General", + "Smoke", + "Carbon Monoxide", + "Carbon Dioxide", + "Heat", + "Flood" +}; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +SensorAlarm::SensorAlarm +( + uint32 const _homeId, + uint8 const _nodeId +): + CommandClass( _homeId, _nodeId ) +{ + SetStaticRequest( StaticRequest_Values ); +} + +//----------------------------------------------------------------------------- +// +// Get the static thermostat setpoint details from the device +//----------------------------------------------------------------------------- +bool SensorAlarm::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + bool requests = false; + if( ( _requestFlags & RequestFlag_Static ) && HasStaticRequest( StaticRequest_Values ) ) + { + requests = RequestValue( _requestFlags, 0xff, _instance, _queue ); + } + + if( _requestFlags & RequestFlag_Dynamic ) + { + for( uint8 i=0; iRelease(); + // There is a value for this alarm type, so request it + requests |= RequestValue( _requestFlags, i, _instance, _queue ); + } + } + } + + return requests; +} + +//----------------------------------------------------------------------------- +// +// Get the sensor alarm details from the device +//----------------------------------------------------------------------------- +bool SensorAlarm::RequestValue +( + uint32 const _requestFlags, + uint8 const _alarmType, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _alarmType == 0xff ) + { + // Request the supported alarm types + Msg* msg = new Msg( "SensorAlarmCmd_SupportedGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SensorAlarmCmd_SupportedGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } + else + { + // Request the alarm state + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "SensorAlarmCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( SensorAlarmCmd_Get ); + msg->Append( _alarmType ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "SensorAlarmCmd_Get Not Supported on this node"); + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool SensorAlarm::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( SensorAlarmCmd_Report == (SensorAlarmCmd)_data[0] ) + { + // We have received an alarm state report from the Z-Wave device + if( ValueByte* value = static_cast( GetValue( _instance, _data[2] ) ) ) + { + uint8 sourceNodeId = _data[1]; + uint8 state = _data[3]; + // uint16 time = (((uint16)_data[4])<<8) | (uint16)_data[5]; Don't know what to do with this yet. + + value->OnValueRefreshed( state ); + value->Release(); + Log::Write( LogLevel_Info, GetNodeId(), "Received alarm state report from node %d: %s = %d", sourceNodeId, value->GetLabel().c_str(), state ); + } + + return true; + } + + if( SensorAlarmCmd_SupportedReport == (SensorAlarmCmd)_data[0] ) + { + if( Node* node = GetNodeUnsafe() ) + { + // We have received the supported alarm types from the Z-Wave device + Log::Write( LogLevel_Info, GetNodeId(), "Received supported alarm types" ); + + // Parse the data for the supported alarm types + uint8 numBytes = _data[1]; + for( uint32 i=0; iCreateValueByte( ValueID::ValueGenre_User, GetCommandClassId(), _instance, index, c_alarmTypeName[index], "", true, false, 0, 0 ); + Log::Write( LogLevel_Info, GetNodeId(), " Added alarm type: %s", c_alarmTypeName[index] ); + } + } + } + } + } + + ClearStaticRequest( StaticRequest_Values ); + return true; + } + + return false; +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorAlarm.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorAlarm.h new file mode 100644 index 0000000..8db5444 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorAlarm.h @@ -0,0 +1,77 @@ +//----------------------------------------------------------------------------- +// +// SensorAlarm.h +// +// Implementation of the Z-Wave COMMAND_CLASS_SENSOR_ALARM +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _SensorAlarm_H +#define _SensorAlarm_H + +#include +#include +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueByte; + + /** \brief Implements COMMAND_CLASS_SENSOR_ALARM (0x9c), a Z-Wave device command class. + */ + class SensorAlarm: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new SensorAlarm( _homeId, _nodeId ); } + virtual ~SensorAlarm(){} + + static uint8 const StaticGetCommandClassId(){ return 0x9c; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_SENSOR_ALARM"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _alarmType, uint8 const _dummy, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + private: + SensorAlarm( uint32 const _homeId, uint8 const _nodeId ); + + enum + { + SensorAlarm_General = 0, + SensorAlarm_Smoke, + SensorAlarm_CarbonMonoxide, + SensorAlarm_CarbonDioxide, + SensorAlarm_Heat, + SensorAlarm_Flood, + SensorAlarm_Count + }; + }; + +} // namespace OpenZWave + +#endif + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorBinary.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorBinary.cpp new file mode 100644 index 0000000..647b009 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorBinary.cpp @@ -0,0 +1,243 @@ +//----------------------------------------------------------------------------- +// +// SensorBinary.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_SENSOR_BINARY +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "SensorBinary.h" +#include "WakeUp.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" +#include "../value_classes/ValueBool.h" +#include "../tinyxml.h" + +using namespace OpenZWave; + +enum SensorBinaryCmd +{ + SensorBinaryCmd_Get = 0x02, + SensorBinaryCmd_Report = 0x03 +}; + +//----------------------------------------------------------------------------- +// +// Read node configuration data +//----------------------------------------------------------------------------- +void SensorBinary::ReadXML +( + TiXmlElement const* _ccElement +) +{ + CommandClass::ReadXML( _ccElement ); + + TiXmlElement const* child = _ccElement->FirstChildElement(); + + char const* str; int index; int type; + + while( child ) + { + str = child->Value(); + + if( str ) + { + if( !strcmp( str, "SensorMap" ) ) + { + if( TIXML_SUCCESS == child->QueryIntAttribute( "index", &index ) && + TIXML_SUCCESS == child->QueryIntAttribute( "type", &type ) ) + { + m_sensorsMap[(uint8)type] = (uint8)index; + } + } + } + + child = child->NextSiblingElement(); + } +} +//----------------------------------------------------------------------------- +// +// Write node configuration data +//----------------------------------------------------------------------------- +void SensorBinary::WriteXML +( + TiXmlElement* _ccElement +) +{ + CommandClass::WriteXML( _ccElement ); + + char str[8]; + + for( map::iterator it = m_sensorsMap.begin(); it != m_sensorsMap.end(); it++ ) + { + TiXmlElement* sensorMapElement = new TiXmlElement( "SensorMap" ); + _ccElement->LinkEndChild( sensorMapElement ); + + snprintf( str, 8, "%d", it->second ); + sensorMapElement->SetAttribute( "index", str ); + + snprintf( str, 8, "%d", it->first ); + sensorMapElement->SetAttribute( "type", str ); + } +} +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool SensorBinary::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Dynamic ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool SensorBinary::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "SensorBinaryCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SensorBinaryCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "SensorBinaryCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool SensorBinary::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if (SensorBinaryCmd_Report == (SensorBinaryCmd)_data[0]) + { + if( _length > 2 ) + { + uint8 index = m_sensorsMap[_data[2]]; + + Log::Write( LogLevel_Info, GetNodeId(), "Received SensorBinary report: Sensor:%d State=%s", _data[2], _data[1] ? "On" : "Off" ); + + if( ValueBool* value = static_cast( GetValue( _instance, index ) ) ) + { + value->OnValueRefreshed( _data[1] != 0 ); + value->Release(); + } + + return true; + } + else + { + Log::Write( LogLevel_Info, GetNodeId(), "Received SensorBinary report: State=%s", _data[1] ? "On" : "Off" ); + + if( ValueBool* value = static_cast( GetValue( _instance, 0 ) ) ) + { + value->OnValueRefreshed( _data[1] != 0 ); + value->Release(); + } + + return true; + } + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Update class values based in BASIC mapping +//----------------------------------------------------------------------------- +void SensorBinary::SetValueBasic +( + uint8 const _instance, + uint8 const _value +) +{ + // Send a request for new value to synchronize it with the BASIC set/report. + // In case the device is sleeping, we set the value anyway so the BASIC set/report + // stays in sync with it. We must be careful mapping the uint8 BASIC value + // into a class specific value. + // When the device wakes up, the real requested value will be retrieved. + RequestValue( 0, 0, _instance, Driver::MsgQueue_Send ); + if( Node* node = GetNodeUnsafe() ) + { + if( WakeUp* wakeUp = static_cast( node->GetCommandClass( WakeUp::StaticGetCommandClassId() ) ) ) + { + if( !wakeUp->IsAwake() ) + { + if( ValueBool* value = static_cast( GetValue( _instance, 0 ) ) ) + { + value->OnValueRefreshed( _value != 0 ); + value->Release(); + } + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void SensorBinary::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueBool( ValueID::ValueGenre_User, GetCommandClassId(), _instance, 0, "Sensor", "", true, false, false, 0 ); + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorBinary.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorBinary.h new file mode 100644 index 0000000..5ef7e4d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorBinary.h @@ -0,0 +1,69 @@ +//----------------------------------------------------------------------------- +// +// SensorBinary.h +// +// Implementation of the Z-Wave COMMAND_CLASS_SENSOR_BINARY +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _SensorBinary_H +#define _SensorBinary_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueBool; + + /** \brief Implements COMMAND_CLASS_SENSOR_BINARY (0x30), a Z-Wave device command class. + */ + class SensorBinary: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new SensorBinary( _homeId, _nodeId ); } + virtual ~SensorBinary(){} + + static uint8 const StaticGetCommandClassId(){ return 0x30; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_SENSOR_BINARY"; } + + // From CommandClass + virtual void ReadXML( TiXmlElement const* _ccElement ); + virtual void WriteXML( TiXmlElement* _ccElement ); + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual void SetValueBasic( uint8 const _instance, uint8 const _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + SensorBinary( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + map m_sensorsMap; + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorMultilevel.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorMultilevel.cpp new file mode 100644 index 0000000..4941484 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorMultilevel.cpp @@ -0,0 +1,460 @@ +//----------------------------------------------------------------------------- +// +// SensorMultilevel.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_SENSOR_MULTILEVEL +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "SensorMultilevel.h" +#include "MultiInstance.h" +#include "../Defs.h" +#include "../Bitfield.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueDecimal.h" + +using namespace OpenZWave; + +enum SensorMultilevelCmd +{ + SensorMultilevelCmd_SupportedGet = 0x01, + SensorMultilevelCmd_SupportedReport = 0x02, + SensorMultilevelCmd_Get = 0x04, + SensorMultilevelCmd_Report = 0x05 +}; + +enum SensorType +{ + SensorType_Temperature = 1, + SensorType_General, + SensorType_Luminance, + SensorType_Power, + SensorType_RelativeHumidity, + SensorType_Velocity, + SensorType_Direction, + SensorType_AtmosphericPressure, + SensorType_BarometricPressure, + SensorType_SolarRadiation, + SensorType_DewPoint, + SensorType_RainRate, + SensorType_TideLevel, + SensorType_Weight, + SensorType_Voltage, + SensorType_Current, + SensorType_CO2, + SensorType_AirFlow, + SensorType_TankCapacity, + SensorType_Distance, + SensorType_AnglePosition, + SensorType_Rotation, + SensorType_WaterTemperature, + SensorType_SoilTemperature, + SensorType_SeismicIntensity, + SensorType_SeismicMagnitude, + SensorType_Ultraviolet, + SensorType_ElectricalResistivity, + SensorType_ElectricalConductivity, + SensorType_Loudness, + SensorType_Moisture, + SensorType_MaxType +}; + +static char const* c_sensorTypeNames[] = +{ + "Undefined", + "Temperature", + "General", + "Luminance", + "Power", + "Relative Humidity", + "Velocity", + "Direction", + "Atmospheric Pressure", + "Barometric Pressure", + "Solar Radiation", + "Dew Point", + "Rain Rate", + "Tide Level", + "Weight", + "Voltage", + "Current", + "CO2 Level", + "Air Flow", + "Tank Capacity", + "Distance", + "Angle Position", + "Rotation", + "Water Temperature", + "Soil Temperature", + "Seismic Intensity", + "Seismic Magnitude", + "Utraviolet", + "Electrical Resistivity", + "Electrical Conductivity", + "Loudness", + "Moisture" +}; + +static char const* c_tankCapcityUnits[] = +{ + "l", + "cbm", + "gal", + "" +}; + +static char const* c_distanceUnits[] = +{ + "m", + "cm", + "ft", + "" +}; + +static char const* c_anglePositionUnits[] = +{ + "%", + "deg N", + "deg S", + "" +}; + +static char const* c_seismicIntensityUnits[] = +{ + "mercalli", + "EU macroseismic", + "liedu", + "shindo", + "" +}; + +static char const* c_seismicMagnitudeUnits[] = +{ + "local", + "moment", + "surface wave", + "body wave", + "" +}; + +static char const* c_moistureUnits[] = +{ + "%", + "content", + "k ohms", + "water activity", + "" +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool SensorMultilevel::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + bool res = false; + if( GetVersion() > 4 ) + { + if( _requestFlags & RequestFlag_Static ) + { + Msg* msg = new Msg( "SensorMultilevelCmd_SupportedGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SensorMultilevelCmd_SupportedGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + res = true; + } + } + + if( _requestFlags & RequestFlag_Dynamic ) + { + res |= RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool SensorMultilevel::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + bool res = false; + if ( !IsGetSupported() ) { + Log::Write( LogLevel_Info, GetNodeId(), "SensorMultilevelCmd_Get Not Supported on this node"); + return false; + } + if( GetVersion() < 5 ) + { + Msg* msg = new Msg( "SensorMultilevelCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SensorMultilevelCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + res = true; + } + else + { + for( uint8 i = 1; i < SensorType_MaxType; i++ ) + { + Value* value = GetValue( _instance, i ); + if( value != NULL ) + { + value->Release(); + Msg* msg = new Msg( "SensorMultilevelCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( SensorMultilevelCmd_Get ); + msg->Append( i ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + res = true; + } + } + } + return res; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool SensorMultilevel::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if (SensorMultilevelCmd_SupportedReport == (SensorMultilevelCmd)_data[0]) + { + string msg = ""; + + if( Node* node = GetNodeUnsafe() ) + { + for( uint8 i = 1; i <= ( _length - 2 ); i++ ) + { + for( uint8 j = 0; j < 8; j++ ) + { + if( _data[i] & ( 1 << j ) ) + { + if( msg != "" ) + msg += ", "; + uint8 index = ( ( i - 1 ) * 8 ) + j + 1; + if (index >= SensorType_MaxType) /* max size for c_sensorTypeNames */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "SensorType Value was greater than range. Dropping"); + continue; + } + msg += c_sensorTypeNames[index]; + ValueDecimal* value = static_cast( GetValue( _instance, index ) ); + if( value == NULL) + { + node->CreateValueDecimal( ValueID::ValueGenre_User, GetCommandClassId(), _instance, index, c_sensorTypeNames[index], "", true, false, "0.0", 0 ); + } + } + } + } + } + Log::Write( LogLevel_Info, GetNodeId(), "Received SensorMultiLevel supported report from node %d: %s", GetNodeId(), msg.c_str() ); + } + else if (SensorMultilevelCmd_Report == (SensorMultilevelCmd)_data[0]) + { + uint8 scale; + uint8 precision = 0; + uint8 sensorType = _data[1]; + string valueStr = ExtractValue( &_data[2], &scale, &precision ); + + Node* node = GetNodeUnsafe(); + if( node != NULL ) + { + char const* units = ""; + switch( sensorType ) + { + case SensorType_Temperature: units = scale ? "F" : "C"; break; + case SensorType_General: units = scale ? "" : "%"; break; + case SensorType_Luminance: units = scale ? "lux" : "%"; break; + case SensorType_Power: units = scale ? "BTU/h" : "W"; break; + case SensorType_RelativeHumidity: units = scale ? "" : "%"; break; + case SensorType_Velocity: units = scale ? "mph" : "m/s"; break; + case SensorType_Direction: units = ""; break; + case SensorType_AtmosphericPressure: units = scale ? "inHg" : "kPa"; break; + case SensorType_BarometricPressure: units = scale ? "inHg" : "kPa"; break; + case SensorType_SolarRadiation: units = "W/m2"; break; + case SensorType_DewPoint: units = scale ? "F" : "C"; break; + case SensorType_RainRate: units = scale ? "in/h" : "mm/h"; break; + case SensorType_TideLevel: units = scale ? "ft" : "m"; break; + case SensorType_Weight: units = scale ? "lb" : "kg"; break; + case SensorType_Voltage: units = scale ? "mV" : "V"; break; + case SensorType_Current: units = scale ? "mA" : "A"; break; + case SensorType_CO2: units = "ppm"; break; + case SensorType_AirFlow: units = scale ? "cfm" : "m3/h"; break; + case SensorType_TankCapacity: { + if (scale > 2) /* size of c_tankCapcityUnits minus invalid */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "Scale Value for c_tankCapcityUnits was greater than range. Setting to empty"); + units = c_tankCapcityUnits[3]; /* empty entry */ + } + else + { + units = c_tankCapcityUnits[scale]; + } + } + break; + case SensorType_Distance: { + if (scale > 2) /* size of c_distanceUnits minus invalid */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "Scale Value for c_distanceUnits was greater than range. Setting to empty"); + units = c_distanceUnits[3]; /* empty entry */ + } + else + { + units = c_distanceUnits[scale]; + } + } + break; + case SensorType_AnglePosition: { + if (scale > 2) /* size of c_anglePositionUnits minus invalid */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "Scale Value for c_anglePositionUnits was greater than range. Setting to empty"); + units = c_anglePositionUnits[3]; /* empty entry */ + } + else + { + units = c_anglePositionUnits[scale]; + } + } + break; + case SensorType_Rotation: units = scale ? "hz" : "rpm"; break; + case SensorType_WaterTemperature: units = scale ? "F" : "C"; break; + case SensorType_SoilTemperature: units = scale ? "F" : "C"; break; + case SensorType_SeismicIntensity: { + if (scale > 3) /* size of c_seismicIntensityUnits minus invalid */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "Scale Value for c_seismicIntensityUnits was greater than range. Setting to empty"); + units = c_seismicIntensityUnits[4]; /* empty entry */ + } + else + { + units = c_seismicIntensityUnits[scale]; + } + } + break; + case SensorType_SeismicMagnitude: { + if (scale > 3) /* size of c_seismicMagnitudeUnits minus invalid */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "Scale Value for c_seismicMagnitudeUnits was greater than range. Setting to empty"); + units = c_seismicMagnitudeUnits[4]; /* empty entry */ + } + else + { + units = c_seismicMagnitudeUnits[scale]; + } + } + break; + case SensorType_Ultraviolet: units = ""; break; + case SensorType_ElectricalResistivity: units = "ohm"; break; + case SensorType_ElectricalConductivity: units = "siemens/m"; break; + case SensorType_Loudness: units = scale ? "dBA" : "db"; break; + case SensorType_Moisture: { + if (scale > 3) /* size of c_moistureUnits minus invalid */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "Scale Value for c_moistureUnits was greater than range. Setting to empty"); + units = c_moistureUnits[4]; /* empty entry */ + } + else + { + units = c_moistureUnits[scale]; + } + } + break; + default: { + Log::Write (LogLevel_Warning, GetNodeId(), "sensorType Value was greater than range. Dropping"); + return false; + } + break; + + } + + ValueDecimal* value = static_cast( GetValue( _instance, sensorType ) ); + if( value == NULL) + { + node->CreateValueDecimal( ValueID::ValueGenre_User, GetCommandClassId(), _instance, sensorType, c_sensorTypeNames[sensorType], units, true, false, "0.0", 0 ); + value = static_cast( GetValue( _instance, sensorType ) ); + } + else + { + value->SetUnits(units); + } + + Log::Write( LogLevel_Info, GetNodeId(), "Received SensorMultiLevel report from node %d, instance %d, %s: value=%s%s", GetNodeId(), _instance, c_sensorTypeNames[sensorType], valueStr.c_str(), value->GetUnits().c_str() ); + if( value->GetPrecision() != precision ) + { + value->SetPrecision( precision ); + } + value->OnValueRefreshed( valueStr ); + value->Release(); + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void SensorMultilevel::CreateVars +( + uint8 const _instance +) +{ + // Don't create anything here. We do it in the report. +} + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorMultilevel.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorMultilevel.h new file mode 100644 index 0000000..4675fc0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SensorMultilevel.h @@ -0,0 +1,68 @@ +//----------------------------------------------------------------------------- +// +// SensorMultilevel.h +// +// Implementation of the Z-Wave COMMAND_CLASS_SENSOR_MULTILEVEL +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _SensorMultilevel_H +#define _SensorMultilevel_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueDecimal; + + /** \brief Implements COMMAND_CLASS_SENSOR_MULTILEVEL (0x31), a Z-Wave device command class. + */ + class SensorMultilevel: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new SensorMultilevel( _homeId, _nodeId ); } + virtual ~SensorMultilevel(){} + + static uint8 const StaticGetCommandClassId(){ return 0x31; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_SENSOR_MULTILEVEL"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _dummy, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + virtual uint8 GetMaxVersion(){ return 5; } + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + SensorMultilevel( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchAll.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchAll.cpp new file mode 100644 index 0000000..8b35786 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchAll.cpp @@ -0,0 +1,225 @@ +//----------------------------------------------------------------------------- +// +// SwitchAll.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_SWITCH_ALL +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "SwitchAll.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueList.h" + +using namespace OpenZWave; + +enum SwitchAllCmd +{ + SwitchAllCmd_Set = 0x01, + SwitchAllCmd_Get = 0x02, + SwitchAllCmd_Report = 0x03, + SwitchAllCmd_On = 0x04, + SwitchAllCmd_Off = 0x05 +}; + +static char const* c_switchAllStateName[] = +{ + "Disabled", + "Off Enabled", + "On Enabled", + "On and Off Enabled" +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool SwitchAll::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Session ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool SwitchAll::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "SwitchAllCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchAllCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "SwitchAllCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool SwitchAll::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if (SwitchAllCmd_Report == (SwitchAllCmd)_data[0]) + { + if( ValueList* value = static_cast( GetValue( _instance, 0 ) ) ) + { + value->OnValueRefreshed( (int32)_data[1] ); + value->Release(); + Log::Write( LogLevel_Info, GetNodeId(), "Received SwitchAll report from node %d: %s", GetNodeId(), value->GetItem().m_label.c_str() ); + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set the device's response to SWITCH_ALL commands +//----------------------------------------------------------------------------- +bool SwitchAll::SetValue +( + Value const& _value +) +{ + if( ValueID::ValueType_List == _value.GetID().GetType() ) + { + ValueList const* value = static_cast(&_value); + ValueList::Item const& item = value->GetItem(); + + Log::Write( LogLevel_Info, GetNodeId(), "SwitchAll::Set - %s on node %d", item.m_label.c_str(), GetNodeId() ); + Msg* msg = new Msg( "SwitchAllCmd_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchAllCmd_Set ); + msg->Append( (uint8)item.m_value ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Send a command to switch all devices off +//----------------------------------------------------------------------------- +void SwitchAll::Off +( + Driver* _driver, + uint8 const _nodeId +) +{ + Log::Write( LogLevel_Info, _nodeId, "SwitchAll::Off (Node=%d)", _nodeId ); + Msg* msg = new Msg( "SwitchAllCmd_Off", _nodeId, REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->Append( _nodeId ); + msg->Append( 2 ); + msg->Append( StaticGetCommandClassId() ); + msg->Append( SwitchAllCmd_Off ); + msg->Append( _driver->GetTransmitOptions() ); + _driver->SendMsg( msg, Driver::MsgQueue_Send ); +} + +//----------------------------------------------------------------------------- +// +// Send a command to switch all devices on +//----------------------------------------------------------------------------- +void SwitchAll::On +( + Driver* _driver, + uint8 const _nodeId +) +{ + Log::Write( LogLevel_Info, _nodeId, "SwitchAll::On (Node=%d)", _nodeId ); + Msg* msg = new Msg( "SwitchAllCmd_On", _nodeId, REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->Append( _nodeId ); + msg->Append( 2 ); + msg->Append( StaticGetCommandClassId() ); + msg->Append( SwitchAllCmd_On ); + msg->Append( _driver->GetTransmitOptions() ); + _driver->SendMsg( msg, Driver::MsgQueue_Send ); +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void SwitchAll::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + vector items; + for( int i=0; i<4; ++i ) + { + ValueList::Item item; + item.m_label = c_switchAllStateName[i]; + item.m_value = (i==3) ? 0x000000ff : i; + items.push_back( item ); + } + + node->CreateValueList( ValueID::ValueGenre_System, GetCommandClassId(), _instance, 0, "Switch All", "", false, false, 1, items, 0, 0 ); + } +} + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchAll.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchAll.h new file mode 100644 index 0000000..b945470 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchAll.h @@ -0,0 +1,69 @@ +//----------------------------------------------------------------------------- +// +// SwitchAll.h +// +// Implementation of the Z-Wave COMMAND_CLASS_SWITCH_ALL +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _SwitchAll_H +#define _SwitchAll_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueList; + + /** \brief Implements COMMAND_CLASS_SWITCH_ALL (0x27), a Z-Wave device command class. + */ + class SwitchAll: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new SwitchAll( _homeId, _nodeId ); } + virtual ~SwitchAll(){} + + static uint8 const StaticGetCommandClassId(){ return 0x27; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_SWITCH_ALL"; } + + static void On( Driver* _driver, uint8 const _nodeId ); + static void Off( Driver* _driver, uint8 const _nodeId ); + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + SwitchAll( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchBinary.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchBinary.cpp new file mode 100644 index 0000000..c5ed26d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchBinary.cpp @@ -0,0 +1,196 @@ +//----------------------------------------------------------------------------- +// +// SwitchBinary.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_SWITCH_BINARY +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "SwitchBinary.h" +#include "WakeUp.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../Node.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueBool.h" + +using namespace OpenZWave; + +enum SwitchBinaryCmd +{ + SwitchBinaryCmd_Set = 0x01, + SwitchBinaryCmd_Get = 0x02, + SwitchBinaryCmd_Report = 0x03 +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool SwitchBinary::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Dynamic ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool SwitchBinary::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "SwitchBinaryCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchBinaryCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "SwitchBinaryCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool SwitchBinary::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if (SwitchBinaryCmd_Report == (SwitchBinaryCmd)_data[0]) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received SwitchBinary report from node %d: level=%s", GetNodeId(), _data[1] ? "On" : "Off" ); + + if( ValueBool* value = static_cast( GetValue( _instance, 0 ) ) ) + { + value->OnValueRefreshed( _data[1] != 0 ); + value->Release(); + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set the state of the switch +//----------------------------------------------------------------------------- +bool SwitchBinary::SetValue +( + Value const& _value +) +{ + if( ValueID::ValueType_Bool == _value.GetID().GetType() ) + { + ValueBool const* value = static_cast(&_value); + + Log::Write( LogLevel_Info, GetNodeId(), "SwitchBinary::Set - Setting node %d to %s", GetNodeId(), value->GetValue() ? "On" : "Off" ); + Msg* msg = new Msg( "SwitchBinary Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchBinaryCmd_Set ); + msg->Append( value->GetValue() ? 0xff : 0x00 ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Update class values based in BASIC mapping +//----------------------------------------------------------------------------- +void SwitchBinary::SetValueBasic +( + uint8 const _instance, + uint8 const _value +) +{ + // Send a request for new value to synchronize it with the BASIC set/report. + // In case the device is sleeping, we set the value anyway so the BASIC set/report + // stays in sync with it. We must be careful mapping the uint8 BASIC value + // into a class specific value. + // When the device wakes up, the real requested value will be retrieved. + RequestValue( 0, 0, _instance, Driver::MsgQueue_Send ); + if( Node* node = GetNodeUnsafe() ) + { + if( WakeUp* wakeUp = static_cast( node->GetCommandClass( WakeUp::StaticGetCommandClassId() ) ) ) + { + if( !wakeUp->IsAwake() ) + { + if( ValueBool* value = static_cast( GetValue( _instance, 0 ) ) ) + { + value->OnValueRefreshed( _value != 0 ); + value->Release(); + } + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void SwitchBinary::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueBool( ValueID::ValueGenre_User, GetCommandClassId(), _instance, 0, "Switch", "", false, false, false, 0 ); + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchBinary.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchBinary.h new file mode 100644 index 0000000..9ff905b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchBinary.h @@ -0,0 +1,67 @@ +//----------------------------------------------------------------------------- +// +// SwitchBinary.h +// +// Implementation of the Z-Wave COMMAND_CLASS_SWITCH_BINARY +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _SwitchBinary_H +#define _SwitchBinary_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueBool; + + /** \brief Implements COMMAND_CLASS_SWITCH_BINARY (0x25), a Z-Wave device command class. + */ + class SwitchBinary: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new SwitchBinary( _homeId, _nodeId ); } + virtual ~SwitchBinary(){} + + static uint8 const StaticGetCommandClassId(){ return 0x25; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_SWITCH_BINARY"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + virtual void SetValueBasic( uint8 const _instance, uint8 const _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + SwitchBinary( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchMultilevel.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchMultilevel.cpp new file mode 100644 index 0000000..b4e910e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchMultilevel.cpp @@ -0,0 +1,631 @@ +//----------------------------------------------------------------------------- +// +// SwitchMultilevel.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_SWITCH_MULTILEVEL +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "SwitchMultilevel.h" +#include "WakeUp.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../Node.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueBool.h" +#include "../value_classes/ValueButton.h" +#include "../value_classes/ValueByte.h" + +using namespace OpenZWave; + +enum SwitchMultilevelCmd +{ + SwitchMultilevelCmd_Set = 0x01, + SwitchMultilevelCmd_Get = 0x02, + SwitchMultilevelCmd_Report = 0x03, + SwitchMultilevelCmd_StartLevelChange = 0x04, + SwitchMultilevelCmd_StopLevelChange = 0x05, + SwitchMultilevelCmd_SupportedGet = 0x06, + SwitchMultilevelCmd_SupportedReport = 0x07 +}; + +enum +{ + SwitchMultilevelIndex_Level = 0, + SwitchMultilevelIndex_Bright, + SwitchMultilevelIndex_Dim, + SwitchMultilevelIndex_IgnoreStartLevel, + SwitchMultilevelIndex_StartLevel, + SwitchMultilevelIndex_Duration, + SwitchMultilevelIndex_Step, + SwitchMultilevelIndex_Inc, + SwitchMultilevelIndex_Dec +}; + +static uint8 c_directionParams[] = +{ + 0x18, + 0x58, + 0xc0, + 0xc8 +}; + +static char const* c_directionDebugLabels[] = +{ + "Up", + "Down", + "Inc", + "Dec" +}; + +static char const* c_switchLabelsPos[] = +{ + "Undefined", + "On", + "Up", + "Open", + "Clockwise", + "Right", + "Forward", + "Push" +}; + +static char const* c_switchLabelsNeg[] = +{ + "Undefined", + "Off", + "Down", + "Close", + "Counter-Clockwise", + "Left", + "Reverse", + "Pull" +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool SwitchMultilevel::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Dynamic ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool SwitchMultilevel::RequestValue +( + uint32 const _requestFlags, + uint8 const _index, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _index == SwitchMultilevelIndex_Level ) + { + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "SwitchMultilevelCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchMultilevelCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "SwitchMultilevelCmd_Get Not Supported on this node"); + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool SwitchMultilevel::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( SwitchMultilevelCmd_Report == (SwitchMultilevelCmd)_data[0] ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received SwitchMultiLevel report: level=%d", _data[1] ); + + if( ValueByte* value = static_cast( GetValue( _instance, SwitchMultilevelIndex_Level ) ) ) + { + value->OnValueRefreshed( _data[1] ); + value->Release(); + } + return true; + } + + if( SwitchMultilevelCmd_SupportedReport == (SwitchMultilevelCmd)_data[0] ) + { + uint8 switchType1 = _data[1] & 0x1f; + uint8 switchType2 = _data[2] & 0x1f; + uint8 switchtype1label = switchType1; + uint8 switchtype2label = switchType2; + if (switchtype1label > 7) /* size of c_switchLabelsPos, c_switchLabelsNeg */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "switchtype1label Value was greater than range. Setting to Invalid"); + switchtype1label = 0; + } + if (switchtype2label > 7) /* sizeof c_switchLabelsPos, c_switchLabelsNeg */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "switchtype2label Value was greater than range. Setting to Invalid"); + switchtype2label = 0; + } + + + Log::Write( LogLevel_Info, GetNodeId(), "Received SwitchMultiLevel supported report: Switch1=%s/%s, Switch2=%s/%s", c_switchLabelsPos[switchtype1label], c_switchLabelsNeg[switchtype1label], c_switchLabelsPos[switchtype2label], c_switchLabelsNeg[switchtype2label] ); + ClearStaticRequest( StaticRequest_Version ); + + // Set the labels on the values + ValueButton* button; + + if( switchType1 ) + { + if( NULL != ( button = static_cast( GetValue( _instance, SwitchMultilevelIndex_Bright ) ) ) ) + { + button->SetLabel( c_switchLabelsPos[switchtype1label] ); + button->Release(); + } + if( NULL != ( button = static_cast( GetValue( _instance, SwitchMultilevelIndex_Dim ) ) ) ) + { + button->SetLabel( c_switchLabelsNeg[switchtype1label] ); + button->Release(); + } + } + + if( switchType2 ) + { + if( NULL != ( button = static_cast( GetValue( _instance, SwitchMultilevelIndex_Inc ) ) ) ) + { + button->SetLabel( c_switchLabelsPos[switchtype2label] ); + button->Release(); + } + if( NULL != ( button = static_cast( GetValue( _instance, SwitchMultilevelIndex_Dec ) ) ) ) + { + button->SetLabel( c_switchLabelsNeg[switchtype2label] ); + button->Release(); + } + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set the command class version +//----------------------------------------------------------------------------- +void SwitchMultilevel::SetVersion +( + uint8 const _version +) +{ + CommandClass::SetVersion( _version ); + + if( _version == 3 ) + { + // Request the supported switch types + Msg* msg = new Msg( "SwitchMultilevelCmd_SupportedGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchMultilevelCmd_SupportedGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + + // Set the request flag again - it will be cleared when we get a + // response to the SwitchMultilevelCmd_SupportedGet message. + SetStaticRequest( StaticRequest_Version ); + } +} + +//----------------------------------------------------------------------------- +// +// Set the level on a device +//----------------------------------------------------------------------------- +bool SwitchMultilevel::SetValue +( + Value const& _value +) +{ + bool res = false; + uint8 instance = _value.GetID().GetInstance(); + + switch( _value.GetID().GetIndex() ) + { + case SwitchMultilevelIndex_Level: + { + // Level + if( ValueByte* value = static_cast( GetValue( instance, SwitchMultilevelIndex_Level ) ) ) + { + res = SetLevel( instance, (static_cast(&_value))->GetValue() ); + value->Release(); + } + break; + } + case SwitchMultilevelIndex_Bright: + { + // Bright + if( ValueButton* button = static_cast( GetValue( instance, SwitchMultilevelIndex_Bright ) ) ) + { + if( button->IsPressed() ) + { + res = StartLevelChange( instance, SwitchMultilevelDirection_Up ); + } + else + { + res = StopLevelChange( instance ); + } + button->Release(); + } + break; + } + case SwitchMultilevelIndex_Dim: + { + // Dim + if( ValueButton* button = static_cast( GetValue( instance, SwitchMultilevelIndex_Dim ) ) ) + { + if( button->IsPressed() ) + { + res = StartLevelChange( instance, SwitchMultilevelDirection_Down ); + } + else + { + res = StopLevelChange( instance ); + } + button->Release(); + } + break; + } + case SwitchMultilevelIndex_IgnoreStartLevel: + { + if( ValueBool* value = static_cast( GetValue( instance, SwitchMultilevelIndex_IgnoreStartLevel ) ) ) + { + value->OnValueRefreshed( (static_cast( &_value))->GetValue() ); + value->Release(); + } + res = true; + break; + } + case SwitchMultilevelIndex_StartLevel: + { + if( ValueByte* value = static_cast( GetValue( instance, SwitchMultilevelIndex_StartLevel ) ) ) + { + value->OnValueRefreshed( (static_cast( &_value))->GetValue() ); + value->Release(); + } + res = true; + break; + } + case SwitchMultilevelIndex_Duration: + { + if( ValueByte* value = static_cast( GetValue( instance, SwitchMultilevelIndex_Duration ) ) ) + { + value->OnValueRefreshed( (static_cast( &_value))->GetValue() ); + value->Release(); + } + res = true; + break; + } + case SwitchMultilevelIndex_Step: + { + if( ValueByte* value = static_cast( GetValue( instance, SwitchMultilevelIndex_Step ) ) ) + { + value->OnValueRefreshed( (static_cast( &_value))->GetValue() ); + value->Release(); + } + res = true; + break; + } + case SwitchMultilevelIndex_Inc: + { + // Inc + if( ValueButton* button = static_cast( GetValue( instance, SwitchMultilevelIndex_Inc ) ) ) + { + if( button->IsPressed() ) + { + res = StartLevelChange( instance, SwitchMultilevelDirection_Inc ); + } + else + { + res = StopLevelChange( instance ); + } + button->Release(); + } + break; + } + case SwitchMultilevelIndex_Dec: + { + // Dec + if( ValueButton* button = static_cast( GetValue( instance, SwitchMultilevelIndex_Dec ) ) ) + { + if( button->IsPressed() ) + { + res = StartLevelChange( instance, SwitchMultilevelDirection_Dec ); + } + else + { + res = StopLevelChange( instance ); + } + button->Release(); + } + break; + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// Update class values based in BASIC mapping +//----------------------------------------------------------------------------- +void SwitchMultilevel::SetValueBasic +( + uint8 const _instance, + uint8 const _value +) +{ + // Send a request for new value to synchronize it with the BASIC set/report. + // In case the device is sleeping, we set the value anyway so the BASIC set/report + // stays in sync with it. We must be careful mapping the uint8 BASIC value + // into a class specific value. + // When the device wakes up, the real requested value will be retrieved. + RequestValue( 0, 0, _instance, Driver::MsgQueue_Send ); + if( Node* node = GetNodeUnsafe() ) + { + if( WakeUp* wakeUp = static_cast( node->GetCommandClass( WakeUp::StaticGetCommandClassId() ) ) ) + { + if( !wakeUp->IsAwake() ) + { + if( ValueByte* value = static_cast( GetValue( _instance, SwitchMultilevelIndex_Level ) ) ) + { + value->OnValueRefreshed( _value != 0 ); + value->Release(); + } + } + } + } +} + +//----------------------------------------------------------------------------- +// +// Set a new level for the switch +//----------------------------------------------------------------------------- +bool SwitchMultilevel::SetLevel +( + uint8 const _instance, + uint8 const _level +) +{ + Log::Write( LogLevel_Info, GetNodeId(), "SwitchMultilevel::Set - Setting to level %d", _level ); + Msg* msg = new Msg( "SwitchMultiLevel Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + + if( ValueByte* durationValue = static_cast( GetValue( _instance, SwitchMultilevelIndex_Duration ) ) ) + { + uint8 duration = durationValue->GetValue(); + durationValue->Release(); + if( duration == 0xff ) + { + Log::Write( LogLevel_Info, GetNodeId(), " Duration: Default" ); + } + else if( duration >= 0x80 ) + { + Log::Write( LogLevel_Info, GetNodeId(), " Duration: %d minutes", duration - 0x7f ); + } + else + { + Log::Write( LogLevel_Info, GetNodeId(), " Duration: %d seconds", duration ); + } + + msg->Append( 4 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchMultilevelCmd_Set ); + msg->Append( _level ); + msg->Append( duration ); + } + else + { + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchMultilevelCmd_Set ); + msg->Append( _level ); + } + + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Start the level changing +//----------------------------------------------------------------------------- +bool SwitchMultilevel::StartLevelChange +( + uint8 const _instance, + SwitchMultilevelDirection const _direction +) +{ + Log::Write( LogLevel_Info, GetNodeId(), "SwitchMultilevel::StartLevelChange - Starting a level change" ); + + uint8 length = 4; + if (_direction > 3) /* size of c_directionParams, c_directionDebugLabels */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "_direction Value was greater than range. Dropping"); + return false; + } + uint8 direction = c_directionParams[_direction]; + Log::Write( LogLevel_Info, GetNodeId(), " Direction: %s", c_directionDebugLabels[_direction] ); + + if( ValueBool* ignoreStartLevel = static_cast( GetValue( _instance, SwitchMultilevelIndex_IgnoreStartLevel ) ) ) + { + if( ignoreStartLevel->GetValue() ) + { + ignoreStartLevel->Release(); + // Set the ignore start level flag + direction |= 0x20; + } + } + Log::Write( LogLevel_Info, GetNodeId(), " Ignore Start Level: %s", (direction & 0x20) ? "True" : "False" ); + + uint8 startLevel = 0; + if( ValueByte* startLevelValue = static_cast( GetValue( _instance, SwitchMultilevelIndex_StartLevel ) ) ) + { + startLevel = startLevelValue->GetValue(); + startLevelValue->Release(); + } + Log::Write( LogLevel_Info, GetNodeId(), " Start Level: %d", startLevel ); + + uint8 duration = 0; + if( ValueByte* durationValue = static_cast( GetValue( _instance, SwitchMultilevelIndex_Duration ) ) ) + { + length = 5; + duration = durationValue->GetValue(); + durationValue->Release(); + Log::Write( LogLevel_Info, GetNodeId(), " Duration: %d", duration ); + } + + uint8 step = 0; + if( ( SwitchMultilevelDirection_Inc == _direction ) || ( SwitchMultilevelDirection_Dec == _direction ) ) + { + if( ValueByte* stepValue = static_cast( GetValue( _instance, SwitchMultilevelIndex_Step ) ) ) + { + length = 6; + step = stepValue->GetValue(); + stepValue->Release(); + Log::Write( LogLevel_Info, GetNodeId(), " Step Size: %d", step ); + } + } + + Msg* msg = new Msg( "SwitchMultilevel StartLevelChange", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( length ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchMultilevelCmd_StartLevelChange ); + msg->Append( direction ); + msg->Append( startLevel ); + + if( length >= 5 ) + { + msg->Append( duration ); + } + + if( length == 6 ) + { + msg->Append( step ); + } + + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Stop the level changing +//----------------------------------------------------------------------------- +bool SwitchMultilevel::StopLevelChange +( + uint8 const _instance +) +{ + Log::Write( LogLevel_Info, GetNodeId(), "SwitchMultilevel::StopLevelChange - Stopping the level change" ); + Msg* msg = new Msg( "SwitchMultilevel StopLevelChange", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchMultilevelCmd_StopLevelChange ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void SwitchMultilevel::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + switch( GetVersion() ) + { + case 3: + { + node->CreateValueByte( ValueID::ValueGenre_User, GetCommandClassId(), _instance, SwitchMultilevelIndex_Step, "Step Size", "", false, false, 0, 0 ); + node->CreateValueButton( ValueID::ValueGenre_User, GetCommandClassId(), _instance, SwitchMultilevelIndex_Inc, "Inc", 0 ); + node->CreateValueButton( ValueID::ValueGenre_User, GetCommandClassId(), _instance, SwitchMultilevelIndex_Dec, "Dec", 0 ); + // Fall through to version 2 + } + case 2: + { + node->CreateValueByte( ValueID::ValueGenre_System, GetCommandClassId(), _instance, SwitchMultilevelIndex_Duration, "Dimming Duration", "", false, false, 0xff, 0 ); + // Fall through to version 1 + } + case 1: + { + node->CreateValueByte( ValueID::ValueGenre_User, GetCommandClassId(), _instance, SwitchMultilevelIndex_Level, "Level", "", false, false, 0, 0 ); + node->CreateValueButton( ValueID::ValueGenre_User, GetCommandClassId(), _instance, SwitchMultilevelIndex_Bright, "Bright", 0 ); + node->CreateValueButton( ValueID::ValueGenre_User, GetCommandClassId(), _instance, SwitchMultilevelIndex_Dim, "Dim", 0 ); + node->CreateValueBool( ValueID::ValueGenre_System, GetCommandClassId(), _instance, SwitchMultilevelIndex_IgnoreStartLevel, "Ignore Start Level", "", false, false, true, 0 ); + node->CreateValueByte( ValueID::ValueGenre_System, GetCommandClassId(), _instance, SwitchMultilevelIndex_StartLevel, "Start Level", "", false, false, 0, 0 ); + break; + } + } + } +} + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchMultilevel.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchMultilevel.h new file mode 100644 index 0000000..99cc863 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchMultilevel.h @@ -0,0 +1,84 @@ +//----------------------------------------------------------------------------- +// +// SwitchMultilevel.h +// +// Implementation of the Z-Wave COMMAND_CLASS_SWITCH_MULTILEVEL +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _SwitchMultilevel_H +#define _SwitchMultilevel_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueBool; + class ValueButton; + class ValueByte; + + /** \brief Implements COMMAND_CLASS_SWITCH_MULTILEVEL (0x26), a Z-Wave device command class. + */ + class SwitchMultilevel: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new SwitchMultilevel( _homeId, _nodeId ); } + virtual ~SwitchMultilevel(){} + + static uint8 const StaticGetCommandClassId(){ return 0x26; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_SWITCH_MULTILEVEL"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + virtual void SetValueBasic( uint8 const _instance, uint8 const _value ); + virtual void SetVersion( uint8 const _version ); + + virtual uint8 GetMaxVersion(){ return 3; } + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + enum SwitchMultilevelDirection + { + SwitchMultilevelDirection_Up = 0, + SwitchMultilevelDirection_Down, + SwitchMultilevelDirection_Inc, + SwitchMultilevelDirection_Dec + }; + + SwitchMultilevel( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + + bool SetLevel( uint8 const _instance, uint8 const _level ); + bool StartLevelChange( uint8 const _instance, SwitchMultilevelDirection const _direction ); + bool StopLevelChange( uint8 const _instance ); + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleBinary.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleBinary.cpp new file mode 100644 index 0000000..cedeaf8 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleBinary.cpp @@ -0,0 +1,157 @@ +//----------------------------------------------------------------------------- +// +// SwitchToggleBinary.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_SWITCH_TOGGLE_BINARY +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "SwitchToggleBinary.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../Node.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueBool.h" + +using namespace OpenZWave; + +enum SwitchToggleBinaryCmd +{ + SwitchToggleBinaryCmd_Set = 0x01, + SwitchToggleBinaryCmd_Get = 0x02, + SwitchToggleBinaryCmd_Report = 0x03 +}; + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool SwitchToggleBinary::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Dynamic ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool SwitchToggleBinary::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "SwitchToggleBinaryCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchToggleBinaryCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "SwitchToggleBinaryCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool SwitchToggleBinary::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( SwitchToggleBinaryCmd_Report == (SwitchToggleBinaryCmd)_data[0] ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received SwitchToggleBinary report: %s", _data[1] ? "On" : "Off" ); + + if( ValueBool* value = static_cast( GetValue( _instance, 0 ) ) ) + { + value->OnValueRefreshed( _data[1] != 0 ); + value->Release(); + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Toggle the state of the switch +//----------------------------------------------------------------------------- +bool SwitchToggleBinary::SetValue +( + Value const& _value +) +{ + Log::Write( LogLevel_Info, GetNodeId(), "SwitchToggleBinary::Set - Toggling the state" ); + Msg* msg = new Msg( "SwitchToggleBinary Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchToggleBinaryCmd_Set ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void SwitchToggleBinary::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueBool( ValueID::ValueGenre_User, GetCommandClassId(), _instance, 0, "Toggle Switch", "", false, false, false, 0 ); + } +} + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleBinary.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleBinary.h new file mode 100644 index 0000000..f3cfdf9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleBinary.h @@ -0,0 +1,66 @@ +//----------------------------------------------------------------------------- +// +// SwitchToggleBinary.h +// +// Implementation of the Z-Wave COMMAND_CLASS_SWITCH_TOGGLE_BINARY +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _SwitchToggleBinary_H +#define _SwitchToggleBinary_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueBool; + + /** \brief Implements COMMAND_CLASS_SWITCH_TOGGLE_BINARY (0x28), a Z-Wave device command class. + */ + class SwitchToggleBinary: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new SwitchToggleBinary( _homeId, _nodeId ); } + virtual ~SwitchToggleBinary(){} + + static uint8 const StaticGetCommandClassId(){ return 0x28; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_SWITCH_TOGGLE_BINARY"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + SwitchToggleBinary( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleMultilevel.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleMultilevel.cpp new file mode 100644 index 0000000..243e531 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleMultilevel.cpp @@ -0,0 +1,201 @@ +//----------------------------------------------------------------------------- +// +// SwitchToggleMultilevel.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_SWITCH_TOGGLE_MULTILEVEL +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "SwitchToggleMultilevel.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../Node.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueByte.h" + +using namespace OpenZWave; + +enum SwitchToggleMultilevelCmd +{ + SwitchToggleMultilevelCmd_Set = 0x01, + SwitchToggleMultilevelCmd_Get = 0x02, + SwitchToggleMultilevelCmd_Report = 0x03, + SwitchToggleMultilevelCmd_StartLevelChange = 0x04, + SwitchToggleMultilevelCmd_StopLevelChange = 0x05 +}; + + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool SwitchToggleMultilevel::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Dynamic ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool SwitchToggleMultilevel::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "SwitchToggleMultilevelCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchToggleMultilevelCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "SwitchToggleMultilevelCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool SwitchToggleMultilevel::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( SwitchToggleMultilevelCmd_Report == (SwitchToggleMultilevelCmd)_data[0] ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received SwitchToggleMultiLevel report: level=%d", _data[1] ); + + if( ValueByte* value = static_cast( GetValue( _instance, 0 ) ) ) + { + value->OnValueRefreshed( _data[1] ); + value->Release(); + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Toggle the state of the switch +//----------------------------------------------------------------------------- +bool SwitchToggleMultilevel::SetValue +( + Value const& _value +) +{ + Log::Write( LogLevel_Info, GetNodeId(), "SwitchToggleMultilevel::Set - Toggling the state" ); + Msg* msg = new Msg( "SwitchToggleMultilevel Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchToggleMultilevelCmd_Set ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Start the level changing +//----------------------------------------------------------------------------- +void SwitchToggleMultilevel::StartLevelChange +( + SwitchToggleMultilevelDirection const _direction, + bool const _bIgnoreStartLevel, + bool const _bRollover +) +{ + uint8 param = (uint8)_direction; + param |= ( _bIgnoreStartLevel ? 0x20 : 0x00 ); + param |= ( _bRollover ? 0x80 : 0x00 ); + + Log::Write( LogLevel_Info, GetNodeId(), "SwitchMultilevel::StartLevelChange - Starting a level change, Direction=%d, IgnoreStartLevel=%s and rollover=%s", (_direction==SwitchToggleMultilevelDirection_Up) ? "Up" : "Down", _bIgnoreStartLevel ? "True" : "False", _bRollover ? "True" : "False" ); + Msg* msg = new Msg( "SwitchMultilevel StartLevelChange", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchToggleMultilevelCmd_StartLevelChange ); + msg->Append( param ); + msg->Append( GetDriver()->GetTransmitOptions() ); +} + +//----------------------------------------------------------------------------- +// +// Stop the level changing +//----------------------------------------------------------------------------- +void SwitchToggleMultilevel::StopLevelChange +( +) +{ + Log::Write( LogLevel_Info, GetNodeId(), "SwitchToggleMultilevel::StopLevelChange - Stopping the level change" ); + Msg* msg = new Msg( "SwitchToggleMultilevel StopLevelChange", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( SwitchToggleMultilevelCmd_StopLevelChange ); + msg->Append( GetDriver()->GetTransmitOptions() ); +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void SwitchToggleMultilevel::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueByte( ValueID::ValueGenre_User, GetCommandClassId(), _instance, 0, "Level", "", false, false, 0, 0 ); + } +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleMultilevel.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleMultilevel.h new file mode 100644 index 0000000..c6e91d3 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/SwitchToggleMultilevel.h @@ -0,0 +1,75 @@ +//----------------------------------------------------------------------------- +// +// SwitchToggleMultilevel.h +// +// Implementation of the Z-Wave COMMAND_CLASS_SWITCH_TOGGLE_MULTILEVEL +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _SwitchToggleMultilevel_H +#define _SwitchToggleMultilevel_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueByte; + + /** \brief Implements COMMAND_CLASS_SWITCH_TOGGLE_MULTILEVEL (0x29), a Z-Wave device command class. + */ + class SwitchToggleMultilevel: public CommandClass + { + public: + enum SwitchToggleMultilevelDirection + { + SwitchToggleMultilevelDirection_Up = 0x00, + SwitchToggleMultilevelDirection_Down = 0x40 + }; + + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new SwitchToggleMultilevel( _homeId, _nodeId ); } + virtual ~SwitchToggleMultilevel(){} + + static uint8 const StaticGetCommandClassId(){ return 0x29; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_SWITCH_TOGGLE_MULTILEVEL"; } + + void StartLevelChange( SwitchToggleMultilevelDirection const _direction, bool const _bIgnoreStartLevel, bool const _bRollover ); + void StopLevelChange(); + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + SwitchToggleMultilevel( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanMode.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanMode.cpp new file mode 100644 index 0000000..0b4bb0c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanMode.cpp @@ -0,0 +1,344 @@ +//----------------------------------------------------------------------------- +// +// ThermostatFanMode.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_THERMOSTAT_FAN_MODE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include +#include "CommandClasses.h" +#include "ThermostatFanMode.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueList.h" + +#include "../tinyxml.h" + +using namespace OpenZWave; + +enum ThermostatFanModeCmd +{ + ThermostatFanModeCmd_Set = 0x01, + ThermostatFanModeCmd_Get = 0x02, + ThermostatFanModeCmd_Report = 0x03, + ThermostatFanModeCmd_SupportedGet = 0x04, + ThermostatFanModeCmd_SupportedReport = 0x05 +}; + +static string const c_modeName[] = +{ + "Auto Low", + "On Low", + "Auto High", + "On High", + "Unknown 4", + "Unknown 5", + "Circulate", + "Unknown" +}; + +//----------------------------------------------------------------------------- +// +// Read the supported modes +//----------------------------------------------------------------------------- +void ThermostatFanMode::ReadXML +( + TiXmlElement const* _ccElement +) +{ + CommandClass::ReadXML( _ccElement ); + + if( GetNodeUnsafe() ) + { + vector supportedModes; + + TiXmlElement const* supportedModesElement = _ccElement->FirstChildElement( "SupportedModes" ); + if( supportedModesElement ) + { + TiXmlElement const* modeElement = supportedModesElement->FirstChildElement(); + while( modeElement ) + { + char const* str = modeElement->Value(); + if( str && !strcmp( str, "Mode" ) ) + { + int index; + if( TIXML_SUCCESS == modeElement->QueryIntAttribute( "index", &index ) ) + { + if (index > 6) /* size of c_modeName excluding Invalid */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "index Value in XML was greater than range. Setting to Invalid"); + index = 7; + } + ValueList::Item item; + item.m_value = index; + item.m_label = c_modeName[index]; + supportedModes.push_back( item ); + } + } + + modeElement = modeElement->NextSiblingElement(); + } + } + + if( !supportedModes.empty() ) + { + m_supportedModes = supportedModes; + ClearStaticRequest( StaticRequest_Values ); + CreateVars( 1 ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Save the supported modes +//----------------------------------------------------------------------------- +void ThermostatFanMode::WriteXML +( + TiXmlElement* _ccElement +) +{ + CommandClass::WriteXML( _ccElement ); + + if( GetNodeUnsafe() ) + { + TiXmlElement* supportedModesElement = new TiXmlElement( "SupportedModes" ); + _ccElement->LinkEndChild( supportedModesElement ); + + for( vector::iterator it = m_supportedModes.begin(); it != m_supportedModes.end(); ++it ) + { + ValueList::Item const& item = *it; + + TiXmlElement* modeElement = new TiXmlElement( "Mode" ); + supportedModesElement->LinkEndChild( modeElement ); + + char str[8]; + snprintf( str, 8, "%d", item.m_value ); + modeElement->SetAttribute( "index", str ); + modeElement->SetAttribute( "label", item.m_label.c_str() ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Get the static thermostat fan mode details from the device +//----------------------------------------------------------------------------- +bool ThermostatFanMode::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + bool requests = false; + if( ( _requestFlags & RequestFlag_Static ) && HasStaticRequest( StaticRequest_Values ) ) + { + // Request the supported modes + requests |= RequestValue( _requestFlags, ThermostatFanModeCmd_SupportedGet, _instance, _queue ); + } + + if( _requestFlags & RequestFlag_Dynamic ) + { + // Request the current fan mode + requests |= RequestValue( _requestFlags, ThermostatFanModeCmd_Get, _instance, _queue ); + } + + return requests; +} + +//----------------------------------------------------------------------------- +// +// Get the thermostat fan mode details from the device +//----------------------------------------------------------------------------- +bool ThermostatFanMode::RequestValue +( + uint32 const _requestFlags, + uint8 const _getTypeEnum, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _getTypeEnum == ThermostatFanModeCmd_SupportedGet ) + { + // Request the supported modes + Msg* msg = new Msg( "ThermostatFanModeCmd_SupportedGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( ThermostatFanModeCmd_SupportedGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } + + if( _getTypeEnum == ThermostatFanModeCmd_Get || _getTypeEnum == 0 ) + { + if ( IsGetSupported() ) + { + // Request the current fan mode + Msg* msg = new Msg( "ThermostatFanModeCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( ThermostatFanModeCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "ThermostatFanModeCmd_Get Not Supported on this node"); + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool ThermostatFanMode::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( ThermostatFanModeCmd_Report == (ThermostatFanModeCmd)_data[0] ) + { + uint8 mode = (int32)_data[1]; + + if( mode < m_supportedModes.size() ) + { + // We have received the thermostat mode from the Z-Wave device + if( ValueList* valueList = static_cast( GetValue( _instance, 0 ) ) ) + { + valueList->OnValueRefreshed( (int32)_data[1] ); + Log::Write( LogLevel_Info, GetNodeId(), "Received thermostat fan mode: %s", valueList->GetItem().m_label.c_str() ); + valueList->Release(); + } + else + { + Log::Write( LogLevel_Info, GetNodeId(), "Received thermostat fan mode: index %d", mode ); + } + } + else + { + Log::Write( LogLevel_Info, GetNodeId(), "Received unknown thermostat fan mode: %d", mode ); + } + return true; + } + + if( ThermostatFanModeCmd_SupportedReport == (ThermostatFanModeCmd)_data[0] ) + { + // We have received the supported thermostat fan modes from the Z-Wave device + Log::Write( LogLevel_Info, GetNodeId(), "Received supported thermostat fan modes" ); + + m_supportedModes.clear(); + for( uint32 i=1; i<_length-1; ++i ) + { + for( int32 bit=0; bit<8; ++bit ) + { + if( ( _data[i] & (1<= (sizeof(c_modeName)/sizeof(*c_modeName) -1)) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received unknown fan mode: 0x%x", item.m_value); + } + else + { + item.m_label = c_modeName[item.m_value]; + m_supportedModes.push_back( item ); + + Log::Write( LogLevel_Info, GetNodeId(), " Added fan mode: %s", c_modeName[item.m_value].c_str() ); + } + } + } + } + + ClearStaticRequest( StaticRequest_Values ); + CreateVars( _instance ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set the device's thermostat fan mode +//----------------------------------------------------------------------------- +bool ThermostatFanMode::SetValue +( + Value const& _value +) +{ + if( ValueID::ValueType_List == _value.GetID().GetType() ) + { + ValueList const* value = static_cast(&_value); + uint8 state = (uint8)value->GetItem().m_value; + + Msg* msg = new Msg( "ThermostatFanModeCmd_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( ThermostatFanModeCmd_Set ); + msg->Append( state ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void ThermostatFanMode::CreateVars +( + uint8 const _instance +) +{ + if( m_supportedModes.empty() ) + { + return; + } + + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueList( ValueID::ValueGenre_User, GetCommandClassId(), _instance, 0, "Fan Mode", "", false, false, 1, m_supportedModes, m_supportedModes[0].m_value, 0 ); + } +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanMode.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanMode.h new file mode 100644 index 0000000..f80c677 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanMode.h @@ -0,0 +1,77 @@ +//----------------------------------------------------------------------------- +// +// ThermostatFanMode.h +// +// Implementation of the Z-Wave COMMAND_CLASS_THERMOSTAT_FAN_MODE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ThermostatFanMode_H +#define _ThermostatFanMode_H + +#include +#include +#include "CommandClass.h" +#include "../value_classes/ValueList.h" + +namespace OpenZWave +{ + class ValueList; + + /** \brief Implements COMMAND_CLASS_THERMOSTAT_FAN_MODE (0x44), a Z-Wave device command class. + */ + class ThermostatFanMode: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new ThermostatFanMode( _homeId, _nodeId ); } + virtual ~ThermostatFanMode(){} + + static uint8 const StaticGetCommandClassId(){ return 0x44; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_THERMOSTAT_FAN_MODE"; } + + // From CommandClass + virtual void ReadXML( TiXmlElement const* _ccElement ); + virtual void WriteXML( TiXmlElement* _ccElement ); + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _getTypeEnum, uint8 const _dummy, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + ThermostatFanMode( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){ SetStaticRequest( StaticRequest_Values ); } + + vector m_supportedModes; + }; + +} // namespace OpenZWave + +#endif + + + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanState.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanState.cpp new file mode 100644 index 0000000..b54acf7 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanState.cpp @@ -0,0 +1,158 @@ +//----------------------------------------------------------------------------- +// +// ThermostatFanState.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_THERMOSTAT_FAN_STATE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "ThermostatFanState.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueString.h" + +using namespace OpenZWave; + +enum ThermostatFanStateCmd +{ + ThermostatFanStateCmd_Get = 0x02, + ThermostatFanStateCmd_Report = 0x03 +}; + +static char const* c_stateName[] = +{ + "Idle", + "Running", + "Running High", + "State 03", // Undefined states. May be used in the future. + "State 04", + "State 05", + "State 06", + "State 07", + "State 08", + "State 09", + "State 10", + "State 11", + "State 12", + "State 13", + "State 14", + "State 15", +}; + +//----------------------------------------------------------------------------- +// +// Get the static thermostat mode details from the device +//----------------------------------------------------------------------------- +bool ThermostatFanState::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Dynamic ) + { + // Request the current state + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Get the thermostat fan state details from the device +//----------------------------------------------------------------------------- +bool ThermostatFanState::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( IsGetSupported() ) + { + // Request the current state + Msg* msg = new Msg( "ThermostatFanStateCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( ThermostatFanStateCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "ThermostatFanStateCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool ThermostatFanState::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( ThermostatFanStateCmd_Report == (ThermostatFanStateCmd)_data[0] ) + { + // We have received the thermostat fan state from the Z-Wave device + if( ValueString* valueString = static_cast( GetValue( _instance, 0 ) ) ) + { + /* No need bounds checking as the state can only be a single byte - No larger than our Char array anyway */ + uint8 state = (_data[1]&0x0f); + + valueString->OnValueRefreshed( c_stateName[state] ); + valueString->Release(); + Log::Write( LogLevel_Info, GetNodeId(), "Received thermostat fan state: %s", valueString->GetValue().c_str() ); + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void ThermostatFanState::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueString( ValueID::ValueGenre_User, GetCommandClassId(), _instance, 0, "Fan State", "", true, false, c_stateName[0], 0 ); + } +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanState.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanState.h new file mode 100644 index 0000000..104f7d2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatFanState.h @@ -0,0 +1,71 @@ +//----------------------------------------------------------------------------- +// +// ThermostatFanState.h +// +// Implementation of the Z-Wave COMMAND_CLASS_THERMOSTAT_FAN_STATE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ThermostatFanState_H +#define _ThermostatFanState_H + +#include +#include +#include "CommandClass.h" +#include "../value_classes/ValueList.h" + +namespace OpenZWave +{ + class ValueString; + + /** \brief Implements COMMAND_CLASS_THERMOSTAT_FAN_STATE (0x45), a Z-Wave device command class. + */ + class ThermostatFanState: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new ThermostatFanState( _homeId, _nodeId ); } + virtual ~ThermostatFanState(){} + + static uint8 const StaticGetCommandClassId(){ return 0x45; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_THERMOSTAT_FAN_STATE"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + ThermostatFanState( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatMode.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatMode.cpp new file mode 100644 index 0000000..02e1260 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatMode.cpp @@ -0,0 +1,395 @@ +//----------------------------------------------------------------------------- +// +// ThermostatMode.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_THERMOSTAT_MODE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "ThermostatMode.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueList.h" + +#include "../tinyxml.h" + +using namespace OpenZWave; + +enum ThermostatModeCmd +{ + ThermostatModeCmd_Set = 0x01, + ThermostatModeCmd_Get = 0x02, + ThermostatModeCmd_Report = 0x03, + ThermostatModeCmd_SupportedGet = 0x04, + ThermostatModeCmd_SupportedReport = 0x05 +}; + +static char const* c_modeName[] = +{ + "Off", + "Heat", + "Cool", + "Auto", + "Aux Heat", + "Resume", + "Fan Only", + "Furnace", + "Dry Air", + "Moist Air", + "Auto Changeover", + "Heat Econ", + "Cool Econ", + "Away", + "Unknown" +}; + +//----------------------------------------------------------------------------- +// +// Read the supported modes +//----------------------------------------------------------------------------- +void ThermostatMode::ReadXML +( + TiXmlElement const* _ccElement +) +{ + CommandClass::ReadXML( _ccElement ); + + if( GetNodeUnsafe() ) + { + vector supportedModes; + + TiXmlElement const* supportedModesElement = _ccElement->FirstChildElement( "SupportedModes" ); + if( supportedModesElement ) + { + TiXmlElement const* modeElement = supportedModesElement->FirstChildElement(); + while( modeElement ) + { + char const* str = modeElement->Value(); + if( str && !strcmp( str, "Mode" ) ) + { + int index; + if( TIXML_SUCCESS == modeElement->QueryIntAttribute( "index", &index ) ) + { + if (index > 13) /* size of c_modeName minus Invalid */ + { + Log::Write (LogLevel_Warning, GetNodeId(), "index Value in XML was greater than range. Setting to Invalid"); + index = 14; + } + ValueList::Item item; + item.m_value = index; + item.m_label = c_modeName[index]; + supportedModes.push_back( item ); + } + } + + modeElement = modeElement->NextSiblingElement(); + } + } + + if( !supportedModes.empty() ) + { + m_supportedModes = supportedModes; + ClearStaticRequest( StaticRequest_Values ); + CreateVars( 1 ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Save the supported modes +//----------------------------------------------------------------------------- +void ThermostatMode::WriteXML +( + TiXmlElement* _ccElement +) +{ + if( m_supportedModes.empty() ) + { + return; + } + + CommandClass::WriteXML( _ccElement ); + + if( GetNodeUnsafe() ) + { + TiXmlElement* supportedModesElement = new TiXmlElement( "SupportedModes" ); + _ccElement->LinkEndChild( supportedModesElement ); + + for( vector::iterator it = m_supportedModes.begin(); it != m_supportedModes.end(); ++it ) + { + ValueList::Item const& item = *it; + + TiXmlElement* modeElement = new TiXmlElement( "Mode" ); + supportedModesElement->LinkEndChild( modeElement ); + + char str[8]; + snprintf( str, 8, "%d", item.m_value ); + modeElement->SetAttribute( "index", str ); + modeElement->SetAttribute( "label", item.m_label.c_str() ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Get the static thermostat mode details from the device +//----------------------------------------------------------------------------- +bool ThermostatMode::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + bool requests = false; + if( ( _requestFlags & RequestFlag_Static ) && HasStaticRequest( StaticRequest_Values ) ) + { + // request supported mode list + requests |= RequestValue( _requestFlags, ThermostatModeCmd_SupportedGet, _instance, _queue ); + } + + if( _requestFlags & RequestFlag_Dynamic ) + { + // Request the current mode + requests |= RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return requests; +} + +//----------------------------------------------------------------------------- +// +// Get the static thermostat mode details from the device +//----------------------------------------------------------------------------- +bool ThermostatMode::RequestValue +( + uint32 const _requestFlags, + uint8 const _getTypeEnum, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _getTypeEnum == ThermostatModeCmd_SupportedGet ) + { + // Request the supported modes + Msg* msg = new Msg( "ThermostatModeCmd_SupportedGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( ThermostatModeCmd_SupportedGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } + + if( _getTypeEnum == 0 ) // get current mode + { + if ( IsGetSupported() ) + { + // Request the current mode + Msg* msg = new Msg( "ThermostatModeCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( ThermostatModeCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "ThermostatModeCmd_Get Not Supported on this node"); + + } + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool ThermostatMode::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( ThermostatModeCmd_Report == (ThermostatModeCmd)_data[0] ) + { + uint8 mode = _data[1]&0x1f; + bool validMode = false; + for (vector::iterator it = m_supportedModes.begin(); it != m_supportedModes.end(); ++it ) + { + ValueList::Item const& item = *it; + + if (item.m_value == mode) { + validMode = true; + break; + } + } + + if( validMode ) + { + // We have received the thermostat mode from the Z-Wave device + if( ValueList* valueList = static_cast( GetValue( _instance, 0 ) ) ) + { + valueList->OnValueRefreshed( mode ); + Log::Write( LogLevel_Info, GetNodeId(), "Received thermostat mode: %s", valueList->GetItem().m_label.c_str() ); + valueList->Release(); + } + else + { + Log::Write( LogLevel_Info, GetNodeId(), "Received thermostat mode: index %d", mode ); + } + } + else + { + Log::Write( LogLevel_Info, GetNodeId(), "Received unknown thermostat mode: index %d", mode ); + } + return true; + } + + if( ThermostatModeCmd_SupportedReport == (ThermostatModeCmd)_data[0] ) + { + // We have received the supported thermostat modes from the Z-Wave device + // these values are used to populate m_supportedModes which, in turn, is used to "seed" the values + // for each m_modes instance + Log::Write( LogLevel_Info, GetNodeId(), "Received supported thermostat modes" ); + + m_supportedModes.clear(); + for( uint32 i=1; i<_length-1; ++i ) + { + for( int32 bit=0; bit<8; ++bit ) + { + if( ( _data[i] & (1<= (sizeof(c_modeName)/sizeof(*c_modeName) -1)) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received unknown thermostat mode: 0x%x", item.m_value); + } + else + { + item.m_label = c_modeName[item.m_value]; + m_supportedModes.push_back( item ); + + Log::Write( LogLevel_Info, GetNodeId(), " Added mode: %s", c_modeName[item.m_value] ); + } + } + } + } + + ClearStaticRequest( StaticRequest_Values ); + CreateVars( _instance ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set the device's thermostat mode +//----------------------------------------------------------------------------- +bool ThermostatMode::SetValue +( + Value const& _value +) +{ + if( ValueID::ValueType_List == _value.GetID().GetType() ) + { + ValueList const* value = static_cast(&_value); + uint8 state = (uint8)value->GetItem().m_value; + + Msg* msg = new Msg( "ThermostatModeCmd_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( ThermostatModeCmd_Set ); + msg->Append( state ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void ThermostatMode::CreateVars +( + uint8 const _instance +) +{ + // There are three ways to get here...each needs to be handled differently: + // QueryStage_ProtocolInfo: + // Don't know what's supported yet, so do nothing + // QueryStage_NodeInfo: + // Need to create the instance so the values can be read from the xml file + // QueryStage_Static: + // Need to create the instance (processing SupportedReport) if it doesn't exist + // If it does, populate with the appropriate values + + if( Node* node = GetNodeUnsafe() ) + { + Node::QueryStage qs = node->GetCurrentQueryStage(); + if( qs == Node::QueryStage_ProtocolInfo ) + { + // this call is from QueryStage_ProtocolInfo, + // so just return (don't know which modes are supported yet) + return; + } + + // identify the lowest supported mode as the "default" (or default to 0 if no supported modes identified yet) + int32 defaultValue = 0; + if( !m_supportedModes.empty() ) + { + defaultValue = m_supportedModes[0].m_value; + } + + if( qs == Node::QueryStage_Static ) + { + // This instance might already have been created (in NodeInfo, in preparation for loading the values + // from zwcfg xml file). So, if the instance already exists, we delete its value and add a new one below + if( ValueList* valueList = static_cast( GetValue( _instance, 0 ) ) ) + { + node->RemoveValueList( valueList ); + valueList->Release(); + } + } + + node->CreateValueList( ValueID::ValueGenre_User, GetCommandClassId(), _instance, 0, "Mode", "", false, false, 1, m_supportedModes, defaultValue, 0 ); + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatMode.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatMode.h new file mode 100644 index 0000000..1eccb19 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatMode.h @@ -0,0 +1,76 @@ +//----------------------------------------------------------------------------- +// +// ThermostatMode.h +// +// Implementation of the Z-Wave COMMAND_CLASS_THERMOSTAT_MODE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ThermostatMode_H +#define _ThermostatMode_H + +#include +#include +#include "CommandClass.h" +#include "../value_classes/ValueList.h" + +namespace OpenZWave +{ + class ValueList; + + /** \brief Implements COMMAND_CLASS_THERMOSTAT_MODE (0x40), a Z-Wave device command class. + */ + class ThermostatMode: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new ThermostatMode( _homeId, _nodeId ); } + virtual ~ThermostatMode(){} + + static uint8 const StaticGetCommandClassId(){ return 0x40; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_THERMOSTAT_MODE"; } + + // From CommandClass + virtual void ReadXML( TiXmlElement const* _ccElement ); + virtual void WriteXML( TiXmlElement* _ccElement ); + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _getTypeEnum, uint8 const _dummy, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + ThermostatMode( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){ SetStaticRequest( StaticRequest_Values ); } + + vector m_supportedModes; + }; + +} // namespace OpenZWave + +#endif + + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatOperatingState.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatOperatingState.cpp new file mode 100644 index 0000000..e1f5083 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatOperatingState.cpp @@ -0,0 +1,154 @@ +//----------------------------------------------------------------------------- +// +// ThermostatOperatingState.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_THERMOSTAT_OPERATING_STATE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "ThermostatOperatingState.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueString.h" + +using namespace OpenZWave; + +enum ThermostatOperatingStateCmd +{ + ThermostatOperatingStateCmd_Get = 0x02, + ThermostatOperatingStateCmd_Report = 0x03 +}; + +static char const* c_stateName[] = +{ + "Idle", + "Heating", + "Cooling", + "Fan Only", + "Pending Heat", + "Pending Cool", + "Vent / Economizer", + "State 07", // Undefined states. May be used in the future. + "State 08", + "State 09", + "State 10", + "State 11", + "State 12", + "State 13", + "State 14", + "State 15" +}; + +//----------------------------------------------------------------------------- +// +// Get the static thermostat mode details from the device +//----------------------------------------------------------------------------- +bool ThermostatOperatingState::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _requestFlags & RequestFlag_Dynamic ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Get a thermostat mode value from the device +//----------------------------------------------------------------------------- +bool ThermostatOperatingState::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "ThermostatOperatingStateCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( ThermostatOperatingStateCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "ThermostatOperatingStateCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool ThermostatOperatingState::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( ThermostatOperatingStateCmd_Report == (ThermostatOperatingStateCmd)_data[0] ) + { + // We have received the thermostat operating state from the Z-Wave device + if( ValueString* valueString = static_cast( GetValue( _instance, 0 ) ) ) + { + /* no need bounds checking on c_stateName here, as it can only be 1 Byte anyway */ + valueString->OnValueRefreshed( c_stateName[_data[1]&0x0f] ); + valueString->Release(); + Log::Write( LogLevel_Info, GetNodeId(), "Received thermostat operating state: %s", valueString->GetValue().c_str() ); + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void ThermostatOperatingState::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueString( ValueID::ValueGenre_User, GetCommandClassId(), _instance, 0, "Operating State", "", true, false, c_stateName[0], 0 ); + } +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatOperatingState.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatOperatingState.h new file mode 100644 index 0000000..3cb271a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatOperatingState.h @@ -0,0 +1,71 @@ +//----------------------------------------------------------------------------- +// +// ThermostatOperatingState.h +// +// Implementation of the Z-Wave COMMAND_CLASS_THERMOSTAT_OPERATING_STATE +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ThermostatOperatingState_H +#define _ThermostatOperatingState_H + +#include +#include +#include "CommandClass.h" +#include "../value_classes/ValueList.h" + +namespace OpenZWave +{ + class ValueString; + + /** \brief Implements COMMAND_CLASS_THERMOSTAT_OPERATING_STATE (0x42), a Z-Wave device command class. + */ + class ThermostatOperatingState: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new ThermostatOperatingState( _homeId, _nodeId ); } + virtual ~ThermostatOperatingState(){} + + static uint8 const StaticGetCommandClassId(){ return 0x42; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_THERMOSTAT_OPERATING_STATE"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + ThermostatOperatingState( uint32 const _homeId, uint8 const _nodeId ): CommandClass( _homeId, _nodeId ){} + }; + +} // namespace OpenZWave + +#endif + + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatSetpoint.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatSetpoint.cpp new file mode 100644 index 0000000..5c47a7e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatSetpoint.cpp @@ -0,0 +1,323 @@ +//----------------------------------------------------------------------------- +// +// ThermostatSetpoint.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_THERMOSTAT_SETPOINT +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "ThermostatSetpoint.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueDecimal.h" + +#include "../tinyxml.h" + +using namespace OpenZWave; + +enum ThermostatSetpointCmd +{ + ThermostatSetpointCmd_Set = 0x01, + ThermostatSetpointCmd_Get = 0x02, + ThermostatSetpointCmd_Report = 0x03, + ThermostatSetpointCmd_SupportedGet = 0x04, + ThermostatSetpointCmd_SupportedReport = 0x05 +}; + +enum +{ + ThermostatSetpoint_Unused0 = 0, + ThermostatSetpoint_Heating1, + ThermostatSetpoint_Cooling1, + ThermostatSetpoint_Unused3, + ThermostatSetpoint_Unused4, + ThermostatSetpoint_Unused5, + ThermostatSetpoint_Unused6, + ThermostatSetpoint_Furnace, + ThermostatSetpoint_DryAir, + ThermostatSetpoint_MoistAir, + ThermostatSetpoint_AutoChangeover, + ThermostatSetpoint_HeatingEcon, + ThermostatSetpoint_CoolingEcon, + ThermostatSetpoint_AwayHeating, + ThermostatSetpoint_Count +}; + +static char const* c_setpointName[] = +{ + "Unused 0", + "Heating 1", + "Cooling 1", + "Unused 3", + "Unused 4", + "Unused 5", + "Unused 6", + "Furnace", + "Dry Air", + "Moist Air", + "Auto Changeover", + "Heating Econ", + "Cooling Econ", + "Away Heating" +}; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ThermostatSetpoint::ThermostatSetpoint +( + uint32 const _homeId, + uint8 const _nodeId +): + CommandClass( _homeId, _nodeId ), m_setPointBase( 1 ) +{ + SetStaticRequest( StaticRequest_Values ); +} + +//----------------------------------------------------------------------------- +// +// Read the saved change-counter value +//----------------------------------------------------------------------------- +void ThermostatSetpoint::ReadXML +( + TiXmlElement const* _ccElement +) +{ + CommandClass::ReadXML( _ccElement ); + + int intVal; + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "base", &intVal ) ) + { + m_setPointBase = (uint8)intVal; + } +} + +//----------------------------------------------------------------------------- +// +// Write the change-counter value +//----------------------------------------------------------------------------- +void ThermostatSetpoint::WriteXML +( + TiXmlElement* _ccElement +) +{ + CommandClass::WriteXML( _ccElement ); + + char str[8]; + snprintf( str, 8, "%d", m_setPointBase ); + _ccElement->SetAttribute( "base", str ); +} + +//----------------------------------------------------------------------------- +// +// Get the static thermostat setpoint details from the device +//----------------------------------------------------------------------------- +bool ThermostatSetpoint::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + bool requests = false; + if( ( _requestFlags & RequestFlag_Static ) && HasStaticRequest( StaticRequest_Values ) ) + { + requests |= RequestValue( _requestFlags, 0xff, _instance, _queue ); + } + + if( _requestFlags & RequestFlag_Session ) + { + for( uint8 i=0; i +// Request current state from the device +//----------------------------------------------------------------------------- +bool ThermostatSetpoint::RequestValue +( + uint32 const _requestFlags, + uint8 const _setPointIndex, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _setPointIndex == 0xff ) // check for supportedget + { + // Request the supported setpoints + Msg* msg = new Msg( "ThermostatSetpointCmd_SupportedGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( ThermostatSetpointCmd_SupportedGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } + if ( !IsGetSupported() ) + { + Log::Write( LogLevel_Info, GetNodeId(), "ThermostatSetpointCmd_Get Not Supported on this node"); + return false; + } + Value* value = GetValue( 1, _setPointIndex ); + if( value != NULL ) + { + value->Release(); + // Request the setpoint value + Msg* msg = new Msg( "ThermostatSetpointCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( ThermostatSetpointCmd_Get ); + msg->Append( _setPointIndex ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool ThermostatSetpoint::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( ThermostatSetpointCmd_Report == (ThermostatSetpointCmd)_data[0] ) + { + // We have received a thermostat setpoint value from the Z-Wave device + if( ValueDecimal* value = static_cast( GetValue( _instance, _data[1] ) ) ) + { + uint8 scale; + uint8 precision = 0; + string temperature = ExtractValue( &_data[2], &scale, &precision ); + + value->SetUnits( scale ? "F" : "C" ); + value->OnValueRefreshed( temperature ); + if( value->GetPrecision() != precision ) + { + value->SetPrecision( precision ); + } + value->Release(); + + Log::Write( LogLevel_Info, GetNodeId(), "Received thermostat setpoint report: Setpoint %s = %s%s", value->GetLabel().c_str(), value->GetValue().c_str(), value->GetUnits().c_str() ); + } + return true; + } + + if( ThermostatSetpointCmd_SupportedReport == (ThermostatSetpointCmd)_data[0] ) + { + if( Node* node = GetNodeUnsafe() ) + { + // We have received the supported thermostat setpoints from the Z-Wave device + Log::Write( LogLevel_Info, GetNodeId(), "Received supported thermostat setpoints" ); + + // Parse the data for the supported setpoints + for( uint32 i=1; i<_length-1; ++i ) + { + for( int32 bit=0; bit<8; ++bit ) + { + if( ( _data[i] & (1<CreateValueDecimal( ValueID::ValueGenre_User, GetCommandClassId(), _instance, index, c_setpointName[index], "C", false, false, "0.0", 0 ); + Log::Write( LogLevel_Info, GetNodeId(), " Added setpoint: %s", c_setpointName[index] ); + } + } + } + } + } + + ClearStaticRequest( StaticRequest_Values ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a thermostat setpoint temperature +//----------------------------------------------------------------------------- +bool ThermostatSetpoint::SetValue +( + Value const& _value +) +{ + if( ValueID::ValueType_Decimal == _value.GetID().GetType() ) + { + ValueDecimal const* value = static_cast(&_value); + uint8 scale = strcmp( "C", value->GetUnits().c_str() ) ? 1 : 0; + + Msg* msg = new Msg( "Set Thermostat Setpoint", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 4 + GetAppendValueSize( value->GetValue() ) ); + msg->Append( GetCommandClassId() ); + msg->Append( ThermostatSetpointCmd_Set ); + msg->Append( value->GetID().GetIndex() ); + AppendValue( msg, value->GetValue(), scale ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void ThermostatSetpoint::CreateVars +( + uint8 const _instance, + uint8 const _index +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueDecimal( ValueID::ValueGenre_User, GetCommandClassId(), _instance, _index, "Setpoint", "C", false, false, "0.0", 0 ); + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatSetpoint.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatSetpoint.h new file mode 100644 index 0000000..9249186 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/ThermostatSetpoint.h @@ -0,0 +1,73 @@ +//----------------------------------------------------------------------------- +// +// ThermostatSetpoint.h +// +// Implementation of the Z-Wave COMMAND_CLASS_THERMOSTAT_SETPOINT +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ThermostatSetpoint_H +#define _ThermostatSetpoint_H + +#include +#include +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueDecimal; + + /** \brief Implements COMMAND_CLASS_THERMOSTAT_SETPOINT (0x43), a Z-Wave device command class. + */ + class ThermostatSetpoint: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new ThermostatSetpoint( _homeId, _nodeId ); } + virtual ~ThermostatSetpoint(){} + + static uint8 const StaticGetCommandClassId(){ return 0x43; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_THERMOSTAT_SETPOINT"; } + + // From CommandClass + virtual void ReadXML( TiXmlElement const* _ccElement ); + virtual void WriteXML( TiXmlElement* _ccElement ); + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _setPointIndex, uint8 const _dummy, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + public: + virtual void CreateVars( uint8 const _instance, uint8 const _index ); + + private: + ThermostatSetpoint( uint32 const _homeId, uint8 const _nodeId ); + uint8 m_setPointBase; + }; + +} // namespace OpenZWave + +#endif + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/TimeParameters.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/TimeParameters.cpp new file mode 100644 index 0000000..eae70cc --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/TimeParameters.cpp @@ -0,0 +1,236 @@ +//----------------------------------------------------------------------------- +// +// TimeParameters.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_TIME_PARAMETERS +// +// Copyright (c) 2014 Justin Hammond +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include +#include "CommandClasses.h" +#include "TimeParameters.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Node.h" +#include "../Driver.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueButton.h" +#include "../value_classes/ValueString.h" + +using namespace OpenZWave; + +enum TimeParametersCmd +{ + TimeParametersCmd_Set = 0x01, + TimeParametersCmd_Get = 0x02, + TimeParametersCmd_Report = 0x03 +}; + +enum +{ + TimeParametersIndex_Date = 0, + TimeParametersIndex_Time, + TimeParametersIndex_Set, + TimeParametersIndex_Refresh +}; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +TimeParameters::TimeParameters +( + uint32 const _homeId, + uint8 const _nodeId +): + CommandClass( _homeId, _nodeId ) +{ + SetStaticRequest( StaticRequest_Values ); +} + + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool TimeParameters::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( ( _requestFlags & RequestFlag_Static ) && HasStaticRequest( StaticRequest_Values ) ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool TimeParameters::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 (not used) + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "TimeParametersCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, _instance ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( TimeParametersCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "TimeParametersCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool TimeParameters::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if (TimeParametersCmd_Report == (TimeParametersCmd)_data[0]) + { + uint16 year = (_data[1] << 8) + (_data[2] & 0xFF); + uint8 month = (_data[3] & 0x0F); + uint8 day = (_data[4] & 0x1F); + uint8 hour = (_data[5] & 0x1F); + uint8 minute = (_data[6] & 0x3F); + uint8 second = (_data[7] & 0x3F); + + Log::Write( LogLevel_Info, GetNodeId(), "Received TimeParameters report: %02d/%02d/%04d %02d:%02d:%02d", (int)day, (int)month, (int)year, (int)hour, (int)minute, (int)second); + if( ValueString* value = static_cast( GetValue( _instance, TimeParametersIndex_Date ) ) ) + { + char msg[512]; + snprintf(msg, sizeof(msg), "%02d/%02d/%04d", (int)day, (int)month, (int)year); + value->OnValueRefreshed( msg ); + value->Release(); + } + if( ValueString* value = static_cast( GetValue( _instance, TimeParametersIndex_Time ) ) ) + { + char msg[512]; + snprintf(msg, sizeof(msg), "%02d:%02d:%02d", (int)hour, (int)minute, (int)second); + value->OnValueRefreshed( msg ); + value->Release(); + } + ClearStaticRequest( StaticRequest_Values ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a value in the Z-Wave device +//----------------------------------------------------------------------------- +bool TimeParameters::SetValue +( + Value const& _value +) +{ + bool ret = false; + + uint8 instance = _value.GetID().GetInstance(); + + if ( (ValueID::ValueType_Button == _value.GetID().GetType()) && (_value.GetID().GetIndex() == TimeParametersIndex_Set) ) + { + time_t rawtime; + struct tm *timeinfo; + time(&rawtime); + timeinfo = localtime(&rawtime); + Msg* msg = new Msg( "TimeParametersCmd_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->SetInstance( this, instance ); + msg->Append( GetNodeId() ); + msg->Append( 9 ); + msg->Append( GetCommandClassId() ); + msg->Append( TimeParametersCmd_Set ); + /* Year 1 */ + msg->Append( ((timeinfo->tm_year + 1900)>> 8) & 0xFF); + /* Year 2 */ + msg->Append( ((timeinfo->tm_year + 1900) & 0xFF)); + /* Month */ + msg->Append( (timeinfo->tm_mon & 0x0F)+1); + /* Day */ + msg->Append( (timeinfo->tm_mday & 0x1F)); + /* Hour */ + msg->Append( (timeinfo->tm_hour & 0x1F)); + /* Minute */ + msg->Append( (timeinfo->tm_min & 0x3F)); + /* Second */ + msg->Append( (timeinfo->tm_sec & 0x3F)); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + + + /* Refresh after we send updated date/time */ + SetStaticRequest( StaticRequest_Values ); + ret = RequestValue( RequestFlag_Static, 0, instance, Driver::MsgQueue_Query ); + } + if ( (ValueID::ValueType_Button == _value.GetID().GetType()) && (_value.GetID().GetIndex() == TimeParametersIndex_Refresh) ) + { + SetStaticRequest( StaticRequest_Values ); + ret = RequestValue( RequestFlag_Static, 0, instance, Driver::MsgQueue_Query ); + } + + return ret; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void TimeParameters::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueString( ValueID::ValueGenre_System, GetCommandClassId(), _instance, TimeParametersIndex_Date, "Date", "", true, false, "", 0 ); + node->CreateValueString( ValueID::ValueGenre_System, GetCommandClassId(), _instance, TimeParametersIndex_Time, "Time", "", true, false, "", 0 ); + node->CreateValueButton( ValueID::ValueGenre_System, GetCommandClassId(), _instance, TimeParametersIndex_Set, "Set Date/Time", 0); + node->CreateValueButton( ValueID::ValueGenre_System, GetCommandClassId(), _instance, TimeParametersIndex_Refresh, "Refresh Date/Time", 0); + + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/TimeParameters.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/TimeParameters.h new file mode 100644 index 0000000..51d10a0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/TimeParameters.h @@ -0,0 +1,67 @@ +//----------------------------------------------------------------------------- +// +// TimeParameters.h +// +// Implementation of the Z-Wave COMMAND_CLASS_TIME_PARAMETERS +// +// Copyright (c) 2014 Justin Hammond +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _TimeParameters_H +#define _TimeParameters_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueByte; + class ValueList; + + /** \brief Implements COMMAND_CLASS_TIME_PARAMETERS (0x8B), a Z-Wave device command class. + */ + class TimeParameters: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new TimeParameters( _homeId, _nodeId ); } + virtual ~TimeParameters(){} + + static uint8 const StaticGetCommandClassId(){ return 0x8B; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_TIME_PARAMETERS"; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + TimeParameters( uint32 const _homeId, uint8 const _nodeId ); + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/UserCode.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/UserCode.cpp new file mode 100644 index 0000000..4409282 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/UserCode.cpp @@ -0,0 +1,355 @@ +//----------------------------------------------------------------------------- +// +// UserCode.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_USER_CODE +// +// Copyright (c) 2012 Greg Satz +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "../tinyxml.h" +#include "CommandClasses.h" +#include "UserCode.h" +#include "../Node.h" +#include "../Options.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueByte.h" +#include "../value_classes/ValueRaw.h" + +using namespace OpenZWave; + +enum UserCodeCmd +{ + UserCodeCmd_Set = 0x01, + UserCodeCmd_Get = 0x02, + UserCodeCmd_Report = 0x03, + UserNumberCmd_Get = 0x04, + UserNumberCmd_Report = 0x05 +}; + +enum +{ + UserCodeIndex_Refresh = 254, + UserCodeIndex_Count = 255 +}; + +const uint8 UserCodeLength = 10; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +UserCode::UserCode +( + uint32 const _homeId, + uint8 const _nodeId +): + CommandClass( _homeId, _nodeId ), + m_queryAll( false ), + m_currentCode( 0 ), + m_userCodeCount( 0 ), + m_refreshUserCodes(false) +{ + SetStaticRequest( StaticRequest_Values ); + memset( m_userCodesStatus, 0xff, sizeof(m_userCodesStatus) ); + Options::Get()->GetOptionAsBool("RefreshAllUserCodes", &m_refreshUserCodes ); + +} + +//----------------------------------------------------------------------------- +// +// Class specific configuration +//----------------------------------------------------------------------------- +void UserCode::ReadXML +( + TiXmlElement const* _ccElement +) +{ + int32 intVal; + + CommandClass::ReadXML( _ccElement ); + if( TIXML_SUCCESS == _ccElement->QueryIntAttribute( "codes", &intVal ) ) + { + m_userCodeCount = intVal; + } +} + +//----------------------------------------------------------------------------- +// +// Class specific configuration +//----------------------------------------------------------------------------- +void UserCode::WriteXML +( + TiXmlElement* _ccElement +) +{ + char str[32]; + + CommandClass::WriteXML( _ccElement ); + snprintf( str, sizeof(str), "%d", m_userCodeCount ); + _ccElement->SetAttribute( "codes", str); +} + +//----------------------------------------------------------------------------- +// +// Nothing to do for UserCode +//----------------------------------------------------------------------------- +bool UserCode::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + bool requests = false; + if( ( _requestFlags & RequestFlag_Static ) && HasStaticRequest( StaticRequest_Values ) ) + { + requests |= RequestValue( _requestFlags, UserCodeIndex_Count, _instance, _queue ); + } + + if( _requestFlags & RequestFlag_Session ) + { + if( m_userCodeCount > 0 ) + { + m_queryAll = true; + m_currentCode = 1; + requests |= RequestValue( _requestFlags, m_currentCode, _instance, _queue ); + } + } + + return requests; +} + +//----------------------------------------------------------------------------- +// +// Nothing to do for UserCode +//----------------------------------------------------------------------------- +bool UserCode::RequestValue +( + uint32 const _requestFlags, + uint8 const _userCodeIdx, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _instance != 1 ) + { + // This command class doesn't work with multiple instances + return false; + } + if ( !IsGetSupported() ) + { + Log::Write( LogLevel_Info, GetNodeId(), "UserNumberCmd_Get Not Supported on this node"); + return false; + } + if( _userCodeIdx == UserCodeIndex_Count ) + { + // Get number of supported user codes. + Msg* msg = new Msg( "UserNumberCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( UserNumberCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } + if (_userCodeIdx == 0) + { + Log::Write( LogLevel_Warning, GetNodeId(), "UserCodeCmd_Get with Index 0 not Supported"); + return false; + } + Msg* msg = new Msg( "UserCodeCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( UserCodeCmd_Get ); + msg->Append( _userCodeIdx ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool UserCode::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( UserNumberCmd_Report == (UserCodeCmd)_data[0] ) + { + m_userCodeCount = _data[1]; + if( m_userCodeCount > 254 ) + { + // Make space for code count. + m_userCodeCount = 254; + } + ClearStaticRequest( StaticRequest_Values ); + if( m_userCodeCount == 0 ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received User Number report from node %d: Not supported", GetNodeId() ); + } + else + { + Log::Write( LogLevel_Info, GetNodeId(), "Received User Number report from node %d: Supported Codes %d (%d)", GetNodeId(), m_userCodeCount, _data[1] ); + } + + if( ValueByte* value = static_cast( GetValue( _instance, UserCodeIndex_Count ) ) ) + { + value->OnValueRefreshed( m_userCodeCount ); + value->Release(); + } + + if( Node* node = GetNodeUnsafe() ) + { + uint8 data[UserCodeLength]; + + memset( data, 0, UserCodeLength ); + for( uint8 i = 0; i <= m_userCodeCount; i++ ) + { + char str[16]; + if (i == 0) + { + snprintf( str, sizeof(str), "Enrollment Code"); + node->CreateValueRaw( ValueID::ValueGenre_User, GetCommandClassId(), _instance, i, str, "", true, false, data, UserCodeLength, 0 ); + } + else + { + snprintf( str, sizeof(str), "Code %d:", i); + node->CreateValueRaw( ValueID::ValueGenre_User, GetCommandClassId(), _instance, i, str, "", false, false, data, UserCodeLength, 0 ); + } + } + } + return true; + } + else if( UserCodeCmd_Report == (UserCodeCmd)_data[0] ) + { + int i = _data[1]; + if( ValueRaw* value = static_cast( GetValue( _instance, i ) ) ) + { + uint8 data[UserCodeLength]; + uint8 size = _length - 4; + if( size > UserCodeLength ) + { + Log::Write( LogLevel_Warning, GetNodeId(), "User Code length %d is larger then maximum %d", size, UserCodeLength ); + size = UserCodeLength; + } + m_userCodesStatus[i] = _data[2]; + memcpy( data, &_data[3], size ); + value->OnValueRefreshed( data, size ); + value->Release(); + } + Log::Write( LogLevel_Info, GetNodeId(), "Received User Code Report from node %d for User Code %d (%s)", GetNodeId(), i, CodeStatus( _data[2] ).c_str() ); + if( m_queryAll && i == m_currentCode ) + { + + if (m_refreshUserCodes && (_data[2] != UserCode_Available)) { + if( ++i <= m_userCodeCount ) + { + m_currentCode = i; + RequestValue( 0, m_currentCode, _instance, Driver::MsgQueue_Query ); + } + else + { + m_queryAll = false; + /* we might have reset this as part of the RefreshValues Button Value */ + Options::Get()->GetOptionAsBool("RefreshAllUserCodes", &m_refreshUserCodes ); + } + } else { + Log::Write( LogLevel_Info, GetNodeId(), "Not Requesting additional UserCode Slots as RefreshAllUserCodes is false, and slot %d is available", i); + m_queryAll = false; + } + } + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set a User Code value +//----------------------------------------------------------------------------- +bool UserCode::SetValue +( + Value const& _value +) +{ + if( (ValueID::ValueType_Raw == _value.GetID().GetType()) && (_value.GetID().GetIndex() < UserCodeIndex_Refresh) ) + { + ValueRaw const* value = static_cast(&_value); + uint8* s = value->GetValue(); + uint8 len = value->GetLength(); + + if( len > UserCodeLength ) + { + return false; + } + m_userCodesStatus[value->GetID().GetIndex()] = UserCode_Occupied; + Msg* msg = new Msg( "UserCodeCmd_Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->SetInstance( this, _value.GetID().GetInstance() ); + msg->Append( GetNodeId() ); + msg->Append( 4 + len ); + msg->Append( GetCommandClassId() ); + msg->Append( UserCodeCmd_Set ); + msg->Append( value->GetID().GetIndex() ); + msg->Append( UserCode_Occupied ); + for( uint8 i = 0; i < len; i++ ) + { + msg->Append( s[i] ); + } + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + if ( (ValueID::ValueType_Button == _value.GetID().GetType()) && (_value.GetID().GetIndex() == UserCodeIndex_Refresh) ) + { + m_refreshUserCodes = true; + m_currentCode = 1; + m_queryAll = true; + RequestValue( 0, m_currentCode, _value.GetID().GetInstance(), Driver::MsgQueue_Query ); + return true; + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void UserCode::CreateVars +( + uint8 const _instance + +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueByte( ValueID::ValueGenre_System, GetCommandClassId(), _instance, UserCodeIndex_Count, "Code Count", "", true, false, 0, 0 ); + node->CreateValueButton( ValueID::ValueGenre_System, GetCommandClassId(), _instance, UserCodeIndex_Refresh, "Refresh All UserCodes", 0); + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/UserCode.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/UserCode.h new file mode 100644 index 0000000..2665ee2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/UserCode.h @@ -0,0 +1,113 @@ +//----------------------------------------------------------------------------- +// +// UserCode.h +// +// Implementation of the Z-Wave COMMAND_CLASS_USER_CODE +// +// Copyright (c) 2012 Greg Satz +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _UserCode_H +#define _UserCode_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + /** \brief Implements COMMAND_CLASS_USER_CODE (0x63), a Z-Wave device command class. + */ + class UserCode: public CommandClass + { + public: + enum UserCodeStatus + { + UserCode_Available = 0x00, + UserCode_Occupied = 0x01, + UserCode_Reserved = 0x02, + UserCode_NotAvailable = 0xfe, + UserCode_Unset = 0xff + }; + + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new UserCode( _homeId, _nodeId ); } + virtual ~UserCode(){} + + static uint8 const StaticGetCommandClassId(){ return 0x63; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_USER_CODE"; } + + // From CommandClass + virtual void ReadXML( TiXmlElement const* _ccElement ); + virtual void WriteXML( TiXmlElement* _ccElement ); + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + UserCode( uint32 const _homeId, uint8 const _nodeId ); + + string CodeStatus( uint8 const _byte ) + { + switch( _byte ) + { + case UserCode_Available: + { + return "Available"; + } + case UserCode_Occupied: + { + return "Occupied"; + } + case UserCode_Reserved: + { + return "Reserved"; + } + case UserCode_NotAvailable: + { + return "Not Available"; + } + case UserCode_Unset: + { + return "Unset"; + } + default: + { + return "Unknown"; + } + } + } + + bool m_queryAll; // True while we are requesting all the user codes. + uint8 m_currentCode; + uint8 m_userCodeCount; + uint8 m_userCodesStatus[256]; + bool m_refreshUserCodes; + }; + +} // namespace OpenZWave + +#endif + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Version.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Version.cpp new file mode 100644 index 0000000..1d13dad --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Version.cpp @@ -0,0 +1,263 @@ +//----------------------------------------------------------------------------- +// +// Version.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_VERSION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "Version.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../Node.h" +#include "../platform/Log.h" + +#include "../value_classes/ValueString.h" + +#include "../tinyxml.h" + +using namespace OpenZWave; + +enum VersionCmd +{ + VersionCmd_Get = 0x11, + VersionCmd_Report = 0x12, + VersionCmd_CommandClassGet = 0x13, + VersionCmd_CommandClassReport = 0x14 +}; + +enum +{ + VersionIndex_Library = 0, + VersionIndex_Protocol, + VersionIndex_Application +}; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Version::Version +( + uint32 const _homeId, + uint8 const _nodeId +): + CommandClass( _homeId, _nodeId ), + m_classGetSupported( true ) +{ + SetStaticRequest( StaticRequest_Values ); +} + +//----------------------------------------------------------------------------- +// +// Read configuration. +//----------------------------------------------------------------------------- +void Version::ReadXML +( + TiXmlElement const* _ccElement +) +{ + CommandClass::ReadXML( _ccElement ); + + char const* str = _ccElement->Attribute("classgetsupported"); + if( str ) + { + m_classGetSupported = !strcmp( str, "true"); + } +} + +//----------------------------------------------------------------------------- +// +// Save changed configuration +//----------------------------------------------------------------------------- +void Version::WriteXML +( + TiXmlElement* _ccElement +) +{ + CommandClass::WriteXML( _ccElement ); + + if( !m_classGetSupported ) + { + _ccElement->SetAttribute( "classgetsupported", "false" ); + } +} + +//----------------------------------------------------------------------------- +// +// Request current state from the device +//----------------------------------------------------------------------------- +bool Version::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( ( _requestFlags & RequestFlag_Static ) && HasStaticRequest( StaticRequest_Values ) ) + { + return RequestValue( _requestFlags, 0, _instance, _queue ); + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request current value from the device +//----------------------------------------------------------------------------- +bool Version::RequestValue +( + uint32 const _requestFlags, + uint8 const _dummy1, // = 0 + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _instance != 1 ) + { + // This command class doesn't work with multiple instances + return false; + } + if ( IsGetSupported() ) + { + Msg* msg = new Msg( "VersionCmd_Get", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( VersionCmd_Get ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } else { + Log::Write( LogLevel_Info, GetNodeId(), "VersionCmd_Get Not Supported on this node"); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool Version::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( Node* node = GetNodeUnsafe() ) + { + if( VersionCmd_Report == (VersionCmd)_data[0] ) + { + char library[8]; + char protocol[16]; + char application[16]; + + snprintf( library, sizeof(library), "%d", _data[1] ); + snprintf( protocol, sizeof(protocol), "%d.%.2d", _data[2], _data[3] ); + snprintf( application, sizeof(application), "%d.%.2d", _data[4], _data[5] ); + + Log::Write( LogLevel_Info, GetNodeId(), "Received Version report from node %d: Library=%s, Protocol=%s, Application=%s", GetNodeId(), library, protocol, application ); + ClearStaticRequest( StaticRequest_Values ); + + if( ValueString* libraryValue = static_cast( GetValue( _instance, VersionIndex_Library ) ) ) + { + libraryValue->OnValueRefreshed( library ); + libraryValue->Release(); + } + if( ValueString* protocolValue = static_cast( GetValue( _instance, VersionIndex_Protocol ) ) ) + { + protocolValue->OnValueRefreshed( protocol ); + protocolValue->Release(); + } + if( ValueString* applicationValue = static_cast( GetValue( _instance, VersionIndex_Application ) ) ) + { + applicationValue->OnValueRefreshed( application ); + applicationValue->Release(); + } + + return true; + } + + if (VersionCmd_CommandClassReport == (VersionCmd)_data[0]) + { + if( CommandClass* pCommandClass = node->GetCommandClass( _data[1] ) ) + { + Log::Write( LogLevel_Info, GetNodeId(), "Received Command Class Version report from node %d: CommandClass=%s, Version=%d", GetNodeId(), pCommandClass->GetCommandClassName().c_str(), _data[2] ); + pCommandClass->ClearStaticRequest( StaticRequest_Version ); + pCommandClass->SetVersion( _data[2] ); + } + + return true; + } + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Request the version of a command class used by the device +//----------------------------------------------------------------------------- +bool Version::RequestCommandClassVersion +( + CommandClass const* _commandClass +) +{ + if( m_classGetSupported ) + { + if( _commandClass->HasStaticRequest( StaticRequest_Version ) ) + { + Msg* msg = new Msg( "VersionCmd_CommandClassGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 3 ); + msg->Append( GetCommandClassId() ); + msg->Append( VersionCmd_CommandClassGet ); + msg->Append( _commandClass->GetCommandClassId() ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_Send ); + return true; + } + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void Version::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + node->CreateValueString( ValueID::ValueGenre_System, GetCommandClassId(), _instance, VersionIndex_Library, "Library Version", "", true, false, "Unknown", 0 ); + node->CreateValueString( ValueID::ValueGenre_System, GetCommandClassId(), _instance, VersionIndex_Protocol, "Protocol Version", "", true, false, "Unknown", 0 ); + node->CreateValueString( ValueID::ValueGenre_System, GetCommandClassId(), _instance, VersionIndex_Application, "Application Version", "", true, false, "Unknown", 0 ); + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/Version.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Version.h new file mode 100644 index 0000000..13718e5 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/Version.h @@ -0,0 +1,71 @@ +//----------------------------------------------------------------------------- +// +// Version.h +// +// Implementation of the Z-Wave COMMAND_CLASS_VERSION +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Version_H +#define _Version_H + +#include "CommandClass.h" + +namespace OpenZWave +{ + class ValueString; + + /** \brief Implements COMMAND_CLASS_VERSION (0x86), a Z-Wave device command class. + */ + class Version: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new Version( _homeId, _nodeId ); } + virtual ~Version(){} + + static uint8 const StaticGetCommandClassId(){ return 0x86; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_VERSION"; } + + bool RequestCommandClassVersion( CommandClass const* _commandClass ); + + // From CommandClass + virtual void ReadXML( TiXmlElement const* _ccElement ); + virtual void WriteXML( TiXmlElement* _ccElement ); + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + Version( uint32 const _homeId, uint8 const _nodeId ); + + bool m_classGetSupported; + }; + +} // namespace OpenZWave + +#endif + diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/WakeUp.cpp b/lib/ESPiLight/pilight/libs/openzwave/command_classes/WakeUp.cpp new file mode 100644 index 0000000..4251956 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/WakeUp.cpp @@ -0,0 +1,502 @@ +//----------------------------------------------------------------------------- +// +// WakeUp.cpp +// +// Implementation of the Z-Wave COMMAND_CLASS_WAKE_UP +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "CommandClasses.h" +#include "WakeUp.h" +#include "MultiCmd.h" +#include "../Defs.h" +#include "../Msg.h" +#include "../Driver.h" +#include "../Node.h" +#include "../Notification.h" +#include "../Options.h" +#include "../platform/Log.h" +#include "../platform/Mutex.h" +#include "../value_classes/ValueInt.h" + +using namespace OpenZWave; + +enum WakeUpCmd +{ + WakeUpCmd_IntervalSet = 0x04, + WakeUpCmd_IntervalGet = 0x05, + WakeUpCmd_IntervalReport = 0x06, + WakeUpCmd_Notification = 0x07, + WakeUpCmd_NoMoreInformation = 0x08, + WakeUpCmd_IntervalCapabilitiesGet = 0x09, + WakeUpCmd_IntervalCapabilitiesReport = 0x0A +}; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +WakeUp::WakeUp +( + uint32 const _homeId, + uint8 const _nodeId +): + CommandClass( _homeId, _nodeId ), + m_mutex( new Mutex() ), + m_pollRequired( false ), + m_notification( false ) +{ + m_awake = true; + Options::Get()->GetOptionAsBool("AssumeAwake", &m_awake); + + SetStaticRequest( StaticRequest_Values ); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +WakeUp::~WakeUp +( +) +{ + m_mutex->Release(); + while( !m_pendingQueue.empty() ) + { + Driver::MsgQueueItem const& item = m_pendingQueue.front(); + if( Driver::MsgQueueCmd_SendMsg == item.m_command ) + { + delete item.m_msg; + } + else if( Driver::MsgQueueCmd_Controller == item.m_command ) + { + delete item.m_cci; + } + m_pendingQueue.pop_front(); + } +} + +//----------------------------------------------------------------------------- +// +// Starts the process of requesting node state from a sleeping device +//----------------------------------------------------------------------------- +void WakeUp::Init +( +) +{ + // Request the wake up interval. When we receive the response, we + // can send a set interval message with the same interval, but with + // the target node id set to that of the controller. This will ensure + // that the controller will receive the wake-up notifications from + // the device. Once this is done, we can request the rest of the node + // state. + RequestState( CommandClass::RequestFlag_Session, 1, Driver::MsgQueue_WakeUp ); +} + +//----------------------------------------------------------------------------- +// +// Nothing to do for wakeup +//----------------------------------------------------------------------------- +bool WakeUp::RequestState +( + uint32 const _requestFlags, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + bool requests = false; + if( ( _requestFlags & RequestFlag_Static ) && HasStaticRequest( StaticRequest_Values ) ) + { + if( GetVersion() > 1 ) + { + requests |= RequestValue( _requestFlags, WakeUpCmd_IntervalCapabilitiesGet, _instance, _queue ); + } + } + if( _requestFlags & RequestFlag_Session ) + { + Node* node = GetNodeUnsafe(); + if( node != NULL && !node->IsController() ) + { + requests |= RequestValue( _requestFlags, 0, _instance, _queue ); + } + } + + return requests; +} + +//----------------------------------------------------------------------------- +// +// Nothing to do for wakeup +//----------------------------------------------------------------------------- +bool WakeUp::RequestValue +( + uint32 const _requestFlags, + uint8 const _getTypeEnum, + uint8 const _instance, + Driver::MsgQueue const _queue +) +{ + if( _instance != 1 ) + { + // This command class doesn't work with multiple instances + return false; + } + + if( _getTypeEnum == WakeUpCmd_IntervalCapabilitiesGet ) + { + Msg* msg = new Msg( "WakeUpCmd_IntervalCapabilityGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( WakeUpCmd_IntervalCapabilitiesGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + } + + + if( _getTypeEnum == 0 ) + { + // We won't get a response until the device next wakes up + Msg* msg = new Msg( "WakeUpCmd_IntervalGet", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true, true, FUNC_ID_APPLICATION_COMMAND_HANDLER, GetCommandClassId() ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( WakeUpCmd_IntervalGet ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, _queue ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Handle a message from the Z-Wave network +//----------------------------------------------------------------------------- +bool WakeUp::HandleMsg +( + uint8 const* _data, + uint32 const _length, + uint32 const _instance // = 1 +) +{ + if( WakeUpCmd_IntervalReport == (WakeUpCmd)_data[0] ) + { + if( ValueInt* value = static_cast( GetValue( _instance, 0 ) ) ) + { + // some interval reports received are validly formatted (proper checksum, etc.) but only have length + // of 3 (0x84 (classid), 0x06 (IntervalReport), 0x00). Not sure what this means + if( _length < 6 ) + { + Log::Write( LogLevel_Warning, "" ); + Log::Write( LogLevel_Warning, GetNodeId(), "Unusual response: WakeUpCmd_IntervalReport with len = %d. Ignored.", _length ); + value->Release(); + return false; + } + + uint32 interval = ((uint32)_data[1]) << 16; + interval |= (((uint32)_data[2]) << 8); + interval |= (uint32)_data[3]; + + uint8 targetNodeId = _data[4]; + + Log::Write( LogLevel_Info, GetNodeId(), "Received Wakeup Interval report from node %d: Interval=%d, Target Node=%d", GetNodeId(), interval, targetNodeId ); + + value->OnValueRefreshed( (int32)interval ); + + // Ensure that the target node for wake-up notifications is the controller + // but only if node is not a listening device. Hybrid devices that can be + // powered by other then batteries shouldn't do this. + Node *node = GetNodeUnsafe(); + if( GetDriver()->GetNodeId() != targetNodeId && ((node) && (!node->IsListeningDevice())) ) + { + SetValue( *value ); + } + value->Release(); + } + return true; + } + else if( WakeUpCmd_Notification == (WakeUpCmd)_data[0] ) + { + // The device is awake. + Log::Write( LogLevel_Info, GetNodeId(), "Received Wakeup Notification from node %d", GetNodeId() ); + m_notification = true; + SetAwake( true ); + return true; + } + else if( WakeUpCmd_IntervalCapabilitiesReport == (WakeUpCmd)_data[0] ) + { + uint32 mininterval = (((uint32)_data[1]) << 16) | (((uint32)_data[2]) << 8) | ((uint32)_data[3]); + uint32 maxinterval = (((uint32)_data[4]) << 16) | (((uint32)_data[5]) << 8) | ((uint32)_data[6]); + uint32 definterval = (((uint32)_data[7]) << 16) | (((uint32)_data[8]) << 8) | ((uint32)_data[9]); + uint32 stepinterval = (((uint32)_data[10]) << 16) | (((uint32)_data[11]) << 8) | ((uint32)_data[12]); + Log::Write( LogLevel_Info, GetNodeId(), "Received Wakeup Interval Capability report from node %d: Min Interval=%d, Max Interval=%d, Default Interval=%d, Interval Step=%d", GetNodeId(), mininterval, maxinterval, definterval, stepinterval ); + if( ValueInt* value = static_cast( GetValue( _instance, 1 ) ) ) + { + value->OnValueRefreshed( (int32)mininterval ); + value->Release(); + } + if( ValueInt* value = static_cast( GetValue( _instance, 2 ) ) ) + { + value->OnValueRefreshed( (int32)maxinterval ); + value->Release(); + } + if( ValueInt* value = static_cast( GetValue( _instance, 3 ) ) ) + { + value->OnValueRefreshed( (int32)definterval ); + value->Release(); + } + if( ValueInt* value = static_cast( GetValue( _instance, 4 ) ) ) + { + value->OnValueRefreshed( (int32)stepinterval ); + value->Release(); + } + ClearStaticRequest( StaticRequest_Values ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set the device's wakeup interval +//----------------------------------------------------------------------------- +bool WakeUp::SetValue +( + Value const& _value +) +{ + if( ValueID::ValueType_Int == _value.GetID().GetType() ) + { + ValueInt const* value = static_cast(&_value); + + Msg* msg = new Msg( "Wakeup Interval Set", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->Append( GetNodeId() ); + + if( GetNodeUnsafe()->GetCommandClass( MultiCmd::StaticGetCommandClassId() ) ) + { + msg->Append( 10 ); + msg->Append( MultiCmd::StaticGetCommandClassId() ); + msg->Append( MultiCmd::MultiCmdCmd_Encap ); + msg->Append( 1 ); + } + + int32 interval = value->GetValue(); + + msg->Append( 6 ); // length of command bytes following + msg->Append( GetCommandClassId() ); + msg->Append( WakeUpCmd_IntervalSet ); + msg->Append( (uint8)(( interval >> 16 ) & 0xff) ); + msg->Append( (uint8)(( interval >> 8 ) & 0xff) ); + msg->Append( (uint8)( interval & 0xff ) ); + msg->Append( GetDriver()->GetNodeId() ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_WakeUp ); + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Set the command class version +//----------------------------------------------------------------------------- +void WakeUp::SetVersion +( + uint8 const _version +) +{ + CommandClass::SetVersion( _version ); + CreateVars( 1 ); +} + +//----------------------------------------------------------------------------- +// +// Set whether the device is likely to be awake +//----------------------------------------------------------------------------- +void WakeUp::SetAwake +( + bool _state +) +{ + if( m_awake != _state ) + { + m_awake = _state; + Log::Write( LogLevel_Info, GetNodeId(), " Node %d has been marked as %s", GetNodeId(), m_awake ? "awake" : "asleep" ); + Notification* notification = new Notification( Notification::Type_Notification ); + notification->SetHomeAndNodeIds( GetHomeId(), GetNodeId() ); + notification->SetNotification( m_awake ? Notification::Code_Awake : Notification::Code_Sleep ); + GetDriver()->QueueNotification( notification ); + + } + + if( m_awake ) + { + // If the device is marked for polling, request the current state + Node* node = GetNodeUnsafe(); + if( m_pollRequired ) + { + if( node != NULL ) + { + node->SetQueryStage( Node::QueryStage_Dynamic ); + } + m_pollRequired = false; + } + + // Send all pending messages + SendPending(); + } +} + +//----------------------------------------------------------------------------- +// +// Add a Z-Wave message to the queue +//----------------------------------------------------------------------------- +void WakeUp::QueueMsg +( + Driver::MsgQueueItem const& _item +) +{ + m_mutex->Lock(); + + // See if there is already a copy of this message in the queue. If so, + // we delete it. This is to prevent duplicates building up if the + // device does not wake up very often. Deleting the original and + // adding the copy to the end avoids problems with the order of + // commands such as on and off. + list::iterator it = m_pendingQueue.begin(); + while( it != m_pendingQueue.end() ) + { + Driver::MsgQueueItem const& item = *it; + if( item == _item ) + { + // Duplicate found + if( Driver::MsgQueueCmd_SendMsg == item.m_command ) + { + delete item.m_msg; + } + else if( Driver::MsgQueueCmd_Controller == item.m_command ) + { + delete item.m_cci; + } + m_pendingQueue.erase( it++ ); + } + else + { + ++it; + } + } + m_pendingQueue.push_back( _item ); + m_mutex->Unlock(); +} + +//----------------------------------------------------------------------------- +// +// The device is awake, so send all the pending messages +//----------------------------------------------------------------------------- +void WakeUp::SendPending +( +) +{ + m_awake = true; + + m_mutex->Lock(); + list::iterator it = m_pendingQueue.begin(); + while( it != m_pendingQueue.end() ) + { + Driver::MsgQueueItem const& item = *it; + if( Driver::MsgQueueCmd_SendMsg == item.m_command ) + { + GetDriver()->SendMsg( item.m_msg, Driver::MsgQueue_WakeUp ); + } + else if( Driver::MsgQueueCmd_QueryStageComplete == item.m_command ) + { + GetDriver()->SendQueryStageComplete( item.m_nodeId, item.m_queryStage ); + } else if( Driver::MsgQueueCmd_Controller == item.m_command ) + { + GetDriver()->BeginControllerCommand( item.m_cci->m_controllerCommand, item.m_cci->m_controllerCallback, item.m_cci->m_controllerCallbackContext, item.m_cci->m_highPower, item.m_cci->m_controllerCommandNode, item.m_cci->m_controllerCommandArg ); + delete item.m_cci; + } + it = m_pendingQueue.erase( it ); + } + m_mutex->Unlock(); + + // Send the device back to sleep, unless we have outstanding queries. + bool sendToSleep = m_notification; + Node* node = GetNodeUnsafe(); + if( node != NULL ) + { + if( !node->AllQueriesCompleted() ) + { + sendToSleep = false; + } + } + + if( sendToSleep ) + { + m_notification = false; + Msg* msg = new Msg( "Wakeup - No More Information (send to sleep)", GetNodeId(), REQUEST, FUNC_ID_ZW_SEND_DATA, true ); + msg->Append( GetNodeId() ); + msg->Append( 2 ); + msg->Append( GetCommandClassId() ); + msg->Append( WakeUpCmd_NoMoreInformation ); + msg->Append( GetDriver()->GetTransmitOptions() ); + GetDriver()->SendMsg( msg, Driver::MsgQueue_WakeUp ); + } +} + +//----------------------------------------------------------------------------- +// +// Create the values managed by this command class +//----------------------------------------------------------------------------- +void WakeUp::CreateVars +( + uint8 const _instance +) +{ + if( Node* node = GetNodeUnsafe() ) + { + if( !node->IsController() ) // We don't add the interval value for controllers, because they don't appear to ever wake up on their own. + { + switch( GetVersion() ) + { + case 1: + { + node->CreateValueInt( ValueID::ValueGenre_System, GetCommandClassId(), _instance, 0, "Wake-up Interval", "Seconds", false, false, 3600, 0 ); + break; + } + case 2: + { + node->CreateValueInt( ValueID::ValueGenre_System, GetCommandClassId(), _instance, 1, "Minimum Wake-up Interval", "Seconds", true, false, 0, 0 ); + node->CreateValueInt( ValueID::ValueGenre_System, GetCommandClassId(), _instance, 2, "Maximum Wake-up Interval", "Seconds", true, false, 0, 0 ); + node->CreateValueInt( ValueID::ValueGenre_System, GetCommandClassId(), _instance, 3, "Default Wake-up Interval", "Seconds", true, false, 0, 0 ); + node->CreateValueInt( ValueID::ValueGenre_System, GetCommandClassId(), _instance, 4, "Wake-up Interval Step", "Seconds", true, false, 0, 0 ); + break; + } + } + } + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/command_classes/WakeUp.h b/lib/ESPiLight/pilight/libs/openzwave/command_classes/WakeUp.h new file mode 100644 index 0000000..d079f99 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/command_classes/WakeUp.h @@ -0,0 +1,87 @@ +//----------------------------------------------------------------------------- +// +// WakeUp.h +// +// Implementation of the Z-Wave COMMAND_CLASS_WAKE_UP +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _WakeUp_H +#define _WakeUp_H + +#include +#include "CommandClass.h" +#include "../Driver.h" + +namespace OpenZWave +{ + class Msg; + class ValueInt; + class Mutex; + + /** \brief Implements COMMAND_CLASS_WAKE_UP (0x84), a Z-Wave device command class. + */ + class WakeUp: public CommandClass + { + public: + static CommandClass* Create( uint32 const _homeId, uint8 const _nodeId ){ return new WakeUp( _homeId, _nodeId ); } + virtual ~WakeUp(); + + static uint8 const StaticGetCommandClassId(){ return 0x84; } + static string const StaticGetCommandClassName(){ return "COMMAND_CLASS_WAKE_UP"; } + + void Init(); // Starts the process of requesting node state from a sleeping device. + void QueueMsg( Driver::MsgQueueItem const& _item ); + void SendPending(); + bool IsAwake()const{ return m_awake; } + void SetAwake( bool _state ); + void SetPollRequired(){ m_pollRequired = true; } + + // From CommandClass + virtual bool RequestState( uint32 const _requestFlags, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual bool RequestValue( uint32 const _requestFlags, uint8 const _index, uint8 const _instance, Driver::MsgQueue const _queue ); + virtual uint8 const GetCommandClassId()const{ return StaticGetCommandClassId(); } + virtual string const GetCommandClassName()const{ return StaticGetCommandClassName(); } + virtual bool HandleMsg( uint8 const* _data, uint32 const _length, uint32 const _instance = 1 ); + virtual bool SetValue( Value const& _value ); + virtual void SetVersion( uint8 const _version ); + + virtual uint8 GetMaxVersion(){ return 2; } + + protected: + virtual void CreateVars( uint8 const _instance ); + + private: + WakeUp( uint32 const _homeId, uint8 const _nodeId ); + + Mutex* m_mutex; // Serialize access to the pending queue + list m_pendingQueue; // Messages waiting to be sent when the device wakes up + bool m_awake; + bool m_pollRequired; + bool m_notification; + }; + +} // namespace OpenZWave + +#endif + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/libudev.h b/lib/ESPiLight/pilight/libs/openzwave/libudev.h new file mode 100644 index 0000000..4f2f115 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/libudev.h @@ -0,0 +1,207 @@ +/*** + This file is part of systemd. + + Copyright 2008-2012 Kay Sievers + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see . +***/ + +#ifndef _LIBUDEV_H_ +#define _LIBUDEV_H_ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * udev - library context + * + * reads the udev config and system environment + * allows custom logging + */ +struct udev; +struct udev *udev_ref(struct udev *udev); +struct udev *udev_unref(struct udev *udev); +struct udev *udev_new(void); +void udev_set_log_fn(struct udev *udev, + void (*log_fn)(struct udev *udev, + int priority, const char *file, int line, const char *fn, + const char *format, va_list args)); +int udev_get_log_priority(struct udev *udev); +void udev_set_log_priority(struct udev *udev, int priority); +void *udev_get_userdata(struct udev *udev); +void udev_set_userdata(struct udev *udev, void *userdata); + +/* + * udev_list + * + * access to libudev generated lists + */ +struct udev_list_entry; +struct udev_list_entry *udev_list_entry_get_next(struct udev_list_entry *list_entry); +struct udev_list_entry *udev_list_entry_get_by_name(struct udev_list_entry *list_entry, const char *name); +const char *udev_list_entry_get_name(struct udev_list_entry *list_entry); +const char *udev_list_entry_get_value(struct udev_list_entry *list_entry); +/** + * udev_list_entry_foreach: + * @list_entry: entry to store the current position + * @first_entry: first entry to start with + * + * Helper to iterate over all entries of a list. + */ +#define udev_list_entry_foreach(list_entry, first_entry) \ + for (list_entry = first_entry; \ + list_entry != NULL; \ + list_entry = udev_list_entry_get_next(list_entry)) + +/* + * udev_device + * + * access to sysfs/kernel devices + */ +struct udev_device; +struct udev_device *udev_device_ref(struct udev_device *udev_device); +struct udev_device *udev_device_unref(struct udev_device *udev_device); +struct udev *udev_device_get_udev(struct udev_device *udev_device); +struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *syspath); +struct udev_device *udev_device_new_from_devnum(struct udev *udev, char type, dev_t devnum); +struct udev_device *udev_device_new_from_subsystem_sysname(struct udev *udev, const char *subsystem, const char *sysname); +struct udev_device *udev_device_new_from_device_id(struct udev *udev, const char *id); +struct udev_device *udev_device_new_from_environment(struct udev *udev); +/* udev_device_get_parent_*() does not take a reference on the returned device, it is automatically unref'd with the parent */ +struct udev_device *udev_device_get_parent(struct udev_device *udev_device); +struct udev_device *udev_device_get_parent_with_subsystem_devtype(struct udev_device *udev_device, + const char *subsystem, const char *devtype); +/* retrieve device properties */ +const char *udev_device_get_devpath(struct udev_device *udev_device); +const char *udev_device_get_subsystem(struct udev_device *udev_device); +const char *udev_device_get_devtype(struct udev_device *udev_device); +const char *udev_device_get_syspath(struct udev_device *udev_device); +const char *udev_device_get_sysname(struct udev_device *udev_device); +const char *udev_device_get_sysnum(struct udev_device *udev_device); +const char *udev_device_get_devnode(struct udev_device *udev_device); +int udev_device_get_is_initialized(struct udev_device *udev_device); +struct udev_list_entry *udev_device_get_devlinks_list_entry(struct udev_device *udev_device); +struct udev_list_entry *udev_device_get_properties_list_entry(struct udev_device *udev_device); +struct udev_list_entry *udev_device_get_tags_list_entry(struct udev_device *udev_device); +struct udev_list_entry *udev_device_get_sysattr_list_entry(struct udev_device *udev_device); +const char *udev_device_get_property_value(struct udev_device *udev_device, const char *key); +const char *udev_device_get_driver(struct udev_device *udev_device); +dev_t udev_device_get_devnum(struct udev_device *udev_device); +const char *udev_device_get_action(struct udev_device *udev_device); +unsigned long long int udev_device_get_seqnum(struct udev_device *udev_device); +unsigned long long int udev_device_get_usec_since_initialized(struct udev_device *udev_device); +const char *udev_device_get_sysattr_value(struct udev_device *udev_device, const char *sysattr); +int udev_device_set_sysattr_value(struct udev_device *udev_device, const char *sysattr, char *value); +int udev_device_has_tag(struct udev_device *udev_device, const char *tag); + +/* + * udev_monitor + * + * access to kernel uevents and udev events + */ +struct udev_monitor; +struct udev_monitor *udev_monitor_ref(struct udev_monitor *udev_monitor); +struct udev_monitor *udev_monitor_unref(struct udev_monitor *udev_monitor); +struct udev *udev_monitor_get_udev(struct udev_monitor *udev_monitor); +/* kernel and udev generated events over netlink */ +struct udev_monitor *udev_monitor_new_from_netlink(struct udev *udev, const char *name); +/* bind socket */ +int udev_monitor_enable_receiving(struct udev_monitor *udev_monitor); +int udev_monitor_set_receive_buffer_size(struct udev_monitor *udev_monitor, int size); +int udev_monitor_get_fd(struct udev_monitor *udev_monitor); +struct udev_device *udev_monitor_receive_device(struct udev_monitor *udev_monitor); +/* in-kernel socket filters to select messages that get delivered to a listener */ +int udev_monitor_filter_add_match_subsystem_devtype(struct udev_monitor *udev_monitor, + const char *subsystem, const char *devtype); +int udev_monitor_filter_add_match_tag(struct udev_monitor *udev_monitor, const char *tag); +int udev_monitor_filter_update(struct udev_monitor *udev_monitor); +int udev_monitor_filter_remove(struct udev_monitor *udev_monitor); + +/* + * udev_enumerate + * + * search sysfs for specific devices and provide a sorted list + */ +struct udev_enumerate; +struct udev_enumerate *udev_enumerate_ref(struct udev_enumerate *udev_enumerate); +struct udev_enumerate *udev_enumerate_unref(struct udev_enumerate *udev_enumerate); +struct udev *udev_enumerate_get_udev(struct udev_enumerate *udev_enumerate); +struct udev_enumerate *udev_enumerate_new(struct udev *udev); +/* device properties filter */ +int udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem); +int udev_enumerate_add_nomatch_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem); +int udev_enumerate_add_match_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value); +int udev_enumerate_add_nomatch_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value); +int udev_enumerate_add_match_property(struct udev_enumerate *udev_enumerate, const char *property, const char *value); +int udev_enumerate_add_match_sysname(struct udev_enumerate *udev_enumerate, const char *sysname); +int udev_enumerate_add_match_tag(struct udev_enumerate *udev_enumerate, const char *tag); +int udev_enumerate_add_match_parent(struct udev_enumerate *udev_enumerate, struct udev_device *parent); +int udev_enumerate_add_match_is_initialized(struct udev_enumerate *udev_enumerate); +int udev_enumerate_add_syspath(struct udev_enumerate *udev_enumerate, const char *syspath); +/* run enumeration with active filters */ +int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate); +int udev_enumerate_scan_subsystems(struct udev_enumerate *udev_enumerate); +/* return device list */ +struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enumerate *udev_enumerate); + +/* + * udev_queue + * + * access to the currently running udev events + */ +struct udev_queue; +struct udev_queue *udev_queue_ref(struct udev_queue *udev_queue); +struct udev_queue *udev_queue_unref(struct udev_queue *udev_queue); +struct udev *udev_queue_get_udev(struct udev_queue *udev_queue); +struct udev_queue *udev_queue_new(struct udev *udev); +unsigned long long int udev_queue_get_kernel_seqnum(struct udev_queue *udev_queue) __attribute__ ((deprecated)); +unsigned long long int udev_queue_get_udev_seqnum(struct udev_queue *udev_queue) __attribute__ ((deprecated)); +int udev_queue_get_udev_is_active(struct udev_queue *udev_queue); +int udev_queue_get_queue_is_empty(struct udev_queue *udev_queue); +int udev_queue_get_seqnum_is_finished(struct udev_queue *udev_queue, unsigned long long int seqnum) __attribute__ ((deprecated)); +int udev_queue_get_seqnum_sequence_is_finished(struct udev_queue *udev_queue, + unsigned long long int start, unsigned long long int end) __attribute__ ((deprecated)); +int udev_queue_get_fd(struct udev_queue *udev_queue); +int udev_queue_flush(struct udev_queue *udev_queue); +struct udev_list_entry *udev_queue_get_queued_list_entry(struct udev_queue *udev_queue) __attribute__ ((deprecated)); + +/* + * udev_hwdb + * + * access to the static hardware properties database + */ +struct udev_hwdb; +struct udev_hwdb *udev_hwdb_new(struct udev *udev); +struct udev_hwdb *udev_hwdb_ref(struct udev_hwdb *hwdb); +struct udev_hwdb *udev_hwdb_unref(struct udev_hwdb *hwdb); +struct udev_list_entry *udev_hwdb_get_properties_list_entry(struct udev_hwdb *hwdb, const char *modalias, unsigned int flags); + +/* + * udev_util + * + * udev specific utilities + */ +int udev_util_encode_string(const char *str, char *str_enc, size_t len); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/CMakeLists.txt b/lib/ESPiLight/pilight/libs/openzwave/platform/CMakeLists.txt new file mode 100644 index 0000000..dbc5f43 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/CMakeLists.txt @@ -0,0 +1,15 @@ +project(openzwave_platform) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.cpp") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") + +if(WIN32) + add_subdirectory(windows) + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_windows_files} ${${PROJECT_NAME}_files} CACHE INTERNAL "") +else() + add_subdirectory(unix) + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_unix_files} ${${PROJECT_NAME}_files} CACHE INTERNAL "") +endif() + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Controller.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/Controller.cpp new file mode 100644 index 0000000..6f6da97 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Controller.cpp @@ -0,0 +1,68 @@ +//----------------------------------------------------------------------------- +// +// Controller.cpp +// +// Cross-platform, hardware-abstracted controller data interface +// +// Copyright (c) 2010 Jason Frazier +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include "../Defs.h" +#include "../Driver.h" +#include "Controller.h" + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Queues up the controller's initialization commands. +//----------------------------------------------------------------------------- +void Controller::PlayInitSequence +( + Driver* _driver +) +{ + _driver->SendMsg( new Msg( "FUNC_ID_ZW_GET_VERSION", 0xff, REQUEST, FUNC_ID_ZW_GET_VERSION, false ), Driver::MsgQueue_Command ); + _driver->SendMsg( new Msg( "FUNC_ID_ZW_MEMORY_GET_ID", 0xff, REQUEST, FUNC_ID_ZW_MEMORY_GET_ID, false ), Driver::MsgQueue_Command ); + _driver->SendMsg( new Msg( "FUNC_ID_ZW_GET_CONTROLLER_CAPABILITIES", 0xff, REQUEST, FUNC_ID_ZW_GET_CONTROLLER_CAPABILITIES, false ), Driver::MsgQueue_Command ); + _driver->SendMsg( new Msg( "FUNC_ID_SERIAL_API_GET_CAPABILITIES", 0xff, REQUEST, FUNC_ID_SERIAL_API_GET_CAPABILITIES, false ), Driver::MsgQueue_Command ); + _driver->SendMsg( new Msg( "FUNC_ID_ZW_GET_SUC_NODE_ID", 0xff, REQUEST, FUNC_ID_ZW_GET_SUC_NODE_ID, false ), Driver::MsgQueue_Command ); + // FUNC_ID_ZW_GET_VIRTUAL_NODES & FUNC_ID_SERIAL_API_GET_INIT_DATA has moved into the handler for FUNC_ID_SERIAL_API_GET_CAPABILITIES +} + +//----------------------------------------------------------------------------- +// +// Read from a controller +//----------------------------------------------------------------------------- +uint32 Controller::Read +( + uint8* _buffer, + uint32 _length +) +{ + // Fetch the data from the ring buffer (which is an all or nothing read) + if( Get( _buffer, _length ) ) + { + return _length; + } + + return 0; +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Controller.h b/lib/ESPiLight/pilight/libs/openzwave/platform/Controller.h new file mode 100644 index 0000000..a1ccbc7 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Controller.h @@ -0,0 +1,107 @@ +//----------------------------------------------------------------------------- +// +// Controller.h +// +// Cross-platform, hardware-abstracted controller data interface +// +// Copyright (c) 2010 Jason Frazier +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Controller_H +#define _Controller_H + +#include +#include +#include "../Defs.h" +#include "../Driver.h" +#include "Stream.h" + +namespace OpenZWave +{ + class Driver; + + class Controller: public Stream + { + // Controller is derived from Stream rather than containing one, so that + // we can use its Wait abilities without having to duplicate them here. + // The stream is used for input. Buffering of output is handled by the OS. + + public: + /** + * Consructor. + * Creates the controller object. + */ + Controller():Stream( 2048 ){} + + /** + * Destructor. + * Destroys the controller object. + */ + virtual ~Controller(){} + + /** + * Queues a set of Z-Wave messages in the correct order needed to initialize the Controller implementation. + * @param Pointer to the driver object that will handle the messages. + * @see Driver::Init + */ + void PlayInitSequence( Driver* _driver ); + + /** + * Open a controller. + * Attempts to open a controller and initialize it with the specified paramters. + * @param _controllerName The name of the port to open. For example, ttyS1 on Linux, or \\.\COM2 in Windows. + * @see Close, Read, Write + */ + virtual bool Open( string const& _controllerName ) = 0; + + /** + * Close a controller. + * Closes the controller. + * @return True if the controller was closed successfully, or false if the controller was already closed, or an error occurred. + * @see Open + */ + virtual bool Close() = 0; + + /** + * Write to a controller. + * Attempts to write data to an open controller. + * @param _buffer Pointer to a block of memory containing the data to be written. + * @param _length Length in bytes of the data. + * @return The number of bytes written. + * @see Read, Open, Close + */ + virtual uint32 Write( uint8* _buffer, uint32 _length ) = 0; + + /** + * Read from a controller. + * Attempts to read data from an open controller. + * @param _buffer Pointer to a block of memory large enough to hold the requested data. + * @param _length Length in bytes of the data to be read. + * @return The number of bytes read. + * @see Write, Open, Close + */ + uint32 Read( uint8* _buffer, uint32 _length ); + }; + +} // namespace OpenZWave + +#endif //_Controller_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Event.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/Event.cpp new file mode 100644 index 0000000..dae72a0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Event.cpp @@ -0,0 +1,107 @@ +//----------------------------------------------------------------------------- +// +// Event.cpp +// +// Cross-platform event +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include "../Defs.h" +#include "Event.h" + +#ifdef _WIN32 +#include "windows/EventImpl.h" // Platform-specific implementation of an event +#else +#include "unix/EventImpl.h" // Platform-specific implementation of an event +#endif + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Event::Event +( +): + m_pImpl( new EventImpl() ) +{ +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +Event::~Event +( +) +{ + delete m_pImpl; +} + +//----------------------------------------------------------------------------- +// +// Set the event to signalled +//----------------------------------------------------------------------------- +void Event::Set +( +) +{ + m_pImpl->Set(); + Notify(); // Notify any watchers that the event is now set +} + +//----------------------------------------------------------------------------- +// +// Set the event to not signalled +//----------------------------------------------------------------------------- +void Event::Reset +( +) +{ + m_pImpl->Reset(); +} + +//----------------------------------------------------------------------------- +// +// Test whether the event is set +//----------------------------------------------------------------------------- +bool Event::IsSignalled +( +) +{ + return m_pImpl->IsSignalled(); +} + +//----------------------------------------------------------------------------- +// +// Wait for the event to become signalled +//----------------------------------------------------------------------------- +bool Event::Wait +( + int32 const _timeout +) +{ + return m_pImpl->Wait( _timeout ); +} + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Event.h b/lib/ESPiLight/pilight/libs/openzwave/platform/Event.h new file mode 100644 index 0000000..c13211e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Event.h @@ -0,0 +1,91 @@ +//----------------------------------------------------------------------------- +// +// Event.h +// +// Cross-platform manual-reset event +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _Event_H +#define _Event_H + +#include "Wait.h" + +namespace OpenZWave +{ + class EventImpl; + + /** \brief Platform-independent definition of event objects. + */ + class Event: public Wait + { + friend class SerialControllerImpl; + friend class Wait; + + public: + /** + * Constructor. + * Creates a cross-platform event object equivalent to the Windows manual-reset event + */ + Event(); + + /** + * Set the event to signalled. + * \see Reset, Wait + */ + void Set(); + + /** + * Set the event to not signalled. + * \see Set, Wait + */ + void Reset(); + + protected: + /** + * Used by the Wait class to test whether the event is set. + */ + virtual bool IsSignalled(); + + /** + * Used by the Wait::Multiple method. + * returns true if the event signalled, false if it timed out + */ + bool Wait( int32 _timeout ); + + /** + * Destructor. + * Destroys the event object. + */ + ~Event(); + + private: + Event( Event const& ); // prevent copy + Event& operator = ( Event const& ); // prevent assignment + + EventImpl* m_pImpl; // Pointer to an object that encapsulates the platform-specific implementation of a event. + }; + +} // namespace OpenZWave + +#endif //_Event_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/FileOps.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/FileOps.cpp new file mode 100644 index 0000000..79fe27d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/FileOps.cpp @@ -0,0 +1,105 @@ +//----------------------------------------------------------------------------- +// +// FileOps.cpp +// +// Cross-platform File Operations +// +// Copyright (c) 2012 Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include +#include "FileOps.h" + +#ifdef _WIN32 +#include "windows/FileOpsImpl.h" // Platform-specific implementation of a File Operations +#else +#include "unix/FileOpsImpl.h" // Platform-specific implementation of a File Operations +#endif + +using namespace OpenZWave; + +FileOps* FileOps::s_instance = NULL; +FileOpsImpl* FileOps::m_pImpl = NULL; + +//----------------------------------------------------------------------------- +// +// Static creation of the singleton +//----------------------------------------------------------------------------- +FileOps* FileOps::Create +( +) +{ + if( s_instance == NULL ) + { + s_instance = new FileOps(); + } + return s_instance; +} + +//----------------------------------------------------------------------------- +// +// Static method to destroy the fileops singleton. +//----------------------------------------------------------------------------- +void FileOps::Destroy +( +) +{ + delete s_instance; + s_instance = NULL; +} + +//----------------------------------------------------------------------------- +// +// Static method to check for existance of a folder +//----------------------------------------------------------------------------- +bool FileOps::FolderExists +( + const string &_folderName +) +{ + if( s_instance != NULL ) + { + return s_instance->m_pImpl->FolderExists( _folderName ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +FileOps::FileOps +( +) +{ + m_pImpl = new FileOpsImpl(); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +FileOps::~FileOps +( +) +{ + delete m_pImpl; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/FileOps.h b/lib/ESPiLight/pilight/libs/openzwave/platform/FileOps.h new file mode 100644 index 0000000..548f8f6 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/FileOps.h @@ -0,0 +1,75 @@ +//----------------------------------------------------------------------------- +// +// FileOps.h +// +// Cross-platform File Operations +// +// Copyright (c) 2012 Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _FileOps_H +#define _FileOps_H + +#include +#include +#include "../Defs.h" + +namespace OpenZWave +{ + class FileOpsImpl; + + /** \brief Implements platform-independent File Operations. + */ + class FileOps + { + public: + /** + * Create a FileOps cross-platform singleton. + * \return a pointer to the file operations object. + * \see Destroy. + */ + static FileOps* Create(); + + /** + * Destroys the FileOps singleton. + * \see Create. + */ + static void Destroy(); + + /** + * FolderExists. Check for the existance of a folder. + * \param string. Folder name. + * \return Bool value indicating existance. + */ + static bool FolderExists( const string &_folderName ); + + private: + FileOps(); + ~FileOps(); + + static FileOpsImpl* m_pImpl; // Pointer to an object that encapsulates the platform-specific implementation of the FileOps. + static FileOps* s_instance; + }; + +} // namespace OpenZWave + +#endif //_FileOps_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Log.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/Log.cpp new file mode 100644 index 0000000..503476a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Log.cpp @@ -0,0 +1,334 @@ +//----------------------------------------------------------------------------- +// +// Log.cpp +// +// Cross-platform message and error logging +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include + +#include "../Defs.h" +#include "Mutex.h" +#include "Log.h" + +#ifdef _WIN32 +#include "windows/LogImpl.h" // Platform-specific implementation of a log +#else +#include "unix/LogImpl.h" // Platform-specific implementation of a log +#endif + + +using namespace OpenZWave; + +char const *OpenZWave::LogLevelString[] = +{ + "None", /**< LogLevel_None Disable all logging */ + "Always", /**< LogLevel_Always These messages should always be shown */ + "Fatal", /**< LogLevel_Fatal A likely fatal issue in the library */ + "Error", /**< LogLevel_Error A serious issue with the library or the network */ + "Warning", /**< LogLevel_Warning A minor issue from which the library should be able to recover */ + "Alert", /**< LogLevel_Alert Something unexpected by the library about which the controlling application should be aware */ + "Info", /**< LogLevel_Info Everything's working fine...these messages provide streamlined feedback on each message */ + "Detail", /**< LogLevel_Detail Detailed information on the progress of each message */ + "Debug", /**< LogLevel_Debug Very detailed information on progress that will create a huge log file quickly + But this level (as others) can be queued and sent to the log only on an error or warning */ + "StreamDetail", /**< LogLevel_StreamDetail Will include low-level byte transfers from controller to buffer to application and back */ + "Internal" /**< LogLevel_Internal Used only within the log class (uses existing timestamp, etc.) */ +}; + + + +Log* Log::s_instance = NULL; +i_LogImpl* Log::m_pImpl = NULL; +static bool s_dologging; + +//----------------------------------------------------------------------------- +// +// Static creation of the singleton +//----------------------------------------------------------------------------- +Log* Log::Create +( + string const& _filename, + bool const _bAppend, + bool const _bConsoleOutput, + LogLevel const _saveLevel, + LogLevel const _queueLevel, + LogLevel const _dumpTrigger +) +{ + if( NULL == s_instance ) + { + s_instance = new Log( _filename, _bAppend, _bConsoleOutput, _saveLevel, _queueLevel, _dumpTrigger ); + s_dologging = true; // default logging to true so no change to what people experience now + } + + return s_instance; +} + +//----------------------------------------------------------------------------- +// +// Static creation of the singleton +//----------------------------------------------------------------------------- +/* It isn't clear this is ever called or used. If no one complains, consider + deleting this code in April 2012. +Log* Log::Create +( + i_LogImpl *LogClass +) +{ + if (NULL == s_instance ) + { + s_instance = new Log( "" ); + s_dologging = true; + } + SetLoggingClass( LogClass ); + return s_instance; +} +*/ + +//----------------------------------------------------------------------------- +// +// Static method to destroy the logging singleton. +//----------------------------------------------------------------------------- +void Log::Destroy +( +) +{ + delete s_instance; + s_instance = NULL; +} + +//----------------------------------------------------------------------------- +// +// Set log class +//----------------------------------------------------------------------------- +bool Log::SetLoggingClass +( + i_LogImpl *LogClass +) +{ + delete m_pImpl; + m_pImpl = LogClass; + return true; +} + +//----------------------------------------------------------------------------- +// +// Set flag to actually write to log or skip it (legacy version) +// If logging is enabled, the default log detail settings will be used +// Write to file/screen LogLevel_Detail +// Save in queue for errors LogLevel_Debug +// Trigger for dumping queue LogLevel_Warning +// Console output? Yes +// Append to an existing log? No (overwrite) +//----------------------------------------------------------------------------- +void Log::SetLoggingState +( + bool _dologging +) +{ + bool prevLogging = s_dologging; + s_dologging = _dologging; + + if (!prevLogging && s_dologging) Log::Write(LogLevel_Always, "Logging started\n\n"); +} + +//----------------------------------------------------------------------------- +// +// Set flag to actually write to log or skip it +//----------------------------------------------------------------------------- +void Log::SetLoggingState +( + LogLevel _saveLevel, + LogLevel _queueLevel, + LogLevel _dumpTrigger +) +{ + // parameter checking: + // _queueLevel cannot be less than or equal to _saveLevel (where lower ordinals are more severe conditions) + // _dumpTrigger cannot be greater than or equal to _queueLevel + if( _queueLevel <= _saveLevel ) + Log::Write( LogLevel_Warning, "Only lower priority messages may be queued for error-driven display." ); + if( _dumpTrigger >= _queueLevel ) + Log::Write( LogLevel_Warning, "The trigger for dumping queued messages must be a higher-priority message than the level that is queued." ); + + bool prevLogging = s_dologging; + // s_dologging is true if any messages are to be saved in file or queue + if( (_saveLevel > LogLevel_Always) || + (_queueLevel > LogLevel_Always) ) + { + s_dologging = true; + } + else + { + s_dologging = false; + } + + if( s_instance && s_dologging && s_instance->m_pImpl ) + { + s_instance->m_logMutex->Lock(); + s_instance->m_pImpl->SetLoggingState( _saveLevel, _queueLevel, _dumpTrigger ); + s_instance->m_logMutex->Unlock(); + } + + if (!prevLogging && s_dologging) Log::Write(LogLevel_Always, "Logging started\n\n"); +} + +//----------------------------------------------------------------------------- +// +// Return a flag to indicate whether logging is enabled +//----------------------------------------------------------------------------- +bool Log::GetLoggingState +( +) +{ + return s_dologging; +} + +//----------------------------------------------------------------------------- +// +// Write to the log +//----------------------------------------------------------------------------- +void Log::Write +( + LogLevel _level, + char const* _format, + ... +) +{ + if( s_instance && s_dologging && s_instance->m_pImpl ) + { + s_instance->m_logMutex->Lock(); // double locks if recursive + va_list args; + va_start( args, _format ); + s_instance->m_pImpl->Write( _level, 0, _format, args ); + va_end( args ); + s_instance->m_logMutex->Unlock(); + } +} + +//----------------------------------------------------------------------------- +// +// Write to the log +//----------------------------------------------------------------------------- +void Log::Write +( + LogLevel _level, + uint8 const _nodeId, + char const* _format, + ... +) +{ + if( s_instance && s_dologging && s_instance->m_pImpl ) + { + if( _level != LogLevel_Internal ) + s_instance->m_logMutex->Lock(); + va_list args; + va_start( args, _format ); + s_instance->m_pImpl->Write( _level, _nodeId, _format, args ); + va_end( args ); + if( _level != LogLevel_Internal ) + s_instance->m_logMutex->Unlock(); + } +} + +//----------------------------------------------------------------------------- +// +// Send queued messages to the log (and empty the queue) +//----------------------------------------------------------------------------- +void Log::QueueDump +( +) +{ + if( s_instance && s_dologging && s_instance->m_pImpl ) + { + s_instance->m_logMutex->Lock(); + s_instance->m_pImpl->QueueDump(); + s_instance->m_logMutex->Unlock(); + } +} + +//----------------------------------------------------------------------------- +// +// Empty the queued message queue +//----------------------------------------------------------------------------- +void Log::QueueClear +( +) +{ + if( s_instance && s_dologging && s_instance->m_pImpl ) + { + s_instance->m_logMutex->Lock(); + s_instance->m_pImpl->QueueClear(); + s_instance->m_logMutex->Unlock(); + } +} + +//----------------------------------------------------------------------------- +// +// Change the name of the log file (will start writing a new file) +//----------------------------------------------------------------------------- +void Log::SetLogFileName +( + const string &_filename +) +{ + if( s_instance && s_dologging && s_instance->m_pImpl ) + { + s_instance->m_logMutex->Lock(); + s_instance->m_pImpl->SetLogFileName( _filename ); + s_instance->m_logMutex->Unlock(); + } +} + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Log::Log +( + string const& _filename, + bool const _bAppend, + bool const _bConsoleOutput, + LogLevel const _saveLevel, + LogLevel const _queueLevel, + LogLevel const _dumpTrigger +): + m_logMutex( new Mutex() ) +{ + if (NULL == m_pImpl) + m_pImpl = new LogImpl( _filename, _bAppend, _bConsoleOutput, _saveLevel, _queueLevel, _dumpTrigger ); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +Log::~Log +( +) +{ + m_logMutex->Release(); + delete m_pImpl; + m_pImpl = NULL; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Log.h b/lib/ESPiLight/pilight/libs/openzwave/platform/Log.h new file mode 100644 index 0000000..c8f80ca --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Log.h @@ -0,0 +1,187 @@ +//----------------------------------------------------------------------------- +// +// Log.h +// +// Cross-platform message and error logging +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _Log_H +#define _Log_H + +#include +#include +#include "../Defs.h" + + + +namespace OpenZWave +{ + class Mutex; + extern char const *LogLevelString[]; + enum LogLevel + { + LogLevel_None, /**< Disable all logging */ + LogLevel_Always, /**< These messages should always be shown */ + LogLevel_Fatal, /**< A likely fatal issue in the library */ + LogLevel_Error, /**< A serious issue with the library or the network */ + LogLevel_Warning, /**< A minor issue from which the library should be able to recover */ + LogLevel_Alert, /**< Something unexpected by the library about which the controlling application should be aware */ + LogLevel_Info, /**< Everything's working fine...these messages provide streamlined feedback on each message */ + LogLevel_Detail, /**< Detailed information on the progress of each message */ + LogLevel_Debug, /**< Very detailed information on progress that will create a huge log file quickly + But this level (as others) can be queued and sent to the log only on an error or warning */ + LogLevel_StreamDetail, /**< Will include low-level byte transfers from controller to buffer to application and back */ + LogLevel_Internal /**< Used only within the log class (uses existing timestamp, etc.) */ + }; + + class i_LogImpl + { + public: + i_LogImpl() { } ; + virtual ~i_LogImpl() { } ; + virtual void Write( LogLevel _level, uint8 const _nodeId, char const* _format, va_list _args ) = 0; + virtual void QueueDump() = 0; + virtual void QueueClear() = 0; + virtual void SetLoggingState( LogLevel _saveLevel, LogLevel _queueLevel, LogLevel _dumpTrigger ) = 0; + virtual void SetLogFileName( const string &_filename ) = 0; + }; + + /** \brief Implements a platform-independent log...written to the console and, optionally, a file. + */ + class Log + { + public: + /** + * Create a log. + * Creates the cross-platform logging singleton. + * Any previous log will be cleared. + * \return a pointer to the logging object. + * \see Destroy, Write + */ + static Log* Create( string const& _filename, bool const _bAppend, bool const _bConsoleOutput, LogLevel const _saveLevel, LogLevel const _queueLevel, LogLevel const _dumpTrigger ); + + /** + * Create a log. + * Creates the cross-platform logging singleton. + * Any previous log will be cleared. + * \param LogClass a Logging Class that inherits the i_LogImpl Class to use to Log + * \return a pointer to the logging object. + * \see Destroy, Write + */ + + static Log* Create( i_LogImpl *LogClass ); + + /** + * Destroys the log. + * Destroys the logging singleton. The log can no longer + * be written to without another call to Create. + * \see Create, Write + */ + static void Destroy(); + + /** + * \brief Set the Logging Implmentation Class to replace the standard File/Console Loggin + * \param LogClass A Logging Class that inherits the i_LogImpl Class used to Log to + * \return Bool Value indicating success or failure + */ + static bool SetLoggingClass(i_LogImpl *LogClass ); + + /** + * \brief Enable or disable library logging (retained for backward compatibility) + * \param _dologging If true, logging is enabled; if false, disabled + */ + static void SetLoggingState(bool _dologging); + + /** + * \brief Enable or disable library logging. To disable, set _saveLevel and _queueLevel + * to LogLevel_None. + * \param _saveLevel LogLevel of messages to write in real-time + * \param _queueLevel LogLevel of messages to queue to be dumped in case of an error + * \param _dumpTrigger LogLevel of message that triggers a queue dump (probably LogLevel_Error or LogLevel_Warning) + */ + static void SetLoggingState( LogLevel _saveLevel, LogLevel _queueLevel, LogLevel _dumpTrigger ); + + /** + * \brief Determine whether logging is enabled or not (retained for backward compatibility) + * \param _dologging If true, logging is enabled; if false, disabled + */ + static bool GetLoggingState(); + + /** + * \brief Obtain the various logging levels. + * \param _saveLevel LogLevel of messages to write in real-time + * \param _queueLevel LogLevel of messages to queue to be dumped in case of an error + * \param _dumpTrigger LogLevel of message that triggers a queue dump (probably LogLevel_Error or LogLevel_Warning) + */ + static void GetLoggingState( LogLevel* _saveLevel, LogLevel* _queueLevel, LogLevel* _dumpTrigger ); + + /** + * \brief Change the log file name. This will start a new log file (or potentially start appending + * information to an existing one. Developers might want to use this function, together with a timer + * in the controlling application, to create timestamped log file names. + * \param _filename Name of the new (or existing) file to use for log output. + */ + static void SetLogFileName( const string &_filename ); + + /** + * Write an entry to the log. + * Writes a formatted string to the log. + * \param _level Specifies the type of log message (Error, Warning, Debug, etc.) + * \param _format. A string formatted in the same manner as used with printf etc. + * \param ... a variable number of arguments, to be included in the formatted string. + * \see Create, Destroy + */ + static void Write( LogLevel _level, char const* _format, ... ); + + /** + * Write an entry to the log. + * Writes a formatted string to the log. + * \param _level Specifies the type of log message (Error, Warning, Debug, etc.) + * \param _nodeId Node Id this entry is about. + * \param _format. A string formatted in the same manner as used with printf etc. + * \param ... a variable number of arguments, to be included in the formatted string. + * \see Create, Destroy + */ + static void Write( LogLevel _level, uint8 const _nodeId, char const* _format, ... ); + + /** + * Send the queued log messages to the log output. + */ + static void QueueDump(); + + /** + * Clear the log message queue + */ + static void QueueClear(); + + private: + Log( string const& _filename, bool const _bAppend, bool const _bConsoleOutput, LogLevel _saveLevel, LogLevel _queueLevel, LogLevel _dumpTrigger ); + ~Log(); + + static i_LogImpl* m_pImpl; /**< Pointer to an object that encapsulates the platform-specific logging implementation. */ + static Log* s_instance; + Mutex* m_logMutex; + }; +} // namespace OpenZWave + +#endif //_Log_H diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Mutex.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/Mutex.cpp new file mode 100644 index 0000000..378f1a1 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Mutex.cpp @@ -0,0 +1,101 @@ +//----------------------------------------------------------------------------- +// +// Mutex.cpp +// +// Cross-platform mutex +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include "../Defs.h" +#include "Mutex.h" + +#ifdef _WIN32 +#include "windows/MutexImpl.h" // Platform-specific implementation of a mutex +#else +#include "unix/MutexImpl.h" // Platform-specific implementation of a mutex +#endif + + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Mutex::Mutex +( +): + m_pImpl( new MutexImpl() ) +{ +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +Mutex::~Mutex +( +) +{ + delete m_pImpl; +} + +//----------------------------------------------------------------------------- +// +// Lock the mutex +//----------------------------------------------------------------------------- +bool Mutex::Lock +( + bool const _bWait // = true; +) +{ + return m_pImpl->Lock( _bWait ); +} + +//----------------------------------------------------------------------------- +// +// Release our lock on the mutex +//----------------------------------------------------------------------------- +void Mutex::Unlock +( +) +{ + m_pImpl->Unlock(); + + if( IsSignalled() ) + { + // The mutex has no owners, so notify the watchers + Notify(); + } +} + +//----------------------------------------------------------------------------- +// +// Test whether the event is set +//----------------------------------------------------------------------------- +bool Mutex::IsSignalled +( +) +{ + return m_pImpl->IsSignalled(); +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Mutex.h b/lib/ESPiLight/pilight/libs/openzwave/platform/Mutex.h new file mode 100644 index 0000000..668f0cf --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Mutex.h @@ -0,0 +1,88 @@ +//----------------------------------------------------------------------------- +// +// Mutex.h +// +// Cross-platform mutex +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _Mutex_H +#define _Mutex_H + +#include "Wait.h" + +namespace OpenZWave +{ + class MutexImpl; + + /** \brief Implements a platform-independent mutex--for serializing access to a shared resource. + */ + class Mutex: public Wait + { + public: + /** + * Constructor. + * Creates a mutex object that can be used to serialize access to a shared resource. + */ + Mutex(); + + /** + * Lock the mutex. + * Attempts to lock the mutex. + * There must be a matching call to Release for every call to Lock. + * \param _bWait Defaults to true. Set this argument to false if the method should return + * immediately, even if the lock is not available. + * \return True if the lock was obtained. + * \see Release + */ + bool Lock( bool const _bWait = true ); + + /** + * Releases the lock on the mutex. + * There must be a matching call to Release for every call to Lock. + * \see Lock + */ + void Unlock(); + + protected: + /** + * Used by the Wait class to test whether the mutex is free. + */ + virtual bool IsSignalled(); + + /** + * Destructor. + * Destroys the mutex object. + */ + ~Mutex(); + + private: + Mutex( Mutex const& ); // prevent copy + Mutex& operator = ( Mutex const& ); // prevent assignment + + MutexImpl* m_pImpl; // Pointer to an object that encapsulates the platform-specific implementation of a mutex. + }; + +} // namespace OpenZWave + +#endif //_Mutex_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Ref.h b/lib/ESPiLight/pilight/libs/openzwave/platform/Ref.h new file mode 100644 index 0000000..14554d7 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Ref.h @@ -0,0 +1,91 @@ +//----------------------------------------------------------------------------- +// +// Ref.h +// +// Reference counting for objects. +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _Ref_H +#define _Ref_H + +#pragma once + +#include "../Defs.h" + +namespace OpenZWave +{ + /** + * Provides reference counting for objects. + * Any class wishing to include reference counting should be derived from Ref. + * Derived classes must declare their destructor as protected virtual. + * On construction, the reference count is set to one. Calls to AddRef increment + * the count. Calls to Release decrement the count. When the count reaches + * zero, the object is deleted. + */ + class Ref + { + public: + /** + * Initializes the RefCount to one. The object + * can only be deleted through a call to Release. + * \see AddRef, Release + */ + Ref(){ m_refs = 1; } + + /** + * Increases the reference count of the object. + * Every call to AddRef requires a matching call + * to Release before the object will be deleted. + * \see Release + */ + void AddRef(){ ++m_refs; } + + /** + * Removes a reference to an object. + * If this was the last reference to the message, the + * object is deleted. + * \see AddRef + */ + int32 Release() + { + if( 0 >= ( --m_refs ) ) + { + delete this; + return 0; + } + return m_refs; + } + + protected: + virtual ~Ref(){} + + private: + // Reference counting + int32 m_refs; + + }; // class Ref + +} // namespace OpenZWave + +#endif // _Ref_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/SerialController.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/SerialController.cpp new file mode 100644 index 0000000..1fb7b6d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/SerialController.cpp @@ -0,0 +1,185 @@ +//----------------------------------------------------------------------------- +// +// SerialController.h +// +// Cross-platform serial port handler +// +// Copyright (c) 2010 Jason Frazier +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "../Msg.h" +#include "Event.h" +#include "Thread.h" +#include "SerialController.h" +#include "Log.h" + +#ifdef _WIN32 +#include "windows/SerialControllerImpl.h" // Platform-specific implementation of a serial port +#else +#include "unix/SerialControllerImpl.h" // Platform-specific implementation of a serial port +#endif + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +SerialController::SerialController +( +): + m_baud ( 115200 ), + m_parity ( SerialController::Parity_None ), + m_stopBits ( SerialController::StopBits_One ), + m_bOpen( false ) +{ + m_pImpl = new SerialControllerImpl( this ); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +SerialController::~SerialController +( +) +{ + delete m_pImpl; +} + +//----------------------------------------------------------------------------- +// +// Set the serial port baud rate. +// The serial port must be closed for the setting to be accepted. +//----------------------------------------------------------------------------- +bool SerialController::SetBaud +( + uint32 const _baud +) +{ + if( m_bOpen ) + { + return false; + } + + m_baud = _baud; + return true; +} + +//----------------------------------------------------------------------------- +// +// Set the serial port parity. +// The serial port must be closed for the setting to be accepted. +//----------------------------------------------------------------------------- +bool SerialController::SetParity +( + Parity const _parity +) +{ + if( m_bOpen ) + { + return false; + } + + m_parity = _parity; + return true; +} + +//----------------------------------------------------------------------------- +// +// Set the serial port stop bits. +// The serial port must be closed for the setting to be accepted. +//----------------------------------------------------------------------------- +bool SerialController::SetStopBits +( + StopBits const _stopBits +) +{ + if( m_bOpen ) + { + return false; + } + + m_stopBits = _stopBits; + return true; +} + +//----------------------------------------------------------------------------- +// +// Open and configure a serial port +//----------------------------------------------------------------------------- +bool SerialController::Open +( + string const& _serialControllerName +) +{ + if( m_bOpen ) + { + return false; + } + + m_serialControllerName = _serialControllerName; + m_bOpen = m_pImpl->Open(); + return m_bOpen; +} + +//----------------------------------------------------------------------------- +// +// Close a serial port +//----------------------------------------------------------------------------- +bool SerialController::Close +( +) +{ + if( !m_bOpen ) + { + return false; + } + + m_pImpl->Close(); + m_bOpen = false; + return true; +} + +//----------------------------------------------------------------------------- +// +// Write data to an open serial port +//----------------------------------------------------------------------------- +uint32 SerialController::Write +( + uint8* _buffer, + uint32 _length +) +{ + if( !m_bOpen ) + { + return 0; + } + + Log::Write( LogLevel_StreamDetail, " SerialController::Write (sent to controller)" ); + LogData(_buffer, _length, " Write: "); + + return( m_pImpl->Write( _buffer, _length ) ); +} + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/SerialController.h b/lib/ESPiLight/pilight/libs/openzwave/platform/SerialController.h new file mode 100644 index 0000000..5e52721 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/SerialController.h @@ -0,0 +1,138 @@ +//----------------------------------------------------------------------------- +// +// SerialController.h +// +// Cross-platform serial port handler +// +// Copyright (c) 2010 Jason Frazier +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _SerialController_H +#define _SerialController_H + +#include +#include "../Defs.h" +#include "Controller.h" + +namespace OpenZWave +{ + class Driver; + class Msg; + class SerialControllerImpl; + + class SerialController: public Controller + { + friend class SerialControllerImpl; + + public: + enum Parity + { + Parity_None = 0, + Parity_Odd, + Parity_Even, + Parity_Mark, + Parity_Space + }; + + enum StopBits + { + StopBits_One = 0, + StopBits_OneAndAHalf = 1, + StopBits_Two = 2 + }; + + /** + * Constructor. + * Creates an object that represents a serial port. + */ + SerialController(); + + /** + * Destructor. + * Destroys the serial port object. + */ + virtual ~SerialController(); + + /** + * Set the serial port baud rate. The serial port must be closed for the setting to be accepted. + * @param _baud Integer containing the expected baud-rate of the serial connection. Most Z-Wave interfaces run at 115200 baud. + * @return True if the baud value was accepted. + * @see Open, Close + */ + bool SetBaud( uint32 const _baud ); + + /** + * Set the serial port parity. The serial port must be closed for the setting to be accepted. + * @param _parity Parity enum value indicating the serial data's expected type of parity bits, if any. + * @return True if the parity value was accepted. + * @see Open, Close + */ + bool SetParity( Parity const _parity ); + + /** + * Set the serial port stop bits. The serial port must be closed for the setting to be accepted. + * @param _stopBits StopBits enum value indicating the serial data's expected number of stop-bits. + * @return True if the stop bits value was accepted. + * @see Open, Close + */ + bool SetStopBits( StopBits const _stopBits ); + + /** + * Open a serial port. + * Attempts to open a serial port and initialize it with the specified paramters. + * @param _SerialControllerName The name of the port to open. For example, ttyS1 on Linux, or \\.\COM2 in Windows. + * @return True if the port was opened and configured successfully. + * @see Close, Read, Write + */ + bool Open( string const& _SerialControllerName ); + + /** + * Close a serial port. + * Closes the serial port. + * @return True if the port was closed successfully, or false if the port was already closed, or an error occurred. + * @see Open + */ + bool Close(); + + /** + * Write to a serial port. + * Attempts to write data to an open serial port. + * @param _buffer Pointer to a block of memory containing the data to be written. + * @param _length Length in bytes of the data. + * @return The number of bytes written. + * @see Read, Open, Close + */ + uint32 Write( uint8* _buffer, uint32 _length ); + + private: + uint32 m_baud; + SerialController::Parity m_parity; + SerialController::StopBits m_stopBits; + string m_serialControllerName; + + SerialControllerImpl* m_pImpl; // Pointer to an object that encapsulates the platform-specific implementation of the serial port. + bool m_bOpen; + }; + +} // namespace OpenZWave + +#endif //_SerialController_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Stream.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/Stream.cpp new file mode 100644 index 0000000..7dfb8be --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Stream.cpp @@ -0,0 +1,227 @@ +//----------------------------------------------------------------------------- +// +// Stream.h +// +// Cross-platform circular buffer with signalling +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include "Stream.h" +#include "Mutex.h" +#include "Log.h" + +#include + +#include + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Stream::Stream +( + uint32 _bufferSize +): + m_bufferSize( _bufferSize ), + m_signalSize(1), + m_dataSize(0), + m_head(0), + m_tail(0), + m_mutex( new Mutex() ) +{ + m_buffer = new uint8[m_bufferSize]; +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +Stream::~Stream +( +) +{ + m_mutex->Release(); + delete [] m_buffer; +} + +//----------------------------------------------------------------------------- +// +// Set the amount of data that must be in the buffer for to to be signalled +//----------------------------------------------------------------------------- +void Stream::SetSignalThreshold +( + uint32 _size +) +{ + m_signalSize = _size; + if( IsSignalled() ) + { + // We have more data than we are waiting for, so notify the watchers + Notify(); + } +} + +//----------------------------------------------------------------------------- +// +// Remove data from the buffer +//----------------------------------------------------------------------------- +bool Stream::Get +( + uint8* _buffer, + uint32 _size +) +{ + if( m_dataSize < _size ) + { + // There is not enough data in the buffer to fulfill the request + Log::Write( LogLevel_Error, "ERROR: Not enough data in stream buffer"); + return false; + } + + m_mutex->Lock(); + if( (m_tail + _size) > m_bufferSize ) + { + // We will have to wrap around + uint32 block1 = m_bufferSize - m_tail; + uint32 block2 = _size - block1; + + memcpy( _buffer, &m_buffer[m_tail], block1 ); + memcpy( &_buffer[block1], m_buffer, block2 ); + m_tail = block2; + } + else + { + // Requested data is in a contiguous block + memcpy( _buffer, &m_buffer[m_tail], _size ); + m_tail += _size; + } + + LogData( _buffer, _size, " Read (buffer->application): "); + + m_dataSize -= _size; + m_mutex->Unlock(); + return true; +} + +//----------------------------------------------------------------------------- +// +// Add data to the buffer +//----------------------------------------------------------------------------- +bool Stream::Put +( + uint8* _buffer, + uint32 _size +) +{ + if( (m_bufferSize-m_dataSize) < _size ) + { + // There is not enough space left in the buffer for the data + Log::Write( LogLevel_Error, "ERROR: Not enough space in stream buffer"); + return false; + } + + m_mutex->Lock(); + if( (m_head + _size) > m_bufferSize ) + { + // We will have to wrap around + uint32 block1 = m_bufferSize - m_head; + uint32 block2 = _size - block1; + + memcpy( &m_buffer[m_head], _buffer, block1 ); + memcpy( m_buffer, &_buffer[block1], block2 ); + m_head = block2; + LogData( m_buffer + m_head - block1, block1, " Read (controller->buffer): "); + LogData( m_buffer, block2, " Read (controller->buffer): "); + } + else + { + // There is enough space before we reach the end of the buffer + memcpy( &m_buffer[m_head], _buffer, _size ); + m_head += _size; + LogData(m_buffer+m_head-_size, _size, " Read (controller->buffer): "); + } + + m_dataSize += _size; + + if( IsSignalled() ) + { + // We now have more data than we are waiting for, so notify the watchers + Notify(); + } + + m_mutex->Unlock(); + return true; +} + +//----------------------------------------------------------------------------- +// +// Empty the data buffer +//----------------------------------------------------------------------------- +void Stream::Purge +( +) +{ + m_tail = 0; + m_head = 0; + m_dataSize = 0; +} + +//----------------------------------------------------------------------------- +// +// Test whether there is enough data to be signalled +//----------------------------------------------------------------------------- +bool Stream::IsSignalled +( +) +{ + return( m_dataSize >= m_signalSize ); +} + +//----------------------------------------------------------------------------- +// +// Format the stream buffer data for log output +//----------------------------------------------------------------------------- +void Stream::LogData +( + uint8* _buffer, + uint32 _length, + const string &_function +) +{ + if( !_length ) return; + + string str = ""; + for( uint32 i=0; i<_length; ++i ) + { + if( i ) + { + str += ", "; + } + + char byteStr[8]; + snprintf( byteStr, sizeof(byteStr), "0x%.2x", _buffer[i] ); + str += byteStr; + } + Log::Write( LogLevel_StreamDetail, "%s%s", _function.c_str(), str.c_str() ); +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Stream.h b/lib/ESPiLight/pilight/libs/openzwave/platform/Stream.h new file mode 100644 index 0000000..e2eeb64 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Stream.h @@ -0,0 +1,135 @@ +//----------------------------------------------------------------------------- +// +// Stream.h +// +// Cross-platform circular buffer with signalling +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _Stream_H +#define _Stream_H + +#include "../Defs.h" +#include "Wait.h" + +#include + +namespace OpenZWave +{ + class Mutex; + + /** \brief Platform-independent definition of a circular buffer. + */ + class Stream: public Wait + { + friend class Wait; + + public: + /** + * Constructor. + * Creates a cross-platform ring buffer object + */ + Stream( uint32 _bufferSize ); + + /** + * Set the number of bytes the buffer must contain before it becomes signalled. + * Once the threshold is set, the application can use Wait::Single or Wait::Multiple + * to wait until the buffer has been filled with the desired amount of data. + * \param _size the amoutn of data in bytes that the buffer must contain for it to become signalled. + * \see Wait::Single, Wait::Multiple + */ + void SetSignalThreshold( uint32 _size ); + + + /** + * Copies the requested amount of data from the stream, removing it from the stream as it does so. + * If there is insufficient data available, the method returns false, and no data is transferred. + * \param _buffer pointer to a block of memory that will be filled with the stream data. + * \param _size the amount of data in bytes to copy from the stream. + * \return true if all the requested data has been copied. False if there was not enough data in + * the stream. + * \see GetDataSize, Put + */ + bool Get( uint8* _buffer, uint32 _size ); + + /** + * Copies the requested amount of data from the buffer into the stream. + * If there is insufficient room available in the stream's circular buffer, and no data is transferred. + * \param _buffer pointer to a block of memory that will be copied into the stream. + * \param _size the amount of data in bytes to copy to the stream. + * \return true if all the requested data has been copied. False if there was not enough space in + * the stream's circular buffer. + * \see Get, GetDataSize + */ + bool Put( uint8* _buffer, uint32 _size ); + + /** + * Returns the amount of data in bytes that is stored in the stream. + * \return the number of bytes of data in the stream. + * \see Get, GetDataSize + */ + uint32 GetDataSize()const{ return m_dataSize; } + + /** + * Empties the stream bytes held in the buffer. + * This is called when the library gets out of sync with the controller and sends a "NAK" + * to the controller. + */ + void Purge(); + + protected: + /** + * Formats stream buffer data for output to the log. + * \param _buffer pointer to the stream buffer "head" location + * \param _size number of valid bytes currently in the buffer + * \param _function string containing text to display before the data + */ + void LogData( uint8* _buffer, uint32 _size, const string &_function ); + + /** + * Used by the Wait class to test whether the buffer contains sufficient data. + */ + virtual bool IsSignalled(); + + /** + * Destructor. + * Destroys the ring buffer object. + */ + ~Stream(); + + private: + Stream( Stream const& ); // prevent copy + Stream& operator = ( Stream const& ); // prevent assignment + + uint8* m_buffer; + uint32 m_bufferSize; + uint32 m_signalSize; + uint32 m_dataSize; + uint32 m_head; + uint32 m_tail; + Mutex* m_mutex; + }; + +} // namespace OpenZWave + +#endif //_Event_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Thread.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/Thread.cpp new file mode 100644 index 0000000..8b5cf5d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Thread.cpp @@ -0,0 +1,123 @@ +//----------------------------------------------------------------------------- +// +// Thread.cpp +// +// Cross-platform threads +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include "../Defs.h" +#include "Event.h" +#include "Thread.h" + +#ifdef _WIN32 +#include "windows/ThreadImpl.h" // Platform-specific implementation of a thread +#else +#include "unix/ThreadImpl.h" // Platform-specific implementation of a thread +#endif + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Thread::Thread +( + string const& _name +) +{ + m_exitEvent = new Event(); + m_pImpl = new ThreadImpl( this, _name ); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +Thread::~Thread +( +) +{ + delete m_pImpl; + m_exitEvent->Release(); +} + +//----------------------------------------------------------------------------- +// +// Start a function running on this thread +//----------------------------------------------------------------------------- +bool Thread::Start +( + pfnThreadProc_t _pfnThreadProc, + void* _context +) +{ + return( m_pImpl->Start( _pfnThreadProc, m_exitEvent, _context ) ); +} + +//----------------------------------------------------------------------------- +// +// Stop a function running on this thread +//----------------------------------------------------------------------------- +bool Thread::Stop +( +) +{ + int32 timeout = 2000; // Give the thread 2 seconds to exit + m_exitEvent->Set(); + + if( Wait::Single( this, timeout ) < 0 ) + { + // Timed out + m_pImpl->Terminate(); + return false; + } + + return true; +} + +//----------------------------------------------------------------------------- +// +// Causes the thread to sleep for the specified number of milliseconds. +//----------------------------------------------------------------------------- +void Thread::Sleep +( + uint32 _milliseconds +) +{ + return( m_pImpl->Sleep( _milliseconds ) ); +} + +//----------------------------------------------------------------------------- +// +// Test whether the event is set +//----------------------------------------------------------------------------- +bool Thread::IsSignalled +( +) +{ + return m_pImpl->IsSignalled(); +} + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Thread.h b/lib/ESPiLight/pilight/libs/openzwave/platform/Thread.h new file mode 100644 index 0000000..874845f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Thread.h @@ -0,0 +1,101 @@ +//----------------------------------------------------------------------------- +// +// Thread.h +// +// Cross-platform threads +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _Thread_H +#define _Thread_H + +#include +#include "../Defs.h" +#include "Wait.h" + +namespace OpenZWave +{ + class ThreadImpl; + class Event; + + /** \brief Implements a platform-independent thread management class. + */ + class Thread: public Wait + { + public: + typedef void (*pfnThreadProc_t)( Event* _exitEvent, void* _context ); + + /** + * Constructor. + * Creates a thread object that can be used to serialize access to a shared resource. + */ + Thread( string const& _name ); + + /** + * Start running a function on this thread. + * Attempts to start a function running on this thread. The call will fail if another + * function is already running. + * \param _pThreadProc pointer to the function to be run. The function must take a + * single void pointer as its only argument, and return void. On entry, the pointer + * will be set to the context provided to this Start method. + * \param _context pointer allowing any relevant data to be passed to the thread function. + * \return True if the function was successfully started. + * \see Stop, IsRunning + */ + bool Start( pfnThreadProc_t _pfnThreadProc, void* _context ); + + /** + * Stop a function running on this thread. + * Attempts to stop a function running on this thread. The call will fail if no + * function is running. + * \return True if the function was successfully stopped. + * \see Start, IsRunning + */ + bool Stop(); + + /** + * Causes the thread to sleep for the specified number of milliseconds. + * \param _millisecs Number of milliseconds to sleep. + */ + void Sleep( uint32 _millisecs ); + + protected: + /** + * Used by the Wait class to test whether the thread has been completed. + */ + virtual bool IsSignalled(); + + /** + * Destructor. + * Destroys the Thread object. + */ + virtual ~Thread(); + + private: + ThreadImpl* m_pImpl; // Pointer to an object that encapsulates the platform-specific implementation of a thread. + Event* m_exitEvent; + }; + +} // namespace OpenZWave + +#endif //_Thread_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/TimeStamp.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/TimeStamp.cpp new file mode 100644 index 0000000..7023b9d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/TimeStamp.cpp @@ -0,0 +1,106 @@ +//----------------------------------------------------------------------------- +// +// TimeStamp.h +// +// Cross-platform TimeStamp +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include +#include "../Defs.h" +#include "TimeStamp.h" + +#ifdef _WIN32 +#include "windows/TimeStampImpl.h" // Platform-specific implementation of a TimeStamp +#else +#include "unix/TimeStampImpl.h" // Platform-specific implementation of a TimeStamp +#endif + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +TimeStamp::TimeStamp +( +): + m_pImpl( new TimeStampImpl() ) +{ +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +TimeStamp::~TimeStamp +( +) +{ + delete m_pImpl; +} + +//----------------------------------------------------------------------------- +// +// Sets the timestamp to now, plus an offset in milliseconds +//----------------------------------------------------------------------------- +void TimeStamp::SetTime +( + int32 _milliseconds // = 0 +) +{ + m_pImpl->SetTime( _milliseconds ); +} + +//----------------------------------------------------------------------------- +// +// Gets the difference between now and the timestamp time in milliseconds +//----------------------------------------------------------------------------- +int32 TimeStamp::TimeRemaining +( +) +{ + return m_pImpl->TimeRemaining(); +} + +//----------------------------------------------------------------------------- +// +// Return object as a string +//----------------------------------------------------------------------------- +string TimeStamp::GetAsString +( +) +{ + return m_pImpl->GetAsString(); +} +//----------------------------------------------------------------------------- +// +// Overload the subtract operator to get the difference between two +// timestamps in milliseconds +//----------------------------------------------------------------------------- +int32 TimeStamp::operator- +( + TimeStamp const& _other +) +{ + return (int32)(m_pImpl - _other.m_pImpl); +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/TimeStamp.h b/lib/ESPiLight/pilight/libs/openzwave/platform/TimeStamp.h new file mode 100644 index 0000000..8acc647 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/TimeStamp.h @@ -0,0 +1,91 @@ +//----------------------------------------------------------------------------- +// +// TimeStamp.h +// +// Cross-platform TimeStamp +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _TimeStamp_H +#define _TimeStamp_H + +#include "../Defs.h" + +namespace OpenZWave +{ + class TimeStampImpl; + + /** \brief Implements a platform-independent TimeStamp. + */ + class OPENZWAVE_EXPORT TimeStamp + { + public: + /** + * Constructor. + * Creates a TimeStamp object. + */ + TimeStamp(); + + /** + * Destructor. + * Destroys the TimeStamp object. + */ + ~TimeStamp(); + + /** + * SetTime. Sets the timestamp to now, plus the offset in milliseconds. + * \param _milliseconds optional positive or negative offset from + * now in milliseconds. Defaults to zero. + */ + void SetTime( int32 _milliseconds = 0 ); + + /** + * TimeRemaining. Gets the difference between now and the timestamp + * time in milliseconds. + * \return milliseconds remaining until we reach the timestamp. The + * return value is negative if the timestamp is in the past. + */ + int32 TimeRemaining(); + + /** + * Return as a string for output. + * \return string + */ + string GetAsString(); + + /** + * Overload the subtract operator to get the difference between + * two timestamps in milliseconds. + */ + int32 operator- ( TimeStamp const& _other ); + + private: + TimeStamp( TimeStamp const& ); // prevent copy + TimeStamp& operator = ( TimeStamp const& ); // prevent assignment + + TimeStampImpl* m_pImpl; // Pointer to an object that encapsulates the platform-specific implementation of the TimeStamp. + }; + +} // namespace OpenZWave + +#endif //_TimeStamp_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Wait.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/Wait.cpp new file mode 100644 index 0000000..cae8b39 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Wait.cpp @@ -0,0 +1,182 @@ +//----------------------------------------------------------------------------- +// +// Wait.cpp +// +// Base class for objects we want to be able to wait for. +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include +#include "../Defs.h" +#include "Wait.h" +#include "Event.h" +#include "Log.h" + +#ifdef _WIN32 +#include "windows/WaitImpl.h" // Platform-specific implementation of a Wait object +#else +#include "unix/WaitImpl.h" // Platform-specific implementation of a Wait object +#endif + +using namespace OpenZWave; + +void WaitMultipleCallback( void* _context ); + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Wait::Wait +( +) +{ + m_pImpl = new WaitImpl( this ); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +Wait::~Wait +( +) +{ + delete m_pImpl; +} + +//----------------------------------------------------------------------------- +// +// Add a watcher to our object. +//----------------------------------------------------------------------------- +void Wait::AddWatcher +( + pfnWaitNotification_t _callback, + void* _context +) +{ + if( !_callback ) + { + assert(0); + return; + } + + // Add a ref so our object cannot disappear while being watched + AddRef(); + + // Add the watcher (platform specific code required here for thread safety) + m_pImpl->AddWatcher( _callback, _context ); +} + +//----------------------------------------------------------------------------- +// +// Remove a watcher from our object. +//----------------------------------------------------------------------------- +void Wait::RemoveWatcher +( + pfnWaitNotification_t _callback, + void* _context +) +{ + if( m_pImpl->RemoveWatcher( _callback, _context ) ) + { + Release(); + } +} + +//----------------------------------------------------------------------------- +// +// Notify all the watchers that the object has become signalled +//----------------------------------------------------------------------------- +void Wait::Notify +( +) +{ + m_pImpl->Notify(); +} + +//----------------------------------------------------------------------------- +// +// Wait for one of multiple objects to become signalled. +//----------------------------------------------------------------------------- +int32 Wait::Multiple +( + Wait** _objects, + uint32 _numObjects, + int32 _timeout // = -1 +) +{ + uint32 i; + + // Create an event that will be set when any of the objects in the list becomes signalled. + Event* waitEvent = new Event(); + + // Add a watcher to each object in the list, passing in the event as the context. + for( i=0; i<_numObjects; ++i ) + { + _objects[i]->AddWatcher( WaitMultipleCallback, waitEvent ); + } + + int32 res = -1; // Default to timeout result + string str = ""; + if( waitEvent->Wait( _timeout ) ) + { + // An object was signalled. Run through the list + // and see which one it was. + for( i=0; i<_numObjects; ++i ) + { + if( _objects[i]->IsSignalled() ) + { + if( res == -1 ) + res = (int32)i; + char buf[15]; + snprintf(buf, sizeof(buf), "%d, ", i); + str += buf; + } + } + } + //Log::Write( LogLevel_Debug, "Wait::Multiple res=%d num=%d >%s", res, _numObjects, str.c_str() ); + + // Remove the watchers + for( i=0; i<_numObjects; ++i ) + { + _objects[i]->RemoveWatcher( WaitMultipleCallback, waitEvent ); + } + + // We're done with the event now + waitEvent->Release(); + return res; +} + + +//----------------------------------------------------------------------------- +// +// Callback handler for the watchers added during WaitImpl::Multiple +//----------------------------------------------------------------------------- +void WaitMultipleCallback +( + void* _context +) +{ + Event* waitEvent = (Event*)_context; + waitEvent->Set(); +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/Wait.h b/lib/ESPiLight/pilight/libs/openzwave/platform/Wait.h new file mode 100644 index 0000000..6321ec3 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/Wait.h @@ -0,0 +1,113 @@ +//----------------------------------------------------------------------------- +// +// Wait.h +// +// Cross-platform abstract base class for objects we +// want to be able to wait for. +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _Wait_H +#define _Wait_H + +#include +#include "Ref.h" + +namespace OpenZWave +{ + class WaitImpl; + + /** \brief Platform-independent definition of Wait objects. + */ + class Wait: public Ref + { + friend class WaitImpl; + friend class ThreadImpl; + + public: + enum + { + Timeout_Immediate = 0, + Timeout_Infinite = -1 + }; + + typedef void (*pfnWaitNotification_t)( void* _context ); + + /** + * Add a watcher to our object. The watcher will be triggered + * by the derived class, when it enters a certain state. + * \param _callback pointer to the function that will be called when the wait is over. + * \param _context pointer to custom data that will be sent with the callback. + */ + void AddWatcher( pfnWaitNotification_t _callback, void* _context ); + + /** + * Remove a watcher from our object. Both the _callback and _context pointers + * must match those used in a previous call to AddWatcher. + * \param _callback pointer to the function that will be called when the wait is over. + * \param _context pointer to custom data that will be sent with the callback. + */ + void RemoveWatcher( pfnWaitNotification_t _callback, void* _context ); + + /** + * Wait for a single object to become signalled. + * \param _object pointer to the object to wait on. + * \param _timeout optional maximum time to wait. Defaults to -1, which means wait forever. + * \return zero if the object was signalled, -1 if the wait timed out. + */ + static int32 Single( Wait* _object, int32 _timeout = -1 ){ return Multiple( &_object, 1, _timeout ); } + + /** + * Wait for one of multiple objects to become signalled. If more than one object is in + * a signalled state, the lowest array index will be returned. + * \param _objects array of pointers to objects to wait on. + * \param _numObjects number of objects in the array. + * \param _timeout optional maximum time to wait. Defaults to -1, which means wait forever. + * \return index into the array of the object that was signalled, -1 if the wait timed out. + */ + static int32 Multiple( Wait** _objects, uint32 _numObjects, int32 _timeout = -1 ); + + protected: + Wait(); + virtual ~Wait(); + + /** + * Notify the watchers that the object is signalled. + */ + void Notify(); + + /** + * Test whether an object is signalled. + */ + virtual bool IsSignalled() = 0; + + private: + Wait( Wait const& ); // prevent copy + Wait& operator = ( Wait const& ); // prevent assignment + + WaitImpl* m_pImpl; // Pointer to an object that encapsulates the platform-specific implementation of a Wait object. + }; + +} // namespace OpenZWave + +#endif //_Wait_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/CMakeLists.txt b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/CMakeLists.txt new file mode 100644 index 0000000..0a79230 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/CMakeLists.txt @@ -0,0 +1,6 @@ +project(openzwave_platform_unix) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.cpp") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/EventImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/EventImpl.cpp new file mode 100644 index 0000000..67103c3 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/EventImpl.cpp @@ -0,0 +1,262 @@ +//----------------------------------------------------------------------------- +// +// EventImpl.cpp +// +// POSIX implementation of a cross-platform event +// +// Copyright (c) 2010, Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include "../../Defs.h" +#include "EventImpl.h" + +#include +#include + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +EventImpl::EventImpl +( +): + m_manualReset( true ), + m_isSignaled( false ), + m_waitingThreads( 0 ) +{ + pthread_mutexattr_t ma; + pthread_mutexattr_init( &ma ); + pthread_mutexattr_settype( &ma, PTHREAD_MUTEX_ERRORCHECK ); + pthread_mutex_init( &m_lock, &ma ); + pthread_mutexattr_destroy( &ma ); + + pthread_condattr_t ca; + pthread_condattr_init( &ca ); + pthread_condattr_setpshared( &ca, PTHREAD_PROCESS_PRIVATE ); + pthread_cond_init( &m_condition, &ca ); + pthread_condattr_destroy( &ca ); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +EventImpl::~EventImpl +( +) +{ + pthread_mutex_destroy( &m_lock ); + pthread_cond_destroy( &m_condition ); +} + +//----------------------------------------------------------------------------- +// +// Set the event to signalled +//----------------------------------------------------------------------------- +void EventImpl::Set +( +) +{ + int err = pthread_mutex_lock( &m_lock ); + if( err != 0 ) + { + fprintf(stderr, "EventImpl::Set lock error %d (%d)\n", errno, err ); + assert( 0 ); + } + if( m_manualReset ) + { + m_isSignaled = true; + err = pthread_cond_broadcast( &m_condition ); + if( err != 0 ) + { + fprintf(stderr, "EventImpl::Set cond broadcast error %d (%d)\n", errno, err ); + assert( 0 ); + } + } + else + { + if( !m_waitingThreads ) + { + m_isSignaled = true; + } + else + { + err = pthread_cond_signal( &m_condition ); + if( err != 0 ) + { + fprintf(stderr, "EventImpl::Set cond signal error %d (%d)\n", errno, err ); + assert( 0 ); + } + } + } + err = pthread_mutex_unlock( &m_lock ); + if( err != 0 ) + { + fprintf(stderr, "EventImpl::Set unlock error %d (%d)\n", errno, err ); + assert( 0 ); + } +} + +//----------------------------------------------------------------------------- +// +// Set the event to not signalled +//----------------------------------------------------------------------------- +void EventImpl::Reset +( +) +{ + int err = pthread_mutex_lock ( &m_lock ); + if( err != 0 ) + { + fprintf(stderr, "EventImpl::Reset lock error %d (%d)\n", errno, err ); + assert( 0 ); + } + m_isSignaled = false; + err = pthread_mutex_unlock( &m_lock ); + if( err != 0 ) + { + fprintf(stderr, "EventImpl::Reset unlock error %d (%d)\n", errno, err ); + assert( 0 ); + } +} + +//----------------------------------------------------------------------------- +// +// Test whether the event is set +//----------------------------------------------------------------------------- +bool EventImpl::IsSignalled +( +) +{ + return m_isSignaled; +} + +//----------------------------------------------------------------------------- +// +// Wait for the event to become signalled +//----------------------------------------------------------------------------- +bool EventImpl::Wait +( + int32 const _timeout /* milliseconds */ +) +{ + bool result = true; + + int err = pthread_mutex_lock( &m_lock ); + if( err != 0 ) + { + fprintf(stderr, "EventImpl::Wait lock error %d (%d)\n", errno, err ); + assert( 0 ); + } + if( m_isSignaled ) + { + if ( !m_manualReset ) + { + m_isSignaled = false; + } + } + else + { + ++m_waitingThreads; + if( _timeout == 0 ) + { + result = m_isSignaled; + } + else if( _timeout > 0 ) + { + struct timeval now; + struct timespec abstime; + + gettimeofday(&now, NULL); + + abstime.tv_sec = now.tv_sec + (_timeout / 1000); + + // Now add the remainder of our timeout to the microseconds part of 'now' + now.tv_usec += (_timeout % 1000) * 1000; + + // Careful now! Did it wrap? + while( now.tv_usec >= ( 1000 * 1000 ) ) + { + // Yes it did so bump our seconds and subtract + now.tv_usec -= (1000 * 1000); + abstime.tv_sec++; + } + + abstime.tv_nsec = now.tv_usec * 1000; + + while( !m_isSignaled ) + { + int oldstate; + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate); + + err = pthread_cond_timedwait( &m_condition, &m_lock, &abstime ); + + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate); + + if( err == ETIMEDOUT ) + { + result = false; + break; + } + else + if( err == 0 ) + { + result = true; + } + else + { + fprintf(stderr, "EventImpl::Wait cond timedwait error %d (%d)\n", errno, err ); + assert( 0 ); + } + } + } + else + { + while( !m_isSignaled ) + { + int oldstate; + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate); + + err = pthread_cond_wait( &m_condition, &m_lock ); + + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate); + + if( err != 0 ) + { + fprintf(stderr, "EventImpl::Wait cond wait error %d (%d)\n", errno, err ); + assert( 0 ); + } + } + } + --m_waitingThreads; + } + + err = pthread_mutex_unlock( &m_lock ); + if( err != 0 ) + { + fprintf(stderr, "EventImpl::Wait unlock error %d (%d)\n", errno, err ); + assert( 0 ); + } + return result; +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/EventImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/EventImpl.h new file mode 100644 index 0000000..0c3859d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/EventImpl.h @@ -0,0 +1,66 @@ +//----------------------------------------------------------------------------- +// +// EventImpl.h +// +// POSIX implementation of a cross-platform event +// +// Copyright (c) 2010, Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _EventImpl_H +#define _EventImpl_H + +#ifdef _WIN32 + #include "../../libs/pthreadw32/pthread.h" +#else + #include +#endif +#include + +namespace OpenZWave +{ + class EventImpl + { + private: + friend class Event; + friend class SocketImpl; + friend class Wait; + + EventImpl(); + ~EventImpl(); + + void Set(); + void Reset(); + + bool Wait( int32 _timeout ); // The wait method is to be used only by the Wait::Multiple method + bool IsSignalled(); + + pthread_mutex_t m_lock; + pthread_cond_t m_condition; + bool m_manualReset; + bool m_isSignaled; + unsigned int m_waitingThreads; + }; + +} // namespace OpenZWave + +#endif //_EventImpl_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/FileOpsImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/FileOpsImpl.cpp new file mode 100644 index 0000000..6cf59d8 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/FileOpsImpl.cpp @@ -0,0 +1,71 @@ +//----------------------------------------------------------------------------- +// +// FileOpsImpl.cpp +// +// Unix implementation of file operations +// +// Copyright (c) 2012, Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include +#include "FileOpsImpl.h" + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +FileOpsImpl::FileOpsImpl +( +) +{ +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +FileOpsImpl::~FileOpsImpl +( +) +{ +} + +//----------------------------------------------------------------------------- +// +// Determine if a folder exists +//----------------------------------------------------------------------------- +bool FileOpsImpl::FolderExists +( + string _folderName +) +{ + DIR *dirp = opendir( _folderName.c_str() ); + if( dirp != NULL ) + { + closedir( dirp ); + return true; + } + else + return false; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/FileOpsImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/FileOpsImpl.h new file mode 100644 index 0000000..f7466d4 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/FileOpsImpl.h @@ -0,0 +1,52 @@ +//----------------------------------------------------------------------------- +// +// FileOpsImpl.h +// +// Unix implementation of file operations +// +// Copyright (c) 2012, Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _FileOpsImpl_H +#define _FileOpsImpl_H + +#include +#include +#include "../../Defs.h" +#include "../FileOps.h" + +namespace OpenZWave +{ + class FileOpsImpl + { + friend class FileOps; + + private: + FileOpsImpl(); + ~FileOpsImpl(); + + bool FolderExists( string _filename ); + }; + +} // namespace OpenZWave + +#endif //_FileOpsImpl_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/LogImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/LogImpl.cpp new file mode 100644 index 0000000..7449562 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/LogImpl.cpp @@ -0,0 +1,326 @@ +//----------------------------------------------------------------------------- +// +// LogImpl.cpp +// +// Unix implementation of message and error logging +// +// Copyright (c) 2010, Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include +#include +#ifdef _WIN32 + #include "../../libs/pthreadw32/pthread.h" +#else + #include +#endif +#include +#include "../../Defs.h" +#include "LogImpl.h" + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +LogImpl::LogImpl +( + string const& _filename, + bool const _bAppendLog, + bool const _bConsoleOutput, + LogLevel const _saveLevel, + LogLevel const _queueLevel, + LogLevel const _dumpTrigger +): + m_filename( _filename ), // name of log file + m_bConsoleOutput( _bConsoleOutput ), // true to provide a copy of output to console + m_bAppendLog( _bAppendLog ), // true to append (and not overwrite) any existing log + m_saveLevel( _saveLevel ), // level of messages to log to file + m_queueLevel( _queueLevel ), // level of messages to log to queue + m_dumpTrigger( _dumpTrigger ) // dump queued messages when this level is seen +{ + if ( !m_bAppendLog ) + { + this->pFile = fopen( m_filename.c_str(), "w" ); + } else { + this->pFile = fopen( m_filename.c_str(), "a" ); + } + if( this->pFile == NULL ) + { + std::cerr << "Could Not Open OZW Log File." << std::endl; + } + setlinebuf(stdout); // To prevent buffering and lock contention issues +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +LogImpl::~LogImpl +( +) +{ + fclose( this->pFile ); +} + +//----------------------------------------------------------------------------- +// +// Write to the log +//----------------------------------------------------------------------------- +void LogImpl::Write +( + LogLevel _logLevel, + uint8 const _nodeId, + char const* _format, + va_list _args +) +{ + // create a timestamp string + string timeStr = GetTimeStampString(); + string nodeStr = GetNodeString( _nodeId ); + string loglevelStr = GetLogLevelString(_logLevel); + + // handle this message + if( (_logLevel <= m_queueLevel) || (_logLevel == LogLevel_Internal) ) // we're going to do something with this message... + { + char lineBuf[1024] = {0}; + //int lineLen = 0; + if( _format != NULL && _format[0] != '\0' ) + { + va_list saveargs; + va_copy( saveargs, _args ); + + vsnprintf( lineBuf, sizeof(lineBuf), _format, _args ); + va_end( saveargs ); + } + + // should this message be saved to file (and possibly written to console?) + if( (_logLevel <= m_saveLevel) || (_logLevel == LogLevel_Internal) ) + { + std::string outBuf; + + if ( this->pFile != NULL || m_bConsoleOutput ) + { + if( _logLevel != LogLevel_Internal ) // don't add a second timestamp to display of queued messages + { + outBuf.append(timeStr); + outBuf.append(loglevelStr); + outBuf.append(nodeStr); + outBuf.append(lineBuf); + outBuf.append("\n"); + + } + + // print message to file (and possibly screen) + if( this->pFile != NULL ) + { + fputs( outBuf.c_str(), pFile ); + } + if( m_bConsoleOutput ) + { + fputs( outBuf.c_str(), stdout ); + } + } + } + + if( _logLevel != LogLevel_Internal ) + { + char queueBuf[1024]; + string threadStr = GetThreadId(); + snprintf( queueBuf, sizeof(queueBuf), "%s%s%s", timeStr.c_str(), threadStr.c_str(), lineBuf ); + Queue( queueBuf ); + } + } + + // now check to see if the _dumpTrigger has been hit + if( (_logLevel <= m_dumpTrigger) && (_logLevel != LogLevel_Internal) && (_logLevel != LogLevel_Always) ) + QueueDump(); +} + +//----------------------------------------------------------------------------- +// +// Write to the log queue +//----------------------------------------------------------------------------- +void LogImpl::Queue +( + char const* _buffer +) +{ + string bufStr = _buffer; + m_logQueue.push_back( bufStr ); + + // rudimentary queue size management + if( m_logQueue.size() > 500 ) + { + m_logQueue.pop_front(); + } +} + +//----------------------------------------------------------------------------- +// +// Dump the LogQueue to output device +//----------------------------------------------------------------------------- +void LogImpl::QueueDump +( +) +{ + Log::Write( LogLevel_Always, "" ); + Log::Write( LogLevel_Always, "Dumping queued log messages"); + Log::Write( LogLevel_Always, "" ); + list::iterator it = m_logQueue.begin(); + while( it != m_logQueue.end() ) + { + string strTemp = *it; + Log::Write( LogLevel_Internal, strTemp.c_str() ); + it++; + } + m_logQueue.clear(); + Log::Write( LogLevel_Always, "" ); + Log::Write( LogLevel_Always, "End of queued log message dump"); + Log::Write( LogLevel_Always, "" ); +} + +//----------------------------------------------------------------------------- +// +// Clear the LogQueue +//----------------------------------------------------------------------------- +void LogImpl::QueueClear +( +) +{ + m_logQueue.clear(); +} + +//----------------------------------------------------------------------------- +// +// Sets the various log state variables +//----------------------------------------------------------------------------- +void LogImpl::SetLoggingState +( + LogLevel _saveLevel, + LogLevel _queueLevel, + LogLevel _dumpTrigger +) +{ + m_saveLevel = _saveLevel; + m_queueLevel = _queueLevel; + m_dumpTrigger = _dumpTrigger; +} + +//----------------------------------------------------------------------------- +// +// Generate a string with formatted current time +//----------------------------------------------------------------------------- +string LogImpl::GetTimeStampString +( +) +{ + struct timeval tv; + struct tm tm; + char fmt[64], buf[64], line[256]; + gettimeofday(&tv, NULL); +#ifdef _WIN32 + struct tm *tm1; + if((tm1 = gmtime(&tv.tv_sec)) != 0) { + memcpy(&tm, tm1, sizeof(struct tm)); +#else + if((gmtime_r(&tv.tv_sec, &tm)) != 0) { +#endif + strftime(fmt, sizeof(fmt), "%b %d %H:%M:%S", &tm); + snprintf(buf, sizeof(buf), "%s:%03u", fmt, (unsigned int)tv.tv_usec); + } + sprintf(line, "[%22.22s] %s: [Z-Wave]: ", buf, "pilight-daemon"); + + string str = line; + return str; +} + +//----------------------------------------------------------------------------- +// +// Generate a string with formatted node id +//----------------------------------------------------------------------------- +string LogImpl::GetNodeString +( + uint8 const _nodeId +) +{ + if( _nodeId == 0 ) + { + return ""; + } + else + if( _nodeId == 255 ) // should make distinction between broadcast and controller better for SwitchAll broadcast + { + return "contrlr, "; + } + else + { + char buf[20]; + snprintf( buf, sizeof(buf), "Node%03d, ", _nodeId ); + return buf; + } +} + +//----------------------------------------------------------------------------- +// +// Generate a string with formatted thread id +//----------------------------------------------------------------------------- +string LogImpl::GetThreadId +( +) +{ + char buf[20]; + snprintf( buf, sizeof(buf), "%08lx ", (long unsigned int)pthread_self() ); + string str = buf; + return str; +} + +//----------------------------------------------------------------------------- +// +// Provide a new log file name (applicable to future writes) +//----------------------------------------------------------------------------- +void LogImpl::SetLogFileName +( + const string &_filename +) +{ + m_filename = _filename; +} + + +//----------------------------------------------------------------------------- +// +// Provide a new log file name (applicable to future writes) +//----------------------------------------------------------------------------- +string LogImpl::GetLogLevelString +( + LogLevel _level +) +{ + if ((_level >= LogLevel_None) && (_level <= LogLevel_Internal)) { + char buf[20]; + snprintf( buf, sizeof(buf), "%s, ", LogLevelString[_level] ); + return buf; + } + else + return "Unknown, "; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/LogImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/LogImpl.h new file mode 100644 index 0000000..7783a7c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/LogImpl.h @@ -0,0 +1,73 @@ +//----------------------------------------------------------------------------- +// +// LogImpl.h +// +// Unix implementation of message and error logging +// +// Copyright (c) 2010, Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _LogImpl_H +#define _LogImpl_H + +#include +#include +#include +#include +#include +#include "../Log.h" + +namespace OpenZWave +{ + class LogImpl : public i_LogImpl + { + private: + friend class Log; + + LogImpl( string const& _filename, bool const _bAppendLog, bool const _bConsoleOutput, LogLevel const _saveLevel, LogLevel const _queueLevel, LogLevel const _dumpTrigger ); + ~LogImpl(); + + void Write( LogLevel _level, uint8 const _nodeId, char const* _format, va_list _args ); + void Queue( char const* _buffer ); + void QueueDump(); + void QueueClear(); + void SetLoggingState( LogLevel _saveLevel, LogLevel _queueLevel, LogLevel _dumpTrigger ); + void SetLogFileName( const string &_filename ); + + string GetTimeStampString(); + string GetNodeString( uint8 const _nodeId ); + string GetThreadId(); + string GetLogLevelString(LogLevel _level); + + string m_filename; /**< filename specified by user (default is ozw_log.txt) */ + bool m_bConsoleOutput; /**< if true, send log output to console as well as to the file */ + bool m_bAppendLog; /**< if true, the log file should be appended to any with the same name */ + list m_logQueue; /**< list of queued log messages */ + LogLevel m_saveLevel; + LogLevel m_queueLevel; + LogLevel m_dumpTrigger; + FILE* pFile; + }; + +} // namespace OpenZWave + +#endif //_LogImpl_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/MutexImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/MutexImpl.cpp new file mode 100644 index 0000000..2f79de1 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/MutexImpl.cpp @@ -0,0 +1,136 @@ +//---------------------------------------------------------------------------- +// +// MutexImpl.cpp +// +// POSIX implementation of the cross-platform mutex +// +// Copyright (c) 2010, Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "../../Defs.h" +#include "../Log.h" +#include "MutexImpl.h" + +#include +#include + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +MutexImpl::MutexImpl +( +): + m_lockCount( 0 ) +{ + pthread_mutexattr_t ma; + + pthread_mutexattr_init ( &ma ); + pthread_mutexattr_settype( &ma, PTHREAD_MUTEX_RECURSIVE ); + int err = pthread_mutex_init( &m_criticalSection, &ma ); + if( err != 0 ) + { + fprintf(stderr, "MutexImpl::MutexImpl error %d (%d)\n", errno, err ); + } + pthread_mutexattr_destroy( &ma ); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +MutexImpl::~MutexImpl +( +) +{ + pthread_mutex_destroy( &m_criticalSection ); +} + +//----------------------------------------------------------------------------- +// +// Lock the mutex +//----------------------------------------------------------------------------- +bool MutexImpl::Lock +( + bool const _bWait +) +{ + if( _bWait ) + { + // We will wait for the lock + int err = pthread_mutex_lock( &m_criticalSection ); + if( err == 0 ) + { + ++m_lockCount; + return true; + } + fprintf(stderr, "MutexImpl::Lock error %d (%d)\n", errno, err); + return false; + } + + // Returns immediately, even if the lock was not available. + if( pthread_mutex_trylock( &m_criticalSection ) ) + { + return false; + } + + ++m_lockCount; + return true; +} + +//----------------------------------------------------------------------------- +// +// Release our lock on the mutex +//----------------------------------------------------------------------------- +void MutexImpl::Unlock +( +) +{ + if( !m_lockCount ) + { + // No locks - we have a mismatched lock/release pair + assert(0); + } + else + { + --m_lockCount; + int err = pthread_mutex_unlock( &m_criticalSection ); + if( err != 0 ) + { + fprintf(stderr, "MutexImpl::Unlock error %d (%d)\n", errno, err); + } + } +} + +//----------------------------------------------------------------------------- +// +// Test whether the mutex is free +//----------------------------------------------------------------------------- +bool MutexImpl::IsSignalled +( +) +{ + return( 0 == m_lockCount ); +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/MutexImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/MutexImpl.h new file mode 100644 index 0000000..84bf95e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/MutexImpl.h @@ -0,0 +1,60 @@ +//---------------------------------------------------------------------------- +// +// MutexImpl.h +// +// POSIX implementation of the cross-platform mutex +// +// Copyright (c) 2010, Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _MutexImpl_H +#define _MutexImpl_H + +#include +#ifdef _WIN32 + #include "../../libs/pthreadw32/pthread.h" +#else + #include +#endif + +namespace OpenZWave +{ + class MutexImpl + { + private: + friend class Mutex; + + MutexImpl(); + ~MutexImpl(); + + bool Lock( bool const _bWait = true ); + void Unlock(); + + bool IsSignalled(); + + uint32 m_lockCount; // Keep track of the locks (there can be more than one if they occur on the same thread. + pthread_mutex_t m_criticalSection; + }; + +} // namespace OpenZWave + +#endif //_MutexIF_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/SerialControllerImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/SerialControllerImpl.cpp new file mode 100644 index 0000000..79538a5 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/SerialControllerImpl.cpp @@ -0,0 +1,373 @@ +//----------------------------------------------------------------------------- +// +// SerialControllerImpl.cpp +// +// POSIX implementation of a cross-platform serial port +// +// Copyright (c) 2010, Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include +#ifdef _WIN32 + #include "../../libs/pthreadw32/pthread.h" +#else + #include +#endif +#include "../../Defs.h" +#include "../Thread.h" +#include "../Event.h" +#include "SerialControllerImpl.h" +#include "../Log.h" + +#ifdef __linux__ +#include "../../libudev.h" +#endif + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +SerialControllerImpl::SerialControllerImpl +( + SerialController* _owner +): + m_owner( _owner ), + m_hSerialController( -1 ) +{ +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +SerialControllerImpl::~SerialControllerImpl +( +) +{ + flock(m_hSerialController, LOCK_UN); + if(m_hSerialController >= 0) + close( m_hSerialController ); +} + +//----------------------------------------------------------------------------- +// +// Open the serial port +//----------------------------------------------------------------------------- +bool SerialControllerImpl::Open +( +) +{ + // Try to init the serial port + if( !Init( 1 ) ) + { + // Failed. We bail to allow the app a chance to take over, rather than retry + // automatically. Automatic retries only occur after a successful init. + return false; + } + + // Start the read thread + m_pThread = new Thread( "SerialController" ); + m_pThread->Start( SerialReadThreadEntryPoint, this ); + + return true; +} + +//----------------------------------------------------------------------------- +// +// Close the serial port +//----------------------------------------------------------------------------- +void SerialControllerImpl::Close +( +) +{ + if( m_pThread ) + { + m_pThread->Stop(); + m_pThread->Release(); + m_pThread = NULL; + } + close( m_hSerialController ); + m_hSerialController = -1; +} + +//----------------------------------------------------------------------------- +// +// Entry point of the thread for receiving data from the serial port +//----------------------------------------------------------------------------- +void SerialControllerImpl::SerialReadThreadEntryPoint +( + Event* _exitEvent, + void* _context +) +{ + SerialControllerImpl* impl = (SerialControllerImpl*)_context; + if( impl ) + { + impl->ReadThreadProc( _exitEvent ); + } +} + +//----------------------------------------------------------------------------- +// +// Handle receiving data +//----------------------------------------------------------------------------- +void SerialControllerImpl::ReadThreadProc +( + Event* _exitEvent +) +{ + uint32 attempts = 0; + while( true ) + { + // Init must have been called successfully during Open, so we + // don't do it again until the end of the loop + if( -1 != m_hSerialController ) + { + // Enter read loop. Call will only return if + // an exit is requested or an error occurs + Read(); + + // Reset the attempts, so we get a rapid retry for temporary errors + attempts = 0; + } + + if( attempts < 25 ) + { + // Retry every 5 seconds for the first two minutes... + if( Wait::Single( _exitEvent, 5000 ) >= 0 ) + { + // Exit signalled. + break; + } + } + else + { + // ...retry every 30 seconds after that + if( Wait::Single( _exitEvent, 30000 ) >= 0 ) + { + // Exit signalled. + break; + } + } + + Init( ++attempts ); + } +} + +//----------------------------------------------------------------------------- +// +// Initialize the serial port +//----------------------------------------------------------------------------- +bool SerialControllerImpl::Init +( + uint32 const _attempts +) +{ + + string device = m_owner->m_serialControllerName; + + Log::Write( LogLevel_Info, "Trying to open serial port %s (attempt %d)", device.c_str(), _attempts ); + + m_hSerialController = open( device.c_str(), O_RDWR | O_NOCTTY, 0 ); + + if( -1 == m_hSerialController ) + { + //Error + Log::Write( LogLevel_Error, "ERROR: Cannot open serial port %s. Error code %d", device.c_str(), errno ); + goto SerialOpenFailure; + } + + if( flock( m_hSerialController, LOCK_EX | LOCK_NB) == -1 ) + { + Log::Write( LogLevel_Error, "ERROR: Cannot get exclusive lock for serial port %s. Error code %d", device.c_str(), errno ); + } + + int bits; + bits = 0; + ioctl( m_hSerialController, TIOCMSET, &bits ); + + // Configure the serial device parameters + // Build on the current configuration + struct termios tios; + + bzero( &tios, sizeof(tios) ); + tcgetattr( m_hSerialController, &tios ); + switch( m_owner->m_parity ) + { + case SerialController::Parity_None: + tios.c_iflag = IGNPAR; + break; + case SerialController::Parity_Odd: + tios.c_iflag = INPCK; + tios.c_cflag = PARENB | PARODD; + break; + default: + Log::Write( LogLevel_Error, "ERROR: Parity not supported" ); + goto SerialOpenFailure; + } + switch( m_owner->m_stopBits ) + { + case SerialController::StopBits_One: + break; // default + case SerialController::StopBits_Two: + tios.c_cflag |= CSTOPB; + break; + default: + Log::Write( LogLevel_Error, "ERROR: Stopbits not supported" ); + goto SerialOpenFailure; + } + tios.c_iflag |= IGNBRK; + tios.c_cflag |= CS8 | CREAD | CLOCAL; + tios.c_oflag = 0; + tios.c_lflag = 0; + for( int i = 0; i < NCCS; i++ ) + tios.c_cc[i] = 0; + tios.c_cc[VMIN] = 0; + tios.c_cc[VTIME] = 1; + switch( m_owner->m_baud ) + { + case 300: + cfsetspeed( &tios, B300 ); + break; + case 1200: + cfsetspeed( &tios, B1200 ); + break; + case 2400: + cfsetspeed( &tios, B2400 ); + break; + case 4800: + cfsetspeed( &tios, B4800 ); + break; + case 9600: + cfsetspeed( &tios, B9600 ); + break; + case 19200: + cfsetspeed( &tios, B19200 ); + break; + case 38400: + cfsetspeed( &tios, B38400 ); + break; + case 57600: + cfsetspeed( &tios, B57600 ); + break; +#ifdef DARWIN + case 76800: + cfsetspeed( &tios, B76800 ); + break; +#endif + case 115200: + cfsetspeed( &tios, B115200 ); + break; + case 230400: + cfsetspeed( &tios, B230400 ); + break; + default: + Log::Write( LogLevel_Error, "Baud rate not supported" ); + goto SerialOpenFailure; + } + if ( tcsetattr( m_hSerialController, TCSANOW, &tios ) == -1 ) + { + // Error. Clean up and exit + Log::Write( LogLevel_Error, "ERROR: Failed to set serial port parameters" ); + goto SerialOpenFailure; + } + + tcflush( m_hSerialController, TCIOFLUSH ); + + // Open successful + Log::Write( LogLevel_Info, "Serial port %s opened (attempt %d)", device.c_str(), _attempts ); + return true; + +SerialOpenFailure: + Log::Write( LogLevel_Error, "ERROR: Failed to open serial port %s", device.c_str() ); + if(m_hSerialController >= 0) + { + close( m_hSerialController ); + m_hSerialController = -1; + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Read data from the serial port +//----------------------------------------------------------------------------- +void SerialControllerImpl::Read +( +) +{ + uint8 buffer[256]; + + while( 1 ) + { + int32 bytesRead; + int err; + + do + { + bytesRead = read( m_hSerialController, buffer, sizeof(buffer) ); + if( bytesRead > 0 ) + m_owner->Put( buffer, bytesRead ); + } while( bytesRead > 0 ); + + do + { + struct timeval *whenp; + fd_set rds, eds; + int oldstate; + + FD_ZERO( &rds ); + FD_SET( m_hSerialController, &rds ); + FD_ZERO( &eds ); + FD_SET( m_hSerialController, &eds ); + whenp = NULL; + + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate); + err = select( m_hSerialController + 1, &rds, NULL, &eds, whenp ); + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate); + } while( err <= 0 ); + } +} + +//----------------------------------------------------------------------------- +// +// Send data to the serial port +//----------------------------------------------------------------------------- +uint32 SerialControllerImpl::Write +( + uint8* _buffer, + uint32 _length +) +{ + if( -1 == m_hSerialController ) + { + //Error + Log::Write( LogLevel_Error, "ERROR: Serial port must be opened before writing" ); + return 0; + } + + // Write the data + uint32 bytesWritten; + bytesWritten = write( m_hSerialController, _buffer, _length); + return bytesWritten; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/SerialControllerImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/SerialControllerImpl.h new file mode 100644 index 0000000..bbfe880 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/SerialControllerImpl.h @@ -0,0 +1,74 @@ +// +// SerialControllerImpl.h +// +// POSIX implementation of a cross-platform serial port +// +// Copyright (c) 2010, Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _SerialControllerImpl_H +#define _SerialControllerImpl_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../Defs.h" +#include "../SerialController.h" + +namespace OpenZWave +{ + class SerialControllerImpl + { + public: + void ReadThreadProc( Event* _exitEvent ); + + private: + friend class SerialController; + + SerialControllerImpl( SerialController* _owner ); + ~SerialControllerImpl(); + + bool Open(); + void Close(); + + uint32 Write( uint8* _buffer, uint32 _length ); + + bool Init( uint32 const _attempts ); + void Read(); + + SerialController* m_owner; + int m_hSerialController; + Thread* m_pThread; + + static void SerialReadThreadEntryPoint( Event* _exitEvent, void* _content ); + }; + +} // namespace OpenZWave + +#endif //_SerialControllerImpl_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/ThreadImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/ThreadImpl.cpp new file mode 100644 index 0000000..af2b928 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/ThreadImpl.cpp @@ -0,0 +1,183 @@ +//---------------------------------------------------------------------------- +// +// ThreadImpl.h +// +// POSIX implementation of a cross-platform thread +// +// Copyright (c) 2010, Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include +#include "../../Defs.h" +#include "../Event.h" +#include "../Thread.h" +#include "ThreadImpl.h" + +#ifdef DARWIN +#define pthread_yield pthread_yield_np +#endif + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ThreadImpl::ThreadImpl +( + Thread* _owner, + string const& _tname +): + m_owner( _owner ), +// m_hThread( NULL ), /* p_thread_t isn't a pointer in Linux, so can't do this */ + m_bIsRunning( false ), + m_name( _tname ) +{ +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +ThreadImpl::~ThreadImpl +( +) +{ +} + +//----------------------------------------------------------------------------- +// +// Start a function running on this thread +//----------------------------------------------------------------------------- +bool ThreadImpl::Start +( + Thread::pfnThreadProc_t _pfnThreadProc, + Event* _exitEvent, + void* _pContext +) +{ + pthread_attr_t ta; + + pthread_attr_init( &ta ); + pthread_attr_setstacksize ( &ta, 0 ); + pthread_attr_setdetachstate ( &ta, PTHREAD_CREATE_JOINABLE ); + + // Create a thread to run the specified function + m_pfnThreadProc = _pfnThreadProc; + m_pContext = _pContext; + m_exitEvent = _exitEvent; + m_exitEvent->Reset(); + + pthread_create ( &m_hThread, &ta, ThreadImpl::ThreadProc, this ); + pthread_detach( m_hThread ); + //fprintf(stderr, "thread %s starting %08x\n", m_name.c_str(), m_hThread); + //fflush(stderr); + + pthread_attr_destroy ( &ta ); + return true; +} + +//----------------------------------------------------------------------------- +// +// End this thread +//----------------------------------------------------------------------------- +bool ThreadImpl::Terminate +( +) +{ + // void* data = NULL; + + //fprintf(stderr, "thread %s stopping %08x running %d\n", m_name.c_str(), m_hThread, m_bIsRunning ); + //fflush(stderr); + if( !m_bIsRunning ) + { + return false; + } + + // This will kill an app that doesn't catch and ignore it. + // We need to find another way to interrupt select. + // thread_kill( m_hThread, SIGALRM ); + + //m_hThread = NULL; + m_bIsRunning = false; + + // pthread_cancel( m_hThread ); + // pthread_join( m_hThread, &data ); + + return true; +} + +//----------------------------------------------------------------------------- +// +// Cause thread to sleep for the specified number of milliseconds +//----------------------------------------------------------------------------- +void ThreadImpl::Sleep +( + uint32 _millisecs +) +{ + usleep( _millisecs*1000 ); +} + +//----------------------------------------------------------------------------- +// +// Test whether the thread has completed +//----------------------------------------------------------------------------- +bool ThreadImpl::IsSignalled +( +) +{ + return !m_bIsRunning; +} + +//----------------------------------------------------------------------------- +// +// Entry point for running a function on this thread +//----------------------------------------------------------------------------- +void *ThreadImpl::ThreadProc +( + void* _pArg +) +{ + ThreadImpl* pImpl = (ThreadImpl*)_pArg; + //fprintf(stderr, "thread %s run begin %08x running %d\n", pImpl->m_name.c_str(), pImpl->m_hThread, pImpl->m_bIsRunning ); + //fflush(stderr); + pImpl->Run(); + //fprintf(stderr, "thread %s run end %08x running %d\n", pImpl->m_name.c_str(), pImpl->m_hThread, pImpl->m_bIsRunning ); + //fflush(stderr); + return 0; +} + +//----------------------------------------------------------------------------- +// +// Entry point for running a function on this thread +//----------------------------------------------------------------------------- +void ThreadImpl::Run +( +) +{ + m_bIsRunning = true; + m_pfnThreadProc( m_exitEvent, m_pContext ); + m_bIsRunning = false; + + // Let any watchers know that the thread has finished running + m_owner->Notify(); +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/ThreadImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/ThreadImpl.h new file mode 100644 index 0000000..9d0c6bb --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/ThreadImpl.h @@ -0,0 +1,71 @@ +//---------------------------------------------------------------------------- +// +// ThreadImpl.h +// +// POSIX implementation of a cross-platform thread +// +// Copyright (c) 2010, Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _ThreadImpl_H +#define _ThreadImpl_H + +#include +#include +#ifdef _WIN32 + #include "../../libs/pthreadw32/pthread.h" +#else + #include +#endif +#include + +namespace OpenZWave +{ + class Thread; + class Event; + + class ThreadImpl + { + private: + friend class Thread; + + ThreadImpl( Thread* _owner, string const& _tname ); + ~ThreadImpl(); + + bool Start( Thread::pfnThreadProc_t _pfnThreadProc, Event* _exitEvent, void* _context ); + void Sleep( uint32 _millisecs ); + bool IsSignalled(); + bool Terminate(); + + void Run(); + static void* ThreadProc( void *parg); + + Thread* m_owner; + Event* m_exitEvent; + pthread_t m_hThread; + Thread::pfnThreadProc_t m_pfnThreadProc; + void* m_pContext; + bool m_bIsRunning; + string m_name; + }; +} // namespace OpenZWave + +#endif //_ThreadImpl_H diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/TimeStampImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/TimeStampImpl.cpp new file mode 100644 index 0000000..5390f5a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/TimeStampImpl.cpp @@ -0,0 +1,141 @@ +//----------------------------------------------------------------------------- +// +// TimeStampImpl.cpp +// +// OSX implementation of a TimeStamp +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include +#include +#include "../../Defs.h" +#include "TimeStampImpl.h" + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +TimeStampImpl::TimeStampImpl +( +) +{ + SetTime(0); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +TimeStampImpl::~TimeStampImpl +( +) +{ +} + +//----------------------------------------------------------------------------- +// +// Sets the timestamp to now, plus an offset in milliseconds +//----------------------------------------------------------------------------- +void TimeStampImpl::SetTime +( + int32 _milliseconds // = 0 +) +{ + struct timeval now; + gettimeofday(&now, NULL); + + m_stamp.tv_sec = now.tv_sec + (_milliseconds / 1000); + + // Now add the remainder of our timeout to the microseconds part of 'now' + now.tv_usec += ((_milliseconds % 1000) * 1000); + + // Careful now! Did it wrap? + if(now.tv_usec >= 1000000) + { + // Yes it did so bump our seconds and modulo + now.tv_usec %= 1000000; + m_stamp.tv_sec++; + } + + m_stamp.tv_nsec = now.tv_usec * 1000; +} + +//----------------------------------------------------------------------------- +// +// Gets the difference between now and the timestamp time in milliseconds +//----------------------------------------------------------------------------- +int32 TimeStampImpl::TimeRemaining +( +) +{ + int32 diff; + + struct timeval now; + gettimeofday(&now, NULL); + + // Seconds + diff = (int32)((m_stamp.tv_sec - now.tv_sec)*1000); + + // Milliseconds + diff += (((m_stamp.tv_nsec/1000)-now.tv_usec)/1000); + + return diff; +} + +//----------------------------------------------------------------------------- +// +// Return a string representation +//----------------------------------------------------------------------------- +string TimeStampImpl::GetAsString +( +) +{ + char str[100]; + struct tm *tm; + tm = localtime( &m_stamp.tv_sec ); + + snprintf( str, sizeof(str), "%04d-%02d-%02d %02d:%02d:%02d:%03d ", + tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec, (int)(m_stamp.tv_nsec / (1000*1000)) ); + return str; +} + +//----------------------------------------------------------------------------- +// +// Overload the subtract operator to get the difference between two +// timestamps in milliseconds +//----------------------------------------------------------------------------- +int32 TimeStampImpl::operator- +( + TimeStampImpl const& _other +) +{ + // Seconds + int32 diff = (int32)((m_stamp.tv_sec-_other.m_stamp.tv_sec)*1000); + + // Milliseconds + diff += ((m_stamp.tv_nsec - _other.m_stamp.tv_nsec)/1000000); + + return diff; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/TimeStampImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/TimeStampImpl.h new file mode 100644 index 0000000..67a822d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/TimeStampImpl.h @@ -0,0 +1,91 @@ +//----------------------------------------------------------------------------- +// +// TimeStampImpl.h +// +// OSX implementation of a TimeStamp +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _TimeStampImpl_H +#define _TimeStampImpl_H + +#include +#include +#include +#include "../../Defs.h" + +namespace OpenZWave +{ + /** \brief Windows implementation of a timestamp. + */ + class TimeStampImpl + { + public: + /** + * Constructor. + * Creates a TimeStampImpl object. + */ + TimeStampImpl(); + + /** + * Destructor. + * Destroys the TimeStampImpl object. + */ + ~TimeStampImpl(); + + /** + * SetTime. Sets the timestamp to now, plus the offset in milliseconds. + * \param _milliseconds positive or negative offset from + * now in milliseconds. + */ + void SetTime( int32 _milliseconds ); + + /** + * TimeRemaining. Gets the difference between now and the timestamp + * time in milliseconds. + * \return milliseconds remaining until we reach the timestamp. The + * return value is negative if the timestamp is in the past. + */ + int32 TimeRemaining(); + + /** + * Return as as string + */ + string GetAsString(); + + /** + * Overload the subtract operator to get the difference between + * two timestamps in milliseconds. + */ + int32 operator- ( TimeStampImpl const& _other ); + + private: + TimeStampImpl( TimeStampImpl const& ); // prevent copy + TimeStampImpl& operator = ( TimeStampImpl const& ); // prevent assignment + + struct timespec m_stamp; + }; + +} // namespace OpenZWave + +#endif //_TimeStampImpl_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/WaitImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/WaitImpl.cpp new file mode 100644 index 0000000..3b50f4a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/WaitImpl.cpp @@ -0,0 +1,160 @@ +//----------------------------------------------------------------------------- +// +// WaitImpl.cpp +// +// POSIX implementation of an abstract base class for objects we +// want to be able to wait for. +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include "../../Defs.h" +#include "../Wait.h" +#include "WaitImpl.h" + +#include +#include + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +WaitImpl::WaitImpl +( + Wait* _owner +): + m_owner( _owner ) +{ + pthread_mutexattr_t ma; + pthread_mutexattr_init ( &ma ); + pthread_mutexattr_settype( &ma, PTHREAD_MUTEX_RECURSIVE ); + pthread_mutex_init( &m_criticalSection, &ma ); + pthread_mutexattr_destroy( &ma ); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +WaitImpl::~WaitImpl +( +) +{ + pthread_mutex_destroy( &m_criticalSection ); +} + +//----------------------------------------------------------------------------- +// +// Add a watcher to our object. +//----------------------------------------------------------------------------- +void WaitImpl::AddWatcher +( + Wait::pfnWaitNotification_t _callback, + void* _context +) +{ + // Add the watcher to our list + Watcher watcher; + watcher.m_callback = _callback; + watcher.m_context = _context; + + if( pthread_mutex_lock( &m_criticalSection ) != 0 ) + { + fprintf(stderr, "WaitImpl::AddWatcher lock error %d\n", errno ); + assert( 0 ); + } + m_watchers.push_back( watcher ); + if( pthread_mutex_unlock( &m_criticalSection ) != 0 ) + { + fprintf(stderr, "WaitImpl::AddWatcher unlock error %d\n", errno ); + assert( 0 ); + } + + // If the object is already in a signalled state, notify the watcher immediately + if( m_owner->IsSignalled() ) + { + _callback( _context ); + } +} + +//----------------------------------------------------------------------------- +// +// Remove a watcher from our object. +//----------------------------------------------------------------------------- +bool WaitImpl::RemoveWatcher +( + Wait::pfnWaitNotification_t _callback, + void* _context +) +{ + bool res = false; + + if( pthread_mutex_lock( &m_criticalSection ) != 0 ) + { + fprintf(stderr, "WaitImpl::RemoveWatcher lock error %d\n", errno ); + assert( 0 ); + } + + for( list::iterator it=m_watchers.begin(); it!=m_watchers.end(); ++it ) + { + Watcher const& watcher = *it; + if( ( watcher.m_callback == _callback ) && ( watcher.m_context == _context ) ) + { + m_watchers.erase( it ); + res = true; + break; + } + } + + if( pthread_mutex_unlock( &m_criticalSection ) != 0 ) + { + fprintf(stderr, "WaitImpl::RemoveWatcher unlock error %d\n", errno ); + assert( 0 ); + } + return res; +} + +//----------------------------------------------------------------------------- +// +// Notify all the watchers that the object has become signalled +//----------------------------------------------------------------------------- +void WaitImpl::Notify +( +) +{ + if( pthread_mutex_lock( &m_criticalSection ) != 0 ) + { + fprintf(stderr, "WaitImpl::Notify lock error %d\n", errno ); + assert( 0 ); + } + for( list::iterator it=m_watchers.begin(); it!=m_watchers.end(); ++it ) + { + Watcher const& watcher = *it; + watcher.m_callback( watcher.m_context ); + } + if( pthread_mutex_unlock( &m_criticalSection ) != 0 ) + { + fprintf(stderr, "WaitImpl::Notify unlock error %d\n", errno ); + assert( 0 ); + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/unix/WaitImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/WaitImpl.h new file mode 100644 index 0000000..8734870 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/unix/WaitImpl.h @@ -0,0 +1,78 @@ +//----------------------------------------------------------------------------- +// +// WaitImpl.h +// +// POSIX implementation of a base class for objects we +// want to be able to wait for. +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _WaitImpl_H +#define _WaitImpl_H + +#include +#ifdef _WIN32 + #include "../../libs/pthreadw32/pthread.h" +#else + #include +#endif +#include +#include "../../Defs.h" +#include "../Ref.h" +#include "../Wait.h" + +namespace OpenZWave +{ + /** \brief Windows specific implementation of Wait objects. + */ + class WaitImpl + { + private: + friend class Wait; + + WaitImpl( Wait* _owner ); + virtual ~WaitImpl(); + + void AddWatcher( Wait::pfnWaitNotification_t _callback, void* _context ); + bool RemoveWatcher( Wait::pfnWaitNotification_t _callback, void* _context ); + void Notify(); + + static int32 Multiple( Wait** _objects, uint32 _numObjects, int32 _timeout = -1 ); + + WaitImpl( Wait const& ); // prevent copy + WaitImpl& operator = ( WaitImpl const& ); // prevent assignment + + struct Watcher + { + Wait::pfnWaitNotification_t m_callback; + void* m_context; + }; + + list m_watchers; + Wait* m_owner; + pthread_mutex_t m_criticalSection; + }; + +} // namespace OpenZWave + +#endif //_WaitImpl_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/CMakeLists.txt b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/CMakeLists.txt new file mode 100644 index 0000000..ace172d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/CMakeLists.txt @@ -0,0 +1,6 @@ +project(openzwave_platform_windows) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.cpp") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/EventImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/EventImpl.cpp new file mode 100644 index 0000000..df8d4ec --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/EventImpl.cpp @@ -0,0 +1,102 @@ +//----------------------------------------------------------------------------- +// +// EventImpl.cpp +// +// Windows implementation of a cross-platform event +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include + +#include "../../Defs.h" +#include "EventImpl.h" + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +EventImpl::EventImpl +( +) +{ + // Create a manual reset event + m_hEvent = ::CreateEvent( NULL, TRUE, FALSE, NULL ); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +EventImpl::~EventImpl +( +) +{ + ::CloseHandle( m_hEvent ); +} + +//----------------------------------------------------------------------------- +// +// Set the event to signalled +//----------------------------------------------------------------------------- +void EventImpl::Set +( +) +{ + ::SetEvent( m_hEvent ); +} + +//----------------------------------------------------------------------------- +// +// Set the event to not signalled +//----------------------------------------------------------------------------- +void EventImpl::Reset +( +) +{ + ::ResetEvent( m_hEvent ); +} + +//----------------------------------------------------------------------------- +// +// Test whether the event is set +//----------------------------------------------------------------------------- +bool EventImpl::IsSignalled +( +) +{ + return( WAIT_OBJECT_0 == WaitForSingleObject( m_hEvent, 0 ) ); +} + +//----------------------------------------------------------------------------- +// +// Wait for the event to become signalled +//----------------------------------------------------------------------------- +bool EventImpl::Wait +( + int32 const _timeout +) +{ + return( WAIT_TIMEOUT != ::WaitForSingleObject( m_hEvent, (DWORD)_timeout ) ); +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/EventImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/EventImpl.h new file mode 100644 index 0000000..0ba7ee5 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/EventImpl.h @@ -0,0 +1,60 @@ +//----------------------------------------------------------------------------- +// +// EventImpl.h +// +// Windows implementation of a cross-platform event +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _EventImpl_H +#define _EventImpl_H + +#include +#include "../../Defs.h" + +namespace OpenZWave +{ + /** \brief Windows-specific implementation of the Event class. + */ + class EventImpl + { + private: + friend class Event; + friend class SocketImpl; + friend class Wait; + + EventImpl(); + ~EventImpl(); + + void Set(); + void Reset(); + + bool Wait( int32 _timeout ); // The wait method is to be used only by the Wait::Multiple method + bool IsSignalled(); + + HANDLE m_hEvent; + }; + +} // namespace OpenZWave + +#endif //_EventImpl_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/FileOpsImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/FileOpsImpl.cpp new file mode 100644 index 0000000..e3d56b9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/FileOpsImpl.cpp @@ -0,0 +1,69 @@ +//----------------------------------------------------------------------------- +// +// FileOpsImpl.cpp +// +// Unix implementation of file operations +// +// Copyright (c) 2012, Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include +#include "FileOpsImpl.h" + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +FileOpsImpl::FileOpsImpl +( +) +{ +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +FileOpsImpl::~FileOpsImpl +( +) +{ +} + +//----------------------------------------------------------------------------- +// +// Determine if a folder exists +//----------------------------------------------------------------------------- +bool FileOpsImpl::FolderExists( + const string &_folderName +) +{ + int32 ftype = GetFileAttributesA(_folderName.c_str()); + if( ftype == INVALID_FILE_ATTRIBUTES ) + return false; // something is wrong with _foldername path + if( ftype & FILE_ATTRIBUTE_DIRECTORY ) + return true; + + return false; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/FileOpsImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/FileOpsImpl.h new file mode 100644 index 0000000..13b90d0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/FileOpsImpl.h @@ -0,0 +1,52 @@ +//----------------------------------------------------------------------------- +// +// FileOpsImpl.h +// +// Unix implementation of file operations +// +// Copyright (c) 2012, Greg Satz +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _FileOpsImpl_H +#define _FileOpsImpl_H + +#include +#include +#include "../../Defs.h" +#include "../FileOps.h" + +namespace OpenZWave +{ + class FileOpsImpl + { + friend class FileOps; + + private: + FileOpsImpl(); + ~FileOpsImpl(); + + bool FolderExists( const string &_filename ); + }; + +} // namespace OpenZWave + +#endif //_FileOpsImpl_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/LogImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/LogImpl.cpp new file mode 100644 index 0000000..9d3ce62 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/LogImpl.cpp @@ -0,0 +1,362 @@ +//----------------------------------------------------------------------------- +// +// LogImpl.cpp +// +// Windows implementation of message and error logging +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include +#include +#include +#include + +#include "../../Defs.h" +#include "LogImpl.h" + +#ifdef _WIN32 + +#define vsprintf_s vsnprintf +#define sprintf_s snprintf + +#define strcpy_s(DEST, NUM, SOURCE) strncpy(DEST, SOURCE, NUM) + +errno_t fopen_s(FILE** pFile, const char *filename, const char *mode) +{ + if (!pFile) + { + _set_errno(EINVAL); + return EINVAL; + } + + *pFile = fopen(filename, mode); + + if (!*pFile) + { + return errno; + } + + return 0; +} + +#endif + + + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +LogImpl::LogImpl +( + string const& _filename, + bool const _bAppendLog, + bool const _bConsoleOutput, + LogLevel const _saveLevel, + LogLevel const _queueLevel, + LogLevel const _dumpTrigger +): + m_filename( _filename ), // name of log file + m_bAppendLog( _bAppendLog ), // true to append (and not overwrite) any existing log + m_bConsoleOutput( _bConsoleOutput ), // true to provide a copy of output to console + m_saveLevel( _saveLevel ), // level of messages to log to file + m_queueLevel( _queueLevel ), // level of messages to log to queue + m_dumpTrigger( _dumpTrigger ) // dump queued messages when this level is seen +{ + string accessType; + + // create an adjusted file name and timestamp string + string timeStr = GetTimeStampString(); + + if ( m_bAppendLog ) + { + accessType = "a"; + } + else + { + accessType = "w"; + } + + FILE* pFile; + if( !fopen_s( &pFile, _filename.c_str(), accessType.c_str() ) ) + { + fprintf( pFile, "\nLogging started %s\n\n", timeStr.c_str() ); + fclose( pFile ); + } +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +LogImpl::~LogImpl +( +) +{ +} + +//----------------------------------------------------------------------------- +// +// Write to the log +//----------------------------------------------------------------------------- +void LogImpl::Write +( + LogLevel _logLevel, + uint8 const _nodeId, + char const* _format, + va_list _args +) +{ + // create a timestamp string + string timeStr = GetTimeStampString(); + string nodeStr = GetNodeString( _nodeId ); + string logLevelStr = GetLogLevelString(_logLevel); + + // handle this message + if( (_logLevel <= m_queueLevel) || (_logLevel == LogLevel_Internal) ) // we're going to do something with this message... + { + char lineBuf[1024]; + if( !_format || ( _format[0] == 0 ) ) + { + strcpy_s( lineBuf, 1024, "" ); + } + else + { + vsprintf_s( lineBuf, sizeof(lineBuf), _format, _args ); + } + + // should this message be saved to file (and possibly written to console?) + if( (_logLevel <= m_saveLevel) || (_logLevel == LogLevel_Internal) ) + { + // save to file + FILE* pFile = NULL; + if( !fopen_s( &pFile, m_filename.c_str(), "a" ) || m_bConsoleOutput ) + { + if( _logLevel != LogLevel_Internal ) // don't add a second timestamp to display of queued messages + { + if( pFile != NULL ) + { + fprintf( pFile, "%s%s%s", timeStr.c_str(), logLevelStr.c_str(), nodeStr.c_str() ); + } + if( m_bConsoleOutput ) + { + printf( "%s%s%s", timeStr.c_str(), logLevelStr.c_str(), nodeStr.c_str() ); + } + } + + // print message to file (and possibly screen) + if( pFile != NULL ) + { + fprintf( pFile, "%s", lineBuf ); + fprintf( pFile, "\n" ); + fclose( pFile ); + } + if( m_bConsoleOutput ) + { + printf( "%s", lineBuf ); + printf( "\n" ); + } + + } + } + + if( _logLevel != LogLevel_Internal ) + { + char queueBuf[1024]; + string threadStr = GetThreadId(); + sprintf_s( queueBuf, sizeof(queueBuf), "%s%s%s", timeStr.c_str(), threadStr.c_str(), lineBuf ); + Queue( queueBuf ); + } + } + + // now check to see if the _dumpTrigger has been hit + if( (_logLevel <= m_dumpTrigger) && (_logLevel != LogLevel_Internal) && (_logLevel != LogLevel_Always) ) + { + QueueDump(); + } +} + +//----------------------------------------------------------------------------- +// +// Write to the log queue +//----------------------------------------------------------------------------- +void LogImpl::Queue +( + char const* _buffer +) +{ + string bufStr = _buffer; + m_logQueue.push_back( bufStr ); + + // rudimentary queue size management + if( m_logQueue.size() > 500 ) + { + m_logQueue.pop_front(); + } +} + +//----------------------------------------------------------------------------- +// +// Dump the LogQueue to output device +//----------------------------------------------------------------------------- +void LogImpl::QueueDump +( +) +{ + Log::Write( LogLevel_Internal, "\n\nDumping queued log messages\n"); + list::iterator it = m_logQueue.begin(); + while( it != m_logQueue.end() ) + { + string strTemp = *it; + Log::Write( LogLevel_Internal, strTemp.c_str() ); + ++it; + } + m_logQueue.clear(); + Log::Write( LogLevel_Internal, "\nEnd of queued log message dump\n\n"); +} + +//----------------------------------------------------------------------------- +// +// Clear the LogQueue +//----------------------------------------------------------------------------- +void LogImpl::QueueClear +( +) +{ + m_logQueue.clear(); +} + +//----------------------------------------------------------------------------- +// +// Sets the various log state variables +//----------------------------------------------------------------------------- +void LogImpl::SetLoggingState +( + LogLevel _saveLevel, + LogLevel _queueLevel, + LogLevel _dumpTrigger +) +{ + m_saveLevel = _saveLevel; + m_queueLevel = _queueLevel; + m_dumpTrigger = _dumpTrigger; +} + +//----------------------------------------------------------------------------- +// +// Generate a string with formatted current time +//----------------------------------------------------------------------------- +string LogImpl::GetTimeStampString +( +) +{ + struct timeval tv; + struct tm tm; + char fmt[64], buf[64], line[256]; + gettimeofday(&tv, NULL); +#ifdef _WIN32 + struct tm *tm1; + if((tm1 = gmtime(&tv.tv_sec)) != 0) { + memcpy(&tm, tm1, sizeof(struct tm)); +#else + if((gmtime_r(&tv.tv_sec, &tm)) != 0) { +#endif + strftime(fmt, sizeof(fmt), "%b %d %H:%M:%S", &tm); + snprintf(buf, sizeof(buf), "%s:%03u", fmt, (unsigned int)tv.tv_usec); + } + sprintf(line, "[%22.22s] %s: [Z-Wave]: ", buf, "pilight-daemon"); + + string str = line; + return str; +} + +//----------------------------------------------------------------------------- +// +// Generate a string with formatted node id +//----------------------------------------------------------------------------- +string LogImpl::GetNodeString +( + uint8 const _nodeId +) +{ + if( _nodeId == 0 ) + { + return ""; + } + else + if( _nodeId == 255 ) // should make distinction between broadcast and controller better for SwitchAll broadcast + { + return "contrlr, "; + } + else + { + char buf[20]; + snprintf( buf, sizeof(buf), "Node%03d, ", _nodeId ); + return buf; + } +} + +//----------------------------------------------------------------------------- +// +// Generate a string with formatted thread id +//----------------------------------------------------------------------------- +string LogImpl::GetThreadId +( +) +{ + char buf[20]; + DWORD dwThread = ::GetCurrentThreadId(); + sprintf_s( buf, sizeof(buf), "%04d ", dwThread ); + string str = buf; + return str; +} + +//----------------------------------------------------------------------------- +// +// Provide a new log file name (applicable to future writes) +//----------------------------------------------------------------------------- +void LogImpl::SetLogFileName +( + const string &_filename +) +{ + m_filename = _filename; +} +//----------------------------------------------------------------------------- +// +// Provide a new log file name (applicable to future writes) +//----------------------------------------------------------------------------- +string LogImpl::GetLogLevelString +( + LogLevel _level +) +{ + if ((_level >= LogLevel_None) && (_level <= LogLevel_Internal)) { + char buf[20]; + snprintf( buf, sizeof(buf), "%s, ", LogLevelString[_level] ); + return buf; + } + else + return "Unknown, "; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/LogImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/LogImpl.h new file mode 100644 index 0000000..3d09d51 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/LogImpl.h @@ -0,0 +1,72 @@ +//----------------------------------------------------------------------------- +// +// LogImpl.h +// +// Windows implementation of message and error logging +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _LogImpl_H +#define _LogImpl_H + +#include "../../Defs.h" +#include +#include "../Log.h" +#include + +namespace OpenZWave +{ + /** \brief Windows-specific implementation of the Log class. + */ + class LogImpl : public i_LogImpl + { + private: + friend class Log; + + LogImpl( string const& _filename, bool const _bAppendLog, bool const _bConsoleOutput, LogLevel const _saveLevel, LogLevel const _queueLevel, LogLevel const _dumpTrigger ); + ~LogImpl(); + + void Write( LogLevel _level, uint8 const _nodeId, char const* _format, va_list _args ); + void Queue( char const* _buffer ); + void QueueDump(); + void QueueClear(); + void SetLoggingState( LogLevel _saveLevel, LogLevel _queueLevel, LogLevel _dumpTrigger ); + void SetLogFileName( const string &_filename ); + + string GetTimeStampString(); + string GetNodeString( uint8 const _nodeId ); + string GetThreadId(); + string GetLogLevelString(LogLevel _level); + + string m_filename; /**< filename specified by user (default is ozw_log.txt) */ + bool m_bConsoleOutput; /**< if true, send log output to console as well as to the file */ + bool m_bAppendLog; /**< if true, the log file should be appended to any with the same name */ + list m_logQueue; /**< list of queued log messages */ + LogLevel m_saveLevel; + LogLevel m_queueLevel; + LogLevel m_dumpTrigger; + }; + +} // namespace OpenZWave + +#endif //_LogImpl_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/MutexImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/MutexImpl.cpp new file mode 100644 index 0000000..4d8dd8a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/MutexImpl.cpp @@ -0,0 +1,114 @@ +//----------------------------------------------------------------------------- +// +// MutexImpl.cpp +// +// Windows Implementation of the cross-platform mutex +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include "../../Defs.h" +#include "MutexImpl.h" + + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +MutexImpl::MutexImpl +( +): + m_lockCount( 0 ) +{ + InitializeCriticalSection( &m_criticalSection ); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +MutexImpl::~MutexImpl +( +) +{ + DeleteCriticalSection( &m_criticalSection ); +} + +//----------------------------------------------------------------------------- +// +// Lock the mutex +//----------------------------------------------------------------------------- +bool MutexImpl::Lock +( + bool const _bWait // = true; +) +{ + if( _bWait ) + { + // We will wait for the lock + EnterCriticalSection( &m_criticalSection ); + ++m_lockCount; + return true; + } + + // Returns immediately, even if the lock was not available. + if( TryEnterCriticalSection( &m_criticalSection ) ) + { + ++m_lockCount; + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// +// Release our lock on the mutex +//----------------------------------------------------------------------------- +void MutexImpl::Unlock +( +) +{ + if( !m_lockCount ) + { + // No locks - we have a mismatched lock/release pair + assert(0); + } + else + { + --m_lockCount; + LeaveCriticalSection( &m_criticalSection ); + } +} + +//----------------------------------------------------------------------------- +// +// Test whether the mutex is free +//----------------------------------------------------------------------------- +bool MutexImpl::IsSignalled +( +) +{ + return( 0 == m_lockCount ); +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/MutexImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/MutexImpl.h new file mode 100644 index 0000000..0f4f780 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/MutexImpl.h @@ -0,0 +1,58 @@ +//----------------------------------------------------------------------------- +// +// MutexImpl.h +// +// Windows Implementation of the cross-platform mutex +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _MutexImpl_H +#define _MutexImpl_H + +#include + + +namespace OpenZWave +{ + /** \brief Windows-specific implementation of the Mutex class. + */ + class MutexImpl + { + private: + friend class Mutex; + + MutexImpl(); + ~MutexImpl(); + + bool Lock( bool const _bWait = true ); + void Unlock(); + + bool IsSignalled(); + + CRITICAL_SECTION m_criticalSection; + uint32 m_lockCount; // Keep track of the locks (there can be more than one if they occur on the same thread. + }; + +} // namespace OpenZWave + +#endif //_MutexIF_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/SerialControllerImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/SerialControllerImpl.cpp new file mode 100644 index 0000000..8aa33ab --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/SerialControllerImpl.cpp @@ -0,0 +1,410 @@ +//----------------------------------------------------------------------------- +// +// SerialControllerImpl.cpp +// +// Windows Implementation of the cross-platform serial port +// +// Copyright (c) 2010 Jason Frazier +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "../../Defs.h" +#include "SerialControllerImpl.h" + +#include "../Log.h" + +using namespace OpenZWave; + +DWORD WINAPI SerialReadThreadEntryPoint( void* _context ); + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +SerialControllerImpl::SerialControllerImpl +( + SerialController* _owner +): + m_owner( _owner ) +{ +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +SerialControllerImpl::~SerialControllerImpl +( +) +{ + CloseHandle( m_hSerialController ); +} + +//----------------------------------------------------------------------------- +// +// Open the serial port +//----------------------------------------------------------------------------- +bool SerialControllerImpl::Open +( +) +{ + // Try to init the serial port + if( !Init( 1 ) ) + { + // Failed. We bail to allow the app a chance to take over, rather than retry + // automatically. Automatic retries only occur after a successful init. + return false; + } + + // Create an event to trigger exiting the read thread + m_hExit = ::CreateEvent( NULL, TRUE, FALSE, NULL ); + + // Start the read thread + m_hThread = ::CreateThread( NULL, 0, SerialReadThreadEntryPoint, this, CREATE_SUSPENDED, NULL ); + ::ResumeThread( m_hThread ); + + return true; +} + +//----------------------------------------------------------------------------- +// +// Close the serial port +//----------------------------------------------------------------------------- +void SerialControllerImpl::Close +( +) +{ + ::SetEvent( m_hExit ); + ::WaitForSingleObject( m_hThread, INFINITE ); + + CloseHandle( m_hThread ); + m_hThread = INVALID_HANDLE_VALUE; + + CloseHandle( m_hExit ); + m_hExit = INVALID_HANDLE_VALUE; + + CloseHandle( m_hSerialController ); + m_hSerialController = INVALID_HANDLE_VALUE; +} + +//----------------------------------------------------------------------------- +// +// Entry point of the thread for receiving data from the serial port +//----------------------------------------------------------------------------- +DWORD WINAPI SerialReadThreadEntryPoint +( + void* _context +) +{ + SerialControllerImpl* impl = (SerialControllerImpl*)_context; + if( impl ) + { + impl->ReadThreadProc(); + } + + return 0; +} + +//----------------------------------------------------------------------------- +// +// Handle receiving data +//----------------------------------------------------------------------------- +void SerialControllerImpl::ReadThreadProc +( +) +{ + uint32 attempts = 0; + while( true ) + { + // Init must have been called successfully during Open, so we + // don't do it again until the end of the loop + if( INVALID_HANDLE_VALUE != m_hSerialController ) + { + // Enter read loop. Call will only return if + // an exit is requested or an error occurs + Read(); + + // Reset the attempts, so we get a rapid retry for temporary errors + attempts = 0; + } + + if( attempts < 25 ) + { + // Retry every 5 seconds for the first two minutes... + if( WAIT_OBJECT_0 == ::WaitForSingleObject( m_hExit, 5000 ) ) + { + // Exit signalled. + break; + } + } + else + { + // ...retry every 30 seconds after that + if( WAIT_OBJECT_0 == ::WaitForSingleObject( m_hExit, 30000 ) ) + { + // Exit signalled. + break; + } + } + + Init( ++attempts ); + } +} + +//----------------------------------------------------------------------------- +// +// Initialize the serial port +//----------------------------------------------------------------------------- +bool SerialControllerImpl::Init +( + uint32 const _attempts +) +{ + Log::Write( LogLevel_Info, " Trying to open serial port %s (Attempt %d)", m_owner->m_serialControllerName.c_str(), _attempts ); + + m_hSerialController = CreateFileA( m_owner->m_serialControllerName.c_str(), + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + OPEN_EXISTING, + FILE_FLAG_OVERLAPPED, + NULL ); + + if( INVALID_HANDLE_VALUE == m_hSerialController ) + { + //Error + Log::Write( LogLevel_Error, "ERROR: Cannot open serial port %s. Error code %d\n", m_owner->m_serialControllerName.c_str(), GetLastError() ); + goto SerialOpenFailure; + } + + // Configure the serial device parameters + // Build on the current configuration + DCB dcb; + if( !GetCommState( m_hSerialController, &dcb ) ) + { + //Error. Clean up and exit + Log::Write( LogLevel_Error, "ERROR: Failed to read serial port state" ); + goto SerialOpenFailure; + } + + // Fill in the Device Control Block + dcb.BaudRate = (DWORD)m_owner->m_baud; + dcb.ByteSize = 8; + dcb.Parity = (BYTE)m_owner->m_parity; + dcb.StopBits = (BYTE)m_owner->m_stopBits; + + if( !SetCommState( m_hSerialController, &dcb) ) + { + //Error. Clean up and exit + Log::Write( LogLevel_Error, "ERROR: Failed to set serial port state" ); + goto SerialOpenFailure; + } + + // Set the timeouts for the serial port + COMMTIMEOUTS commTimeouts; + commTimeouts.ReadIntervalTimeout = MAXDWORD; + commTimeouts.ReadTotalTimeoutConstant = 0; + commTimeouts.ReadTotalTimeoutMultiplier = 0; + commTimeouts.WriteTotalTimeoutConstant = 0; + commTimeouts.WriteTotalTimeoutMultiplier = 0; + if( !SetCommTimeouts( m_hSerialController, &commTimeouts ) ) + { + // Error. Clean up and exit + Log::Write( LogLevel_Error, "ERROR: Failed to set serial port timeouts" ); + goto SerialOpenFailure; + } + + // Set the serial port to signal when data is received + if( !SetCommMask( m_hSerialController, EV_RXCHAR ) ) + { + //Error. Clean up and exit + Log::Write( LogLevel_Info, "ERROR: Failed to set serial port mask" ); + goto SerialOpenFailure; + } + + // Clear any residual data from the serial port + PurgeComm( m_hSerialController, PURGE_RXABORT|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_TXCLEAR ); + + // Open successful + Log::Write( LogLevel_Info, " Serial port %s opened (attempt %d)", m_owner->m_serialControllerName.c_str(), _attempts ); + return true; + +SerialOpenFailure: + Log::Write( LogLevel_Info, "ERROR: Failed to open serial port %s (attempt %d)", m_owner->m_serialControllerName.c_str(), _attempts ); + CloseHandle( m_hSerialController ); + m_hSerialController = INVALID_HANDLE_VALUE; + return false; +} + +//----------------------------------------------------------------------------- +// +// Read data from the serial port +//----------------------------------------------------------------------------- +void SerialControllerImpl::Read +( +) +{ + uint8 buffer[256]; + + OVERLAPPED overlapped; + memset( &overlapped, 0, sizeof(overlapped) ); + overlapped.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); + + while( true ) + { + // Try to read all available data from the serial port + DWORD bytesRead = 0; + do + { + if( ::ReadFile( m_hSerialController, buffer, 256, NULL, &overlapped ) ) + { + // Read completed + GetOverlappedResult( m_hSerialController, &overlapped, &bytesRead, TRUE ); + + // Copy to the stream buffer + if( bytesRead > 0 ) + m_owner->Put( buffer, bytesRead ); + } + else + { + //Wait for the read to complete + if( ERROR_IO_PENDING == GetLastError() ) + { + // Wait for the read to complete or the + // signal that this thread should exit. + HANDLE handles[2]; + handles[0] = overlapped.hEvent; + handles[1] = m_hExit; + DWORD res = WaitForMultipleObjects( 2, handles, FALSE, INFINITE ); + + if( (WAIT_OBJECT_0+1) == res ) + { + // Exit signalled. Cancel the read. + goto exitRead; + } + + if( WAIT_TIMEOUT == res ) + { + // Timed out - should never happen + goto exitRead; + } + + // Read completed + GetOverlappedResult( m_hSerialController, &overlapped, &bytesRead, TRUE ); + + // Copy to the stream buffer + if( bytesRead > 0 ) + m_owner->Put( buffer, bytesRead ); + } + else + { + // An error has occurred + goto exitRead; + } + } + } + while( bytesRead > 0 ); + + // Clear the event + ResetEvent( overlapped.hEvent ); + + // Nothing available to read, so wait for the next rx char event + DWORD dwEvtMask; + if( !WaitCommEvent( m_hSerialController, &dwEvtMask, &overlapped ) ) + { + if( ERROR_IO_PENDING == GetLastError() ) + { + // Wait for either some data to arrive or + // the signal that this thread should exit. + HANDLE handles[2]; + handles[0] = overlapped.hEvent; + handles[1] = m_hExit; + + DWORD res = WaitForMultipleObjects( 2, handles, FALSE, INFINITE ); + + if( (WAIT_OBJECT_0+1) == res ) + { + // Exit signalled. Prevent WaitCommEvent from corrupting the + // stack by forcing it to exit. + goto exitRead; + } + + if( WAIT_TIMEOUT == res ) + { + // Timed out - should never happen + goto exitRead; + } + + GetOverlappedResult( m_hSerialController, &overlapped, &bytesRead, TRUE ); + } + } + + // Clear the event + ResetEvent( overlapped.hEvent ); + + // Loop back to the top to read the waiting data + } + +exitRead: + // Exit event has been signalled, or an error has occurred + SetCommMask( m_hSerialController, 0 ); + CancelIo( m_hSerialController ); + CloseHandle( overlapped.hEvent ); +} + +//----------------------------------------------------------------------------- +// +// Send data to the serial port +//----------------------------------------------------------------------------- +uint32 SerialControllerImpl::Write +( + uint8* _buffer, + uint32 _length +) +{ + if( INVALID_HANDLE_VALUE == m_hSerialController ) + { + //Error + Log::Write( LogLevel_Error, "ERROR: Serial port must be opened before writing\n" ); + return 0; + } + + // Write the data + OVERLAPPED overlapped; + memset( &overlapped, 0, sizeof(overlapped) ); + overlapped.hEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); + + DWORD bytesWritten; + if( !::WriteFile( m_hSerialController, _buffer, _length, &bytesWritten, &overlapped ) ) + { + //Wait for the write to complete + if( ERROR_IO_PENDING == GetLastError() ) + { + GetOverlappedResult( m_hSerialController, &overlapped, &bytesWritten, TRUE ); + } + else + { + Log::Write( LogLevel_Error, "ERROR: Serial port write (0x%.8x)", GetLastError() ); + } + } + + CloseHandle( overlapped.hEvent ); + return (uint32)bytesWritten; +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/SerialControllerImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/SerialControllerImpl.h new file mode 100644 index 0000000..4f5658d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/SerialControllerImpl.h @@ -0,0 +1,66 @@ +//----------------------------------------------------------------------------- +// +// SerialControllerImpl.h +// +// Windows Implementation of the cross-platform serial port +// +// Copyright (c) 2010 Jason Frazier +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _SerialControllerImpl_H +#define _SerialControllerImpl_H + +#include + +#include "../../Defs.h" +#include "../SerialController.h" + +namespace OpenZWave +{ + class SerialControllerImpl + { + public: + void ReadThreadProc(); + + private: + friend class SerialController; + + SerialControllerImpl( SerialController* _owner ); + ~SerialControllerImpl(); + + bool Open(); + void Close(); + + uint32 Write( uint8* _buffer, uint32 _length ); + + bool Init( uint32 const _attempts ); + void Read(); + + SerialController* m_owner; + HANDLE m_hThread; + HANDLE m_hExit; + HANDLE m_hSerialController; + }; + +} // namespace OpenZWave + +#endif //_SerialControllerImpl_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/ThreadImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/ThreadImpl.cpp new file mode 100644 index 0000000..55dc453 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/ThreadImpl.cpp @@ -0,0 +1,158 @@ +//----------------------------------------------------------------------------- +// +// ThreadImpl.cpp +// +// Windows implementation of a cross-platform thread +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include "../../Defs.h" +#include "../Event.h" +#include "../Thread.h" +#include "ThreadImpl.h" + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ThreadImpl::ThreadImpl +( + Thread* _owner, + string const& _name +): + m_owner( _owner ), + m_hThread( INVALID_HANDLE_VALUE ), + m_bIsRunning( false ), + m_name( _name ) +{ + +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +ThreadImpl::~ThreadImpl +( +) +{ +} + +//----------------------------------------------------------------------------- +// +// Start a function running on this thread +//----------------------------------------------------------------------------- +bool ThreadImpl::Start +( + Thread::pfnThreadProc_t _pfnThreadProc, + Event* _exitEvent, + void* _context +) +{ + // Create a thread to run the specified function + m_pfnThreadProc = _pfnThreadProc; + m_context = _context; + m_exitEvent = _exitEvent; + m_exitEvent->Reset(); + + HANDLE hThread = ::CreateThread( NULL, 0, ThreadImpl::ThreadProc, this, CREATE_SUSPENDED, NULL ); + m_hThread = hThread; + + ::ResumeThread( hThread ); + return true; +} + +//----------------------------------------------------------------------------- +// +// Cause thread to sleep for the specified number of milliseconds +//----------------------------------------------------------------------------- +void ThreadImpl::Sleep +( + uint32 _millisecs +) +{ + ::Sleep(_millisecs); +} + +//----------------------------------------------------------------------------- +// +// Force the thread to stop +//----------------------------------------------------------------------------- +bool ThreadImpl::Terminate +( +) +{ + if( !m_bIsRunning ) + { + return false; + } + + // This can cause all sorts of trouble if the thread is holding a lock. + TerminateThread( m_hThread, 0 ); + m_hThread = INVALID_HANDLE_VALUE; + return true; +} + +//----------------------------------------------------------------------------- +// +// Test whether the thread has completed +//----------------------------------------------------------------------------- +bool ThreadImpl::IsSignalled +( +) +{ + return !m_bIsRunning; +} + +//----------------------------------------------------------------------------- +// +// Entry point for running a function on this thread +//----------------------------------------------------------------------------- +DWORD WINAPI ThreadImpl::ThreadProc +( + void* _pArg +) +{ + ThreadImpl* pImpl = (ThreadImpl*)_pArg; + pImpl->Run(); + return 0; +} + +//----------------------------------------------------------------------------- +// +// Entry point for running a function on this thread +//----------------------------------------------------------------------------- +void ThreadImpl::Run +( +) +{ + m_bIsRunning = true; + m_pfnThreadProc( m_exitEvent, m_context ); + m_bIsRunning = false; + + // Let any watchers know that the thread has finished running. + m_owner->Notify(); +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/ThreadImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/ThreadImpl.h new file mode 100644 index 0000000..69e93cf --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/ThreadImpl.h @@ -0,0 +1,71 @@ +//----------------------------------------------------------------------------- +// +// ThreadImpl.h +// +// Windows implementation of a cross-platform thread +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _ThreadImpl_H +#define _ThreadImpl_H + +#include +#include +#include "../Thread.h" + +namespace OpenZWave +{ + class Thread; + class Event; + + /** \brief Windows-specific implementation of the Thread class. + */ + class ThreadImpl + { + private: + friend class Thread; + + ThreadImpl( Thread* _owner, string const& _name ); + ~ThreadImpl(); + + bool Start( Thread::pfnThreadProc_t _pfnThreadProc, Event* _exitEvent, void* _context ); + void Sleep( uint32 _milliseconds ); + bool Terminate(); + + bool IsSignalled(); + + void Run(); + static DWORD WINAPI ThreadProc( void* _pArg ); + + Thread* m_owner; + HANDLE m_hThread; + Event* m_exitEvent; + Thread::pfnThreadProc_t m_pfnThreadProc; + void* m_context; + bool m_bIsRunning; + string m_name; + }; + +} // namespace OpenZWave + +#endif //_ThreadImpl_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/TimeStampImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/TimeStampImpl.cpp new file mode 100644 index 0000000..31f4b27 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/TimeStampImpl.cpp @@ -0,0 +1,114 @@ +//----------------------------------------------------------------------------- +// +// TimeStampImpl.h +// +// Cross-platform TimeStampImpl +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include +#include +#include "../../Defs.h" +#include "TimeStampImpl.h" + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +TimeStampImpl::TimeStampImpl +( +) +{ + SetTime(0); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +TimeStampImpl::~TimeStampImpl +( +) +{ +} + +//----------------------------------------------------------------------------- +// +// Sets the timestamp to now, plus an offset in milliseconds +//----------------------------------------------------------------------------- +void TimeStampImpl::SetTime +( + int32 _milliseconds // = 0 +) +{ + int64 offset = ((int64)_milliseconds) * 10000LL; // Timestamp is stored in 100ns steps. + + GetSystemTimeAsFileTime( (FILETIME*)&m_stamp ); + m_stamp += offset; +} + +//----------------------------------------------------------------------------- +// +// Gets the difference between now and the timestamp time in milliseconds +//----------------------------------------------------------------------------- +int32 TimeStampImpl::TimeRemaining +( +) +{ + int64 now; + GetSystemTimeAsFileTime( (FILETIME*)&now ); + + return (int32)( ( m_stamp - now ) / 10000LL ); +} + +//----------------------------------------------------------------------------- +// +// Return a string representation +//----------------------------------------------------------------------------- +string TimeStampImpl::GetAsString +( +) +{ + // Convert m_stamp (FILETIME) to SYSTEMTIME for ease of use + SYSTEMTIME time; + ::FileTimeToSystemTime( (FILETIME*)m_stamp, &time ); + + char buf[100]; + sprintf_s( buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d:%03d ", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond, time.wMilliseconds ); + string str = buf; + return str; +} + +//----------------------------------------------------------------------------- +// +// Overload the subtract operator to get the difference between two +// timestamps in milliseconds +//----------------------------------------------------------------------------- +int32 TimeStampImpl::operator- +( + TimeStampImpl const& _other +) +{ + return (int32)( ( m_stamp - _other.m_stamp ) / 10000LL ); +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/TimeStampImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/TimeStampImpl.h new file mode 100644 index 0000000..a4dc262 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/TimeStampImpl.h @@ -0,0 +1,88 @@ +//----------------------------------------------------------------------------- +// +// TimeStampImpl.h +// +// Windows implementation of a TimeStamp +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _TimeStampImpl_H +#define _TimeStampImpl_H + +#include "../../Defs.h" + +namespace OpenZWave +{ + /** \brief Windows implementation of a timestamp. + */ + class TimeStampImpl + { + public: + /** + * Constructor. + * Creates a TimeStampImpl object. + */ + TimeStampImpl(); + + /** + * Destructor. + * Destroys the TimeStampImpl object. + */ + ~TimeStampImpl(); + + /** + * SetTime. Sets the timestamp to now, plus the offset in milliseconds. + * \param _milliseconds positive or negative offset from + * now in milliseconds. + */ + void SetTime( int32 _milliseconds ); + + /** + * TimeRemaining. Gets the difference between now and the timestamp + * time in milliseconds. + * \return milliseconds remaining until we reach the timestamp. The + * return value is negative if the timestamp is in the past. + */ + int32 TimeRemaining(); + + /** + * Return as as string + */ + string GetAsString(); + + /** + * Overload the subtract operator to get the difference between + * two timestamps in milliseconds. + */ + int32 operator- ( TimeStampImpl const& _other ); + + private: + TimeStampImpl( TimeStampImpl const& ); // prevent copy + TimeStampImpl& operator = ( TimeStampImpl const& ); // prevent assignment + + int64 m_stamp; + }; + +} // namespace OpenZWave + +#endif //_TimeStampImpl_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/WaitImpl.cpp b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/WaitImpl.cpp new file mode 100644 index 0000000..05b9c85 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/WaitImpl.cpp @@ -0,0 +1,134 @@ +//----------------------------------------------------------------------------- +// +// WaitImpl.cpp +// +// Windows implementation of an abstract base class for objects we +// want to be able to wait for. +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#include "../../Defs.h" +#include "../Wait.h" +#include "WaitImpl.h" +#include "../Log.h" + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +WaitImpl::WaitImpl +( + Wait* _owner +): + m_owner( _owner ) +{ + InitializeCriticalSection( &m_criticalSection ); +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +WaitImpl::~WaitImpl +( +) +{ + DeleteCriticalSection( &m_criticalSection ); +} + +//----------------------------------------------------------------------------- +// +// Add a watcher to our object. +//----------------------------------------------------------------------------- +void WaitImpl::AddWatcher +( + Wait::pfnWaitNotification_t _callback, + void* _context +) +{ + // Add the watcher to our list + Watcher watcher; + watcher.m_callback = _callback; + watcher.m_context = _context; + + EnterCriticalSection( &m_criticalSection ); + + m_watchers.push_back( watcher ); + + LeaveCriticalSection( &m_criticalSection ); + + // If the object is already in a signalled state, notify the watcher immediately + if( m_owner->IsSignalled() ) + { + _callback( _context ); + } + +} + +//----------------------------------------------------------------------------- +// +// Remove a watcher from our object. +//----------------------------------------------------------------------------- +bool WaitImpl::RemoveWatcher +( + Wait::pfnWaitNotification_t _callback, + void* _context +) +{ + bool res = false; + EnterCriticalSection( &m_criticalSection ); + + for( list::iterator it=m_watchers.begin(); it!=m_watchers.end(); ++it ) + { + Watcher const& watcher = *it; + if( ( watcher.m_callback == _callback ) && ( watcher.m_context == _context ) ) + { + m_watchers.erase( it ); + res = true; + break; + } + } + + LeaveCriticalSection( &m_criticalSection ); + return res; +} + +//----------------------------------------------------------------------------- +// +// Notify all the watchers that the object has become signalled +//----------------------------------------------------------------------------- +void WaitImpl::Notify +( +) +{ + EnterCriticalSection( &m_criticalSection ); + + for( list::iterator it=m_watchers.begin(); it!=m_watchers.end(); ++it ) + { + Watcher const& watcher = *it; + watcher.m_callback( watcher.m_context ); + } + + LeaveCriticalSection( &m_criticalSection ); +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/platform/windows/WaitImpl.h b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/WaitImpl.h new file mode 100644 index 0000000..89fab12 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/platform/windows/WaitImpl.h @@ -0,0 +1,73 @@ +//----------------------------------------------------------------------------- +// +// WaitImpl.h +// +// Windows implementation of a base class for objects we +// want to be able to wait for. +// +// Copyright (c) 2010 Mal Lansell +// All rights reserved. +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- +#ifndef _WaitImpl_H +#define _WaitImpl_H + +#include +#include +#include "../../Defs.h" +#include "../Ref.h" +#include "../Wait.h" + +namespace OpenZWave +{ + /** \brief Windows specific implementation of Wait objects. + */ + class WaitImpl + { + private: + friend class Wait; + + WaitImpl( Wait* _owner ); + virtual ~WaitImpl(); + + void AddWatcher( Wait::pfnWaitNotification_t _callback, void* _context ); + bool RemoveWatcher( Wait::pfnWaitNotification_t _callback, void* _context ); + void Notify(); + + static int32 Multiple( Wait** _objects, uint32 _numObjects, int32 _timeout = -1 ); + + WaitImpl( Wait const& ); // prevent copy + WaitImpl& operator = ( WaitImpl const& ); // prevent assignment + + struct Watcher + { + Wait::pfnWaitNotification_t m_callback; + void* m_context; + }; + + list m_watchers; + Wait* m_owner; + CRITICAL_SECTION m_criticalSection; + }; + +} // namespace OpenZWave + +#endif //_WaitImpl_H + diff --git a/lib/ESPiLight/pilight/libs/openzwave/tinystr.cpp b/lib/ESPiLight/pilight/libs/openzwave/tinystr.cpp new file mode 100644 index 0000000..6812507 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/tinystr.cpp @@ -0,0 +1,116 @@ +/* +www.sourceforge.net/projects/tinyxml +Original file by Yves Berquin. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +/* + * THIS FILE WAS ALTERED BY Tyge Løvset, 7. April 2005. + */ + + +#ifndef TIXML_USE_STL + +#include "tinystr.h" + +// Error value for find primitive +const TiXmlString::size_type TiXmlString::npos = static_cast< TiXmlString::size_type >(-1); + + +// Null rep. +TiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, { '\0' } }; + + +void TiXmlString::reserve (size_type cap) +{ + if (cap > capacity()) + { + TiXmlString tmp; + tmp.init(length(), cap); + memcpy(tmp.start(), data(), length()); + swap(tmp); + } +} + + +TiXmlString& TiXmlString::assign(const char* str, size_type len) +{ + size_type cap = capacity(); + if (len > cap || cap > 3*(len + 8)) + { + TiXmlString tmp; + tmp.init(len); + memcpy(tmp.start(), str, len); + swap(tmp); + } + else + { + memmove(start(), str, len); + set_size(len); + } + return *this; +} + + +TiXmlString& TiXmlString::append(const char* str, size_type len) +{ + size_type newsize = length() + len; + if (newsize > capacity()) + { + reserve (newsize + capacity()); + } + memmove(finish(), str, len); + set_size(newsize); + return *this; +} + + +TiXmlString operator + (const TiXmlString & a, const TiXmlString & b) +{ + TiXmlString tmp; + tmp.reserve(a.length() + b.length()); + tmp += a; + tmp += b; + return tmp; +} + +TiXmlString operator + (const TiXmlString & a, const char* b) +{ + TiXmlString tmp; + TiXmlString::size_type b_len = static_cast( strlen(b) ); + tmp.reserve(a.length() + b_len); + tmp += a; + tmp.append(b, b_len); + return tmp; +} + +TiXmlString operator + (const char* a, const TiXmlString & b) +{ + TiXmlString tmp; + TiXmlString::size_type a_len = static_cast( strlen(a) ); + tmp.reserve(a_len + b.length()); + tmp.append(a, a_len); + tmp += b; + return tmp; +} + + +#endif // TIXML_USE_STL diff --git a/lib/ESPiLight/pilight/libs/openzwave/tinystr.h b/lib/ESPiLight/pilight/libs/openzwave/tinystr.h new file mode 100644 index 0000000..65cd96a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/tinystr.h @@ -0,0 +1,319 @@ +/* +www.sourceforge.net/projects/tinyxml +Original file by Yves Berquin. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +/* + * THIS FILE WAS ALTERED BY Tyge Lovset, 7. April 2005. + * + * - completely rewritten. compact, clean, and fast implementation. + * - sizeof(TiXmlString) = pointer size (4 bytes on 32-bit systems) + * - fixed reserve() to work as per specification. + * - fixed buggy compares operator==(), operator<(), and operator>() + * - fixed operator+=() to take a const ref argument, following spec. + * - added "copy" constructor with length, and most compare operators. + * - added swap(), clear(), size(), capacity(), operator+(). + */ + +#ifndef TIXML_USE_STL + +#ifndef TIXML_STRING_INCLUDED +#define TIXML_STRING_INCLUDED + +#include +#include + +/* The support for explicit isn't that universal, and it isn't really + required - it is used to check that the TiXmlString class isn't incorrectly + used. Be nice to old compilers and macro it here: +*/ +#if defined(_WIN32) && (_WIN32 >= 1200 ) + // Microsoft visual studio, version 6 and higher. + #define TIXML_EXPLICIT explicit +#elif defined(__GNUC__) && (__GNUC__ >= 3 ) + // GCC version 3 and higher.s + #define TIXML_EXPLICIT explicit +#else + #define TIXML_EXPLICIT +#endif + + +/* + TiXmlString is an emulation of a subset of the std::string template. + Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. + Only the member functions relevant to the TinyXML project have been implemented. + The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase + a string and there's no more room, we allocate a buffer twice as big as we need. +*/ +class TiXmlString +{ + public : + // The size type used + typedef size_t size_type; + + // Error value for find primitive + static const size_type npos; // = -1; + + + // TiXmlString empty constructor + TiXmlString () : rep_(&nullrep_) + { + } + + // TiXmlString copy constructor + TiXmlString ( const TiXmlString & copy) : rep_(0) + { + init(copy.length()); + memcpy(start(), copy.data(), length()); + } + + // TiXmlString constructor, based on a string + TIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0) + { + init( static_cast( strlen(copy) )); + memcpy(start(), copy, length()); + } + + // TiXmlString constructor, based on a string + TIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0) + { + init(len); + memcpy(start(), str, len); + } + + // TiXmlString destructor + ~TiXmlString () + { + quit(); + } + + // = operator + TiXmlString& operator = (const char * copy) + { + return assign( copy, (size_type)strlen(copy)); + } + + // = operator + TiXmlString& operator = (const TiXmlString & copy) + { + return assign(copy.start(), copy.length()); + } + + + // += operator. Maps to append + TiXmlString& operator += (const char * suffix) + { + return append(suffix, static_cast( strlen(suffix) )); + } + + // += operator. Maps to append + TiXmlString& operator += (char single) + { + return append(&single, 1); + } + + // += operator. Maps to append + TiXmlString& operator += (const TiXmlString & suffix) + { + return append(suffix.data(), suffix.length()); + } + + + // Convert a TiXmlString into a null-terminated char * + const char * c_str () const { return rep_->str; } + + // Convert a TiXmlString into a char * (need not be null terminated). + const char * data () const { return rep_->str; } + + // Return the length of a TiXmlString + size_type length () const { return rep_->size; } + + // Alias for length() + size_type size () const { return rep_->size; } + + // Checks if a TiXmlString is empty + bool empty () const { return rep_->size == 0; } + + // Return capacity of string + size_type capacity () const { return rep_->capacity; } + + + // single char extraction + const char& at (size_type index) const + { + assert( index < length() ); + return rep_->str[ index ]; + } + + // [] operator + char& operator [] (size_type index) const + { + assert( index < length() ); + return rep_->str[ index ]; + } + + // find a char in a string. Return TiXmlString::npos if not found + size_type find (char lookup) const + { + return find(lookup, 0); + } + + // find a char in a string from an offset. Return TiXmlString::npos if not found + size_type find (char tofind, size_type offset) const + { + if (offset >= length()) return npos; + + for (const char* p = c_str() + offset; *p != '\0'; ++p) + { + if (*p == tofind) return static_cast< size_type >( p - c_str() ); + } + return npos; + } + + void clear () + { + //Lee: + //The original was just too strange, though correct: + // TiXmlString().swap(*this); + //Instead use the quit & re-init: + quit(); + init(0,0); + } + + /* Function to reserve a big amount of data when we know we'll need it. Be aware that this + function DOES NOT clear the content of the TiXmlString if any exists. + */ + void reserve (size_type cap); + + TiXmlString& assign (const char* str, size_type len); + + TiXmlString& append (const char* str, size_type len); + + void swap (TiXmlString& other) + { + Rep* r = rep_; + rep_ = other.rep_; + other.rep_ = r; + } + + private: + + void init(size_type sz) { init(sz, sz); } + void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; } + char* start() const { return rep_->str; } + char* finish() const { return rep_->str + rep_->size; } + + struct Rep + { + size_type size, capacity; + char str[1]; + }; + + void init(size_type sz, size_type cap) + { + if (cap) + { + // Lee: the original form: + // rep_ = static_cast(operator new(sizeof(Rep) + cap)); + // doesn't work in some cases of new being overloaded. Switching + // to the normal allocation, although use an 'int' for systems + // that are overly picky about structure alignment. + const size_type bytesNeeded = sizeof(Rep) + cap; + const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int ); + rep_ = reinterpret_cast( new int[ intsNeeded ] ); + + rep_->str[ rep_->size = sz ] = '\0'; + rep_->capacity = cap; + } + else + { + rep_ = &nullrep_; + } + } + + void quit() + { + if (rep_ != &nullrep_) + { + // The rep_ is really an array of ints. (see the allocator, above). + // Cast it back before delete, so the compiler won't incorrectly call destructors. + delete [] ( reinterpret_cast( rep_ ) ); + } + } + + Rep * rep_; + static Rep nullrep_; + +} ; + + +inline bool operator == (const TiXmlString & a, const TiXmlString & b) +{ + return ( a.length() == b.length() ) // optimization on some platforms + && ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare +} +inline bool operator < (const TiXmlString & a, const TiXmlString & b) +{ + return strcmp(a.c_str(), b.c_str()) < 0; +} + +inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); } +inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; } +inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); } +inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); } + +inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; } +inline bool operator == (const char* a, const TiXmlString & b) { return b == a; } +inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); } +inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); } + +TiXmlString operator + (const TiXmlString & a, const TiXmlString & b); +TiXmlString operator + (const TiXmlString & a, const char* b); +TiXmlString operator + (const char* a, const TiXmlString & b); + + +/* + TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. + Only the operators that we need for TinyXML have been developped. +*/ +class TiXmlOutStream : public TiXmlString +{ +public : + + // TiXmlOutStream << operator. + TiXmlOutStream & operator << (const TiXmlString & in) + { + *this += in; + return *this; + } + + // TiXmlOutStream << operator. + TiXmlOutStream & operator << (const char * in) + { + *this += in; + return *this; + } + +} ; + +#endif // TIXML_STRING_INCLUDED +#endif // TIXML_USE_STL diff --git a/lib/ESPiLight/pilight/libs/openzwave/tinyxml.cpp b/lib/ESPiLight/pilight/libs/openzwave/tinyxml.cpp new file mode 100644 index 0000000..16decb2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/tinyxml.cpp @@ -0,0 +1,1891 @@ +/* +www.sourceforge.net/projects/tinyxml +Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include + +#ifdef TIXML_USE_STL +#include +#include +#endif + +#include + +#include "tinyxml.h" + + +bool TiXmlBase::condenseWhiteSpace = true; + +// Microsoft compiler security +FILE* TiXmlFOpen( const char* filename, const char* mode ) +{ + #if defined(_WIN32) && (_WIN32 >= 1400 ) + FILE* fp = 0; + errno_t err = fopen_s( &fp, filename, mode ); + if ( !err && fp ) + return fp; + return 0; + #else + return fopen( filename, mode ); + #endif +} + +void TiXmlBase::EncodeString( const TIXML_STRING& str, TIXML_STRING* outString ) +{ + int i=0; + + while( i<(int)str.length() ) + { + unsigned char c = (unsigned char) str[i]; + + if ( c == '&' + && i < ( (int)str.length() - 2 ) + && str[i+1] == '#' + && str[i+2] == 'x' ) + { + // Hexadecimal character reference. + // Pass through unchanged. + // © -- copyright symbol, for example. + // + // The -1 is a bug fix from Rob Laveaux. It keeps + // an overflow from happening if there is no ';'. + // There are actually 2 ways to exit this loop - + // while fails (error case) and break (semicolon found). + // However, there is no mechanism (currently) for + // this function to return an error. + while ( i<(int)str.length()-1 ) + { + outString->append( str.c_str() + i, 1 ); + ++i; + if ( str[i] == ';' ) + break; + } + } + else if ( c == '&' ) + { + outString->append( entity[0].str, entity[0].strLength ); + ++i; + } + else if ( c == '<' ) + { + outString->append( entity[1].str, entity[1].strLength ); + ++i; + } + else if ( c == '>' ) + { + outString->append( entity[2].str, entity[2].strLength ); + ++i; + } + else if ( c == '\"' ) + { + outString->append( entity[3].str, entity[3].strLength ); + ++i; + } + else if ( c == '\'' ) + { + outString->append( entity[4].str, entity[4].strLength ); + ++i; + } + else if ( c < 32 ) + { + // Easy pass at non-alpha/numeric/symbol + // Below 32 is symbolic. + char buf[ 32 ]; + + #if defined(TIXML_SNPRINTF) + TIXML_SNPRINTF( buf, sizeof(buf), "&#x%02X;", (unsigned) ( c & 0xff ) ); + #else + sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); + #endif + + //*ME: warning C4267: convert 'size_t' to 'int' + //*ME: Int-Cast to make compiler happy ... + outString->append( buf, (int)strlen( buf ) ); + ++i; + } + else + { + //char realc = (char) c; + //outString->append( &realc, 1 ); + *outString += (char) c; // somewhat more efficient function call. + ++i; + } + } +} + + +TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase() +{ + parent = 0; + type = _type; + firstChild = 0; + lastChild = 0; + prev = 0; + next = 0; +} + + +TiXmlNode::~TiXmlNode() +{ + TiXmlNode* node = firstChild; + TiXmlNode* temp = 0; + + while ( node ) + { + temp = node; + node = node->next; + delete temp; + } +} + + +void TiXmlNode::CopyTo( TiXmlNode* target ) const +{ + target->SetValue (value.c_str() ); + target->userData = userData; +} + + +void TiXmlNode::Clear() +{ + TiXmlNode* node = firstChild; + TiXmlNode* temp = 0; + + while ( node ) + { + temp = node; + node = node->next; + delete temp; + } + + firstChild = 0; + lastChild = 0; +} + + +TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) +{ + assert( node->parent == 0 || node->parent == this ); + assert( node->GetDocument() == 0 || node->GetDocument() == this->GetDocument() ); + + if ( node->Type() == TiXmlNode::DOCUMENT ) + { + delete node; + if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + node->parent = this; + + node->prev = lastChild; + node->next = 0; + + if ( lastChild ) + lastChild->next = node; + else + firstChild = node; // it was an empty list. + + lastChild = node; + return node; +} + + +TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) +{ + if ( addThis.Type() == TiXmlNode::DOCUMENT ) + { + if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + + return LinkEndChild( node ); +} + + +TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) +{ + if ( !beforeThis || beforeThis->parent != this ) { + return 0; + } + if ( addThis.Type() == TiXmlNode::DOCUMENT ) + { + if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + node->parent = this; + + node->next = beforeThis; + node->prev = beforeThis->prev; + if ( beforeThis->prev ) + { + beforeThis->prev->next = node; + } + else + { + assert( firstChild == beforeThis ); + firstChild = node; + } + beforeThis->prev = node; + return node; +} + + +TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) +{ + if ( !afterThis || afterThis->parent != this ) { + return 0; + } + if ( addThis.Type() == TiXmlNode::DOCUMENT ) + { + if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + node->parent = this; + + node->prev = afterThis; + node->next = afterThis->next; + if ( afterThis->next ) + { + afterThis->next->prev = node; + } + else + { + assert( lastChild == afterThis ); + lastChild = node; + } + afterThis->next = node; + return node; +} + + +TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) +{ + if ( replaceThis->parent != this ) + return 0; + + TiXmlNode* node = withThis.Clone(); + if ( !node ) + return 0; + + node->next = replaceThis->next; + node->prev = replaceThis->prev; + + if ( replaceThis->next ) + replaceThis->next->prev = node; + else + lastChild = node; + + if ( replaceThis->prev ) + replaceThis->prev->next = node; + else + firstChild = node; + + delete replaceThis; + node->parent = this; + return node; +} + + +bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) +{ + if ( removeThis->parent != this ) + { + assert( 0 ); + return false; + } + + if ( removeThis->next ) + removeThis->next->prev = removeThis->prev; + else + lastChild = removeThis->prev; + + if ( removeThis->prev ) + removeThis->prev->next = removeThis->next; + else + firstChild = removeThis->next; + + delete removeThis; + return true; +} + +const TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const +{ + const TiXmlNode* node; + for ( node = firstChild; node; node = node->next ) + { + if ( strcmp( node->Value(), _value ) == 0 ) + return node; + } + return 0; +} + + +const TiXmlNode* TiXmlNode::LastChild( const char * _value ) const +{ + const TiXmlNode* node; + for ( node = lastChild; node; node = node->prev ) + { + if ( strcmp( node->Value(), _value ) == 0 ) + return node; + } + return 0; +} + + +const TiXmlNode* TiXmlNode::IterateChildren( const TiXmlNode* previous ) const +{ + if ( !previous ) + { + return FirstChild(); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling(); + } +} + + +const TiXmlNode* TiXmlNode::IterateChildren( const char * val, const TiXmlNode* previous ) const +{ + if ( !previous ) + { + return FirstChild( val ); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling( val ); + } +} + + +const TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const +{ + const TiXmlNode* node; + for ( node = next; node; node = node->next ) + { + if ( strcmp( node->Value(), _value ) == 0 ) + return node; + } + return 0; +} + + +const TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const +{ + const TiXmlNode* node; + for ( node = prev; node; node = node->prev ) + { + if ( strcmp( node->Value(), _value ) == 0 ) + return node; + } + return 0; +} + + +void TiXmlElement::RemoveAttribute( const char * name ) +{ + #ifdef TIXML_USE_STL + TIXML_STRING str( name ); + TiXmlAttribute* node = attributeSet.Find( str ); + #else + TiXmlAttribute* node = attributeSet.Find( name ); + #endif + if ( node ) + { + attributeSet.Remove( node ); + delete node; + } +} + +const TiXmlElement* TiXmlNode::FirstChildElement() const +{ + const TiXmlNode* node; + + for ( node = FirstChild(); + node; + node = node->NextSibling() ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +const TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const +{ + const TiXmlNode* node; + + for ( node = FirstChild( _value ); + node; + node = node->NextSibling( _value ) ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +const TiXmlElement* TiXmlNode::NextSiblingElement() const +{ + const TiXmlNode* node; + + for ( node = NextSibling(); + node; + node = node->NextSibling() ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +const TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const +{ + const TiXmlNode* node; + + for ( node = NextSibling( _value ); + node; + node = node->NextSibling( _value ) ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +const TiXmlDocument* TiXmlNode::GetDocument() const +{ + const TiXmlNode* node; + + for( node = this; node; node = node->parent ) + { + if ( node->ToDocument() ) + return node->ToDocument(); + } + return 0; +} + + +TiXmlElement::TiXmlElement (const char * _value) + : TiXmlNode( TiXmlNode::ELEMENT ) +{ + firstChild = lastChild = 0; + value = _value; +} + + +#ifdef TIXML_USE_STL +TiXmlElement::TiXmlElement( const std::string& _value ) + : TiXmlNode( TiXmlNode::ELEMENT ) +{ + firstChild = lastChild = 0; + value = _value; +} +#endif + + +TiXmlElement::TiXmlElement( const TiXmlElement& copy) + : TiXmlNode( TiXmlNode::ELEMENT ) +{ + firstChild = lastChild = 0; + copy.CopyTo( this ); +} + + +void TiXmlElement::operator=( const TiXmlElement& base ) +{ + ClearThis(); + base.CopyTo( this ); +} + + +TiXmlElement::~TiXmlElement() +{ + ClearThis(); +} + + +void TiXmlElement::ClearThis() +{ + Clear(); + while( attributeSet.First() ) + { + TiXmlAttribute* node = attributeSet.First(); + attributeSet.Remove( node ); + delete node; + } +} + + +const char* TiXmlElement::Attribute( const char* name ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( node ) + return node->Value(); + return 0; +} + + +#ifdef TIXML_USE_STL +const std::string* TiXmlElement::Attribute( const std::string& name ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( node ) + return &node->ValueStr(); + return 0; +} +#endif + + +const char* TiXmlElement::Attribute( const char* name, int* i ) const +{ + const char* s = Attribute( name ); + if ( i ) + { + if ( s ) { + *i = atoi( s ); + } + else { + *i = 0; + } + } + return s; +} + + +#ifdef TIXML_USE_STL +const std::string* TiXmlElement::Attribute( const std::string& name, int* i ) const +{ + const std::string* s = Attribute( name ); + if ( i ) + { + if ( s ) { + *i = atoi( s->c_str() ); + } + else { + *i = 0; + } + } + return s; +} +#endif + + +const char* TiXmlElement::Attribute( const char* name, double* d ) const +{ + const char* s = Attribute( name ); + if ( d ) + { + if ( s ) { + *d = atof( s ); + } + else { + *d = 0; + } + } + return s; +} + + +#ifdef TIXML_USE_STL +const std::string* TiXmlElement::Attribute( const std::string& name, double* d ) const +{ + const std::string* s = Attribute( name ); + if ( d ) + { + if ( s ) { + *d = atof( s->c_str() ); + } + else { + *d = 0; + } + } + return s; +} +#endif + + +int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + return node->QueryIntValue( ival ); +} + + +#ifdef TIXML_USE_STL +int TiXmlElement::QueryIntAttribute( const std::string& name, int* ival ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + return node->QueryIntValue( ival ); +} +#endif + + +int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + return node->QueryDoubleValue( dval ); +} + + +#ifdef TIXML_USE_STL +int TiXmlElement::QueryDoubleAttribute( const std::string& name, double* dval ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + return node->QueryDoubleValue( dval ); +} +#endif + + +void TiXmlElement::SetAttribute( const char * name, int val ) +{ + char buf[64]; + #if defined(TIXML_SNPRINTF) + TIXML_SNPRINTF( buf, sizeof(buf), "%d", val ); + #else + sprintf( buf, "%d", val ); + #endif + SetAttribute( name, buf ); +} + + +#ifdef TIXML_USE_STL +void TiXmlElement::SetAttribute( const std::string& name, int val ) +{ + std::ostringstream oss; + oss << val; + SetAttribute( name, oss.str() ); +} +#endif + + +void TiXmlElement::SetDoubleAttribute( const char * name, double val ) +{ + char buf[256]; + #if defined(TIXML_SNPRINTF) + TIXML_SNPRINTF( buf, sizeof(buf), "%f", val ); + #else + sprintf( buf, "%f", val ); + #endif + SetAttribute( name, buf ); +} + + +void TiXmlElement::SetAttribute( const char * cname, const char * cvalue ) +{ + #ifdef TIXML_USE_STL + TIXML_STRING _name( cname ); + TIXML_STRING _value( cvalue ); + #else + const char* _name = cname; + const char* _value = cvalue; + #endif + + TiXmlAttribute* node = attributeSet.Find( _name ); + if ( node ) + { + node->SetValue( _value ); + return; + } + + TiXmlAttribute* attrib = new (std::nothrow) TiXmlAttribute( cname, cvalue ); + if ( attrib ) + { + attributeSet.Add( attrib ); + } + else + { + TiXmlDocument* document = GetDocument(); + if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); + } +} + + +#ifdef TIXML_USE_STL +void TiXmlElement::SetAttribute( const std::string& name, const std::string& _value ) +{ + TiXmlAttribute* node = attributeSet.Find( name ); + if ( node ) + { + node->SetValue( _value ); + return; + } + + TiXmlAttribute* attrib = new (std::nothrow) TiXmlAttribute( name, _value ); + if ( attrib ) + { + attributeSet.Add( attrib ); + } + else + { + TiXmlDocument* document = GetDocument(); + if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); + } +} +#endif + + +void TiXmlElement::Print( FILE* cfile, int depth ) const +{ + int i; + assert( cfile ); + for ( i=0; iNext() ) + { + fprintf( cfile, " " ); + attrib->Print( cfile, depth ); + } + + // There are 3 different formatting approaches: + // 1) An element without children is printed as a node + // 2) An element with only a text child is printed as text + // 3) An element with children is printed on multiple lines. + TiXmlNode* node; + if ( !firstChild ) + { + fprintf( cfile, " />" ); + } + else if ( firstChild == lastChild && firstChild->ToText() ) + { + fprintf( cfile, ">" ); + firstChild->Print( cfile, depth + 1 ); + fprintf( cfile, "", value.c_str() ); + } + else + { + fprintf( cfile, ">" ); + + for ( node = firstChild; node; node=node->NextSibling() ) + { + if ( !node->ToText() ) + { + fprintf( cfile, "\n" ); + } + node->Print( cfile, depth+1 ); + } + fprintf( cfile, "\n" ); + for( i=0; i", value.c_str() ); + } +} + + +void TiXmlElement::CopyTo( TiXmlElement* target ) const +{ + // superclass: + TiXmlNode::CopyTo( target ); + + // Element class: + // Clone the attributes, then clone the children. + const TiXmlAttribute* attribute = 0; + for( attribute = attributeSet.First(); + attribute; + attribute = attribute->Next() ) + { + target->SetAttribute( attribute->Name(), attribute->Value() ); + } + + TiXmlNode* node = 0; + for ( node = firstChild; node; node = node->NextSibling() ) + { + target->LinkEndChild( node->Clone() ); + } +} + +bool TiXmlElement::Accept( TiXmlVisitor* visitor ) const +{ + if ( visitor->VisitEnter( *this, attributeSet.First() ) ) + { + for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) + { + if ( !node->Accept( visitor ) ) + break; + } + } + return visitor->VisitExit( *this ); +} + + +TiXmlNode* TiXmlElement::Clone() const +{ + TiXmlElement* clone = new (std::nothrow) TiXmlElement( Value() ); + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +const char* TiXmlElement::GetText() const +{ + const TiXmlNode* child = this->FirstChild(); + if ( child ) { + const TiXmlText* childText = child->ToText(); + if ( childText ) { + return childText->Value(); + } + } + return 0; +} + + +TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT ) +{ + tabsize = 4; + useMicrosoftBOM = false; + ClearError(); +} + +TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) +{ + tabsize = 4; + useMicrosoftBOM = false; + value = documentName; + ClearError(); +} + + +#ifdef TIXML_USE_STL +TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) +{ + tabsize = 4; + useMicrosoftBOM = false; + value = documentName; + ClearError(); +} +#endif + + +TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::DOCUMENT ) +{ + copy.CopyTo( this ); +} + + +void TiXmlDocument::operator=( const TiXmlDocument& copy ) +{ + Clear(); + copy.CopyTo( this ); +} + + +bool TiXmlDocument::LoadFile( TiXmlEncoding encoding ) +{ + // See STL_STRING_BUG below. + //StringToBuffer buf( value ); + + return LoadFile( Value(), encoding ); +} + + +bool TiXmlDocument::SaveFile() const +{ + // See STL_STRING_BUG below. +// StringToBuffer buf( value ); +// +// if ( buf.buffer && SaveFile( buf.buffer ) ) +// return true; +// +// return false; + return SaveFile( Value() ); +} + +bool TiXmlDocument::LoadFile( const char* _filename, TiXmlEncoding encoding ) +{ + // There was a really terrifying little bug here. The code: + // value = filename + // in the STL case, cause the assignment method of the std::string to + // be called. What is strange, is that the std::string had the same + // address as its c_str() method, and so bad things happen. Looks + // like a bug in the Microsoft STL implementation. + // Add an extra string to avoid the crash. + TIXML_STRING filename( _filename ); + value = filename; + + // reading in binary mode so that tinyxml can normalize the EOL + FILE* file = TiXmlFOpen( value.c_str (), "rb" ); + + if ( file ) + { + bool result = LoadFile( file, encoding ); + fclose( file ); + return result; + } + else + { + SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); + return false; + } +} + +bool TiXmlDocument::LoadFile( FILE* file, TiXmlEncoding encoding ) +{ + if ( !file ) + { + SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); + return false; + } + + // Delete the existing data: + Clear(); + location.Clear(); + + // Get the file size, so we can pre-allocate the string. HUGE speed impact. + long length = 0; + fseek( file, 0, SEEK_END ); + length = ftell( file ); + fseek( file, 0, SEEK_SET ); + + // Strange case, but good to handle up front. + if ( length <= 0 ) + { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return false; + } + + // If we have a file, assume it is all one big XML file, and read it in. + // The document parser may decide the document ends sooner than the entire file, however. + TIXML_STRING data; + data.reserve( length ); + + // Subtle bug here. TinyXml did use fgets. But from the XML spec: + // 2.11 End-of-Line Handling + // + // + // ...the XML processor MUST behave as if it normalized all line breaks in external + // parsed entities (including the document entity) on input, before parsing, by translating + // both the two-character sequence #xD #xA and any #xD that is not followed by #xA to + // a single #xA character. + // + // + // It is not clear fgets does that, and certainly isn't clear it works cross platform. + // Generally, you expect fgets to translate from the convention of the OS to the c/unix + // convention, and not work generally. + + /* + while( fgets( buf, sizeof(buf), file ) ) + { + data += buf; + } + */ + + char* buf = new char[ length+1 ]; + buf[0] = 0; + + if ( fread( buf, length, 1, file ) != 1 ) { + delete [] buf; + SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); + return false; + } + + const char* lastPos = buf; + const char* p = buf; + + buf[length] = 0; + while( *p ) { + assert( p < (buf+length) ); + if ( *p == 0xa ) { + // Newline character. No special rules for this. Append all the characters + // since the last string, and include the newline. + data.append( lastPos, (p-lastPos+1) ); // append, include the newline + ++p; // move past the newline + lastPos = p; // and point to the new buffer (may be 0) + assert( p <= (buf+length) ); + } + else if ( *p == 0xd ) { + // Carriage return. Append what we have so far, then + // handle moving forward in the buffer. + if ( (p-lastPos) > 0 ) { + data.append( lastPos, p-lastPos ); // do not add the CR + } + data += (char)0xa; // a proper newline + + if ( *(p+1) == 0xa ) { + // Carriage return - new line sequence + p += 2; + lastPos = p; + assert( p <= (buf+length) ); + } + else { + // it was followed by something else...that is presumably characters again. + ++p; + lastPos = p; + assert( p <= (buf+length) ); + } + } + else { + ++p; + } + } + // Handle any left over characters. + if ( p-lastPos ) { + data.append( lastPos, p-lastPos ); + } + delete [] buf; + buf = 0; + + Parse( data.c_str(), 0, encoding ); + + if ( Error() ) + return false; + else + return true; +} + + +bool TiXmlDocument::SaveFile( const char * filename ) const +{ + // The old c stuff lives on... + FILE* fp = TiXmlFOpen( filename, "w" ); + if ( fp ) + { + bool result = SaveFile( fp ); + fclose( fp ); + return result; + } + return false; +} + + +bool TiXmlDocument::SaveFile( FILE* fp ) const +{ + if ( useMicrosoftBOM ) + { + const unsigned char TIXML_UTF_LEAD_0 = 0xefU; + const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; + const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; + + fputc( TIXML_UTF_LEAD_0, fp ); + fputc( TIXML_UTF_LEAD_1, fp ); + fputc( TIXML_UTF_LEAD_2, fp ); + } + Print( fp, 0 ); + return (ferror(fp) == 0); +} + + +void TiXmlDocument::CopyTo( TiXmlDocument* target ) const +{ + TiXmlNode::CopyTo( target ); + + target->error = error; + target->errorId = errorId; + target->errorDesc = errorDesc; + target->tabsize = tabsize; + target->errorLocation = errorLocation; + target->useMicrosoftBOM = useMicrosoftBOM; + + TiXmlNode* node = 0; + for ( node = firstChild; node; node = node->NextSibling() ) + { + TiXmlNode* clonedNode=node->Clone(); + if (clonedNode!=NULL) target->LinkEndChild( clonedNode ); + } +} + + +TiXmlNode* TiXmlDocument::Clone() const +{ + TiXmlDocument* clone = new (std::nothrow) TiXmlDocument(); + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +void TiXmlDocument::Print( FILE* cfile, int depth ) const +{ + assert( cfile ); + for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) + { + node->Print( cfile, depth ); + fprintf( cfile, "\n" ); + } +} + + +bool TiXmlDocument::Accept( TiXmlVisitor* visitor ) const +{ + if ( visitor->VisitEnter( *this ) ) + { + for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) + { + if ( !node->Accept( visitor ) ) + break; + } + } + return visitor->VisitExit( *this ); +} + + +const TiXmlAttribute* TiXmlAttribute::Next() const +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( next->value.empty() && next->name.empty() ) + return 0; + return next; +} + +/* +TiXmlAttribute* TiXmlAttribute::Next() +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( next->value.empty() && next->name.empty() ) + return 0; + return next; +} +*/ + +const TiXmlAttribute* TiXmlAttribute::Previous() const +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( prev->value.empty() && prev->name.empty() ) + return 0; + return prev; +} + +/* +TiXmlAttribute* TiXmlAttribute::Previous() +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( prev->value.empty() && prev->name.empty() ) + return 0; + return prev; +} +*/ + +void TiXmlAttribute::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const +{ + TIXML_STRING n, v; + + EncodeString( name, &n ); + EncodeString( value, &v ); + + if (value.find ('\"') == TIXML_STRING::npos) { + if ( cfile ) { + fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); + } + if ( str ) { + (*str) += n; (*str) += "=\""; (*str) += v; (*str) += "\""; + } + } + else { + if ( cfile ) { + fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); + } + if ( str ) { + (*str) += n; (*str) += "='"; (*str) += v; (*str) += "'"; + } + } +} + + +int TiXmlAttribute::QueryIntValue( int* ival ) const +{ + if ( TIXML_SSCANF( value.c_str(), "%d", ival ) == 1 ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; +} + +int TiXmlAttribute::QueryDoubleValue( double* dval ) const +{ + if ( TIXML_SSCANF( value.c_str(), "%lf", dval ) == 1 ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; +} + +void TiXmlAttribute::SetIntValue( int _value ) +{ + char buf [64]; + #if defined(TIXML_SNPRINTF) + TIXML_SNPRINTF(buf, sizeof(buf), "%d", _value); + #else + sprintf (buf, "%d", _value); + #endif + SetValue (buf); +} + +void TiXmlAttribute::SetDoubleValue( double _value ) +{ + char buf [256]; + #if defined(TIXML_SNPRINTF) + TIXML_SNPRINTF( buf, sizeof(buf), "%lf", _value); + #else + sprintf (buf, "%lf", _value); + #endif + SetValue (buf); +} + +int TiXmlAttribute::IntValue() const +{ + return atoi (value.c_str ()); +} + +double TiXmlAttribute::DoubleValue() const +{ + return atof (value.c_str ()); +} + + +TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::COMMENT ) +{ + copy.CopyTo( this ); +} + + +void TiXmlComment::operator=( const TiXmlComment& base ) +{ + Clear(); + base.CopyTo( this ); +} + + +void TiXmlComment::Print( FILE* cfile, int depth ) const +{ + assert( cfile ); + for ( int i=0; i", value.c_str() ); +} + + +void TiXmlComment::CopyTo( TiXmlComment* target ) const +{ + TiXmlNode::CopyTo( target ); +} + + +bool TiXmlComment::Accept( TiXmlVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + + +TiXmlNode* TiXmlComment::Clone() const +{ + TiXmlComment* clone = new (std::nothrow) TiXmlComment(); + + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +void TiXmlText::Print( FILE* cfile, int depth ) const +{ + assert( cfile ); + if ( cdata ) + { + int i; + fprintf( cfile, "\n" ); + for ( i=0; i\n", value.c_str() ); // unformatted output + } + else + { + TIXML_STRING buffer; + EncodeString( value, &buffer ); + fprintf( cfile, "%s", buffer.c_str() ); + } +} + + +void TiXmlText::CopyTo( TiXmlText* target ) const +{ + TiXmlNode::CopyTo( target ); + target->cdata = cdata; +} + + +bool TiXmlText::Accept( TiXmlVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + + +TiXmlNode* TiXmlText::Clone() const +{ + TiXmlText* clone = 0; + clone = new (std::nothrow) TiXmlText( "" ); + + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +TiXmlDeclaration::TiXmlDeclaration( const char * _version, + const char * _encoding, + const char * _standalone ) + : TiXmlNode( TiXmlNode::DECLARATION ) +{ + version = _version; + encoding = _encoding; + standalone = _standalone; +} + + +#ifdef TIXML_USE_STL +TiXmlDeclaration::TiXmlDeclaration( const std::string& _version, + const std::string& _encoding, + const std::string& _standalone ) + : TiXmlNode( TiXmlNode::DECLARATION ) +{ + version = _version; + encoding = _encoding; + standalone = _standalone; +} +#endif + + +TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) + : TiXmlNode( TiXmlNode::DECLARATION ) +{ + copy.CopyTo( this ); +} + + +void TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) +{ + Clear(); + copy.CopyTo( this ); +} + + +void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const +{ + if ( cfile ) fprintf( cfile, "" ); + if ( str ) (*str) += "?>"; +} + + +void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const +{ + TiXmlNode::CopyTo( target ); + + target->version = version; + target->encoding = encoding; + target->standalone = standalone; +} + + +bool TiXmlDeclaration::Accept( TiXmlVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + + +TiXmlNode* TiXmlDeclaration::Clone() const +{ + TiXmlDeclaration* clone = new (std::nothrow) TiXmlDeclaration(); + + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +void TiXmlUnknown::Print( FILE* cfile, int depth ) const +{ + for ( int i=0; i", value.c_str() ); +} + + +void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const +{ + TiXmlNode::CopyTo( target ); +} + + +bool TiXmlUnknown::Accept( TiXmlVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + + +TiXmlNode* TiXmlUnknown::Clone() const +{ + TiXmlUnknown* clone = new (std::nothrow) TiXmlUnknown(); + + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +TiXmlAttributeSet::TiXmlAttributeSet() +{ + sentinel.next = &sentinel; + sentinel.prev = &sentinel; +} + + +TiXmlAttributeSet::~TiXmlAttributeSet() +{ + assert( sentinel.next == &sentinel ); + assert( sentinel.prev == &sentinel ); +} + + +void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) +{ + #ifdef TIXML_USE_STL + assert( !Find( TIXML_STRING( addMe->Name() ) ) ); // Shouldn't be multiply adding to the set. + #else + assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. + #endif + + addMe->next = &sentinel; + addMe->prev = sentinel.prev; + + sentinel.prev->next = addMe; + sentinel.prev = addMe; +} + +void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) +{ + TiXmlAttribute* node; + + for( node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node == removeMe ) + { + node->prev->next = node->next; + node->next->prev = node->prev; + node->next = 0; + node->prev = 0; + return; + } + } + assert( 0 ); // we tried to remove a non-linked attribute. +} + + +#ifdef TIXML_USE_STL +const TiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) const +{ + for( const TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node->name == name ) + return node; + } + return 0; +} + +/* +TiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) +{ + for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node->name == name ) + return node; + } + return 0; +} +*/ +#endif + + +const TiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) const +{ + for( const TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( strcmp( node->name.c_str(), name ) == 0 ) + return node; + } + return 0; +} + +/* +TiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) +{ + for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( strcmp( node->name.c_str(), name ) == 0 ) + return node; + } + return 0; +} +*/ + +#ifdef TIXML_USE_STL +std::istream& operator>> (std::istream & in, TiXmlNode & base) +{ + TIXML_STRING tag; + tag.reserve( 8 * 1000 ); + base.StreamIn( &in, &tag ); + + base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); + return in; +} +#endif + + +#ifdef TIXML_USE_STL +std::ostream& operator<< (std::ostream & out, const TiXmlNode & base) +{ + TiXmlPrinter printer; + printer.SetStreamPrinting(); + base.Accept( &printer ); + out << printer.Str(); + + return out; +} + + +std::string& operator<< (std::string& out, const TiXmlNode& base ) +{ + TiXmlPrinter printer; + printer.SetStreamPrinting(); + base.Accept( &printer ); + out.append( printer.Str() ); + + return out; +} +#endif + + +TiXmlHandle TiXmlHandle::FirstChild() const +{ + if ( node ) + { + TiXmlNode* child = node->FirstChild(); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const +{ + if ( node ) + { + TiXmlNode* child = node->FirstChild( value ); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::FirstChildElement() const +{ + if ( node ) + { + TiXmlElement* child = node->FirstChildElement(); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const +{ + if ( node ) + { + TiXmlElement* child = node->FirstChildElement( value ); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::Child( int count ) const +{ + if ( node ) + { + int i; + TiXmlNode* child = node->FirstChild(); + for ( i=0; + child && iNextSibling(), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const +{ + if ( node ) + { + int i; + TiXmlNode* child = node->FirstChild( value ); + for ( i=0; + child && iNextSibling( value ), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::ChildElement( int count ) const +{ + if ( node ) + { + int i; + TiXmlElement* child = node->FirstChildElement(); + for ( i=0; + child && iNextSiblingElement(), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const +{ + if ( node ) + { + int i; + TiXmlElement* child = node->FirstChildElement( value ); + for ( i=0; + child && iNextSiblingElement( value ), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +bool TiXmlPrinter::VisitEnter( const TiXmlDocument& ) +{ + return true; +} + +bool TiXmlPrinter::VisitExit( const TiXmlDocument& ) +{ + return true; +} + +bool TiXmlPrinter::VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ) +{ + DoIndent(); + buffer += "<"; + buffer += element.Value(); + + for( const TiXmlAttribute* attrib = firstAttribute; attrib; attrib = attrib->Next() ) + { + buffer += " "; + attrib->Print( 0, 0, &buffer ); + } + + if ( !element.FirstChild() ) + { + buffer += " />"; + DoLineBreak(); + } + else + { + buffer += ">"; + if ( element.FirstChild()->ToText() + && element.LastChild() == element.FirstChild() + && element.FirstChild()->ToText()->CDATA() == false ) + { + simpleTextPrint = true; + // no DoLineBreak()! + } + else + { + DoLineBreak(); + } + } + ++depth; + return true; +} + + +bool TiXmlPrinter::VisitExit( const TiXmlElement& element ) +{ + --depth; + if ( !element.FirstChild() ) + { + // nothing. + } + else + { + if ( simpleTextPrint ) + { + simpleTextPrint = false; + } + else + { + DoIndent(); + } + buffer += ""; + DoLineBreak(); + } + return true; +} + + +bool TiXmlPrinter::Visit( const TiXmlText& text ) +{ + if ( text.CDATA() ) + { + DoIndent(); + buffer += ""; + DoLineBreak(); + } + else if ( simpleTextPrint ) + { + TIXML_STRING str; + TiXmlBase::EncodeString( text.ValueTStr(), &str ); + buffer += str; + } + else + { + DoIndent(); + TIXML_STRING str; + TiXmlBase::EncodeString( text.ValueTStr(), &str ); + buffer += str; + DoLineBreak(); + } + return true; +} + + +bool TiXmlPrinter::Visit( const TiXmlDeclaration& declaration ) +{ + DoIndent(); + declaration.Print( 0, 0, &buffer ); + DoLineBreak(); + return true; +} + + +bool TiXmlPrinter::Visit( const TiXmlComment& comment ) +{ + DoIndent(); + buffer += ""; + DoLineBreak(); + return true; +} + + +bool TiXmlPrinter::Visit( const TiXmlUnknown& unknown ) +{ + DoIndent(); + buffer += "<"; + buffer += unknown.Value(); + buffer += ">"; + DoLineBreak(); + return true; +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/tinyxml.h b/lib/ESPiLight/pilight/libs/openzwave/tinyxml.h new file mode 100644 index 0000000..70c81c5 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/tinyxml.h @@ -0,0 +1,1802 @@ +/* +www.sourceforge.net/projects/tinyxml +Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + + +#ifndef TINYXML_INCLUDED +#define TINYXML_INCLUDED + +#ifdef _WIN32 +#pragma warning( push ) +#pragma warning( disable : 4530 ) +#pragma warning( disable : 4786 ) +#endif + +#include +#include +#include +#include +#include + +// Help out windows: +#if defined( _DEBUG ) && !defined( DEBUG ) +#define DEBUG +#endif + +#ifdef TIXML_USE_STL + #include + #include + #include + #define TIXML_STRING std::string +#else + #include "tinystr.h" + #define TIXML_STRING TiXmlString +#endif + +// Deprecated library function hell. Compilers want to use the +// new safe versions. This probably doesn't fully address the problem, +// but it gets closer. There are too many compilers for me to fully +// test. If you get compilation troubles, undefine TIXML_SAFE +#define TIXML_SAFE + +#ifdef TIXML_SAFE + #if defined(_WIN32) && (_WIN32 >= 1400 ) + // Microsoft visual studio, version 2005 and higher. + #define TIXML_SNPRINTF _snprintf_s + #define TIXML_SNSCANF _snscanf_s + #define TIXML_SSCANF sscanf_s + #elif defined(_WIN32) && (_WIN32 >= 1200 ) + // Microsoft visual studio, version 6 and higher. + //#pragma message( "Using _sn* functions." ) + #define TIXML_SNPRINTF _snprintf + #define TIXML_SNSCANF _snscanf + #define TIXML_SSCANF sscanf + #elif defined(__GNUC__) && (__GNUC__ >= 3 ) + // GCC version 3 and higher.s + //#warning( "Using sn* functions." ) + #define TIXML_SNPRINTF snprintf + #define TIXML_SNSCANF snscanf + #define TIXML_SSCANF sscanf + #else + #define TIXML_SSCANF sscanf + #endif +#endif + +class TiXmlDocument; +class TiXmlElement; +class TiXmlComment; +class TiXmlUnknown; +class TiXmlAttribute; +class TiXmlText; +class TiXmlDeclaration; +class TiXmlParsingData; + +const int TIXML_MAJOR_VERSION = 2; +const int TIXML_MINOR_VERSION = 5; +const int TIXML_PATCH_VERSION = 3; + +/* Internal structure for tracking location of items + in the XML file. +*/ +struct TiXmlCursor +{ + TiXmlCursor() { Clear(); } + void Clear() { row = col = -1; } + + int row; // 0 based. + int col; // 0 based. +}; + + +/** + If you call the Accept() method, it requires being passed a TiXmlVisitor + class to handle callbacks. For nodes that contain other nodes (Document, Element) + you will get called with a VisitEnter/VisitExit pair. Nodes that are always leaves + are simple called with Visit(). + + If you return 'true' from a Visit method, recursive parsing will continue. If you return + false, no children of this node or its sibilings will be Visited. + + All flavors of Visit methods have a default implementation that returns 'true' (continue + visiting). You need to only override methods that are interesting to you. + + Generally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting. + + You should never change the document from a callback. + + \see TiXmlNode::Accept() +*/ +class TiXmlVisitor +{ +public: + virtual ~TiXmlVisitor() {} + + /// Visit a document. + virtual bool VisitEnter( const TiXmlDocument& /*doc*/ ) { return true; } + /// Visit a document. + virtual bool VisitExit( const TiXmlDocument& /*doc*/ ) { return true; } + + /// Visit an element. + virtual bool VisitEnter( const TiXmlElement& /*element*/, const TiXmlAttribute* /*firstAttribute*/ ) { return true; } + /// Visit an element. + virtual bool VisitExit( const TiXmlElement& /*element*/ ) { return true; } + + /// Visit a declaration + virtual bool Visit( const TiXmlDeclaration& /*declaration*/ ) { return true; } + /// Visit a text node + virtual bool Visit( const TiXmlText& /*text*/ ) { return true; } + /// Visit a comment node + virtual bool Visit( const TiXmlComment& /*comment*/ ) { return true; } + /// Visit an unknow node + virtual bool Visit( const TiXmlUnknown& /*unknown*/ ) { return true; } +}; + +// Only used by Attribute::Query functions +enum +{ + TIXML_SUCCESS, + TIXML_NO_ATTRIBUTE, + TIXML_WRONG_TYPE +}; + + +// Used by the parsing routines. +enum TiXmlEncoding +{ + TIXML_ENCODING_UNKNOWN, + TIXML_ENCODING_UTF8, + TIXML_ENCODING_LEGACY +}; + +const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; + +/** TiXmlBase is a base class for every class in TinyXml. + It does little except to establish that TinyXml classes + can be printed and provide some utility functions. + + In XML, the document and elements can contain + other elements and other types of nodes. + + \verbatim + A Document can contain: Element (container or leaf) + Comment (leaf) + Unknown (leaf) + Declaration( leaf ) + + An Element can contain: Element (container or leaf) + Text (leaf) + Attributes (not on tree) + Comment (leaf) + Unknown (leaf) + + A Decleration contains: Attributes (not on tree) + \endverbatim +*/ +class TiXmlBase +{ + friend class TiXmlNode; + friend class TiXmlElement; + friend class TiXmlDocument; + +public: + TiXmlBase() : userData(0) {} + virtual ~TiXmlBase() {} + + /** All TinyXml classes can print themselves to a filestream + or the string class (TiXmlString in non-STL mode, std::string + in STL mode.) Either or both cfile and str can be null. + + This is a formatted print, and will insert + tabs and newlines. + + (For an unformatted stream, use the << operator.) + */ + virtual void Print( FILE* cfile, int depth ) const = 0; + + /** The world does not agree on whether white space should be kept or + not. In order to make everyone happy, these global, static functions + are provided to set whether or not TinyXml will condense all white space + into a single space or not. The default is to condense. Note changing this + value is not thread safe. + */ + static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } + + /// Return the current white space setting. + static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } + + /** Return the position, in the original source file, of this node or attribute. + The row and column are 1-based. (That is the first row and first column is + 1,1). If the returns values are 0 or less, then the parser does not have + a row and column value. + + Generally, the row and column value will be set when the TiXmlDocument::Load(), + TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set + when the DOM was created from operator>>. + + The values reflect the initial load. Once the DOM is modified programmatically + (by adding or changing nodes and attributes) the new values will NOT update to + reflect changes in the document. + + There is a minor performance cost to computing the row and column. Computation + can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. + + \see TiXmlDocument::SetTabSize() + */ + int Row() const { return location.row + 1; } + int Column() const { return location.col + 1; } ///< See Row() + + void SetUserData( void* user ) { userData = user; } ///< Set a pointer to arbitrary user data. + void* GetUserData() { return userData; } ///< Get a pointer to arbitrary user data. + const void* GetUserData() const { return userData; } ///< Get a pointer to arbitrary user data. + + // Table that returs, for a given lead byte, the total number of bytes + // in the UTF-8 sequence. + static const int utf8ByteTable[256]; + + virtual const char* Parse( const char* p, + TiXmlParsingData* data, + TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; + + /** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, + or they will be transformed into entities! + */ + static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out ); + + enum + { + TIXML_NO_ERROR = 0, + TIXML_ERROR, + TIXML_ERROR_OPENING_FILE, + TIXML_ERROR_OUT_OF_MEMORY, + TIXML_ERROR_PARSING_ELEMENT, + TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, + TIXML_ERROR_READING_ELEMENT_VALUE, + TIXML_ERROR_READING_ATTRIBUTES, + TIXML_ERROR_PARSING_EMPTY, + TIXML_ERROR_READING_END_TAG, + TIXML_ERROR_PARSING_UNKNOWN, + TIXML_ERROR_PARSING_COMMENT, + TIXML_ERROR_PARSING_DECLARATION, + TIXML_ERROR_DOCUMENT_EMPTY, + TIXML_ERROR_EMBEDDED_NULL, + TIXML_ERROR_PARSING_CDATA, + TIXML_ERROR_DOCUMENT_TOP_ONLY, + + TIXML_ERROR_STRING_COUNT + }; + +protected: + + static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); + inline static bool IsWhiteSpace( char c ) + { + return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); + } + inline static bool IsWhiteSpace( int c ) + { + if ( c < 256 ) + return IsWhiteSpace( (char) c ); + return false; // Again, only truly correct for English/Latin...but usually works. + } + + #ifdef TIXML_USE_STL + static bool StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ); + static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag ); + #endif + + /* Reads an XML name into the string provided. Returns + a pointer just past the last character of the name, + or 0 if the function has an error. + */ + static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); + + /* Reads text. Returns a pointer past the given end tag. + Wickedly complex options, but it keeps the (sensitive) code in one place. + */ + static const char* ReadText( const char* in, // where to start + TIXML_STRING* text, // the string read + bool ignoreWhiteSpace, // whether to keep the white space + const char* endTag, // what ends this text + bool ignoreCase, // whether to ignore case in the end tag + TiXmlEncoding encoding ); // the current encoding + + // If an entity has been found, transform it into a character. + static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); + + // Get a character, while interpreting entities. + // The length can be from 0 to 4 bytes. + inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) + { + assert( p ); + if ( encoding == TIXML_ENCODING_UTF8 ) + { + *length = utf8ByteTable[ *((const unsigned char*)p) ]; + assert( *length >= 0 && *length < 5 ); + } + else + { + *length = 1; + } + + if ( *length == 1 ) + { + if ( *p == '&' ) + return GetEntity( p, _value, length, encoding ); + *_value = *p; + return p+1; + } + else if ( *length ) + { + //strncpy( _value, p, *length ); // lots of compilers don't like this function (unsafe), + // and the null terminator isn't needed + for( int i=0; p[i] && i<*length; ++i ) { + _value[i] = p[i]; + } + return p + (*length); + } + else + { + // Not valid text. + return 0; + } + } + + // Return true if the next characters in the stream are any of the endTag sequences. + // Ignore case only works for english, and should only be relied on when comparing + // to English words: StringEqual( p, "version", true ) is fine. + static bool StringEqual( const char* p, + const char* endTag, + bool ignoreCase, + TiXmlEncoding encoding ); + + static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; + + TiXmlCursor location; + + /// Field containing a generic user pointer + void* userData; + + // None of these methods are reliable for any language except English. + // Good for approximation, not great for accuracy. + static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); + static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); + inline static int ToLower( int v, TiXmlEncoding encoding ) + { + if ( encoding == TIXML_ENCODING_UTF8 ) + { + if ( v < 128 ) return tolower( v ); + return v; + } + else + { + return tolower( v ); + } + } + static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); + +private: + TiXmlBase( const TiXmlBase& ); // not implemented. + void operator=( const TiXmlBase& base ); // not allowed. + + struct Entity + { + const char* str; + unsigned int strLength; + char chr; + }; + enum + { + NUM_ENTITY = 5, + MAX_ENTITY_LENGTH = 6 + + }; + static Entity entity[ NUM_ENTITY ]; + static bool condenseWhiteSpace; +}; + + +/** The parent class for everything in the Document Object Model. + (Except for attributes). + Nodes have siblings, a parent, and children. A node can be + in a document, or stand on its own. The type of a TiXmlNode + can be queried, and it can be cast to its more defined type. +*/ +class TiXmlNode : public TiXmlBase +{ + friend class TiXmlDocument; + friend class TiXmlElement; + +public: + #ifdef TIXML_USE_STL + + /** An input stream operator, for every class. Tolerant of newlines and + formatting, but doesn't expect them. + */ + friend std::istream& operator >> (std::istream& in, TiXmlNode& base); + + /** An output stream operator, for every class. Note that this outputs + without any newlines or formatting, as opposed to Print(), which + includes tabs and new lines. + + The operator<< and operator>> are not completely symmetric. Writing + a node to a stream is very well defined. You'll get a nice stream + of output, without any extra whitespace or newlines. + + But reading is not as well defined. (As it always is.) If you create + a TiXmlElement (for example) and read that from an input stream, + the text needs to define an element or junk will result. This is + true of all input streams, but it's worth keeping in mind. + + A TiXmlDocument will read nodes until it reads a root element, and + all the children of that root element. + */ + friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); + + /// Appends the XML node or attribute to a std::string. + friend std::string& operator<< (std::string& out, const TiXmlNode& base ); + + #endif + + /** The types of XML nodes supported by TinyXml. (All the + unsupported types are picked up by UNKNOWN.) + */ + enum NodeType + { + DOCUMENT, + ELEMENT, + COMMENT, + UNKNOWN, + TEXT, + DECLARATION, + TYPECOUNT + }; + + virtual ~TiXmlNode(); + + /** The meaning of 'value' changes for the specific type of + TiXmlNode. + \verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + \endverbatim + + The subclasses will wrap this function. + */ + const char *Value() const { return value.c_str (); } + + #ifdef TIXML_USE_STL + /** Return Value() as a std::string. If you only use STL, + this is more efficient than calling Value(). + Only available in STL mode. + */ + const std::string& ValueStr() const { return value; } + #endif + + const TIXML_STRING& ValueTStr() const { return value; } + + /** Changes the value of the node. Defined as: + \verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + \endverbatim + */ + void SetValue(const char * _value) { value = _value;} + + #ifdef TIXML_USE_STL + /// STL std::string form. + void SetValue( const std::string& _value ) { value = _value; } + #endif + + /// Delete all the children of this node. Does not affect 'this'. + void Clear(); + + /// One step up the DOM. + TiXmlNode* Parent() { return parent; } + const TiXmlNode* Parent() const { return parent; } + + const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. + TiXmlNode* FirstChild() { return firstChild; } + const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. + /// The first child of this node with the matching 'value'. Will be null if none found. + TiXmlNode* FirstChild( const char * _value ) { + // Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe) + // call the method, cast the return back to non-const. + return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value )); + } + const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. + TiXmlNode* LastChild() { return lastChild; } + + const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. + TiXmlNode* LastChild( const char * _value ) { + return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value )); + } + + #ifdef TIXML_USE_STL + const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. + const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. + #endif + + /** An alternate way to walk the children of a node. + One way to iterate over nodes is: + \verbatim + for( child = parent->FirstChild(); child; child = child->NextSibling() ) + \endverbatim + + IterateChildren does the same thing with the syntax: + \verbatim + child = 0; + while( child = parent->IterateChildren( child ) ) + \endverbatim + + IterateChildren takes the previous child as input and finds + the next one. If the previous child is null, it returns the + first. IterateChildren will return null when done. + */ + const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const; + TiXmlNode* IterateChildren( const TiXmlNode* previous ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) ); + } + + /// This flavor of IterateChildren searches for children with a particular 'value' + const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const; + TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. + TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. + #endif + + /** Add a new node related to this. Adds a child past the LastChild. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); + + + /** Add a new node related to this. Adds a child past the LastChild. + + NOTE: the node to be added is passed by pointer, and will be + henceforth owned (and deleted) by tinyXml. This method is efficient + and avoids an extra copy, but should be used with care as it + uses a different memory model than the other insert functions. + + \sa InsertEndChild + */ + TiXmlNode* LinkEndChild( TiXmlNode* addThis ); + + /** Add a new node related to this. Adds a child before the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); + + /** Add a new node related to this. Adds a child after the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); + + /** Replace a child of this node. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); + + /// Delete a child of this node. + bool RemoveChild( TiXmlNode* removeThis ); + + /// Navigate to a sibling node. + const TiXmlNode* PreviousSibling() const { return prev; } + TiXmlNode* PreviousSibling() { return prev; } + + /// Navigate to a sibling node. + const TiXmlNode* PreviousSibling( const char * ) const; + TiXmlNode* PreviousSibling( const char *_prev ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. + const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. + #endif + + /// Navigate to a sibling node. + const TiXmlNode* NextSibling() const { return next; } + TiXmlNode* NextSibling() { return next; } + + /// Navigate to a sibling node with the given 'value'. + const TiXmlNode* NextSibling( const char * ) const; + TiXmlNode* NextSibling( const char* _next ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) ); + } + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + const TiXmlElement* NextSiblingElement() const; + TiXmlElement* NextSiblingElement() { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() ); + } + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + const TiXmlElement* NextSiblingElement( const char * ) const; + TiXmlElement* NextSiblingElement( const char *_next ) { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. + TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. + #endif + + /// Convenience function to get through elements. + const TiXmlElement* FirstChildElement() const; + TiXmlElement* FirstChildElement() { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() ); + } + + /// Convenience function to get through elements. + const TiXmlElement* FirstChildElement( const char * _value ) const; + TiXmlElement* FirstChildElement( const char * _value ) { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. + TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. + #endif + + /** Query the type (as an enumerated value, above) of this node. + The possible types are: DOCUMENT, ELEMENT, COMMENT, + UNKNOWN, TEXT, and DECLARATION. + */ + int Type() const { return type; } + + /** Return a pointer to the Document this node lives in. + Returns null if not in a document. + */ + const TiXmlDocument* GetDocument() const; + TiXmlDocument* GetDocument() { + return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() ); + } + + /// Returns true if this node has no children. + bool NoChildren() const { return !firstChild; } + + virtual const TiXmlDocument* ToDocument() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlElement* ToElement() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlComment* ToComment() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlUnknown* ToUnknown() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlText* ToText() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlDeclaration* ToDeclaration() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + + virtual TiXmlDocument* ToDocument() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlElement* ToElement() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlComment* ToComment() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlUnknown* ToUnknown() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlText* ToText() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlDeclaration* ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + + /** Create an exact duplicate of this node and return it. The memory must be deleted + by the caller. + */ + virtual TiXmlNode* Clone() const = 0; + + /** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the + XML tree will be conditionally visited and the host will be called back + via the TiXmlVisitor interface. + + This is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse + the XML for the callbacks, so the performance of TinyXML is unchanged by using this + interface versus any other.) + + The interface has been based on ideas from: + + - http://www.saxproject.org/ + - http://c2.com/cgi/wiki?HierarchicalVisitorPattern + + Which are both good references for "visiting". + + An example of using Accept(): + \verbatim + TiXmlPrinter printer; + tinyxmlDoc.Accept( &printer ); + const char* xmlcstr = printer.CStr(); + \endverbatim + */ + virtual bool Accept( TiXmlVisitor* visitor ) const = 0; + +protected: + TiXmlNode( NodeType _type ); + + // Copy to the allocated object. Shared functionality between Clone, Copy constructor, + // and the assignment operator. + void CopyTo( TiXmlNode* target ) const; + + #ifdef TIXML_USE_STL + // The real work of the input operator. + virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0; + #endif + + // Figure out what is at *p, and parse it. Returns null if it is not an xml node. + TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); + + TiXmlNode* parent; + NodeType type; + + TiXmlNode* firstChild; + TiXmlNode* lastChild; + + TIXML_STRING value; + + TiXmlNode* prev; + TiXmlNode* next; + +private: + TiXmlNode( const TiXmlNode& ); // not implemented. + void operator=( const TiXmlNode& base ); // not allowed. +}; + + +/** An attribute is a name-value pair. Elements have an arbitrary + number of attributes, each with a unique name. + + \note The attributes are not TiXmlNodes, since they are not + part of the tinyXML document object model. There are other + suggested ways to look at this problem. +*/ +class TiXmlAttribute : public TiXmlBase +{ + friend class TiXmlAttributeSet; + +public: + /// Construct an empty attribute. + TiXmlAttribute() : TiXmlBase() + { + document = 0; + prev = next = 0; + } + + #ifdef TIXML_USE_STL + /// std::string constructor. + TiXmlAttribute( const std::string& _name, const std::string& _value ) + { + name = _name; + value = _value; + document = 0; + prev = next = 0; + } + #endif + + /// Construct an attribute with a name and value. + TiXmlAttribute( const char * _name, const char * _value ) + { + name = _name; + value = _value; + document = 0; + prev = next = 0; + } + + const char* Name() const { return name.c_str(); } ///< Return the name of this attribute. + const char* Value() const { return value.c_str(); } ///< Return the value of this attribute. + #ifdef TIXML_USE_STL + const std::string& ValueStr() const { return value; } ///< Return the value of this attribute. + #endif + int IntValue() const; ///< Return the value of this attribute, converted to an integer. + double DoubleValue() const; ///< Return the value of this attribute, converted to a double. + + // Get the tinyxml string representation + const TIXML_STRING& NameTStr() const { return name; } + + /** QueryIntValue examines the value string. It is an alternative to the + IntValue() method with richer error checking. + If the value is an integer, it is stored in 'value' and + the call returns TIXML_SUCCESS. If it is not + an integer, it returns TIXML_WRONG_TYPE. + + A specialized but useful call. Note that for success it returns 0, + which is the opposite of almost all other TinyXml calls. + */ + int QueryIntValue( int* _value ) const; + /// QueryDoubleValue examines the value string. See QueryIntValue(). + int QueryDoubleValue( double* _value ) const; + + void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. + void SetValue( const char* _value ) { value = _value; } ///< Set the value. + + void SetIntValue( int _value ); ///< Set the value from an integer. + void SetDoubleValue( double _value ); ///< Set the value from a double. + + #ifdef TIXML_USE_STL + /// STL std::string form. + void SetName( const std::string& _name ) { name = _name; } + /// STL std::string form. + void SetValue( const std::string& _value ) { value = _value; } + #endif + + /// Get the next sibling attribute in the DOM. Returns null at end. + const TiXmlAttribute* Next() const; + TiXmlAttribute* Next() { + return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); + } + + /// Get the previous sibling attribute in the DOM. Returns null at beginning. + const TiXmlAttribute* Previous() const; + TiXmlAttribute* Previous() { + return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); + } + + bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } + bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } + bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } + + /* Attribute parsing starts: first letter of the name + returns: the next char after the value end quote + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + // Prints this Attribute to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const { + Print( cfile, depth, 0 ); + } + void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; + + // [internal use] + // Set the document pointer so the attribute can report errors. + void SetDocument( TiXmlDocument* doc ) { document = doc; } + +private: + TiXmlAttribute( const TiXmlAttribute& ); // not implemented. + void operator=( const TiXmlAttribute& base ); // not allowed. + + TiXmlDocument* document; // A pointer back to a document, for error reporting. + TIXML_STRING name; + TIXML_STRING value; + TiXmlAttribute* prev; + TiXmlAttribute* next; +}; + + +/* A class used to manage a group of attributes. + It is only used internally, both by the ELEMENT and the DECLARATION. + + The set can be changed transparent to the Element and Declaration + classes that use it, but NOT transparent to the Attribute + which has to implement a next() and previous() method. Which makes + it a bit problematic and prevents the use of STL. + + This version is implemented with circular lists because: + - I like circular lists + - it demonstrates some independence from the (typical) doubly linked list. +*/ +class TiXmlAttributeSet +{ +public: + TiXmlAttributeSet(); + ~TiXmlAttributeSet(); + + void Add( TiXmlAttribute* attribute ); + void Remove( TiXmlAttribute* attribute ); + + const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } + TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } + const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } + TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } + + const TiXmlAttribute* Find( const char* _name ) const; + TiXmlAttribute* Find( const char* _name ) { + return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttributeSet* >(this))->Find( _name ) ); + } + #ifdef TIXML_USE_STL + const TiXmlAttribute* Find( const std::string& _name ) const; + TiXmlAttribute* Find( const std::string& _name ) { + return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttributeSet* >(this))->Find( _name ) ); + } + + #endif + +private: + //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), + //*ME: this class must be also use a hidden/disabled copy-constructor !!! + TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed + void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) + + TiXmlAttribute sentinel; +}; + + +/** The element is a container class. It has a value, the element name, + and can contain other elements, text, comments, and unknowns. + Elements also contain an arbitrary number of attributes. +*/ +class TiXmlElement : public TiXmlNode +{ +public: + /// Construct an element. + TiXmlElement (const char * in_value); + + #ifdef TIXML_USE_STL + /// std::string constructor. + TiXmlElement( const std::string& _value ); + #endif + + TiXmlElement( const TiXmlElement& ); + + void operator=( const TiXmlElement& base ); + + virtual ~TiXmlElement(); + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + */ + const char* Attribute( const char* name ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + If the attribute exists and can be converted to an integer, + the integer value will be put in the return 'i', if 'i' + is non-null. + */ + const char* Attribute( const char* name, int* i ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + If the attribute exists and can be converted to an double, + the double value will be put in the return 'd', if 'd' + is non-null. + */ + const char* Attribute( const char* name, double* d ) const; + + /** QueryIntAttribute examines the attribute - it is an alternative to the + Attribute() method with richer error checking. + If the attribute is an integer, it is stored in 'value' and + the call returns TIXML_SUCCESS. If it is not + an integer, it returns TIXML_WRONG_TYPE. If the attribute + does not exist, then TIXML_NO_ATTRIBUTE is returned. + */ + int QueryIntAttribute( const char* name, int* _value ) const; + /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). + int QueryDoubleAttribute( const char* name, double* _value ) const; + /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). + int QueryFloatAttribute( const char* name, float* _value ) const { + double d; + int result = QueryDoubleAttribute( name, &d ); + if ( result == TIXML_SUCCESS ) { + *_value = (float)d; + } + return result; + } + + #ifdef TIXML_USE_STL + /** Template form of the attribute query which will try to read the + attribute into the specified type. Very easy, very powerful, but + be careful to make sure to call this with the correct type. + + NOTE: This method doesn't work correctly for 'string' types. + + \return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE + */ + template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const + { + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + + std::stringstream sstream( node->ValueStr() ); + sstream >> *outValue; + if ( !sstream.fail() ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; + } + /* + This is - in theory - a bug fix for "QueryValueAtribute returns truncated std::string" + but template specialization is hard to get working cross-compiler. Leaving the bug for now. + + // The above will fail for std::string because the space character is used as a seperator. + // Specialize for strings. Bug [ 1695429 ] QueryValueAtribute returns truncated std::string + template<> int QueryValueAttribute( const std::string& name, std::string* outValue ) const + { + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + *outValue = node->ValueStr(); + return TIXML_SUCCESS; + } + */ + #endif + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const char* name, const char * _value ); + + #ifdef TIXML_USE_STL + const std::string* Attribute( const std::string& name ) const; + const std::string* Attribute( const std::string& name, int* i ) const; + const std::string* Attribute( const std::string& name, double* d ) const; + int QueryIntAttribute( const std::string& name, int* _value ) const; + int QueryDoubleAttribute( const std::string& name, double* _value ) const; + + /// STL std::string form. + void SetAttribute( const std::string& name, const std::string& _value ); + ///< STL std::string form. + void SetAttribute( const std::string& name, int _value ); + #endif + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const char * name, int value ); + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetDoubleAttribute( const char * name, double value ); + + /** Deletes an attribute with the given name. + */ + void RemoveAttribute( const char * name ); + #ifdef TIXML_USE_STL + void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. + #endif + + const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. + TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } + const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. + TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } + + /** Convenience function for easy access to the text inside an element. Although easy + and concise, GetText() is limited compared to getting the TiXmlText child + and accessing it directly. + + If the first child of 'this' is a TiXmlText, the GetText() + returns the character string of the Text node, else null is returned. + + This is a convenient method for getting the text of simple contained text: + \verbatim + This is text + const char* str = fooElement->GetText(); + \endverbatim + + 'str' will be a pointer to "This is text". + + Note that this function can be misleading. If the element foo was created from + this XML: + \verbatim + This is text + \endverbatim + + then the value of str would be null. The first child node isn't a text node, it is + another element. From this XML: + \verbatim + This is text + \endverbatim + GetText() will return "This is ". + + WARNING: GetText() accesses a child node - don't become confused with the + similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are + safe type casts on the referenced node. + */ + const char* GetText() const; + + /// Creates a new Element and returns it - the returned element is a copy. + virtual TiXmlNode* Clone() const; + // Print the Element to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + /* Attribtue parsing starts: next char past '<' + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlElement* ToElement() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlElement* ToElement() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* visitor ) const; + +protected: + + void CopyTo( TiXmlElement* target ) const; + void ClearThis(); // like clear, but initializes 'this' object as well + + // Used to be public [internal use] + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + /* [internal use] + Reads the "value" of the element -- another element, or text. + This should terminate with the current end tag. + */ + const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); + +private: + + TiXmlAttributeSet attributeSet; +}; + + +/** An XML comment. +*/ +class TiXmlComment : public TiXmlNode +{ +public: + /// Constructs an empty comment. + TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {} + /// Construct a comment from text. + TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::COMMENT ) { + SetValue( _value ); + } + TiXmlComment( const TiXmlComment& ); + void operator=( const TiXmlComment& base ); + + virtual ~TiXmlComment() {} + + /// Returns a copy of this Comment. + virtual TiXmlNode* Clone() const; + // Write this Comment to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + /* Attribtue parsing starts: at the ! of the !-- + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* visitor ) const; + +protected: + void CopyTo( TiXmlComment* target ) const; + + // used to be public + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif +// virtual void StreamOut( TIXML_OSTREAM * out ) const; + +private: + +}; + + +/** XML text. A text node can have 2 ways to output the next. "normal" output + and CDATA. It will default to the mode it was parsed from the XML file and + you generally want to leave it alone, but you can change the output mode with + SetCDATA() and query it with CDATA(). +*/ +class TiXmlText : public TiXmlNode +{ + friend class TiXmlElement; +public: + /** Constructor for text element. By default, it is treated as + normal, encoded text. If you want it be output as a CDATA text + element, set the parameter _cdata to 'true' + */ + TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TEXT) + { + SetValue( initValue ); + cdata = false; + } + virtual ~TiXmlText() {} + + #ifdef TIXML_USE_STL + /// Constructor. + TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT) + { + SetValue( initValue ); + cdata = false; + } + #endif + + TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT ) { copy.CopyTo( this ); } + void operator=( const TiXmlText& base ) { base.CopyTo( this ); } + + // Write this text object to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + /// Queries whether this represents text using a CDATA section. + bool CDATA() const { return cdata; } + /// Turns on or off a CDATA representation of text. + void SetCDATA( bool _cdata ) { cdata = _cdata; } + + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlText* ToText() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* content ) const; + +protected : + /// [internal use] Creates a new Element and returns it. + virtual TiXmlNode* Clone() const; + void CopyTo( TiXmlText* target ) const; + + bool Blank() const; // returns true if all white space and new lines + // [internal use] + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + bool cdata; // true if this should be input and output as a CDATA style text element +}; + + +/** In correct XML the declaration is the first entry in the file. + \verbatim + + \endverbatim + + TinyXml will happily read or write files without a declaration, + however. There are 3 possible attributes to the declaration: + version, encoding, and standalone. + + Note: In this version of the code, the attributes are + handled as special cases, not generic attributes, simply + because there can only be at most 3 and they are always the same. +*/ +class TiXmlDeclaration : public TiXmlNode +{ +public: + /// Construct an empty declaration. + TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) {} + +#ifdef TIXML_USE_STL + /// Constructor. + TiXmlDeclaration( const std::string& _version, + const std::string& _encoding, + const std::string& _standalone ); +#endif + + /// Construct. + TiXmlDeclaration( const char* _version, + const char* _encoding, + const char* _standalone ); + + TiXmlDeclaration( const TiXmlDeclaration& copy ); + void operator=( const TiXmlDeclaration& copy ); + + virtual ~TiXmlDeclaration() {} + + /// Version. Will return an empty string if none was found. + const char *Version() const { return version.c_str (); } + /// Encoding. Will return an empty string if none was found. + const char *Encoding() const { return encoding.c_str (); } + /// Is this a standalone document? + const char *Standalone() const { return standalone.c_str (); } + + /// Creates a copy of this Declaration and returns it. + virtual TiXmlNode* Clone() const; + // Print this declaration to a FILE stream. + virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; + virtual void Print( FILE* cfile, int depth ) const { + Print( cfile, depth, 0 ); + } + + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlDeclaration* ToDeclaration() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* visitor ) const; + +protected: + void CopyTo( TiXmlDeclaration* target ) const; + // used to be public + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + + TIXML_STRING version; + TIXML_STRING encoding; + TIXML_STRING standalone; +}; + + +/** Any tag that tinyXml doesn't recognize is saved as an + unknown. It is a tag of text, but should not be modified. + It will be written back to the XML, unchanged, when the file + is saved. + + DTD tags get thrown into TiXmlUnknowns. +*/ +class TiXmlUnknown : public TiXmlNode +{ +public: + TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {} + virtual ~TiXmlUnknown() {} + + TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::UNKNOWN ) { copy.CopyTo( this ); } + void operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); } + + /// Creates a copy of this Unknown and returns it. + virtual TiXmlNode* Clone() const; + // Print this Unknown to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* content ) const; + +protected: + void CopyTo( TiXmlUnknown* target ) const; + + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + +}; + + +/** Always the top level node. A document binds together all the + XML pieces. It can be saved, loaded, and printed to the screen. + The 'value' of a document node is the xml file name. +*/ +class TiXmlDocument : public TiXmlNode +{ +public: + /// Create an empty document, that has no name. + TiXmlDocument(); + /// Create a document with a name. The name of the document is also the filename of the xml. + TiXmlDocument( const char * documentName ); + + #ifdef TIXML_USE_STL + /// Constructor. + TiXmlDocument( const std::string& documentName ); + #endif + + TiXmlDocument( const TiXmlDocument& copy ); + void operator=( const TiXmlDocument& copy ); + + virtual ~TiXmlDocument() {} + + /** Load a file using the current document value. + Returns true if successful. Will delete any existing + document data before loading. + */ + bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + /// Save a file using the current document value. Returns true if successful. + bool SaveFile() const; + /// Load a file using the given filename. Returns true if successful. + bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + /// Save a file using the given filename. Returns true if successful. + bool SaveFile( const char * filename ) const; + /** Load a file using the given FILE*. Returns true if successful. Note that this method + doesn't stream - the entire object pointed at by the FILE* + will be interpreted as an XML file. TinyXML doesn't stream in XML from the current + file location. Streaming may be added in the future. + */ + bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + /// Save a file using the given FILE*. Returns true if successful. + bool SaveFile( FILE* ) const; + + #ifdef TIXML_USE_STL + bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. + { +// StringToBuffer f( filename ); +// return ( f.buffer && LoadFile( f.buffer, encoding )); + return LoadFile( filename.c_str(), encoding ); + } + bool SaveFile( const std::string& filename ) const ///< STL std::string version. + { +// StringToBuffer f( filename ); +// return ( f.buffer && SaveFile( f.buffer )); + return SaveFile( filename.c_str() ); + } + #endif + + /** Parse the given null terminated block of xml data. Passing in an encoding to this + method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml + to use that encoding, regardless of what TinyXml might otherwise try to detect. + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + + /** Get the root element -- the only top level element -- of the document. + In well formed XML, there should only be one. TinyXml is tolerant of + multiple elements at the document level. + */ + const TiXmlElement* RootElement() const { return FirstChildElement(); } + TiXmlElement* RootElement() { return FirstChildElement(); } + + /** If an error occurs, Error will be set to true. Also, + - The ErrorId() will contain the integer identifier of the error (not generally useful) + - The ErrorDesc() method will return the name of the error. (very useful) + - The ErrorRow() and ErrorCol() will return the location of the error (if known) + */ + bool Error() const { return error; } + + /// Contains a textual (english) description of the error if one occurs. + const char * ErrorDesc() const { return errorDesc.c_str (); } + + /** Generally, you probably want the error string ( ErrorDesc() ). But if you + prefer the ErrorId, this function will fetch it. + */ + int ErrorId() const { return errorId; } + + /** Returns the location (if known) of the error. The first column is column 1, + and the first row is row 1. A value of 0 means the row and column wasn't applicable + (memory errors, for example, have no row/column) or the parser lost the error. (An + error in the error reporting, in that case.) + + \see SetTabSize, Row, Column + */ + int ErrorRow() const { return errorLocation.row+1; } + int ErrorCol() const { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() + + /** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) + to report the correct values for row and column. It does not change the output + or input in any way. + + By calling this method, with a tab size + greater than 0, the row and column of each node and attribute is stored + when the file is loaded. Very useful for tracking the DOM back in to + the source file. + + The tab size is required for calculating the location of nodes. If not + set, the default of 4 is used. The tabsize is set per document. Setting + the tabsize to 0 disables row/column tracking. + + Note that row and column tracking is not supported when using operator>>. + + The tab size needs to be enabled before the parse or load. Correct usage: + \verbatim + TiXmlDocument doc; + doc.SetTabSize( 8 ); + doc.Load( "myfile.xml" ); + \endverbatim + + \see Row, Column + */ + void SetTabSize( int _tabsize ) { tabsize = _tabsize; } + + int TabSize() const { return tabsize; } + + /** If you have handled the error, it can be reset with this call. The error + state is automatically cleared if you Parse a new XML block. + */ + void ClearError() { error = false; + errorId = 0; + errorDesc = ""; + errorLocation.row = errorLocation.col = 0; + //errorLocation.last = 0; + } + + /** Write the document to standard out using formatted printing ("pretty print"). */ + void Print() const { Print( stdout, 0 ); } + + /* Write the document to a string using formatted printing ("pretty print"). This + will allocate a character array (new char[]) and return it as a pointer. The + calling code pust call delete[] on the return char* to avoid a memory leak. + */ + //char* PrintToMemory() const; + + /// Print this Document to a FILE stream. + virtual void Print( FILE* cfile, int depth = 0 ) const; + // [internal use] + void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); + + virtual const TiXmlDocument* ToDocument() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlDocument* ToDocument() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* content ) const; + +protected : + // [internal use] + virtual TiXmlNode* Clone() const; + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + void CopyTo( TiXmlDocument* target ) const; + + bool error; + int errorId; + TIXML_STRING errorDesc; + int tabsize; + TiXmlCursor errorLocation; + bool useMicrosoftBOM; // the UTF-8 BOM were found when read. Note this, and try to write. +}; + + +/** + A TiXmlHandle is a class that wraps a node pointer with null checks; this is + an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml + DOM structure. It is a separate utility class. + + Take an example: + \verbatim + + + + + + + \endverbatim + + Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very + easy to write a *lot* of code that looks like: + + \verbatim + TiXmlElement* root = document.FirstChildElement( "Document" ); + if ( root ) + { + TiXmlElement* element = root->FirstChildElement( "Element" ); + if ( element ) + { + TiXmlElement* child = element->FirstChildElement( "Child" ); + if ( child ) + { + TiXmlElement* child2 = child->NextSiblingElement( "Child" ); + if ( child2 ) + { + // Finally do something useful. + \endverbatim + + And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity + of such code. A TiXmlHandle checks for null pointers so it is perfectly safe + and correct to use: + + \verbatim + TiXmlHandle docHandle( &document ); + TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); + if ( child2 ) + { + // do something useful + \endverbatim + + Which is MUCH more concise and useful. + + It is also safe to copy handles - internally they are nothing more than node pointers. + \verbatim + TiXmlHandle handleCopy = handle; + \endverbatim + + What they should not be used for is iteration: + + \verbatim + int i=0; + while ( true ) + { + TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement(); + if ( !child ) + break; + // do something + ++i; + } + \endverbatim + + It seems reasonable, but it is in fact two embedded while loops. The Child method is + a linear walk to find the element, so this code would iterate much more than it needs + to. Instead, prefer: + + \verbatim + TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement(); + + for( child; child; child=child->NextSiblingElement() ) + { + // do something + } + \endverbatim +*/ +class TiXmlHandle +{ +public: + /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. + TiXmlHandle( TiXmlNode* _node ) { this->node = _node; } + /// Copy constructor + TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } + TiXmlHandle operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; } + + /// Return a handle to the first child node. + TiXmlHandle FirstChild() const; + /// Return a handle to the first child node with the given name. + TiXmlHandle FirstChild( const char * value ) const; + /// Return a handle to the first child element. + TiXmlHandle FirstChildElement() const; + /// Return a handle to the first child element with the given name. + TiXmlHandle FirstChildElement( const char * value ) const; + + /** Return a handle to the "index" child with the given name. + The first child is 0, the second 1, etc. + */ + TiXmlHandle Child( const char* value, int index ) const; + /** Return a handle to the "index" child. + The first child is 0, the second 1, etc. + */ + TiXmlHandle Child( int index ) const; + /** Return a handle to the "index" child element with the given name. + The first child element is 0, the second 1, etc. Note that only TiXmlElements + are indexed: other types are not counted. + */ + TiXmlHandle ChildElement( const char* value, int index ) const; + /** Return a handle to the "index" child element. + The first child element is 0, the second 1, etc. Note that only TiXmlElements + are indexed: other types are not counted. + */ + TiXmlHandle ChildElement( int index ) const; + + #ifdef TIXML_USE_STL + TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } + TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } + + TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } + TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } + #endif + + /** Return the handle as a TiXmlNode. This may return null. + */ + TiXmlNode* ToNode() const { return node; } + /** Return the handle as a TiXmlElement. This may return null. + */ + TiXmlElement* ToElement() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } + /** Return the handle as a TiXmlText. This may return null. + */ + TiXmlText* ToText() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } + /** Return the handle as a TiXmlUnknown. This may return null. + */ + TiXmlUnknown* ToUnknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } + + /** \deprecated use ToNode. + Return the handle as a TiXmlNode. This may return null. + */ + TiXmlNode* Node() const { return ToNode(); } + /** \deprecated use ToElement. + Return the handle as a TiXmlElement. This may return null. + */ + TiXmlElement* Element() const { return ToElement(); } + /** \deprecated use ToText() + Return the handle as a TiXmlText. This may return null. + */ + TiXmlText* Text() const { return ToText(); } + /** \deprecated use ToUnknown() + Return the handle as a TiXmlUnknown. This may return null. + */ + TiXmlUnknown* Unknown() const { return ToUnknown(); } + +private: + TiXmlNode* node; +}; + + +/** Print to memory functionality. The TiXmlPrinter is useful when you need to: + + -# Print to memory (especially in non-STL mode) + -# Control formatting (line endings, etc.) + + When constructed, the TiXmlPrinter is in its default "pretty printing" mode. + Before calling Accept() you can call methods to control the printing + of the XML document. After TiXmlNode::Accept() is called, the printed document can + be accessed via the CStr(), Str(), and Size() methods. + + TiXmlPrinter uses the Visitor API. + \verbatim + TiXmlPrinter printer; + printer.SetIndent( "\t" ); + + doc.Accept( &printer ); + fprintf( stdout, "%s", printer.CStr() ); + \endverbatim +*/ +class TiXmlPrinter : public TiXmlVisitor +{ +public: + TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ), + buffer(), indent( " " ), lineBreak( "\n" ) {} + + virtual bool VisitEnter( const TiXmlDocument& doc ); + virtual bool VisitExit( const TiXmlDocument& doc ); + + virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ); + virtual bool VisitExit( const TiXmlElement& element ); + + virtual bool Visit( const TiXmlDeclaration& declaration ); + virtual bool Visit( const TiXmlText& text ); + virtual bool Visit( const TiXmlComment& comment ); + virtual bool Visit( const TiXmlUnknown& unknown ); + + /** Set the indent characters for printing. By default 4 spaces + but tab (\t) is also useful, or null/empty string for no indentation. + */ + void SetIndent( const char* _indent ) { indent = _indent ? _indent : "" ; } + /// Query the indention string. + const char* Indent() { return indent.c_str(); } + /** Set the line breaking string. By default set to newline (\n). + Some operating systems prefer other characters, or can be + set to the null/empty string for no indenation. + */ + void SetLineBreak( const char* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : ""; } + /// Query the current line breaking string. + const char* LineBreak() { return lineBreak.c_str(); } + + /** Switch over to "stream printing" which is the most dense formatting without + linebreaks. Common when the XML is needed for network transmission. + */ + void SetStreamPrinting() { indent = ""; + lineBreak = ""; + } + /// Return the result. + const char* CStr() { return buffer.c_str(); } + /// Return the length of the result string. + size_t Size() { return buffer.size(); } + + #ifdef TIXML_USE_STL + /// Return the result. + const std::string& Str() { return buffer; } + #endif + +private: + void DoIndent() { + for( int i=0; i +#include +#include + +#include "tinyxml.h" + +//#define DEBUG_PARSER +#if defined( DEBUG_PARSER ) +# if defined( DEBUG ) && defined( _WIN32 ) +# include +# define TIXML_LOG OutputDebugString +# else +# define TIXML_LOG printf +# endif +#endif + +// Note tha "PutString" hardcodes the same list. This +// is less flexible than it appears. Changing the entries +// or order will break putstring. +TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = +{ + { "&", 5, '&' }, + { "<", 4, '<' }, + { ">", 4, '>' }, + { """, 6, '\"' }, + { "'", 6, '\'' } +}; + +// Bunch of unicode info at: +// http://www.unicode.org/faq/utf_bom.html +// Including the basic of this table, which determines the #bytes in the +// sequence from the lead byte. 1 placed for invalid sequences -- +// although the result will be junk, pass it through as much as possible. +// Beware of the non-characters in UTF-8: +// ef bb bf (Microsoft "lead bytes") +// ef bf be +// ef bf bf + +const unsigned char TIXML_UTF_LEAD_0 = 0xefU; +const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; +const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; + +const int TiXmlBase::utf8ByteTable[256] = +{ + // 0 1 2 3 4 5 6 7 8 9 a b c d e f + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x20 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x30 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x50 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte + 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid +}; + + +void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) +{ + const unsigned long BYTE_MASK = 0xBF; + const unsigned long BYTE_MARK = 0x80; + const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + + if (input < 0x80) + *length = 1; + else if ( input < 0x800 ) + *length = 2; + else if ( input < 0x10000 ) + *length = 3; + else if ( input < 0x200000 ) + *length = 4; + else + { *length = 0; return; } // This code won't covert this correctly anyway. + + output += *length; + + // Scary scary fall throughs. + switch (*length) + { + case 4: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 3: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 2: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 1: + --output; + *output = (char)(input | FIRST_BYTE_MARK[*length]); + } +} + + +/*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) +{ + // This will only work for low-ascii, everything else is assumed to be a valid + // letter. I'm not sure this is the best approach, but it is quite tricky trying + // to figure out alhabetical vs. not across encoding. So take a very + // conservative approach. + +// if ( encoding == TIXML_ENCODING_UTF8 ) +// { + if ( anyByte < 127 ) + return isalpha( anyByte ); + else + return 1; // What else to do? The unicode set is huge...get the english ones right. +// } +// else +// { +// return isalpha( anyByte ); +// } +} + + +/*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) +{ + // This will only work for low-ascii, everything else is assumed to be a valid + // letter. I'm not sure this is the best approach, but it is quite tricky trying + // to figure out alhabetical vs. not across encoding. So take a very + // conservative approach. + +// if ( encoding == TIXML_ENCODING_UTF8 ) +// { + if ( anyByte < 127 ) + return isalnum( anyByte ); + else + return 1; // What else to do? The unicode set is huge...get the english ones right. +// } +// else +// { +// return isalnum( anyByte ); +// } +} + + +class TiXmlParsingData +{ + friend class TiXmlDocument; + public: + void Stamp( const char* now, TiXmlEncoding encoding ); + + const TiXmlCursor& Cursor() { return cursor; } + + private: + // Only used by the document! + TiXmlParsingData( const char* start, int _tabsize, int row, int col ) + { + assert( start ); + stamp = start; + tabsize = _tabsize; + cursor.row = row; + cursor.col = col; + } + + TiXmlCursor cursor; + const char* stamp; + int tabsize; +}; + + +void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding ) +{ + assert( now ); + + // Do nothing if the tabsize is 0. + if ( tabsize < 1 ) + { + return; + } + + // Get the current row, column. + int row = cursor.row; + int col = cursor.col; + const char* p = stamp; + assert( p ); + + while ( p < now ) + { + // Treat p as unsigned, so we have a happy compiler. + const unsigned char* pU = (const unsigned char*)p; + + // Code contributed by Fletcher Dunn: (modified by lee) + switch (*pU) { + case 0: + // We *should* never get here, but in case we do, don't + // advance past the terminating null character, ever + return; + + case '\r': + // bump down to the next line + ++row; + col = 0; + // Eat the character + ++p; + + // Check for \r\n sequence, and treat this as a single character + if (*p == '\n') { + ++p; + } + break; + + case '\n': + // bump down to the next line + ++row; + col = 0; + + // Eat the character + ++p; + + // Check for \n\r sequence, and treat this as a single + // character. (Yes, this bizarre thing does occur still + // on some arcane platforms...) + if (*p == '\r') { + ++p; + } + break; + + case '\t': + // Eat the character + ++p; + + // Skip to next tab stop + col = (col / tabsize + 1) * tabsize; + break; + + case TIXML_UTF_LEAD_0: + if ( encoding == TIXML_ENCODING_UTF8 ) + { + if ( *(p+1) && *(p+2) ) + { + // In these cases, don't advance the column. These are + // 0-width spaces. + if ( *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) + p += 3; + else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU ) + p += 3; + else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU ) + p += 3; + else + { p +=3; ++col; } // A normal character. + } + } + else + { + ++p; + ++col; + } + break; + + default: + if ( encoding == TIXML_ENCODING_UTF8 ) + { + // Eat the 1 to 4 byte utf8 character. + int step = TiXmlBase::utf8ByteTable[*((const unsigned char*)p)]; + if ( step == 0 ) + step = 1; // Error case from bad encoding, but handle gracefully. + p += step; + + // Just advance one column, of course. + ++col; + } + else + { + ++p; + ++col; + } + break; + } + } + cursor.row = row; + cursor.col = col; + assert( cursor.row >= -1 ); + assert( cursor.col >= -1 ); + stamp = p; + assert( stamp ); +} + + +const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding ) +{ + if ( !p || !*p ) + { + return 0; + } + if ( encoding == TIXML_ENCODING_UTF8 ) + { + while ( *p ) + { + const unsigned char* pU = (const unsigned char*)p; + + // Skip the stupid Microsoft UTF-8 Byte order marks + if ( *(pU+0)==TIXML_UTF_LEAD_0 + && *(pU+1)==TIXML_UTF_LEAD_1 + && *(pU+2)==TIXML_UTF_LEAD_2 ) + { + p += 3; + continue; + } + else if(*(pU+0)==TIXML_UTF_LEAD_0 + && *(pU+1)==0xbfU + && *(pU+2)==0xbeU ) + { + p += 3; + continue; + } + else if(*(pU+0)==TIXML_UTF_LEAD_0 + && *(pU+1)==0xbfU + && *(pU+2)==0xbfU ) + { + p += 3; + continue; + } + + if ( IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) // Still using old rules for white space. + ++p; + else + break; + } + } + else + { + while ( (*p) && ( IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) ) + ++p; + } + + return p; +} + +#ifdef TIXML_USE_STL +/*static*/ bool TiXmlBase::StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ) +{ + for( ;; ) + { + if ( !in->good() ) return false; + + int c = in->peek(); + // At this scope, we can't get to a document. So fail silently. + if ( !IsWhiteSpace( c ) || c <= 0 ) + return true; + + *tag += (char) in->get(); + } +} + +/*static*/ bool TiXmlBase::StreamTo( std::istream * in, int character, TIXML_STRING * tag ) +{ + //assert( character > 0 && character < 128 ); // else it won't work in utf-8 + while ( in->good() ) + { + int c = in->peek(); + if ( c == character ) + return true; + if ( c <= 0 ) // Silent failure: can't get document at this scope + return false; + + in->get(); + *tag += (char) c; + } + return false; +} +#endif + +// One of TinyXML's more performance demanding functions. Try to keep the memory overhead down. The +// "assign" optimization removes over 10% of the execution time. +// +const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding ) +{ + // Oddly, not supported on some comilers, + //name->clear(); + // So use this: + *name = ""; + assert( p ); + + // Names start with letters or underscores. + // Of course, in unicode, tinyxml has no idea what a letter *is*. The + // algorithm is generous. + // + // After that, they can be letters, underscores, numbers, + // hyphens, or colons. (Colons are valid ony for namespaces, + // but tinyxml can't tell namespaces from names.) + if ( p && *p + && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) + { + const char* start = p; + while( p && *p + && ( IsAlphaNum( (unsigned char ) *p, encoding ) + || *p == '_' + || *p == '-' + || *p == '.' + || *p == ':' ) ) + { + //(*name) += *p; // expensive + ++p; + } + if ( p-start > 0 ) { + name->assign( start, p-start ); + } + return p; + } + return 0; +} + +const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding ) +{ + // Presume an entity, and pull it out. + TIXML_STRING ent; + int i; + *length = 0; + + if ( *(p+1) && *(p+1) == '#' && *(p+2) ) + { + unsigned long ucs = 0; + ptrdiff_t delta = 0; + unsigned mult = 1; + + if ( *(p+2) == 'x' ) + { + // Hexadecimal. + if ( !*(p+3) ) return 0; + + const char* q = p+3; + q = strchr( q, ';' ); + + if ( !q || !*q ) return 0; + + delta = q-p; + --q; + + while ( *q != 'x' ) + { + if ( *q >= '0' && *q <= '9' ) + ucs += mult * (*q - '0'); + else if ( *q >= 'a' && *q <= 'f' ) + ucs += mult * (*q - 'a' + 10); + else if ( *q >= 'A' && *q <= 'F' ) + ucs += mult * (*q - 'A' + 10 ); + else + return 0; + mult *= 16; + --q; + } + } + else + { + // Decimal. + if ( !*(p+2) ) return 0; + + const char* q = p+2; + q = strchr( q, ';' ); + + if ( !q || !*q ) return 0; + + delta = q-p; + --q; + + while ( *q != '#' ) + { + if ( *q >= '0' && *q <= '9' ) + ucs += mult * (*q - '0'); + else + return 0; + mult *= 10; + --q; + } + } + if ( encoding == TIXML_ENCODING_UTF8 ) + { + // convert the UCS to UTF-8 + ConvertUTF32ToUTF8( ucs, value, length ); + } + else + { + *value = (char)ucs; + *length = 1; + } + return p + delta + 1; + } + + // Now try to match it. + for( i=0; iappend( cArr, len ); + } + } + else + { + bool whitespace = false; + + // Remove leading white space: + p = SkipWhiteSpace( p, encoding ); + while ( p && *p + && !StringEqual( p, endTag, caseInsensitive, encoding ) ) + { + if ( *p == '\r' || *p == '\n' ) + { + whitespace = true; + ++p; + } + else if ( IsWhiteSpace( *p ) ) + { + whitespace = true; + ++p; + } + else + { + // If we've found whitespace, add it before the + // new character. Any whitespace just becomes a space. + if ( whitespace ) + { + (*text) += ' '; + whitespace = false; + } + int len; + char cArr[4] = { 0, 0, 0, 0 }; + p = GetChar( p, cArr, &len, encoding ); + if ( len == 1 ) + (*text) += cArr[0]; // more efficient + else + text->append( cArr, len ); + } + } + } + if ( p ) + p += strlen( endTag ); + return p; +} + +#ifdef TIXML_USE_STL + +void TiXmlDocument::StreamIn( std::istream * in, TIXML_STRING * tag ) +{ + // The basic issue with a document is that we don't know what we're + // streaming. Read something presumed to be a tag (and hope), then + // identify it, and call the appropriate stream method on the tag. + // + // This "pre-streaming" will never read the closing ">" so the + // sub-tag can orient itself. + + if ( !StreamTo( in, '<', tag ) ) + { + SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + + while ( in->good() ) + { + int tagIndex = (int) tag->length(); + while ( in->good() && in->peek() != '>' ) + { + int c = in->get(); + if ( c <= 0 ) + { + SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + break; + } + (*tag) += (char) c; + } + + if ( in->good() ) + { + // We now have something we presume to be a node of + // some sort. Identify it, and call the node to + // continue streaming. + TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING ); + + if ( node ) + { + node->StreamIn( in, tag ); + bool isElement = node->ToElement() != 0; + delete node; + node = 0; + + // If this is the root element, we're done. Parsing will be + // done by the >> operator. + if ( isElement ) + { + return; + } + } + else + { + SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + } + } + // We should have returned sooner. + SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); +} + +#endif + +const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding ) +{ + ClearError(); + + // Parse away, at the document level. Since a document + // contains nothing but other tags, most of what happens + // here is skipping white space. + if ( !p || !*p ) + { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + // Note that, for a document, this needs to come + // before the while space skip, so that parsing + // starts from the pointer we are given. + location.Clear(); + if ( prevData ) + { + location.row = prevData->cursor.row; + location.col = prevData->cursor.col; + } + else + { + location.row = 0; + location.col = 0; + } + TiXmlParsingData data( p, TabSize(), location.row, location.col ); + location = data.Cursor(); + + if ( encoding == TIXML_ENCODING_UNKNOWN ) + { + // Check for the Microsoft UTF-8 lead bytes. + const unsigned char* pU = (const unsigned char*)p; + if ( *(pU+0) && *(pU+0) == TIXML_UTF_LEAD_0 + && *(pU+1) && *(pU+1) == TIXML_UTF_LEAD_1 + && *(pU+2) && *(pU+2) == TIXML_UTF_LEAD_2 ) + { + encoding = TIXML_ENCODING_UTF8; + useMicrosoftBOM = true; + } + } + + p = SkipWhiteSpace( p, encoding ); + if ( !p ) + { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + while ( p && *p ) + { + TiXmlNode* node = Identify( p, encoding ); + if ( node ) + { + p = node->Parse( p, &data, encoding ); + LinkEndChild( node ); + } + else + { + break; + } + + // Did we get encoding info? + if ( encoding == TIXML_ENCODING_UNKNOWN + && node->ToDeclaration() ) + { + TiXmlDeclaration* dec = node->ToDeclaration(); + const char* enc = dec->Encoding(); + assert( enc ); + + if ( *enc == 0 ) + encoding = TIXML_ENCODING_UTF8; + else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) ) + encoding = TIXML_ENCODING_UTF8; + else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) ) + encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice + else + encoding = TIXML_ENCODING_LEGACY; + } + + p = SkipWhiteSpace( p, encoding ); + } + + // Was this empty? + if ( !firstChild ) { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, encoding ); + return 0; + } + + // All is well. + return p; +} + +void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding ) +{ + // The first error in a chain is more accurate - don't set again! + if ( error ) + return; + + assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); + error = true; + errorId = err; + errorDesc = errorString[ errorId ]; + + errorLocation.Clear(); + if ( pError && data ) + { + data->Stamp( pError, encoding ); + errorLocation = data->Cursor(); + } +} + + +TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding ) +{ + TiXmlNode* returnNode = 0; + + p = SkipWhiteSpace( p, encoding ); + if( !p || !*p || *p != '<' ) + { + return 0; + } + + TiXmlDocument* doc = GetDocument(); + p = SkipWhiteSpace( p, encoding ); + + if ( !p || !*p ) + { + return 0; + } + + // What is this thing? + // - Elements start with a letter or underscore, but xml is reserved. + // - Comments: "; + + if ( !StringEqual( p, startTag, false, encoding ) ) + { + document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); + return 0; + } + p += strlen( startTag ); + + // [ 1475201 ] TinyXML parses entities in comments + // Oops - ReadText doesn't work, because we don't want to parse the entities. + // p = ReadText( p, &value, false, endTag, false, encoding ); + // + // from the XML spec: + /* + [Definition: Comments may appear anywhere in a document outside other markup; in addition, + they may appear within the document type declaration at places allowed by the grammar. + They are not part of the document's character data; an XML processor MAY, but need not, + make it possible for an application to retrieve the text of comments. For compatibility, + the string "--" (double-hyphen) MUST NOT occur within comments.] Parameter entity + references MUST NOT be recognized within comments. + + An example of a comment: + + + */ + + value = ""; + // Keep all the white space. + while ( p && *p && !StringEqual( p, endTag, false, encoding ) ) + { + value.append( p, 1 ); + ++p; + } + if ( p ) + p += strlen( endTag ); + + return p; +} + + +const char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) +{ + p = SkipWhiteSpace( p, encoding ); + if ( !p || !*p ) return 0; + +// int tabsize = 4; +// if ( document ) +// tabsize = document->TabSize(); + + if ( data ) + { + data->Stamp( p, encoding ); + location = data->Cursor(); + } + // Read the name, the '=' and the value. + const char* pErr = p; + p = ReadName( p, &name, encoding ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); + return 0; + } + p = SkipWhiteSpace( p, encoding ); + if ( !p || !*p || *p != '=' ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); + return 0; + } + + ++p; // skip '=' + p = SkipWhiteSpace( p, encoding ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); + return 0; + } + + const char* end; + const char SINGLE_QUOTE = '\''; + const char DOUBLE_QUOTE = '\"'; + + if ( *p == SINGLE_QUOTE ) + { + ++p; + end = "\'"; // single quote in string + p = ReadText( p, &value, false, end, false, encoding ); + } + else if ( *p == DOUBLE_QUOTE ) + { + ++p; + end = "\""; // double quote in string + p = ReadText( p, &value, false, end, false, encoding ); + } + else + { + // All attribute values should be in single or double quotes. + // But this is such a common error that the parser will try + // its best, even without them. + value = ""; + while ( p && *p // existence + && !IsWhiteSpace( *p ) && *p != '\n' && *p != '\r' // whitespace + && *p != '/' && *p != '>' ) // tag end + { + if ( *p == SINGLE_QUOTE || *p == DOUBLE_QUOTE ) { + // [ 1451649 ] Attribute values with trailing quotes not handled correctly + // We did not have an opening quote but seem to have a + // closing one. Give up and throw an error. + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); + return 0; + } + value += *p; + ++p; + } + } + return p; +} + +#ifdef TIXML_USE_STL +void TiXmlText::StreamIn( std::istream * in, TIXML_STRING * tag ) +{ + while ( in->good() ) + { + int c = in->peek(); + if ( !cdata && (c == '<' ) ) + { + return; + } + if ( c <= 0 ) + { + TiXmlDocument* document = GetDocument(); + if ( document ) + document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + + (*tag) += (char) c; + in->get(); // "commits" the peek made above + + if ( cdata && c == '>' && tag->size() >= 3 ) { + size_t len = tag->size(); + if ( (*tag)[len-2] == ']' && (*tag)[len-3] == ']' ) { + // terminator of cdata. + return; + } + } + } +} +#endif + +const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) +{ + value = ""; + TiXmlDocument* document = GetDocument(); + + if ( data ) + { + data->Stamp( p, encoding ); + location = data->Cursor(); + } + + const char* const startTag = ""; + + if ( cdata || StringEqual( p, startTag, false, encoding ) ) + { + cdata = true; + + if ( !StringEqual( p, startTag, false, encoding ) ) + { + document->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding ); + return 0; + } + p += strlen( startTag ); + + // Keep all the white space, ignore the encoding, etc. + while ( p && *p + && !StringEqual( p, endTag, false, encoding ) + ) + { + value += *p; + ++p; + } + + TIXML_STRING dummy; + p = ReadText( p, &dummy, false, endTag, false, encoding ); + return p; + } + else + { + bool ignoreWhite = true; + + const char* end = "<"; + p = ReadText( p, &value, ignoreWhite, end, false, encoding ); + if ( p ) + return p-1; // don't truncate the '<' + return 0; + } +} + +#ifdef TIXML_USE_STL +void TiXmlDeclaration::StreamIn( std::istream * in, TIXML_STRING * tag ) +{ + while ( in->good() ) + { + int c = in->get(); + if ( c <= 0 ) + { + TiXmlDocument* document = GetDocument(); + if ( document ) + document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + (*tag) += (char) c; + + if ( c == '>' ) + { + // All is well. + return; + } + } +} +#endif + +const char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding ) +{ + p = SkipWhiteSpace( p, _encoding ); + // Find the beginning, find the end, and look for + // the stuff in-between. + TiXmlDocument* document = GetDocument(); + if ( !p || !*p || !StringEqual( p, "SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding ); + return 0; + } + if ( data ) + { + data->Stamp( p, _encoding ); + location = data->Cursor(); + } + p += 5; + + version = ""; + encoding = ""; + standalone = ""; + + while ( p && *p ) + { + if ( *p == '>' ) + { + ++p; + return p; + } + + p = SkipWhiteSpace( p, _encoding ); + if ( StringEqual( p, "version", true, _encoding ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data, _encoding ); + version = attrib.Value(); + } + else if ( StringEqual( p, "encoding", true, _encoding ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data, _encoding ); + encoding = attrib.Value(); + } + else if ( StringEqual( p, "standalone", true, _encoding ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data, _encoding ); + standalone = attrib.Value(); + } + else + { + // Read over whatever it is. + while( p && *p && *p != '>' && !IsWhiteSpace( *p ) ) + ++p; + } + } + return 0; +} + +bool TiXmlText::Blank() const +{ + for ( unsigned i=0; i +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "../tinyxml.h" +#include "../Manager.h" +#include "../Driver.h" +#include "../Node.h" +#include "../Notification.h" +#include "../Msg.h" +#include "Value.h" +#include "../platform/Log.h" +#include "../command_classes/CommandClass.h" +#include +#include "../Options.h" + +using namespace OpenZWave; + +static char const* c_genreName[] = +{ + "basic", + "user", + "config", + "system", + "invalid" +}; + +static char const* c_typeName[] = +{ + "bool", + "byte", + "decimal", + "int", + "list", + "schedule", + "short", + "string", + "button", + "raw" +}; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +Value::Value +( + uint32 const _homeId, + uint8 const _nodeId, + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _index, + ValueID::ValueType const _type, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + bool const _isSet, + uint8 const _pollIntensity +): + m_min( 0 ), + m_max( 0 ), + m_refreshTime(0), + m_verifyChanges( false ), + m_id( _homeId, _nodeId, _genre, _commandClassId, _instance, _index, _type ), + m_label( _label ), + m_units( _units ), + m_help( "" ), + m_readOnly( _readOnly ), + m_writeOnly( _writeOnly ), + m_isSet( _isSet ), + m_affectsLength( 0 ), + m_affects(), + m_affectsAll( false ), + m_checkChange( false ), + m_pollIntensity( _pollIntensity ) +{ +} + +//----------------------------------------------------------------------------- +// +// Constructor (from XML) +//----------------------------------------------------------------------------- +Value::Value +( +): + m_min( 0 ), + m_max( 0 ), + m_refreshTime(0), + m_verifyChanges( false ), + m_readOnly( false ), + m_writeOnly( false ), + m_isSet( false ), + m_affectsLength( 0 ), + m_affects(), + m_affectsAll( false ), + m_checkChange( false ), + m_pollIntensity( 0 ) +{ +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +Value::~Value +( +) +{ + if( m_affectsLength > 0 ) + { + delete [] m_affects; + } +} + +//----------------------------------------------------------------------------- +// +// Apply settings from XML +//----------------------------------------------------------------------------- +void Value::ReadXML +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _commandClassId, + TiXmlElement const* _valueElement +) +{ + int intVal; + + ValueID::ValueGenre genre = Value::GetGenreEnumFromName( _valueElement->Attribute( "genre" ) ); + ValueID::ValueType type = Value::GetTypeEnumFromName( _valueElement->Attribute( "type" ) ); + + uint8 instance = 1; + if( TIXML_SUCCESS == _valueElement->QueryIntAttribute( "instance", &intVal ) ) + { + instance = (uint8)intVal; + } + + uint8 index = 0; + if( TIXML_SUCCESS == _valueElement->QueryIntAttribute( "index", &intVal ) ) + { + index = (uint8)intVal; + } + + m_id = ValueID( _homeId, _nodeId, genre, _commandClassId, instance, index, type ); + + char const* label = _valueElement->Attribute( "label" ); + if( label ) + { + m_label = label; + } + + char const* units = _valueElement->Attribute( "units" ); + if( units ) + { + m_units = units; + } + + char const* readOnly = _valueElement->Attribute( "read_only" ); + if( readOnly ) + { + m_readOnly = !strcmp( readOnly, "true" ); + } + + char const* writeOnly = _valueElement->Attribute( "write_only" ); + if( writeOnly ) + { + m_writeOnly = !strcmp( writeOnly, "true" ); + } + + if( TIXML_SUCCESS == _valueElement->QueryIntAttribute( "poll_intensity", &intVal ) ) + { + m_pollIntensity = (uint8)intVal; + } + + char const* affects = _valueElement->Attribute( "affects" ); + if( affects ) + { + if ( m_affectsLength != 0 ) + { + delete [] m_affects; + } + m_affectsLength = 0; + if( !strcmp( affects, "all" ) ) + { + m_affectsAll = true; + } + else + { + size_t len = strlen( affects ); + if( len > 0 ) + { + for( size_t i = 0; i < len; i++ ) + { + if( affects[i] == ',' ) + { + m_affectsLength++; + } + else if(affects[i] < '0' || affects[i] > '9') + { + Log::Write( LogLevel_Info, "Improperly formatted affects data: \"%s\"", affects); + break; + } + } + m_affectsLength++; + m_affects = new uint8[m_affectsLength]; + unsigned int j = 0; + for( int i = 0; i < m_affectsLength; i++ ) + { + m_affects[i] = atoi( &affects[j] ); + while( j < len && affects[j] != ',' ) + { + j++; + } + j++; + } + } + } + } + + char const* verifyChanges = _valueElement->Attribute( "verify_changes" ); + if( verifyChanges ) + { + m_verifyChanges = !strcmp( verifyChanges, "true" ); + } + + if( TIXML_SUCCESS == _valueElement->QueryIntAttribute( "min", &intVal ) ) + { + m_min = intVal; + } + + if( TIXML_SUCCESS == _valueElement->QueryIntAttribute( "max", &intVal ) ) + { + m_max = intVal; + } + + TiXmlElement const* helpElement = _valueElement->FirstChildElement(); + while( helpElement ) + { + char const* str = helpElement->Value(); + if( str && !strcmp( str, "Help" ) ) + { + str = helpElement->GetText(); + if( str ) + { + m_help = str; + } + break; + } + + helpElement = helpElement->NextSiblingElement(); + } +} + +//----------------------------------------------------------------------------- +// +// Write ourselves to an XML document +//----------------------------------------------------------------------------- +void Value::WriteXML +( + TiXmlElement* _valueElement +) +{ + char str[16]; + + _valueElement->SetAttribute( "type", GetTypeNameFromEnum(m_id.GetType()) ); + _valueElement->SetAttribute( "genre", GetGenreNameFromEnum(m_id.GetGenre()) ); + + snprintf( str, sizeof(str), "%d", m_id.GetInstance() ); + _valueElement->SetAttribute( "instance", str ); + + snprintf( str, sizeof(str), "%d", m_id.GetIndex() ); + _valueElement->SetAttribute( "index", str ); + + _valueElement->SetAttribute( "label", m_label.c_str() ); + _valueElement->SetAttribute( "units", m_units.c_str() ); + _valueElement->SetAttribute( "read_only", m_readOnly ? "true" : "false" ); + _valueElement->SetAttribute( "write_only", m_writeOnly ? "true" : "false" ); + _valueElement->SetAttribute( "verify_changes", m_verifyChanges ? "true" : "false" ); + + snprintf( str, sizeof(str), "%d", m_pollIntensity ); + _valueElement->SetAttribute( "poll_intensity", str ); + + snprintf( str, sizeof(str), "%d", m_min ); + _valueElement->SetAttribute( "min", str ); + + snprintf( str, sizeof(str), "%d", m_max ); + _valueElement->SetAttribute( "max", str ); + + if( m_affectsAll ) + { + _valueElement->SetAttribute( "affects", "all" ); + } + else if( m_affectsLength > 0 ) + { + string s; + for( int i = 0; i < m_affectsLength; i++ ) + { + snprintf( str, sizeof(str), "%d", m_affects[i] ); + s = s + str; + if( i + 1 < m_affectsLength ) + { + s = s + ","; + } + + } + _valueElement->SetAttribute( "affects", s.c_str() ); + } + + if( m_help.length() > 0 ) + { + TiXmlElement* helpElement = new TiXmlElement( "Help" ); + _valueElement->LinkEndChild( helpElement ); + + TiXmlText* textElement = new TiXmlText( m_help.c_str() ); + helpElement->LinkEndChild( textElement ); + } +} + +//----------------------------------------------------------------------------- +// +// Set a new value in the device +//----------------------------------------------------------------------------- +bool Value::Set +( +) +{ + // nothing to do if this is a read-only value (return false to indicate an error) + if( IsReadOnly() ) + { + return false; + } + + // retrieve the driver, node and commandclass object for this value + bool res = false; + Node* node = NULL; + if( Driver* driver = Manager::Get()->GetDriver( m_id.GetHomeId() ) ) + { + node = driver->GetNodeUnsafe( m_id.GetNodeId() ); + if( node != NULL ) + { + if( CommandClass* cc = node->GetCommandClass( m_id.GetCommandClassId() ) ) + { + // flag value as set and queue a "Set Value" message for transmission to the device + res = cc->SetValue( *this ); + + if( res ) + { + if( !IsWriteOnly() ) + { + // queue a "RequestValue" message to update the value + cc->RequestValue( 0, m_id.GetIndex(), m_id.GetInstance(), Driver::MsgQueue_Send ); + } + else + { + // There is a "bug" here in that write only values + // never send a notification about the value changing. + // For sleeping devices it may not change until the + // device wakes up at some point in the future. + // So when is the right time to change it? + if( m_affectsAll ) + { + node->RequestAllConfigParams( 0 ); + } + else if( m_affectsLength > 0 ) + { + for( int i = 0; i < m_affectsLength; i++ ) + { + node->RequestConfigParam( m_affects[i] ); + } + } + } + } + } + } + } + + return res; +} + +//----------------------------------------------------------------------------- +// +// A value in a device has been refreshed +//----------------------------------------------------------------------------- +void Value::OnValueRefreshed +( +) +{ + if( IsWriteOnly() ) + { + return; + } + + if( Driver* driver = Manager::Get()->GetDriver( m_id.GetHomeId() ) ) + { + m_isSet = true; + + bool bSuppress; + Options::Get()->GetOptionAsBool( "SuppressValueRefresh", &bSuppress ); + if( !bSuppress ) + { + // Notify the watchers + Notification* notification = new Notification( Notification::Type_ValueRefreshed ); + notification->SetValueId( m_id ); + driver->QueueNotification( notification ); + } + } +} + + +//----------------------------------------------------------------------------- +// +// A value in a device has changed +//----------------------------------------------------------------------------- +void Value::OnValueChanged +( +) +{ + if( IsWriteOnly() ) + { + return; + } + + if( Driver* driver = Manager::Get()->GetDriver( m_id.GetHomeId() ) ) + { + m_isSet = true; + + // Notify the watchers + Notification* notification = new Notification( Notification::Type_ValueChanged ); + notification->SetValueId( m_id ); + driver->QueueNotification( notification ); + } + /* Call Back to the Command Class that this Value has changed, so we can search the + * TriggerRefreshValue vector to see if we should request any other values to be + * refreshed. + */ + Node* node = NULL; + if( Driver* driver = Manager::Get()->GetDriver( m_id.GetHomeId() ) ) + { + node = driver->GetNodeUnsafe( m_id.GetNodeId() ); + if( node != NULL ) + { + if( CommandClass* cc = node->GetCommandClass( m_id.GetCommandClassId() ) ) + { + cc->CheckForRefreshValues(this); + } + } + } + +} + +//----------------------------------------------------------------------------- +// +// Static helper to get a genre enum from a string +//----------------------------------------------------------------------------- +ValueID::ValueGenre Value::GetGenreEnumFromName +( + char const* _name +) +{ + ValueID::ValueGenre genre = ValueID::ValueGenre_System; + if( _name ) + { + for( int i=0; i<(int)ValueID::ValueGenre_Count; ++i ) + { + if( !strcmp( _name, c_genreName[i] ) ) + { + genre = (ValueID::ValueGenre)i; + break; + } + } + } + + return genre; +} + +//----------------------------------------------------------------------------- +// +// Static helper to get a genre enum as a string +//----------------------------------------------------------------------------- +char const* Value::GetGenreNameFromEnum +( + ValueID::ValueGenre _genre +) +{ + return c_genreName[_genre]; +} + +//----------------------------------------------------------------------------- +// +// Static helper to get a type enum from a string +//----------------------------------------------------------------------------- +ValueID::ValueType Value::GetTypeEnumFromName +( + char const* _name +) +{ + ValueID::ValueType type = ValueID::ValueType_Bool; + if( _name ) + { + for( int i=0; i<=(int)ValueID::ValueType_Max; ++i ) + { + if( !strcmp( _name, c_typeName[i] ) ) + { + type = (ValueID::ValueType)i; + break; + } + } + } + + return type; +} + +//----------------------------------------------------------------------------- +// +// Static helper to get a type enum as a string +//----------------------------------------------------------------------------- +char const* Value::GetTypeNameFromEnum +( + ValueID::ValueType _type +) +{ + return c_typeName[_type]; +} + +//----------------------------------------------------------------------------- +// +// Check a refreshed value +//----------------------------------------------------------------------------- +int Value::VerifyRefreshedValue +( + void* _originalValue, + void* _checkValue, + void* _newValue, + int _type, + int _length // = 0 +) +{ + // TODO: this is pretty rough code, but it's reused by each value type. It would be + // better if the actions were taken (m_value = _value, etc.) in this code rather than + // in the calling routine as a result of the return value. In particular, it's messy + // to be setting these values after the refesh or notification is sent. With some + // focus on the actual variable storage, we should be able to accomplish this with + // memory functions. It's really the strings that make things complicated(?). + // if this is the first read of a value, assume it is valid (and notify as a change) + if( !IsSet() ) + { + Log::Write( LogLevel_Detail, m_id.GetNodeId(), "Initial read of value" ); + Value::OnValueChanged(); + return 2; // confirmed change of value + } + else + { + switch( _type ) + { + case 1: // string + { + Log::Write( LogLevel_Detail, m_id.GetNodeId(), "Refreshed Value: old value=%s, new value=%s, type=%s", ((string*)_originalValue)->c_str(), ((string*)_newValue)->c_str(), "string" ); + break; + } + case 2: // short + { + Log::Write( LogLevel_Detail, m_id.GetNodeId(), "Refreshed Value: old value=%d, new value=%d, type=%s", *((short*)_originalValue), *((short*)_newValue), "short"); + break; + } + case 3: // int32 + { + Log::Write( LogLevel_Detail, m_id.GetNodeId(), "Refreshed Value: old value=%d, new value=%d, type=%s", *((int32*)_originalValue), *((int32*)_newValue), "int32" ); + break; + } + case 4: // uint8 + { + Log::Write( LogLevel_Detail, m_id.GetNodeId(), "Refreshed Value: old value=%d, new value=%d, type=%s", *((uint8*)_originalValue), *((uint8*)_newValue), "uint8" ); + break; + } + case 5: // bool + { + Log::Write( LogLevel_Detail, m_id.GetNodeId(), "Refreshed Value: old value=%s, new value=%s, type=%s", *((bool*)_originalValue)?"true":"false", *((uint8*)_newValue)?"true":"false", "bool" ); + break; + } + case 6: // raw + { + Log::Write( LogLevel_Detail, m_id.GetNodeId(), "Refreshed Value: old value=%x, new value=%x, type=raw", _originalValue, _newValue ); + break; + } + default: + { + break; + } + } + } + m_refreshTime = time( NULL ); // update value refresh time + + // check whether changes in this value should be verified (since some devices will report values that always + // change, where confirming changes is difficult or impossible) + Log::Write( LogLevel_Detail, m_id.GetNodeId(), "Changes to this value are %sverified", m_verifyChanges ? "" : "not " ); + + if( !m_verifyChanges ) + { + // since we're not checking changes in this value, notify ValueChanged (to be on the safe side) + Value::OnValueChanged(); + return 2; // confirmed change of value + } + + // see if the value has changed (result is used whether checking change or not) + bool bOriginalEqual = false; + switch( _type ) + { + case 1: // string + bOriginalEqual = ( strcmp( ((string*)_originalValue)->c_str(), ((string*)_newValue)->c_str() ) == 0 ); + break; + case 2: // short + bOriginalEqual = ( *((short*)_originalValue) == *((short*)_newValue) ); + break; + case 3: // int32 + bOriginalEqual = ( *((int32*)_originalValue) == *((int32*)_newValue) ); + break; + case 4: // uint8 + bOriginalEqual = ( *((uint8*)_originalValue) == *((uint8*)_newValue) ); + break; + case 5: // bool + bOriginalEqual = ( *((bool*)_originalValue) == *((bool*)_newValue) ); + break; + case 6: // raw + bOriginalEqual = ( memcmp( _originalValue, _newValue, _length ) == 0 ); + break; + } + + // if this is the first refresh of the value, test to see if the value has changed + if( !IsCheckingChange() ) + { + if( bOriginalEqual ) + { + // values are the same, so signal a refresh and return + Value::OnValueRefreshed(); + return 0; // value hasn't changed + } + + // values are different, so flag this as a verification refresh and queue it + Log::Write( LogLevel_Info, m_id.GetNodeId(), "Changed value (possible)--rechecking" ); + SetCheckingChange( true ); + Manager::Get()->RefreshValue( GetID() ); + return 1; // value has changed (to be confirmed) + } + else // IsCheckingChange is true if this is the second read of a potentially changed value + { + // if the second read is the same as the first read, the value really changed + bool bCheckEqual = false; + switch( _type ) + { + case 1: // string + bCheckEqual = ( strcmp( ((string*)_checkValue)->c_str(), ((string*)_newValue)->c_str() ) == 0 ); + break; + case 2: // short + bCheckEqual = ( *((short*)_checkValue) == *((short*)_newValue) ); + break; + case 3: // int32 + bCheckEqual = ( *((int32*)_checkValue) == *((int32*)_newValue) ); + break; + case 4: // uint8 + bCheckEqual = ( *((uint8*)_checkValue) == *((uint8*)_newValue) ); + break; + case 5: // bool + bCheckEqual = ( *((bool*)_checkValue) == *((bool*)_newValue) ); + break; + case 6: + bCheckEqual = ( memcmp( _checkValue, _newValue, _length ) == 0 ); + break; + } + if( bCheckEqual ) + { + Log::Write( LogLevel_Info, m_id.GetNodeId(), "Changed value--confirmed" ); + SetCheckingChange( false ); + + // update the saved value and send notification + Value::OnValueChanged(); + return 2; + } + + // if the second read is the same as the original value, the first read is assumed to have been in error + // log this situation, but don't change the value or send a ValueChanged Notification + if( bOriginalEqual ) + { + Log::Write( LogLevel_Info, m_id.GetNodeId(), "Spurious value change was noted." ); + SetCheckingChange( false ); + Value::OnValueRefreshed(); + return 0; + } + + // the second read is different than both the original value and the checked value...retry + // keep trying until we get the same value twice + Log::Write( LogLevel_Info, m_id.GetNodeId(), "Changed value (changed again)--rechecking" ); + SetCheckingChange( true ); + + // save a temporary copy of value and re-read value from device + Manager::Get()->RefreshValue( GetID() ); + return 1; + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/Value.h b/lib/ESPiLight/pilight/libs/openzwave/value_classes/Value.h new file mode 100644 index 0000000..b28f6e3 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/Value.h @@ -0,0 +1,127 @@ +//----------------------------------------------------------------------------- +// +// Value.h +// +// Base class for all OpenZWave Value Classes +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _Value_H +#define _Value_H + +#include +#include +#include "../Defs.h" +#include "../platform/Ref.h" +#include "ValueID.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class Node; + + /** \brief Base class for values associated with a node. + */ + class Value: public Ref + { + friend class Driver; + friend class ValueStore; + + public: + Value( uint32 const _homeId, uint8 const _nodeId, ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _index, ValueID::ValueType const _type, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, bool const _isset, uint8 const _pollIntensity ); + Value(); + + virtual void ReadXML( uint32 const _homeId, uint8 const _nodeId, uint8 const _commandClassId, TiXmlElement const* _valueElement ); + virtual void WriteXML( TiXmlElement* _valueElement ); + + ValueID const& GetID()const{ return m_id; } + bool IsReadOnly()const{ return m_readOnly; } + bool IsWriteOnly()const{ return m_writeOnly; } + bool IsSet()const{ return m_isSet; } + bool IsPolled()const{ return m_pollIntensity != 0; } + + string const& GetLabel()const{ return m_label; } + void SetLabel( string const& _label ){ m_label = _label; } + + string const& GetUnits()const{ return m_units; } + void SetUnits( string const& _units ){ m_units = _units; } + + string const& GetHelp()const{ return m_help; } + void SetHelp( string const& _help ){ m_help = _help; } + + uint8 const& GetPollIntensity()const{ return m_pollIntensity; } + void SetPollIntensity( uint8 const& _intensity ){ m_pollIntensity = _intensity; } + + int32 GetMin()const{ return m_min; } + int32 GetMax()const{ return m_max; } + + void SetChangeVerified( bool _verify ){ m_verifyChanges = _verify; } + + virtual string const GetAsString() const { return ""; } + virtual bool SetFromString( string const& _value ) { return false; } + + bool Set(); // For the user to change a value in a device + + // Helpers + static ValueID::ValueGenre GetGenreEnumFromName( char const* _name ); + static char const* GetGenreNameFromEnum( ValueID::ValueGenre _genre ); + static ValueID::ValueType GetTypeEnumFromName( char const* _name ); + static char const* GetTypeNameFromEnum( ValueID::ValueType _type ); + + protected: + virtual ~Value(); + +// void SetIsSet() { m_isSet = true; } // TODO: consider removing this...it's never called since m_isSet is set in ValueChanged and ValueRefreshed + bool IsCheckingChange()const{ return m_checkChange; } + void SetCheckingChange( bool _check ) { m_checkChange = _check; } + void OnValueRefreshed(); // A value in a device has been refreshed + void OnValueChanged(); // The refreshed value actually changed + int VerifyRefreshedValue( void* _originalValue, void* _checkValue, void* _newValue, int _type, int _length = 0 ); + + int32 m_min; + int32 m_max; + + time_t m_refreshTime; // time_t identifying when this value was last refreshed + bool m_verifyChanges; // if true, apparent changes are verified; otherwise, they're not + + private: + ValueID m_id; + string m_label; + string m_units; + string m_help; + bool m_readOnly; + bool m_writeOnly; + bool m_isSet; + uint8 m_affectsLength; + uint8* m_affects; + bool m_affectsAll; + bool m_checkChange; + uint8 m_pollIntensity; + }; + +} // namespace OpenZWave + +#endif + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueBool.cpp b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueBool.cpp new file mode 100644 index 0000000..63763bc --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueBool.cpp @@ -0,0 +1,161 @@ +//----------------------------------------------------------------------------- +// +// ValueBool.cpp +// +// Represents a boolean value +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "../tinyxml.h" +#include "ValueBool.h" +#include "../Driver.h" +#include "../Node.h" +#include "../platform/Log.h" +#include "../Manager.h" +#include + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ValueBool::ValueBool +( + uint32 const _homeId, + uint8 const _nodeId, + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _index, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + bool const _value, + uint8 const _pollIntensity +): + Value( _homeId, _nodeId, _genre, _commandClassId, _instance, _index, ValueID::ValueType_Bool, _label, _units, _readOnly, _writeOnly, false, _pollIntensity ), + m_value( _value ), + m_valueCheck( false ), + m_newValue( false ) +{ +} + +bool ValueBool::SetFromString +( + string const& _value +) +{ + if ( !strcasecmp( "true", _value.c_str() ) ) { + return Set( true ); + } + else if ( !strcasecmp( "false", _value.c_str() ) ) { + return Set( false ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Apply settings from XML +//----------------------------------------------------------------------------- +void ValueBool::ReadXML +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _commandClassId, + TiXmlElement const* _valueElement +) +{ + Value::ReadXML( _homeId, _nodeId, _commandClassId, _valueElement ); + + char const* str = _valueElement->Attribute( "value" ); + if( str ) + { + m_value = !strcmp( str, "True" ); + } + else + { + Log::Write( LogLevel_Info, "Missing default boolean value from xml configuration: node %d, class 0x%02x, instance %d, index %d", _nodeId, _commandClassId, GetID().GetInstance(), GetID().GetIndex() ); + } +} + +//----------------------------------------------------------------------------- +// +// Write ourselves to an XML document +//----------------------------------------------------------------------------- +void ValueBool::WriteXML +( + TiXmlElement* _valueElement +) +{ + Value::WriteXML( _valueElement ); + _valueElement->SetAttribute( "value", m_value ? "True" : "False" ); +} + +//----------------------------------------------------------------------------- +// +// Set a new value in the device +//----------------------------------------------------------------------------- +bool ValueBool::Set +( + bool const _value +) +{ + // create a temporary copy of this value to be submitted to the Set() call and set its value to the function param + ValueBool* tempValue = new ValueBool( *this ); + tempValue->m_value = _value; + + // Set the value in the device. + bool ret = ((Value*)tempValue)->Set(); + + // clean up the temporary value + delete tempValue; + + return ret; +} + +//----------------------------------------------------------------------------- +// +// A value in a device has been refreshed +//----------------------------------------------------------------------------- +void ValueBool::OnValueRefreshed +( + bool const _value +) +{ + switch( VerifyRefreshedValue( (void*) &m_value, (void*) &m_valueCheck, (void*) &_value, 5) ) + { + case 0: // value hasn't changed, nothing to do + break; + case 1: // value has changed (not confirmed yet), save _value in m_valueCheck + m_valueCheck = _value; + break; + case 2: // value has changed (confirmed), save _value in m_value + m_value = _value; + break; + case 3: // all three values are different, so wait for next refresh to try again + break; + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueBool.h b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueBool.h new file mode 100644 index 0000000..676f3ec --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueBool.h @@ -0,0 +1,74 @@ +//----------------------------------------------------------------------------- +// +// ValueBool.h +// +// Represents a boolean value +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ValueBool_H +#define _ValueBool_H + +#include +#include "../Defs.h" +#include "Value.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class Msg; + class Node; + class CommandClass; + + /** \brief Boolean value sent to/received from a node. + */ + class ValueBool: public Value + { + public: + ValueBool( uint32 const _homeId, uint8 const _nodeId, ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _index, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, bool const _value, uint8 const _pollIntensity ); + ValueBool(){} + virtual ~ValueBool(){} + + bool Set( bool const _value ); + void OnValueRefreshed( bool const _value ); + + // From Value + virtual string const GetAsString() const { return ( GetValue() ? "True" : "False" ); } + virtual bool SetFromString( string const& _value ); + virtual void ReadXML( uint32 const _homeId, uint8 const _nodeId, uint8 const _commandClassId, TiXmlElement const* _valueElement ); + virtual void WriteXML( TiXmlElement* _valueElement ); + + bool GetValue()const{ return m_value; } + + private: + bool m_value; // the current index in the m_items vector + bool m_valueCheck; // the previous value (used for double-checking spurious value reads) + bool m_newValue; // a new value to be set on the appropriate device + }; + +} // namespace OpenZWave + +#endif + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueButton.cpp b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueButton.cpp new file mode 100644 index 0000000..deae7e2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueButton.cpp @@ -0,0 +1,120 @@ +//----------------------------------------------------------------------------- +// +// ValueButton.h +// +// Represents a write-only value that triggers activity in a device +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "../tinyxml.h" +#include "ValueButton.h" +#include "../Manager.h" +#include "../Driver.h" +#include "../Node.h" +#include "../platform/Log.h" + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ValueButton::ValueButton +( + uint32 const _homeId, + uint8 const _nodeId, + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _index, + string const& _label, + uint8 const _pollIntensity +): + Value( _homeId, _nodeId, _genre, _commandClassId, _instance, _index, ValueID::ValueType_Button, _label, "", false, true, true, _pollIntensity ), + m_pressed( false ) +{ +} + +//----------------------------------------------------------------------------- +// +// Apply settings from XML +//----------------------------------------------------------------------------- +void ValueButton::ReadXML +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _commandClassId, + TiXmlElement const* _valueElement +) +{ + Value::ReadXML( _homeId, _nodeId, _commandClassId, _valueElement ); +} + +//----------------------------------------------------------------------------- +// +// Write ourselves to an XML document +//----------------------------------------------------------------------------- +void ValueButton::WriteXML +( + TiXmlElement* _valueElement +) +{ + Value::WriteXML( _valueElement ); +} + +//----------------------------------------------------------------------------- +// +// Start an activity in a device +//----------------------------------------------------------------------------- +bool ValueButton::PressButton +( +) +{ + // Set the value in the device. + m_pressed = true; + return Value::Set(); +} + +//----------------------------------------------------------------------------- +// +// Stop an activity in a device +//----------------------------------------------------------------------------- +bool ValueButton::ReleaseButton +( +) +{ + // Set the value in the device. + m_pressed = false; + bool res = Value::Set(); + if( Driver* driver = Manager::Get()->GetDriver( GetID().GetHomeId() ) ) + { + if( Node* node = driver->GetNodeUnsafe( GetID().GetNodeId() ) ) + { + node->RequestDynamicValues(); + } + } + return res; +} + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueButton.h b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueButton.h new file mode 100644 index 0000000..33d89c6 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueButton.h @@ -0,0 +1,70 @@ +//----------------------------------------------------------------------------- +// +// ValueButton.h +// +// Represents a write-only value that triggers activity in a device +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ValueButton_H +#define _ValueButton_H + +#include +#include "../Defs.h" +#include "Value.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class Msg; + class Node; + class CommandClass; + + /** \brief Button value ???. + */ + class ValueButton: public Value + { + public: + ValueButton( uint32 const _homeId, uint8 const _nodeId, ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _index, string const& _label, uint8 const _pollIntensity ); + ValueButton(): m_pressed( false ){} + virtual ~ValueButton(){} + + bool PressButton(); + bool ReleaseButton(); + + // From Value + virtual void ReadXML( uint32 const _homeId, uint8 const _nodeId, uint8 const _commandClassId, TiXmlElement const* _valueElement ); + virtual void WriteXML( TiXmlElement* _valueElement ); + + bool IsPressed()const{ return m_pressed; } + + private: + bool m_pressed; + }; + +} // namespace OpenZWave + +#endif + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueByte.cpp b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueByte.cpp new file mode 100644 index 0000000..44be50f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueByte.cpp @@ -0,0 +1,186 @@ +//----------------------------------------------------------------------------- +// +// ValueByte.cpp +// +// Represents an 8-bit value +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include +#include "../tinyxml.h" +#include "ValueByte.h" +#include "../Msg.h" +#include "../platform/Log.h" +#include "../Manager.h" +#include + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ValueByte::ValueByte +( + uint32 const _homeId, + uint8 const _nodeId, + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _index, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + uint8 const _value, + uint8 const _pollIntensity +): + Value( _homeId, _nodeId, _genre, _commandClassId, _instance, _index, ValueID::ValueType_Byte, _label, _units, _readOnly, _writeOnly, false, _pollIntensity ), + m_value( _value ), + m_valueCheck( false ), + m_newValue( false ) +{ + m_min = 0; + m_max = 255; +} + +//----------------------------------------------------------------------------- +// +// Constructor (from XML) +//----------------------------------------------------------------------------- +ValueByte::ValueByte +( +) +{ + m_min = 0; + m_max = 255; +} + +string const ValueByte::GetAsString +( +) const +{ + stringstream ss; + ss << GetValue(); + return ss.str(); +} + +bool ValueByte::SetFromString +( + string const& _value +) +{ + uint32 val = (uint32)atoi( _value.c_str() ); + if( val < 256 ) + { + return Set( (uint8)val ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Apply settings from XML +//----------------------------------------------------------------------------- +void ValueByte::ReadXML +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _commandClassId, + TiXmlElement const* _valueElement +) +{ + Value::ReadXML( _homeId, _nodeId, _commandClassId, _valueElement ); + + int intVal; + if( TIXML_SUCCESS == _valueElement->QueryIntAttribute( "value", &intVal ) ) + { + m_value = (uint8)intVal; + } + else + { + Log::Write( LogLevel_Info, "Missing default byte value from xml configuration: node %d, class 0x%02x, instance %d, index %d", _nodeId, _commandClassId, GetID().GetInstance(), GetID().GetIndex() ); + } +} + +//----------------------------------------------------------------------------- +// +// Write ourselves to an XML document +//----------------------------------------------------------------------------- +void ValueByte::WriteXML +( + TiXmlElement* _valueElement +) +{ + Value::WriteXML( _valueElement ); + + char str[8]; + snprintf( str, sizeof(str), "%d", m_value ); + _valueElement->SetAttribute( "value", str ); +} + +//----------------------------------------------------------------------------- +// +// Set a new value in the device +//----------------------------------------------------------------------------- +bool ValueByte::Set +( + uint8 const _value +) +{ + // create a temporary copy of this value to be submitted to the Set() call and set its value to the function param + ValueByte* tempValue = new ValueByte( *this ); + tempValue->m_value = _value; + + // Set the value in the device. + bool ret = ((Value*)tempValue)->Set(); + + // clean up the temporary value + delete tempValue; + + return ret; +} + +//----------------------------------------------------------------------------- +// +// A value in a device has been refreshed +//----------------------------------------------------------------------------- +void ValueByte::OnValueRefreshed +( + uint8 const _value +) +{ + switch( VerifyRefreshedValue( (void*) &m_value, (void*) &m_valueCheck, (void*) &_value, 4) ) + { + case 0: // value hasn't changed, nothing to do + break; + case 1: // value has changed (not confirmed yet), save _value in m_valueCheck + m_valueCheck = _value; + break; + case 2: // value has changed (confirmed), save _value in m_value + m_value = _value; + break; + case 3: // all three values are different, so wait for next refresh to try again + break; + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueByte.h b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueByte.h new file mode 100644 index 0000000..f2e1dc8 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueByte.h @@ -0,0 +1,73 @@ +//----------------------------------------------------------------------------- +// +// ValueByte.h +// +// Represents an 8-bit value +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ValueByte_H +#define _ValueByte_H + +#include +#include "../Defs.h" +#include "Value.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class Msg; + class Node; + + /** \brief Byte value sent to/received from a node. + */ + class ValueByte: public Value + { + public: + ValueByte( uint32 const _homeId, uint8 const _nodeId, ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _index, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, uint8 const _value, uint8 const _pollIntensity ); + ValueByte(); + virtual ~ValueByte(){} + + bool Set( uint8 const _value ); + void OnValueRefreshed( uint8 const _value ); + + // From Value + virtual string const GetAsString() const; + virtual bool SetFromString( string const& _value ); + virtual void ReadXML( uint32 const _homeId, uint8 const _nodeId, uint8 const _commandClassId, TiXmlElement const* _valueElement ); + virtual void WriteXML( TiXmlElement* _valueElement ); + + uint8 GetValue()const{ return m_value; } + + private: + uint8 m_value; // the current value + uint8 m_valueCheck; // the previous value (used for double-checking spurious value reads) + uint8 m_newValue; // a new value to be set on the appropriate device + }; + +} // namespace OpenZWave + +#endif + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueDecimal.cpp b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueDecimal.cpp new file mode 100644 index 0000000..bc0f597 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueDecimal.cpp @@ -0,0 +1,147 @@ +//----------------------------------------------------------------------------- +// +// ValueDecimal.cpp +// +// Represents a value that may have a fractional component +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "../tinyxml.h" +#include "ValueDecimal.h" +#include "../Msg.h" +#include "../platform/Log.h" +#include "../Manager.h" +#include + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ValueDecimal::ValueDecimal +( + uint32 const _homeId, + uint8 const _nodeId, + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _index, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + string const& _value, + uint8 const _pollIntensity +): + Value( _homeId, _nodeId, _genre, _commandClassId, _instance, _index, ValueID::ValueType_Decimal, _label, _units, _readOnly, _writeOnly, false, _pollIntensity ), + m_value( _value ), + m_valueCheck( "" ), + m_newValue( "" ), + m_precision( 0 ) +{ +} + +//----------------------------------------------------------------------------- +// +// Apply settings from XML +//----------------------------------------------------------------------------- +void ValueDecimal::ReadXML +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _commandClassId, + TiXmlElement const* _valueElement +) +{ + Value::ReadXML( _homeId, _nodeId, _commandClassId, _valueElement ); + + char const* str = _valueElement->Attribute( "value" ); + if( str ) + { + m_value = str; + } + else + { + Log::Write( LogLevel_Info, "Missing default decimal value from xml configuration: node %d, class 0x%02x, instance %d, index %d", _nodeId, _commandClassId, GetID().GetInstance(), GetID().GetIndex() ); + } +} + +//----------------------------------------------------------------------------- +// +// Write ourselves to an XML document +//----------------------------------------------------------------------------- +void ValueDecimal::WriteXML +( + TiXmlElement* _valueElement +) +{ + Value::WriteXML( _valueElement ); + _valueElement->SetAttribute( "value", m_value.c_str() ); +} + +//----------------------------------------------------------------------------- +// +// Set a new value in the device +//----------------------------------------------------------------------------- +bool ValueDecimal::Set +( + string const& _value +) +{ + // create a temporary copy of this value to be submitted to the Set() call and set its value to the function param + ValueDecimal* tempValue = new ValueDecimal( *this ); + tempValue->m_value = _value; + + // Set the value in the device. + bool ret = ((Value*)tempValue)->Set(); + + // clean up the temporary value + delete tempValue; + + return ret; +} + +//----------------------------------------------------------------------------- +// +// A value in a device has been refreshed +//----------------------------------------------------------------------------- +void ValueDecimal::OnValueRefreshed +( + string const& _value +) +{ + switch( VerifyRefreshedValue( (void*) &m_value, (void*) &m_valueCheck, (void*) &_value, 1) ) + { + case 0: // value hasn't changed, nothing to do + break; + case 1: // value has changed (not confirmed yet), save _value in m_valueCheck + m_valueCheck = _value; + break; + case 2: // value has changed (confirmed), save _value in m_value + m_value = _value; + break; + case 3: // all three values are different, so wait for next refresh to try again + break; + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueDecimal.h b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueDecimal.h new file mode 100644 index 0000000..f3e39f5 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueDecimal.h @@ -0,0 +1,82 @@ +//----------------------------------------------------------------------------- +// +// ValueDecimal.h +// +// Represents a value that may have a fractional component +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ValueDecimal_H +#define _ValueDecimal_H + +#include +#include "../Defs.h" +#include "Value.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class Msg; + class Node; + + /** \brief Decimal value sent to/received from a node. + */ + class ValueDecimal: public Value + { + friend class EnergyProduction; + friend class Meter; + friend class SensorMultilevel; + friend class ThermostatSetpoint; + + public: + ValueDecimal( uint32 const _homeId, uint8 const _nodeId, ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _index, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, string const& _value, uint8 const _pollIntensity ); + ValueDecimal(): m_precision( 0 ){} + virtual ~ValueDecimal(){} + + bool Set( string const& _value ); + void OnValueRefreshed( string const& _value ); + + // From Value + virtual string const GetAsString() const { return GetValue(); } + virtual bool SetFromString( string const& _value ) { return Set( _value ); } + virtual void ReadXML( uint32 const _homeId, uint8 const _nodeId, uint8 const _commandClassId, TiXmlElement const* _valueElement ); + virtual void WriteXML( TiXmlElement* _valueElement ); + + string GetValue()const{ return m_value; } + uint8 GetPrecision()const{ return m_precision; } + + private: + void SetPrecision( uint8 _precision ){ m_precision = _precision; } + + string m_value; // the current value + string m_valueCheck; // the previous value (used for double-checking spurious value reads) + string m_newValue; // a new value to be set on the appropriate device + uint8 m_precision; + }; + +} // namespace OpenZWave + +#endif + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueID.h b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueID.h new file mode 100644 index 0000000..7172b00 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueID.h @@ -0,0 +1,310 @@ +//----------------------------------------------------------------------------- +// +// ValueID.h +// +// Unique identifier for a Value object +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ValueID_H +#define _ValueID_H + +#include +#include +#include "../Defs.h" + +class TiXmlElement; + +namespace OpenZWave +{ + /** \brief Provides a unique ID for a value reported by a Z-Wave device. + * + * The ValueID is used to uniquely identify a value reported by a + * Z-Wave device. + *

        + * The ID is built by packing various identifying characteristics into a single + * 32-bit number - the Z-Wave driver index, device node ID, the command class and + * command class instance that handles the value, plus an index for the value + * to distinguish it among all the other values managed by that command class + * instance. The type (bool, byte, string etc) of the value is also stored. + *

        + * The packing of the ID is such that a list of Values sorted by ValueID + * will be in a sensible order for display to the user. + */ + class OPENZWAVE_EXPORT ValueID + { + friend class Manager; + friend class Driver; + friend class Node; + friend class Group; + friend class CommandClass; + friend class Value; + friend class ValueStore; + friend class Notification; + friend class ManufacturerSpecific; + + public: + /** + * Value Genres + * The classification of a value to enable low level system or configuration parameters to be filtered by the application. + * \see GetGenre + */ + enum ValueGenre + { + ValueGenre_Basic = 0, /**< The 'level' as controlled by basic commands. Usually duplicated by another command class. */ + ValueGenre_User, /**< Basic values an ordinary user would be interested in. */ + ValueGenre_Config, /**< Device-specific configuration parameters. These cannot be automatically discovered via Z-Wave, and are usually described in the user manual instead. */ + ValueGenre_System, /**< Values of significance only to users who understand the Z-Wave protocol */ + ValueGenre_Count /**< A count of the number of genres defined. Not to be used as a genre itself. */ + }; + + /** + * Value Types + * The type of data represented by the value object. + * \see GetType + */ + enum ValueType + { + ValueType_Bool = 0, /**< Boolean, true or false */ + ValueType_Byte, /**< 8-bit unsigned value */ + ValueType_Decimal, /**< Represents a non-integer value as a string, to avoid floating point accuracy issues. */ + ValueType_Int, /**< 32-bit signed value */ + ValueType_List, /**< List from which one item can be selected */ + ValueType_Schedule, /**< Complex type used with the Climate Control Schedule command class */ + ValueType_Short, /**< 16-bit signed value */ + ValueType_String, /**< Text string */ + ValueType_Button, /**< A write-only value that is the equivalent of pressing a button to send a command to a device */ + ValueType_Raw, /**< A collection of bytes */ + ValueType_Max = ValueType_Raw /**< The highest-number type defined. Not to be used as a type itself. */ + }; + + /** + * Get the Home ID of the driver that controls the node containing the value. + * \return the Home ID. + */ + uint32 GetHomeId()const{ return m_homeId; } + + /** + * Get the Home ID of the driver that controls the node containing the value. + * \return the node id. + */ + uint8 GetNodeId()const{ return( (uint8)( (m_id & 0xff000000) >> 24 ) ); } + + /** + * Get the genre of the value. The genre classifies a value to enable + * low-level system or configuration parameters to be filtered out by the application + * \return the value's genre. + * \see ValueGenre + */ + ValueGenre GetGenre()const{ return( (ValueGenre)( (m_id & 0x00c00000) >> 22 ) ); } + + /** + * Get the Z-Wave command class that created and manages this value. Knowledge of + * command classes is not required to use OpenZWave, but this information is + * exposed in case it is of interest. + * \return the value's command class. + */ + uint8 GetCommandClassId()const{ return( (uint8)( (m_id & 0x003fc000) >> 14 ) ); } + + /** + * Get the command class instance of this value. It is possible for there to be + * multiple instances of a command class, although currently it appears that + * only the SensorMultilevel command class ever does this. Knowledge of + * instances and command classes is not required to use OpenZWave, but this + * information is exposed in case it is of interest. + * \return the instance of the value's command class. + */ + uint8 GetInstance()const{ return( (uint8)( ( (m_id1 & 0xff000000) ) >> 24 ) ); } + + /** + * Get the value index. The index is used to identify one of multiple + * values created and managed by a command class. In the case of configurable + * parameters (handled by the configuration command class), the index is the + * same as the parameter ID. Knowledge of command classes is not required + * to use OpenZWave, but this information is exposed in case it is of interest. + * \return the value index within the command class. + */ + uint8 GetIndex()const{ return( (uint8)( (m_id & 0x00000ff0) >> 4 ) ); } + + /** + * Get the type of the value. The type describes the data held by the value + * and enables the user to select the correct value accessor method in the + * Manager class. + * \return the value's type. + * \see ValueType, Manager::GetValueAsBool, Manager::GetValueAsByte, Manager::GetValueAsFloat, Manager::GetValueAsInt, Manager::GetValueAsShort, Manager::GetValueAsString, Manager::GetValueListSelection. + */ + ValueType GetType()const{ return( (ValueType)( m_id & 0x0000000f ) ); } + + /** + * Get a 64Bit Integer that represents this ValueID. This Integer is not guaranteed to be valid + * across restarts of OpenZWave. + * \return a uint64 integer + */ + uint64 GetId()const{ return (uint64) ( ( (uint64)m_id1 << 32 ) | m_id );} + + // Comparison Operators + bool operator == ( ValueID const& _other )const{ return( ( m_homeId == _other.m_homeId ) && ( m_id == _other.m_id ) && ( m_id1 == _other.m_id1 ) ); } + bool operator != ( ValueID const& _other )const{ return( ( m_homeId != _other.m_homeId ) || ( m_id != _other.m_id ) || ( m_id1 != _other.m_id1 ) ); } + bool operator < ( ValueID const& _other )const + { + if( m_homeId == _other.m_homeId ) + { + if( m_id == _other.m_id ) + { + return( m_id1 < _other.m_id1 ); + } + else + { + return( m_id < _other.m_id ); + } + } + else + { + return( m_homeId < _other.m_homeId ); + } + } + bool operator > ( ValueID const& _other )const + { + if( m_homeId == _other.m_homeId ) + { + if( m_id == _other.m_id ) + { + return( m_id1 > _other.m_id1 ); + } + else + { + return( m_id > _other.m_id ); + } + } + else + { + return( m_homeId > _other.m_homeId ); + } + } + + /** + * Construct a value ID from its component parts. + * This method is public only to allow ValueIDs to be saved and recreated by the application. + * Only ValueIDs that have been reported by OpenZWave notifications should ever be used. + * \param _homeId Home ID of the PC Z-Wave Controller that manages the device. + * \param _nodeId Node ID of the device reporting the value. + * \param _genre classification of the value to enable low level system or configuration parameters to be filtered out. + * \param _commandClassId ID of command class that creates and manages this value. + * \param _instance Instance index of the command class. + * \param _valueIndex Index of the value within all the values created by the command class instance. + * \param _type Type of value (bool, byte, string etc). + * \return The ValueID. + * \see ValueID + */ + ValueID + ( + uint32 const _homeId, + uint8 const _nodeId, + ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _valueIndex, + ValueType const _type + ): + m_homeId( _homeId ) + { + m_id = (((uint32)_nodeId)<<24) + | (((uint32)_genre)<<22) + | (((uint32)_commandClassId)<<14) + | (((uint32)_valueIndex)<<4) + | ((uint32)_type); + m_id1 = (((uint32)_instance)<<24); + } + + /* construct a ValueID based on the HomeID and the unit64 returned from GetID + * \param _homeId - The HomeID + * \param id - The ID returned from ValueID::GetID + * \see ValueID::GetId + */ + ValueID + ( + uint32 _homeId, + uint64 id + ): + m_homeId(_homeId) + { + m_id = ((uint32)(id & 0xFFFFFFFF)); + m_id1 = (uint32)(id >> 32); + } + private: + // Construct a value id for use in notifications + ValueID( uint32 const _homeId, uint8 const _nodeId ): m_id1( 0 ),m_homeId( _homeId ){ m_id = ((uint32)_nodeId)<<24; } + ValueID( uint32 const _homeId, uint8 const _nodeId, uint32 const _instance ): + m_homeId( _homeId ) + { + m_id = (((uint32)_nodeId)<<24); + m_id1 = (((uint32)_instance)<<24); + } + + // Default constructor + ValueID():m_id(0),m_id1(0),m_homeId(0){} + + // Not all parts of the ValueID are necessary to uniquely identify the value. In the case of a + // Node's ValueStore, we can ignore the home ID, node ID, genre and type and still be left with + // a unique integer than can be used as a key to look up values. The two GetValueStoreKey methods + // below are helpers to enable command classes to easily access their values from the ValueStore. + + // Get the key from our own m_id + uint32 GetValueStoreKey()const + { + return ( ( m_id & 0x003ffff0 ) | ( m_id1 & 0xff000000 ) ); + } + + // Generate a key from its component parts + static uint32 GetValueStoreKey( uint8 const _commandClassId, uint8 const _instance, uint8 const _valueIndex ) + { + + uint32 key = (((uint32)_instance)<<24) + | (((uint32)_commandClassId)<<14) + | (((uint32)_valueIndex)<<4); + + return key; + } + + // ID Packing: + // Bits + // 24-31: 8 bits. Node ID of device + // 22-23: 2 bits. genre of value (see ValueGenre enum). + // 14-21: 8 bits. ID of command class that created and manages this value. + // 12-13: 2 bits. Unused. + // 04-11: 8 bits. Index of value within all the value created by the command class + // instance (in configuration parameters, this is also the parameter ID). + // 00-03: 4 bits. Type of value (bool, byte, string etc). + uint32 m_id; + + // ID1 Packing: + // Bits + // 24-31 8 bits. Instance Index of the command class. + uint32 m_id1; + + // Unique PC interface identifier + uint32 m_homeId; + }; + +} // namespace OpenZWave + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueInt.cpp b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueInt.cpp new file mode 100644 index 0000000..c04dee5 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueInt.cpp @@ -0,0 +1,188 @@ +//----------------------------------------------------------------------------- +// +// ValueInt.cpp +// +// Represents a 32-bit value +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include +#include +#include "../tinyxml.h" +#include "ValueInt.h" +#include "../Msg.h" +#include "../platform/Log.h" +#include "../Manager.h" +#include + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ValueInt::ValueInt +( + uint32 const _homeId, + uint8 const _nodeId, + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _index, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + int32 const _value, + uint8 const _pollIntensity +): + Value( _homeId, _nodeId, _genre, _commandClassId, _instance, _index, ValueID::ValueType_Int, _label, _units, _readOnly, _writeOnly, false, _pollIntensity ), + m_value( _value ), + m_valueCheck( 0 ), + m_newValue( 0 ) +{ + m_min = INT_MIN; + m_max = INT_MAX; +} + +//----------------------------------------------------------------------------- +// +// Constructor (from XML) +//----------------------------------------------------------------------------- +ValueInt::ValueInt +( +): + Value(), + m_value( 0 ), + m_valueCheck( 0 ), + m_newValue( 0 ) + +{ + m_min = INT_MIN; + m_max = INT_MAX; +} + +string const ValueInt::GetAsString +( +) const +{ + stringstream ss; + ss << GetValue(); + return ss.str(); +} + +bool ValueInt::SetFromString +( + string const& _value +) +{ + int32 val = atoi( _value.c_str() ); + return Set( val ); +} + +//----------------------------------------------------------------------------- +// +// Apply settings from XML +//----------------------------------------------------------------------------- +void ValueInt::ReadXML +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _commandClassId, + TiXmlElement const* _valueElement +) +{ + Value::ReadXML( _homeId, _nodeId, _commandClassId, _valueElement ); + + int intVal; + if( TIXML_SUCCESS == _valueElement->QueryIntAttribute( "value", &intVal ) ) + { + m_value = (int32)intVal; + } + else + { + Log::Write( LogLevel_Info, "Missing default integer value from xml configuration: node %d, class 0x%02x, instance %d, index %d", _nodeId, _commandClassId, GetID().GetInstance(), GetID().GetIndex() ); + } +} + +//----------------------------------------------------------------------------- +// +// Write ourselves to an XML document +//----------------------------------------------------------------------------- +void ValueInt::WriteXML +( + TiXmlElement* _valueElement +) +{ + Value::WriteXML( _valueElement ); + + char str[16]; + snprintf( str, sizeof(str), "%d", m_value ); + _valueElement->SetAttribute( "value", str ); +} + +//----------------------------------------------------------------------------- +// +// Set a new value in the device +//----------------------------------------------------------------------------- +bool ValueInt::Set +( + int32 const _value +) +{ + // create a temporary copy of this value to be submitted to the Set() call and set its value to the function param + ValueInt* tempValue = new ValueInt( *this ); + tempValue->m_value = _value; + + // Set the value in the device. + bool ret = ((Value*)tempValue)->Set(); + + // clean up the temporary value + delete tempValue; + + return ret; +} + +//----------------------------------------------------------------------------- +// +// A value in a device has been refreshed +//----------------------------------------------------------------------------- +void ValueInt::OnValueRefreshed +( + int32 const _value +) +{ + switch( VerifyRefreshedValue( (void*) &m_value, (void*) &m_valueCheck, (void*) &_value, 3) ) + { + case 0: // value hasn't changed, nothing to do + break; + case 1: // value has changed (not confirmed yet), save _value in m_valueCheck + m_valueCheck = _value; + break; + case 2: // value has changed (confirmed), save _value in m_value + m_value = _value; + break; + case 3: // all three values are different, so wait for next refresh to try again + break; + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueInt.h b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueInt.h new file mode 100644 index 0000000..8090be7 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueInt.h @@ -0,0 +1,70 @@ +//----------------------------------------------------------------------------- +// +// ValueInt.h +// +// Represents a 32-bit value +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ValueInt_H +#define _ValueInt_H + +#include +#include "../Defs.h" +#include "Value.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class Msg; + class Node; + + /** \brief Integer value sent to/received from a node. + */ + class ValueInt: public Value + { + public: + ValueInt( uint32 const _homeId, uint8 const _nodeId, ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _index, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, int32 const _value, uint8 const _pollIntensity ); + ValueInt(); + virtual ~ValueInt(){} + + bool Set( int32 const _value ); + void OnValueRefreshed( int32 const _value ); + + // From Value + virtual string const GetAsString() const; + virtual bool SetFromString( string const& _value ); + virtual void ReadXML( uint32 const _homeId, uint8 const _nodeId, uint8 const _commandClassId, TiXmlElement const* _valueElement ); + virtual void WriteXML( TiXmlElement* _valueElement ); + + int32 GetValue()const{ return m_value; } + + private: + int32 m_value; // the current value + int32 m_valueCheck; // the previous value (used for double-checking spurious value reads) + int32 m_newValue; // a new value to be set on the appropriate device + }; + +} // namespace OpenZWave + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueList.cpp b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueList.cpp new file mode 100644 index 0000000..5b78d03 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueList.cpp @@ -0,0 +1,358 @@ +//----------------------------------------------------------------------------- +// +// ValueList.cpp +// +// Represents a list of items +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "../tinyxml.h" +#include "ValueList.h" +#include "../Msg.h" +#include "../platform/Log.h" +#include "../Manager.h" +#include + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ValueList::ValueList +( + uint32 const _homeId, + uint8 const _nodeId, + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _index, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + vector const& _items, + int32 const _valueIdx, + uint8 const _pollIntensity, + uint8 const _size // = 4 +): + Value( _homeId, _nodeId, _genre, _commandClassId, _instance, _index, ValueID::ValueType_List, _label, _units, _readOnly, _writeOnly, false, _pollIntensity ), + m_items( _items ), + m_valueIdx( _valueIdx ), + m_valueIdxCheck( 0 ), + m_newValueIdx( 0 ), + m_size( _size ) +{ +} + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ValueList::ValueList +( +): + Value(), + m_items( ), + m_valueIdx(), + m_valueIdxCheck( 0 ), + m_newValueIdx( 0 ), + m_size(0) +{ +} + +//----------------------------------------------------------------------------- +// +// Apply settings from XML +//----------------------------------------------------------------------------- +void ValueList::ReadXML +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _commandClassId, + TiXmlElement const* _valueElement +) +{ + Value::ReadXML( _homeId, _nodeId, _commandClassId, _valueElement ); + + // Get size of values + int intSize; + if ( TIXML_SUCCESS == _valueElement->QueryIntAttribute( "size", &intSize ) ) + { + if( intSize == 1 || intSize == 2 || intSize == 4 ) + { + m_size = intSize; + } + else + { + Log::Write( LogLevel_Info, "Value size is invalid. Only 1, 2 & 4 supported for node %d, class 0x%02x, instance %d, index %d", _nodeId, _commandClassId, GetID().GetInstance(), GetID().GetIndex() ); + } + } + else + { + Log::Write( LogLevel_Info, "Value list size is not set, assuming 4 bytes for node %d, class 0x%02x, instance %d, index %d", _nodeId, _commandClassId, GetID().GetInstance(), GetID().GetIndex() ); + } + + // Read the items + m_items.clear(); + TiXmlElement const* itemElement = _valueElement->FirstChildElement(); + while( itemElement ) + { + char const* str = itemElement->Value(); + if( str && !strcmp( str, "Item" ) ) + { + char const* labelStr = itemElement->Attribute( "label" ); + + int value = 0; + if (itemElement->QueryIntAttribute( "value", &value ) != TIXML_SUCCESS) { + Log::Write( LogLevel_Info, "Item value %s is wrong type or does not exist in xml configuration for node %d, class 0x%02x, instance %d, index %d", labelStr, _nodeId, _commandClassId, GetID().GetInstance(), GetID().GetIndex() ); + continue; + } + if(( m_size == 1 && value > 255 ) || ( m_size == 2 && value > 65535) ) + { + Log::Write( LogLevel_Info, "Item value %s is incorrect size in xml configuration for node %d, class 0x%02x, instance %d, index %d", labelStr, _nodeId, _commandClassId, GetID().GetInstance(), GetID().GetIndex() ); + } + else + { + Item item; + item.m_label = labelStr; + item.m_value = value; + + m_items.push_back( item ); + } + } + + itemElement = itemElement->NextSiblingElement(); + } + + // Set the value + bool valSet = false; + int intVal; + m_valueIdx = 0; + if ( TIXML_SUCCESS == _valueElement->QueryIntAttribute( "value", &intVal ) ) + { + valSet = true; + intVal = GetItemIdxByValue( intVal ); + if( intVal != -1 ) + { + m_valueIdx = (int32)intVal; + } + else + { + Log::Write( LogLevel_Info, "Value is not found in xml configuration for node %d, class 0x%02x, instance %d, index %d", _nodeId, _commandClassId, GetID().GetInstance(), GetID().GetIndex() ); + } + } + + // Set the index + bool indSet = false; + int intInd = 0; + if ( TIXML_SUCCESS == _valueElement->QueryIntAttribute( "vindex", &intInd ) ) + { + indSet = true; + if( intInd >= 0 && intInd < (int32)m_items.size() ) + { + m_valueIdx = (int32)intInd; + } + else + { + Log::Write( LogLevel_Info, "Vindex is out of range for index in xml configuration for node %d, class 0x%02x, instance %d, index %d", _nodeId, _commandClassId, GetID().GetInstance(), GetID().GetIndex() ); + } + } + if( !valSet && !indSet ) + { + Log::Write( LogLevel_Info, "Missing default list value or vindex from xml configuration: node %d, class 0x%02x, instance %d, index %d", _nodeId, _commandClassId, GetID().GetInstance(), GetID().GetIndex() ); + } +} + +//----------------------------------------------------------------------------- +// +// Write ourselves to an XML document +//----------------------------------------------------------------------------- +void ValueList::WriteXML +( + TiXmlElement* _valueElement +) +{ + Value::WriteXML( _valueElement ); + + char str[16]; + snprintf( str, sizeof(str), "%d", m_valueIdx ); + _valueElement->SetAttribute( "vindex", str ); + + snprintf( str, sizeof(str), "%d", m_size ); + _valueElement->SetAttribute( "size", str ); + + for( vector::iterator it = m_items.begin(); it != m_items.end(); ++it ) + { + TiXmlElement* pItemElement = new TiXmlElement( "Item" ); + pItemElement->SetAttribute( "label", (*it).m_label.c_str() ); + + snprintf( str, sizeof(str), "%d", (*it).m_value ); + pItemElement->SetAttribute( "value", str ); + + _valueElement->LinkEndChild( pItemElement ); + } +} + +//----------------------------------------------------------------------------- +// +// Set a new value in the device, selected by item index +//----------------------------------------------------------------------------- +bool ValueList::SetByValue +( + int32 const _value +) +{ + // create a temporary copy of this value to be submitted to the Set() call and set its value to the function param + ValueList* tempValue = new ValueList( *this ); + tempValue->m_valueIdx = _value; + + // Set the value in the device. + bool ret = ((Value*)tempValue)->Set(); + + // clean up the temporary value + delete tempValue; + + return ret; +} + +//----------------------------------------------------------------------------- +// +// Set a new value in the device, selected by item label +//----------------------------------------------------------------------------- +bool ValueList::SetByLabel +( + string const& _label +) +{ + // Ensure the value is one of the options + int index = GetItemIdxByLabel( _label ); + if( index < 0 ) + { + // Item not found + return false; + } + + return SetByValue( index ); +} + +//----------------------------------------------------------------------------- +// +// A value in a device has been refreshed +//----------------------------------------------------------------------------- +void ValueList::OnValueRefreshed +( + int32 const _value +) +{ + // Ensure the value is one of the options + int32 index = GetItemIdxByValue( _value ); + if( index < 0 ) + { + // Item not found + return; + } + + switch( VerifyRefreshedValue( (void*) &m_valueIdx, (void*) &m_valueIdxCheck, (void*) &index, 3) ) + { + case 0: // value hasn't changed, nothing to do + break; + case 1: // value has changed (not confirmed yet), save _value in m_valueCheck + m_valueIdxCheck = index; + break; + case 2: // value has changed (confirmed), save _value in m_value + m_valueIdx = index; + break; + case 3: // all three values are different, so wait for next refresh to try again + break; + } +} + +//----------------------------------------------------------------------------- +// +// Get the index of an item from its label +//----------------------------------------------------------------------------- +int32 const ValueList::GetItemIdxByLabel +( + string const& _label +) +{ + for( int32 i=0; i<(int32)m_items.size(); ++i ) + { + if( _label == m_items[i].m_label ) + { + return i; + } + } + + return -1; +} + +//----------------------------------------------------------------------------- +// +// Get the index of an item from its value +//----------------------------------------------------------------------------- +int32 const ValueList::GetItemIdxByValue +( + int32 const _value +) +{ + for( int32 i=0; i<(int32)m_items.size(); ++i ) + { + if( _value == m_items[i].m_value ) + { + return i; + } + } + + return -1; +} + +//----------------------------------------------------------------------------- +// +// Fill a vector with the item labels +//----------------------------------------------------------------------------- +bool ValueList::GetItemLabels +( + vector* o_items +) +{ + if( o_items ) + { + for( vector::iterator it = m_items.begin(); it != m_items.end(); ++it ) + { + o_items->push_back( (*it).m_label ); + } + + return true; + } + + return false; +} + + + + + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueList.h b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueList.h new file mode 100644 index 0000000..3544fb6 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueList.h @@ -0,0 +1,94 @@ +//----------------------------------------------------------------------------- +// +// ValueList.h +// +// Represents a list of items +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ValueList_H +#define _ValueList_H + +#include +#include +#include "../Defs.h" +#include "Value.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class Msg; + class Node; + + /** \brief List of values sent to/received from a node. + */ + class ValueList: public Value + { + public: + /** \brief An item (element) in the list of values. + */ + struct Item + { + string m_label; + int32 m_value; + }; + + ValueList( uint32 const _homeId, uint8 const _nodeId, ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _index, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, vector const& _items, int32 const _valueIdx, uint8 const _pollIntensity, uint8 const _size = 4 ); + ValueList(); + virtual ~ValueList(){} + + bool SetByLabel( string const& _label ); + bool SetByValue( int32 const _value ); + + void OnValueRefreshed( int32 const _valueIdx ); + + // From Value + virtual string const GetAsString() const { return GetItem().m_label; } + virtual bool SetFromString( string const& _value ) { return SetByLabel( _value ); } + virtual void ReadXML( uint32 const _homeId, uint8 const _nodeId, uint8 const _commandClassId, TiXmlElement const* _valueElement ); + virtual void WriteXML( TiXmlElement* _valueElement ); + + Item const& GetItem()const{ return m_items[m_valueIdx]; } + Item const& GetNewItem()const{ return m_items[m_newValueIdx]; } + + int32 const GetItemIdxByLabel( string const& _label ); + int32 const GetItemIdxByValue( int32 const _value ); + + bool GetItemLabels( vector* o_items ); + + uint8 const GetSize()const{ return m_size; } + + private: + vector m_items; + int32 m_valueIdx; // the current index in the m_items vector + int32 m_valueIdxCheck; // the previous index in the m_items vector (used for double-checking spurious value reads) + int32 m_newValueIdx; // a new value to be set on the appropriate device + uint8 m_size; + }; + +} // namespace OpenZWave + +#endif + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueRaw.cpp b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueRaw.cpp new file mode 100644 index 0000000..7941ee6 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueRaw.cpp @@ -0,0 +1,285 @@ +//----------------------------------------------------------------------------- +// +// ValueRaw.cpp +// +// Represents a collection of 8-bit values +// +// Copyright (c) 2012 Greg Satz +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "../tinyxml.h" +#include "ValueRaw.h" +#include "../Msg.h" +#include "../platform/Log.h" +#include "../Manager.h" +#include + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ValueRaw::ValueRaw +( + uint32 const _homeId, + uint8 const _nodeId, + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _index, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + uint8 const* _value, + uint8 const _length, + uint8 const _pollIntensity +): + Value( _homeId, _nodeId, _genre, _commandClassId, _instance, _index, ValueID::ValueType_Raw, _label, _units, _readOnly, _writeOnly, false, _pollIntensity ), + m_value( NULL ), + m_valueLength( _length ), + m_valueCheck ( NULL ), + m_newValue ( NULL ) +{ + m_value = new uint8[_length]; + memcpy( m_value, _value, _length ); + m_min = 0; + m_max = 0; +} + +//----------------------------------------------------------------------------- +// +// Constructor (from XML) +//----------------------------------------------------------------------------- +ValueRaw::ValueRaw +( +): + m_value( NULL ), + m_valueCheck ( NULL ), + m_newValue ( NULL ) +{ + m_valueLength = 0; + m_min = 0; + m_max = 0; +} + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +ValueRaw::~ValueRaw +( +) +{ + delete [] m_value; +} + +string const ValueRaw::GetAsString +( +) const +{ + string str = ""; + char bstr[10]; + + for( uint32 i=0; i= 256 ) + { + break; + } + if( index < m_valueLength ) + { + value[index] = (uint8)val; + } + index++; + if( ep != NULL && *ep == '\0' ) + { + break; + } + p = ep + 1; + } + + bool bRet = false; + + if ( index <= m_valueLength ) + { + bRet = Set( value, index ); + } + + delete [] value; + return bRet; +} + +//----------------------------------------------------------------------------- +// +// Apply settings from XML +//----------------------------------------------------------------------------- +void ValueRaw::ReadXML +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _commandClassId, + TiXmlElement const* _valueElement +) +{ + Value::ReadXML( _homeId, _nodeId, _commandClassId, _valueElement ); + + int intVal; + if( TIXML_SUCCESS == _valueElement->QueryIntAttribute( "length", &intVal ) ) + { + m_valueLength = (uint8)intVal; + } + m_value = new uint8[m_valueLength]; + char const* str = _valueElement->Attribute( "value" ); + if( str ) + { + uint8 index = 0; + while( 1 ) + { + char *ep = NULL; + uint32 val = (uint32)strtol( str, &ep, 16 ); + if( str == ep || val >= 256 ) + { + break; + } + if( index < m_valueLength ) + { + m_value[index] = (uint8)val; + } + index++; + if( ep != NULL && *ep == '\0' ) + { + break; + } + str = ep + 1; + } + if( index > m_valueLength ) + { + Log::Write( LogLevel_Info, "Data length mismatch for raw data. Got %d but expected %d.", index, m_valueLength ); + } + } + else + { + Log::Write( LogLevel_Info, "Missing default raw value from xml configuration: node %d, class 0x%02x, instance %d, index %d", _nodeId, _commandClassId, GetID().GetInstance(), GetID().GetIndex() ); + } +} + +//----------------------------------------------------------------------------- +// +// Write ourselves to an XML document +//----------------------------------------------------------------------------- +void ValueRaw::WriteXML +( + TiXmlElement* _valueElement +) +{ + Value::WriteXML( _valueElement ); + + _valueElement->SetAttribute( "value", GetAsString().c_str() ); + char str[8]; + snprintf( str, sizeof(str), "%d", GetLength() ); + _valueElement->SetAttribute( "length", str ); +} + +//----------------------------------------------------------------------------- +// +// Set a new value in the device +//----------------------------------------------------------------------------- +bool ValueRaw::Set +( + uint8 const* _value, + uint8 const _length +) +{ + // create a temporary copy of this value to be submitted to the Set() call and set its value to the function param + ValueRaw* tempValue = new ValueRaw( *this ); + tempValue->m_value = new uint8[_length]; + memcpy( tempValue->m_value, _value, _length ); + tempValue->m_valueLength = _length; + + // Set the value in the device. + bool ret = ((Value*)tempValue)->Set(); + + // clean up the temporary value + delete tempValue; + + return ret; +} + +//----------------------------------------------------------------------------- +// +// A value in a device has been refreshed +//----------------------------------------------------------------------------- +void ValueRaw::OnValueRefreshed +( + uint8 const* _value, + uint8 const _length +) +{ + switch( VerifyRefreshedValue( (void*)m_value, (void*)m_valueCheck, (void*)_value, 6, _length ) ) + { + case 0: // value hasn't changed, nothing to do + break; + case 1: // value has changed (not confirmed yet), save _value in m_valueCheck + if( m_valueCheck != NULL ) + { + delete [] m_valueCheck; + } + m_valueCheck = new uint8[_length]; + memcpy( m_valueCheck, _value, _length ); + break; + case 2: // value has changed (confirmed), save _value in m_value + if( m_value != NULL ) + { + delete [] m_value; + } + m_value = new uint8[_length]; + memcpy( m_value, _value, _length ); + break; + case 3: // all three values are different, so wait for next refresh to try again + break; + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueRaw.h b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueRaw.h new file mode 100644 index 0000000..f392625 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueRaw.h @@ -0,0 +1,75 @@ +//----------------------------------------------------------------------------- +// +// ValueRaw.h +// +// Represents a collection of 8-bit values +// +// Copyright (c) 2013 Greg Satz +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ValueRaw_H +#define _ValueRaw_H + +#include +#include "../Defs.h" +#include "Value.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class Msg; + class Node; + + /** \brief A collection of bytes sent to/received from a node. + */ + class ValueRaw: public Value + { + public: + ValueRaw( uint32 const _homeId, uint8 const _nodeId, ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _index, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, uint8 const* _value, uint8 const _length, uint8 const _pollIntensity ); + ValueRaw(); + virtual ~ValueRaw(); + + bool Set( uint8 const* _value, uint8 const _length ); + void OnValueRefreshed( uint8 const* _value, uint8 const _length ); + + // From Value + virtual string const GetAsString() const; + virtual bool SetFromString( string const& _value ); + virtual void ReadXML( uint32 const _homeId, uint8 const _nodeId, uint8 const _commandClassId, TiXmlElement const* _valueElement ); + virtual void WriteXML( TiXmlElement* _valueElement ); + + uint8* GetValue()const{ return m_value; } + uint8 GetLength()const{ return m_valueLength; } + + private: + uint8* m_value; // the current value + uint8 m_valueLength; // fixed length for this instance + uint8* m_valueCheck; // the previous value (used for double-checking spurious value reads) + uint8* m_newValue; // a new value to be set on the appropriate device + }; + +} // namespace OpenZWave + +#endif + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueSchedule.cpp b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueSchedule.cpp new file mode 100644 index 0000000..96345a3 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueSchedule.cpp @@ -0,0 +1,351 @@ +//----------------------------------------------------------------------------- +// +// ValueSchedule.cpp +// +// A one day schedule for the Climate Control Schedule command class +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include +#include +#include "../tinyxml.h" +#include "ValueSchedule.h" +#include "../Msg.h" +#include "../platform/Log.h" + +using namespace OpenZWave; + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ValueSchedule::ValueSchedule +( + uint32 const _homeId, + uint8 const _nodeId, + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _index, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + uint8 const _pollIntensity +): + Value( _homeId, _nodeId, _genre, _commandClassId, _instance, _index, ValueID::ValueType_Byte, _label, _units, _readOnly, _writeOnly, false, _pollIntensity ), + m_numSwitchPoints( 0 ) + +{ +} + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ValueSchedule::ValueSchedule +( +): + Value(), + m_numSwitchPoints( 0 ) + +{ +} + +//----------------------------------------------------------------------------- +// +// Apply settings from XML +//----------------------------------------------------------------------------- +void ValueSchedule::ReadXML +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _commandClassId, + TiXmlElement const* _valueElement +) +{ + Value::ReadXML( _homeId, _nodeId, _commandClassId, _valueElement ); + + // Read in the switch points + TiXmlElement const* child = _valueElement->FirstChildElement(); + while( child ) + { + char const* str = child->Value(); + if( str ) + { + if( !strcmp( str, "SwitchPoint" ) ) + { + int intVal; + + uint8 hours = 0; + if( TIXML_SUCCESS == child->QueryIntAttribute( "hours", &intVal ) ) + { + hours = (uint8)intVal; + } + + uint8 minutes = 0; + if( TIXML_SUCCESS == child->QueryIntAttribute( "minutes", &intVal ) ) + { + minutes = (uint8)intVal; + } + + int8 setback = 0; + if( TIXML_SUCCESS == child->QueryIntAttribute( "setback", &intVal ) ) + { + setback = (int8)intVal; + } + + SetSwitchPoint( hours, minutes, setback ); + } + } + + child = child->NextSiblingElement(); + } +} + +//----------------------------------------------------------------------------- +// +// Write ourselves to an XML document +//----------------------------------------------------------------------------- +void ValueSchedule::WriteXML +( + TiXmlElement* _valueElement +) +{ + Value::WriteXML( _valueElement ); + + for( uint8 i=0; iLinkEndChild( switchPointElement ); + + snprintf( str, sizeof(str), "%d", hours ); + switchPointElement->SetAttribute( "hours", str ); + + snprintf( str, sizeof(str), "%d", minutes ); + switchPointElement->SetAttribute( "minutes", str ); + + snprintf( str, sizeof(str), "%d", setback ); + switchPointElement->SetAttribute( "setback", str ); + } + } +} + +//----------------------------------------------------------------------------- +// +// Set a new value in the device +//----------------------------------------------------------------------------- +bool ValueSchedule::Set +( +) +{ + // Set the value in the device. + // TODO this needs to be checked to make sure it works as intended + return Value::Set(); +} + +//----------------------------------------------------------------------------- +// +// A value in a device has been refreshed +//----------------------------------------------------------------------------- +void ValueSchedule::OnValueRefreshed +( +) +{ + // TODO: do schedules ever report spurious values and need rechecking like other value types? + // See, for example, ValueShort::OnValueRefreshed + Value::OnValueChanged(); +} + +//----------------------------------------------------------------------------- +// +// A value in a device has changed +//----------------------------------------------------------------------------- +bool ValueSchedule::SetSwitchPoint +( + uint8 const _hours, uint8 const _minutes, int8 const _setback +) +{ + // Find where to insert this switch point. They must be sorted by ascending time value. + uint8 i; + uint8 insertAt = 0; + + for( i=0; i _minutes ) + { + break; + } + } + else if( m_switchPoints[i].m_hours > _hours ) + { + break; + } + + ++insertAt; + } + + if( m_numSwitchPoints >= 9 ) + { + // The schedule is full + return false; + } + + // Shuffle any later switch points out of the way + for( i=m_numSwitchPoints; i>insertAt; --i ) + { + m_switchPoints[i].m_hours = m_switchPoints[i-1].m_hours; + m_switchPoints[i].m_minutes = m_switchPoints[i-1].m_minutes; + m_switchPoints[i].m_setback = m_switchPoints[i-1].m_setback; + } + + // Insert the new switch point + m_switchPoints[insertAt].m_hours = _hours; + m_switchPoints[insertAt].m_minutes = _minutes; + m_switchPoints[insertAt].m_setback = _setback; + + ++m_numSwitchPoints; + return true; +} + +//----------------------------------------------------------------------------- +// +// A value in a device has changed +//----------------------------------------------------------------------------- +bool ValueSchedule::RemoveSwitchPoint +( + uint8 const _idx +) +{ + if( _idx >= m_numSwitchPoints ) + { + // _idx is out of range + return false; + } + + // Shuffle any later switch points down to fill the gap + for( uint8 i=_idx; i<(m_numSwitchPoints-1); ++i ) + { + m_switchPoints[i].m_hours = m_switchPoints[i+1].m_hours; + m_switchPoints[i].m_minutes = m_switchPoints[i+1].m_minutes; + m_switchPoints[i].m_setback = m_switchPoints[i+1].m_setback; + } + + --m_numSwitchPoints; + return true; +} + +//----------------------------------------------------------------------------- +// +// Get the values of a switch point +//----------------------------------------------------------------------------- +bool ValueSchedule::GetSwitchPoint +( + uint8 const _idx, + uint8* o_hours, + uint8* o_minutes, + int8* o_setback +)const +{ + if( _idx >= m_numSwitchPoints ) + { + // _idx is out of range + return false; + } + + if( o_hours ) + { + *o_hours = m_switchPoints[_idx].m_hours; + } + + if( o_minutes ) + { + *o_minutes = m_switchPoints[_idx].m_minutes; + } + + if( o_setback ) + { + *o_setback = m_switchPoints[_idx].m_setback; + } + + return true; +} + +//----------------------------------------------------------------------------- +// +// Get the index of the switch point at the specified time +//----------------------------------------------------------------------------- +bool ValueSchedule::FindSwitchPoint +( + uint8 const _hours, + uint8 const _minutes, + uint8* o_idx +)const +{ + for( uint8 i=0; i _minutes ) + { + // Gone past any possible match + return false; + } + } + else if( m_switchPoints[i].m_hours > _hours ) + { + // Gone past any possible match + return false; + } + } + + // No match found + return false; +} + diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueSchedule.h b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueSchedule.h new file mode 100644 index 0000000..89ccdba --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueSchedule.h @@ -0,0 +1,79 @@ +//----------------------------------------------------------------------------- +// +// ValueSchedule.h +// +// A one day schedule for the Climate Control Schedule command class +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ValueSchedule_H +#define _ValueSchedule_H + +#include +#include "../Defs.h" +#include "Value.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class Msg; + class Node; + + /** \brief Schedule sent to/received from a node. + */ + class ValueSchedule: public Value + { + public: + ValueSchedule( uint32 const _homeId, uint8 const _nodeId, ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _index, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, uint8 const _pollIntensity ); + ValueSchedule(); + virtual ~ValueSchedule(){} + + bool SetSwitchPoint( uint8 const _hours, uint8 const _minutes, int8 const _setback ); + bool RemoveSwitchPoint( uint8 const _idx ); + void ClearSwitchPoints(){ m_numSwitchPoints = 0; } + bool GetSwitchPoint( uint8 const _idx, uint8* o_hours, uint8* o_minutes, int8* o_setback )const; + bool FindSwitchPoint( uint8 const _hours, uint8 const _minutes, uint8* o_idx )const; + uint8 GetNumSwitchPoints()const{ return m_numSwitchPoints; } + + bool Set(); + void OnValueRefreshed(); + + // From Value + virtual void ReadXML( uint32 const _homeId, uint8 const _nodeId, uint8 const _commandClassId, TiXmlElement const* _valueElement ); + virtual void WriteXML( TiXmlElement* _valueElement ); + + private: + struct SwitchPoint + { + uint8 m_hours; + uint8 m_minutes; + int8 m_setback; + }; + + SwitchPoint m_switchPoints[9]; + uint8 m_numSwitchPoints; + }; + +} // namespace OpenZWave + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueShort.cpp b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueShort.cpp new file mode 100644 index 0000000..be563e0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueShort.cpp @@ -0,0 +1,191 @@ +//----------------------------------------------------------------------------- +// +// ValueShort.cpp +// +// Represents a 16-bit value +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include +#include +#include "../tinyxml.h" +#include "ValueShort.h" +#include "../Msg.h" +#include "../platform/Log.h" +#include "../Manager.h" +#include + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ValueShort::ValueShort +( + uint32 const _homeId, + uint8 const _nodeId, + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _index, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + int16 const _value, + uint8 const _pollIntensity +): + Value( _homeId, _nodeId, _genre, _commandClassId, _instance, _index, ValueID::ValueType_Byte, _label, _units, _readOnly, _writeOnly, false, _pollIntensity ), + m_value( _value ), + m_valueCheck( 0 ), + m_newValue( 0 ) +{ + m_min = SHRT_MIN; + m_max = SHRT_MAX; +} + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ValueShort::ValueShort +( +): + Value(), + m_value( 0 ), + m_valueCheck( 0 ), + m_newValue( 0 ) +{ + m_min = SHRT_MIN; + m_max = SHRT_MAX; +} + +string const ValueShort::GetAsString +( +) const +{ + stringstream ss; + ss << GetValue(); + return ss.str(); +} + +bool ValueShort::SetFromString +( + string const& _value +) +{ + uint32 val = (uint32)atoi( _value.c_str() ); + if( val < 32768 ) + { + return Set( (int16)val ); + } + return false; +} + +//----------------------------------------------------------------------------- +// +// Apply settings from XML +//----------------------------------------------------------------------------- +void ValueShort::ReadXML +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _commandClassId, + TiXmlElement const* _valueElement +) +{ + Value::ReadXML( _homeId, _nodeId, _commandClassId, _valueElement ); + + int intVal; + if( TIXML_SUCCESS == _valueElement->QueryIntAttribute( "value", &intVal ) ) + { + m_value = (int16)intVal; + } + else + { + Log::Write( LogLevel_Info, "Missing default short value from xml configuration: node %d, class 0x%02x, instance %d, index %d", _nodeId, _commandClassId, GetID().GetInstance(), GetID().GetIndex() ); + } +} + +//----------------------------------------------------------------------------- +// +// Write ourselves to an XML document +//----------------------------------------------------------------------------- +void ValueShort::WriteXML +( + TiXmlElement* _valueElement +) +{ + Value::WriteXML( _valueElement ); + + char str[16]; + snprintf( str, sizeof(str), "%d", m_value ); + _valueElement->SetAttribute( "value", str ); +} + +//----------------------------------------------------------------------------- +// +// Set a new value in the device +//----------------------------------------------------------------------------- +bool ValueShort::Set +( + int16 const _value +) +{ + // create a temporary copy of this value to be submitted to the Set() call and set its value to the function param + ValueShort* tempValue = new ValueShort( *this ); + tempValue->m_value = _value; + + // Set the value in the device. + bool ret = ((Value*)tempValue)->Set(); + + // clean up the temporary value + delete tempValue; + + return ret; +} + +//----------------------------------------------------------------------------- +// +// A value in a device has been refreshed +//----------------------------------------------------------------------------- +void ValueShort::OnValueRefreshed +( + int16 const _value +) +{ + switch( VerifyRefreshedValue( (void*) &m_value, (void*) &m_valueCheck, (void*) &_value, 2) ) + { + case 0: // value hasn't changed, nothing to do + break; + case 1: // value has changed (not confirmed yet), save _value in m_valueCheck + m_valueCheck = _value; + break; + case 2: // value has changed (confirmed), save _value in m_value + m_value = _value; + break; + case 3: // all three values are different, so wait for next refresh to try again + break; + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueShort.h b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueShort.h new file mode 100644 index 0000000..17a246d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueShort.h @@ -0,0 +1,70 @@ +//----------------------------------------------------------------------------- +// +// ValueShort.h +// +// Represents a 16-bit value +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ValueShort_H +#define _ValueShort_H + +#include +#include "../Defs.h" +#include "Value.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class Msg; + class Node; + + /** \brief Short value sent to/received from a node. + */ + class ValueShort: public Value + { + public: + ValueShort( uint32 const _homeId, uint8 const _nodeId, ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _index, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, int16 const _value, uint8 const _pollIntensity ); + ValueShort(); + virtual ~ValueShort(){} + + bool Set( int16 const _value ); + void OnValueRefreshed( int16 const _value ); + + // From Value + virtual string const GetAsString() const; + virtual bool SetFromString( string const& _value ); + virtual void ReadXML( uint32 const _homeId, uint8 const _nodeId, uint8 const _commandClassId, TiXmlElement const* _valueElement ); + virtual void WriteXML( TiXmlElement* _valueElement ); + + int16 GetValue()const{ return m_value; } + + private: + int16 m_value; // the current value + int16 m_valueCheck; // the previous value (used for double-checking spurious value reads) + int16 m_newValue; // a new value to be set on the appropriate device + }; + +} // namespace OpenZWave + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueStore.cpp b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueStore.cpp new file mode 100644 index 0000000..d7393e9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueStore.cpp @@ -0,0 +1,204 @@ +//----------------------------------------------------------------------------- +// +// ValueStore.cpp +// +// Container for Value objects +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "ValueStore.h" +#include "Value.h" +#include "../Manager.h" +#include "../Notification.h" + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Destructor +//----------------------------------------------------------------------------- +ValueStore::~ValueStore +( +) +{ + map::iterator it = m_values.begin(); + while( !m_values.empty() ) + { + ValueID const& valueId = it->second->GetID(); + RemoveValue( valueId.GetValueStoreKey() ); + it = m_values.begin(); + } +} + +//----------------------------------------------------------------------------- +// +// Add a value to the store +//----------------------------------------------------------------------------- +bool ValueStore::AddValue +( + Value* _value +) +{ + if( !_value ) + { + return false; + } + + uint32 key = _value->GetID().GetValueStoreKey(); + map::iterator it = m_values.find( key ); + if( it != m_values.end() ) + { + // There is already a value in the store with this key, so we give up. + return false; + } + + m_values[key] = _value; + _value->AddRef(); + + // Notify the watchers of the new value + if( Driver* driver = Manager::Get()->GetDriver( _value->GetID().GetHomeId() ) ) + { + Notification* notification = new Notification( Notification::Type_ValueAdded ); + notification->SetValueId( _value->GetID() ); + driver->QueueNotification( notification ); + } + + return true; +} + +//----------------------------------------------------------------------------- +// +// Remove a value from the store +//----------------------------------------------------------------------------- +bool ValueStore::RemoveValue +( + uint32 const& _key +) +{ + map::iterator it = m_values.find( _key ); + if( it != m_values.end() ) + { + Value* value = it->second; + ValueID const& valueId = value->GetID(); + + // First notify the watchers + if( Driver* driver = Manager::Get()->GetDriver( valueId.GetHomeId() ) ) + { + Notification* notification = new Notification( Notification::Type_ValueRemoved ); + notification->SetValueId( valueId ); + driver->QueueNotification( notification ); + } + + // Now release and remove the value from the store + value->Release(); + m_values.erase( it ); + + return true; + } + + // Value not found in the store + return false; +} + +////----------------------------------------------------------------------------- +//// +//// Remove a value from the store +////----------------------------------------------------------------------------- +//bool ValueStore::RemoveValue +//( +// ValueID const& _id +//) + + +//----------------------------------------------------------------------------- +// +// Remove all the values associated with a command class from the store +//----------------------------------------------------------------------------- +void ValueStore::RemoveCommandClassValues +( + uint8 const _commandClassId +) +{ + map::iterator it = m_values.begin(); + while( it != m_values.end() ) + { + Value* value = it->second; + ValueID const& valueId = value->GetID(); + if( _commandClassId == valueId.GetCommandClassId() ) + { + // The value belongs to the specified command class + + // First notify the watchers + if( Driver* driver = Manager::Get()->GetDriver( valueId.GetHomeId() ) ) + { + Notification* notification = new Notification( Notification::Type_ValueRemoved ); + notification->SetValueId( valueId ); + driver->QueueNotification( notification ); + } + + // Now release and remove the value from the store + value->Release(); + m_values.erase( it++ ); + } + else + { + ++it; + } + } +} + +//----------------------------------------------------------------------------- +// +// Get a value from the store +//----------------------------------------------------------------------------- +Value* ValueStore::GetValue +( + uint32 const& _key +)const +{ + Value* value = NULL; + + map::const_iterator it = m_values.find( _key ); + if( it != m_values.end() ) + { + value = it->second; + if( value ) + { + // Add a reference to the value. The caller must + // call Release on the value when they are done with it. + value->AddRef(); + } + } + + return value; +} + +////----------------------------------------------------------------------------- +//// +//// Get a value from the store +////----------------------------------------------------------------------------- +//Value* ValueStore::GetValue +//( +// ValueID const& _id +//)const + diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueStore.h b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueStore.h new file mode 100644 index 0000000..81f0967 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueStore.h @@ -0,0 +1,70 @@ +//----------------------------------------------------------------------------- +// +// ValueStore.h +// +// Container for Value objects +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ValueStore_H +#define _ValueStore_H + +#include +#include "../Defs.h" +#include "ValueID.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class Value; + + /** \brief Container that holds all of the values associated with a given node. + */ + class ValueStore + { + public: + + typedef map::const_iterator Iterator; + + Iterator Begin(){ return m_values.begin(); } + Iterator End(){ return m_values.end(); } + + ValueStore(){} + ~ValueStore(); + + bool AddValue( Value* _value ); + bool RemoveValue( uint32 const& _key ); + Value* GetValue( uint32 const& _key )const; + + void RemoveCommandClassValues( uint8 const _commandClassId ); // Remove all the values associated with a command class + + private: + map m_values; + }; + +} // namespace OpenZWave + +#endif + + + diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueString.cpp b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueString.cpp new file mode 100644 index 0000000..d7295fa --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueString.cpp @@ -0,0 +1,145 @@ +//----------------------------------------------------------------------------- +// +// ValueStore.cpp +// +// Represents a string value +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#include "../tinyxml.h" +#include "ValueString.h" +#include "../Msg.h" +#include "../platform/Log.h" +#include "../Manager.h" + +using namespace OpenZWave; + + +//----------------------------------------------------------------------------- +// +// Constructor +//----------------------------------------------------------------------------- +ValueString::ValueString +( + uint32 const _homeId, + uint8 const _nodeId, + ValueID::ValueGenre const _genre, + uint8 const _commandClassId, + uint8 const _instance, + uint8 const _index, + string const& _label, + string const& _units, + bool const _readOnly, + bool const _writeOnly, + string const& _value, + uint8 const _pollIntensity +): + Value( _homeId, _nodeId, _genre, _commandClassId, _instance, _index, ValueID::ValueType_String, _label, _units, _readOnly, _writeOnly, false, _pollIntensity ), + m_value( _value ), + m_valueCheck( "" ), + m_newValue( "" ) +{ +} + +//----------------------------------------------------------------------------- +// +// Apply settings from XML +//----------------------------------------------------------------------------- +void ValueString::ReadXML +( + uint32 const _homeId, + uint8 const _nodeId, + uint8 const _commandClassId, + TiXmlElement const* _valueElement +) +{ + Value::ReadXML( _homeId, _nodeId, _commandClassId, _valueElement ); + + char const* str = _valueElement->Attribute( "value" ); + if( str ) + { + m_value = str; + } + else + { + Log::Write( LogLevel_Alert, "Missing default string value from xml configuration: node %d, class 0x%02x, instance %d, index %d", _nodeId, _commandClassId, GetID().GetInstance(), GetID().GetIndex() ); + } +} + +//----------------------------------------------------------------------------- +// +// Write ourselves to an XML document +//----------------------------------------------------------------------------- +void ValueString::WriteXML +( + TiXmlElement* _valueElement +) +{ + Value::WriteXML( _valueElement ); + _valueElement->SetAttribute( "value", m_value.c_str() ); +} + +//----------------------------------------------------------------------------- +// +// Set a new value in the device and queue a "RequestValue" to confirm it worked +//----------------------------------------------------------------------------- +bool ValueString::Set +( + string const& _value +) +{ + // create a temporary copy of this value to be submitted to the Set() call and set its value to the function param + ValueString* tempValue = new ValueString( *this ); + tempValue->m_value = _value; + + // Set the value in the device. + bool ret = ((Value*)tempValue)->Set(); + + // clean up the temporary value + delete tempValue; + + return ret; +} + +//----------------------------------------------------------------------------- +// +// A value in a device has been refreshed +//----------------------------------------------------------------------------- +void ValueString::OnValueRefreshed +( + string const& _value +) +{ + switch( VerifyRefreshedValue( (void*) &m_value, (void*) &m_valueCheck, (void*) &_value, 1) ) + { + case 0: // value hasn't changed, nothing to do + break; + case 1: // value has changed (not confirmed yet), save _value in m_valueCheck + m_valueCheck = _value; + break; + case 2: // value has changed (confirmed), save _value in m_value + m_value = _value; + break; + case 3: // all three values are different, so wait for next refresh to try again + break; + } +} diff --git a/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueString.h b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueString.h new file mode 100644 index 0000000..b52c5cf --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/value_classes/ValueString.h @@ -0,0 +1,70 @@ +//----------------------------------------------------------------------------- +// +// ValueString.h +// +// Represents a string value +// +// Copyright (c) 2010 Mal Lansell +// +// SOFTWARE NOTICE AND LICENSE +// +// This file is part of OpenZWave. +// +// OpenZWave is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation, either version 3 of the License, +// or (at your option) any later version. +// +// OpenZWave is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with OpenZWave. If not, see . +// +//----------------------------------------------------------------------------- + +#ifndef _ValueString_H +#define _ValueString_H + +#include +#include "../Defs.h" +#include "Value.h" + +class TiXmlElement; + +namespace OpenZWave +{ + class Msg; + class Node; + + /** \brief String value sent to/received from a node. + */ + class ValueString: public Value + { + public: + ValueString( uint32 const _homeId, uint8 const _nodeId, ValueID::ValueGenre const _genre, uint8 const _commandClassId, uint8 const _instance, uint8 const _index, string const& _label, string const& _units, bool const _readOnly, bool const _writeOnly, string const& _value, uint8 const _pollIntensity ); + ValueString(){} + virtual ~ValueString(){} + + bool Set( string const& _value ); + void OnValueRefreshed( string const& _value ); + + // From Value + virtual string const GetAsString() const { return GetValue(); } + virtual bool SetFromString( string const& _value ) { return Set( _value ); } + virtual void ReadXML( uint32 const _homeId, uint8 const _nodeId, uint8 const _commandClassId, TiXmlElement const* _valueElement ); + virtual void WriteXML( TiXmlElement* _valueElement ); + + string GetValue()const{ return m_value; } + + private: + string m_value; // the current value + string m_valueCheck; // the previous value (used for double-checking spurious value reads) + string m_newValue; // a new value to be set on the appropriate device + }; + +} // namespace OpenZWave + +#endif diff --git a/lib/ESPiLight/pilight/libs/openzwave/vers.cpp b/lib/ESPiLight/pilight/libs/openzwave/vers.cpp new file mode 100644 index 0000000..dcb556c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/openzwave/vers.cpp @@ -0,0 +1,4 @@ +#include "Defs.h" +uint16_t ozw_vers_major = 1; +uint16_t ozw_vers_minor = 2; +uint16_t ozw_vers_revision = 919; diff --git a/lib/ESPiLight/pilight/libs/pilight/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/CMakeLists.txt new file mode 100644 index 0000000..0888694 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/CMakeLists.txt @@ -0,0 +1,36 @@ +project(pilight) + +include(../../CMakeConfig.txt) + +if(${MODULESPACK} MATCHES "OFF" OR WIN32) + set(${PROJECT_NAME}_files "" CACHE INTERNAL "") + + add_subdirectory(core) + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_files} ${${PROJECT_NAME}_core_files} CACHE INTERNAL "") + + add_subdirectory(config) + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_files} ${${PROJECT_NAME}_config_files} CACHE INTERNAL "") + + add_subdirectory(datatypes) + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_files} ${${PROJECT_NAME}_datatypes_files} CACHE INTERNAL "") + + if(${EVENTS} MATCHES "ON") + add_subdirectory(events) + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_files} ${${PROJECT_NAME}_events_files} CACHE INTERNAL "") + endif() + + add_subdirectory(protocols) + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_files} ${${PROJECT_NAME}_protocols_files} CACHE INTERNAL "") + + add_subdirectory(hardware) + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_files} ${${PROJECT_NAME}_hardware_files} CACHE INTERNAL "") + + add_subdirectory(lua) + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_files} ${${PROJECT_NAME}_lua_files} CACHE INTERNAL "") +else() + if(${EVENTS} MATCHES "ON") + add_subdirectory(events) + endif() + add_subdirectory(protocols) + add_subdirectory(hardware) +endif() diff --git a/lib/ESPiLight/pilight/libs/pilight/config/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/config/CMakeLists.txt new file mode 100644 index 0000000..07c618a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/config/CMakeLists.txt @@ -0,0 +1,6 @@ +project(pilight_config) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/config/devices.c b/lib/ESPiLight/pilight/libs/pilight/config/devices.c new file mode 100644 index 0000000..c4095ca --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/config/devices.c @@ -0,0 +1,1771 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #include +#endif +#include +#include +#include + +#include "../core/threads.h" +#include "../core/common.h" +#include "../core/log.h" +#include "../core/options.h" +#include "../core/config.h" +#include "../core/ssdp.h" +#include "../core/firmware.h" +#include "../core/datetime.h" + +#include "../protocols/protocol.h" + +#include "defines.h" +#include "devices.h" +#include "gui.h" + +static pthread_mutex_t mutex_lock; +static pthread_mutexattr_t mutex_attr; + +struct config_t *config_devices; + +/* Struct to store the locations */ +static struct devices_t *devices = NULL; + +int devices_update(char *protoname, JsonNode *json, enum origin_t origin, JsonNode **out) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + /* The pointer to the devices devices */ + struct devices_t *dptr = devices; + /* The pointer to the device settings */ + struct devices_settings_t *sptr = NULL; + /* The pointer to the device settings */ + struct devices_values_t *vptr = NULL; + /* The pointer to the registered protocols */ + struct protocol_t *protocol = NULL; + /* The pointer to the protocol options */ + struct options_t *opt = NULL; + /* Get the message part of the sended code */ + JsonNode *message = json_find_member(json, "message"); + /* Get the settings part of the sended code */ + JsonNode *settings = json_find_member(json, "settings"); + /* The return JSON object will all updated devices */ + JsonNode *rroot = json_mkobject(); + JsonNode *rdev = json_mkarray(); + JsonNode *rval = json_mkobject(); + + /* Temporarily char pointer */ + char *stmp = NULL; + /* Temporarily int */ + double itmp; + /* Do we need to update the devices file */ + unsigned short update = 0; + /* The new state value */ + char vstring_[255]; + double vnumber_ = -1; + int vdecimals_ = 0; + char sstring_[255]; + double snumber_ = -1; + int sdecimals_ = 0; + int stateType = 0; + int valueType = 0; + /* The UUID of this device */ + char *uuid = NULL; + + /* Make sure the character pointers are empty */ + memset(sstring_, '\0', sizeof(sstring_)); + memset(vstring_, '\0', sizeof(vstring_)); + + /* Check if the found settings matches the send code */ + unsigned int match = 0, match1 = 0, match2 = 0; + + /* Is is a valid new state / value */ + int is_valid = 1; + + /* Retrieve the used protocol */ + struct protocols_t *pnode = protocols; + while(pnode) { + protocol = pnode->listener; + if(strcmp(protocol->id, protoname) == 0) { + break; + } + pnode = pnode->next; + } + + time_t timenow = time(NULL); + struct tm gmt; + memset(&gmt, '\0', sizeof(struct tm)); +#ifdef _WIN32 + struct tm *tm; + tm = gmtime(&timenow); + memcpy(&gmt, tm, sizeof(struct tm)); +#else + gmtime_r(&timenow, &gmt); +#endif + time_t utct = datetime2ts(gmt.tm_year+1900, gmt.tm_mon+1, gmt.tm_mday, gmt.tm_hour, gmt.tm_min, gmt.tm_sec); + json_append_member(rval, "timestamp", json_mknumber((double)utct, 0)); + + json_find_string(json, "uuid", &uuid); + + if((opt = protocol->options)) { + /* Loop through all devices */ + + while(dptr) { + /* + * uuid = The UUID of the pilight instance that received the specific information. + * pilight_uuid = The UUID of the currently running pilight instance this function was called on. + * dev_uuid = The UUID of the device set by the user or the UUID of pilight instance that read the config. + * ori_uuid = The UUID of the pilight instance that parsed the config (mostly the master). + * cst_uuid = The UUID manually set the UUID of these devices + * + */ + int uuidmatch = 0; + if(uuid != NULL && dptr->dev_uuid != NULL && dptr->ori_uuid != NULL && strlen(pilight_uuid) > 0) { + if(dptr->cst_uuid == 1) { + /* If the user forced the device UUID and it matches the UUID of the recieved code */ + if(strcmp(dptr->dev_uuid, uuid) == 0) { + uuidmatch = 1; + } + } else { + uuidmatch = 1; + } + } else if(uuid == NULL || strlen(pilight_uuid) == 0) { + uuidmatch = 1; + } + if(uuidmatch == 1) { + struct protocols_t *tmp_protocols = dptr->protocols; + match = 0; + while(tmp_protocols) { + if(protocol_device_exists(protocol, tmp_protocols->name) == 0) { + match = 1; + break; + } + tmp_protocols = tmp_protocols->next; + } + + if(match == 1) { + sptr = dptr->settings; + /* Loop through all settings */ + while(sptr) { + match1 = 0; match2 = 0; + + /* Check how many id's we need to match */ + opt = protocol->options; + while(opt) { + if(opt->conftype == DEVICES_ID) { + JsonNode *jtmp = json_first_child(message); + while(jtmp) { + if(strcmp(jtmp->key, opt->name) == 0) { + match1++; + } + jtmp = jtmp->next; + } + } + opt = opt->next; + } + + /* Loop through all protocol options */ + opt = protocol->options; + while(opt) { + if(opt->conftype == DEVICES_ID && strcmp(sptr->name, "id") == 0) { + /* Check the devices id's to match a device */ + vptr = sptr->values; + while(vptr) { + if(strcmp(vptr->name, opt->name) == 0) { + if(json_find_string(message, opt->name, &stmp) == 0 && + vptr->type == JSON_STRING && + strcmp(stmp, vptr->string_) == 0) { + match2++; + } + if(json_find_number(message, opt->name, &itmp) == 0 && + vptr->type == JSON_NUMBER && + fabs(vptr->number_-itmp) < EPSILON) { + match2++; + } + } + vptr = vptr->next; + } + } + + /* Retrieve the new device state */ + if(opt->conftype == DEVICES_STATE) { + if(opt->argtype == OPTION_NO_VALUE) { + if(json_find_string(message, "state", &stmp) == 0) { + strcpy(sstring_, stmp); + stateType = JSON_STRING; + } + if(json_find_number(message, "state", &itmp) == 0) { + snumber_ = itmp; + stateType = JSON_NUMBER; + } + } else if(opt->argtype == OPTION_HAS_VALUE) { + if(json_find_string(message, opt->name, &stmp) == 0) { + strcpy(sstring_, stmp); + stateType = JSON_STRING; + } + struct JsonNode *jtmp = NULL; + if((jtmp = json_find_member(message, opt->name)) != NULL && + jtmp->tag == JSON_NUMBER) { + snumber_ = jtmp->number_; + sdecimals_ = jtmp->decimals_; + stateType = JSON_NUMBER; + } + } + } + opt = opt->next; + } + if(match1 > 0 && match2 > 0 && match1 == match2) { + break; + } + sptr = sptr->next; + } + is_valid = 1; + + /* If we matched a device, update it's state */ + if(match1 > 0 && match2 > 0 && match1 == match2) { + if(protocol->checkValues) { + is_valid = 0; + JsonNode *jcode = json_mkobject(); + sptr = dptr->settings; + while(sptr) { + opt = protocol->options; + /* Loop through all protocol options */ + while(opt) { + /* Check if there are values that can be updated */ + if(strcmp(sptr->name, opt->name) == 0 + && (opt->conftype == DEVICES_VALUE || opt->conftype == DEVICES_OPTIONAL) + && opt->argtype == OPTION_HAS_VALUE) { + memset(vstring_, '\0', sizeof(vstring_)); + vnumber_ = -1; + if(json_find_string(message, opt->name, &stmp) == 0) { + strcpy(vstring_, stmp); + valueType = JSON_STRING; + is_valid = 1; + } + struct JsonNode *jtmp = NULL; + if((jtmp = json_find_member(message, opt->name)) != NULL && + jtmp->tag == JSON_NUMBER) { + vnumber_ = jtmp->number_; + vdecimals_ = jtmp->decimals_; + valueType = JSON_NUMBER; + is_valid = 1; + } + + /* Check if the protocol settings of this device are valid to + make sure no errors occur in the config.json. */ + JsonNode *jsettings = json_first_child(settings); + while(jsettings) { + if(jsettings->tag == JSON_NUMBER) { + json_append_member(jcode, jsettings->key, json_mknumber(jsettings->number_, jsettings->decimals_)); + } else if(jsettings->tag == JSON_STRING) { + json_append_member(jcode, jsettings->key, json_mkstring(jsettings->string_)); + } + jsettings = jsettings->next; + } + if(valueType == JSON_STRING) { + json_append_member(jcode, opt->name, json_mkstring(vstring_)); + } else { + json_append_member(jcode, opt->name, json_mknumber(vnumber_, vdecimals_)); + } + } + opt = opt->next; + } + sptr = sptr->next; + } + if(protocol->checkValues(jcode) != 0) { + is_valid = 0; + } + json_delete(jcode); + } + + sptr = dptr->settings; + while(sptr) { + opt = protocol->options; + /* Loop through all protocol options */ + while(opt) { + /* Check if there are values that can be updated */ + if(strcmp(sptr->name, opt->name) == 0 + && (opt->conftype == DEVICES_VALUE || opt->conftype == DEVICES_OPTIONAL) + && opt->argtype == OPTION_HAS_VALUE) { + int upd_value = 1; + memset(vstring_, '\0', sizeof(vstring_)); + vnumber_ = -1; + vdecimals_ = 0; + struct JsonNode *jtmp = NULL; + if(json_find_string(message, opt->name, &stmp) == 0) { + strcpy(vstring_, stmp); + valueType = JSON_STRING; + } else if((jtmp = json_find_member(message, opt->name)) != NULL && + jtmp->tag == JSON_NUMBER) { + vnumber_ = jtmp->number_; + vdecimals_ = jtmp->decimals_; + valueType = JSON_NUMBER; + } else { + upd_value = 0; + } + + if(is_valid == 1 && upd_value == 1) { + if(valueType == JSON_STRING && + strlen(vstring_) > 0 && + sptr->values->type == JSON_STRING && + strcmp(sptr->values->string_, vstring_) != 0) { + if((sptr->values->string_ = REALLOC(sptr->values->string_, strlen(vstring_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(sptr->values->string_, vstring_); + sptr->values->type = JSON_STRING; + } else if(valueType == JSON_NUMBER && + sptr->values->type == JSON_NUMBER && + fabs(sptr->values->number_-vnumber_) >= EPSILON) { + sptr->values->number_ = vnumber_; + sptr->values->decimals = vdecimals_; + sptr->values->type = JSON_NUMBER; + } + if(sptr->values->type == JSON_STRING && json_find_string(rval, sptr->name, &stmp) != 0) { + json_append_member(rval, sptr->name, json_mkstring(sptr->values->string_)); + update = 1; + } else if(sptr->values->type == JSON_NUMBER && json_find_number(rval, sptr->name, &itmp) != 0) { + json_append_member(rval, sptr->name, json_mknumber(sptr->values->number_, sptr->values->decimals)); + update = 1; + } + dptr->timestamp = utct; + } + //break; + } + opt = opt->next; + } + + /* Check if we need to update the state */ + if(strcmp(sptr->name, "state") == 0) { + if((stateType == JSON_STRING && + sptr->values->type == JSON_STRING && + strcmp(sptr->values->string_, sstring_) != 0)) { + if((sptr->values->string_ = REALLOC(sptr->values->string_, strlen(sstring_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(sptr->values->string_, sstring_); + sptr->values->type = JSON_STRING; + dptr->timestamp = utct; + update = 1; + } else if((stateType == JSON_NUMBER && + sptr->values->type == JSON_NUMBER && + fabs(sptr->values->number_-snumber_) < EPSILON)) { + sptr->values->number_ = snumber_; + sptr->values->decimals = sdecimals_; + sptr->values->type = JSON_NUMBER; + dptr->timestamp = utct; + update = 1; + } + if(sptr->values->type == JSON_STRING && json_find_string(rval, sptr->name, &stmp) != 0) { + json_append_member(rval, sptr->name, json_mkstring(sptr->values->string_)); + } else if(sptr->values->type == JSON_NUMBER && json_find_number(rval, sptr->name, &itmp) != 0) { + json_append_member(rval, sptr->name, json_mknumber(sptr->values->number_, sptr->values->decimals)); + } + //break; + } + if(update == 1) { + match = 0; + struct JsonNode *jchild = json_first_child(rdev); + while(jchild) { + if(jchild->tag == JSON_STRING && strcmp(dptr->id, jchild->string_) == 0) { + match = 1; + break; + } + jchild = jchild->next; + } + if(match == 0) { + dptr->prevorigin = dptr->lastorigin; + dptr->lastorigin = origin; +#ifdef EVENTS + /* + * If the action itself it not triggering a device update, something + * else is. We therefor need to abort the running action to let + * the new state persist. + */ + if(dptr->action_thread->running == 1 && origin != ACTION) { + /* + * In case of Z-Wave, the ACTION is always followed by a RECEIVER origin due to + * its feedback feature. We do not want to abort or action in these cases. + */ + if(!((dptr->protocols->listener->hwtype == ZWAVE) && dptr->lastorigin == RECEIVER && dptr->prevorigin == ACTION) || + dptr->protocols->listener->hwtype != ZWAVE) { + event_action_thread_stop(dptr); + } + } + + /* + * We store the rule number that triggered the device change. + * The eventing library can then check if the same rule is + * triggered again so infinite loops can be prevented. + */ + if(origin == ACTION) { + if(dptr->action_thread->obj != NULL) { + dptr->prevrule = dptr->lastrule; + dptr->lastrule = dptr->action_thread->obj->rule->nr; + } + } else { + dptr->lastrule = -1; + dptr->prevrule = -1; + } +#endif + json_append_element(rdev, json_mkstring(dptr->id)); + } + } + sptr = sptr->next; + } + } + } + } + dptr = dptr->next; + } + } + + if(update == 1) { + json_append_member(rroot, "origin", json_mkstring("update")); + json_append_member(rroot, "type", json_mknumber((int)protocol->devtype, 0)); + //if(strlen(pilight_uuid) > 0 && (protocol->hwtype == SENSOR || protocol->hwtype == HWRELAY)) { + json_append_member(rroot, "uuid", json_mkstring(pilight_uuid)); + //} + json_append_member(rroot, "devices", rdev); + json_append_member(rroot, "values", rval); + + *out = rroot; + } else { + json_delete(rdev); + json_delete(rval); + json_delete(rroot); + } + + return (update == 1) ? 0 : -1; +} + +int devices_get(char *sid, struct devices_t **dev) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct devices_t *dptr = NULL; + + dptr = devices; + while(dptr) { + if(strcmp(dptr->id, sid) == 0) { + if(dev != NULL) { + *dev = dptr; + } + return 0; + } + dptr = dptr->next; + } + + return 1; +} + +int devices_valid_state(char *sid, char *state) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct devices_t *dptr = NULL; + struct protocol_t *protocol = NULL; + struct options_t *options = NULL; + struct protocols_t *tmp_protocol = NULL; + + if(devices_get(sid, &dptr) == 0) { + tmp_protocol = dptr->protocols; + while(tmp_protocol) { + protocol = tmp_protocol->listener; + if(protocol->options) { + options = protocol->options; + while(options) { + if(strcmp(options->name, state) == 0 && options->conftype == DEVICES_STATE) { + return 0; + break; + } + options = options->next; + } + } + tmp_protocol = tmp_protocol->next; + } + } + return 1; +} + +int devices_valid_value(char *sid, char *name, char *value) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct devices_t *dptr = NULL; + struct options_t *opt = NULL; + struct protocols_t *tmp_protocol = NULL; +#if !defined(__FreeBSD__) && !defined(_WIN32) + regex_t regex; + int reti = 0; + memset(®ex, '\0', sizeof(regex)); +#endif + + if(devices_get(sid, &dptr) == 0) { + tmp_protocol = dptr->protocols; + while(tmp_protocol) { + opt = tmp_protocol->listener->options; + while(opt) { + if((opt->conftype == DEVICES_VALUE || opt->conftype == DEVICES_OPTIONAL) && strcmp(name, opt->name) == 0) { +#if !defined(__FreeBSD__) && !defined(_WIN32) + if(opt->mask != NULL) { + reti = regcomp(®ex, opt->mask, REG_EXTENDED); + if(reti) { + logprintf(LOG_ERR, "%s: could not compile %s regex", tmp_protocol->listener->id, opt->name); + exit(EXIT_FAILURE); + } + reti = regexec(®ex, value, 0, NULL, 0); + if(reti == REG_NOMATCH || reti != 0) { + regfree(®ex); + return 1; + } + regfree(®ex); + } +#endif + return 0; + } + opt = opt->next; + } + tmp_protocol = tmp_protocol->next; + } + } + return 1; +} + +struct JsonNode *devices_values(const char *media) { + /* Temporary pointer to the different structure */ + struct devices_t *tmp_devices = NULL; + struct devices_settings_t *tmp_settings = NULL; + struct devices_values_t *tmp_values = NULL; + struct gui_values_t *gui_values = NULL; + + /* Pointers to the newly created JSON object */ + struct JsonNode *jroot = json_mkarray(); + struct JsonNode *jelement = NULL; + struct JsonNode *jvalues = NULL; + struct JsonNode *jdevices = NULL; + struct options_t *opt = NULL; + + int match = 0; + + tmp_devices = devices; + + while(tmp_devices) { + match = 0; + if((gui_values = gui_media(tmp_devices->id)) != NULL) { + while(gui_values) { + if(gui_values->type == JSON_STRING) { + if(strcmp(gui_values->string_, media) == 0 || + strcmp(gui_values->string_, "all") == 0 || + strcmp(media, "all") == 0) { + match = 1; + } + } + gui_values = gui_values->next; + } + } else { + match = 1; + } + if(strcmp(media, "all") == 0) { + match = 1; + } + if(match == 1) { + jelement = json_mkobject(); + jdevices = json_mkarray(); + jvalues = json_mkobject(); + + struct protocols_t *tmp_protocols = tmp_devices->protocols; + json_append_member(jelement, "type", json_mknumber(tmp_protocols->listener->devtype, 0)); + json_append_element(jdevices, json_mkstring(tmp_devices->id)); + json_append_member(jelement, "devices", jdevices); + + json_append_member(jvalues, "timestamp", json_mknumber(tmp_devices->timestamp, 0)); + + tmp_settings = tmp_devices->settings; + while(tmp_settings) { + if(strcmp(tmp_settings->name, "state") == 0) { + tmp_values = tmp_settings->values; + if(tmp_values->type == JSON_NUMBER) { + json_append_member(jvalues, tmp_settings->name, json_mknumber(tmp_values->number_, tmp_values->decimals)); + } else if(tmp_values->type == JSON_STRING) { + json_append_member(jvalues, tmp_settings->name, json_mkstring(tmp_values->string_)); + } + } + tmp_settings = tmp_settings->next; + } + + while(tmp_protocols) { + opt = tmp_protocols->listener->options; + while(opt) { + if(opt->conftype == DEVICES_VALUE || opt->conftype == DEVICES_OPTIONAL) { + tmp_settings = tmp_devices->settings; + while(tmp_settings) { + if(strcmp(tmp_settings->name, opt->name) == 0) { + tmp_values = tmp_settings->values; + if(tmp_values->type == JSON_NUMBER) { + json_append_member(jvalues, tmp_settings->name, json_mknumber(tmp_values->number_, tmp_values->decimals)); + } else if(tmp_values->type == JSON_STRING) { + json_append_member(jvalues, tmp_settings->name, json_mkstring(tmp_values->string_)); + } + } + tmp_settings = tmp_settings->next; + } + } + opt = opt->next; + } + tmp_protocols = tmp_protocols->next; + } + json_append_member(jelement, "values", jvalues); + json_append_element(jroot, jelement); + } + tmp_devices = tmp_devices->next; + } + + return jroot; +} + +struct JsonNode *devices_sync(int level, const char *media) { + /* Temporary pointer to the different structure */ + struct devices_t *tmp_devices = NULL; + struct devices_settings_t *tmp_settings = NULL; + struct devices_values_t *tmp_values = NULL; + struct gui_values_t *gui_values = NULL; + int match = 0; + + /* Pointers to the newly created JSON object */ + struct JsonNode *jroot = json_mkobject(); + struct JsonNode *jdevice = NULL; + struct JsonNode *joptions = NULL; + struct JsonNode *jid = NULL; + struct options_t *tmp_options = NULL; + + tmp_devices = devices; + + while(tmp_devices) { + match = 0; + if((gui_values = gui_media(tmp_devices->id)) != NULL) { + while(gui_values) { + if(gui_values->type == JSON_STRING) { + if(strcmp(gui_values->string_, media) == 0 || + strcmp(gui_values->string_, "all") == 0 || + strcmp(media, "all") == 0) { + match = 1; + } + } + gui_values = gui_values->next; + } + } else { + match = 1; + } + if(strcmp(media, "all") == 0) { + match = 1; + } + if(match == 1) { + jdevice = json_mkobject(); + + struct protocols_t *tmp_protocols = tmp_devices->protocols; + struct JsonNode *jprotocols = json_mkarray(); + + if(level == CONFIG_INTERNAL || (strlen(pilight_uuid) > 0 && + (strcmp(tmp_devices->ori_uuid, pilight_uuid) == 0) && + (strcmp(tmp_devices->dev_uuid, pilight_uuid) != 0)) + || tmp_devices->cst_uuid == 1) { + json_append_member(jdevice, "uuid", json_mkstring(tmp_devices->dev_uuid)); + } + if(level == CONFIG_INTERNAL || level == CONFIG_INTERNAL) { + json_append_member(jdevice, "origin", json_mkstring(tmp_devices->ori_uuid)); + json_append_member(jdevice, "timestamp", json_mknumber((double)tmp_devices->timestamp, 0)); + } + + while(tmp_protocols) { + json_append_element(jprotocols, json_mkstring(tmp_protocols->name)); + tmp_protocols = tmp_protocols->next; + } + json_append_member(jdevice, "protocol", jprotocols); + json_append_member(jdevice, "id", json_mkarray()); + + tmp_settings = tmp_devices->settings; + while(tmp_settings) { + tmp_values = tmp_settings->values; + if(strcmp(tmp_settings->name, "id") == 0) { + jid = json_find_member(jdevice, tmp_settings->name); + JsonNode *jnid = json_mkobject(); + while(tmp_values) { + if(tmp_values->type == JSON_NUMBER) { + json_append_member(jnid, tmp_values->name, json_mknumber(tmp_values->number_, tmp_values->decimals)); + } else if(tmp_values->type == JSON_STRING) { + json_append_member(jnid, tmp_values->name, json_mkstring(tmp_values->string_)); + } + tmp_values = tmp_values->next; + } + json_append_element(jid, jnid); + } else if(!tmp_values->next) { + if(tmp_values->type == JSON_NUMBER) { + json_append_member(jdevice, tmp_settings->name, json_mknumber(tmp_values->number_, tmp_values->decimals)); + } else if(tmp_values->type == JSON_STRING) { + json_append_member(jdevice, tmp_settings->name, json_mkstring(tmp_values->string_)); + } + } else { + joptions = json_mkarray(); + while(tmp_values) { + if(tmp_values->type == JSON_NUMBER) { + json_append_element(joptions, json_mknumber(tmp_values->number_, tmp_values->decimals)); + } else if(tmp_values->type == JSON_STRING) { + json_append_element(joptions, json_mkstring(tmp_values->string_)); + } + tmp_values = tmp_values->next; + } + json_append_member(jdevice, tmp_settings->name, joptions); + } + tmp_settings = tmp_settings->next; + } + + tmp_protocols = tmp_devices->protocols; + while(tmp_protocols) { + tmp_options = tmp_protocols->listener->options; + if(tmp_options) { + while(tmp_options) { + if((level == CONFIG_INTERNAL || level == CONFIG_INTERNAL) && (tmp_options->conftype == DEVICES_SETTING) + && json_find_member(jdevice, tmp_options->name) == NULL) { + if(tmp_options->vartype == JSON_NUMBER) { + json_append_member(jdevice, tmp_options->name, json_mknumber((int)(intptr_t)tmp_options->def, 0)); + } else if(tmp_options->vartype == JSON_STRING) { + json_append_member(jdevice, tmp_options->name, json_mkstring((char *)tmp_options->def)); + } + } + tmp_options = tmp_options->next; + } + } + tmp_protocols = tmp_protocols->next; + } + json_append_member(jroot, tmp_devices->id, jdevice); + } + tmp_devices = tmp_devices->next; + } + + return jroot; +} + +/* Save the device settings to the device struct */ +static void devices_save_setting(int i, struct JsonNode *jsetting, struct devices_t *device) { + /* Struct to store the values */ + struct devices_values_t *vnode = NULL; + struct devices_settings_t *snode = NULL; + struct devices_settings_t *tmp_settings = NULL; + struct devices_values_t *tmp_values = NULL; + /* Temporary JSON pointer */ + struct JsonNode *jtmp; + + /* Variable holder for casting settings */ + char *stmp = NULL; + + /* If the JSON tag is an array, then it should be a values or id array */ + if(jsetting->tag == JSON_ARRAY) { + if(strcmp(jsetting->key, "id") == 0) { + /* Loop through the values of this values array */ + jtmp = json_first_child(jsetting); + while(jtmp) { + if((snode = MALLOC(sizeof(struct devices_settings_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((snode->name = MALLOC(strlen(jsetting->key)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(snode->name, jsetting->key); + snode->values = NULL; + snode->next = NULL; + if(jtmp->tag == JSON_OBJECT) { + JsonNode *jtmp1 = json_first_child(jtmp); + while(jtmp1) { + if((vnode = MALLOC(sizeof(struct devices_values_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((vnode->name = MALLOC(strlen(jtmp1->key)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(vnode->name, jtmp1->key); + vnode->next = NULL; + if(jtmp1->tag == JSON_STRING) { + if((vnode->string_ = MALLOC(strlen(jtmp1->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(vnode->string_, jtmp1->string_); + vnode->type = JSON_STRING; + } else if(jtmp1->tag == JSON_NUMBER) { + vnode->number_ = jtmp1->number_; + vnode->decimals = jtmp1->decimals_; + vnode->type = JSON_NUMBER; + } + if(jtmp1->tag == JSON_NUMBER || jtmp1->tag == JSON_STRING) { + tmp_values = snode->values; + if(tmp_values) { + while(tmp_values->next != NULL) { + tmp_values = tmp_values->next; + } + tmp_values->next = vnode; + } else { + vnode->next = snode->values; + snode->values = vnode; + } + } + jtmp1 = jtmp1->next; + } + } + jtmp = jtmp->next; + + tmp_settings = device->settings; + if(tmp_settings) { + while(tmp_settings->next != NULL) { + tmp_settings = tmp_settings->next; + } + tmp_settings->next = snode; + } else { + snode->next = device->settings; + device->settings = snode; + } + } + } + } else if(jsetting->tag == JSON_OBJECT) { + if((snode = MALLOC(sizeof(struct devices_settings_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((snode->name = MALLOC(strlen(jsetting->key)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(snode->name, jsetting->key); + snode->values = NULL; + snode->next = NULL; + + jtmp = json_first_child(jsetting); + while(jtmp) { + if(jtmp->tag == JSON_STRING) { + if((vnode = MALLOC(sizeof(struct devices_values_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((vnode->name = MALLOC(strlen(jtmp->key)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(vnode->name, jtmp->key); + if((vnode->string_ = MALLOC(strlen(jtmp->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(vnode->string_, jtmp->string_); + vnode->type = JSON_STRING; + vnode->next = NULL; + } else if(jtmp->tag == JSON_NUMBER) { + if((vnode = MALLOC(sizeof(struct devices_values_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((vnode->name = MALLOC(strlen(jtmp->key)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(vnode->name, jtmp->key); + vnode->number_ = jtmp->number_; + vnode->decimals = jtmp->decimals_; + vnode->type = JSON_NUMBER; + vnode->next = NULL; + } + if(jtmp->tag == JSON_NUMBER || jtmp->tag == JSON_STRING) { + tmp_values = snode->values; + if(tmp_values) { + while(tmp_values->next != NULL) { + tmp_values = tmp_values->next; + } + tmp_values->next = vnode; + } else { + vnode->next = snode->values; + snode->values = vnode; + } + } + jtmp = jtmp->next; + } + + tmp_settings = device->settings; + if(tmp_settings) { + while(tmp_settings->next != NULL) { + tmp_settings = tmp_settings->next; + } + tmp_settings->next = snode; + } else { + snode->next = device->settings; + device->settings = snode; + } + + } else { + /* New device settings node */ + if((snode = MALLOC(sizeof(struct devices_settings_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((snode->name = MALLOC(strlen(jsetting->key)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(snode->name, jsetting->key); + snode->values = NULL; + snode->next = NULL; + + if((vnode = MALLOC(sizeof(struct devices_values_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + int valid = 0; + /* Cast and store the new value */ + if(jsetting->tag == JSON_STRING && json_find_string(jsetting->parent, jsetting->key, &stmp) == 0) { + if((vnode->string_ = MALLOC(strlen(stmp)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + vnode->name = NULL; + strcpy(vnode->string_, stmp); + vnode->type = JSON_STRING; + valid = 1; + } else if(jsetting->tag == JSON_NUMBER && + (jtmp = json_find_member(jsetting->parent, jsetting->key)) != NULL && + jtmp->tag == JSON_NUMBER) { + vnode->name = NULL; + vnode->number_ = jtmp->number_; + vnode->decimals = jtmp->decimals_; + vnode->type = JSON_NUMBER; + valid = 1; + } + if(valid) { + tmp_values = snode->values; + if(tmp_values) { + while(tmp_values->next != NULL) { + tmp_values = tmp_values->next; + } + tmp_values->next = vnode; + } else { + vnode->next = snode->values; + snode->values = vnode; + } + } + + tmp_settings = device->settings; + if(tmp_settings) { + while(tmp_settings->next != NULL) { + tmp_settings = tmp_settings->next; + } + tmp_settings->next = snode; + } else { + snode->next = device->settings; + device->settings = snode; + } + } +} + +static int devices_check_id(int i, JsonNode *jsetting, struct devices_t *device) { + /* Temporary options pointer */ + struct options_t *tmp_options = NULL; + /* Temporary ID array pointer */ + struct JsonNode *jid = NULL; + /* Temporary ID values pointer */ + struct JsonNode *jvalues = NULL; + /* Temporary protocols pointer */ + struct protocols_t *tmp_protocols = NULL; + + int match1 = 0, match2 = 0, match3 = 0, has_id = 0; + int valid_values = 0, nrprotocols = 0, nrids1 = 0; + unsigned short nrid = 0; + int nrids2 = 0, have_error = 0, etype = 0; + + /* Variable holders for casting */ + char ctmp[256]; + + tmp_protocols = device->protocols; + while(tmp_protocols) { + jid = json_first_child(jsetting); + has_id = 0; + nrid = 0; + match3 = 0; + nrprotocols++; + while(jid) { + nrid++; + match2 = 0; match1 = 0; nrids1 = 0; nrids2 = 0; + jvalues = json_first_child(jid); + while(jvalues) { + nrids1++; + jvalues = jvalues->next; + } + if((tmp_options = tmp_protocols->listener->options)) { + while(tmp_options) { + if(tmp_options->conftype == DEVICES_ID) { + nrids2++; + } + tmp_options = tmp_options->next; + } + } + if(nrids1 == nrids2) { + has_id = 1; + jvalues = json_first_child(jid); + while(jvalues) { + match1++; + if((tmp_options = tmp_protocols->listener->options)) { + while(tmp_options) { + if(tmp_options->conftype == DEVICES_ID && tmp_options->vartype == jvalues->tag) { + if(strcmp(tmp_options->name, jvalues->key) == 0) { + match2++; + if(jvalues->tag == JSON_NUMBER) { + sprintf(ctmp, "%.*f", jvalues->decimals_, jvalues->number_); + } else if(jvalues->tag == JSON_STRING) { + strcpy(ctmp, jvalues->string_); + } + + if(tmp_options->mask != NULL && strlen(tmp_options->mask) > 0) { +#if !defined(__FreeBSD__) && !defined(_WIN32) + regex_t regex; + memset(®ex, '\0', sizeof(regex)); + int reti = regcomp(®ex, tmp_options->mask, REG_EXTENDED); + if(reti) { + logprintf(LOG_ERR, "%s: could not compile %s regex", tmp_protocols->listener->id, tmp_options->name); + } else { + reti = regexec(®ex, ctmp, 0, NULL, 0); + if(reti == REG_NOMATCH || reti != 0) { + match2--; + } + regfree(®ex); + } +#endif + } + } + } + tmp_options = tmp_options->next; + } + } + jvalues = jvalues->next; + } + } + jid = jid->next; + if(match2 > 0 && match1 == match2) { + match3 = 1; + } + } + if(!has_id) { + valid_values--; + } else if(tmp_protocols->listener->multipleId == 0 && nrid > 1) { + valid_values--; + etype = 1; + break; + } else if(match3) { + valid_values++; + } else { + valid_values--; + } + tmp_protocols = tmp_protocols->next; + } + if(nrprotocols != valid_values) { + if(etype == 1) { + logprintf(LOG_ERR, "protocol \"%s\" used in \"%s\" doesn't support multiple id's", tmp_protocols->listener->id, device->id); + } else { + logprintf(LOG_ERR, "config device setting #%d \"%s\" of \"%s\", invalid", i, "id", device->id); + } + have_error = 1; + } + return have_error; +} + +static int devices_validate_settings(void) { + /* Temporary pointer to the different structure */ + struct devices_t *tmp_devices = NULL; + struct devices_settings_t *tmp_settings = NULL; + struct devices_values_t *tmp_values = NULL; + + /* Pointers to the newly created JSON object */ + struct JsonNode *jdevice = NULL; + struct JsonNode *joptions = NULL; + + int have_error = 0; + int dorder = 0; + + tmp_devices = devices; + while(tmp_devices) { + + jdevice = json_mkobject(); + struct protocols_t *tmp_protocols = tmp_devices->protocols; + while(tmp_protocols) { + /* Only continue if protocol specific settings can be validated */ + if(tmp_protocols->listener->checkValues) { + tmp_settings = tmp_devices->settings; + dorder++; + while(tmp_settings) { + tmp_values = tmp_settings->values; + /* Retrieve all protocol specific settings for this device. Also add all + device values and states so it can be validated by the protocol */ + if(strcmp(tmp_settings->name, "id") == 0) { + JsonNode *jid = json_find_member(jdevice, "id"); + if(!jid) { + jid = json_mkarray(); + json_append_member(jdevice, tmp_settings->name, jid); + } + JsonNode *jnid = json_mkobject(); + while(tmp_values) { + if(tmp_values->type == JSON_NUMBER) { + json_append_member(jnid, tmp_values->name, json_mknumber(tmp_values->number_, tmp_values->decimals)); + } else if(tmp_values->type == JSON_STRING) { + json_append_member(jnid, tmp_values->name, json_mkstring(tmp_values->string_)); + } + tmp_values = tmp_values->next; + } + json_append_element(jid, jnid); + } else { + if(!tmp_values->next) { + if(tmp_values->type == JSON_STRING) { + json_append_member(jdevice, tmp_settings->name, json_mkstring(tmp_values->string_)); + } else if(tmp_values->type == JSON_NUMBER) { + json_append_member(jdevice, tmp_settings->name, json_mknumber(tmp_values->number_, tmp_values->decimals)); + } + } else { + joptions = json_mkarray(); + while(tmp_values) { + if(tmp_values->type == JSON_STRING) { + json_append_element(joptions, json_mkstring(tmp_values->string_)); + } else if(tmp_values->type == JSON_NUMBER) { + json_append_element(joptions, json_mknumber(tmp_values->number_, tmp_values->decimals)); + } + tmp_values = tmp_values->next; + } + json_append_member(jdevice, tmp_settings->name, joptions); + } + } + tmp_settings = tmp_settings->next; + } + + /* Let the settings and values be validated against each other */ + if(tmp_protocols->listener->checkValues(jdevice) != 0) { + logprintf(LOG_ERR, "config device #%d, invalid", dorder); + have_error = 1; + goto clear; + } + } + tmp_protocols = tmp_protocols->next; + } + tmp_devices = tmp_devices->next; + json_delete(jdevice); + jdevice=NULL; + } + +clear: + if(jdevice) { + json_delete(jdevice); + } + return have_error; +} + +static int devices_check_state(int i, JsonNode *jsetting, struct devices_t *device) { + /* Temporary options pointer */ + struct options_t *tmp_options; + + int valid_state = 0, have_error = 0; + + /* Variable holders for casting */ + double itmp = 0; + char ctmp[256]; + char *stmp = NULL; + +#if !defined(__FreeBSD__) && !defined(_WIN32) + /* Regex variables */ + regex_t regex; + int reti = 0; + memset(®ex, '\0', sizeof(regex)); +#endif + + /* Cast the different values */ + if(jsetting->tag == JSON_NUMBER && json_find_number(jsetting->parent, jsetting->key, &itmp) == 0) { + sprintf(ctmp, "%.0f", itmp); + } else if(jsetting->tag == JSON_STRING && json_find_string(jsetting->parent, jsetting->key, &stmp) == 0) { + strcpy(ctmp, stmp); + } + + struct protocols_t *tmp_protocols = device->protocols; + while(tmp_protocols) { + /* Check if the specific device contains any options */ + if(tmp_protocols->listener->options) { + + tmp_options = tmp_protocols->listener->options; + + while(tmp_options) { + /* We are only interested in the DEVICES_STATE options */ + if(tmp_options->conftype == DEVICES_STATE && tmp_options->vartype == jsetting->tag) { + /* If an option requires an argument, then check if the + argument state values and values array are of the right + type. This is done by checking the regex mask */ + if(tmp_options->argtype == OPTION_HAS_VALUE) { + if(tmp_options->mask != NULL && strlen(tmp_options->mask) > 0) { +#if !defined(__FreeBSD__) && !defined(_WIN32) + reti = regcomp(®ex, tmp_options->mask, REG_EXTENDED); + if(reti) { + logprintf(LOG_ERR, "%s: could not compile %s regex", tmp_protocols->listener->id, tmp_options->name); + have_error = 1; + goto clear; + } + reti = regexec(®ex, ctmp, 0, NULL, 0); + + if(reti == REG_NOMATCH || reti != 0) { + logprintf(LOG_ERR, "config device setting #%d \"%s\" of \"%s\", invalid", i, jsetting->key, device->id); + have_error = 1; + regfree(®ex); + goto clear; + } + regfree(®ex); +#endif + } + } else { + /* If a protocol has DEVICES_STATE arguments, than these define + the states a protocol can take. Check if the state value + match, these protocol states */ + + if(strcmp(tmp_options->name, ctmp) == 0 && valid_state == 0) { + valid_state = 1; + } + } + } + tmp_options = tmp_options->next; + } + } + tmp_protocols = tmp_protocols->next; + } + + if(valid_state == 0) { + logprintf(LOG_ERR, "config device setting #%d \"%s\" of \"%s\", invalid", i, jsetting->key, device->id); + have_error = 1; + goto clear; + } + +clear: + return have_error; +} + +static int devices_parse_elements(JsonNode *jdevices, struct devices_t *device) { + /* Temporary settings holder */ + struct devices_settings_t *tmp_settings = NULL; + /* JSON devices iterator */ + JsonNode *jsettings = NULL; + /* Temporarily options pointer */ + struct options_t *tmp_options = NULL; + /* Temporarily protocols pointer */ + struct protocols_t *tmp_protocols = NULL; + + int i = 0, have_error = 0, valid_setting = 0; + int match = 0, has_state = 0; + /* Check for any duplicate fields */ + int nrprotocol = 0, nrstate = 0; + int nruuid = 0, nrorigin = 0, nrtimestamps = 0; + + jsettings = json_first_child(jdevices); + + while(jsettings) { + i++; + /* Check for any duplicate fields */ + if(strcmp(jsettings->key, "uuid") == 0) { + nruuid++; + } + if(strcmp(jsettings->key, "origin") == 0) { + nrorigin++; + } + if(strcmp(jsettings->key, "protocol") == 0) { + nrprotocol++; + } + if(strcmp(jsettings->key, "state") == 0) { + nrstate++; + } + if(strcmp(jsettings->key, "timestamp") == 0) { + nrtimestamps++; + } + if(nrstate > 1 || nrprotocol > 1 || nruuid > 1 || nrtimestamps > 1) { + logprintf(LOG_ERR, "config device setting #%d \"%s\" of \"%s\", duplicate", i, jsettings->key, device->id); + have_error = 1; + goto clear; + } + + /* Parse the state setting separately from the other settings. */ + if(strcmp(jsettings->key, "state") == 0) { + if(jsettings->tag == JSON_STRING || jsettings->tag == JSON_NUMBER) { + if(devices_check_state(i, jsettings, device) != 0) { + have_error = 1; + goto clear; + } + devices_save_setting(i, jsettings, device); + } else { + logprintf(LOG_ERR, "config device setting #%d \"%s\" of \"%s\", invalid", i, jsettings->key, device->id); + have_error = 1; + goto clear; + } + } else if(strcmp(jsettings->key, "id") == 0) { + if(jsettings->tag == JSON_ARRAY) { + if(devices_check_id(i, jsettings, device) == EXIT_FAILURE) { + have_error = 1; + goto clear; + } + devices_save_setting(i, jsettings, device); + } else { + logprintf(LOG_ERR, "config device setting #%d \"%s\" of \"%s\", invalid", i, jsettings->key, device->id); + have_error = 1; + goto clear; + } + } else if(strcmp(jsettings->key, "uuid") == 0) { + if(jsettings->tag == JSON_STRING) { + strcpy(device->dev_uuid, jsettings->string_); + device->cst_uuid = 1; + } else { + logprintf(LOG_ERR, "config device setting #%d \"%s\" of \"%s\", invalid", i, jsettings->key, device->id); + have_error = 1; + goto clear; + } + } else if(strcmp(jsettings->key, "timestamp") == 0) { + if(jsettings->tag == JSON_NUMBER) { + device->timestamp = (int)jsettings->number_; + } else { + logprintf(LOG_ERR, "config device setting #%d \"%s\" of \"%s\", invalid", i, jsettings->key, device->id); + have_error = 1; + goto clear; + } + } else if(strcmp(jsettings->key, "origin") == 0) { + if(jsettings->tag == JSON_STRING) { + strcpy(device->ori_uuid, jsettings->string_); + } else { + logprintf(LOG_ERR, "config device setting #%d \"%s\" of \"%s\", invalid", i, jsettings->key, device->id); + have_error = 1; + goto clear; + } + /* The protocol and name settings are already saved in the device struct */ + } else if(!((strcmp(jsettings->key, "protocol") == 0 && jsettings->tag == JSON_ARRAY) + || (strcmp(jsettings->key, "uuid") == 0 && jsettings->tag == JSON_STRING) + || (strcmp(jsettings->key, "timestamp") == 0 && jsettings->tag == JSON_NUMBER)) + || ((strcmp(jsettings->key, "id") == 0) && jsettings->tag == JSON_ARRAY)) { + + /* Check for duplicate settings */ + tmp_settings = device->settings; + while(tmp_settings) { + if(strcmp(tmp_settings->name, jsettings->key) == 0) { + logprintf(LOG_ERR, "config device setting #%d \"%s\" of \"%s\", duplicate", i, jsettings->key, device->id); + have_error = 1; + goto clear; + } + tmp_settings = tmp_settings->next; + } + + tmp_protocols = device->protocols; + valid_setting = 0; + while(tmp_protocols) { + /* Check if the settings are required by the protocol */ + if(tmp_protocols->listener->options) { + tmp_options = tmp_protocols->listener->options; + while(tmp_options) { + if(strcmp(jsettings->key, tmp_options->name) == 0 + && (tmp_options->conftype == DEVICES_ID + || tmp_options->conftype == DEVICES_VALUE + || tmp_options->conftype == DEVICES_SETTING + || tmp_options->conftype == DEVICES_OPTIONAL) + && (tmp_options->vartype == jsettings->tag + || tmp_options->vartype == (JSON_STRING | JSON_NUMBER))) { + valid_setting = 1; + break; + } + tmp_options = tmp_options->next; + } + } + tmp_protocols = tmp_protocols->next; + } + /* If the settings are valid, store them */ + if(valid_setting == 1) { + devices_save_setting(i, jsettings, device); + } else { + logprintf(LOG_ERR, "config device setting #%d \"%s\" of \"%s\", invalid", i, jsettings->key, device->id); + have_error = 1; + goto clear; + } + } + jsettings = jsettings->next; + } + + /* Check if required options by this protocol are missing + in the devices file */ + tmp_protocols = device->protocols; + while(tmp_protocols) { + if(tmp_protocols->listener->options) { + tmp_options = tmp_protocols->listener->options; + while(tmp_options) { + match = 0; + jsettings = json_first_child(jdevices); + while(jsettings) { + if(strcmp(jsettings->key, tmp_options->name) == 0) { + match = 1; + break; + } + jsettings = jsettings->next; + } + if(match == 0 && tmp_options->conftype == DEVICES_VALUE) { + logprintf(LOG_ERR, "config device setting \"%s\" of \"%s\", missing", tmp_options->name, device->id); + have_error = 1; + goto clear; + } + tmp_options = tmp_options->next; + } + + } + tmp_protocols = tmp_protocols->next; + } + match = 0; + jsettings = json_first_child(jdevices); + while(jsettings) { + if(strcmp(jsettings->key, "id") == 0) { + match = 1; + break; + } + jsettings = jsettings->next; + } + if(match == 0) { + logprintf(LOG_ERR, "config device setting \"id\" of \"%s\", missing", device->id); + have_error = 1; + goto clear; + } + + /* Check if this protocol requires a state setting */ + if(nrstate == 0) { + tmp_protocols = device->protocols; + while(tmp_protocols) { + if(tmp_protocols->listener->options) { + tmp_options = tmp_protocols->listener->options; + while(tmp_options) { + if(tmp_options->conftype == DEVICES_STATE) { + has_state = 1; + break; + } + tmp_options = tmp_options->next; + } + } + if(has_state == 1) { + if(nrstate == 0) { + logprintf(LOG_ERR, "config device setting \"%s\" of \"%s\", missing", "state", device->id); + have_error = 1; + goto clear; + } + } + tmp_protocols = tmp_protocols->next; + } + } + + if(strlen(pilight_uuid) > 0 && strcmp(device->dev_uuid, pilight_uuid) == 0) { + tmp_protocols = device->protocols; + while(tmp_protocols) { + if(tmp_protocols->listener->initDev && (tmp_protocols->listener->masterOnly == 0 || pilight.runmode == STANDALONE)) { + struct threadqueue_t *tmp = tmp_protocols->listener->initDev(jdevices); + if(tmp != NULL) { + device->protocol_threads = REALLOC(device->protocol_threads, (sizeof(struct threadqueue_t *)*(size_t)(device->nrthreads+1))); + device->protocol_threads[device->nrthreads] = tmp; + device->nrthreads++; + } + } + tmp_protocols = tmp_protocols->next; + } + } + +clear: + return have_error; +} + +static int devices_parse(JsonNode *root) { + /* Struct to store the devices */ + struct devices_t *dnode = NULL; + /* Temporary JSON devices */ + struct devices_t *tmp_devices = NULL; + /* Temporary protocol JSON array */ + JsonNode *jprotocol = NULL; + JsonNode *jprotocols = NULL; + /* JSON devices iterator */ + JsonNode *jdevices = NULL; + + int i = 0, have_error = 0, match = 0, x = 0; + + jdevices = json_first_child(root); + while(jdevices) { + i++; + /* Check if all fields of the devices are of the right type */ + if(jdevices->tag != JSON_OBJECT) { + logprintf(LOG_ERR, "config device device #%d \"%s\", invalid field(s)", i, jdevices->key); + have_error = 1; + goto clear; + } else { + if((jprotocols = json_find_member(jdevices, "protocol")) == NULL || jprotocols->tag != JSON_ARRAY) { + logprintf(LOG_ERR, "config device #%d \"%s\", missing protocol", i, jdevices->key); + have_error = 1; + goto clear; + } else { + for(x=0;xkey);x++) { + if(!isalnum(jdevices->key[x]) && jdevices->key[x] != '-' && jdevices->key[x] != '_') { + logprintf(LOG_ERR, "config device #%d \"%s\", not alphanumeric", i, jdevices->key); + have_error = 1; + goto clear; + } + struct protocols_t *tmp_protocols = protocols; + while(tmp_protocols) { + struct protocol_t *protocol = tmp_protocols->listener; + if(strcmp(protocol->id, jdevices->key) == 0) { + logprintf(LOG_ERR, "config device #%d \"%s\", protocol names are reserved words", i, jdevices->key); + have_error = 1; + goto clear; + } + tmp_protocols = tmp_protocols->next; + } + } + /* Check for duplicate fields */ + tmp_devices = devices; + while(tmp_devices) { + if(strcmp(tmp_devices->id, jdevices->key) == 0) { + logprintf(LOG_ERR, "config device #%d \"%s\", duplicate", i, jdevices->key); + have_error = 1; + } + tmp_devices = tmp_devices->next; + } + + if((dnode = MALLOC(sizeof(struct devices_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if(strlen(pilight_uuid) > 0) { + strcpy(dnode->dev_uuid, pilight_uuid); + strcpy(dnode->ori_uuid, pilight_uuid); + } + dnode->cst_uuid = 0; + if((dnode->id = MALLOC(strlen(jdevices->key)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(dnode->id, jdevices->key); + dnode->nrthreads = 0; + dnode->timestamp = 0; + dnode->protocol_threads = NULL; + dnode->settings = NULL; + dnode->next = NULL; + dnode->protocols = NULL; + +#ifdef EVENTS + event_action_thread_init(dnode); +#endif + + int ptype = -1; + /* Save both the protocol pointer and the protocol name */ + jprotocol = json_first_child(jprotocols); + while(jprotocol) { + match = 0; + struct protocols_t *tmp_protocols = protocols; + /* Pointer to the match protocol */ + struct protocol_t *protocol = NULL; + while(tmp_protocols) { + protocol = tmp_protocols->listener; + if(protocol_device_exists(protocol, jprotocol->string_) == 0 && match == 0 + && protocol->config == 1) { + if(ptype == -1) { + ptype = protocol->hwtype; + match = 1; + } + if(ptype > -1 && protocol->hwtype == ptype) { + match = 1; + } + match = 1; + break; + } + tmp_protocols = tmp_protocols->next; + } + if(match == 1 && ptype != protocol->hwtype) { + logprintf(LOG_ERR, "config device #%d \"%s\", cannot combine protocols of different hardware types", i, jdevices->key); + have_error = 1; + } + if(match == 0) { + logprintf(LOG_ERR, "config device #%d \"%s\", invalid protocol", i, jdevices->key); + have_error = 1; + } else { + struct protocols_t *pnode = MALLOC(sizeof(struct protocols_t)); + if(pnode == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((pnode->listener = MALLOC(sizeof(struct protocol_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memcpy(pnode->listener, protocol, sizeof(struct protocol_t)); + if((pnode->name = MALLOC(strlen(jprotocol->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(pnode->name, jprotocol->string_); + pnode->next = NULL; + tmp_protocols = dnode->protocols; + if(tmp_protocols) { + while(tmp_protocols->next != NULL) { + tmp_protocols = tmp_protocols->next; + } + tmp_protocols->next = pnode; + } else { + pnode->next = dnode->protocols; + dnode->protocols = pnode; + } + } + jprotocol = jprotocol->next; + } + + if(have_error == 0 && devices_parse_elements(jdevices, dnode) != 0) { + have_error = 1; + } + + tmp_devices = devices; + if(tmp_devices) { + while(tmp_devices->next != NULL) { + tmp_devices = tmp_devices->next; + } + tmp_devices->next = dnode; + } else { + dnode->next = devices; + devices = dnode; + } + + if(have_error) { + goto clear; + } + } + } + + jdevices = jdevices->next; + } + +clear: + return have_error; +} + +int devices_gc(void) { + int i = 0; + struct devices_t *dtmp = NULL; + struct devices_settings_t *stmp = NULL; + struct devices_values_t *vtmp = NULL; + struct protocols_t *ptmp = NULL; + + pthread_mutex_lock(&mutex_lock); + /* Free devices structure */ + while(devices) { + dtmp = devices; + +#ifdef EVENTS + event_action_thread_free(dtmp); +#endif + + while(dtmp->settings) { + stmp = dtmp->settings; + while(stmp->values) { + vtmp = stmp->values; + if(vtmp->type == JSON_STRING && vtmp->string_ != NULL) { + FREE(vtmp->string_); + } + if(vtmp->name) { + FREE(vtmp->name); + } + stmp->values = stmp->values->next; + FREE(vtmp); + } + if(stmp->values != NULL) { + FREE(stmp->values); + } + if(stmp->name) { + FREE(stmp->name); + } + dtmp->settings = dtmp->settings->next; + FREE(stmp); + } + while(dtmp->protocols) { + ptmp = dtmp->protocols; + if(ptmp->listener != NULL && ptmp->listener->threadGC != NULL) { + ptmp->listener->threadGC(); + } + if(ptmp->name != NULL) { + FREE(ptmp->name); + } + if(ptmp->listener != NULL) { + FREE(ptmp->listener); + } + dtmp->protocols = dtmp->protocols->next; + FREE(ptmp); + } + if(dtmp->nrthreads > 0) { + for(i=0;inrthreads;i++) { + thread_stop(dtmp->protocol_threads[i]->id); + } + } + if(dtmp->protocols != NULL) { + FREE(dtmp->protocols); + } + if(dtmp->settings != NULL) { + FREE(dtmp->settings); + } + if(dtmp->id != NULL) { + FREE(dtmp->id); + } + if(dtmp->protocol_threads != NULL) { + FREE(dtmp->protocol_threads); + } + devices = devices->next; + FREE(dtmp); + } + if(devices != NULL) { + FREE(devices); + } + devices = NULL; + + pthread_mutex_unlock(&mutex_lock); + logprintf(LOG_DEBUG, "garbage collected config devices library"); + + return EXIT_SUCCESS; +} + +static int devices_read(JsonNode *root) { + if(devices_parse(root) == 0 && devices_validate_settings() == 0) { + return 0; + } else { + return 1; + } +} + +void devices_init(void) { + pthread_mutexattr_init(&mutex_attr); + pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex_lock, &mutex_attr); + + /* Request hardware json object in main configuration */ + config_register(&config_devices, "devices"); + config_devices->readorder = 1; + config_devices->writeorder = 0; + config_devices->parse=&devices_read; + config_devices->sync=&devices_sync; + config_devices->gc=&devices_gc; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/config/devices.h b/lib/ESPiLight/pilight/libs/pilight/config/devices.h new file mode 100644 index 0000000..a3a521e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/config/devices.h @@ -0,0 +1,106 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _DEVICES_H_ +#define _DEVICES_H_ + +#include + +typedef struct devices_settings_t devices_settings_t; +typedef struct devices_values_t devices_values_t; +typedef struct devices_t devices_t; + +#include "../core/pilight.h" +#include "../core/threads.h" +#include "../core/config.h" +#include "../protocols/protocol.h" +#include "../events/action.h" + +/* +|------------------| +| devices_t | +|------------------| +| id | +| name | +| protocols | --> protocols_t +| settings | --- +|------------------| | + | +|------------------| | +|devices_settings_t| <-- +|------------------| +| name | +| values | --- +|------------------| | + | +|------------------| | +| devices_values_t | <-- +|------------------| +| value | +| type | +|------------------| +*/ + +struct devices_values_t { + union { + char *string_; + double number_; + }; + int decimals; + char *name; + int type; + struct devices_values_t *next; +}; + +struct devices_settings_t { + char *name; + struct devices_values_t *values; + struct devices_settings_t *next; +}; + +struct devices_t { + char *id; + char dev_uuid[22]; + char ori_uuid[22]; + int cst_uuid; + int nrthreads; + time_t timestamp; +#ifdef EVENTS + int lastrule; + int prevrule; + enum origin_t lastorigin; + enum origin_t prevorigin; + struct event_action_thread_t *action_thread; +#endif + struct protocols_t *protocols; + struct devices_settings_t *settings; + struct threadqueue_t **protocol_threads; + struct devices_t *next; +}; + +extern struct config_t *config_devices; + +int devices_update(char *protoname, JsonNode *message, enum origin_t origin, JsonNode **out); +int devices_get(char *sid, struct devices_t **dev); +int devices_valid_state(char *sid, char *state); +int devices_valid_value(char *sid, char *name, char *value); +struct JsonNode *devices_values(const char *media); +void devices_init(void); +int devices_gc(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/config/gui.c b/lib/ESPiLight/pilight/libs/pilight/config/gui.c new file mode 100644 index 0000000..76bbd74 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/config/gui.c @@ -0,0 +1,641 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../core/common.h" +#include "../core/json.h" +#include "../core/config.h" +#include "../core/log.h" +#include "devices.h" +#include "gui.h" + +struct config_t *config_gui; + +static pthread_mutex_t mutex_lock; +static pthread_mutexattr_t mutex_attr; + +static struct gui_elements_t *gui_elements = NULL; + +struct gui_values_t *gui_media(char *name) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct gui_elements_t *tmp_gui = NULL; + struct gui_settings_t *tmp_settings = NULL; + struct gui_values_t *tmp_values = NULL; + tmp_gui = gui_elements; + + while(tmp_gui) { + if(strcmp(tmp_gui->id, name) == 0) { + tmp_settings = tmp_gui->settings; + while(tmp_settings) { + tmp_values = tmp_settings->values; + if(strcmp(tmp_settings->name, "media") == 0) { + return tmp_values; + } + tmp_settings = tmp_settings->next; + } + break; + } + + tmp_gui = tmp_gui->next; + } + return NULL; +} + +int gui_gc(void) { + struct gui_elements_t *dtmp; + struct gui_settings_t *stmp; + struct gui_values_t *vtmp; + + pthread_mutex_lock(&mutex_lock); + /* Free devices structure */ + while(gui_elements) { + dtmp = gui_elements; + while(dtmp->settings) { + stmp = dtmp->settings; + while(stmp->values) { + vtmp = stmp->values; + if(vtmp->type == JSON_STRING && vtmp->string_ != NULL) { + FREE(vtmp->string_); + } + if(vtmp->name) { + FREE(vtmp->name); + } + stmp->values = stmp->values->next; + FREE(vtmp); + } + if(stmp->values != NULL) { + FREE(stmp->values); + } + if(stmp->name) { + FREE(stmp->name); + } + dtmp->settings = dtmp->settings->next; + FREE(stmp); + } + if(dtmp->settings != NULL) { + FREE(dtmp->settings); + } + FREE(dtmp->id); + gui_elements = gui_elements->next; + FREE(dtmp); + } + if(gui_elements != NULL) { + FREE(gui_elements); + } + gui_elements = NULL; + pthread_mutex_unlock(&mutex_lock); + + logprintf(LOG_DEBUG, "garbage collected config gui library"); + + return EXIT_SUCCESS; +} + +struct JsonNode *gui_sync(int level, const char *media) { + /* Temporary pointer to the different structure */ + struct gui_elements_t *tmp_gui = NULL; + struct gui_settings_t *tmp_settings = NULL; + struct gui_values_t *tmp_values = NULL; + struct options_t *tmp_options = NULL; + int i = 0, match = 0; + + /* Pointers to the newly created JSON object */ + struct JsonNode *jroot = json_mkobject(); + struct JsonNode *jelements = NULL; + struct JsonNode *joptions = NULL; + struct JsonNode *jarray = NULL; + + tmp_gui = gui_elements; + + while(tmp_gui) { + i++; + jelements = json_mkobject(); + if(level == 0) { + json_append_member(jelements, "type", json_mknumber(tmp_gui->device->protocols->listener->devtype, 0)); + json_append_member(jelements, "order", json_mknumber(i, 0)); + } + + tmp_settings = tmp_gui->settings; + match = 0; + while(tmp_settings) { + tmp_values = tmp_settings->values; + if(strcmp(tmp_settings->name, "group") == 0 || strcmp(tmp_settings->name, "media") == 0) { + if(!(jarray = json_find_member(jelements, tmp_settings->name))) { + jarray = json_mkarray(); + json_append_member(jelements, tmp_settings->name, jarray); + } + while(tmp_values) { + if(tmp_values->type == JSON_NUMBER) { + json_append_element(jarray, json_mknumber(tmp_values->number_, tmp_values->decimals)); + } else if(tmp_values->type == JSON_STRING) { + if(strcmp(tmp_settings->name, "media") == 0) { + if(strcmp(tmp_values->string_, media) == 0 || + strcmp(tmp_values->string_, "all") == 0 || + strcmp(media, "all") == 0) { + match = 1; + } + } + json_append_element(jarray, json_mkstring(tmp_values->string_)); + } + tmp_values = tmp_values->next; + } + } else if(!tmp_values->next) { + if(tmp_values->type == JSON_NUMBER) { + json_append_member(jelements, tmp_settings->name, json_mknumber(tmp_values->number_, tmp_values->decimals)); + } else if(tmp_values->type == JSON_STRING) { + json_append_member(jelements, tmp_settings->name, json_mkstring(tmp_values->string_)); + } + } else { + joptions = json_mkarray(); + while(tmp_values) { + if(tmp_values->type == JSON_NUMBER) { + json_append_element(joptions, json_mknumber(tmp_values->number_, tmp_values->decimals)); + } else if(tmp_values->type == JSON_STRING) { + json_append_element(joptions, json_mkstring(tmp_values->string_)); + } + tmp_values = tmp_values->next; + } + json_append_member(jelements, tmp_settings->name, joptions); + } + tmp_settings = tmp_settings->next; + } + + if(!(jarray = json_find_member(jelements, "media"))) { + if(level == 0) { + jarray = json_mkarray(); + json_append_element(jarray, json_mkstring("all")); + json_append_member(jelements, "media", jarray); + } + match = 1; + } + + struct protocols_t *tmp_protocols = tmp_gui->device->protocols; + while(tmp_protocols) { + tmp_options = tmp_protocols->listener->options; + if(tmp_options) { + while(tmp_options) { + if(level == 0 && (tmp_options->conftype == GUI_SETTING) + && json_find_member(jelements, tmp_options->name) == NULL) { + if(tmp_options->vartype == JSON_NUMBER) { + json_append_member(jelements, tmp_options->name, json_mknumber((int)(intptr_t)tmp_options->def, 0)); + } else if(tmp_options->vartype == JSON_STRING) { + json_append_member(jelements, tmp_options->name, json_mkstring((char *)tmp_options->def)); + } + } + tmp_options = tmp_options->next; + } + } + tmp_protocols = tmp_protocols->next; + } + if(match == 0) { + json_delete(jelements); + } else { + json_append_member(jroot, tmp_gui->id, jelements); + } + tmp_gui = tmp_gui->next; + } + + return jroot; +} + +/* Save the gui settings to the element struct */ +static void gui_save_setting(int i, JsonNode *jsetting, struct gui_elements_t *element) { + /* Struct to store the values */ + struct gui_values_t *vnode = NULL; + struct gui_settings_t *snode = NULL; + struct gui_settings_t *tmp_settings = NULL; + struct gui_values_t *tmp_values = NULL; + /* Temporary JSON pointer */ + struct JsonNode *jtmp; + + /* Variable holder for casting settings */ + char *stmp = NULL; + + /* If the JSON tag is an array, then it should be a values or id array */ + if(jsetting->tag == JSON_ARRAY) { + if(strcmp(jsetting->key, "group") == 0 || strcmp(jsetting->key, "media") == 0) { + /* Loop through the values of this values array */ + jtmp = json_first_child(jsetting); + if((snode = MALLOC(sizeof(struct gui_settings_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((snode->name = MALLOC(strlen(jsetting->key)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(snode->name, jsetting->key); + snode->values = NULL; + snode->next = NULL; + while(jtmp) { + if((vnode = MALLOC(sizeof(struct gui_values_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + vnode->name = NULL; + vnode->next = NULL; + if(jtmp->tag == JSON_STRING) { + if((vnode->string_ = MALLOC(strlen(jtmp->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(vnode->string_, jtmp->string_); + vnode->type = JSON_STRING; + } else if(jtmp->tag == JSON_NUMBER) { + vnode->number_ = jtmp->number_; + vnode->decimals = jtmp->decimals_; + vnode->type = JSON_NUMBER; + } + if(jtmp->tag == JSON_NUMBER || jtmp->tag == JSON_STRING) { + tmp_values = snode->values; + if(tmp_values) { + while(tmp_values->next != NULL) { + tmp_values = tmp_values->next; + } + tmp_values->next = vnode; + } else { + vnode->next = snode->values; + snode->values = vnode; + } + } + jtmp = jtmp->next; + } + tmp_settings = element->settings; + if(tmp_settings) { + while(tmp_settings->next != NULL) { + tmp_settings = tmp_settings->next; + } + tmp_settings->next = snode; + } else { + snode->next = element->settings; + element->settings = snode; + } + } + } else if(jsetting->tag == JSON_OBJECT) { + if((snode = MALLOC(sizeof(struct gui_settings_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((snode->name = MALLOC(strlen(jsetting->key)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(snode->name, jsetting->key); + snode->values = NULL; + snode->next = NULL; + + jtmp = json_first_child(jsetting); + while(jtmp) { + if(jtmp->tag == JSON_STRING) { + if((vnode = MALLOC(sizeof(struct gui_values_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((vnode->name = MALLOC(strlen(jtmp->key)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(vnode->name, jtmp->key); + if((vnode->string_ = MALLOC(strlen(jtmp->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(vnode->string_, jtmp->string_); + vnode->type = JSON_STRING; + vnode->next = NULL; + } else if(jtmp->tag == JSON_NUMBER) { + if((vnode = MALLOC(sizeof(struct gui_values_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((vnode->name = MALLOC(strlen(jtmp->key)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(vnode->name, jtmp->key); + vnode->number_ = jtmp->number_; + vnode->decimals = jtmp->decimals_; + vnode->type = JSON_NUMBER; + vnode->next = NULL; + } + if(jtmp->tag == JSON_NUMBER || jtmp->tag == JSON_STRING) { + tmp_values = snode->values; + if(tmp_values) { + while(tmp_values->next != NULL) { + tmp_values = tmp_values->next; + } + tmp_values->next = vnode; + } else { + vnode->next = snode->values; + snode->values = vnode; + } + } + jtmp = jtmp->next; + } + + tmp_settings = element->settings; + if(tmp_settings) { + while(tmp_settings->next != NULL) { + tmp_settings = tmp_settings->next; + } + tmp_settings->next = snode; + } else { + snode->next = element->settings; + element->settings = snode; + } + + } else { + /* New element settings node */ + if((snode = MALLOC(sizeof(struct gui_settings_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((snode->name = MALLOC(strlen(jsetting->key)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(snode->name, jsetting->key); + snode->values = NULL; + snode->next = NULL; + + if((vnode = MALLOC(sizeof(struct gui_values_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + int valid = 0; + /* Cast and store the new value */ + if(jsetting->tag == JSON_STRING && json_find_string(jsetting->parent, jsetting->key, &stmp) == 0) { + if((vnode->string_ = MALLOC(strlen(stmp)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + vnode->name = NULL; + strcpy(vnode->string_, stmp); + vnode->type = JSON_STRING; + valid = 1; + } else if(jsetting->tag == JSON_NUMBER && + (jtmp = json_find_member(jsetting->parent, jsetting->key)) != NULL && + jtmp->tag == JSON_NUMBER) { + vnode->name = NULL; + vnode->number_ = jtmp->number_; + vnode->decimals = jtmp->decimals_; + vnode->type = JSON_NUMBER; + valid = 1; + } + if(valid) { + tmp_values = snode->values; + if(tmp_values) { + while(tmp_values->next != NULL) { + tmp_values = tmp_values->next; + } + tmp_values->next = vnode; + } else { + vnode->next = snode->values; + snode->values = vnode; + } + } + + tmp_settings = element->settings; + if(tmp_settings) { + while(tmp_settings->next != NULL) { + tmp_settings = tmp_settings->next; + } + tmp_settings->next = snode; + } else { + snode->next = element->settings; + element->settings = snode; + } + } +} + +int gui_parse_elements(struct JsonNode *root, struct gui_elements_t *parent, int i) { + struct JsonNode *jsettings = NULL; + unsigned int nrgroup = 0, nrmedia = 0, nrname = 0, nrorder = 0; + int valid_setting = 0; + int have_error = 0; + + jsettings = json_first_child(root); + while(jsettings) { + if(strcmp(jsettings->key, "group") == 0) { + nrgroup++; + } else if(strcmp(jsettings->key, "media") == 0) { + nrmedia++; + } else if(strcmp(jsettings->key, "name") == 0) { + nrname++; + } else if(strcmp(jsettings->key, "order") == 0) { + nrorder++; + } + if(nrmedia > 1 || nrgroup > 1 || nrname > 1 || nrorder > 1) { + logprintf(LOG_ERR, "config gui element #%d \"%s\" of \"%s\", duplicate", i, jsettings->key, root->key); + have_error = 1; + goto clear; + } + if(strcmp(jsettings->key, "group") == 0) { + if(jsettings->tag != JSON_ARRAY) { + logprintf(LOG_ERR, "config gui element #%d \"%s\" of \"%s\", invalid", i, jsettings->key, root->key); + have_error = 1; + goto clear; + } else { + gui_save_setting(i, jsettings, parent); + } + } else if(strcmp(jsettings->key, "name") == 0) { + if(jsettings->tag != JSON_STRING) { + logprintf(LOG_ERR, "config gui element #%d \"%s\" of \"%s\", invalid", i, jsettings->key, root->key); + have_error = 1; + goto clear; + } else { + gui_save_setting(i, jsettings, parent); + } + } else if(strcmp(jsettings->key, "media") == 0) { + if(jsettings->tag != JSON_ARRAY) { + logprintf(LOG_ERR, "config gui element #%d \"%s\" of \"%s\", invalid", i, jsettings->key, root->key); + have_error = 1; + goto clear; + } else { + struct JsonNode *jvalues = json_first_child(jsettings); + unsigned int nrvalues = 0; + unsigned int hasall = 0; + while(jvalues) { + if(jvalues->tag == JSON_STRING) { + if(strcmp(jvalues->string_, "web") != 0 && + strcmp(jvalues->string_, "mobile") != 0 && + strcmp(jvalues->string_, "desktop") != 0 && + strcmp(jvalues->string_, "all") != 0) { + logprintf(LOG_ERR, "config gui element #%d \"media\" can only contain \"web\", \"desktop\", \"mobile\", or \"all\"", i, jsettings->key, root->key); + have_error = 1; + goto clear; + break; + } else { + nrvalues++; + } + if(strcmp(jvalues->string_, "all") == 0) { + hasall = 1; + } + } else { + logprintf(LOG_ERR, "config gui element #%d \"media\" of \"%s\", invalid", i, root->key); + have_error = 1; + goto clear; + break; + } + if(hasall == 1 && nrvalues > 1) { + logprintf(LOG_ERR, "config gui element #%d \"media\" value \"all\" cannot be combined with other values", i, jsettings->key, root->key); + have_error = 1; + goto clear; + } + jvalues = jvalues->next; + } + gui_save_setting(i, jsettings, parent); + } + } else if(!((strcmp(jsettings->key, "name") == 0 && jsettings->tag == JSON_STRING) + || (strcmp(jsettings->key, "type") == 0 && jsettings->tag == JSON_NUMBER) + || (strcmp(jsettings->key, "order") == 0 && jsettings->tag == JSON_NUMBER))) { + valid_setting = 0; + /* Check if the optional settings are valid + for the protocol(s) */ + struct protocols_t *proto = parent->device->protocols; + while(proto) { + struct options_t *options = proto->listener->options; + while(options) { + if(options->conftype == GUI_SETTING && + options->vartype == jsettings->tag && + strcmp(jsettings->key, options->name) == 0) { + valid_setting = 1; + break; + } + options = options->next; + } + proto = proto->next; + } + if(valid_setting == 1) { + gui_save_setting(i, jsettings, parent); + } else { + logprintf(LOG_ERR, "config gui element #%d \"%s\" of \"%s\", invalid", i, jsettings->key, root->key); + have_error = 1; + goto clear; + } + } + + jsettings = jsettings->next; + } + if(nrgroup == 0) { + logprintf(LOG_ERR, "config gui element #%d \"%s\", missing \"group\"", i, root->key); + have_error = 1; + goto clear; + } + if(nrname == 0) { + logprintf(LOG_ERR, "config gui element #%d \"%s\", missing \"name\"", i, root->key); + have_error = 1; + goto clear; + } + +clear: + return have_error; +} + +int gui_read(struct JsonNode *root) { + struct gui_elements_t *dnode = NULL; + struct gui_elements_t *tmp_gui = NULL; + struct JsonNode *jelements = NULL; + + int i = 0, have_error = 0; + + jelements = json_first_child(root); + while(jelements) { + i++; + if(jelements->tag != JSON_OBJECT) { + logprintf(LOG_ERR, "config gui element #%d \"%s\", invalid field(s)", i, jelements->key); + have_error = 1; + goto clear; + } else { + /* Check for duplicate fields */ + tmp_gui = gui_elements; + while(tmp_gui) { + if(strcmp(tmp_gui->id, jelements->key) == 0) { + logprintf(LOG_ERR, "config gui element #%d \"%s\", duplicate", i, jelements->key); + have_error = 1; + } + tmp_gui = tmp_gui->next; + } + + if((dnode = MALLOC(sizeof(struct gui_elements_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + dnode->settings = NULL; + dnode->next = NULL; + dnode->device = NULL; + + if(devices_get(jelements->key, &dnode->device) != 0) { + logprintf(LOG_ERR, "config gui element #%d \"%s\", device not configured", i, jelements->key); + have_error = 1; + FREE(dnode); + goto clear; + } + if((dnode->id = MALLOC(strlen(jelements->key)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(dnode->id, jelements->key); + + if(!have_error && gui_parse_elements(jelements, dnode, i) != 0) { + have_error = 1; + } + + tmp_gui = gui_elements; + if(tmp_gui) { + while(tmp_gui->next != NULL) { + tmp_gui = tmp_gui->next; + } + tmp_gui->next = dnode; + } else { + dnode->next = gui_elements; + gui_elements = dnode; + } + + if(have_error) { + goto clear; + } + } + jelements = jelements->next; + } +clear: + return have_error; +} + +void gui_init(void) { + pthread_mutexattr_init(&mutex_attr); + pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex_lock, &mutex_attr); + + /* Request hardware json object in main configuration */ + config_register(&config_gui, "gui"); + config_gui->readorder = 2; + config_gui->writeorder = 2; + config_gui->parse=&gui_read; + config_gui->sync=&gui_sync; + config_gui->gc=&gui_gc; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/config/gui.h b/lib/ESPiLight/pilight/libs/pilight/config/gui.h new file mode 100644 index 0000000..3b63af6 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/config/gui.h @@ -0,0 +1,55 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _GUI_H_ +#define _GUI_H_ + +#include "../core/json.h" +#include "../core/config.h" + +struct gui_values_t { + union { + char *string_; + double number_; + }; + int decimals; + char *name; + int type; + struct gui_values_t *next; +}; + +struct gui_settings_t { + char *name; + struct gui_values_t *values; + struct gui_settings_t *next; +}; + +struct gui_elements_t { + char *id; + struct devices_t *device; + struct gui_settings_t *settings; + struct gui_elements_t *next; +}; + +struct config_t *config_gui; + +struct gui_values_t *gui_media(char *name); +void gui_init(void); +int gui_gc(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/config/hardware.c b/lib/ESPiLight/pilight/libs/pilight/config/hardware.c new file mode 100644 index 0000000..23c7f61 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/config/hardware.c @@ -0,0 +1,463 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #include + #include + #include + #include + #ifdef __mips__ + #define __USE_UNIX98 + #endif + #include +#endif +#include +#include +#include +#include + +#include "../core/threads.h" +#include "../core/pilight.h" +#include "../core/common.h" +#include "../core/log.h" +#include "../core/json.h" +#include "../core/dso.h" +#include "settings.h" +#include "hardware.h" + + +static char *hwfile = NULL; +struct hardware_t *hardware; +struct conf_hardware_t *conf_hardware; + +#include "../hardware/hardware_header.h" + +#ifndef _WIN32 +static void hardware_remove(char *name) { + struct hardware_t *currP, *prevP; + + prevP = NULL; + + for(currP = hardware; currP != NULL; prevP = currP, currP = currP->next) { + + if(strcmp(currP->id, name) == 0) { + if(prevP == NULL) { + hardware = currP->next; + } else { + prevP->next = currP->next; + } + + logprintf(LOG_DEBUG, "removed config hardware module %s", currP->id); + FREE(currP->id); + options_delete(currP->options); + FREE(currP); + + break; + } + } +} +#endif + +void hardware_register(struct hardware_t **hw) { + if((*hw = MALLOC(sizeof(struct hardware_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + (*hw)->options = NULL; + (*hw)->wait = 0; + (*hw)->stop = 0; + (*hw)->running = 0; + (*hw)->minrawlen = 0; + (*hw)->maxrawlen = 0; + (*hw)->mingaplen = 0; + (*hw)->maxgaplen = 0; + + (*hw)->init = NULL; + (*hw)->deinit = NULL; + (*hw)->receiveOOK = NULL; + (*hw)->receivePulseTrain = NULL; + (*hw)->receiveAPI = NULL; + (*hw)->sendOOK = NULL; + (*hw)->sendAPI = NULL; + (*hw)->gc = NULL; + (*hw)->settings = NULL; + + pthread_mutexattr_init(&(*hw)->attr); + pthread_mutexattr_settype(&(*hw)->attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&(*hw)->lock, &(*hw)->attr); + pthread_cond_init(&(*hw)->signal, NULL); + + (*hw)->next = hardware; + hardware = (*hw); +} + +void hardware_set_id(hardware_t *hw, const char *id) { + if((hw->id = MALLOC(strlen(id)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(hw->id, id); +} + +static int hardware_gc(void) { + struct hardware_t *htmp = hardware; + struct conf_hardware_t *ctmp = NULL; + + while(hardware) { + htmp = hardware; + htmp->stop = 1; + pthread_mutex_unlock(&htmp->lock); + pthread_cond_signal(&htmp->signal); + while(htmp->running == 1) { + usleep(10); + } + thread_stop(htmp->id); + if(htmp->deinit != NULL) { + htmp->deinit(); + } + if(htmp->gc != NULL) { + htmp->gc(); + } + FREE(htmp->id); + options_delete(htmp->options); + hardware = hardware->next; + FREE(htmp); + } + if(hardware != NULL) { + FREE(hardware); + } + + while(conf_hardware) { + ctmp = conf_hardware; + conf_hardware = conf_hardware->next; + FREE(ctmp); + } + + if(hwfile != NULL) { + FREE(hwfile); + } + + logprintf(LOG_DEBUG, "garbage collected config hardware library"); + return EXIT_SUCCESS; +} + +static JsonNode *hardware_sync(int level, const char *display) { + struct conf_hardware_t *tmp = conf_hardware; + struct JsonNode *root = json_mkobject(); + while(tmp) { + struct JsonNode *module = json_mkobject(); + struct options_t *options = tmp->hardware->options; + while(options) { + if(options->vartype == JSON_NUMBER) { + json_append_member(module, options->name, json_mknumber(options->number_, 0)); + } else if(options->vartype == JSON_STRING) { + json_append_member(module, options->name, json_mkstring(options->string_)); + } + options = options->next; + } + json_append_member(root, tmp->hardware->id, module); + tmp = tmp->next; + } + + return root; +} + +static int hardware_parse(JsonNode *root) { + struct conf_hardware_t *hnode = NULL; + struct conf_hardware_t *tmp_confhw = NULL; + struct options_t *hw_options = NULL; + struct hardware_t *tmp_hardware = NULL; + struct hardware_t *hw = NULL; + + JsonNode *jvalues = NULL; + JsonNode *jchilds = json_first_child(root); + + int i = 0, have_error = 0, match = 0; + + while(jchilds) { + i++; + /* A hardware module can only be a JSON object */ + if(jchilds->tag != JSON_OBJECT) { + logprintf(LOG_ERR, "config hardware module #%d \"%s\", invalid format", i, jchilds->key); + have_error = 1; + goto clear; + } else { + /* Check if defined hardware module exists */ + tmp_hardware = hardware; + match = 0; + while(tmp_hardware) { + if(strcmp(tmp_hardware->id, jchilds->key) == 0) { + hw = tmp_hardware; + match = 1; + break; + } + tmp_hardware = tmp_hardware->next; + } + if(match == 0) { + logprintf(LOG_ERR, "config hardware module #%d \"%s\" does not exist", i, jchilds->key); + have_error = 1; + goto clear; + } + + /* Check for duplicate hardware modules */ + tmp_confhw = conf_hardware; + while(tmp_confhw) { + /* Only allow one module of the same name */ + if(strcmp(tmp_confhw->hardware->id, jchilds->key) == 0) { + logprintf(LOG_ERR, "config hardware module #%d \"%s\", duplicate", i, jchilds->key); + have_error = 1; + goto clear; + } + /* And only allow one module covering the same frequency */ + if(tmp_confhw->hardware->hwtype == hw->hwtype) { + logprintf(LOG_ERR, "config hardware module #%d \"%s\", duplicate freq.", i, jchilds->key); + have_error = 1; + goto clear; + } + tmp_confhw = tmp_confhw->next; + } + + /* Check if all options required by the hardware module are present */ + hw_options = hw->options; + while(hw_options) { + match = 0; + jvalues = json_first_child(jchilds); + while(jvalues) { + if(jvalues->tag == JSON_NUMBER || jvalues->tag == JSON_STRING) { + if(strcmp(jvalues->key, hw_options->name) == 0 && hw_options->argtype == OPTION_HAS_VALUE) { + match = 1; + break; + } + } + jvalues = jvalues->next; + } + if(match == 0) { + logprintf(LOG_ERR, "config hardware module #%d \"%s\", setting \"%s\" missing", i, jchilds->key, hw_options->name); + have_error = 1; + goto clear; + } else { + /* Check if setting contains a valid value */ +#if !defined(__FreeBSD__) && !defined(_WIN32) + regex_t regex; + int reti; + char *stmp = NULL; + + if(jvalues->tag == JSON_NUMBER) { + if((stmp = REALLOC(stmp, sizeof(jvalues->number_))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + sprintf(stmp, "%d", (int)jvalues->number_); + } else if(jvalues->tag == JSON_STRING) { + if((stmp = REALLOC(stmp, strlen(jvalues->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(stmp, jvalues->string_); + } + if(hw_options->mask != NULL) { + reti = regcomp(®ex, hw_options->mask, REG_EXTENDED); + if(reti) { + logprintf(LOG_ERR, "could not compile regex"); + exit(EXIT_FAILURE); + } + reti = regexec(®ex, stmp, 0, NULL, 0); + if(reti == REG_NOMATCH || reti != 0) { + logprintf(LOG_ERR, "config hardware module #%d \"%s\", setting \"%s\" invalid", i, jchilds->key, hw_options->name); + have_error = 1; + regfree(®ex); + goto clear; + } + regfree(®ex); + } + FREE(stmp); +#endif + } + hw_options = hw_options->next; + } + + /* Check for any settings that are not valid for this hardware module */ + jvalues = json_first_child(jchilds); + while(jvalues) { + match = 0; + if(jvalues->tag == JSON_NUMBER || jvalues->tag == JSON_STRING) { + hw_options = hw->options; + while(hw_options) { + if(strcmp(jvalues->key, hw_options->name) == 0 && jvalues->tag == hw_options->vartype) { + if(hw_options->vartype == JSON_NUMBER) { + options_set_number(&hw_options, hw_options->id, jvalues->number_); + } else if(hw_options->vartype == JSON_STRING) { + options_set_string(&hw_options, hw_options->id, jvalues->string_); + } + match = 1; + break; + } + hw_options = hw_options->next; + } + if(match == 0) { + logprintf(LOG_ERR, "config hardware module #%d \"%s\", setting \"%s\" invalid", i, jchilds->key, jvalues->key); + have_error = 1; + goto clear; + } + } + jvalues = jvalues->next; + } + + if(hw->settings != NULL) { + /* Sync all settings with the hardware module */ + jvalues = json_first_child(jchilds); + while(jvalues) { + if(hw->settings(jvalues) == EXIT_FAILURE) { + logprintf(LOG_ERR, "config hardware module #%d \"%s\", setting \"%s\" invalid", i, jchilds->key, jvalues->key); + have_error = 1; + goto clear; + } + jvalues = jvalues->next; + } + } + + if((hnode = MALLOC(sizeof(struct conf_hardware_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + hnode->hardware = hw; + hnode->next = conf_hardware; + conf_hardware = hnode; + } + jchilds = jchilds->next; + } + + if(tmp_confhw != NULL) { + FREE(tmp_confhw); + } +clear: + return have_error; +} + +void hardware_init(void) { + /* Request hardware json object in main configuration */ + config_register(&config_hardware, "hardware"); + config_hardware->readorder = 4; + config_hardware->writeorder = 4; + config_hardware->parse=&hardware_parse; + config_hardware->sync=&hardware_sync; + config_hardware->gc=&hardware_gc; + + #include "../hardware/hardware_init.h" + +#ifndef _WIN32 + void *handle = NULL; + void (*init)(void); + void (*compatibility)(struct module_t *module); + char path[PATH_MAX]; + struct module_t module; + char pilight_version[strlen(PILIGHT_VERSION)+1]; + char pilight_commit[3]; + char *hardware_root = NULL; + int check1 = 0, check2 = 0, valid = 1, hardware_root_free = 0; + strcpy(pilight_version, PILIGHT_VERSION); + + struct dirent *file = NULL; + DIR *d = NULL; + struct stat s; + + memset(pilight_commit, '\0', 3); + + if(settings_find_string("hardware-root", &hardware_root) != 0) { + /* If no hardware root was set, use the default hardware root */ + if((hardware_root = MALLOC(strlen(HARDWARE_ROOT)+2)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(hardware_root, HARDWARE_ROOT); + hardware_root_free = 1; + } + size_t len = strlen(hardware_root); + + if(hardware_root[len-1] != '/') { + strcat(hardware_root, "/"); + } + + if((d = opendir(hardware_root))) { + while((file = readdir(d)) != NULL) { + memset(path, '\0', PATH_MAX); + sprintf(path, "%s%s", hardware_root, file->d_name); + if(stat(path, &s) == 0) { + /* Check if file */ + if(S_ISREG(s.st_mode)) { + if(strstr(file->d_name, ".so") != NULL) { + valid = 1; + + if((handle = dso_load(path)) != NULL) { + init = dso_function(handle, "init"); + compatibility = dso_function(handle, "compatibility"); + if(init != NULL && compatibility != NULL ) { + compatibility(&module); + if(module.name != NULL && module.version != NULL && module.reqversion != NULL) { + char ver[strlen(module.reqversion)+1]; + strcpy(ver, module.reqversion); + + if((check1 = vercmp(ver, pilight_version)) > 0) { + valid = 0; + } + if(check1 == 0 && module.reqcommit != NULL) { + char com[strlen(module.reqcommit)+1]; + strcpy(com, module.reqcommit); + sscanf(HASH, "v%*[0-9].%*[0-9]-%[0-9]-%*[0-9a-zA-Z\n\r]", pilight_commit); + + if(strlen(pilight_commit) > 0 && (check2 = vercmp(com, pilight_commit)) > 0) { + valid = 0; + } + } + + if(valid == 1) { + char tmp[strlen(module.name)+1]; + strcpy(tmp, module.name); + hardware_remove(tmp); + init(); + logprintf(LOG_DEBUG, "loaded config hardware module %s v%s", file->d_name, module.version); + } else { + if(module.reqcommit != NULL) { + logprintf(LOG_ERR, "config hardware module %s requires at least pilight v%s (commit %s)", file->d_name, module.reqversion, module.reqcommit); + } else { + logprintf(LOG_ERR, "config hardware module %s requires at least pilight v%s", file->d_name, module.reqversion); + } + } + } else { + logprintf(LOG_ERR, "invalid module %s", file->d_name); + } + } + } + } + } + } + } + closedir(d); + } + if(hardware_root_free) { + FREE(hardware_root); + } +#endif +} diff --git a/lib/ESPiLight/pilight/libs/pilight/config/hardware.h b/lib/ESPiLight/pilight/libs/pilight/config/hardware.h new file mode 100644 index 0000000..1dc2173 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/config/hardware.h @@ -0,0 +1,99 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _HARDWARE_H_ +#define _HARDWARE_H_ + +typedef enum { + HWINTERNAL = -1, + NONE = 0, + RF433, + RF868, + RFIR, + ZWAVE, + SENSOR, + HWRELAY, + API +} hwtype_t; + +typedef enum { + COMNONE = 0, + COMOOK, + COMPLSTRAIN, + COMAPI +} communication_t; + +#include +#include "../core/options.h" +#include "../core/json.h" +#include "../core/config.h" +#include "defines.h" + +struct config_t *config_hardware; + +typedef struct rawcode_t { + int pulses[MAXPULSESTREAMLENGTH]; + int length; +} rawcode_t; + +typedef struct hardware_t { + char *id; + unsigned short wait; + unsigned short stop; + pthread_mutex_t lock; + pthread_cond_t signal; + pthread_mutexattr_t attr; + unsigned short running; + hwtype_t hwtype; + communication_t comtype; + struct options_t *options; + + int minrawlen; + int maxrawlen; + int mingaplen; + int maxgaplen; + + unsigned short (*init)(void); + unsigned short (*deinit)(void); + union { + int (*receiveOOK)(void); + void *(*receiveAPI)(void *param); + int (*receivePulseTrain)(struct rawcode_t *r); + }; + union { + int (*sendOOK)(int *code, int rawlen, int repeats); + int (*sendAPI)(struct JsonNode *code); + }; + int (*gc)(void); + unsigned short (*settings)(JsonNode *json); + struct hardware_t *next; +} hardware_t; + +typedef struct conf_hardware_t { + hardware_t *hardware; + struct conf_hardware_t *next; +} conf_hardware_t; + +extern struct hardware_t *hardware; +extern struct conf_hardware_t *conf_hardware; + +void hardware_init(void); +void hardware_register(struct hardware_t **hw); +void hardware_set_id(struct hardware_t *hw, const char *id); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/config/registry.c b/lib/ESPiLight/pilight/libs/pilight/config/registry.c new file mode 100644 index 0000000..b963e7f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/config/registry.c @@ -0,0 +1,273 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../core/pilight.h" +#include "../core/common.h" +#include "../core/json.h" +#include "../core/log.h" +#include "registry.h" + +struct JsonNode *registry = NULL; + +static pthread_mutex_t mutex_lock; +static pthread_mutexattr_t mutex_attr; + +static int registry_get_value_recursive(struct JsonNode *root, const char *key, void **value, void **decimals, int type) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char *sub = strstr(key, "."); + char *buff = MALLOC(strlen(key)+1); + strcpy(buff, key); + if(sub != NULL) { + int pos = sub-key; + buff[pos] = '\0'; + } + struct JsonNode *member = json_find_member(root, buff); + if(member != NULL) { + if(member->tag == type) { + if(type == JSON_NUMBER) { + *value = (void *)&member->number_; + *decimals = (void *)&member->decimals_; + } else if(type == JSON_STRING) { + *value = (void *)member->string_; + } + FREE(buff); + return 0; + } else if(member->tag == JSON_OBJECT) { + if(sub != NULL) { + int pos = sub-key; + strcpy(buff, &key[pos+1]); + } + int ret = registry_get_value_recursive(member, buff, value, decimals, type); + FREE(buff); + return ret; + } + } + FREE(buff); + return -1; +} + +static int registry_set_value_recursive(struct JsonNode *root, const char *key, void *value, int decimals, int type) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char *sub = strstr(key, "."); + char *buff = MALLOC(strlen(key)+1); + strcpy(buff, key); + if(sub != NULL) { + int pos = sub-key; + buff[pos] = '\0'; + } + struct JsonNode *member = json_find_member(root, buff); + if(member != NULL) { + if(member->tag == type) { + if(type == JSON_NUMBER) { + member->number_ = *(double *)value; + member->decimals_ = decimals; + } else if(type == JSON_STRING) { + member->string_ = REALLOC(member->string_, strlen(value)+1); + strcpy(member->string_, (char *)value); + } + FREE(buff); + return 0; + } else if(member->tag == JSON_OBJECT) { + if(sub != NULL) { + int pos = sub-key; + strcpy(buff, &key[pos+1]); + } + int ret = registry_set_value_recursive(member, buff, value, decimals, type); + FREE(buff); + return ret; + } + } else if(sub != NULL) { + member = json_mkobject(); + json_append_member(root, buff, member); + int pos = sub-key; + strcpy(buff, &key[pos+1]); + int ret = registry_set_value_recursive(member, buff, value, decimals, type); + FREE(buff); + return ret; + } else { + if(type == JSON_NUMBER) { + json_append_member(root, buff, json_mknumber(*(double *)value, decimals)); + } else if(type == JSON_STRING) { + json_append_member(root, buff, json_mkstring(value)); + } + FREE(buff); + return 0; + } + FREE(buff); + return -1; +} + +static void registry_remove_empty_parent(struct JsonNode *root) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct JsonNode *parent = root->parent; + if(json_first_child(root) == NULL) { + if(parent != NULL) { + json_remove_from_parent(root); + registry_remove_empty_parent(parent); + json_delete(root); + } + } +} + +static int registry_remove_value_recursive(struct JsonNode *root, const char *key) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char *sub = strstr(key, "."); + char *buff = MALLOC(strlen(key)+1); + strcpy(buff, key); + if(sub != NULL) { + int pos = sub-key; + buff[pos] = '\0'; + } + struct JsonNode *member = json_find_member(root, buff); + if(member != NULL) { + if(sub == NULL) { + json_remove_from_parent(member); + json_delete(member); + registry_remove_empty_parent(root); + FREE(buff); + return 0; + } + if(member->tag == JSON_OBJECT) { + if(sub != NULL) { + int pos = sub-key; + strcpy(buff, &key[pos+1]); + } + int ret = registry_remove_value_recursive(member, buff); + FREE(buff); + return ret; + } + } + FREE(buff); + return -1; +} + +int registry_get_string(const char *key, char **value) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(registry == NULL) { + return -1; + } + return registry_get_value_recursive(registry, key, (void *)value, NULL, JSON_STRING); +} + +int registry_get_number(const char *key, double *value, int *decimals) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(registry == NULL) { + return -1; + } + void *p = NULL; + void *q = NULL; + int ret = registry_get_value_recursive(registry, key, &p, &q, JSON_NUMBER); + if(ret == 0) { + *value = *(double *)p; + *decimals = *(int *)q; + } + return ret; +} + +int registry_set_string(const char *key, char *value) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(registry == NULL) { + registry = json_mkobject(); + } + return registry_set_value_recursive(registry, key, (void *)value, 0, JSON_STRING); +} + +int registry_set_number(const char *key, double value, int decimals) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(registry == NULL) { + registry = json_mkobject(); + } + void *p = (void *)&value; + return registry_set_value_recursive(registry, key, p, decimals, JSON_NUMBER); +} + +int registry_remove_value(const char *key) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(registry == NULL) { + return -1; + } + return registry_remove_value_recursive(registry, key); +} + +static int registry_parse(JsonNode *root) { + if(root->tag == JSON_OBJECT) { + char *content = json_stringify(root, NULL); + registry = json_decode(content); + json_free(content); + } else { + logprintf(LOG_ERR, "config registry should be of an object type"); + return -1; + } + return 0; +} + +static JsonNode *registry_sync(int level, const char *display) { + if(registry != NULL) { + char *content = json_stringify(registry, NULL); + struct JsonNode *jret = json_decode(content); + json_free(content); + return jret; + } else { + return NULL; + } +} + +int registry_gc(void) { + pthread_mutex_lock(&mutex_lock); + if(registry != NULL) { + json_delete(registry); + } + registry = NULL; + pthread_mutex_unlock(&mutex_lock); + + logprintf(LOG_DEBUG, "garbage collected config registry library"); + return 1; +} + +void registry_init(void) { + pthread_mutexattr_init(&mutex_attr); + pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex_lock, &mutex_attr); + + /* Request settings json object in main configuration */ + config_register(&config_registry, "registry"); + config_registry->readorder = 5; + config_registry->writeorder = 5; + config_registry->parse=®istry_parse; + config_registry->sync=®istry_sync; + config_registry->gc=®istry_gc; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/config/registry.h b/lib/ESPiLight/pilight/libs/pilight/config/registry.h new file mode 100644 index 0000000..a556645 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/config/registry.h @@ -0,0 +1,35 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _REGISTRY_H_ +#define _REGISTRY_H_ + +#include "../core/json.h" +#include "../core/config.h" + +struct config_t *config_registry; + +void registry_init(void); +int registry_gc(void); +int registry_get_string(const char *key, char **value); +int registry_get_number(const char *key, double *value, int *decimals); +int registry_set_string(const char *key, char *value); +int registry_set_number(const char *key, double value, int decimals); +int registry_remove_value(const char *key); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/config/rules.c b/lib/ESPiLight/pilight/libs/pilight/config/rules.c new file mode 100644 index 0000000..46d2834 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/config/rules.c @@ -0,0 +1,273 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../core/pilight.h" +#include "../core/common.h" +#include "../core/json.h" +#include "../core/log.h" +#include "../events/events.h" +#include "../events/operator.h" +#include "../events/action.h" +#include "../events/function.h" +#include "rules.h" +#include "gui.h" + +static struct rules_t *rules = NULL; + +static pthread_mutex_t mutex_lock; +static pthread_mutexattr_t mutex_attr; + +static int rules_parse(JsonNode *root) { + int have_error = 0, match = 0, x = 0; + unsigned int i = 0; + struct JsonNode *jrules = NULL; + char *rule = NULL; + double active = 1.0; + + event_function_init(); + event_operator_init(); + + if(root->tag == JSON_OBJECT) { + jrules = json_first_child(root); + while(jrules) { + i++; + if(jrules->tag == JSON_OBJECT) { + if(json_find_string(jrules, "rule", &rule) != 0) { + logprintf(LOG_ERR, "config rule #%d \"%s\", missing \"rule\"", i, jrules->key); + have_error = 1; + break; + } else { + active = 1.0; + json_find_number(jrules, "active", &active); + + struct rules_t *tmp = rules; + match = 0; + while(tmp) { + if(strcmp(tmp->name, jrules->key) == 0) { + match = 1; + break; + } + tmp = tmp->next; + } + if(match == 1) { + logprintf(LOG_ERR, "config rule #%d \"%s\" already exists", i, jrules->key); + have_error = 1; + break; + } + for(x=0;xkey);x++) { + if(!isalnum(jrules->key[x]) && jrules->key[x] != '-' && jrules->key[x] != '_') { + logprintf(LOG_ERR, "config rule #%d \"%s\", not alphanumeric", i, jrules->key); + have_error = 1; + break; + } + } + + struct rules_t *node = MALLOC(sizeof(struct rules_t)); + if(node == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + node->next = NULL; + node->values = NULL; + node->jtrigger = NULL; + node->nrdevices = 0; + node->status = 0; + node->devices = NULL; + node->actions = NULL; + node->nr = i; + if((node->name = MALLOC(strlen(jrules->key)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(node->name, jrules->key); +#ifndef WIN32 + clock_gettime(CLOCK_MONOTONIC, &node->timestamp.first); +#endif + if(event_parse_rule(rule, node, 0, 1) == -1) { + have_error = 1; + } +#ifndef WIN32 + clock_gettime(CLOCK_MONOTONIC, &node->timestamp.second); + logprintf(LOG_INFO, "rule #%d %s was parsed in %.6f seconds", node->nr, node->name, + ((double)node->timestamp.second.tv_sec + 1.0e-9*node->timestamp.second.tv_nsec) - + ((double)node->timestamp.first.tv_sec + 1.0e-9*node->timestamp.first.tv_nsec)); +#endif + node->status = 0; + if((node->rule = MALLOC(strlen(rule)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(node->rule, rule); + node->active = (unsigned short)active; + + tmp = rules; + if(tmp) { + while(tmp->next != NULL) { + tmp = tmp->next; + } + tmp->next = node; + } else { + node->next = rules; + rules = node; + } + /* + * In case of an error, we do want to + * save a pointer to our faulty rule + * so it can be properly garbage collected. + */ + if(have_error == 1) { + break; + } + } + } + jrules = jrules->next; + } + } else { + logprintf(LOG_ERR, "config rules should be placed in an object"); + have_error = 1; + } + + return have_error; +} + +static JsonNode *rules_sync(int level, const char *media) { + struct JsonNode *root = json_mkobject(); + struct JsonNode *rule = NULL; + struct rules_t *tmp = NULL; + struct gui_values_t *gui_values = NULL; + int match = 0, i = 0; + + tmp = rules; + + while(tmp) { + match = 0; + for(i=0;inrdevices;i++) { + if((gui_values = gui_media(tmp->devices[i])) != NULL) { + while(gui_values) { + if(gui_values->type == JSON_STRING) { + if(strcmp(gui_values->string_, media) == 0 || + strcmp(gui_values->string_, "all") == 0 || + strcmp(media, "all") == 0) { + match++; + } + } + gui_values = gui_values->next; + } + } + } + if(strcmp(media, "all") == 0) { + match = tmp->nrdevices; + } + if(match == tmp->nrdevices) { + rule = json_mkobject(); + json_append_member(rule, "rule", json_mkstring(tmp->rule)); + json_append_member(rule, "active", json_mknumber((double)tmp->active, 0)); + json_append_member(root, tmp->name, rule); + } + tmp = tmp->next; + } + return root; +} + +struct rules_t *rules_get(void) { + return rules; +} + +int rules_gc(void) { + struct rules_t *tmp_rules = NULL; + struct rules_values_t *tmp_values = NULL; + struct rules_actions_t *tmp_actions = NULL; + int i = 0; + + pthread_mutex_lock(&mutex_lock); + while(rules) { + tmp_rules = rules; + FREE(tmp_rules->name); + FREE(tmp_rules->rule); + events_tree_gc(tmp_rules->tree); + for(i=0;inrdevices;i++) { + FREE(tmp_rules->devices[i]); + } + while(tmp_rules->values) { + tmp_values = tmp_rules->values; + FREE(tmp_values->name); + FREE(tmp_values->device); + tmp_rules->values = tmp_rules->values->next; + FREE(tmp_values); + } + if(tmp_rules->values != NULL) { + FREE(tmp_rules->values); + } + while(tmp_rules->actions) { + tmp_actions = tmp_rules->actions; + if(tmp_actions->arguments != NULL) { + json_delete(tmp_actions->arguments); + } + tmp_rules->actions = tmp_rules->actions->next; + if(tmp_actions != NULL) { + FREE(tmp_actions); + } + } + if(tmp_rules->actions != NULL) { + FREE(tmp_rules->actions); + } + if(tmp_rules->jtrigger != NULL) { + json_delete(tmp_rules->jtrigger); + } + if(tmp_rules->devices != NULL) { + FREE(tmp_rules->devices); + } + rules = rules->next; + FREE(tmp_rules); + } + if(rules != NULL) { + FREE(rules); + } + rules = NULL; + pthread_mutex_unlock(&mutex_lock); + + logprintf(LOG_DEBUG, "garbage collected config rules library"); + return 1; +} + +void rules_init(void) { + event_action_init(); + + pthread_mutexattr_init(&mutex_attr); + pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex_lock, &mutex_attr); + + /* Request rules json object in main configuration */ + config_register(&config_rules, "rules"); + config_rules->readorder = 2; + config_rules->writeorder = 1; + config_rules->parse=&rules_parse; + config_rules->sync=&rules_sync; + config_rules->gc=&rules_gc; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/config/rules.h b/lib/ESPiLight/pilight/libs/pilight/config/rules.h new file mode 100644 index 0000000..01445b0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/config/rules.h @@ -0,0 +1,69 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _RULES_H_ +#define _RULES_H_ + +#include "../core/json.h" +#include "../core/config.h" +#include "../events/action.h" +#include "../datatypes/stack.h" + +typedef struct rules_values_t { + char *device; + char *name; + struct devices_settings_t *settings; + struct rules_values_t *next; +} rules_values_t; + +typedef struct rules_actions_t { + void *ptr; + struct rules_t *rule; + struct JsonNode *arguments; + struct JsonNode *parsedargs; + struct event_actions_t *action; + struct rules_actions_t *next; +} rules_actions_t; + +typedef struct rules_t { + char *rule; + char *name; + char **devices; + int nrdevices; + int nr; + int status; + struct { + struct timespec first; + struct timespec second; + } timestamp; + unsigned short active; + struct JsonNode *jtrigger; + /* Arguments to be send to the action */ + struct rules_actions_t *actions; + struct rules_values_t *values; + struct tree_t *tree; + struct rules_t *next; +} rules_t; + +struct config_t *config_rules; + +void rules_init(void); +int rules_gc(void); +struct rules_t *rules_get(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/config/settings.c b/lib/ESPiLight/pilight/libs/pilight/config/settings.c new file mode 100644 index 0000000..c3192d0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/config/settings.c @@ -0,0 +1,646 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include + +#ifndef _WIN32 + #include + #include +#endif +#include +#include +#include + +#include "../core/pilight.h" +#include "../core/common.h" +#include "../core/json.h" +#include "../core/log.h" + +#include "settings.h" + +typedef struct settings_t { + char *name; + int type; + union { + char *string_; + int number_; + }; + struct settings_t *next; +} settings_t; + +struct config_t *config_settings; + +static struct settings_t *settings = NULL; + +/* Add a string value to the settings struct */ +static void settings_add_string(const char *name, char *value) { + struct settings_t *snode = MALLOC(sizeof(struct settings_t)); + struct settings_t *tmp = NULL; + if(snode == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((snode->name = MALLOC(strlen(name)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(snode->name, name); + if((snode->string_ = MALLOC(strlen(value)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(snode->string_, value); + snode->type = JSON_STRING; + snode->next = NULL; + + tmp = settings; + if(tmp) { + while(tmp->next != NULL) { + tmp = tmp->next; + } + tmp->next = snode; + } else { + snode->next = settings; + settings = snode; + } +} + +/* Add an int value to the settings struct */ +static void settings_add_number(const char *name, int value) { + struct settings_t *tmp = NULL; + struct settings_t *snode = MALLOC(sizeof(struct settings_t)); + if(snode == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((snode->name = MALLOC(strlen(name)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(snode->name, name); + snode->number_ = value; + snode->type = JSON_NUMBER; + snode->next = NULL; + + tmp = settings; + if(tmp) { + while(tmp->next != NULL) { + tmp = tmp->next; + } + tmp->next = snode; + } else { + snode->next = settings; + settings = snode; + } +} + +/* Retrieve a numeric value from the settings struct */ +int settings_find_number(const char *name, int *out) { + struct settings_t *tmp_settings = settings; + + while(tmp_settings) { + if(strcmp(tmp_settings->name, name) == 0 && tmp_settings->type == JSON_NUMBER) { + *out = tmp_settings->number_; + return EXIT_SUCCESS; + } + tmp_settings = tmp_settings->next; + } + if(tmp_settings != NULL) { + FREE(tmp_settings); + } + + return EXIT_FAILURE; +} + +/* Retrieve a string value from the settings struct */ +int settings_find_string(const char *name, char **out) { + struct settings_t *tmp_settings = settings; + + while(tmp_settings) { + if(strcmp(tmp_settings->name, name) == 0 && tmp_settings->type == JSON_STRING) { + *out = tmp_settings->string_; + return EXIT_SUCCESS; + } + tmp_settings = tmp_settings->next; + } + if(tmp_settings != NULL) { + FREE(tmp_settings); + } + + return EXIT_FAILURE; +} + +static int settings_parse(JsonNode *root) { + int have_error = 0; + +#ifdef WEBSERVER + int web_port = WEBSERVER_HTTP_PORT; +#ifdef WEBSERVER_HTTPS + int web_ssl_port = WEBSERVER_HTTPS_PORT; +#endif + int own_port = -1; + + char *webgui_root = MALLOC(strlen(WEBSERVER_ROOT)+1); + if(webgui_root == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(webgui_root, WEBSERVER_ROOT); +#endif + +#if !defined(__FreeBSD__) && !defined(_WIN32) + regex_t regex; + int reti; +#endif + + struct JsonNode *jsettings = json_first_child(root); + + while(jsettings) { + if(strcmp(jsettings->key, "port") == 0) { + if(jsettings->tag != JSON_NUMBER) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a number larger than 0", jsettings->key); + have_error = 1; + goto clear; + } else if((int)jsettings->number_ == 0) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a number larger than 0", jsettings->key); + have_error = 1; + goto clear; + } else { +#ifdef WEBSERVER + if(strcmp(jsettings->key, "port") == 0) { + own_port = (int)jsettings->number_; + } +#endif + settings_add_number(jsettings->key, (int)jsettings->number_); + } + } else if(strcmp(jsettings->key, "firmware-gpio-reset") == 0 + || strcmp(jsettings->key, "firmware-gpio-sck") == 0 + || strcmp(jsettings->key, "firmware-gpio-mosi") == 0 + || strcmp(jsettings->key, "firmware-gpio-miso") == 0) { +#if !defined(__arm__) || !defined(__mips__) + return -1; +#endif + if(jsettings->tag != JSON_NUMBER) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a number larger than 0", jsettings->key); + return -1; + } +#ifndef _WIN32 + else if(wiringXValidGPIO((int)jsettings->number_) != 0) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a valid GPIO number", jsettings->key); + return -1; + } +#endif + } else if(strcmp(jsettings->key, "gpio-platform") == 0) { + if(jsettings->tag != JSON_STRING) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a supported gpio platform", jsettings->key); + return -1; + } else if(jsettings->string_ == NULL) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a supported gpio platform", jsettings->key); + return -1; + } else { + if(strcmp(jsettings->string_, "none") != 0) { +#ifndef _WIN32 + if(wiringXSetup(jsettings->string_, logprintf1) != 0) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a supported gpio platform", jsettings->key); + return -1; + } +#endif + } + settings_add_string(jsettings->key, jsettings->string_); + } + } else if(strcmp(jsettings->key, "standalone") == 0 || + strcmp(jsettings->key, "watchdog-enable") == 0 || + strcmp(jsettings->key, "stats-enable") == 0) { + if(jsettings->tag != JSON_NUMBER) { + logprintf(LOG_ERR, "config setting \"%s\" must be either 0 or 1", jsettings->key); + have_error = 1; + goto clear; + } else if(jsettings->number_ < 0 || jsettings->number_ > 1) { + logprintf(LOG_ERR, "config setting \"%s\" must be either 0 or 1", jsettings->key); + have_error = 1; + goto clear; + } else { + settings_add_number(jsettings->key, (int)jsettings->number_); + } + } else if(strcmp(jsettings->key, "log-level") == 0) { + if(jsettings->tag != JSON_NUMBER) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a number from 0 till 6", jsettings->key); + have_error = 1; + goto clear; + } else if((int)jsettings->number_ < 0 || (int)jsettings->number_ > 6) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a number from 0 till 6", jsettings->key); + have_error = 1; + goto clear; + } else { + settings_add_number(jsettings->key, (int)jsettings->number_); + } + } else if(strcmp(jsettings->key, "log-file") == 0 +#ifndef _WIN32 + || strcmp(jsettings->key, "pid-file") == 0 +#endif + || strcmp(jsettings->key, "pem-file") == 0) { + if(jsettings->tag != JSON_STRING) { + logprintf(LOG_ERR, "config setting \"%s\" must contain an existing file", jsettings->key); + have_error = 1; + goto clear; + } else if(jsettings->string_ == NULL) { + logprintf(LOG_ERR, "config setting \"%s\" must contain an existing file", jsettings->key); + have_error = 1; + goto clear; + } else { + if(path_exists(jsettings->string_) != EXIT_SUCCESS) { + logprintf(LOG_ERR, "config setting \"%s\" must point to an existing folder", jsettings->key); + have_error = 1; + goto clear; + } else { + settings_add_string(jsettings->key, jsettings->string_); + } + } + } else if(strcmp(jsettings->key, "whitelist") == 0) { + if(jsettings->tag != JSON_STRING) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a valid ip address", jsettings->key); + have_error = 1; + goto clear; + } else if(!jsettings->string_) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a valid ip addresses", jsettings->key); + have_error = 1; + goto clear; + } else if(strlen(jsettings->string_) > 0) { +#if !defined(__FreeBSD__) && !defined(_WIN32) + char validate[] = "^((\\*|[0-9]|[1-9][0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\\.(\\*|[0-9]|[1-9][0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\\.(\\*|[0-9]|[1-9][0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\\.(\\*|[0-9]|[1-9][0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))(,[\\ ]|,|$))+$"; + reti = regcomp(®ex, validate, REG_EXTENDED); + if(reti) { + logprintf(LOG_ERR, "could not compile regex"); + have_error = 1; + goto clear; + } + reti = regexec(®ex, jsettings->string_, 0, NULL, 0); + if(reti == REG_NOMATCH || reti != 0) { + logprintf(LOG_ERR, "config setting \"%s\" must contain valid ip addresses", jsettings->key); + have_error = 1; + regfree(®ex); + goto clear; + } + regfree(®ex); +#endif + int l = (int)strlen(jsettings->string_)-1; + if(jsettings->string_[l] == ' ' || jsettings->string_[l] == ',') { + logprintf(LOG_ERR, "config setting \"%s\" must contain valid ip addresses", jsettings->key); + have_error = 1; + goto clear; + } + settings_add_string(jsettings->key, jsettings->string_); + } +#ifdef WEBSERVER + +#ifdef WEBSERVER_HTTPS + } else if(strcmp(jsettings->key, "webserver-https-port") == 0) { + if(jsettings->tag != JSON_NUMBER) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a number larget than 0", jsettings->key); + have_error = 1; + goto clear; + } else if(jsettings->number_ < 0) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a number larger than 0", jsettings->key); + have_error = 1; + goto clear; + } else { + web_ssl_port = (int)jsettings->number_; + settings_add_number(jsettings->key, (int)jsettings->number_); + } +#endif + } else if(strcmp(jsettings->key, "webserver-http-port") == 0) { + if(jsettings->tag != JSON_NUMBER) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a number larget than 0", jsettings->key); + have_error = 1; + goto clear; + } else if(jsettings->number_ < 0) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a number larger than 0", jsettings->key); + have_error = 1; + goto clear; + } else { + web_port = (int)jsettings->number_; + settings_add_number(jsettings->key, (int)jsettings->number_); + } + } else if(strcmp(jsettings->key, "webserver-root") == 0) { + if(jsettings->tag != JSON_STRING) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a valid path", jsettings->key); + have_error = 1; + goto clear; + } else if(!jsettings->string_ || path_exists(jsettings->string_) != 0) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a valid path", jsettings->key); + have_error = 1; + goto clear; + } else { + if((webgui_root = REALLOC(webgui_root, strlen(jsettings->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(webgui_root, jsettings->string_); + settings_add_string(jsettings->key, jsettings->string_); + } + } else if(strcmp(jsettings->key, "webserver-enable") == 0) { + if(jsettings->tag != JSON_NUMBER) { + logprintf(LOG_ERR, "config setting \"%s\" must be either 0 or 1", jsettings->key); + have_error = 1; + goto clear; + } else if(jsettings->number_ < 0 || jsettings->number_ > 1) { + logprintf(LOG_ERR, "config setting \"%s\" must be either 0 or 1", jsettings->key); + have_error = 1; + goto clear; + } else { + settings_add_number(jsettings->key, (int)jsettings->number_); + } + } else if(strcmp(jsettings->key, "webserver-cache") == 0 || + strcmp(jsettings->key, "webgui-websockets") == 0) { + if(jsettings->tag != JSON_NUMBER) { + logprintf(LOG_ERR, "config setting \"%s\" must be either 0 or 1", jsettings->key); + have_error = 1; + goto clear; + } else if(jsettings->number_ < 0 || jsettings->number_ > 1) { + logprintf(LOG_ERR, "config setting \"%s\" must be either 0 or 1", jsettings->key); + have_error = 1; + goto clear; + } else { + settings_add_number(jsettings->key, (int)jsettings->number_); + } + } else if(strcmp(jsettings->key, "webserver-authentication") == 0 && jsettings->tag == JSON_ARRAY) { + JsonNode *jtmp = json_first_child(jsettings); + unsigned short i = 0; + while(jtmp) { + i++; + if(jtmp->tag == JSON_STRING) { + if(i == 1) { + settings_add_string("webserver-authentication-username", jtmp->string_); + } else if(i == 2) { + settings_add_string("webserver-authentication-password", jtmp->string_); + } + } else { + have_error = 1; + break; + } + if(i > 2) { + have_error = 1; + break; + } + jtmp = jtmp->next; + } + if(i != 2 || have_error == 1) { + logprintf(LOG_ERR, "config setting \"%s\" must be in the format of [ \"username\", \"password\" ]", jsettings->key); + have_error = 1; + goto clear; + } +#endif // WEBSERVER + } else if(strcmp(jsettings->key, "ntp-servers") == 0 && jsettings->tag == JSON_ARRAY) { + JsonNode *jtmp = json_first_child(jsettings); + unsigned short i = 0; + char name[25]; + while(jtmp) { + if(jtmp->tag == JSON_STRING) { + sprintf(name, "ntpserver%d", i); + settings_add_string(name, jtmp->string_); + } else { + have_error = 1; + break; + } + jtmp = jtmp->next; + i++; + } + if(have_error == 1) { + logprintf(LOG_ERR, "config setting \"%s\" must be in the format of [ \"0.eu.pool.ntp.org\", ... ]", jsettings->key); + have_error = 1; + goto clear; + } + } else if(strcmp(jsettings->key, "protocol-root") == 0 || + strcmp(jsettings->key, "hardware-root") == 0 || + strcmp(jsettings->key, "actions-root") == 0 || + strcmp(jsettings->key, "functions-root") == 0 || + strcmp(jsettings->key, "operators-root") == 0) { + if(jsettings->tag != JSON_STRING) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a valid path", jsettings->key); + have_error = 1; + goto clear; + } else if(!jsettings->string_ || path_exists(jsettings->string_) != 0) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a valid path", jsettings->key); + have_error = 1; + goto clear; + } else { + settings_add_string(jsettings->key, jsettings->string_); + } +#ifdef EVENTS + } else if(strcmp(jsettings->key, "smtp-sender") == 0) { + if(jsettings->tag != JSON_STRING) { + logprintf(LOG_ERR, "config setting \"%s\" must contain an e-mail address", jsettings->key); + have_error = 1; + goto clear; + } else if(jsettings->string_ == NULL) { + logprintf(LOG_ERR, "config setting \"%s\" must contain an e-mail address", jsettings->key); + have_error = 1; + goto clear; + } else if(strlen(jsettings->string_) > 0 && check_email_addr(jsettings->string_, 0, 0) < 0) { + logprintf(LOG_ERR, "config setting \"%s\" must contain an e-mail address", jsettings->key); + have_error = 1; + goto clear; + } else { + settings_add_string(jsettings->key, jsettings->string_); + } + } else if(strcmp(jsettings->key, "smtp-ssl") == 0) { + if(jsettings->tag != JSON_NUMBER) { + logprintf(LOG_ERR, "config setting \"%s\" must be either 0 or 1", jsettings->key); + have_error = 1; + goto clear; + } else if(jsettings->number_ < 0 || jsettings->number_ > 1) { + logprintf(LOG_ERR, "config setting \"%s\" must be either 0 or 1", jsettings->key); + have_error = 1; + goto clear; + } else { + settings_add_number(jsettings->key, (int)jsettings->number_); + } + } else if(strcmp(jsettings->key, "smtp-user") == 0) { + if(jsettings->tag != JSON_STRING) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a user id", jsettings->key); + have_error = 1; + goto clear; + } else if(jsettings->string_ == NULL) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a user id", jsettings->key); + have_error = 1; + goto clear; + } else { + settings_add_string(jsettings->key, jsettings->string_); + } + } else if(strcmp(jsettings->key, "smtp-password") == 0) { + if(jsettings->tag != JSON_STRING) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a password string", jsettings->key); + have_error = 1; + goto clear; + } else if(jsettings->string_ == NULL) { + logprintf(LOG_ERR, "config setting \"%s\" must contain a password string", jsettings->key); + have_error = 1; + goto clear; + } else { + settings_add_string(jsettings->key, jsettings->string_); + } + } else if(strcmp(jsettings->key, "smtp-host") == 0) { + if(jsettings->tag != JSON_STRING) { + logprintf(LOG_ERR, "config setting \"%s\" must contain an smtp host address", jsettings->key); + have_error = 1; + goto clear; + } else if(jsettings->string_ == NULL) { + logprintf(LOG_ERR, "config setting \"%s\" must contain an smtp host address", jsettings->key); + have_error = 1; + goto clear; + } else if(strlen(jsettings->string_) > 0) { +#if !defined(__FreeBSD__) && !defined(_WIN32) + char validate[] = "^([a-zA-Z0-9\\_\\-]){2,20}(\\.([a-zA-Z0-9\\_\\-]){2,20}){2,3}$"; + reti = regcomp(®ex, validate, REG_EXTENDED); + if(reti) { + logprintf(LOG_ERR, "could not compile regex for %s", jsettings->key); + have_error = 1; + goto clear; + } + reti = regexec(®ex, jsettings->string_, 0, NULL, 0); + if(reti == REG_NOMATCH || reti != 0) { + logprintf(LOG_ERR, "config setting \"%s\" must contain an smtp host address", jsettings->key); + have_error = 1; + regfree(®ex); + goto clear; + } + regfree(®ex); +#endif + settings_add_string(jsettings->key, jsettings->string_); + } + } else if(strcmp(jsettings->key, "smtp-port") == 0) { + if(jsettings->tag != JSON_NUMBER) { + logprintf(LOG_ERR, "config setting \"%s\" must be 25, 465 or 587", jsettings->key); + have_error = 1; + goto clear; + } else if((int)jsettings->number_ != 25 && (int)jsettings->number_ != 465 && (int)jsettings->number_ != 587) { + logprintf(LOG_ERR, "config setting \"%s\" must be 25, 465 or 587", jsettings->key); + have_error = 1; + goto clear; + } else { + settings_add_number(jsettings->key, (int)jsettings->number_); + } +#endif //EVENTS + } else { + logprintf(LOG_ERR, "config setting \"%s\" is invalid", jsettings->key); + have_error = 1; + goto clear; + } + jsettings = jsettings->next; + } + +#ifdef WEBSERVER + if(web_port == own_port) { + logprintf(LOG_ERR, "config setting \"port\" and \"webserver-http-port\" cannot be the same"); + have_error = 1; + goto clear; + } +#ifdef WEBSERVER_HTTPS + if(web_ssl_port == own_port) { + logprintf(LOG_ERR, "config setting \"port\" and \"webserver-https-port\" cannot be the same"); + have_error = 1; + goto clear; + } +#endif + +#endif +clear: +#ifdef WEBSERVER + if(webgui_root != NULL) { + FREE(webgui_root); + } +#endif + return have_error; +} + +static JsonNode *settings_sync(int level, const char *display) { + struct JsonNode *root = json_mkobject(); + struct JsonNode *ntpservers = NULL; + struct settings_t *tmp = settings; + char *username = NULL, *password = NULL; + + while(tmp) { + if(strncmp(tmp->name, "ntpserver", 9) == 0 && tmp->type == JSON_STRING) { + if(ntpservers == NULL) { + ntpservers = json_mkarray(); + } + json_append_element(ntpservers, json_mkstring(tmp->string_)); + } else { + if(json_find_member(root, "ntp-servers") == NULL && ntpservers != NULL) { + json_append_member(root, "ntp-servers", ntpservers); + } + if(strcmp(tmp->name, "webserver-authentication-username") == 0 && tmp->type == JSON_STRING) { + username = tmp->string_; + } else if(strcmp(tmp->name, "webserver-authentication-password") == 0 && tmp->type == JSON_STRING) { + password = tmp->string_; + } else if(tmp->type == JSON_NUMBER) { + json_append_member(root, tmp->name, json_mknumber((double)tmp->number_, 0)); + } else if(tmp->type == JSON_STRING) { + json_append_member(root, tmp->name, json_mkstring(tmp->string_)); + } + } + if(username != NULL && password != NULL && json_find_member(root, "webserver-authentication") == NULL) { + struct JsonNode *jarray = json_mkarray(); + json_append_element(jarray, json_mkstring(username)); + json_append_element(jarray, json_mkstring(password)); + json_append_member(root, "webserver-authentication", jarray); + } + tmp = tmp->next; + } + if(json_find_member(root, "ntp-servers") == NULL && ntpservers != NULL) { + json_append_member(root, "ntp-servers", ntpservers); + } + + return root; +} + +static int settings_gc(void) { + struct settings_t *tmp; + + while(settings) { + tmp = settings; + FREE(tmp->name); + if(tmp->type == JSON_STRING) { + FREE(tmp->string_); + } + settings = settings->next; + FREE(tmp); + } + if(settings != NULL) { + FREE(settings); + } + + + logprintf(LOG_DEBUG, "garbage collected config settings library"); + return 1; +} + +void settings_init(void) { + /* Request settings json object in main configuration */ + config_register(&config_settings, "settings"); + config_settings->readorder = 0; + config_settings->writeorder = 3; + config_settings->parse=&settings_parse; + config_settings->sync=&settings_sync; + config_settings->gc=&settings_gc; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/config/settings.h b/lib/ESPiLight/pilight/libs/pilight/config/settings.h new file mode 100644 index 0000000..2471414 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/config/settings.h @@ -0,0 +1,31 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _SETTINGS_H_ +#define _SETTINGS_H_ + +#include "../core/json.h" +#include "../core/config.h" + +struct config_t *config_settings; + +int settings_find_number(const char *name, int *out); +int settings_find_string(const char *name, char **out); +void settings_init(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/CMakeExclude.txt b/lib/ESPiLight/pilight/libs/pilight/core/CMakeExclude.txt new file mode 100644 index 0000000..5098855 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/CMakeExclude.txt @@ -0,0 +1,18 @@ +include(../../../CMakeConfig.txt) + +if(NOT WIN32) + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/strptime.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/strptime.h") +endif() + +if(${PROTOCOL_ARPING} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/arp.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/arp.h") +endif() + +if(${WEBSERVER} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/webserver.h") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/mongoose.h") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/webserver.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/mongoose.c") +endif() \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/core/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/core/CMakeLists.txt new file mode 100644 index 0000000..a6148ce --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/CMakeLists.txt @@ -0,0 +1,8 @@ +project(pilight_core) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +include(CMakeExclude.txt) + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/pilight/core/arp.c b/lib/ESPiLight/pilight/libs/pilight/core/arp.c new file mode 100644 index 0000000..f0ca84a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/arp.c @@ -0,0 +1,581 @@ +/* + * The ARP Scanner (arp-scan) is Copyright (C) 2005-2013 Roy Hills, + * NTA Monitor Ltd. + * + * This file is part of arp-scan. + * + * arp-scan is FREE software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the FREE Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * arp-scan is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with arp-scan. If not, see . + * + * arp-scan -- The ARP Scanner + * + * Author: Roy Hills + * Date: 13 October 2005 + * + * Usage: + * arp-scan [options] [host...] + * + * Description: + * + * arp-scan sends the specified ARP packet to the specified hosts + * and displays any responses received. + * + * The ARP protocol is defined in RFC 826 Ethernet Address Resolution Protocol + * + * arp-scan was stripped and adapter by CurlyMo 2014 for pilight. + * + */ + +#include +#include +#include +#include +#include +#ifdef _WIN32 + #define WPCAP + #define WIN32_LEAN_AND_MEAN + #include + #include + #include + #include + #include + #include + #define MSG_NOSIGNAL 0 +#else + #include + #include + #include + #include + #include + #include + #include + #include + #include + #ifdef __FREEBSD__ + #include + #include + #else + #include + #endif + #include + #include +#endif +#include + +#include +#include +#include +#include +#include + +#include "network.h" +#include "mem.h" +#include "log.h" +#include "arp.h" + +#define MAXLINE 255 +#define MAX_FRAME 2048 +#define PACKET_OVERHEAD 18 +#define MINIMUM_FRAME_SIZE 46 +#define ETHER_HDR_SIZE 14 +#define ARP_PKT_SIZE 28 +#define FRAMING_ETHERNET_II 0 +#define FRAMING_LLC_SNAP 1 + +typedef struct host_entry { + double timeout; + struct in_addr addr; + struct timeval last_send_time; + unsigned short num_sent; + unsigned short num_recv; + unsigned short found; + unsigned char live; + uint8_t mac[ETH_ALEN]; +} host_entry; + +typedef struct ether_hdr { + uint8_t dest_addr[ETH_ALEN]; + uint8_t src_addr[ETH_ALEN]; + uint16_t frame_type; +} ether_hdr; + +typedef struct arp_ether_ipv4 { + uint16_t ar_hrd; + uint16_t ar_pro; + uint8_t ar_hln; + uint8_t ar_pln; + uint16_t ar_op; + uint8_t ar_sha[ETH_ALEN]; + uint32_t ar_sip; + uint8_t ar_tha[ETH_ALEN]; + uint32_t ar_tip; +} arp_ether_ipv4; + +static struct host_entry **helist; +static struct host_entry **cursor; +static unsigned num_hosts = 0; +static unsigned live_count = 0; + +static void advance_cursor(void) { + if(live_count > 0) { + do { + if(cursor == (helist+(num_hosts-1))) { + cursor = helist; + } else { + cursor++; + } + } while(!(*cursor)->live); + } +} + +static void remove_host(host_entry **he) { + if((*he)->live == 1) { + (*he)->live = 0; + live_count--; + if(*he == *cursor) { + advance_cursor(); + } + } +} + +static void timeval_diff(const struct timeval *a, const struct timeval *b, struct timeval *diff) { + struct timeval temp; + + temp.tv_sec = b->tv_sec; + temp.tv_usec = b->tv_usec; + + if(a->tv_usec < temp.tv_usec) { + int nsec = (temp.tv_usec - a->tv_usec) / 1000000 + 1; + temp.tv_usec -= 1000000 * nsec; + temp.tv_sec += nsec; + } + if(a->tv_usec - temp.tv_usec > 1000000) { + int nsec = (a->tv_usec - temp.tv_usec) / 1000000; + temp.tv_usec += 1000000 * nsec; + temp.tv_sec -= nsec; + } + + diff->tv_sec = a->tv_sec - temp.tv_sec; + diff->tv_usec = a->tv_usec - temp.tv_usec; +} + + +static void marshal_arp_pkt(unsigned char *buffer, ether_hdr *frame_hdr, arp_ether_ipv4 *arp_pkt, int *buf_siz) { + unsigned char *cp; + int packet_size; + + cp = buffer; + + packet_size = sizeof(frame_hdr->dest_addr) + sizeof(frame_hdr->src_addr) + + sizeof(frame_hdr->frame_type) + + sizeof(arp_pkt->ar_hrd) + sizeof(arp_pkt->ar_pro) + + sizeof(arp_pkt->ar_hln) + sizeof(arp_pkt->ar_pln) + + sizeof(arp_pkt->ar_op) + sizeof(arp_pkt->ar_sha) + + sizeof(arp_pkt->ar_sip) + sizeof(arp_pkt->ar_tha) + + sizeof(arp_pkt->ar_tip); + + memcpy(cp, &(frame_hdr->dest_addr), sizeof(frame_hdr->dest_addr)); + cp += sizeof(frame_hdr->dest_addr); + memcpy(cp, &(frame_hdr->src_addr), sizeof(frame_hdr->src_addr)); + cp += sizeof(frame_hdr->src_addr); + + memcpy(cp, &(frame_hdr->frame_type), sizeof(frame_hdr->frame_type)); + cp += sizeof(frame_hdr->frame_type); + + memcpy(cp, &(arp_pkt->ar_hrd), sizeof(arp_pkt->ar_hrd)); + cp += sizeof(arp_pkt->ar_hrd); + memcpy(cp, &(arp_pkt->ar_pro), sizeof(arp_pkt->ar_pro)); + cp += sizeof(arp_pkt->ar_pro); + memcpy(cp, &(arp_pkt->ar_hln), sizeof(arp_pkt->ar_hln)); + cp += sizeof(arp_pkt->ar_hln); + memcpy(cp, &(arp_pkt->ar_pln), sizeof(arp_pkt->ar_pln)); + cp += sizeof(arp_pkt->ar_pln); + memcpy(cp, &(arp_pkt->ar_op), sizeof(arp_pkt->ar_op)); + cp += sizeof(arp_pkt->ar_op); + memcpy(cp, &(arp_pkt->ar_sha), sizeof(arp_pkt->ar_sha)); + cp += sizeof(arp_pkt->ar_sha); + memcpy(cp, &(arp_pkt->ar_sip), sizeof(arp_pkt->ar_sip)); + cp += sizeof(arp_pkt->ar_sip); + memcpy(cp, &(arp_pkt->ar_tha), sizeof(arp_pkt->ar_tha)); + cp += sizeof(arp_pkt->ar_tha); + memcpy(cp, &(arp_pkt->ar_tip), sizeof(arp_pkt->ar_tip)); + cp += sizeof(arp_pkt->ar_tip); + + *buf_siz = packet_size; +} + +static int unmarshal_arp_pkt(const unsigned char *buffer, size_t buf_len, ether_hdr *frame_hdr, arp_ether_ipv4 *arp_pkt, unsigned char *extra_data, size_t *extra_data_len) { + const unsigned char *cp; + int framing = FRAMING_ETHERNET_II; + cp = buffer; + + memcpy(&(frame_hdr->dest_addr), cp, sizeof(frame_hdr->dest_addr)); + cp += sizeof(frame_hdr->dest_addr); + memcpy(&(frame_hdr->src_addr), cp, sizeof(frame_hdr->src_addr)); + cp += sizeof(frame_hdr->src_addr); + + memcpy(&(frame_hdr->frame_type), cp, sizeof(frame_hdr->frame_type)); + cp += sizeof(frame_hdr->frame_type); + + if(*cp == 0xAA && *(cp+1) == 0xAA && *(cp+2) == 0x03) { + cp += 8; + framing = FRAMING_LLC_SNAP; + } + + memcpy(&(arp_pkt->ar_hrd), cp, sizeof(arp_pkt->ar_hrd)); + cp += sizeof(arp_pkt->ar_hrd); + memcpy(&(arp_pkt->ar_pro), cp, sizeof(arp_pkt->ar_pro)); + cp += sizeof(arp_pkt->ar_pro); + memcpy(&(arp_pkt->ar_hln), cp, sizeof(arp_pkt->ar_hln)); + cp += sizeof(arp_pkt->ar_hln); + memcpy(&(arp_pkt->ar_pln), cp, sizeof(arp_pkt->ar_pln)); + cp += sizeof(arp_pkt->ar_pln); + memcpy(&(arp_pkt->ar_op), cp, sizeof(arp_pkt->ar_op)); + cp += sizeof(arp_pkt->ar_op); + memcpy(&(arp_pkt->ar_sha), cp, sizeof(arp_pkt->ar_sha)); + cp += sizeof(arp_pkt->ar_sha); + memcpy(&(arp_pkt->ar_sip), cp, sizeof(arp_pkt->ar_sip)); + cp += sizeof(arp_pkt->ar_sip); + memcpy(&(arp_pkt->ar_tha), cp, sizeof(arp_pkt->ar_tha)); + cp += sizeof(arp_pkt->ar_tha); + memcpy(&(arp_pkt->ar_tip), cp, sizeof(arp_pkt->ar_tip)); + cp += sizeof(arp_pkt->ar_tip); + + return framing; +} + +void arp_add_host(const char *host_name) { + + if((helist = REALLOC(helist, ((num_hosts+1) * sizeof(struct host_entry *)))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + if((helist[num_hosts] = MALLOC(sizeof(struct host_entry))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + helist[num_hosts]->addr.s_addr = inet_addr(host_name); + helist[num_hosts]->live = 1; + helist[num_hosts]->timeout = 500 * 1000; /* Convert from ms to us */ + helist[num_hosts]->num_sent = 0; + helist[num_hosts]->num_recv = 0; + helist[num_hosts]->found = 0; + helist[num_hosts]->last_send_time.tv_sec = 0; + helist[num_hosts]->last_send_time.tv_usec = 0; + num_hosts++; +} + +static int send_packet(pcap_t *pcap_handle, host_entry *he, struct timeval *last_packet_time, char source_mac[ETH_ALEN]) { + struct ether_hdr frame_hdr; + struct arp_ether_ipv4 arpei; + unsigned char buf[MAX_FRAME]; + unsigned char target_mac[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + unsigned char arp_tha[ETH_ALEN] = {0, 0, 0, 0, 0, 0}; + int buflen = 0; + int nsent = 0; + + memcpy(frame_hdr.dest_addr, target_mac, ETH_ALEN); + memcpy(frame_hdr.src_addr, source_mac, ETH_ALEN); + frame_hdr.frame_type = htons(0x0806); + + memset(&arpei, '\0', sizeof(arp_ether_ipv4)); + arpei.ar_hrd = htons(1); + arpei.ar_pro = htons(0x0800); + arpei.ar_hln = 6; + arpei.ar_pln = 4; + arpei.ar_op = htons(1); + memcpy(arpei.ar_sha, source_mac, ETH_ALEN); + memcpy(arpei.ar_tha, arp_tha, ETH_ALEN); + arpei.ar_sip = 0; + if(he != NULL) { + arpei.ar_tip = he->addr.s_addr; + } + + marshal_arp_pkt(buf, &frame_hdr, &arpei, &buflen); + + if(he == NULL) { + return buflen; + } + + if(he->live == 0) { + logprintf(LOG_ERR, "send_packet called on non-live host"); + return -1; + } + + gettimeofday(last_packet_time, NULL); + he->last_send_time.tv_sec = last_packet_time->tv_sec; + he->last_send_time.tv_usec = last_packet_time->tv_usec; + he->num_sent++; + + nsent = pcap_sendpacket(pcap_handle, buf, buflen); + if(nsent < 0) { + logprintf(LOG_ERR, "ERROR: failed to send packet"); + return -1; + } + + return buflen; +} + +static struct host_entry *find_host(host_entry **he, struct in_addr *addr) { + host_entry **p; + int found = 0; + + if(*he == NULL) { + return NULL; + } + + p = he; + + do { + if((*p)->addr.s_addr == addr->s_addr) { + found = 1; + } else { + if(p == helist) { + p = helist + (num_hosts-1); /* Wrap round to end */ + } else { + p--; + } + } + } while(!found && p != he); + + if(found == 1) { + return *p; + } else { + return NULL; + } +} + +static void callback(u_char *args, const struct pcap_pkthdr *header, const u_char *packet_in) { + struct arp_ether_ipv4 arpei; + struct ether_hdr frame_hdr; + size_t n = header->caplen; + struct in_addr source_ip; + struct host_entry *temp_cursor = NULL; + + if(n < ETHER_HDR_SIZE + ARP_PKT_SIZE) { + logprintf(LOG_ERR, "%d byte packet too short to decode\n", (int)n); + return; + } + + unmarshal_arp_pkt(packet_in, n, &frame_hdr, &arpei, NULL, NULL); + source_ip.s_addr = arpei.ar_sip; + temp_cursor = find_host(cursor, &source_ip); + + if(temp_cursor != NULL) { + temp_cursor->num_recv++; + if(temp_cursor->live == 1) { + temp_cursor->found = 1; + memcpy(temp_cursor->mac, arpei.ar_sha, ETH_ALEN); + } + remove_host(&temp_cursor); + } +} + +static int recvfrom_wto(long unsigned int tmo, pcap_t *pcap_handle) { +#ifdef _WIN32 + WaitForSingleObject(pcap_getevent(pcap_handle), (DWORD)tmo); +#else + fd_set readset; + struct timeval to; + int n = 0, pcap_fd = 0; + if((pcap_fd = pcap_get_selectable_fd(pcap_handle)) < 0) { + logprintf(LOG_ERR, "pcap_fileno: %s", pcap_geterr(pcap_handle)); + return -1; + } + FD_ZERO(&readset); + if(pcap_fd >= 0) + FD_SET(pcap_fd, &readset); + to.tv_sec = (__time_t)(tmo/(long unsigned int)1000000); + to.tv_usec = (__suseconds_t)(tmo - (long unsigned int)((time_t)1000000 * to.tv_sec)); + n = select(pcap_fd+1, &readset, NULL, NULL, &to); + if(n < 0) { + logprintf(LOG_ERR, "select"); + return -1; + } else if (n == 0 && pcap_fd >= 0) { + return 1; + } +#endif + if(pcap_handle != NULL) { + if((pcap_dispatch(pcap_handle, -1, callback, NULL)) == -1) { + logprintf(LOG_ERR, "pcap_dispatch: %s", pcap_geterr(pcap_handle)); + return -1; + } + return 0; + } + return -1; +} + +int arp_resolv(char *if_name, char *srcmac, char *dstmac, char **ip) { + struct timeval now, diff, last_packet_time; + pcap_t *pcap_handle = NULL; + unsigned long int loop_timediff = 0, host_timediff = 0; + unsigned long int req_interval = 0, select_timeout = 0; + unsigned long int cum_err = 0, interval = 0; + char *if_cpy = NULL, error[PCAP_ERRBUF_SIZE], *e = error; + int found = -1; + int reset_cum_err = 0, first_timeout = 1; + int i = 0; + + if((if_cpy = MALLOC(strlen(if_name)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(if_cpy, if_name); + +#ifdef _WIN32 + int match = 0; + pcap_if_t *alldevs = NULL, *d = NULL; + + if(pcap_findalldevs(&alldevs, e) == -1){ + logprintf(LOG_ERR, "pcap_findalldevs: %s", e); + goto close; + } + + d = alldevs; + match = 0; + for(d=alldevs;d;d=d->next) { + if(strstr(d->name, if_cpy) != NULL) { + match = 1; + if((if_cpy = REALLOC(if_cpy, strlen(d->name)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(if_cpy, d->name); + break; + } + } + if(alldevs != NULL) { + pcap_freealldevs(alldevs); + } + if(match == 0) { + logprintf(LOG_ERR, "could not full interface name for %s", if_name); + goto close; + } +#endif + + if((pcap_handle = pcap_open_live(if_cpy, 64, 0, 3, e)) == NULL) { + logprintf(LOG_ERR, "pcap_open_live: %s", e); + goto close; + } + + if((pcap_setnonblock(pcap_handle, 1, e)) < 0) { + logprintf(LOG_ERR, "pcap_setnonblock: %s", e); + goto close; + } + + live_count = num_hosts; + cursor = helist; + last_packet_time.tv_sec=0; + last_packet_time.tv_usec=0; + + interval = 10000; + + reset_cum_err = 1; + req_interval = interval; + while(live_count > 0) { + gettimeofday(&now, NULL); + timeval_diff(&now, &last_packet_time, &diff); + loop_timediff = (unsigned long int)(1000000*diff.tv_sec + diff.tv_usec); + if(loop_timediff >= (unsigned)req_interval) { + timeval_diff(&now, &((*cursor)->last_send_time), &diff); + host_timediff = (unsigned long int)(1000000*diff.tv_sec + diff.tv_usec); + if(host_timediff >= (*cursor)->timeout) { + if(reset_cum_err > 0) { + cum_err = 0; + req_interval = interval; + reset_cum_err = 0; + } else { + cum_err += loop_timediff - interval; + if(req_interval >= cum_err) { + req_interval = req_interval - cum_err; + } else { + req_interval = 0; + } + } + select_timeout = req_interval; + if((*cursor)->num_sent >= 2) { + remove_host(cursor); + if(first_timeout > 0) { + timeval_diff(&now, &((*cursor)->last_send_time), &diff); + host_timediff = (unsigned long int)(1000000*diff.tv_sec + diff.tv_usec); + while(host_timediff >= (*cursor)->timeout && live_count) { + if((*cursor)->live == 1) { + remove_host(cursor); + } else { + advance_cursor(); + } + timeval_diff(&now, &((*cursor)->last_send_time), &diff); + host_timediff = (unsigned long int)(1000000*diff.tv_sec + diff.tv_usec); + } + first_timeout=0; + } + gettimeofday(&last_packet_time, NULL); + } else { + if((*cursor)->num_sent > 0) { + (*cursor)->timeout *= 1.5; + } + if(send_packet(pcap_handle, *cursor, &last_packet_time, srcmac) == -1) { + goto close; + } + advance_cursor(); + } + } else { + select_timeout = (long unsigned int)((*cursor)->timeout - host_timediff); + reset_cum_err = 1; + } + } else { + select_timeout = req_interval - loop_timediff; + } + if(recvfrom_wto(select_timeout, pcap_handle) == -1) { + goto close; + } + } + + for(i=0;ifound == 1) { + char fmac[ETH_ALEN]; + memset(fmac, '\0', ETH_ALEN); + sprintf(fmac, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x", + helist[i]->mac[0], helist[i]->mac[1], + helist[i]->mac[2], helist[i]->mac[3], + helist[i]->mac[4], helist[i]->mac[5]); + if(strcmp(fmac, dstmac) == 0) { + memset(*ip, '\0', INET_ADDRSTRLEN+1); + inet_ntop(AF_INET, (void *)&(helist[i]->addr), *ip, INET_ADDRSTRLEN+1); + found = 1; + break; + } + } + } + +close: + if(pcap_handle != NULL) { + pcap_close(pcap_handle); + } + if(if_cpy != NULL) { + FREE(if_cpy); + } + for(i=0;i. + * + * arp-scan.h -- Header file for ARP scanner + * + * Author: Roy Hills + * Date: 11 October 2005 + * + * The ARP protocol is defined in RFC 826 Ethernet Address Resolution Protocol + * + */ + +void arp_add_host(const char *host_name); +int arp_resolv(char *if_name, char *srcmac, char *dstmac, char **ip); diff --git a/lib/ESPiLight/src/pilight/libs/pilight/core/binary.c b/lib/ESPiLight/pilight/libs/pilight/core/binary.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/core/binary.c rename to lib/ESPiLight/pilight/libs/pilight/core/binary.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/core/binary.h b/lib/ESPiLight/pilight/libs/pilight/core/binary.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/core/binary.h rename to lib/ESPiLight/pilight/libs/pilight/core/binary.h diff --git a/lib/ESPiLight/pilight/libs/pilight/core/cast.c b/lib/ESPiLight/pilight/libs/pilight/core/cast.c new file mode 100644 index 0000000..0e2ba31 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/cast.c @@ -0,0 +1,112 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include + +#ifndef _WIN32 + #include +#endif + +#include "common.h" +#include "../events/events.h" /* rewrite */ + +int cast2bool(struct varcont_t **a) { + struct varcont_t b; + memset(&b, 0, sizeof(struct varcont_t)); + + b.type_ = JSON_BOOL; + + if((*a)->type_ == JSON_NUMBER) { + if((int)(*a)->number_ != 0) { + b.bool_ = 1; + } + } + if((*a)->type_ == JSON_STRING) { + if(strcmp((*a)->string_, "0") == 0) { + b.bool_ = 0; + } else if(strlen((*a)->string_) > 0) { + b.bool_ = 1; + } + if((*a)->free_ == 1) { + FREE((*a)->string_); + (*a)->free_ = 0; + } + } + if((*a)->type_ == JSON_BOOL) { + b.bool_ = (*a)->bool_; + } + + memcpy(*a, &b, sizeof(struct varcont_t)); + return 0; +} + +int cast2int(struct varcont_t **a) { + struct varcont_t b; + memset(&b, 0, sizeof(struct varcont_t)); + + b.type_ = JSON_NUMBER; + + if((*a)->type_ == JSON_STRING) { + b.number_ = atof((*a)->string_); + if(b.number_ != 0) { + b.decimals_ = nrDecimals((*a)->string_); + } + if((*a)->free_ == 1) { + FREE((*a)->string_); + (*a)->free_ = 0; + } + } + if((*a)->type_ == JSON_BOOL) { + if((*a)->bool_ == 0) { + b.number_ = 0; + } else { + b.number_ = 1; + } + } + if((*a)->type_ == JSON_NUMBER) { + b.number_ = (*a)->number_; + b.decimals_ = (*a)->decimals_; + } + + memcpy(*a, &b, sizeof(struct varcont_t)); + return 0; +} + +int cast2str(struct varcont_t **a) { + struct varcont_t b; + memset(&b, 0, sizeof(struct varcont_t)); + + b.type_ = JSON_STRING; + + if((*a)->type_ == JSON_BOOL) { + struct varcont_t bb, *bbb = &bb; + memcpy(&bb, *a, sizeof(struct varcont_t)); + cast2int(&bbb); + memcpy(*a, &bb, sizeof(struct varcont_t)); + } + if((*a)->type_ == JSON_NUMBER) { + int len = snprintf(NULL, 0, "%.*f", (*a)->decimals_, (*a)->number_); + if((b.string_ = MALLOC(len+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(b.string_, 0, len+1); + sprintf(b.string_, "%.*f", (*a)->decimals_, (*a)->number_); + } + if((*a)->type_ == JSON_STRING) { + b.string_ = STRDUP((*a)->string_); + if((*a)->free_ == 1) { + FREE((*a)->string_); + (*a)->free_ = 0; + } + } + + memcpy(*a, &b, sizeof(struct varcont_t)); + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/cast.h b/lib/ESPiLight/pilight/libs/pilight/core/cast.h new file mode 100644 index 0000000..8b72df9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/cast.h @@ -0,0 +1,19 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _CAST_H_ +#define _CAST_H_ + +#include "common.h" +#include "../events/events.h" /* rewrite */ + +int cast2bool(struct varcont_t **); +int cast2int(struct varcont_t **); +int cast2str(struct varcont_t **); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/common.c b/lib/ESPiLight/pilight/libs/pilight/core/common.c new file mode 100644 index 0000000..9143acb --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/common.c @@ -0,0 +1,1146 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef __FreeBSD__ + #define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#ifdef _WIN32 + #if _WIN32_WINNT < 0x0501 + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0501 + #endif + #include + #include + #include + #include + #include + #include +#else + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include +#endif + +#include +#include +#include +#include +#include +#include +#ifndef __USE_XOPEN + #define __USE_XOPEN +#endif +#include +#include +#include + +#include "../config/settings.h" +#include "mem.h" +#include "common.h" +#include "network.h" +#include "log.h" + +char *progname = NULL; +#ifndef _WIN32 +static int procmounted = 0; +#endif + +static const char base64table[] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/' +}; + +static pthread_mutex_t atomic_lock; +static pthread_mutexattr_t atomic_attr; + +void atomicinit(void) { + pthread_mutexattr_init(&atomic_attr); + pthread_mutexattr_settype(&atomic_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&atomic_lock, &atomic_attr); +} + +void atomiclock(void) { + pthread_mutex_lock(&atomic_lock); +} + +void atomicunlock(void) { + pthread_mutex_unlock(&atomic_lock); +} + +void array_free(char ***array, int len) { + int i = 0; + if(len > 0) { + for(i=0;i 0) { + if((*output = REALLOC(*output, sizeof(char *)*(n+1))) == NULL) { + OUT_OF_MEMORY + } + if(((*output)[n] = MALLOC((i-y)+1)) == NULL) { + OUT_OF_MEMORY + } + strncpy((*output)[n], &str[y], i-y); + (*output)[n][(i-y)] = '\0'; + n++; + } + y=i+p; + } + i++; + } + if(strlen(&str[y]) > 0) { + if((*output = REALLOC(*output, sizeof(char *)*(n+1))) == NULL) { + OUT_OF_MEMORY + } + if(((*output)[n] = MALLOC((i-y)+1)) == NULL) { + OUT_OF_MEMORY + } + strncpy((*output)[n], &str[y], i-y); + (*output)[n][(i-y)] = '\0'; + n++; + } + return n; +} + +#ifdef _WIN32 +int check_instances(const wchar_t *prog) { + HANDLE m_hStartEvent = CreateEventW(NULL, FALSE, FALSE, prog); + if(m_hStartEvent == NULL) { + CloseHandle(m_hStartEvent); + return 0; + } + + if(GetLastError() == ERROR_ALREADY_EXISTS) { + CloseHandle(m_hStartEvent); + m_hStartEvent = NULL; + return 0; + } + return -1; +} + +int setenv(const char *name, const char *value, int overwrite) { + if(name == NULL) { + errno = EINVAL; + return -1; + } + if(overwrite == 0 && getenv(name) != NULL) { + return 0; // name already defined and not allowed to overwrite. Treat as OK. + } + if(value == NULL) { + return unsetenv(name); + } + char c[strlen(name)+1+strlen(value)+1]; // one for "=" + one for term zero + strcat(c, name); + strcat(c, "="); + strcat(c, value); + return putenv(c); +} + +int unsetenv(const char *name) { + if(name == NULL) { + errno = EINVAL; + return -1; + } + char c[strlen(name)+1+1]; // one for "=" + one for term zero + strcat(c, name); + strcat(c, "="); + return putenv(c); +} + +int isrunning(const char *program) { + DWORD aiPID[1000], iCb = 1000; + DWORD iCbneeded = 0; + int iNumProc = 0, i = 0; + char szName[MAX_PATH]; + int iLenP = 0; + HANDLE hProc; + HMODULE hMod; + + iLenP = strlen(program); + if(iLenP < 1 || iLenP > MAX_PATH) + return -1; + + if(EnumProcesses(aiPID, iCb, &iCbneeded) <= 0) { + return -1; + } + + iNumProc = iCbneeded / sizeof(DWORD); + + for(i=0;i 0) { + FREE(tmp); + return pid; + } + FREE(tmp); + return -1; +} +#endif + +#ifdef __FreeBSD__ +int findproc(char *cmd, char *args, int loosely) { +#else +pid_t findproc(char *cmd, char *args, int loosely) { +#endif + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + +#ifndef _WIN32 + DIR* dir; + struct dirent* ent; + char fname[512], cmdline[1024]; + int fd = 0, ptr = 0, match = 0, i = 0, y = '\n', x = 0; + + if(procmounted == 0) { + if((dir = opendir("/proc"))) { + i = 0; + while((ent = readdir(dir)) != NULL) { + i++; + } + closedir(dir); + if(i == 2) { +#ifdef __FreeBSD__ + mount("procfs", "/proc", 0, ""); +#else + mount("proc", "/proc", "procfs", 0, ""); +#endif + if((dir = opendir("/proc"))) { + i = 0; + while((ent = readdir(dir)) != NULL) { + i++; + } + closedir(dir); + if(i == 2) { + logprintf(LOG_ERR, "/proc filesystem not properly mounted"); + return -1; + } + } + } + } else { + logprintf(LOG_ERR, "/proc filesystem not properly mounted"); + return -1; + } + procmounted = 1; + } + if((dir = opendir("/proc"))) { + while((ent = readdir(dir)) != NULL) { + if(isNumeric(ent->d_name) == 0) { + snprintf(fname, 512, "/proc/%s/cmdline", ent->d_name); + if((fd = open(fname, O_RDONLY, 0)) > -1) { + memset(cmdline, '\0', sizeof(cmdline)); + if((ptr = (int)read(fd, cmdline, sizeof(cmdline)-1)) > -1) { + i = 0, match = 0, y = '\n'; + /* Replace all NULL terminators for newlines */ + for(i=0;i 0) { + FREE(array); + } + continue; + } + if(strcmp(array[1], args) == 0) { + match++; + } + + if(match == 2) { + pid_t pid = (pid_t)atol(ent->d_name); + close(fd); + closedir(dir); + for(x=0;x 0) { + FREE(array); + } + return pid; + } + } else if(match > 0) { + pid_t pid = (pid_t)atol(ent->d_name); + close(fd); + closedir(dir); + for(x=0;x 0) { + FREE(array); + } + return pid; + } + for(x=0;x 0) { + FREE(array); + } + } + close(fd); + } + } + } + closedir(dir); + } +#endif + return -1; +} + +int isNumeric(char *s) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(s == NULL || *s == '\0' || *s == ' ') + return -1; + + char *p = NULL; + strtod(s, &p); + return (*p == '\0') ? 0 : -1; +} + +int nrDecimals(char *s) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + unsigned int b = 0, c = strlen(s), i = 0; + int a = 0; + for(i=0;ipw_uid; + } + } +#endif + return -1; +} + +int which(const char *program) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char path[1024]; + strcpy(path, getenv("PATH")); + char **array = NULL; + unsigned int n = 0, i = 0; + int found = -1; + + n = explode(path, ":", &array); + for(i=0;i 0) { + FREE(array); + } + return found; +} + +int ishex(int x) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + return(x >= '0' && x <= '9') || (x >= 'a' && x <= 'f') || (x >= 'A' && x <= 'F'); +} + +const char *rstrstr(const char* haystack, const char* needle) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char* loc = 0; + char* found = 0; + size_t pos = 0; + + while ((found = strstr(haystack + pos, needle)) != 0) { + loc = found; + pos = (size_t)((found - haystack) + 1); + } + + return loc; +} + +void alpha_random(char *s, const int len) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + static const char alphanum[] = + "0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz"; + int i = 0; + + for(i = 0; i < len; ++i) { + s[i] = alphanum[(unsigned int)rand() % (sizeof(alphanum) - 1)]; + } + + s[len] = 0; +} + +int urldecode(const char *s, char *dec) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char *o = NULL; + const char *end = s + strlen(s); + int c = 0; + + for(o = dec; s <= end; o++) { + c = *s++; + if(c == '+') { + c = ' '; + } else if(c == '%' && (!ishex(*s++) || !ishex(*s++) || !sscanf(s - 2, "%2x", &c))) { + return -1; + } + if(dec) { + sprintf(o, "%c", c); + } + } + + return (int)(o - dec); +} + +static char to_hex(char code) { + static char hex[] = "0123456789abcdef"; + return hex[code & 15]; +} + +char *urlencode(char *str) { + char *pstr = str, *buf = MALLOC(strlen(str) * 3 + 1), *pbuf = buf; + while(*pstr) { + if(isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~') + *pbuf++ = *pstr; + else if(*pstr == ' ') + *pbuf++ = '+'; + else + *pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15); + pstr++; + } + *pbuf = '\0'; + return buf; +} + +char *base64decode(char *src, size_t len, size_t *decsize) { + unsigned int i = 0; + unsigned int j = 0; + unsigned int l = 0; + size_t size = 0; + char *dec = NULL; + char buf[3]; + char tmp[4]; + + dec = MALLOC(0); + if(dec == NULL) { + return NULL; + } + + while(len--) { + if('=' == src[j]) { + break; + } + if(!(isalnum(src[j]) || src[j] == '+' || src[j] == '/')) { + break; + } + + tmp[i++] = src[j++]; + + if(i == 4) { + for(i = 0; i < 4; ++i) { + for(l = 0; l < 64; ++l) { + if(tmp[i] == base64table[l]) { + tmp[i] = (char)l; + break; + } + } + } + + buf[0] = (char)((tmp[0] << 2) + ((tmp[1] & 0x30) >> 4)); + buf[1] = (char)(((tmp[1] & 0xf) << 4) + ((tmp[2] & 0x3c) >> 2)); + buf[2] = (char)(((tmp[2] & 0x3) << 6) + tmp[3]); + + dec = REALLOC(dec, size + 3); + for(i = 0; i < 3; ++i) { + dec[size++] = buf[i]; + } + + i = 0; + } + } + + if(i > 0) { + for(j = i; j < 4; ++j) { + tmp[j] = '\0'; + } + + for(j = 0; j < 4; ++j) { + for(l = 0; l < 64; ++l) { + if(tmp[j] == base64table[l]) { + tmp[j] = (char)l; + break; + } + } + } + + buf[0] = (char)((tmp[0] << 2) + ((tmp[1] & 0x30) >> 4)); + buf[1] = (char)(((tmp[1] & 0xf) << 4) + ((tmp[2] & 0x3c) >> 2)); + buf[2] = (char)(((tmp[2] & 0x3) << 6) + tmp[3]); + + dec = REALLOC(dec, (size_t)(size + (size_t)(i - 1))); + for(j = 0; (j < i - 1); ++j) { + dec[size++] = buf[j]; + } + } + + dec = REALLOC(dec, size + 1); + dec[size] = '\0'; + + if(decsize != NULL) { + *decsize = size; + } + + return dec; +} + +char *base64encode(char *src, size_t len) { + unsigned int i = 0; + unsigned int j = 0; + char *enc = NULL; + size_t size = 0; + char buf[4]; + char tmp[3]; + + enc = MALLOC(0); + if(enc == NULL) { + return NULL; + } + + while(len--) { + tmp[i++] = *(src++); + + if(i == 3) { + buf[0] = (char)((tmp[0] & 0xfc) >> 2); + buf[1] = (char)(((tmp[0] & 0x03) << 4) + ((tmp[1] & 0xf0) >> 4)); + buf[2] = (char)(((tmp[1] & 0x0f) << 2) + ((tmp[2] & 0xc0) >> 6)); + buf[3] = (char)(tmp[2] & 0x3f); + + enc = REALLOC(enc, size + 4); + for(i = 0; i < 4; ++i) { + enc[size++] = base64table[(int)buf[i]]; + } + + i = 0; + } + } + + if(i > 0) { + for(j = i; j < 3; ++j) { + tmp[j] = '\0'; + } + + buf[0] = (char)((tmp[0] & 0xfc) >> 2); + buf[1] = (char)(((tmp[0] & 0x03) << 4) + ((tmp[1] & 0xf0) >> 4)); + buf[2] = (char)(((tmp[1] & 0x0f) << 2) + ((tmp[2] & 0xc0) >> 6)); + buf[3] = (char)(tmp[2] & 0x3f); + + for(j = 0; (j < i + 1); ++j) { + enc = REALLOC(enc, size+1); + enc[size++] = base64table[(int)buf[j]]; + } + + while((i++ < 3)) { + enc = REALLOC(enc, size+1); + enc[size++] = '='; + } + } + + enc = REALLOC(enc, size+1); + enc[size] = '\0'; + + return enc; +} + +void rmsubstr(char *s, const char *r) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + while((s=strstr(s, r))) { + size_t l = strlen(r); + memmove(s, s+l, 1+strlen(s+l)); + } +} + +char *hostname(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char name[255] = {'\0'}; + char *host = NULL, **array = NULL; + unsigned int n = 0, i = 0; + + gethostname(name, 254); + if(strlen(name) > 0) { + n = explode(name, ".", &array); + if(n > 0) { + if((host = MALLOC(strlen(array[0])+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(host, array[0]); + } + } + for(i=0;i 0) { + FREE(array); + } + return host; +} + +char *distroname(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char dist[32]; + memset(dist, '\0', 32); + char *distro = NULL; + +#ifdef _WIN32 + strcpy(dist, "Windows"); +#elif defined(__FreeBSD__) + strcpy(dist, "FreeBSD/0.0"); +#else + int rc = 1; + struct stat sb; + if((rc = stat("/etc/redhat-release", &sb)) == 0) { + strcpy(dist, "RedHat/0.0"); + } else if((rc = stat("/etc/SuSE-release", &sb)) == 0) { + strcpy(dist, "SuSE/0.0"); + } else if((rc = stat("/etc/mandrake-release", &sb)) == 0) { + strcpy(dist, "Mandrake/0.0"); + } else if((rc = stat("/etc/debian-release", &sb)) == 0) { + strcpy(dist, "Debian/0.0"); + } else if((rc = stat("/etc/debian_version", &sb)) == 0) { + strcpy(dist, "Debian/0.0"); + } else { + strcpy(dist, "Unknown/0.0"); + } +#endif + if(strlen(dist) > 0) { + if((distro = MALLOC(strlen(dist)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(distro, dist); + return distro; + } else { + return NULL; + } +} + +/* The UUID is either generated from the + processor serial number or from the + onboard LAN controller mac address */ +char *genuuid(char *ifname) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char mac[ETH_ALEN], *upnp_id = NULL, *p = mac; + char serial[UUID_LENGTH+1]; + + memset(serial, '\0', UUID_LENGTH+1); +#ifndef _WIN32 + char a[1024]; + FILE *fp = fopen("/proc/cpuinfo", "r"); + if(fp != NULL) { + while(!feof(fp)) { + if(fgets(a, 1024, fp) == 0) { + break; + } + if(strstr(a, "Serial") != NULL) { + sscanf(a, "Serial : %16s%*[ \n\r]", (char *)&serial); + if(strlen(serial) > 0 && + ((isNumeric(serial) == EXIT_SUCCESS && atoi(serial) > 0) || + (isNumeric(serial) == EXIT_FAILURE))) { + memmove(&serial[5], &serial[4], 16); + serial[4] = '-'; + memmove(&serial[8], &serial[7], 13); + serial[7] = '-'; + memmove(&serial[11], &serial[10], 10); + serial[10] = '-'; + memmove(&serial[14], &serial[13], 7); + serial[13] = '-'; + if((upnp_id = MALLOC(UUID_LENGTH+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(upnp_id, serial); + fclose(fp); + return upnp_id; + } + } + } + fclose(fp); + } + +#endif + if(dev2mac(ifname, &p) == 0) { + if((upnp_id = MALLOC(UUID_LENGTH+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(upnp_id, '\0', UUID_LENGTH+1); + snprintf(upnp_id, UUID_LENGTH, + "0000-%02x-%02x-%02x-%02x%02x%02x", + (unsigned char)p[0], (unsigned char)p[1], (unsigned char)p[2], + (unsigned char)p[3], (unsigned char)p[4], (unsigned char)p[5]); + return upnp_id; + } + + return NULL; +} + +/* Check if a given file exists */ +int file_exists(char *filename) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct stat sb; + return stat(filename, &sb); +} + +/* Check if a given path exists */ +int path_exists(char *fil) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct stat s; + char tmp[strlen(fil)+1]; + strcpy(tmp, fil); + + atomiclock(); + /* basename isn't thread safe */ + char *filename = basename(tmp); + atomicunlock(); + + char path[(strlen(tmp)-strlen(filename))+1]; + size_t i = (strlen(tmp)-strlen(filename)); + + memset(path, '\0', sizeof(path)); + memcpy(path, tmp, i); + snprintf(path, i, "%s", tmp); + +/* + * dir stat doens't work on windows if path has a trailing slash + */ +#ifdef _WIN32 + if(path[i-1] == '\\' || path[i-1] == '/') { + path[i-1] = '\0'; + } +#endif + + if(strcmp(filename, tmp) != 0) { + int err = stat(path, &s); + if(err == -1) { + if(ENOENT == errno) { + return EXIT_FAILURE; + } else { + return EXIT_FAILURE; + } + } else { + if(S_ISDIR(s.st_mode)) { + return EXIT_SUCCESS; + } else { + return EXIT_FAILURE; + } + } + } + return EXIT_SUCCESS; +} + +/* Copyright (C) 1995 Ian Jackson */ +/* Copyright (C) 1995 Ian Jackson */ +// 1: val > ref +// -1: val < ref +// 0: val == ref +int vercmp(char *val, char *ref) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + int vc, rc; + long vl, rl; + char *vp, *rp; + char *vsep, *rsep; + + if(!val) { + strcpy(val, ""); + } + if(!ref) { + strcpy(ref, ""); + } + while(1) { + vp = val; + while(*vp && !isdigit(*vp)) { + vp++; + } + rp = ref; + while(*rp && !isdigit(*rp)) { + rp++; + } + while(1) { + vc =(val == vp) ? 0 : *val++; + rc =(ref == rp) ? 0 : *ref++; + if(!rc && !vc) { + break; + } + if(vc && !isalpha(vc)) { + vc += 256; + } + if(rc && !isalpha(rc)) { + rc += 256; + } + if(vc != rc) { + return vc - rc; + } + } + val = vp; + ref = rp; + vl = 0; + if(isdigit(*vp)) { + vl = strtol(val, (char**)&val, 10); + } + rl = 0; + if(isdigit(*rp)) { + rl = strtol(ref, (char**)&ref, 10); + } + if(vl != rl) { + return (int)(vl - rl); + } + + vc = *val; + rc = *ref; + vsep = strchr(".-", vc); + rsep = strchr(".-", rc); + + if((vsep && !rsep) || !*val) { + return 0; + } + + if((!vsep && rsep) || !*ref) { + return +1; + } + + if(!*val && !*ref) { + return 0; + } + } +} + +char *uniq_space(char *str){ + char *from = NULL, *to = NULL; + int spc=0; + to = from = str; + while(1){ + if(spc == 1 && *from == ' ' && to[-1] == ' ') { + ++from; + } else { + spc = (*from == ' ') ? 1 : 0; + *to++ = *from++; + if(!to[-1]) { + break; + } + } + } + return str; +} + +int str_replace(char *search, char *replace, char **str) { + unsigned short match = 0; + int len = (int)strlen(*str); + int nlen = 0; + int slen = (int)strlen(search); + int rlen = (int)strlen(replace); + int x = 0; + while(x < len) { + if(strncmp(&(*str)[x], search, (size_t)slen) == 0) { + match = 1; + int rpos = (x + (slen - rlen)); + if(rpos < 0) { + slen -= rpos; + rpos = 0; + } + nlen = len - (slen - rlen); + if(len < nlen) { + if(((*str) = REALLOC((*str), (size_t)nlen+1)) == NULL) { /*LCOV_EXCL_LINE*/ + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(&(*str)[len], '\0', (size_t)(nlen-len)); + } + len = nlen; + memmove(&(*str)[x], &(*str)[rpos], (size_t)(len-x)); + strncpy(&(*str)[x], replace, (size_t)rlen); + (*str)[len] = '\0'; + x += rlen-1; + } + x++; + } + if(match == 1) { + return (int)len; + } else { + return -1; + } +} + +int strnicmp(char const *a, char const *b, size_t len) { + int i = 0; + + if(a == NULL || b == NULL) { + return -1; + } + if(len == 0) { + return 0; + } + + for(;i++ str && strchr(trim_away, end[-1]) != NULL; --end) + ; + *end = '\0'; + } + return str; +} + +int checkdnsrr(const char *domain, const char *type) +{ + logprintf(LOG_STACK, "%s(%s,%s)", __FUNCTION__, domain ? domain : "(NULL)", type ? type : "(NULL)"); + return 0; // NYI. +} + +/** + * Check if an email address is valid. + * @param char* address The email address to check. Leading+trailing white spaces are accepted. + * @param bool allow_lists If true, addr is allowed to be a comma separated list of email addresses. + * @param bool check_domain_can_mail If true, check if domain exists in DNS system and accepts email. + * @return int Values < 0 indicate error. Values >= 0 indicate success. + * Where -1: syntax error, -2: DNS check for a domain failed, -8: severe internal error. + */ +int check_email_addr(const char *address, int allow_lists, int check_domain_can_mail) { + if(address == NULL) { + return -1; + } + + #define ALPHANUMERICS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + + static const char white_spaces[] = " \t"; + static const char local_valid_chars[] = ALPHANUMERICS ".!#$%&'*+-\\/=?^_`{|}~"; + static const char domain_valid_chars[] = ALPHANUMERICS ".-"; // . and - are not allowed everywhere. + + const char *at = NULL, *domain_name = NULL; + char *addr = NULL; + char **addr_list = NULL; + size_t addr_count = explode(address, ",", &addr_list), ii = 0; + int ret = -1; + for(ii = 0; ii < addr_count; ii++) { + ret = -1; // assume error + if (allow_lists == 0 && addr_count > 1) { + break; // only one address allowed. + } + addr = addr_list[ii]; + addr += strspn(addr, white_spaces); // trim left + str_trim_right(addr, white_spaces); + + // Now check addr. First some quick pre-checks: + at = strchr(addr, '@'); + if(at == NULL || strstr(addr, "..") != NULL) { + break; // no @ found or two consecutive dots found somewhere. + } + domain_name = at+1; + + if(at == addr || at[-1] == '.' || addr[0] == '.') { + break; // local part emtpy, or starts or ends with a dot. + } + if(addr+strspn(addr, local_valid_chars) < at) { + break; // local part contains invalid chars. + } + if(strchr(domain_name, '.') == NULL || strlen(domain_name) < 5) { + break; // not at least one dot in domain or domain is not at least 2 x 2 chars. + } + if(strchr(".-", domain_name[0]) != NULL || strchr(".-", domain_name[strlen(domain_name)-1]) != NULL) { + break; // domain starts or ends with a dot or dash. + } + if(strstr(domain_name, ".-") != NULL || strstr(domain_name, "-.") != NULL) { + break; // a dot delimited domain part starts or ends with a dash. + } + if(domain_name[strspn(domain_name, domain_valid_chars)] != '\0') { + break; // domain contains invalid chars. + } + + // Finally check domain name against DNS if desired: + + if(check_domain_can_mail != 0 && checkdnsrr(domain_name, "MX") < 0) { + ret = -2; + break; // domain not found or does not accept emails. + } + + ret = 0; // Address ok (and all ok if this is the last one in the list). + } + array_free(&addr_list, addr_count); + return ret; + + #undef ALPHANUMERICS +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/common.h b/lib/ESPiLight/pilight/libs/pilight/core/common.h new file mode 100644 index 0000000..3473d82 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/common.h @@ -0,0 +1,93 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _COMMON_H_ +#define _COMMON_H_ + +#ifndef _WIN32 + #include + #include + #include +#endif +#include +#include + +typedef struct varcont_t { + union { + char *string_; + double number_; + int bool_; + }; + int decimals_; + int type_; + int free_; +} varcont_t; + +#include "pilight.h" + +extern char *progname; + +#ifdef _WIN32 +#define sleep(a) Sleep(a*1000) +int check_instances(const wchar_t *prog); +int setenv(const char *name, const char *value, int overwrite); +int unsetenv(const char *name); +int isrunning(const char *program); +#endif + +void array_free(char ***array, int len); +int isrunning(const char *program); +void atomicinit(void); +void atomiclock(void); +void atomicunlock(void); +unsigned int explode(const char *str, const char *delimiter, char ***output); +int isNumeric(char *str); +int nrDecimals(char *str); +int name2uid(char const *name); +int which(const char *program); +int ishex(int x); +const char *rstrstr(const char* haystack, const char* needle); +void alpha_random(char *s, const int len); +int urldecode(const char *s, char *dec); +char *urlencode(char *str); +char *base64encode(char *src, size_t len); +char *base64decode(char *src, size_t len, size_t *decsize); +char *hostname(void); +char *distroname(void); +void rmsubstr(char *s, const char *r); +char *genuuid(char *ifname); +int file_exists(char *fil); +int path_exists(char *fil); +char *uniq_space(char *str); + +#ifdef __FreeBSD__ +int findproc(char *name, char *args, int loosely); +#else +pid_t findproc(char *name, char *args, int loosely); +#endif + +int vercmp(char *val, char *ref); +int str_replace(char *search, char *replace, char **str); +#ifndef _WIN32 +int stricmp(char const *a, char const *b); +int strnicmp(char const *a, char const *b, size_t len); +#endif +int file_get_contents(char *file, char **content); +int check_email_addr(const char *addr, int allow_lists, int check_domain_can_mail); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/config.c b/lib/ESPiLight/pilight/libs/pilight/core/config.c new file mode 100644 index 0000000..9d6500d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/config.c @@ -0,0 +1,282 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pilight.h" +#include "common.h" +#include "json.h" +#include "config.h" +#include "log.h" +#include "../config/devices.h" +#include "../config/settings.h" +#include "../config/registry.h" +#ifdef EVENTS + #include "../config/rules.h" +#endif +#include "../config/hardware.h" +#include "../config/gui.h" + +static struct config_t *config = NULL; +static pthread_mutex_t mutex_lock; +static pthread_mutexattr_t mutex_attr; + +static void sort_list(int r) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct config_t *a = NULL; + struct config_t *b = NULL; + struct config_t *c = NULL; + struct config_t *e = NULL; + struct config_t *tmp = NULL; + + while(config && e != config->next) { + c = a = config; + b = a->next; + while(a != e) { + if((r == 0 && a->writeorder > b->writeorder) || + (r == 1 && a->readorder > b->readorder)) { + if(a == config) { + tmp = b->next; + b->next = a; + a->next = tmp; + config = b; + c = b; + } else { + tmp = b->next; + b->next = a; + a->next = tmp; + c->next = b; + c = b; + } + } else { + c = a; + a = a->next; + } + b = a->next; + if(b == e) + e = a; + } + } +} + +/* The location of the config file */ +static char *configfile = NULL; + +int config_gc(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + pthread_mutex_lock(&mutex_lock); + struct config_t *listeners; + while(config) { + listeners = config; + listeners->gc(); + FREE(config->name); + config = config->next; + FREE(listeners); + } + if(config != NULL) { + FREE(config); + } + if(configfile != NULL) { + FREE(configfile); + } + configfile = NULL; + + pthread_mutex_unlock(&mutex_lock); + logprintf(LOG_DEBUG, "garbage collected config library"); + return 1; +} + +int config_parse(JsonNode *root) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct JsonNode *jconfig = NULL; + unsigned short error = 0; + + sort_list(1); + struct config_t *listeners = config; + while(listeners) { + if((jconfig = json_find_member(root, listeners->name))) { + if(listeners->parse) { + if(listeners->parse(jconfig) == EXIT_FAILURE) { + error = 1; + break; + } + } + } + listeners = listeners->next; + } + + if(error == 1) { + config_gc(); + return EXIT_FAILURE; + } else { + return EXIT_SUCCESS; + } +} + +JsonNode *config_print(int level, const char *media) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct JsonNode *root = json_mkobject(); + + sort_list(0); + struct config_t *listeners = config; + while(listeners) { + if(listeners->sync) { + struct JsonNode *child = listeners->sync(level, media); + if(child != NULL) { + json_append_member(root, listeners->name, child); + } + } + listeners = listeners->next; + } + + return root; +} + +int config_write(int level, const char *media) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct JsonNode *root = json_mkobject(); + FILE *fp; + + sort_list(0); + struct config_t *listeners = config; + while(listeners) { + if(listeners->sync) { + struct JsonNode *child = listeners->sync(level, media); + if(child != NULL) { + json_append_member(root, listeners->name, child); + } + } + listeners = listeners->next; + } + + /* Overwrite config file with proper format */ + if((fp = fopen(configfile, "w+")) == NULL) { + logprintf(LOG_ERR, "cannot write config file: %s", configfile); + return EXIT_FAILURE; + } + fseek(fp, 0L, SEEK_SET); + char *content = NULL; + if((content = json_stringify(root, "\t")) != NULL) { + fwrite(content, sizeof(char), strlen(content), fp); + json_free(content); + json_delete(root); + } + fclose(fp); + return EXIT_SUCCESS; +} + +int config_read(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char *content = NULL; + struct JsonNode *root = NULL; + + /* Read JSON config file */ + if(file_get_contents(configfile, &content) == 0) { + /* Validate JSON and turn into JSON object */ + if(json_validate(content) == false) { + logprintf(LOG_ERR, "config is not in a valid json format"); + FREE(content); + return EXIT_FAILURE; + } + root = json_decode(content); + + if(config_parse(root) != EXIT_SUCCESS) { + FREE(content); + json_delete(root); + return EXIT_FAILURE; + } + json_delete(root); + config_write(1, "all"); + FREE(content); + } + return EXIT_SUCCESS; +} + +void config_register(config_t **listener, const char *name) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if((*listener = MALLOC(sizeof(config_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + if(((*listener)->name = MALLOC(strlen(name)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy((*listener)->name, name); + (*listener)->parse = NULL; + (*listener)->sync = NULL; + (*listener)->gc = NULL; + (*listener)->next = config; + config = (*listener); +} + +int config_set_file(char *settfile) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(access(settfile, R_OK | W_OK) != -1) { + if((configfile = REALLOC(configfile, strlen(settfile)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(configfile, settfile); + } else { + logprintf(LOG_ERR, "the config file %s does not exist", settfile); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + +char *config_get_file(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + return configfile; +} + +void config_init() { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + pthread_mutexattr_init(&mutex_attr); + pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mutex_lock, &mutex_attr); + + hardware_init(); + settings_init(); + devices_init(); + gui_init(); +#ifdef EVENTS + rules_init(); +#endif + registry_init(); +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/config.h b/lib/ESPiLight/pilight/libs/pilight/core/config.h new file mode 100644 index 0000000..59add23 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/config.h @@ -0,0 +1,49 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _CONFIG_H_ +#define _CONFIG_H_ + +#include "json.h" + +#define CONFIG_INTERNAL 0 +#define CONFIG_FORWARD 1 +#define CONFIG_USER 2 + +typedef struct config_t { + char *name; + int (*parse)(JsonNode *); + int readorder; + int writeorder; + JsonNode *(*sync)(int level, const char *media); + int (*gc)(void); + struct config_t *next; +} config_t; + +int config_write(int level, const char *media); +int config_read(void); +int config_parse(struct JsonNode *root); +struct JsonNode *config_print(int level, const char *media); +int config_set_file(char *settfile); +void config_register(config_t **listener, const char *name); +int config_gc(void); +int config_set_file(char *settfile); +char *config_get_file(void); +void config_init(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/datetime.c b/lib/ESPiLight/pilight/libs/pilight/core/datetime.c new file mode 100644 index 0000000..6423bd9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/datetime.c @@ -0,0 +1,1844 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#define __USE_XOPEN +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif + #include +#endif + +#include "json.h" +#include "common.h" +#include "log.h" +#include "mem.h" + +#define NRCOUNTRIES 408 +#define PRECISION 1 + +#ifndef min + #define min(a,b) (((a)<(b))?(a):(b)) +#endif +#ifndef max + #define max(a,b) (((a)>(b))?(a):(b)) +#endif + + +#define ERALENGTH ((unsigned long)146097 * 86400) + +#define ATOMIC_FLAG_INIT { ATOMIC_VAR_INIT(0) } +#define ATOMIC_VAR_INIT(value) (value) + +#ifdef __clang__ +#define atomic_load_explicit(object, order) __c11_atomic_load(object, order) +#define atomic_compare_exchange_weak_explicit(object, expected, desired, success, failure) \ + __c11_atomic_compare_exchange_weak(object, expected, desired, success, failure) +#define atomic_compare_exchange_weak(object, expected, desired) \ + atomic_compare_exchange_weak_explicit(object, expected, desired, memory_order_seq_cst, memory_order_seq_cst) +#else +#define atomic_load_explicit(object, order) __atomic_load_n(object, order) +#define atomic_compare_exchange_weak_explicit(object, expected, desired, success, failure) \ + __atomic_compare_exchange_n(object, expected, desired, 1, success, failure) +#define atomic_compare_exchange_weak(object, expected, desired) \ + atomic_compare_exchange_weak_explicit(object, expected, desired, memory_order_seq_cst, memory_order_seq_cst) +#endif + +#ifndef _WIN32 +typedef enum { + memory_order_relaxed = __ATOMIC_RELAXED, + memory_order_consume = __ATOMIC_CONSUME, + memory_order_acquire = __ATOMIC_ACQUIRE, + memory_order_release = __ATOMIC_RELEASE, + memory_order_acq_rel = __ATOMIC_ACQ_REL, + memory_order_seq_cst = __ATOMIC_SEQ_CST, + +#if defined(__ATOMIC_HLE_ACQUIRE) && defined(__ATOMIC_HLE_RELEASE) + /* + * Compiler supports Hardware Lock Elision. + */ + __memory_order_hle_acquire = __ATOMIC_HLE_ACQUIRE, + __memory_order_hle_release = __ATOMIC_HLE_RELEASE +#else + /* + * Ignore Hardware Lock Elision hints. + */ + __memory_order_hle_acquire = 0, + __memory_order_hle_release = 0 +#endif +} memory_order; +#endif + +struct cached_abbreviation { + struct cached_abbreviation *next; + char abbreviation[16]; +}; + +struct lc_timezone_rule { + uint8_t year_from; // Lowest year to which this rule applies. + uint8_t year_to; // Highest year to which this rule applies. + uint32_t month : 4; // Month at which this rule starts. + uint32_t weekday : 3; // Weekday at which this rule start (7=dontcare). + uint32_t monthday : 5; // Day of the month at which this rule starts. + uint32_t minute : 11; // Minutes since 0:00 at which this rule starts. + uint32_t timebase : 2; // Which time should be compared against. +#define TIMEBASE_CUR 0 // Rule applies to the current offset. +#define TIMEBASE_STD 1 // Rule applies to the standard time. +#define TIMEBASE_UTC 2 // Rule applies to time in UTC. + uint32_t save : 4; // The amount of time in 10 minutes. + char abbreviation[6]; // Abbreviation of timezone name (e.g., CEST). +}; + +struct lc_timezone_era { + const struct lc_timezone_rule *rules; // Rules associated with this era. + uint64_t rules_count : 8; // Number of rules. + int64_t gmtoff : 18; // Offset in seconds relative to GMT. + int64_t end : 38; // Timestamp at which this era ends. + uint8_t end_save : 4; // Daylight savings at the end time. + char abbreviation_std[6]; // Abbreviation of standard time (e.g., CET). + char abbreviation_dst[6]; // Abbreviation of DST (e.g., CEST). +}; + +struct ruleset { + const struct lc_timezone_rule *rules[8]; + size_t rules_count; +}; + +struct lc_timezone { + const struct lc_timezone_era *eras; + size_t eras_count; +}; + +extern const struct lc_timezone __timezone_utc; + +#include "tzdata.h" + +static void ruleset_remove_stale(struct ruleset *ruleset, int year); +static void ruleset_get_last(struct ruleset *ruleset, int year, + const struct lc_timezone_rule **last, + const struct lc_timezone_rule **last_dst); + +struct tzdata_t { + char *timezone; + int nrcoords; + int coords[2299][2]; +} tzdata[] = {{"America/Dominica",4,{{-613,155},{-613,153},{-614,152},{-615,156}}}, + {"America/St_Vincent",15,{{-614,125},{-614,126},{-615,126},{-613,127},{-614,127},{-612,129},{-612,130},{-613,130},{-611,129},{-611,130},{-613,129},{-612,134},{-611,133},{-612,131},{-613,132}}}, + {"Australia/Lord_Howe",3,{{1591,-316},{1591,-315},{1590,-315}}}, + {"Asia/Kashgar",117,{{802,306},{799,310},{790,311},{788,313},{788,316},{784,325},{787,327},{788,324},{791,324},{793,325},{793,329},{787,337},{787,341},{790,343},{782,347},{780,353},{781,355},{772,355},{768,357},{766,359},{762,358},{759,361},{761,362},{759,367},{755,367},{754,369},{751,370},{745,370},{745,372},{751,373},{749,377},{750,378},{748,382},{749,385},{744,387},{738,386},{737,389},{738,390},{736,393},{739,396},{738,398},{739,400},{749,403},{748,405},{752,404},{756,407},{757,403},{763,405},{763,404},{769,410},{781,410},{784,414},{794,418},{797,418},{799,420},{803,421},{802,427},{803,428},{806,429},{804,430},{808,432},{803,445},{805,447},{798,449},{817,454},{820,452},{827,452},{826,450},{827,448},{818,446},{817,444},{839,440},{850,435},{833,437},{829,437},{829,435},{825,436},{826,433},{834,431},{827,429},{827,426},{830,424},{830,419},{826,417},{827,415},{826,413},{820,411},{818,408},{820,405},{820,395},{825,395},{824,369},{826,366},{825,363},{829,357},{824,357},{821,354},{820,352},{824,352},{824,350},{823,346},{820,343},{828,335},{832,327},{832,320},{825,317},{832,314},{830,308},{832,307},{831,305},{825,309},{824,306},{820,305},{820,303},{814,304},{812,300},{810,303}}}, + {"Pacific/Wallis",9,{{-1780,-143},{-1780,-144},{-1781,-144},{-1781,-143},{-1782,-143},{-1762,-132},{-1761,-133},{-1762,-134},{-1762,-133}}}, + {"Europe/Berlin",197,{{85,546},{84,546},{87,477},{67,536},{68,536},{69,536},{70,537},{69,537},{71,537},{72,537},{73,537},{77,538},{78,538},{80,538},{79,538},{143,537},{82,537},{81,537},{74,537},{76,537},{75,537},{75,538},{76,538},{85,545},{132,545},{87,545},{86,545},{87,546},{131,545},{88,545},{88,546},{86,546},{83,546},{83,547},{84,547},{86,547},{85,547},{85,548},{85,539},{84,539},{84,540},{85,540},{115,540},{114,540},{87,540},{87,541},{87,542},{74,492},{67,492},{64,495},{65,498},{61,501},{64,505},{59,511},{62,512},{61,512},{62,514},{60,518},{67,519},{68,520},{67,521},{71,522},{70,525},{67,526},{71,526},{73,533},{70,534},{80,537},{82,534},{83,536},{86,535},{85,535},{85,534},{85,537},{87,539},{93,539},{96,536},{98,535},{89,539},{88,540},{90,541},{88,542},{90,543},{86,543},{90,545},{87,547},{86,549},{84,548},{83,549},{84,550},{84,549},{88,549},{94,548},{96,549},{99,548},{100,546},{98,545},{102,545},{101,543},{103,544},{107,543},{111,544},{111,542},{108,541},{109,540},{108,539},{112,540},{115,539},{117,542},{121,542},{121,541},{122,541},{125,545},{129,544},{127,544},{124,544},{124,543},{130,544},{135,541},{137,542},{139,539},{138,538},{145,533},{141,528},{146,526},{145,524},{148,521},{146,518},{150,513},{149,510},{147,508},{143,511},{144,509},{125,504},{123,502},{122,503},{121,502},{125,499},{124,498},{127,494},{138,488},{137,485},{135,486},{133,483},{128,481},{130,479},{129,477},{131,476},{130,475},{128,477},{123,477},{113,474},{104,476},{105,474},{102,473},{102,474},{100,476},{86,478},{84,477},{86,477},{86,476},{77,475},{75,477},{76,481},{78,486},{82,490},{92,539},{142,539},{140,540},{138,540},{138,542},{97,536},{98,536},{95,537},{139,542},{139,543},{134,542},{131,543},{135,543},{85,544},{84,544},{84,545},{135,545},{133,546},{132,546},{133,547},{134,547},{137,546},{136,545},{138,543},{137,543},{133,544},{110,545},{112,545},{113,544},{131,544},{131,546}}}, + {"America/Manaus",67,{{-600,2},{-589,2},{-588,-6},{-583,-11},{-568,-20},{-568,-22},{-563,-22},{-585,-67},{-581,-73},{-584,-78},{-583,-81},{-585,-87},{-617,-87},{-619,-89},{-627,-81},{-635,-80},{-640,-84},{-641,-90},{-648,-90},{-651,-94},{-652,-92},{-658,-96},{-660,-94},{-664,-94},{-668,-98},{-676,-95},{-699,-42},{-694,-13},{-696,-5},{-701,-1},{-700,6},{-695,7},{-691,6},{-693,10},{-699,11},{-699,17},{-681,17},{-683,18},{-682,20},{-679,18},{-674,21},{-671,17},{-671,12},{-669,12},{-663,7},{-656,10},{-655,6},{-651,11},{-644,15},{-643,14},{-642,15},{-640,20},{-631,22},{-627,19},{-628,16},{-624,8},{-626,0},{-623,-6},{-625,-8},{-619,-14},{-616,-14},{-615,-7},{-611,-5},{-608,-8},{-605,-8},{-603,-7},{-603,-2}}}, + {"Asia/Jerusalem",14,{{346,318},{351,331},{354,331},{357,332},{356,324},{352,326},{350,322},{350,318},{352,318},{349,314},{355,314},{350,296},{349,295},{343,312}}}, + {"America/Phoenix",36,{{-1090,327},{-1090,313},{-1111,313},{-1148,325},{-1145,328},{-1147,333},{-1145,336},{-1145,339},{-1141,343},{-1146,349},{-1148,361},{-1141,360},{-1141,370},{-1113,370},{-1112,369},{-1114,370},{-1116,369},{-1119,364},{-1117,357},{-1113,358},{-1112,352},{-1090,352},{-1108,355},{-1110,355},{-1110,363},{-1103,364},{-1106,360},{-1101,360},{-1100,356},{-1101,357},{-1101,358},{-1102,357},{-1112,361},{-1111,361},{-1111,360},{-1113,361}}}, + {"Australia/Darwin",307,{{1358,-151},{1370,-158},{1369,-157},{1370,-156},{1371,-158},{1370,-159},{1371,-159},{1366,-158},{1367,-158},{1369,-158},{1366,-157},{1368,-157},{1357,-151},{1357,-152},{1356,-152},{1367,-156},{1368,-156},{1366,-156},{1365,-156},{1365,-155},{1366,-155},{1368,-155},{1369,-155},{1369,-156},{1296,-149},{1357,-149},{1357,-148},{1358,-149},{1292,-149},{1292,-148},{1293,-148},{1295,-148},{1296,-150},{1296,-148},{1350,-148},{1297,-148},{1363,-135},{1362,-135},{1362,-134},{1296,-146},{1297,-146},{1296,-147},{1356,-145},{1369,-144},{1369,-143},{1370,-143},{1363,-138},{1364,-138},{1362,-138},{1362,-139},{1361,-138},{1362,-137},{1366,-138},{1363,-142},{1366,-137},{1367,-137},{1367,-138},{1369,-138},{1367,-141},{1370,-142},{1368,-121},{1365,-138},{1365,-137},{1364,-137},{1369,-137},{1369,-136},{1370,-136},{1367,-136},{1362,-136},{1364,-136},{1360,-133},{1364,-133},{1361,-133},{1301,-132},{1300,-131},{1300,-132},{1366,-129},{1361,-134},{1361,-136},{1361,-135},{1305,-126},{1305,-127},{1304,-126},{1310,-126},{1309,-126},{1309,-125},{1304,-125},{1360,-123},{1361,-123},{1367,-122},{1324,-122},{1323,-122},{1354,-122},{1361,-122},{1360,-122},{1360,-121},{1310,-121},{1314,-121},{1342,-121},{1348,-121},{1349,-121},{1330,-109},{1330,-111},{1330,-110},{1329,-111},{1329,-110},{1368,-110},{1367,-110},{1328,-110},{1290,-149},{1292,-150},{1292,-151},{1291,-152},{1291,-153},{1293,-151},{1293,-149},{1296,-152},{1298,-148},{1298,-147},{1298,-145},{1295,-145},{1294,-143},{1295,-141},{1295,-142},{1297,-140},{1298,-135},{1303,-133},{1301,-130},{1303,-129},{1303,-127},{1306,-128},{1308,-127},{1306,-127},{1306,-124},{1310,-127},{1308,-124},{1310,-124},{1310,-122},{1312,-122},{1313,-120},{1315,-123},{1328,-122},{1326,-118},{1327,-116},{1325,-116},{1325,-114},{1321,-115},{1318,-113},{1320,-111},{1322,-114},{1321,-111},{1323,-113},{1323,-111},{1327,-115},{1329,-113},{1332,-117},{1335,-118},{1335,-119},{1339,-117},{1338,-119},{1341,-119},{1342,-120},{1346,-121},{1347,-120},{1353,-123},{1352,-122},{1354,-121},{1359,-120},{1356,-122},{1357,-123},{1359,-122},{1359,-124},{1360,-125},{1363,-124},{1364,-122},{1362,-122},{1366,-119},{1364,-120},{1366,-123},{1369,-122},{1370,-123},{1367,-125},{1366,-128},{1365,-128},{1367,-130},{1365,-130},{1366,-131},{1365,-133},{1363,-133},{1363,-130},{1362,-133},{1361,-131},{1359,-133},{1359,-137},{1361,-137},{1359,-142},{1354,-147},{1353,-147},{1354,-150},{1355,-152},{1355,-153},{1354,-153},{1365,-157},{1367,-157},{1366,-159},{1364,-159},{1377,-162},{1380,-165},{1380,-260},{1290,-260},{1350,-121},{1349,-120},{1350,-120},{1311,-121},{1324,-121},{1348,-120},{1311,-120},{1361,-121},{1361,-120},{1363,-120},{1362,-121},{1362,-120},{1363,-119},{1366,-118},{1367,-118},{1368,-117},{1365,-118},{1366,-117},{1364,-115},{1321,-116},{1323,-116},{1324,-116},{1361,-116},{1322,-116},{1364,-116},{1365,-115},{1361,-115},{1326,-115},{1326,-116},{1323,-115},{1325,-115},{1319,-115},{1320,-115},{1351,-119},{1351,-120},{1350,-119},{1352,-119},{1307,-118},{1362,-117},{1361,-117},{1352,-117},{1351,-117},{1326,-117},{1325,-117},{1360,-117},{1360,-116},{1333,-117},{1327,-117},{1364,-119},{1365,-119},{1360,-119},{1359,-119},{1359,-118},{1358,-120},{1356,-121},{1356,-120},{1360,-118},{1359,-117},{1361,-118},{1362,-116},{1363,-116},{1335,-116},{1334,-117},{1334,-116},{1303,-111},{1302,-115},{1303,-113},{1303,-116},{1306,-118},{1300,-118},{1301,-117},{1303,-117},{1334,-115},{1335,-115},{1367,-111},{1367,-113},{1325,-112},{1326,-110},{1326,-114},{1312,-112},{1315,-115},{1310,-119},{1305,-117},{1304,-112},{1308,-115},{1307,-114},{1309,-113},{1310,-115},{1311,-112},{1312,-114},{1313,-115},{1312,-113},{1326,-112},{1327,-112},{1329,-112},{1328,-114},{1327,-113}}}, + {"Asia/Seoul",308,{{1265,342},{1263,331},{1263,332},{1262,333},{1265,335},{1268,336},{1269,335},{1266,332},{1270,335},{1263,339},{1263,340},{1269,340},{1274,340},{1274,341},{1251,340},{1251,341},{1273,340},{1273,341},{1266,341},{1255,342},{1259,342},{1275,342},{1274,342},{1272,342},{1268,342},{1259,341},{1267,341},{1266,342},{1267,342},{1265,341},{1289,351},{1269,341},{1269,342},{1261,343},{1273,343},{1265,343},{1266,343},{1273,342},{1270,342},{1260,342},{1264,342},{1261,342},{1259,343},{1262,342},{1262,343},{1260,343},{1259,351},{1291,350},{1290,351},{1291,351},{1289,350},{1288,350},{1288,351},{1262,349},{1278,349},{1278,350},{1285,349},{1285,350},{1280,350},{1261,350},{1262,350},{1261,349},{1263,350},{1261,352},{1262,352},{1260,351},{1261,351},{1287,351},{1286,351},{1262,351},{1286,350},{1285,351},{1260,353},{1260,354},{1261,354},{1261,353},{1262,353},{1260,362},{1263,363},{1261,362},{1264,364},{1265,364},{1264,363},{1262,366},{1263,364},{1263,366},{1264,366},{1261,367},{1262,367},{1308,375},{1309,375},{1309,374},{1247,378},{1248,378},{1263,376},{1262,376},{1257,376},{1257,377},{1265,376},{1262,377},{1261,377},{1265,377},{1264,376},{1264,378},{1265,378},{1263,377},{1264,377},{1263,378},{1262,378},{1247,379},{1246,379},{1246,380},{1247,380},{1261,372},{1264,374},{1264,375},{1265,375},{1265,374},{1266,375},{1263,375},{1266,376},{1266,372},{1264,372},{1265,373},{1266,373},{1262,372},{1261,373},{1263,372},{1260,372},{1266,360},{1260,370},{1263,369},{1264,369},{1267,370},{1266,370},{1266,371},{1264,370},{1264,371},{1259,371},{1260,371},{1261,371},{1265,371},{1265,372},{1263,373},{1264,373},{1263,356},{1261,356},{1261,357},{1265,357},{1264,357},{1264,358},{1265,358},{1264,359},{1265,359},{1260,361},{1265,360},{1264,361},{1274,343},{1271,343},{1270,343},{1278,344},{1278,345},{1273,344},{1253,344},{1284,345},{1285,345},{1282,346},{1274,345},{1275,345},{1275,344},{1274,344},{1270,344},{1270,345},{1271,344},{1260,346},{1275,348},{1271,345},{1272,345},{1272,344},{1261,345},{1260,345},{1264,345},{1265,345},{1277,345},{1261,346},{1277,346},{1270,346},{1276,346},{1275,346},{1274,346},{1259,344},{1260,344},{1263,344},{1260,348},{1261,348},{1269,343},{1269,344},{1268,344},{1268,343},{1267,343},{1266,344},{1267,344},{1261,344},{1286,346},{1252,347},{1254,347},{1284,348},{1283,348},{1285,348},{1262,348},{1264,348},{1263,348},{1274,348},{1282,348},{1285,347},{1286,347},{1286,348},{1284,347},{1261,347},{1283,347},{1264,347},{1282,347},{1255,346},{1255,347},{1260,347},{1275,347},{1262,347},{1263,347},{1274,347},{1277,347},{1259,347},{1259,348},{1280,348},{1280,347},{1279,349},{1258,346},{1259,346},{1285,346},{1271,346},{1263,346},{1284,346},{1283,346},{1262,346},{1254,346},{1278,346},{1278,347},{1281,348},{1263,349},{1280,349},{1277,349},{1260,349},{1281,349},{1287,350},{1287,348},{1292,352},{1290,350},{1290,352},{1286,352},{1284,350},{1281,351},{1276,349},{1275,349},{1273,348},{1273,347},{1272,348},{1268,346},{1265,346},{1264,346},{1266,346},{1266,348},{1266,349},{1264,350},{1265,351},{1263,352},{1265,355},{1267,355},{1265,356},{1269,359},{1266,359},{1267,360},{1265,361},{1266,365},{1265,367},{1261,368},{1263,370},{1263,368},{1266,369},{1268,368},{1271,370},{1269,369},{1268,370},{1269,370},{1269,371},{1268,372},{1267,371},{1267,373},{1269,373},{1266,374},{1267,375},{1268,376},{1267,379},{1270,382},{1281,383},{1284,386},{1291,377},{1294,371},{1294,360},{1296,360}}}, + {"Africa/Gaborone",40,{{270,-238},{269,-243},{264,-246},{259,-248},{257,-255},{254,-257},{247,-258},{239,-256},{235,-253},{230,-253},{227,-260},{220,-266},{218,-267},{217,-269},{209,-268},{207,-269},{206,-265},{208,-260},{207,-255},{200,-248},{200,-220},{210,-220},{210,-183},{233,-180},{236,-185},{242,-180},{246,-181},{250,-178},{253,-178},{262,-195},{272,-201},{273,-205},{277,-205},{277,-211},{280,-216},{290,-218},{291,-220},{294,-222},{283,-226},{277,-232}}}, + {"Indian/Chagos",19,{{724,-74},{724,-73},{724,-72},{725,-74},{714,-67},{713,-67},{713,-66},{713,-64},{714,-62},{713,-62},{723,-57},{718,-54},{722,-53},{717,-53},{719,-52},{718,-52},{720,-52},{718,-53},{722,-54}}}, + {"America/Argentina/Mendoza",28,{{-702,-323},{-697,-323},{-692,-320},{-685,-322},{-680,-321},{-675,-323},{-672,-328},{-672,-334},{-668,-340},{-668,-344},{-665,-349},{-666,-360},{-683,-360},{-682,-376},{-697,-371},{-698,-368},{-704,-363},{-703,-358},{-704,-353},{-706,-353},{-704,-351},{-700,-343},{-698,-342},{-699,-337},{-697,-334},{-699,-332},{-700,-333},{-700,-329}}}, + {"Asia/Hong_Kong",20,{{1142,225},{1143,225},{1142,224},{1144,224},{1143,223},{1139,224},{1139,222},{1143,222},{1142,222},{1140,222},{1141,222},{1144,223},{1143,224},{1144,225},{1139,223},{1140,223},{1142,223},{1138,222},{1141,223},{1141,224}}}, + {"Atlantic/Reykjavik",242,{{-172,638},{-172,639},{-171,639},{-152,642},{-157,642},{-155,643},{-153,643},{-154,643},{-225,653},{-223,653},{-221,654},{-226,653},{-222,654},{-229,654},{-226,654},{-228,654},{-223,654},{-225,652},{-228,652},{-224,647},{-170,638},{-170,639},{-169,638},{-169,639},{-206,633},{-202,634},{-203,634},{-202,635},{-183,635},{-135,650},{-137,649},{-136,649},{-137,650},{-137,648},{-138,648},{-167,638},{-166,638},{-168,638},{-218,642},{-219,642},{-212,639},{-171,638},{-154,644},{-155,642},{-154,642},{-221,643},{-223,644},{-222,644},{-171,663},{-164,665},{-180,665},{-180,666},{-141,647},{-229,650},{-230,650},{-233,651},{-225,651},{-228,651},{-229,651},{-224,651},{-145,646},{-142,646},{-221,638},{-227,638},{-226,639},{-228,640},{-227,641},{-225,640},{-219,641},{-220,642},{-217,642},{-218,643},{-214,644},{-218,646},{-223,645},{-225,647},{-224,646},{-223,646},{-222,647},{-224,648},{-238,647},{-241,649},{-232,650},{-231,649},{-227,651},{-218,650},{-217,652},{-221,651},{-224,652},{-226,652},{-217,655},{-224,655},{-222,655},{-221,656},{-225,655},{-226,656},{-239,654},{-245,655},{-243,656},{-239,655},{-238,655},{-241,656},{-238,656},{-241,658},{-236,656},{-233,657},{-235,657},{-232,658},{-239,659},{-238,660},{-234,660},{-237,661},{-234,661},{-236,661},{-235,662},{-230,661},{-231,660},{-229,660},{-230,659},{-227,661},{-226,660},{-227,658},{-224,659},{-226,658},{-223,659},{-225,660},{-224,661},{-230,662},{-224,663},{-226,663},{-225,663},{-230,663},{-232,664},{-229,664},{-229,665},{-224,665},{-222,663},{-217,662},{-217,660},{-213,660},{-216,660},{-213,659},{-215,658},{-214,657},{-216,657},{-217,658},{-218,658},{-216,656},{-214,656},{-215,656},{-213,656},{-215,654},{-212,654},{-211,652},{-211,654},{-209,653},{-209,656},{-207,657},{-207,655},{-204,655},{-203,657},{-204,661},{-201,661},{-195,657},{-195,660},{-188,662},{-181,656},{-183,662},{-174,660},{-171,662},{-164,661},{-166,665},{-160,665},{-154,661},{-150,664},{-145,664},{-152,661},{-146,660},{-148,657},{-143,658},{-136,655},{-140,653},{-136,653},{-140,652},{-135,651},{-142,650},{-140,649},{-145,648},{-143,646},{-145,647},{-146,646},{-150,642},{-150,643},{-155,644},{-164,639},{-177,637},{-180,638},{-178,637},{-182,635},{-183,636},{-184,636},{-208,638},{-207,638},{-207,639},{-211,639},{-210,639},{-214,638},{-222,645},{-224,645},{-225,648},{-226,648},{-225,646},{-139,656},{-181,657},{-231,654},{-230,654},{-227,654},{-227,655},{-226,655},{-228,655},{-229,655},{-206,655},{-205,656},{-205,655},{-204,656},{-206,656},{-230,651},{-223,651},{-226,651},{-227,652},{-224,653},{-229,653},{-228,653},{-214,658},{-197,659},{-184,660},{-196,660},{-215,660},{-228,660},{-228,661},{-178,662},{-179,662}}}, + {"America/Danmarkshavn",339,{{-191,779},{-191,780},{-200,776},{-201,775},{-204,776},{-201,776},{-213,763},{-214,763},{-176,778},{-178,776},{-182,776},{-179,779},{-200,779},{-193,779},{-192,778},{-204,779},{-181,779},{-198,779},{-199,779},{-195,779},{-196,779},{-197,779},{-192,779},{-205,776},{-206,776},{-207,776},{-191,777},{-189,778},{-189,777},{-191,778},{-198,774},{-196,774},{-202,774},{-203,774},{-202,775},{-203,775},{-199,775},{-198,775},{-197,775},{-198,776},{-197,776},{-200,775},{-189,779},{-190,779},{-216,762},{-216,763},{-208,763},{-210,763},{-211,764},{-213,764},{-214,764},{-212,764},{-200,760},{-203,759},{-204,759},{-201,760},{-199,760},{-198,760},{-200,763},{-201,762},{-201,763},{-205,762},{-206,763},{-205,763},{-200,761},{-212,763},{-204,763},{-203,763},{-207,763},{-202,763},{-204,764},{-206,764},{-207,764},{-203,764},{-202,764},{-205,764},{-213,765},{-214,765},{-211,765},{-212,765},{-194,795},{-196,794},{-194,793},{-197,791},{-188,792},{-200,790},{-197,789},{-199,788},{-211,788},{-208,787},{-213,786},{-208,786},{-210,785},{-213,781},{-217,781},{-217,780},{-218,779},{-215,779},{-220,776},{-214,776},{-217,775},{-212,776},{-214,777},{-214,778},{-208,780},{-193,777},{-189,776},{-207,777},{-206,777},{-209,776},{-209,775},{-204,775},{-211,775},{-200,774},{-208,774},{-195,772},{-185,773},{-182,772},{-182,769},{-186,767},{-199,769},{-220,770},{-219,770},{-221,770},{-220,769},{-205,769},{-217,769},{-208,768},{-217,766},{-222,768},{-224,768},{-222,767},{-227,767},{-224,765},{-222,766},{-219,766},{-217,765},{-226,765},{-216,764},{-217,763},{-204,761},{-211,763},{-199,762},{-198,761},{-219,760},{-200,759},{-195,757},{-229,759},{-227,797},{-204,765},{-206,765},{-221,767},{-202,768},{-204,768},{-203,768},{-196,768},{-197,768},{-196,769},{-201,768},{-201,769},{-206,769},{-190,773},{-191,773},{-185,767},{-186,768},{-195,768},{-207,767},{-207,768},{-210,767},{-198,768},{-199,767},{-199,768},{-189,767},{-187,766},{-188,765},{-185,759},{-192,765},{-188,766},{-192,767},{-207,765},{-205,765},{-206,766},{-208,764},{-209,764},{-208,765},{-186,780},{-215,765},{-202,765},{-203,765},{-189,766},{-190,766},{-207,766},{-208,766},{-209,765},{-210,765},{-215,767},{-197,767},{-203,766},{-214,766},{-212,766},{-211,766},{-210,766},{-216,766},{-215,766},{-188,767},{-186,766},{-198,767},{-213,767},{-212,767},{-211,767},{-214,767},{-209,767},{-208,767},{-211,780},{-213,778},{-214,779},{-212,780},{-194,779},{-194,780},{-188,779},{-189,780},{-190,780},{-213,780},{-214,780},{-202,781},{-186,781},{-188,781},{-195,781},{-195,780},{-203,781},{-201,781},{-204,781},{-210,780},{-209,780},{-204,780},{-200,780},{-199,780},{-201,780},{-197,780},{-198,780},{-192,780},{-193,780},{-205,780},{-206,780},{-188,780},{-186,782},{-187,782},{-185,782},{-198,782},{-199,782},{-190,783},{-189,783},{-193,781},{-192,781},{-191,783},{-191,784},{-195,784},{-196,784},{-197,784},{-188,784},{-189,784},{-190,784},{-189,785},{-192,784},{-184,785},{-185,785},{-183,786},{-186,786},{-184,786},{-193,784},{-204,782},{-205,782},{-188,782},{-191,782},{-193,782},{-194,782},{-195,782},{-206,783},{-198,783},{-194,783},{-196,782},{-196,783},{-192,783},{-193,783},{-191,781},{-194,781},{-208,781},{-209,781},{-210,781},{-209,782},{-189,781},{-190,781},{-190,782},{-189,782},{-203,782},{-205,781},{-207,782},{-182,787},{-182,786},{-183,787},{-209,787},{-207,787},{-205,788},{-206,787},{-206,788},{-178,789},{-179,789},{-190,790},{-176,790},{-177,790},{-180,790},{-176,792},{-174,791},{-177,789},{-179,790},{-178,790},{-192,789},{-178,787},{-179,787},{-190,788},{-180,788},{-180,787},{-190,787},{-193,787},{-196,787},{-191,789},{-192,788},{-193,788},{-194,787},{-179,788},{-190,793},{-192,794},{-192,793},{-193,793},{-193,794},{-192,791},{-193,791},{-193,792},{-191,792}}}, + {"Africa/Dar_es_Salaam",114,{{393,-58},{392,-58},{398,-79},{398,-78},{399,-76},{397,-80},{396,-80},{399,-69},{404,-104},{404,-103},{403,-103},{403,-102},{396,-91},{395,-91},{395,-90},{396,-83},{397,-81},{394,-86},{395,-86},{395,-85},{393,-78},{398,-80},{395,-79},{392,-59},{392,-63},{393,-63},{393,-67},{393,-64},{394,-64},{392,-67},{392,-66},{393,-66},{394,-60},{394,-62},{395,-62},{395,-65},{392,-62},{393,-57},{400,-102},{400,-108},{385,-114},{379,-113},{378,-116},{375,-117},{370,-116},{362,-117},{358,-114},{356,-116},{350,-116},{346,-110},{345,-100},{340,-95},{339,-97},{335,-96},{324,-91},{320,-91},{314,-86},{310,-86},{302,-70},{297,-64},{293,-48},{294,-44},{298,-45},{300,-43},{304,-36},{308,-33},{308,-30},{304,-29},{305,-25},{308,-24},{309,-21},{308,-16},{305,-11},{340,-10},{377,-31},{376,-35},{392,-47},{388,-60},{388,-64},{395,-70},{393,-75},{394,-78},{394,-80},{393,-83},{396,-89},{394,-89},{396,-94},{398,-99},{397,-100},{394,-74},{397,-55},{397,-54},{398,-54},{392,-52},{391,-52},{396,-52},{396,-54},{396,-55},{399,-52},{398,-52},{397,-52},{397,-49},{399,-49},{398,-51},{399,-50},{399,-51},{391,-51},{396,-51},{392,-51},{392,-50},{397,-50},{397,-51},{398,-49},{398,-50}}}, + {"Pacific/Majuro",151,{{1699,92},{1721,59},{1694,59},{1694,60},{1697,60},{1713,71},{1656,91},{1657,91},{1716,71},{1714,71},{1688,46},{1687,46},{1686,46},{1687,47},{1691,56},{1691,57},{1681,56},{1696,58},{1695,58},{1695,59},{1696,59},{1722,59},{1697,59},{1720,60},{1719,60},{1719,61},{1696,61},{1697,61},{1718,61},{1718,60},{1717,61},{1695,62},{1717,62},{1721,60},{1719,62},{1694,63},{1718,70},{1717,70},{1716,70},{1719,71},{1700,92},{1715,71},{1718,71},{1712,71},{1711,71},{1710,71},{1710,72},{1688,73},{1687,73},{1711,72},{1716,72},{1716,73},{1686,73},{1686,74},{1685,74},{1686,75},{1689,75},{1700,90},{1689,76},{1690,76},{1683,78},{1682,77},{1682,78},{1682,81},{1712,81},{1712,82},{1682,82},{1680,82},{1711,82},{1710,82},{1674,83},{1711,83},{1710,84},{1712,85},{1712,83},{1710,86},{1712,87},{1709,88},{1709,87},{1712,88},{1711,88},{1711,89},{1710,89},{1658,89},{1662,89},{1663,89},{1709,89},{1708,89},{1662,90},{1655,92},{1701,94},{1702,94},{1702,95},{1700,95},{1698,95},{1702,96},{1610,98},{1692,98},{1693,98},{1699,95},{1693,99},{1691,99},{1690,99},{1692,99},{1660,100},{1690,100},{1695,101},{1660,102},{1659,102},{1700,102},{1709,103},{1700,103},{1700,104},{1700,105},{1699,105},{1665,111},{1663,111},{1697,111},{1664,111},{1669,111},{1668,111},{1669,112},{1663,112},{1668,112},{1699,103},{1667,112},{1698,112},{1699,112},{1675,113},{1623,113},{1675,114},{1624,114},{1671,114},{1667,115},{1653,115},{1654,115},{1656,115},{1623,116},{1624,115},{1623,115},{1656,116},{1655,116},{1621,116},{1622,116},{1622,117},{1653,117},{1701,122},{1701,123},{1690,146},{1689,146},{1690,147}}}, + {"America/Port-au-Prince",42,{{-736,185},{-737,185},{-737,186},{-738,186},{-734,182},{-736,181},{-737,181},{-738,181},{-724,198},{-726,200},{-727,200},{-730,201},{-728,201},{-724,187},{-730,182},{-736,183},{-739,180},{-745,184},{-742,187},{-729,184},{-723,185},{-723,187},{-728,190},{-727,195},{-734,196},{-734,198},{-728,199},{-723,197},{-718,197},{-717,194},{-718,193},{-716,192},{-719,190},{-717,187},{-720,186},{-717,183},{-718,180},{-721,182},{-732,190},{-728,188},{-728,187},{-733,189}}}, + {"America/Montreal",460,{{-691,579},{-690,579},{-789,513},{-638,503},{-640,503},{-690,580},{-679,584},{-698,588},{-784,589},{-779,594},{-652,599},{-653,598},{-653,599},{-619,502},{-652,600},{-640,502},{-631,502},{-631,503},{-630,502},{-711,468},{-709,470},{-708,470},{-709,469},{-707,470},{-706,470},{-703,471},{-703,472},{-704,474},{-703,474},{-705,471},{-704,472},{-699,476},{-697,477},{-697,478},{-697,479},{-698,478},{-695,480},{-694,481},{-693,481},{-693,482},{-689,484},{-688,484},{-686,485},{-685,485},{-642,485},{-691,486},{-645,604},{-645,499},{-629,497},{-617,491},{-623,491},{-631,492},{-664,501},{-670,498},{-664,502},{-663,502},{-616,501},{-616,502},{-633,502},{-634,502},{-641,502},{-638,502},{-637,502},{-663,501},{-639,502},{-635,502},{-636,502},{-632,502},{-747,450},{-743,452},{-745,453},{-744,456},{-749,456},{-758,454},{-766,455},{-766,457},{-768,459},{-770,458},{-777,462},{-787,463},{-796,474},{-795,516},{-792,516},{-793,515},{-790,515},{-790,512},{-789,512},{-789,514},{-787,515},{-790,518},{-785,523},{-786,523},{-785,525},{-789,527},{-787,528},{-789,529},{-788,530},{-790,530},{-789,534},{-791,535},{-789,535},{-792,537},{-789,538},{-791,539},{-790,540},{-792,541},{-791,542},{-794,542},{-793,542},{-795,543},{-795,546},{-798,546},{-778,553},{-767,560},{-765,564},{-766,572},{-772,580},{-770,580},{-786,587},{-785,587},{-786,588},{-784,587},{-785,588},{-786,589},{-781,592},{-777,594},{-780,594},{-777,596},{-778,597},{-775,597},{-776,598},{-773,598},{-775,599},{-773,600},{-776,601},{-774,601},{-778,604},{-774,605},{-778,606},{-775,608},{-782,608},{-777,612},{-778,615},{-777,614},{-777,615},{-776,615},{-775,615},{-780,617},{-782,621},{-781,624},{-774,626},{-755,623},{-759,622},{-757,621},{-758,622},{-753,623},{-745,621},{-747,622},{-737,625},{-729,621},{-726,621},{-728,618},{-726,618},{-726,620},{-720,617},{-721,616},{-722,616},{-723,616},{-720,616},{-719,617},{-716,616},{-719,614},{-716,614},{-716,613},{-717,613},{-718,613},{-716,612},{-715,612},{-707,610},{-701,611},{-701,609},{-699,608},{-695,611},{-694,608},{-698,605},{-696,601},{-710,601},{-697,600},{-695,599},{-696,597},{-695,597},{-697,595},{-696,594},{-698,593},{-692,593},{-695,591},{-692,592},{-691,591},{-693,589},{-693,591},{-695,589},{-697,588},{-698,591},{-702,588},{-704,587},{-699,588},{-698,586},{-694,589},{-688,589},{-684,588},{-682,585},{-683,581},{-694,578},{-694,577},{-680,586},{-679,583},{-681,581},{-679,582},{-677,585},{-677,579},{-675,583},{-669,585},{-665,584},{-667,585},{-664,589},{-659,586},{-661,584},{-661,583},{-660,583},{-658,586},{-661,588},{-658,588},{-660,589},{-653,590},{-656,591},{-657,593},{-655,591},{-656,594},{-653,592},{-653,593},{-655,595},{-650,594},{-654,595},{-655,597},{-652,598},{-651,598},{-650,598},{-650,599},{-651,601},{-649,602},{-646,602},{-649,601},{-647,599},{-649,596},{-647,594},{-644,595},{-645,593},{-643,590},{-647,591},{-649,589},{-643,589},{-641,587},{-637,589},{-635,588},{-640,587},{-641,586},{-638,585},{-644,581},{-642,580},{-641,578},{-636,577},{-639,573},{-637,572},{-639,569},{-641,567},{-639,565},{-642,564},{-639,562},{-640,561},{-634,560},{-638,559},{-637,558},{-638,555},{-633,554},{-637,553},{-634,553},{-636,549},{-638,549},{-639,548},{-637,546},{-639,546},{-644,548},{-648,547},{-651,550},{-657,547},{-659,549},{-662,550},{-668,554},{-667,547},{-674,551},{-671,547},{-673,545},{-678,544},{-676,542},{-678,540},{-673,536},{-669,534},{-670,531},{-674,531},{-672,530},{-673,529},{-668,527},{-666,530},{-664,530},{-663,526},{-664,527},{-663,524},{-665,523},{-664,522},{-663,523},{-660,521},{-657,521},{-657,520},{-655,521},{-653,518},{-647,518},{-646,516},{-643,518},{-644,520},{-642,521},{-641,527},{-636,529},{-634,527},{-641,525},{-637,523},{-637,520},{-638,520},{-571,520},{-571,516},{-579,516},{-579,515},{-584,514},{-587,515},{-589,512},{-592,512},{-591,510},{-593,510},{-596,505},{-603,504},{-613,504},{-612,503},{-617,501},{-623,503},{-637,503},{-665,503},{-665,501},{-667,502},{-667,503},{-666,504},{-666,505},{-666,506},{-666,501},{-671,498},{-674,493},{-680,493},{-683,492},{-682,491},{-686,490},{-686,489},{-691,488},{-697,481},{-699,478},{-705,474},{-707,471},{-710,470},{-713,467},{-719,467},{-722,466},{-727,462},{-716,466},{-712,468},{-705,470},{-694,480},{-667,491},{-649,492},{-642,489},{-642,487},{-645,489},{-646,488},{-644,488},{-642,486},{-653,480},{-659,482},{-667,480},{-667,481},{-674,478},{-676,480},{-684,479},{-684,476},{-691,473},{-690,474},{-692,475},{-700,467},{-703,462},{-703,459},{-707,455},{-706,454},{-708,454},{-709,452},{-713,453},{-715,450},{-650,602},{-650,603},{-648,603},{-648,604},{-645,603},{-647,604},{-646,606},{-644,604},{-649,605},{-647,605},{-649,604},{-648,605},{-721,619},{-722,619},{-647,607},{-647,606},{-648,606},{-646,607},{-699,609},{-700,609},{-699,610},{-700,610},{-715,613},{-717,614},{-718,615},{-717,615},{-716,615},{-648,607},{-715,616},{-716,617},{-722,617},{-722,618},{-720,619},{-724,619},{-724,620},{-722,620},{-723,620},{-723,621},{-724,621},{-725,620},{-730,622},{-728,622},{-729,622},{-748,622},{-731,622},{-731,623},{-756,623},{-730,623},{-645,606}}}, + {"America/Panama",132,{{-818,72},{-818,73},{-822,75},{-822,91},{-822,92},{-820,91},{-821,91},{-821,92},{-813,75},{-811,76},{-810,76},{-811,75},{-812,75},{-812,76},{-800,76},{-818,74},{-819,75},{-817,76},{-816,73},{-816,77},{-811,77},{-812,77},{-818,78},{-812,78},{-817,78},{-815,77},{-816,78},{-811,78},{-818,79},{-812,79},{-811,79},{-829,80},{-823,81},{-820,80},{-821,79},{-821,80},{-816,91},{-815,91},{-823,92},{-824,92},{-822,93},{-823,93},{-822,94},{-823,94},{-788,95},{-789,96},{-796,96},{-821,93},{-779,91},{-782,93},{-774,86},{-772,79},{-776,75},{-777,77},{-779,72},{-784,81},{-783,81},{-782,84},{-780,82},{-778,81},{-777,81},{-780,83},{-781,85},{-783,84},{-782,85},{-784,86},{-784,83},{-786,88},{-792,90},{-797,89},{-798,86},{-805,82},{-800,75},{-804,72},{-809,72},{-818,82},{-822,82},{-822,84},{-827,83},{-829,83},{-831,83},{-828,85},{-829,88},{-827,89},{-829,91},{-828,96},{-822,90},{-818,89},{-819,92},{-815,88},{-813,88},{-798,94},{-790,96},{-791,94},{-780,92},{-775,87},{-774,87},{-821,82},{-823,82},{-824,81},{-817,81},{-818,81},{-781,84},{-783,85},{-783,83},{-791,84},{-788,83},{-789,83},{-791,82},{-791,83},{-825,83},{-823,83},{-824,83},{-788,84},{-789,82},{-790,85},{-822,83},{-824,82},{-790,84},{-777,89},{-791,85},{-790,86},{-796,86},{-790,87},{-791,87},{-795,88},{-796,88},{-791,86},{-778,90},{-777,90},{-791,89},{-791,90}}}, + {"America/Sitka",402,{{-1364,578},{-1354,571},{-1340,569},{-1341,569},{-1350,565},{-1348,567},{-1351,566},{-1350,568},{-1351,567},{-1352,567},{-1353,568},{-1354,569},{-1351,569},{-1354,570},{-1351,570},{-1353,573},{-1357,574},{-1355,574},{-1356,574},{-1355,575},{-1348,573},{-1346,567},{-1347,567},{-1348,565},{-1346,565},{-1347,564},{-1346,564},{-1347,563},{-1346,563},{-1347,562},{-1307,547},{-1307,548},{-1354,576},{-1306,547},{-1321,547},{-1309,554},{-1309,555},{-1315,555},{-1315,554},{-1321,554},{-1327,555},{-1326,555},{-1318,555},{-1332,555},{-1331,555},{-1324,555},{-1323,555},{-1337,554},{-1337,555},{-1338,554},{-1336,555},{-1334,555},{-1334,556},{-1333,555},{-1310,553},{-1310,554},{-1309,553},{-1326,553},{-1316,553},{-1317,553},{-1331,554},{-1322,554},{-1334,554},{-1335,554},{-1355,576},{-1356,576},{-1333,554},{-1332,554},{-1336,554},{-1335,555},{-1335,548},{-1335,549},{-1325,549},{-1315,550},{-1316,550},{-1325,550},{-1327,550},{-1313,550},{-1328,550},{-1312,550},{-1329,551},{-1329,550},{-1312,551},{-1323,548},{-1324,548},{-1313,549},{-1320,549},{-1324,549},{-1330,548},{-1329,548},{-1323,549},{-1312,549},{-1315,549},{-1331,550},{-1332,552},{-1331,553},{-1327,547},{-1327,551},{-1328,552},{-1329,552},{-1314,552},{-1315,553},{-1330,553},{-1330,552},{-1333,553},{-1332,553},{-1335,553},{-1334,553},{-1318,553},{-1317,551},{-1319,554},{-1337,553},{-1336,552},{-1309,556},{-1337,556},{-1332,556},{-1317,555},{-1317,556},{-1336,556},{-1331,556},{-1334,557},{-1335,556},{-1336,557},{-1335,557},{-1335,558},{-1334,558},{-1337,558},{-1333,558},{-1318,558},{-1318,559},{-1317,558},{-1317,559},{-1316,559},{-1323,558},{-1323,559},{-1324,558},{-1324,559},{-1337,559},{-1334,559},{-1335,559},{-1314,560},{-1315,559},{-1333,559},{-1359,573},{-1358,573},{-1362,576},{-1357,577},{-1356,577},{-1361,576},{-1360,576},{-1363,577},{-1362,577},{-1363,578},{-1359,574},{-1355,568},{-1356,568},{-1356,569},{-1355,569},{-1354,568},{-1353,567},{-1350,567},{-1352,568},{-1353,570},{-1341,570},{-1340,571},{-1348,571},{-1328,570},{-1332,571},{-1356,572},{-1355,572},{-1355,571},{-1355,573},{-1354,572},{-1358,570},{-1357,572},{-1357,573},{-1356,571},{-1356,573},{-1349,573},{-1350,574},{-1348,574},{-1339,569},{-1338,569},{-1343,559},{-1342,559},{-1341,559},{-1343,558},{-1344,559},{-1339,558},{-1339,559},{-1338,559},{-1359,580},{-1353,577},{-1354,577},{-1349,578},{-1348,575},{-1351,575},{-1358,578},{-1358,574},{-1360,575},{-1359,576},{-1360,578},{-1350,566},{-1337,568},{-1337,567},{-1329,569},{-1341,560},{-1331,560},{-1327,560},{-1324,557},{-1326,557},{-1321,555},{-1326,556},{-1327,554},{-1323,554},{-1325,554},{-1325,553},{-1321,553},{-1323,552},{-1324,551},{-1320,553},{-1320,551},{-1323,550},{-1320,550},{-1321,549},{-1320,548},{-1321,548},{-1320,547},{-1323,547},{-1326,550},{-1325,551},{-1326,551},{-1329,553},{-1329,555},{-1329,556},{-1331,559},{-1333,562},{-1336,562},{-1336,564},{-1332,563},{-1314,559},{-1312,552},{-1313,552},{-1312,553},{-1312,554},{-1313,554},{-1314,556},{-1314,554},{-1318,554},{-1315,557},{-1317,557},{-1315,558},{-1318,566},{-1301,561},{-1300,559},{-1302,557},{-1300,553},{-1305,548},{-1306,548},{-1305,549},{-1306,550},{-1307,550},{-1308,548},{-1310,551},{-1305,553},{-1307,551},{-1311,551},{-1306,553},{-1307,555},{-1306,556},{-1309,557},{-1307,557},{-1310,558},{-1308,558},{-1308,559},{-1312,560},{-1318,557},{-1320,557},{-1320,555},{-1321,556},{-1320,558},{-1321,558},{-1319,560},{-1320,562},{-1316,562},{-1315,562},{-1319,562},{-1324,565},{-1322,567},{-1332,559},{-1332,558},{-1326,560},{-1320,560},{-1321,560},{-1333,560},{-1334,560},{-1322,560},{-1322,559},{-1320,561},{-1335,560},{-1338,560},{-1335,561},{-1336,561},{-1333,561},{-1337,561},{-1331,561},{-1330,560},{-1329,561},{-1329,560},{-1326,561},{-1325,561},{-1330,561},{-1340,564},{-1341,565},{-1341,564},{-1318,567},{-1319,566},{-1323,566},{-1323,567},{-1325,565},{-1331,565},{-1326,565},{-1325,566},{-1330,566},{-1330,565},{-1343,566},{-1342,566},{-1337,566},{-1332,567},{-1324,566},{-1331,566},{-1326,566},{-1325,567},{-1327,567},{-1329,565},{-1328,566},{-1330,568},{-1339,563},{-1340,563},{-1335,562},{-1329,562},{-1325,563},{-1324,563},{-1325,562},{-1321,561},{-1323,561},{-1324,560},{-1327,562},{-1330,562},{-1330,563},{-1331,563},{-1323,562},{-1336,563},{-1337,563},{-1337,562},{-1331,562},{-1325,564},{-1324,564},{-1337,564},{-1338,564},{-1330,564},{-1327,565},{-1326,564},{-1340,568},{-1339,568},{-1340,566},{-1339,566},{-1338,563},{-1340,561},{-1341,563},{-1343,562},{-1342,563},{-1343,563},{-1342,564},{-1340,565},{-1341,566},{-1344,568},{-1341,568},{-1342,569},{-1338,565},{-1326,567},{-1338,571},{-1331,570},{-1329,566},{-1334,568},{-1337,569},{-1340,570},{-1326,576},{-1324,574},{-1322,572},{-1324,571},{-1320,570},{-1321,569},{-1321,568},{-1324,568},{-1328,568},{-1329,570},{-1328,571},{-1335,572},{-1331,572},{-1327,574},{-1324,573}}}, + {"Asia/Ho_Chi_Minh",254,{{1049,84},{1048,84},{1085,160},{1084,160},{1085,159},{1093,133},{1094,136},{1093,136},{1091,154},{1092,154},{1092,124},{1094,125},{1093,125},{1093,126},{1094,126},{1093,127},{1094,127},{1089,105},{1089,106},{1090,105},{1088,112},{1092,118},{1092,119},{1093,118},{1093,122},{1092,122},{1094,123},{1094,124},{1091,124},{1045,101},{1045,102},{1071,104},{1061,86},{1067,87},{1065,87},{1066,87},{1066,88},{1067,88},{1045,89},{1045,90},{1035,93},{1044,96},{1044,97},{1043,97},{1046,98},{1047,98},{1040,99},{1040,100},{1048,99},{1048,100},{1049,100},{1091,100},{1068,102},{1070,105},{1070,104},{1043,103},{1046,100},{1045,100},{1039,103},{1038,104},{1040,104},{1041,100},{1082,162},{1073,172},{1078,163},{1079,163},{1079,164},{1076,166},{1065,181},{1060,188},{1058,188},{1058,193},{1059,193},{1059,194},{1059,198},{1062,200},{1077,201},{1065,202},{1066,202},{1066,206},{1075,208},{1075,207},{1071,208},{1071,207},{1074,207},{1074,208},{1058,92},{1055,91},{1051,86},{1049,86},{1047,86},{1050,88},{1048,88},{1049,98},{1051,99},{1048,102},{1046,101},{1044,104},{1049,105},{1051,107},{1051,110},{1054,108},{1058,110},{1059,109},{1062,108},{1062,111},{1059,113},{1059,117},{1060,118},{1064,117},{1064,120},{1075,123},{1076,135},{1073,141},{1076,149},{1075,150},{1077,153},{1072,157},{1075,161},{1070,163},{1068,165},{1067,165},{1066,170},{1058,177},{1055,182},{1052,183},{1051,187},{1039,193},{1041,195},{1040,197},{1047,196},{1050,200},{1046,204},{1044,204},{1046,207},{1041,210},{1037,207},{1032,209},{1028,213},{1030,217},{1028,218},{1027,217},{1021,224},{1025,228},{1030,224},{1033,228},{1035,226},{1036,228},{1040,225},{1041,228},{1043,228},{1044,227},{1047,228},{1048,231},{1053,234},{1059,229},{1062,230},{1068,228},{1066,225},{1067,220},{1070,219},{1074,216},{1078,217},{1080,215},{1074,213},{1074,210},{1072,209},{1069,210},{1069,209},{1068,210},{1066,210},{1068,207},{1065,205},{1059,200},{1058,196},{1056,190},{1059,185},{1058,184},{1059,184},{1063,181},{1064,181},{1065,177},{1066,174},{1080,163},{1082,160},{1082,161},{1083,161},{1085,157},{1089,152},{1093,139},{1092,134},{1095,129},{1094,128},{1092,126},{1093,124},{1093,119},{1091,119},{1092,117},{1090,115},{1090,114},{1073,104},{1067,105},{1068,101},{1066,100},{1067,99},{1065,98},{1065,96},{1063,96},{1062,94},{1068,208},{1073,208},{1073,209},{1072,208},{1070,208},{1070,207},{1069,208},{1068,209},{1067,209},{1071,209},{1070,209},{1078,210},{1079,210},{1076,211},{1075,211},{1078,211},{1077,209},{1077,210},{1067,210},{1071,210},{1072,210},{1076,210},{1075,210},{1075,209},{1076,209},{1074,209},{1077,212},{1073,210},{1076,212},{1070,210},{1080,212},{1077,213},{1078,213},{1077,214},{1078,214},{1079,214},{1080,214},{1079,213},{1081,215},{1079,212},{1074,211},{1074,212},{1075,213},{1077,211},{1076,213}}}, + {"Asia/Jakarta",712,{{1104,-59},{1128,-58},{1158,-71},{1006,29},{1005,29},{1042,1},{1042,2},{1029,8},{1046,8},{1115,-83},{1122,-83},{1116,-84},{1163,-70},{1162,-70},{1162,-69},{1163,-69},{1053,-67},{1052,-67},{1052,-66},{1051,-66},{1053,-65},{1054,-62},{1055,-61},{1054,-61},{1053,-61},{1106,-82},{1139,-86},{1137,-85},{1133,-85},{1133,-84},{1134,-85},{1127,-85},{1127,-84},{1117,-84},{1118,-84},{1122,-84},{1119,-83},{1114,-83},{1110,-83},{1144,-56},{1144,-55},{1145,-55},{1144,-54},{1102,-58},{1102,-57},{1103,-57},{1103,-58},{1104,-57},{1128,-59},{1106,-59},{1106,-58},{1104,-58},{1105,-58},{1105,-59},{1126,-59},{1126,-58},{1127,-57},{1127,-58},{1090,-78},{1088,-77},{1089,-77},{1132,-77},{1133,-77},{1132,-73},{1158,-72},{1159,-72},{1148,-71},{1055,-70},{1056,-70},{1058,-70},{1058,-69},{1157,-71},{1157,-70},{1156,-71},{1156,-70},{1159,-70},{1155,-70},{1153,-70},{1156,-69},{1154,-70},{1147,-72},{1137,-72},{1137,-73},{1140,-72},{1141,-72},{1139,-72},{1138,-72},{1131,-72},{1146,-72},{1145,-72},{1145,-71},{1147,-71},{1146,-71},{1126,-70},{1126,-69},{1141,-71},{1140,-71},{1139,-71},{1139,-70},{1135,-72},{1127,-72},{1127,-71},{1129,-69},{1141,-69},{1144,-72},{1143,-71},{1144,-71},{1145,-70},{1142,-70},{1144,-70},{1158,-70},{1158,-69},{1159,-69},{1104,-69},{1154,-69},{1155,-69},{1004,-32},{1005,-32},{1005,-31},{1152,-69},{1038,-51},{1007,-35},{1006,-35},{1084,-33},{1084,-32},{1003,-33},{1006,-33},{1004,-33},{1005,-33},{1076,-32},{1003,-32},{1002,-31},{1003,-31},{1075,-32},{1075,-33},{1083,-32},{1082,-32},{1062,-32},{1081,-32},{1065,-31},{1087,-26},{1086,-26},{1085,-25},{1084,-28},{1000,-28},{1000,-27},{1053,-12},{990,-18},{993,-17},{993,-19},{991,-19},{993,-18},{991,-18},{992,-19},{995,-21},{992,-15},{991,-14},{1004,-12},{1003,-12},{995,-22},{997,-24},{996,-21},{998,-23},{999,-24},{996,-20},{995,-20},{1001,-30},{1002,-30},{1002,-29},{1078,-31},{1079,-31},{1082,-31},{1083,-31},{1003,-28},{1005,-30},{1076,-31},{1076,-30},{1075,-30},{1075,-31},{1072,-30},{1071,-30},{1082,-30},{1067,-30},{1068,-29},{1069,-29},{1069,-30},{1076,-26},{1082,-27},{1080,-33},{1074,-30},{1074,-29},{1075,-29},{1076,-29},{1059,-60},{1058,-59},{1059,-59},{1057,-59},{1074,-28},{1067,-29},{1071,-29},{1070,-29},{1071,-28},{1080,-26},{1071,-24},{1079,-26},{1079,-25},{1075,-28},{1058,-24},{1001,-29},{1069,-28},{1068,-28},{1000,-25},{1002,-28},{1000,-29},{1048,-58},{1049,-58},{1052,-57},{1014,19},{1056,-17},{1058,-18},{1057,-15},{1059,-15},{1063,-24},{1068,-26},{1066,-29},{1067,-31},{1059,-28},{1058,-21},{1051,-21},{1054,-16},{1056,-15},{1055,-59},{1055,-60},{1084,-59},{1062,-59},{1061,-59},{1052,-56},{1053,-56},{1024,-55},{1024,-54},{1063,-58},{1053,-58},{1058,-58},{1055,-58},{1052,-58},{1125,-69},{1128,-73},{1127,-75},{1129,-77},{1133,-78},{1140,-76},{1144,-78},{1144,-85},{1146,-88},{1132,-83},{1107,-82},{1102,-79},{1090,-77},{1089,-76},{1084,-78},{1078,-77},{1074,-75},{1064,-74},{1065,-70},{1060,-68},{1055,-69},{1052,-68},{1054,-66},{1055,-68},{1056,-65},{1058,-65},{1060,-59},{1062,-60},{1063,-59},{1070,-61},{1070,-59},{1073,-60},{1077,-63},{1083,-62},{1087,-68},{1102,-69},{1104,-70},{1107,-65},{1109,-64},{1112,-67},{1115,-66},{1121,-69},{1022,-53},{1021,-54},{1091,21},{1089,23},{967,21},{966,21},{971,20},{971,21},{972,21},{1091,25},{1092,26},{1090,25},{1090,26},{1089,25},{1089,27},{1089,28},{972,14},{972,15},{973,15},{971,12},{973,8},{973,9},{974,8},{974,9},{1075,9},{1075,10},{1074,10},{1034,9},{1041,10},{1040,9},{1040,10},{1038,10},{1034,10},{1043,10},{1042,10},{1039,10},{1009,19},{1009,18},{1009,20},{1008,21},{1016,21},{1015,21},{1076,10},{1048,10},{1049,10},{1044,10},{1075,11},{1048,11},{1042,11},{1074,11},{1047,11},{988,17},{987,18},{988,18},{1014,17},{1014,18},{986,16},{985,16},{984,17},{986,17},{1033,10},{1034,11},{1039,11},{1038,11},{1033,11},{1041,12},{1020,16},{1025,15},{1025,12},{1021,15},{988,13},{1034,12},{1039,12},{1016,20},{1017,21},{1018,20},{1016,17},{1077,45},{980,45},{981,46},{1080,47},{1079,47},{1080,48},{951,56},{952,56},{952,55},{950,56},{951,57},{950,57},{953,58},{952,59},{954,59},{954,49},{976,52},{954,30},{972,23},{973,23},{967,22},{966,22},{972,22},{959,25},{960,25},{962,27},{957,27},{962,24},{962,23},{1063,26},{1001,26},{963,24},{965,24},{964,25},{964,26},{964,27},{958,26},{958,29},{1086,27},{1088,29},{1088,30},{1089,30},{1089,29},{1061,29},{1087,29},{1057,29},{1058,29},{1057,31},{1059,30},{1062,27},{1062,28},{1088,27},{1063,27},{1010,23},{974,23},{974,22},{975,22},{971,22},{973,22},{973,20},{1007,22},{1006,22},{1007,23},{1008,22},{1008,23},{974,24},{1059,24},{1088,31},{1084,38},{1080,39},{1079,39},{985,39},{985,40},{986,40},{982,41},{983,41},{982,42},{983,42},{1082,42},{1082,43},{1078,41},{1079,42},{1079,41},{1081,42},{1081,41},{1061,34},{1062,34},{1063,34},{1081,36},{1081,37},{1080,37},{1081,38},{1080,38},{1080,36},{1064,33},{1061,33},{1060,33},{1062,33},{1063,33},{1083,37},{1080,40},{1084,40},{1062,29},{1062,30},{1057,30},{1064,30},{1062,31},{1078,30},{1077,30},{1063,30},{1061,30},{1058,30},{1060,30},{1056,31},{1065,31},{1064,31},{1061,31},{1061,32},{1064,32},{1065,32},{1063,32},{1063,31},{1060,31},{1059,31},{1062,32},{1064,34},{1065,34},{1053,-11},{985,-6},{985,-5},{1042,-4},{989,-11},{990,-11},{988,-9},{993,-16},{992,-18},{989,-17},{986,-12},{987,-10},{1042,-11},{1042,-10},{978,-1},{979,-1},{982,-1},{982,0},{983,0},{982,1},{1043,-4},{1046,-5},{1045,-7},{1043,-7},{984,-3},{984,-2},{985,-4},{984,-6},{983,-5},{1058,-41},{1059,-49},{1053,-54},{1045,-55},{1047,-59},{1046,-59},{1037,-50},{1023,-40},{1022,-37},{1016,-32},{1009,-23},{1008,-19},{1004,-13},{1003,-9},{997,0},{991,3},{987,16},{978,23},{976,29},{969,37},{965,38},{955,46},{956,56},{964,52},{975,52},{979,49},{983,44},{981,41},{998,32},{1001,25},{1002,27},{1004,23},{1018,17},{1022,14},{1024,8},{1029,7},{1031,4},{1027,2},{1033,5},{1037,3},{1038,0},{1034,-2},{1038,-3},{1034,-5},{1034,-7},{1037,-10},{1044,-10},{1045,-19},{1049,-21},{1046,-24},{1047,-26},{1049,-23},{1056,-24},{1058,-29},{1060,-30},{1061,-32},{1058,-36},{1060,-38},{1035,-2},{1049,-1},{1044,-3},{1045,-3},{986,-3},{1041,-4},{1042,-3},{1048,-2},{1047,-1},{983,-1},{985,-1},{1045,1},{1045,0},{1046,1},{984,0},{1048,0},{1048,-1},{1047,0},{985,0},{1072,1},{986,1},{986,2},{989,1},{988,1},{1047,1},{1048,1},{1044,1},{1044,2},{1043,1},{1043,2},{1045,2},{1047,-2},{1050,-3},{1044,-2},{1046,0},{1045,3},{1044,3},{1043,3},{1046,3},{1046,4},{991,4},{1029,3},{1030,3},{1032,4},{1045,4},{1044,4},{1043,4},{1044,5},{1045,5},{1031,5},{1030,5},{1036,5},{1036,6},{1043,5},{1036,4},{1035,4},{1028,3},{993,2},{1071,6},{1070,6},{1070,7},{1037,6},{1042,5},{1042,6},{1038,6},{1038,5},{1031,6},{1030,6},{1030,7},{1041,6},{1031,7},{1043,6},{1042,7},{1076,9},{1074,9},{1046,7},{1047,7},{1037,7},{1033,6},{1032,5},{1032,7},{1033,7},{1043,7},{1035,6},{1035,7},{1036,7},{1038,7},{1028,8},{1047,8},{1048,7},{1031,8},{1034,6},{1035,8},{1042,8},{1043,8},{1044,7},{1048,8},{1045,8},{1045,7},{1040,8},{1037,8},{1039,8},{1038,8},{1034,8},{1041,8},{1037,9},{1044,8},{1047,9},{1046,9},{1038,9},{1045,9},{1044,9},{1042,9},{1041,9},{1028,10},{1025,11},{1033,9},{1035,9},{1049,9},{1048,9},{1039,9},{1043,12},{1046,12},{1045,10},{974,15},{979,10},{978,5},{971,14},{1029,11},{1031,10},{1032,8},{1026,10},{1024,13},{1024,9}}}, + {"America/Boise",29,{{-1110,424},{-1110,420},{-1170,420},{-1170,425},{-1182,424},{-1182,443},{-1180,444},{-1172,443},{-1172,445},{-1165,456},{-1168,458},{-1166,460},{-1163,459},{-1163,454},{-1162,454},{-1155,454},{-1152,456},{-1148,454},{-1147,454},{-1148,455},{-1143,455},{-1139,457},{-1135,449},{-1131,448},{-1129,444},{-1123,446},{-1115,445},{-1114,448},{-1110,445}}}, + {"Asia/Baghdad",46,{{480,300},{472,300},{466,291},{447,292},{421,311},{404,319},{392,322},{393,324},{390,323},{388,334},{410,344},{412,348},{414,365},{418,366},{428,374},{438,372},{441,373},{443,370},{448,372},{449,370},{448,368},{451,367},{450,365},{453,364},{454,360},{455,360},{458,358},{463,358},{460,357},{462,351},{459,351},{457,348},{457,345},{455,346},{454,345},{456,341},{454,340},{462,333},{461,330},{475,324},{479,318},{477,310},{480,310},{480,305},{486,299},{477,301}}}, + {"Africa/El_Aaiun",20,{{-160,236},{-160,235},{-120,260},{-120,235},{-128,234},{-131,231},{-130,213},{-169,213},{-171,208},{-170,218},{-168,222},{-165,223},{-157,239},{-160,237},{-149,247},{-145,261},{-136,267},{-132,277},{-87,277},{-87,260}}}, + {"Europe/Zagreb",162,{{163,424},{180,427},{179,427},{181,426},{178,427},{178,428},{174,428},{177,427},{173,428},{165,428},{167,429},{168,427},{168,428},{169,428},{155,421},{157,422},{158,422},{167,428},{143,446},{143,445},{144,445},{144,446},{146,445},{145,445},{146,444},{145,444},{149,445},{148,445},{150,444},{149,444},{142,446},{142,447},{143,447},{148,447},{146,447},{138,449},{137,449},{148,449},{145,450},{152,439},{153,439},{148,450},{147,449},{144,451},{146,452},{143,448},{147,448},{149,447},{148,448},{144,450},{145,446},{143,452},{154,440},{151,440},{152,440},{151,441},{150,442},{149,441},{149,442},{150,441},{151,442},{152,441},{151,443},{150,443},{147,443},{146,443},{148,442},{148,443},{147,444},{148,444},{150,445},{153,443},{147,447},{160,430},{169,429},{166,430},{172,429},{170,429},{155,431},{167,431},{165,434},{164,434},{169,433},{166,433},{164,432},{163,432},{172,431},{171,431},{162,434},{161,434},{161,435},{159,437},{158,437},{164,433},{163,434},{185,426},{185,424},{179,428},{170,430},{178,429},{157,430},{158,430},{161,430},{161,431},{163,431},{162,430},{155,437},{154,437},{157,438},{156,438},{153,438},{155,439},{152,438},{155,438},{154,438},{157,436},{156,437},{157,437},{154,439},{191,450},{189,449},{187,451},{183,451},{178,450},{165,452},{163,450},{158,452},{158,448},{161,445},{163,442},{172,435},{177,430},{176,429},{169,434},{160,435},{160,437},{158,438},{160,438},{160,439},{156,441},{150,446},{148,451},{146,453},{143,454},{139,448},{135,455},{144,455},{146,456},{148,455},{153,455},{153,457},{157,459},{156,462},{164,465},{179,458},{184,457},{189,459},{189,456},{191,455},{190,454},{194,452},{192,452}}}, + {"America/Santiago",1813,{{-682,-552},{-699,-552},{-718,-545},{-672,-558},{-671,-558},{-703,-550},{-668,-553},{-717,-544},{-692,-552},{-673,-560},{-673,-559},{-672,-560},{-670,-559},{-668,-558},{-694,-558},{-694,-557},{-695,-557},{-675,-559},{-674,-559},{-674,-558},{-672,-559},{-671,-559},{-673,-558},{-676,-559},{-676,-558},{-678,-558},{-675,-558},{-666,-553},{-666,-552},{-664,-552},{-665,-553},{-667,-553},{-710,-551},{-709,-552},{-709,-551},{-708,-551},{-701,-553},{-698,-553},{-707,-552},{-693,-553},{-692,-553},{-690,-553},{-678,-552},{-691,-553},{-694,-553},{-702,-553},{-701,-552},{-700,-553},{-697,-553},{-697,-552},{-700,-552},{-680,-553},{-679,-552},{-668,-552},{-668,-551},{-668,-550},{-702,-551},{-682,-551},{-683,-552},{-687,-552},{-688,-552},{-688,-551},{-706,-552},{-706,-551},{-684,-551},{-685,-551},{-689,-551},{-685,-552},{-683,-551},{-671,-550},{-669,-550},{-670,-550},{-668,-556},{-675,-556},{-673,-556},{-690,-556},{-689,-556},{-676,-556},{-676,-557},{-677,-557},{-727,-519},{-676,-555},{-677,-556},{-685,-556},{-675,-557},{-674,-557},{-697,-555},{-696,-555},{-681,-554},{-699,-554},{-700,-554},{-699,-553},{-696,-554},{-697,-554},{-692,-554},{-691,-554},{-698,-554},{-695,-555},{-690,-555},{-695,-554},{-690,-554},{-692,-555},{-692,-556},{-691,-556},{-691,-555},{-687,-556},{-688,-555},{-687,-555},{-686,-556},{-686,-555},{-685,-555},{-680,-556},{-680,-555},{-683,-556},{-683,-555},{-684,-555},{-693,-555},{-689,-555},{-684,-556},{-694,-555},{-670,-554},{-671,-553},{-689,-552},{-689,-553},{-723,-544},{-712,-550},{-711,-550},{-680,-549},{-672,-549},{-670,-551},{-672,-553},{-675,-552},{-678,-553},{-677,-552},{-681,-552},{-682,-550},{-684,-549},{-700,-550},{-700,-551},{-701,-551},{-701,-550},{-683,-550},{-699,-550},{-706,-550},{-704,-550},{-705,-550},{-683,-549},{-702,-542},{-703,-542},{-733,-542},{-733,-541},{-731,-542},{-731,-541},{-730,-542},{-730,-541},{-724,-542},{-728,-542},{-729,-542},{-725,-541},{-729,-541},{-728,-541},{-726,-542},{-727,-541},{-732,-541},{-732,-540},{-735,-541},{-734,-540},{-731,-539},{-730,-539},{-703,-541},{-704,-542},{-705,-541},{-703,-540},{-711,-541},{-719,-541},{-712,-541},{-712,-540},{-717,-541},{-711,-540},{-705,-540},{-730,-540},{-731,-540},{-723,-540},{-729,-540},{-723,-541},{-722,-541},{-722,-540},{-734,-539},{-729,-539},{-733,-539},{-721,-539},{-720,-539},{-722,-539},{-714,-549},{-715,-549},{-714,-550},{-713,-549},{-703,-549},{-714,-548},{-709,-548},{-713,-548},{-719,-547},{-718,-547},{-710,-547},{-710,-546},{-717,-546},{-713,-546},{-714,-547},{-713,-547},{-720,-547},{-718,-548},{-710,-548},{-712,-548},{-716,-548},{-716,-547},{-715,-547},{-711,-547},{-712,-547},{-720,-546},{-721,-547},{-717,-547},{-709,-549},{-721,-546},{-720,-545},{-719,-546},{-716,-545},{-692,-545},{-730,-545},{-731,-545},{-691,-544},{-722,-545},{-721,-545},{-713,-544},{-712,-544},{-714,-544},{-724,-545},{-724,-544},{-716,-544},{-721,-544},{-715,-544},{-719,-544},{-720,-544},{-718,-544},{-722,-544},{-696,-543},{-697,-543},{-728,-543},{-724,-543},{-716,-543},{-727,-543},{-727,-542},{-726,-543},{-723,-543},{-723,-542},{-717,-543},{-717,-542},{-722,-543},{-722,-542},{-720,-542},{-720,-543},{-699,-543},{-700,-543},{-721,-543},{-725,-543},{-721,-542},{-748,-512},{-748,-511},{-747,-511},{-725,-544},{-710,-543},{-718,-543},{-714,-543},{-715,-543},{-715,-542},{-713,-550},{-710,-550},{-707,-550},{-705,-552},{-695,-553},{-695,-552},{-685,-549},{-686,-552},{-690,-550},{-691,-551},{-682,-553},{-686,-553},{-687,-553},{-686,-554},{-680,-557},{-687,-554},{-692,-551},{-694,-552},{-693,-552},{-694,-554},{-695,-550},{-697,-549},{-691,-550},{-702,-550},{-701,-549},{-700,-549},{-708,-550},{-706,-549},{-705,-549},{-710,-549},{-702,-549},{-707,-548},{-706,-548},{-704,-549},{-707,-549},{-743,-509},{-703,-543},{-705,-542},{-719,-542},{-744,-509},{-750,-510},{-749,-510},{-749,-511},{-748,-510},{-750,-511},{-743,-516},{-711,-544},{-713,-543},{-712,-542},{-714,-541},{-716,-540},{-713,-540},{-710,-541},{-711,-543},{-725,-542},{-740,-512},{-751,-511},{-751,-512},{-750,-512},{-742,-512},{-742,-511},{-741,-511},{-744,-511},{-751,-510},{-727,-517},{-738,-514},{-747,-515},{-740,-515},{-740,-514},{-750,-514},{-744,-514},{-748,-514},{-747,-514},{-742,-514},{-745,-514},{-743,-514},{-739,-514},{-729,-519},{-738,-519},{-739,-517},{-739,-516},{-738,-517},{-744,-517},{-742,-513},{-741,-515},{-747,-513},{-746,-514},{-744,-513},{-745,-513},{-743,-513},{-746,-516},{-751,-515},{-748,-515},{-739,-515},{-749,-515},{-749,-516},{-750,-515},{-740,-516},{-747,-516},{-744,-516},{-746,-515},{-748,-516},{-745,-515},{-741,-514},{-741,-512},{-739,-513},{-741,-517},{-742,-516},{-741,-516},{-745,-512},{-747,-512},{-738,-513},{-737,-514},{-751,-513},{-737,-520},{-737,-519},{-744,-519},{-744,-520},{-745,-519},{-750,-513},{-749,-512},{-749,-513},{-744,-512},{-746,-511},{-746,-512},{-745,-511},{-743,-519},{-743,-510},{-748,-524},{-748,-523},{-749,-523},{-739,-523},{-736,-523},{-737,-523},{-738,-523},{-745,-523},{-742,-523},{-743,-523},{-744,-523},{-729,-518},{-730,-518},{-737,-518},{-736,-518},{-740,-518},{-741,-518},{-745,-518},{-746,-517},{-746,-518},{-749,-517},{-742,-518},{-735,-517},{-736,-517},{-738,-518},{-747,-518},{-747,-517},{-748,-517},{-727,-520},{-750,-520},{-742,-520},{-743,-520},{-741,-520},{-746,-520},{-739,-520},{-746,-519},{-747,-519},{-740,-519},{-739,-518},{-744,-518},{-741,-519},{-745,-517},{-738,-522},{-745,-516},{-750,-519},{-751,-518},{-750,-517},{-749,-518},{-729,-523},{-729,-522},{-745,-522},{-746,-523},{-746,-522},{-731,-521},{-732,-521},{-743,-521},{-733,-522},{-748,-522},{-744,-522},{-747,-522},{-747,-523},{-749,-522},{-743,-522},{-742,-522},{-750,-521},{-749,-521},{-740,-522},{-739,-522},{-745,-521},{-746,-521},{-748,-521},{-739,-521},{-740,-521},{-743,-517},{-742,-521},{-741,-521},{-747,-521},{-744,-521},{-731,-520},{-730,-521},{-740,-520},{-745,-520},{-747,-520},{-751,-520},{-749,-519},{-748,-519},{-748,-518},{-752,-516},{-753,-517},{-752,-513},{-739,-524},{-742,-524},{-743,-524},{-745,-524},{-746,-524},{-744,-524},{-747,-524},{-740,-524},{-741,-525},{-741,-524},{-743,-525},{-745,-525},{-736,-524},{-741,-522},{-737,-524},{-737,-537},{-737,-536},{-736,-536},{-736,-537},{-745,-472},{-741,-523},{-702,-539},{-721,-537},{-722,-537},{-734,-538},{-733,-538},{-721,-538},{-720,-538},{-725,-537},{-724,-537},{-738,-536},{-727,-536},{-732,-534},{-723,-537},{-724,-536},{-723,-536},{-728,-536},{-734,-536},{-709,-539},{-728,-539},{-744,-530},{-745,-530},{-742,-531},{-743,-533},{-742,-533},{-743,-532},{-742,-532},{-740,-527},{-739,-535},{-738,-534},{-741,-532},{-741,-533},{-744,-531},{-743,-531},{-740,-532},{-741,-531},{-740,-531},{-742,-526},{-740,-526},{-746,-529},{-746,-530},{-743,-529},{-741,-527},{-744,-526},{-742,-527},{-746,-485},{-746,-484},{-739,-534},{-718,-535},{-736,-534},{-729,-534},{-737,-534},{-734,-535},{-734,-534},{-729,-535},{-736,-535},{-738,-535},{-737,-535},{-728,-535},{-732,-535},{-729,-531},{-730,-531},{-731,-534},{-735,-536},{-735,-535},{-733,-535},{-733,-534},{-729,-537},{-727,-537},{-727,-535},{-724,-538},{-725,-540},{-728,-540},{-727,-539},{-728,-538},{-731,-538},{-733,-540},{-732,-537},{-736,-538},{-735,-537},{-731,-535},{-738,-531},{-738,-530},{-735,-530},{-734,-530},{-739,-530},{-732,-532},{-732,-531},{-718,-531},{-733,-531},{-734,-531},{-735,-531},{-723,-531},{-722,-531},{-731,-531},{-724,-531},{-719,-531},{-736,-443},{-735,-443},{-719,-532},{-737,-533},{-738,-533},{-737,-532},{-739,-532},{-738,-532},{-736,-532},{-734,-533},{-739,-533},{-725,-533},{-731,-533},{-730,-532},{-733,-532},{-739,-531},{-704,-530},{-704,-529},{-703,-529},{-706,-529},{-708,-529},{-706,-528},{-707,-529},{-726,-526},{-724,-530},{-726,-531},{-722,-532},{-726,-532},{-724,-533},{-727,-533},{-724,-535},{-725,-536},{-728,-532},{-727,-531},{-729,-530},{-730,-528},{-727,-527},{-726,-528},{-727,-529},{-724,-529},{-722,-526},{-714,-527},{-720,-531},{-747,-527},{-743,-530},{-741,-529},{-737,-531},{-736,-531},{-735,-533},{-736,-533},{-736,-530},{-736,-529},{-729,-528},{-735,-529},{-738,-529},{-736,-528},{-734,-529},{-739,-529},{-725,-528},{-737,-528},{-723,-527},{-724,-527},{-737,-527},{-737,-526},{-735,-527},{-736,-527},{-726,-527},{-725,-527},{-734,-527},{-733,-528},{-734,-528},{-735,-528},{-724,-528},{-733,-527},{-723,-539},{-716,-539},{-718,-540},{-716,-541},{-719,-540},{-719,-543},{-737,-525},{-745,-526},{-744,-525},{-707,-537},{-705,-536},{-707,-539},{-705,-543},{-709,-541},{-706,-539},{-704,-531},{-701,-529},{-704,-528},{-699,-528},{-694,-525},{-692,-527},{-688,-525},{-686,-527},{-686,-549},{-696,-548},{-697,-547},{-697,-548},{-698,-548},{-698,-547},{-699,-548},{-699,-547},{-702,-547},{-703,-548},{-704,-546},{-709,-546},{-713,-545},{-715,-546},{-716,-546},{-717,-545},{-715,-545},{-709,-545},{-708,-543},{-706,-544},{-707,-544},{-708,-546},{-703,-546},{-701,-546},{-701,-544},{-700,-544},{-702,-543},{-698,-546},{-698,-543},{-692,-544},{-694,-546},{-694,-547},{-691,-545},{-690,-545},{-700,-541},{-702,-538},{-693,-535},{-694,-534},{-702,-535},{-705,-534},{-727,-526},{-721,-526},{-723,-526},{-741,-526},{-729,-526},{-728,-526},{-723,-525},{-746,-525},{-742,-525},{-736,-525},{-740,-525},{-747,-525},{-738,-524},{-738,-527},{-739,-526},{-739,-525},{-755,-505},{-754,-504},{-753,-504},{-755,-504},{-755,-495},{-756,-495},{-756,-494},{-755,-494},{-755,-496},{-756,-496},{-754,-496},{-754,-495},{-753,-495},{-753,-496},{-754,-498},{-746,-470},{-746,-469},{-743,-468},{-744,-468},{-757,-492},{-754,-492},{-756,-492},{-753,-492},{-751,-462},{-736,-462},{-755,-466},{-752,-467},{-749,-462},{-750,-462},{-748,-461},{-737,-461},{-737,-460},{-740,-460},{-739,-461},{-739,-460},{-739,-459},{-740,-459},{-748,-459},{-738,-459},{-738,-458},{-739,-458},{-741,-459},{-741,-472},{-743,-472},{-742,-472},{-742,-471},{-744,-471},{-745,-471},{-743,-470},{-743,-471},{-752,-468},{-753,-468},{-753,-467},{-754,-467},{-736,-482},{-735,-482},{-741,-485},{-742,-485},{-742,-484},{-740,-484},{-743,-485},{-744,-486},{-743,-486},{-753,-485},{-753,-484},{-746,-486},{-745,-485},{-744,-485},{-745,-484},{-756,-484},{-743,-484},{-756,-483},{-744,-483},{-743,-483},{-743,-482},{-744,-482},{-753,-480},{-739,-480},{-753,-479},{-752,-479},{-746,-480},{-746,-479},{-745,-479},{-752,-477},{-752,-476},{-744,-477},{-744,-476},{-743,-476},{-742,-476},{-749,-477},{-749,-478},{-750,-478},{-751,-477},{-751,-479},{-750,-479},{-750,-480},{-752,-480},{-744,-478},{-742,-478},{-738,-479},{-747,-479},{-748,-478},{-742,-434},{-748,-480},{-751,-478},{-737,-479},{-754,-478},{-752,-478},{-736,-478},{-736,-479},{-739,-479},{-738,-478},{-747,-478},{-746,-478},{-737,-478},{-745,-478},{-741,-478},{-753,-477},{-754,-477},{-746,-481},{-748,-481},{-750,-481},{-751,-481},{-749,-482},{-750,-482},{-749,-483},{-748,-482},{-750,-485},{-753,-481},{-746,-482},{-745,-482},{-731,-417},{-730,-417},{-743,-434},{-745,-481},{-736,-481},{-737,-481},{-739,-481},{-738,-481},{-755,-480},{-751,-480},{-752,-481},{-747,-481},{-747,-480},{-738,-480},{-737,-480},{-740,-480},{-741,-480},{-748,-479},{-757,-491},{-756,-491},{-756,-490},{-755,-491},{-755,-488},{-756,-488},{-754,-488},{-729,-417},{-730,-427},{-730,-426},{-731,-426},{-750,-486},{-748,-484},{-748,-486},{-748,-483},{-745,-487},{-735,-371},{-736,-370},{-735,-370},{-731,-366},{-730,-366},{-891,-323},{-789,-336},{-788,-336},{-788,-337},{-790,-337},{-715,-319},{-807,-337},{-807,-338},{-808,-338},{-808,-337},{-750,-458},{-752,-485},{-753,-483},{-755,-484},{-754,-484},{-754,-483},{-754,-482},{-755,-482},{-755,-481},{-751,-484},{-751,-485},{-751,-486},{-752,-487},{-748,-476},{-725,-417},{-724,-417},{-730,-416},{-730,-415},{-734,-399},{-738,-417},{-739,-384},{-740,-384},{-740,-383},{-733,-425},{-734,-425},{-732,-425},{-731,-424},{-732,-424},{-735,-424},{-734,-424},{-733,-424},{-729,-419},{-726,-421},{-726,-420},{-725,-421},{-725,-420},{-726,-422},{-725,-422},{-732,-423},{-734,-422},{-735,-421},{-734,-421},{-733,-423},{-731,-423},{-732,-422},{-731,-419},{-732,-419},{-731,-418},{-732,-418},{-733,-418},{-736,-418},{-730,-419},{-730,-418},{-733,-417},{-712,-283},{-799,-264},{-710,-273},{-710,-272},{-716,-290},{-713,-285},{-801,-263},{-706,-234},{-707,-262},{-707,-261},{-716,-296},{-715,-296},{-715,-293},{-715,-292},{-730,-436},{-742,-435},{-736,-433},{-736,-432},{-737,-433},{-737,-432},{-734,-431},{-735,-431},{-735,-430},{-733,-430},{-736,-429},{-735,-429},{-734,-429},{-736,-431},{-735,-432},{-737,-431},{-731,-428},{-731,-427},{-728,-427},{-729,-427},{-733,-427},{-734,-426},{-732,-426},{-736,-427},{-737,-426},{-736,-426},{-729,-428},{-737,-434},{-738,-434},{-738,-433},{-735,-427},{-735,-426},{-733,-426},{-736,-425},{-737,-424},{-737,-458},{-736,-458},{-747,-458},{-741,-458},{-740,-458},{-745,-458},{-746,-458},{-744,-458},{-743,-458},{-733,-457},{-733,-456},{-749,-457},{-749,-456},{-748,-456},{-739,-418},{-739,-419},{-735,-418},{-736,-420},{-738,-425},{-737,-425},{-737,-429},{-744,-432},{-742,-429},{-742,-423},{-741,-418},{-737,-462},{-730,-454},{-738,-457},{-738,-456},{-737,-457},{-748,-457},{-741,-457},{-742,-457},{-745,-457},{-739,-457},{-742,-458},{-743,-457},{-746,-457},{-747,-457},{-745,-456},{-729,-455},{-728,-454},{-729,-454},{-736,-454},{-735,-454},{-738,-454},{-737,-454},{-741,-454},{-742,-454},{-741,-456},{-741,-455},{-736,-456},{-736,-455},{-739,-456},{-740,-457},{-740,-455},{-743,-455},{-744,-455},{-742,-456},{-742,-455},{-741,-453},{-742,-453},{-745,-455},{-744,-454},{-740,-454},{-738,-455},{-739,-454},{-739,-455},{-735,-451},{-735,-452},{-742,-452},{-743,-452},{-736,-452},{-737,-450},{-735,-450},{-734,-452},{-734,-451},{-733,-451},{-743,-451},{-744,-451},{-744,-450},{-736,-451},{-734,-450},{-746,-450},{-736,-450},{-743,-450},{-734,-453},{-733,-453},{-746,-453},{-736,-453},{-735,-453},{-737,-453},{-738,-453},{-743,-454},{-743,-453},{-745,-453},{-741,-452},{-747,-453},{-746,-452},{-744,-453},{-745,-452},{-744,-452},{-742,-450},{-751,-449},{-752,-448},{-751,-448},{-750,-449},{-748,-447},{-748,-446},{-747,-446},{-737,-448},{-738,-448},{-736,-447},{-737,-447},{-739,-446},{-737,-445},{-744,-448},{-743,-448},{-745,-448},{-744,-447},{-740,-449},{-741,-448},{-742,-448},{-739,-448},{-740,-448},{-736,-448},{-740,-447},{-739,-447},{-738,-447},{-745,-447},{-747,-447},{-746,-446},{-736,-446},{-742,-447},{-744,-446},{-733,-446},{-751,-499},{-740,-446},{-728,-444},{-729,-444},{-745,-444},{-744,-444},{-731,-446},{-732,-446},{-731,-445},{-733,-445},{-734,-445},{-739,-445},{-735,-445},{-743,-446},{-742,-445},{-741,-446},{-742,-446},{-738,-445},{-736,-445},{-732,-443},{-732,-442},{-733,-443},{-737,-443},{-731,-443},{-739,-443},{-738,-443},{-736,-442},{-738,-442},{-742,-442},{-743,-443},{-744,-443},{-743,-442},{-742,-443},{-741,-442},{-741,-443},{-737,-442},{-744,-442},{-739,-442},{-737,-441},{-733,-444},{-740,-444},{-736,-440},{-737,-439},{-736,-439},{-738,-444},{-739,-444},{-731,-444},{-737,-444},{-736,-444},{-743,-444},{-746,-445},{-742,-444},{-741,-445},{-740,-445},{-732,-444},{-730,-444},{-741,-444},{-740,-443},{-735,-449},{-746,-449},{-744,-449},{-743,-449},{-740,-450},{-742,-449},{-739,-450},{-733,-449},{-734,-449},{-737,-449},{-736,-449},{-739,-449},{-738,-450},{-733,-440},{-732,-439},{-731,-439},{-732,-440},{-738,-440},{-739,-440},{-738,-439},{-741,-440},{-741,-439},{-742,-439},{-729,-445},{-727,-445},{-730,-446},{-728,-447},{-732,-449},{-734,-448},{-732,-448},{-734,-447},{-734,-446},{-743,-441},{-743,-440},{-732,-441},{-737,-440},{-742,-440},{-730,-438},{-735,-437},{-740,-438},{-748,-436},{-747,-435},{-746,-436},{-748,-437},{-739,-439},{-738,-438},{-740,-439},{-739,-438},{-733,-441},{-739,-441},{-741,-441},{-740,-441},{-742,-441},{-744,-441},{-738,-441},{-740,-442},{-735,-442},{-735,-441},{-736,-441},{-735,-440},{-741,-508},{-741,-509},{-742,-508},{-742,-509},{-743,-508},{-750,-508},{-751,-508},{-749,-508},{-745,-508},{-744,-508},{-747,-507},{-747,-509},{-749,-509},{-748,-508},{-748,-507},{-749,-507},{-745,-505},{-747,-508},{-746,-508},{-753,-507},{-752,-507},{-752,-508},{-746,-507},{-751,-506},{-750,-507},{-751,-507},{-750,-506},{-746,-506},{-745,-509},{-734,-491},{-736,-495},{-734,-498},{-736,-503},{-731,-508},{-727,-506},{-723,-507},{-723,-510},{-724,-511},{-723,-513},{-724,-516},{-720,-519},{-720,-520},{-700,-520},{-684,-523},{-684,-524},{-692,-522},{-697,-525},{-709,-527},{-707,-528},{-709,-529},{-710,-534},{-710,-538},{-713,-539},{-725,-534},{-721,-532},{-721,-534},{-723,-534},{-718,-534},{-721,-535},{-717,-534},{-718,-533},{-717,-532},{-711,-529},{-716,-526},{-724,-525},{-729,-525},{-730,-527},{-731,-529},{-732,-529},{-733,-529},{-732,-528},{-730,-526},{-731,-526},{-731,-525},{-732,-524},{-734,-526},{-735,-525},{-736,-522},{-738,-520},{-733,-523},{-731,-523},{-727,-521},{-728,-520},{-725,-522},{-730,-525},{-726,-525},{-727,-524},{-724,-519},{-725,-518},{-727,-516},{-731,-515},{-730,-512},{-731,-512},{-733,-515},{-725,-517},{-733,-516},{-732,-519},{-733,-519},{-733,-517},{-734,-516},{-735,-520},{-734,-521},{-737,-516},{-738,-516},{-736,-516},{-738,-512},{-737,-513},{-736,-512},{-738,-511},{-737,-512},{-740,-511},{-741,-510},{-739,-509},{-738,-510},{-738,-507},{-734,-507},{-737,-506},{-736,-505},{-736,-504},{-740,-509},{-742,-506},{-741,-506},{-743,-505},{-739,-506},{-741,-504},{-740,-504},{-742,-503},{-744,-504},{-747,-502},{-744,-500},{-739,-503},{-739,-501},{-740,-500},{-738,-499},{-738,-498},{-743,-499},{-743,-498},{-740,-498},{-740,-497},{-743,-496},{-739,-496},{-739,-497},{-737,-497},{-737,-498},{-739,-495},{-741,-495},{-740,-493},{-738,-494},{-738,-493},{-739,-492},{-740,-491},{-742,-492},{-742,-495},{-743,-494},{-744,-494},{-743,-492},{-745,-490},{-743,-489},{-744,-488},{-741,-487},{-740,-486},{-740,-485},{-739,-484},{-744,-480},{-743,-480},{-741,-482},{-736,-483},{-734,-482},{-733,-482},{-733,-480},{-736,-480},{-735,-479},{-737,-476},{-739,-478},{-747,-477},{-745,-475},{-741,-476},{-745,-474},{-740,-472},{-740,-470},{-746,-468},{-744,-469},{-747,-469},{-751,-467},{-750,-465},{-755,-467},{-754,-469},{-757,-468},{-756,-466},{-747,-462},{-747,-460},{-750,-461},{-751,-459},{-745,-459},{-744,-460},{-740,-462},{-740,-465},{-738,-466},{-733,-460},{-737,-463},{-735,-458},{-731,-457},{-732,-453},{-732,-452},{-733,-452},{-727,-447},{-726,-445},{-733,-442},{-731,-441},{-729,-438},{-731,-437},{-729,-436},{-731,-434},{-727,-429},{-728,-425},{-725,-426},{-728,-423},{-724,-425},{-724,-420},{-723,-415},{-726,-417},{-729,-415},{-737,-416},{-738,-416},{-739,-411},{-737,-400},{-735,-398},{-734,-397},{-732,-394},{-735,-387},{-735,-381},{-737,-373},{-736,-372},{-734,-373},{-732,-371},{-732,-368},{-730,-367},{-728,-360},{-726,-358},{-726,-356},{-722,-351},{-720,-341},{-716,-335},{-718,-331},{-716,-330},{-714,-324},{-717,-306},{-716,-303},{-714,-302},{-713,-299},{-715,-290},{-712,-284},{-710,-277},{-709,-276},{-708,-271},{-706,-263},{-707,-258},{-705,-254},{-706,-245},{-704,-236},{-705,-235},{-706,-235},{-706,-232},{-703,-229},{-701,-214},{-704,-183},{-699,-182},{-698,-180},{-698,-177},{-695,-175},{-693,-180},{-691,-181},{-690,-189},{-684,-194},{-687,-197},{-685,-199},{-688,-201},{-688,-204},{-684,-206},{-685,-209},{-682,-213},{-679,-228},{-672,-228},{-670,-230},{-673,-240},{-684,-245},{-686,-247},{-683,-251},{-686,-254},{-684,-262},{-686,-265},{-683,-269},{-685,-272},{-688,-271},{-691,-279},{-696,-284},{-698,-291},{-700,-293},{-699,-301},{-698,-302},{-700,-304},{-702,-303},{-703,-310},{-705,-312},{-706,-316},{-704,-318},{-702,-320},{-704,-321},{-700,-329},{-700,-333},{-699,-332},{-697,-334},{-699,-337},{-698,-342},{-700,-343},{-704,-351},{-706,-353},{-704,-353},{-703,-358},{-704,-361},{-706,-361},{-707,-364},{-710,-365},{-712,-368},{-712,-379},{-708,-386},{-714,-389},{-715,-396},{-717,-396},{-716,-399},{-718,-402},{-717,-404},{-719,-407},{-717,-421},{-720,-421},{-721,-423},{-721,-429},{-717,-432},{-719,-435},{-716,-437},{-718,-438},{-717,-439},{-718,-441},{-718,-444},{-711,-445},{-713,-448},{-721,-448},{-720,-449},{-716,-450},{-713,-453},{-718,-456},{-716,-460},{-719,-461},{-716,-467},{-719,-468},{-719,-472},{-720,-472},{-725,-477},{-723,-483},{-726,-485},{-725,-488},{-731,-491},{-743,-506},{-747,-506},{-741,-505},{-745,-506},{-749,-506},{-749,-505},{-748,-506},{-743,-503},{-746,-503},{-752,-502},{-752,-503},{-750,-502},{-749,-501},{-749,-502},{-748,-502},{-747,-503},{-749,-503},{-748,-503},{-745,-504},{-747,-494},{-749,-493},{-750,-499},{-750,-504},{-751,-504},{-750,-503},{-749,-504},{-747,-505},{-751,-505},{-750,-505},{-753,-508},{-755,-508},{-754,-507},{-755,-507},{-753,-506},{-752,-500},{-752,-499},{-745,-507},{-744,-505},{-742,-507},{-744,-507},{-752,-505},{-753,-505},{-748,-505},{-747,-504},{-752,-504},{-750,-497},{-750,-496},{-749,-496},{-749,-497},{-745,-496},{-745,-495},{-744,-495},{-749,-499},{-749,-498},{-748,-498},{-755,-497},{-756,-497},{-753,-499},{-754,-497},{-756,-499},{-744,-496},{-743,-495},{-747,-501},{-748,-501},{-750,-501},{-754,-502},{-751,-502},{-753,-501},{-754,-500},{-752,-501},{-753,-500},{-751,-500},{-750,-500},{-744,-493},{-752,-493},{-752,-492},{-751,-493},{-751,-492},{-750,-488},{-747,-487},{-747,-489},{-745,-488},{-746,-490},{-746,-497},{-744,-497},{-744,-499},{-746,-499},{-745,-500},{-746,-501},{-749,-500},{-746,-500},{-748,-499},{-746,-498},{-747,-497},{-747,-496},{-749,-495},{-746,-494},{-746,-493},{-751,-496},{-753,-497},{-752,-497},{-751,-497},{-752,-496},{-752,-495},{-755,-493},{-753,-493},{-754,-494},{-753,-494},{-751,-495},{-752,-494},{-751,-494},{-750,-494},{-750,-493},{-749,-494},{-748,-491},{-749,-490},{-747,-490},{-750,-490},{-748,-488},{-749,-488},{-750,-489},{-748,-492},{-749,-492},{-753,-491},{-752,-491},{-744,-490},{-751,-489},{-745,-489},{-750,-492},{-751,-491},{-751,-490},{-749,-491},{-753,-490},{-750,-491},{-755,-485},{-754,-486},{-753,-486},{-755,-487},{-756,-487},{-756,-486},{-757,-485},{-753,-488},{-753,-489},{-755,-489},{-757,-490},{-752,-490},{-752,-488},{-753,-487},{-751,-487},{-750,-487},{-748,-487},{-749,-487}}}, + {"America/Merida",40,{{-918,186},{-916,188},{-915,188},{-917,187},{-915,187},{-914,188},{-914,221},{-896,224},{-897,224},{-897,225},{-896,225},{-898,225},{-898,226},{-897,226},{-904,208},{-903,210},{-898,213},{-882,216},{-875,215},{-875,210},{-878,207},{-894,197},{-894,178},{-910,178},{-910,180},{-915,181},{-916,180},{-920,180},{-922,182},{-922,185},{-924,185},{-925,186},{-920,187},{-919,185},{-916,184},{-913,186},{-912,188},{-908,193},{-905,200},{-883,216}}}, + {"Africa/Nouakchott",48,{{-164,196},{-164,198},{-164,199},{-164,197},{-165,196},{-165,197},{-163,197},{-117,155},{-118,149},{-121,147},{-128,152},{-135,161},{-138,161},{-143,166},{-163,165},{-165,161},{-160,180},{-162,189},{-165,194},{-164,194},{-163,195},{-162,202},{-165,207},{-165,206},{-167,207},{-168,213},{-170,208},{-170,210},{-169,213},{-130,213},{-131,231},{-128,234},{-120,235},{-120,260},{-87,260},{-87,273},{-48,250},{-66,250},{-56,165},{-53,163},{-55,155},{-93,155},{-93,157},{-94,154},{-107,154},{-109,151},{-114,156},{-164,206}}}, + {"America/Bahia_Banderas",4,{{-1052,207},{-1053,207},{-1055,208},{-1054,209}}}, + {"Australia/Perth",455,{{1141,-225},{1141,-224},{1243,-164},{1252,-144},{1235,-141},{1142,-224},{1214,-339},{1179,-352},{1131,-251},{1131,-250},{1131,-253},{1131,-252},{1136,-249},{1131,-249},{1132,-248},{1142,-225},{1145,-221},{1143,-217},{1144,-217},{1144,-216},{1147,-216},{1152,-216},{1148,-215},{1154,-215},{1157,-322},{1155,-320},{1154,-320},{1156,-320},{1140,-289},{1140,-290},{1138,-287},{1138,-285},{1137,-285},{1137,-284},{1136,-283},{1137,-266},{1138,-266},{1137,-265},{1138,-265},{1135,-264},{1140,-259},{1241,-339},{1241,-338},{1220,-339},{1219,-339},{1228,-340},{1229,-340},{1220,-340},{1129,-257},{1130,-255},{1132,-262},{1130,-258},{1139,-253},{1138,-253},{1139,-259},{1138,-259},{1138,-258},{1139,-258},{1181,-351},{1180,-351},{1180,-350},{1184,-349},{1185,-349},{1196,-344},{1235,-344},{1236,-343},{1236,-344},{1236,-342},{1221,-342},{1220,-341},{1221,-341},{1232,-341},{1222,-342},{1222,-341},{1223,-341},{1235,-340},{1217,-340},{1218,-339},{1222,-340},{1221,-340},{1216,-340},{1232,-340},{1233,-340},{1150,-215},{1154,-214},{1155,-214},{1156,-212},{1159,-210},{1158,-210},{1162,-208},{1153,-208},{1154,-207},{1155,-207},{1154,-209},{1163,-208},{1166,-207},{1155,-208},{1153,-210},{1162,-210},{1162,-209},{1159,-209},{1161,-209},{1153,-209},{1167,-207},{1165,-207},{1164,-207},{1177,-206},{1167,-206},{1165,-205},{1166,-205},{1177,-207},{1170,-206},{1171,-206},{1166,-206},{1165,-206},{1167,-205},{1156,-207},{1156,-206},{1179,-205},{1168,-205},{1155,-204},{1188,-200},{1169,-204},{1168,-204},{1171,-205},{1171,-204},{1170,-204},{1156,-204},{1189,-199},{1235,-174},{1235,-173},{1234,-173},{1233,-171},{1238,-170},{1221,-169},{1235,-166},{1235,-172},{1236,-173},{1155,-205},{1169,-205},{1234,-166},{1233,-165},{1234,-165},{1235,-165},{1231,-164},{1232,-164},{1234,-164},{1244,-163},{1233,-163},{1236,-164},{1236,-163},{1239,-164},{1239,-163},{1247,-164},{1244,-164},{1245,-164},{1242,-164},{1237,-164},{1246,-164},{1246,-163},{1233,-164},{1241,-163},{1236,-162},{1241,-162},{1240,-162},{1235,-162},{1239,-162},{1233,-162},{1234,-162},{1234,-161},{1235,-161},{1236,-161},{1238,-162},{1238,-163},{1235,-163},{1234,-163},{1237,-163},{1235,-164},{1254,-150},{1252,-150},{1253,-149},{1251,-147},{1254,-145},{1254,-147},{1256,-146},{1256,-142},{1257,-143},{1256,-147},{1257,-144},{1259,-147},{1262,-142},{1260,-139},{1262,-140},{1262,-143},{1263,-140},{1266,-139},{1264,-141},{1266,-142},{1267,-140},{1269,-140},{1267,-138},{1270,-137},{1271,-140},{1274,-139},{1282,-147},{1281,-149},{1281,-154},{1279,-156},{1278,-156},{1279,-157},{1281,-155},{1281,-152},{1283,-153},{1283,-155},{1282,-151},{1283,-150},{1285,-151},{1284,-149},{1285,-150},{1284,-148},{1290,-149},{1290,-313},{1255,-313},{1255,-326},{1242,-330},{1240,-336},{1235,-339},{1230,-339},{1220,-338},{1214,-338},{1200,-339},{1196,-341},{1192,-345},{1189,-345},{1179,-350},{1179,-351},{1173,-350},{1175,-350},{1166,-351},{1160,-348},{1157,-345},{1150,-343},{1150,-335},{1154,-336},{1157,-333},{1157,-318},{1151,-305},{1149,-291},{1142,-281},{1140,-273},{1131,-261},{1133,-262},{1133,-260},{1133,-263},{1134,-264},{1134,-260},{1136,-266},{1136,-265},{1137,-267},{1139,-263},{1136,-261},{1134,-257},{1135,-255},{1137,-259},{1137,-262},{1141,-265},{1142,-263},{1143,-259},{1134,-244},{1134,-240},{1138,-235},{1138,-229},{1137,-226},{1139,-220},{1142,-218},{1144,-225},{1146,-218},{1155,-215},{1169,-207},{1172,-206},{1173,-208},{1182,-203},{1188,-203},{1191,-200},{1196,-201},{1210,-196},{1215,-191},{1218,-185},{1224,-181},{1224,-180},{1222,-180},{1222,-173},{1225,-169},{1226,-170},{1226,-168},{1228,-168},{1227,-167},{1229,-164},{1230,-164},{1230,-166},{1231,-167},{1236,-176},{1237,-173},{1236,-170},{1239,-173},{1239,-171},{1240,-169},{1238,-169},{1235,-167},{1236,-166},{1237,-165},{1239,-165},{1240,-164},{1244,-166},{1249,-164},{1244,-161},{1245,-162},{1246,-162},{1246,-159},{1248,-158},{1248,-157},{1245,-160},{1244,-157},{1245,-155},{1247,-155},{1247,-153},{1253,-156},{1251,-154},{1251,-153},{1249,-153},{1251,-152},{1248,-152},{1251,-150},{1252,-152},{1255,-152},{1241,-161},{1238,-161},{1233,-161},{1237,-161},{1239,-161},{1233,-160},{1235,-160},{1240,-160},{1244,-160},{1246,-160},{1245,-159},{1244,-159},{1244,-158},{1245,-158},{1242,-159},{1247,-158},{1246,-158},{1279,-155},{1280,-155},{1242,-160},{1237,-159},{1237,-160},{1231,-155},{1232,-155},{1242,-153},{1244,-153},{1248,-153},{1245,-154},{1250,-154},{1243,-154},{1244,-154},{1246,-154},{1246,-155},{1250,-153},{1243,-153},{1245,-153},{1246,-152},{1247,-154},{1246,-153},{1244,-152},{1248,-150},{1247,-150},{1247,-149},{1248,-149},{1253,-144},{1245,-152},{1250,-152},{1255,-151},{1254,-151},{1249,-150},{1253,-150},{1284,-151},{1283,-149},{1284,-150},{1249,-149},{1252,-149},{1285,-149},{1251,-148},{1250,-148},{1283,-148},{1283,-147},{1254,-146},{1255,-145},{1252,-147},{1252,-146},{1253,-146},{1255,-144},{1278,-144},{1260,-144},{1250,-144},{1250,-145},{1251,-146},{1251,-145},{1253,-145},{1252,-145},{1256,-145},{1282,-148},{1282,-149},{1281,-148},{1252,-143},{1253,-143},{1260,-142},{1277,-142},{1258,-142},{1258,-143},{1263,-142},{1262,-141},{1257,-141},{1256,-141},{1255,-141},{1264,-140},{1267,-139},{1256,-139},{1257,-139},{1256,-140},{1262,-139},{1263,-139},{1266,-140},{1271,-139},{1272,-139},{1258,-139},{1258,-138},{1261,-138},{1261,-137},{1265,-139},{1257,-142},{1256,-144},{1256,-143},{1259,-144},{1260,-143},{1254,-143},{1259,-143},{1282,-152},{1281,-151},{1281,-150},{1252,-151},{1253,-151},{1250,-151},{1250,-150},{1249,-151}}}, + {"Asia/Sakhalin",84,{{1433,517},{1412,462},{1412,463},{1446,485},{1433,516},{1432,519},{1431,521},{1432,520},{1431,520},{1440,500},{1444,490},{1447,489},{1448,487},{1440,493},{1434,493},{1430,491},{1425,478},{1430,473},{1431,469},{1435,468},{1436,464},{1434,460},{1433,465},{1428,466},{1427,468},{1424,466},{1421,459},{1418,466},{1421,471},{1420,476},{1422,480},{1418,488},{1421,495},{1420,506},{1422,511},{1419,516},{1417,517},{1418,518},{1416,519},{1416,523},{1419,531},{1418,534},{1422,535},{1422,534},{1425,534},{1427,535},{1425,537},{1428,537},{1427,538},{1426,537},{1427,539},{1423,543},{1426,542},{1427,544},{1430,541},{1428,539},{1432,533},{1433,532},{1433,529},{1431,534},{1430,533},{1431,530},{1433,528},{1433,526},{1433,524},{1432,523},{1431,524},{1432,518},{1431,518},{1430,517},{1432,515},{1433,515},{1434,516},{1434,513},{1432,524},{1432,525},{1432,531},{1417,534},{1424,536},{1423,535},{1423,536},{1425,536},{1426,543},{1425,543}}}, + {"Asia/Vladivostok",511,{{1318,431},{1410,761},{1377,544},{1375,544},{1376,546},{1377,545},{1392,546},{1393,546},{1413,534},{1412,534},{1411,534},{1398,543},{1398,544},{1378,545},{1380,545},{1378,544},{1412,528},{1411,530},{1410,530},{1408,531},{1414,533},{1413,533},{1415,533},{1409,531},{1309,425},{1314,426},{1315,427},{1315,426},{1314,427},{1323,427},{1324,428},{1324,427},{1329,428},{1314,428},{1315,428},{1317,429},{1316,429},{1315,429},{1318,429},{1317,430},{1318,430},{1352,437},{1319,431},{1319,430},{1325,428},{1324,429},{1325,429},{1380,712},{1380,713},{1381,713},{1379,713},{1376,713},{1377,713},{1376,714},{1378,714},{1371,546},{1315,450},{1319,453},{1329,450},{1331,451},{1332,455},{1335,456},{1335,459},{1339,463},{1339,465},{1342,471},{1342,473},{1348,477},{1346,480},{1347,483},{1344,484},{1335,481},{1332,481},{1327,479},{1326,477},{1310,477},{1307,481},{1308,483},{1308,485},{1305,486},{1307,489},{1314,492},{1315,496},{1314,497},{1315,499},{1313,500},{1315,501},{1313,504},{1309,504},{1310,507},{1306,507},{1308,509},{1308,510},{1313,514},{1315,513},{1314,517},{1323,518},{1326,521},{1334,523},{1332,525},{1333,527},{1346,524},{1348,526},{1347,529},{1350,533},{1346,536},{1340,534},{1336,535},{1332,533},{1319,531},{1319,532},{1314,532},{1314,538},{1304,539},{1307,543},{1311,543},{1312,546},{1324,551},{1324,552},{1326,552},{1327,554},{1330,554},{1324,557},{1309,557},{1309,559},{1311,564},{1315,566},{1317,565},{1317,567},{1318,567},{1315,571},{1311,572},{1315,572},{1317,576},{1320,576},{1315,582},{1321,580},{1320,581},{1322,582},{1321,585},{1324,585},{1326,589},{1328,589},{1328,591},{1331,592},{1335,593},{1352,591},{1358,595},{1367,593},{1375,595},{1376,597},{1383,597},{1382,605},{1384,607},{1382,609},{1383,610},{1383,611},{1395,615},{1400,620},{1403,621},{1403,624},{1406,624},{1407,626},{1413,624},{1418,620},{1422,621},{1424,619},{1430,619},{1432,621},{1436,620},{1436,619},{1439,620},{1439,618},{1442,617},{1447,620},{1455,620},{1457,621},{1466,616},{1466,614},{1468,614},{1467,610},{1465,609},{1464,607},{1461,607},{1455,605},{1458,602},{1464,603},{1468,599},{1470,599},{1471,594},{1464,595},{1463,594},{1463,592},{1460,591},{1458,592},{1460,594},{1457,594},{1432,594},{1424,592},{1415,586},{1408,583},{1405,578},{1389,571},{1386,568},{1384,568},{1381,566},{1382,564},{1352,549},{1358,546},{1368,546},{1367,539},{1368,538},{1372,538},{1373,540},{1371,541},{1372,542},{1377,543},{1373,541},{1379,540},{1372,536},{1373,535},{1380,536},{1386,540},{1386,538},{1383,535},{1385,535},{1388,540},{1387,543},{1392,542},{1397,543},{1405,536},{1408,535},{1411,535},{1409,535},{1409,534},{1414,532},{1412,530},{1407,531},{1412,529},{1413,527},{1411,524},{1415,522},{1413,521},{1414,520},{1409,516},{1407,515},{1409,514},{1406,512},{1407,510},{1404,505},{1405,501},{1407,501},{1404,499},{1405,496},{1402,490},{1404,490},{1402,484},{1393,478},{1390,473},{1386,470},{1381,462},{1359,444},{1354,438},{1351,435},{1339,429},{1330,427},{1330,428},{1329,427},{1327,429},{1323,428},{1324,432},{1323,433},{1320,431},{1321,433},{1318,433},{1312,426},{1307,427},{1307,423},{1306,426},{1304,427},{1311,429},{1313,434},{1312,436},{1313,441},{1310,449},{1365,546},{1363,546},{1363,547},{1382,547},{1383,550},{1434,564},{1384,550},{1383,551},{1384,551},{1369,549},{1382,550},{1377,546},{1375,549},{1372,548},{1376,552},{1365,549},{1365,550},{1366,549},{1527,762},{1528,762},{1529,761},{1526,761},{1404,763},{1403,763},{1374,714},{1375,714},{1368,550},{1370,551},{1372,551},{1371,549},{1367,549},{1500,752},{1510,751},{1507,749},{1490,747},{1462,752},{1465,756},{1469,753},{1476,754},{1486,754},{1486,752},{1357,754},{1355,754},{1357,759},{1362,756},{1360,754},{1399,748},{1400,748},{1420,749},{1419,750},{1417,749},{1418,749},{1416,749},{1525,757},{1375,758},{1434,758},{1433,758},{1415,760},{1415,761},{1492,766},{1491,767},{1485,766},{1495,768},{1581,767},{1582,767},{1566,770},{1565,770},{1568,770},{1567,770},{1391,761},{1411,761},{1407,739},{1408,739},{1398,734},{1406,735},{1412,739},{1421,739},{1434,736},{1436,732},{1357,741},{1355,742},{1363,739},{1362,739},{1403,742},{1409,743},{1411,742},{1410,740},{1406,739},{1402,741},{1318,710},{1323,717},{1327,719},{1330,720},{1332,720},{1334,719},{1330,719},{1328,718},{1341,714},{1359,716},{1382,712},{1382,716},{1389,716},{1392,714},{1399,714},{1401,715},{1398,717},{1398,719},{1394,719},{1403,722},{1394,721},{1392,723},{1396,725},{1413,726},{1408,729},{1474,723},{1469,722},{1435,721},{1426,715},{1425,713},{1426,711},{1411,703},{1409,700},{1418,698},{1423,698},{1421,696},{1425,696},{1424,695},{1428,692},{1415,692},{1420,688},{1420,686},{1410,684},{1412,682},{1413,679},{1402,677},{1389,672},{1405,666},{1404,664},{1400,665},{1396,663},{1402,658},{1371,662},{1360,661},{1356,658},{1348,657},{1343,654},{1329,651},{1328,649},{1331,646},{1329,646},{1322,646},{1323,649},{1316,654},{1316,657},{1301,662},{1300,665},{1319,670},{1331,680},{1331,684},{1327,689},{1322,690},{1335,697},{1330,700},{1332,702},{1331,703},{1321,704},{1320,708},{1322,709},{1390,762},{1406,757},{1411,756},{1409,758},{1417,760},{1414,762},{1426,759},{1439,758},{1454,755},{1449,754},{1450,753},{1444,751},{1435,751},{1437,750},{1436,749},{1425,748},{1424,749},{1423,750},{1401,748},{1397,750},{1395,749},{1397,749},{1392,746},{1382,748},{1370,753},{1373,755},{1373,756},{1370,756},{1372,757},{1376,758},{1375,759},{1414,761},{1409,761},{1372,714},{1371,715},{1373,714},{1373,715},{1374,715},{1375,715},{1372,715},{1370,715},{1369,715},{1366,715},{1366,716},{1352,716},{1354,716},{1353,716},{1387,716},{1385,717},{1389,717},{1384,717},{1383,717},{1381,716},{1380,715},{1329,719},{1384,718},{1385,719},{1386,719}}}, + {"America/Detroit",128,{{-850,458},{-848,417},{-868,418},{-862,426},{-865,436},{-864,438},{-865,441},{-862,444},{-862,447},{-855,452},{-856,448},{-855,450},{-854,449},{-854,448},{-853,448},{-854,453},{-850,452},{-853,453},{-849,454},{-851,456},{-847,458},{-835,454},{-833,450},{-836,451},{-833,449},{-833,443},{-839,439},{-840,434},{-838,437},{-837,436},{-834,439},{-829,441},{-826,438},{-824,430},{-825,426},{-831,423},{-833,419},{-835,419},{-834,417},{-832,420},{-835,438},{-834,438},{-834,440},{-861,450},{-832,450},{-833,451},{-860,451},{-861,451},{-860,452},{-833,452},{-858,454},{-859,454},{-858,455},{-868,455},{-867,455},{-876,474},{-866,455},{-867,456},{-866,456},{-858,457},{-851,458},{-857,457},{-856,457},{-886,472},{-882,474},{-877,474},{-880,474},{-884,470},{-884,472},{-885,471},{-888,479},{-892,479},{-893,479},{-884,482},{-883,482},{-886,481},{-892,478},{-887,481},{-886,482},{-849,458},{-849,459},{-846,458},{-846,459},{-843,460},{-843,459},{-844,460},{-846,460},{-844,459},{-856,456},{-855,458},{-855,456},{-844,457},{-845,457},{-844,458},{-854,458},{-853,458},{-899,468},{-893,468},{-885,467},{-881,470},{-882,469},{-883,468},{-878,469},{-874,465},{-866,464},{-862,467},{-849,468},{-850,465},{-841,465},{-839,461},{-834,460},{-847,460},{-848,458},{-855,461},{-863,459},{-867,457},{-865,459},{-870,457},{-870,459},{-873,455},{-873,459},{-876,460},{-876,462},{-881,462},{-881,464},{-894,463},{-894,465},{-897,465}}}, + {"Asia/Qatar",19,{{516,253},{513,246},{509,255},{516,254},{524,257},{512,262},{513,262},{513,261},{516,258},{516,257},{516,252},{514,246},{509,245},{508,255},{509,256},{510,260},{512,261},{516,259},{515,255}}}, + {"Africa/Bissau",92,{{-152,109},{-165,113},{-164,113},{-159,113},{-157,110},{-156,110},{-152,111},{-161,111},{-162,110},{-163,111},{-161,112},{-159,112},{-158,112},{-158,113},{-157,113},{-157,112},{-160,110},{-160,111},{-153,110},{-152,110},{-156,111},{-160,112},{-159,111},{-162,113},{-162,112},{-163,112},{-160,119},{-161,118},{-162,118},{-162,119},{-159,118},{-163,119},{-163,120},{-154,118},{-155,119},{-154,119},{-160,118},{-156,118},{-156,119},{-159,119},{-162,114},{-158,114},{-159,114},{-163,114},{-160,114},{-161,114},{-144,115},{-147,115},{-150,110},{-151,109},{-150,112},{-154,112},{-154,114},{-155,113},{-153,116},{-151,115},{-150,116},{-152,117},{-152,118},{-154,115},{-154,117},{-156,117},{-150,120},{-160,117},{-161,119},{-164,121},{-161,123},{-165,122},{-167,123},{-157,124},{-152,127},{-137,127},{-137,123},{-140,122},{-137,120},{-137,117},{-161,113},{-160,113},{-157,114},{-157,115},{-163,115},{-162,115},{-161,115},{-160,115},{-159,115},{-164,115},{-163,116},{-155,116},{-156,115},{-156,116},{-159,116},{-160,116}}}, + {"America/Los_Angeles",210,{{-1224,379},{-1223,379},{-1227,486},{-1229,487},{-1229,488},{-1224,378},{-1186,330},{-1183,328},{-1185,329},{-1194,332},{-1195,332},{-1196,333},{-1195,333},{-1186,335},{-1184,334},{-1183,333},{-1185,333},{-1190,335},{-1204,340},{-1205,340},{-1204,341},{-1203,340},{-1200,339},{-1201,339},{-1202,340},{-1200,340},{-1194,340},{-1197,340},{-1195,340},{-1198,340},{-1199,341},{-1241,469},{-1241,470},{-1239,470},{-1229,472},{-1228,473},{-1228,472},{-1226,471},{-1226,472},{-1227,472},{-1227,471},{-1240,466},{-1239,465},{-1239,464},{-1240,464},{-1240,465},{-1227,473},{-1226,473},{-1225,473},{-1225,474},{-1225,475},{-1224,474},{-1222,475},{-1223,476},{-1222,476},{-1226,477},{-1225,477},{-1225,476},{-1226,476},{-1224,476},{-1223,480},{-1229,481},{-1225,485},{-1225,484},{-1227,481},{-1227,480},{-1224,481},{-1225,481},{-1225,482},{-1224,482},{-1226,480},{-1228,482},{-1226,484},{-1225,483},{-1227,482},{-1224,480},{-1227,485},{-1232,486},{-1228,486},{-1226,486},{-1230,486},{-1230,488},{-1226,485},{-1227,484},{-1228,484},{-1229,485},{-1229,486},{-1228,485},{-1226,487},{-1231,485},{-1232,485},{-1231,486},{-1230,485},{-1231,490},{-1230,490},{-1228,487},{-1232,487},{-1227,487},{-1230,487},{-1231,487},{-1145,456},{-1148,454},{-1152,456},{-1155,454},{-1163,454},{-1163,459},{-1166,460},{-1168,458},{-1165,456},{-1172,445},{-1172,443},{-1180,444},{-1182,443},{-1182,424},{-1170,425},{-1170,420},{-1140,420},{-1140,362},{-1142,360},{-1144,361},{-1148,361},{-1146,349},{-1141,343},{-1144,341},{-1145,336},{-1147,334},{-1147,331},{-1145,328},{-1171,325},{-1175,333},{-1181,337},{-1184,337},{-1185,340},{-1191,341},{-1196,344},{-1206,346},{-1206,351},{-1219,363},{-1219,369},{-1224,372},{-1225,378},{-1221,375},{-1224,380},{-1223,381},{-1225,381},{-1230,380},{-1230,383},{-1237,389},{-1239,398},{-1244,404},{-1241,409},{-1241,415},{-1246,428},{-1241,440},{-1239,454},{-1240,462},{-1239,462},{-1235,463},{-1241,463},{-1241,466},{-1238,464},{-1238,467},{-1241,467},{-1240,468},{-1237,470},{-1242,469},{-1247,484},{-1240,482},{-1231,482},{-1229,480},{-1228,481},{-1226,479},{-1227,478},{-1228,477},{-1229,478},{-1232,474},{-1230,473},{-1229,474},{-1231,474},{-1226,478},{-1225,478},{-1227,477},{-1227,475},{-1226,474},{-1228,474},{-1231,472},{-1231,471},{-1229,470},{-1229,471},{-1223,473},{-1224,477},{-1223,475},{-1223,478},{-1222,480},{-1224,486},{-1225,488},{-1228,490},{-1161,490},{-1160,480},{-1157,477},{-1156,475},{-1158,474},{-1153,473},{-1148,467},{-1143,466},{-1237,462},{-1236,462},{-1237,463},{-1240,463},{-1235,462}}}, + {"America/Godthab",2299,{{-534,685},{-533,685},{-526,685},{-525,685},{-536,685},{-535,685},{-529,685},{-637,761},{-636,761},{-560,726},{-228,727},{-229,727},{-267,815},{-266,815},{-610,761},{-611,761},{-524,686},{-524,687},{-531,686},{-530,687},{-533,655},{-436,598},{-435,598},{-436,599},{-435,599},{-437,599},{-433,599},{-446,599},{-446,600},{-511,687},{-513,687},{-512,687},{-514,686},{-439,598},{-441,599},{-440,600},{-226,699},{-533,690},{-512,689},{-513,689},{-534,690},{-535,690},{-232,697},{-233,696},{-236,697},{-233,698},{-512,690},{-510,693},{-510,694},{-509,694},{-541,695},{-542,695},{-544,695},{-506,696},{-507,696},{-529,688},{-530,688},{-527,688},{-526,688},{-513,688},{-518,688},{-519,688},{-520,688},{-520,689},{-519,689},{-535,686},{-518,686},{-519,686},{-531,687},{-522,687},{-514,687},{-515,687},{-529,687},{-528,687},{-527,687},{-511,686},{-512,686},{-532,686},{-528,686},{-527,686},{-520,687},{-525,687},{-526,687},{-523,687},{-550,705},{-547,704},{-550,704},{-254,711},{-253,711},{-249,713},{-252,712},{-253,712},{-252,713},{-256,711},{-255,711},{-254,712},{-521,707},{-522,707},{-278,707},{-277,707},{-516,708},{-514,708},{-513,708},{-523,709},{-522,710},{-523,710},{-275,709},{-273,709},{-278,708},{-277,709},{-519,709},{-522,709},{-516,709},{-517,708},{-254,710},{-255,710},{-256,710},{-257,711},{-253,710},{-513,698},{-505,698},{-506,699},{-504,699},{-507,699},{-508,699},{-509,699},{-507,700},{-514,706},{-514,707},{-529,700},{-520,698},{-520,697},{-518,696},{-536,692},{-543,694},{-534,694},{-536,695},{-534,696},{-538,695},{-540,695},{-540,696},{-550,697},{-544,697},{-549,698},{-548,700},{-542,699},{-548,701},{-548,702},{-544,703},{-533,702},{-512,699},{-510,699},{-512,695},{-514,697},{-514,699},{-513,700},{-512,700},{-515,699},{-515,705},{-517,705},{-516,705},{-513,705},{-517,706},{-516,706},{-282,705},{-281,705},{-262,705},{-263,705},{-264,705},{-261,705},{-515,706},{-519,706},{-519,707},{-518,707},{-257,710},{-254,709},{-253,708},{-255,708},{-253,707},{-271,709},{-300,682},{-299,682},{-297,682},{-298,681},{-537,683},{-534,683},{-535,683},{-536,683},{-531,683},{-534,684},{-532,683},{-532,684},{-531,685},{-532,685},{-527,685},{-528,685},{-529,686},{-535,684},{-536,684},{-533,684},{-530,685},{-516,685},{-518,685},{-533,686},{-517,686},{-515,685},{-515,686},{-525,686},{-526,686},{-519,687},{-521,686},{-521,687},{-523,686},{-583,750},{-583,751},{-582,751},{-582,748},{-581,748},{-663,791},{-664,792},{-663,792},{-659,792},{-633,763},{-632,763},{-631,763},{-662,791},{-661,791},{-637,762},{-623,762},{-622,762},{-621,762},{-620,762},{-626,762},{-627,762},{-625,762},{-600,758},{-601,758},{-595,758},{-594,758},{-599,759},{-598,759},{-611,760},{-612,760},{-610,760},{-617,760},{-618,760},{-617,761},{-615,761},{-615,762},{-614,761},{-616,761},{-616,762},{-623,760},{-624,760},{-624,761},{-623,761},{-609,761},{-612,761},{-613,761},{-620,761},{-621,761},{-619,762},{-618,762},{-619,761},{-671,805},{-672,805},{-670,805},{-666,806},{-668,807},{-664,806},{-666,808},{-667,808},{-635,811},{-634,811},{-630,812},{-631,813},{-630,813},{-614,813},{-613,813},{-585,817},{-583,817},{-584,817},{-237,817},{-238,818},{-236,818},{-324,818},{-325,818},{-323,818},{-445,818},{-445,819},{-444,819},{-197,817},{-196,817},{-198,817},{-180,819},{-179,819},{-190,820},{-186,818},{-191,818},{-196,821},{-178,819},{-182,821},{-177,819},{-533,823},{-528,823},{-512,820},{-532,821},{-534,822},{-523,823},{-520,823},{-518,822},{-522,822},{-514,823},{-489,826},{-484,825},{-481,825},{-483,824},{-403,826},{-404,826},{-405,826},{-223,828},{-224,828},{-222,828},{-500,828},{-499,828},{-498,828},{-502,828},{-236,828},{-237,829},{-475,828},{-474,828},{-483,829},{-476,828},{-485,829},{-406,827},{-407,827},{-476,826},{-477,826},{-462,827},{-444,824},{-451,822},{-447,821},{-450,821},{-402,827},{-403,827},{-405,827},{-442,832},{-439,832},{-440,832},{-332,831},{-333,831},{-437,833},{-434,833},{-435,832},{-425,832},{-424,833},{-420,833},{-421,832},{-417,833},{-418,833},{-413,833},{-412,833},{-393,834},{-389,833},{-397,833},{-395,834},{-406,832},{-401,832},{-402,832},{-400,830},{-406,830},{-415,832},{-399,830},{-400,832},{-394,831},{-393,831},{-406,831},{-386,831},{-387,832},{-381,832},{-382,831},{-416,832},{-417,832},{-410,832},{-413,832},{-390,832},{-389,832},{-401,833},{-407,833},{-404,834},{-287,834},{-287,835},{-286,835},{-286,834},{-243,829},{-474,829},{-470,829},{-464,828},{-468,828},{-242,829},{-534,717},{-533,717},{-528,717},{-532,715},{-457,829},{-462,829},{-470,830},{-460,829},{-468,830},{-460,831},{-449,829},{-602,755},{-586,755},{-587,755},{-583,755},{-585,755},{-587,756},{-586,756},{-585,756},{-593,757},{-592,757},{-598,758},{-602,758},{-539,712},{-536,713},{-534,711},{-537,710},{-532,713},{-524,714},{-523,713},{-530,712},{-250,713},{-518,713},{-538,714},{-539,714},{-531,714},{-531,715},{-529,715},{-530,715},{-540,717},{-535,717},{-561,730},{-554,719},{-556,718},{-558,719},{-555,719},{-560,723},{-559,723},{-560,722},{-248,724},{-248,725},{-557,724},{-558,725},{-557,725},{-241,725},{-246,725},{-247,725},{-224,724},{-223,724},{-559,721},{-560,721},{-557,721},{-558,721},{-551,723},{-550,723},{-554,724},{-555,723},{-561,722},{-558,722},{-559,722},{-550,724},{-554,722},{-557,722},{-554,723},{-556,723},{-555,724},{-556,724},{-252,724},{-561,726},{-217,727},{-217,726},{-562,726},{-246,726},{-556,725},{-561,725},{-550,725},{-550,726},{-549,726},{-548,726},{-553,725},{-554,726},{-557,726},{-558,726},{-559,726},{-553,726},{-552,726},{-551,726},{-550,727},{-564,729},{-557,729},{-556,729},{-565,730},{-562,729},{-563,729},{-549,729},{-549,730},{-548,729},{-559,729},{-561,729},{-550,729},{-560,729},{-559,730},{-558,729},{-249,730},{-557,730},{-248,730},{-249,729},{-250,730},{-563,730},{-564,730},{-562,730},{-556,730},{-564,727},{-563,727},{-562,728},{-561,728},{-562,727},{-226,724},{-220,723},{-224,721},{-240,725},{-244,726},{-245,728},{-232,728},{-219,725},{-228,724},{-224,727},{-225,727},{-552,727},{-549,727},{-552,728},{-549,728},{-230,727},{-230,728},{-229,728},{-556,728},{-557,728},{-561,727},{-558,727},{-555,728},{-560,728},{-559,728},{-558,728},{-228,728},{-547,728},{-553,728},{-553,729},{-548,728},{-250,729},{-248,729},{-249,728},{-254,728},{-563,733},{-562,734},{-562,733},{-555,729},{-554,729},{-232,732},{-231,732},{-564,732},{-563,732},{-562,732},{-557,732},{-558,732},{-556,732},{-556,733},{-555,732},{-561,733},{-557,733},{-558,733},{-555,733},{-564,733},{-558,734},{-559,733},{-565,735},{-566,735},{-561,735},{-562,735},{-203,736},{-204,736},{-570,736},{-571,736},{-565,737},{-566,737},{-562,738},{-562,737},{-564,738},{-563,738},{-565,736},{-569,737},{-570,737},{-563,737},{-569,736},{-247,736},{-248,736},{-567,736},{-564,735},{-567,735},{-566,736},{-560,736},{-559,735},{-561,736},{-568,736},{-558,735},{-560,735},{-563,734},{-191,815},{-192,815},{-562,736},{-568,738},{-200,739},{-201,739},{-203,739},{-202,739},{-561,739},{-562,739},{-568,739},{-569,739},{-567,739},{-563,739},{-564,739},{-561,740},{-560,739},{-561,738},{-570,738},{-569,738},{-567,738},{-566,738},{-566,739},{-559,738},{-566,734},{-564,734},{-563,735},{-575,748},{-574,748},{-556,734},{-553,734},{-560,734},{-561,734},{-557,735},{-555,735},{-568,741},{-569,741},{-567,741},{-566,741},{-571,742},{-570,742},{-570,743},{-572,745},{-573,745},{-569,744},{-568,744},{-573,744},{-574,744},{-572,744},{-570,744},{-571,744},{-571,745},{-188,745},{-187,745},{-565,745},{-564,745},{-563,745},{-574,745},{-574,746},{-449,600},{-448,600},{-452,600},{-568,746},{-575,745},{-578,746},{-572,746},{-571,746},{-192,746},{-189,747},{-187,746},{-569,746},{-570,746},{-574,749},{-575,749},{-580,749},{-581,749},{-209,751},{-210,751},{-581,751},{-581,750},{-183,746},{-185,746},{-186,747},{-183,747},{-577,747},{-578,747},{-572,747},{-571,747},{-574,747},{-575,747},{-576,748},{-200,750},{-202,749},{-197,749},{-201,747},{-207,748},{-205,750},{-209,740},{-210,740},{-578,740},{-570,740},{-569,740},{-568,740},{-211,740},{-212,740},{-566,740},{-567,740},{-565,740},{-579,740},{-208,740},{-208,741},{-213,731},{-212,731},{-215,731},{-225,731},{-226,731},{-561,731},{-560,731},{-230,731},{-231,731},{-227,731},{-558,731},{-559,731},{-562,731},{-456,604},{-553,730},{-552,730},{-551,730},{-555,730},{-554,730},{-237,730},{-220,729},{-219,729},{-222,728},{-219,727},{-246,730},{-555,731},{-559,732},{-560,732},{-561,732},{-175,816},{-173,816},{-182,817},{-178,817},{-250,733},{-238,732},{-229,732},{-244,730},{-257,732},{-248,734},{-236,732},{-242,733},{-245,733},{-249,733},{-252,733},{-180,796},{-181,796},{-200,798},{-196,800},{-197,800},{-194,802},{-187,801},{-133,805},{-133,806},{-135,806},{-134,806},{-167,806},{-168,806},{-169,806},{-222,810},{-223,810},{-221,810},{-194,814},{-193,814},{-192,814},{-578,816},{-577,816},{-200,816},{-199,816},{-201,816},{-198,816},{-199,817},{-192,816},{-579,816},{-580,816},{-265,815},{-264,815},{-183,750},{-189,750},{-189,753},{-180,754},{-178,753},{-182,752},{-173,751},{-176,749},{-432,600},{-431,600},{-431,601},{-431,602},{-430,602},{-430,601},{-453,601},{-452,601},{-451,601},{-450,601},{-451,600},{-450,600},{-453,600},{-443,600},{-444,599},{-445,600},{-445,599},{-435,600},{-444,600},{-444,601},{-442,600},{-441,600},{-443,601},{-449,601},{-432,602},{-455,603},{-452,602},{-431,603},{-432,604},{-457,604},{-454,603},{-455,604},{-433,604},{-432,603},{-434,604},{-431,605},{-454,605},{-453,605},{-432,605},{-462,605},{-459,605},{-457,605},{-458,605},{-458,604},{-450,604},{-450,603},{-451,603},{-451,604},{-452,604},{-453,604},{-454,604},{-453,602},{-433,600},{-434,601},{-434,600},{-435,601},{-437,601},{-441,601},{-452,603},{-454,602},{-486,610},{-486,611},{-461,606},{-462,606},{-458,606},{-458,607},{-428,607},{-427,607},{-465,606},{-465,607},{-460,606},{-459,607},{-477,607},{-469,607},{-468,607},{-463,607},{-462,607},{-467,607},{-479,607},{-466,607},{-460,607},{-477,608},{-476,607},{-466,608},{-465,608},{-527,655},{-464,607},{-481,608},{-478,608},{-483,608},{-459,608},{-460,608},{-474,608},{-473,608},{-470,608},{-472,608},{-469,608},{-463,608},{-462,608},{-476,608},{-471,608},{-464,608},{-475,608},{-460,605},{-484,609},{-427,609},{-463,610},{-427,610},{-480,610},{-480,611},{-481,611},{-482,611},{-485,611},{-487,612},{-488,612},{-484,612},{-483,612},{-483,611},{-482,610},{-481,610},{-485,610},{-484,610},{-484,611},{-425,613},{-488,613},{-489,613},{-489,612},{-490,612},{-487,613},{-486,612},{-486,613},{-426,613},{-491,614},{-425,615},{-426,615},{-491,615},{-492,615},{-423,615},{-485,613},{-488,614},{-489,614},{-464,609},{-464,610},{-478,610},{-479,610},{-423,616},{-423,617},{-422,616},{-493,617},{-493,616},{-424,617},{-494,617},{-495,617},{-491,616},{-492,616},{-492,617},{-491,617},{-422,618},{-495,618},{-494,618},{-495,619},{-495,620},{-496,620},{-423,620},{-422,621},{-421,621},{-498,621},{-497,621},{-497,620},{-496,619},{-497,619},{-494,619},{-496,618},{-493,618},{-427,626},{-426,626},{-420,627},{-419,627},{-504,627},{-504,626},{-422,619},{-421,619},{-421,618},{-499,622},{-497,622},{-496,622},{-498,622},{-421,623},{-422,623},{-499,623},{-500,623},{-422,624},{-426,624},{-427,624},{-425,624},{-422,626},{-421,625},{-422,625},{-423,626},{-426,623},{-425,623},{-422,627},{-423,627},{-421,626},{-503,626},{-503,627},{-502,627},{-505,627},{-425,626},{-424,626},{-426,627},{-422,615},{-493,615},{-424,616},{-473,609},{-472,609},{-462,609},{-512,633},{-511,633},{-471,609},{-481,609},{-480,609},{-474,609},{-428,608},{-430,609},{-426,609},{-461,609},{-470,609},{-466,609},{-465,609},{-465,610},{-504,628},{-504,629},{-508,630},{-507,630},{-416,630},{-417,630},{-417,628},{-417,629},{-416,629},{-506,629},{-505,629},{-418,629},{-517,641},{-415,630},{-511,631},{-507,632},{-507,631},{-506,632},{-409,634},{-410,634},{-514,634},{-514,635},{-515,635},{-407,636},{-407,635},{-513,635},{-513,634},{-410,635},{-409,635},{-512,635},{-511,632},{-512,632},{-411,633},{-410,633},{-412,632},{-503,632},{-411,634},{-413,633},{-411,632},{-419,634},{-417,635},{-510,631},{-509,631},{-508,631},{-415,631},{-414,631},{-413,631},{-416,631},{-518,641},{-505,631},{-506,631},{-413,632},{-412,631},{-415,632},{-406,636},{-412,637},{-406,637},{-406,638},{-405,638},{-405,637},{-517,638},{-516,638},{-518,638},{-515,639},{-517,639},{-517,640},{-518,639},{-519,640},{-516,639},{-522,640},{-521,640},{-516,640},{-516,641},{-519,641},{-518,640},{-521,642},{-520,642},{-521,641},{-520,641},{-403,643},{-403,644},{-402,644},{-404,644},{-404,643},{-521,644},{-406,642},{-407,642},{-516,643},{-516,644},{-515,644},{-522,643},{-521,643},{-411,643},{-412,643},{-517,643},{-411,642},{-412,642},{-413,643},{-414,643},{-514,643},{-516,642},{-513,643},{-520,643},{-523,650},{-409,643},{-407,644},{-407,643},{-522,644},{-519,642},{-408,643},{-410,643},{-521,646},{-508,647},{-404,646},{-522,648},{-512,647},{-511,648},{-520,648},{-520,647},{-404,648},{-524,650},{-399,649},{-399,650},{-398,650},{-390,655},{-389,655},{-522,650},{-521,650},{-401,650},{-402,650},{-404,649},{-405,650},{-517,650},{-516,650},{-400,650},{-522,649},{-405,649},{-515,649},{-518,649},{-525,651},{-524,651},{-399,651},{-398,651},{-400,651},{-523,651},{-525,650},{-404,650},{-392,655},{-406,650},{-406,651},{-405,651},{-522,645},{-521,645},{-513,645},{-511,646},{-513,644},{-508,645},{-511,642},{-513,642},{-510,645},{-507,645},{-511,645},{-408,649},{-405,648},{-406,647},{-405,646},{-405,645},{-515,636},{-514,636},{-408,636},{-409,636},{-397,652},{-396,652},{-524,652},{-525,652},{-526,652},{-395,652},{-395,653},{-394,652},{-528,653},{-526,653},{-523,653},{-522,653},{-397,653},{-398,653},{-524,653},{-523,652},{-528,654},{-529,654},{-525,654},{-527,654},{-399,653},{-398,654},{-396,653},{-527,653},{-526,655},{-532,655},{-531,655},{-528,655},{-529,655},{-391,655},{-532,654},{-393,655},{-394,655},{-526,654},{-396,654},{-397,654},{-393,654},{-507,657},{-369,657},{-368,657},{-367,657},{-532,657},{-533,657},{-362,657},{-363,657},{-508,657},{-370,657},{-373,657},{-371,657},{-371,658},{-532,658},{-362,658},{-509,657},{-367,658},{-363,658},{-370,658},{-366,658},{-534,658},{-533,659},{-533,658},{-534,659},{-365,658},{-364,658},{-369,658},{-368,659},{-536,662},{-362,659},{-531,659},{-531,658},{-379,658},{-381,658},{-382,658},{-382,659},{-381,659},{-379,659},{-372,655},{-372,656},{-370,655},{-371,655},{-378,655},{-378,656},{-367,656},{-369,656},{-370,656},{-386,656},{-385,656},{-373,656},{-380,656},{-368,656},{-388,656},{-388,655},{-396,655},{-397,655},{-529,656},{-376,662},{-358,660},{-357,660},{-359,660},{-535,660},{-531,656},{-530,657},{-528,656},{-532,656},{-392,657},{-393,657},{-372,657},{-535,659},{-534,660},{-359,659},{-360,659},{-360,660},{-356,660},{-539,661},{-355,661},{-356,661},{-537,661},{-357,661},{-537,662},{-349,663},{-350,663},{-354,662},{-356,662},{-355,662},{-536,661},{-534,661},{-536,660},{-537,663},{-538,663},{-537,664},{-537,665},{-535,665},{-536,665},{-536,666},{-534,667},{-535,666},{-536,667},{-534,668},{-535,667},{-533,667},{-338,668},{-535,668},{-528,668},{-538,669},{-336,669},{-336,670},{-539,670},{-536,668},{-339,668},{-340,668},{-339,669},{-534,669},{-535,669},{-536,669},{-340,669},{-338,669},{-529,668},{-530,668},{-531,668},{-529,669},{-532,668},{-337,670},{-335,671},{-334,671},{-540,671},{-334,672},{-333,672},{-335,672},{-336,671},{-333,673},{-333,674},{-332,674},{-325,676},{-329,676},{-328,677},{-328,676},{-332,672},{-332,673},{-334,673},{-530,677},{-322,678},{-323,678},{-326,678},{-325,678},{-521,677},{-538,678},{-539,678},{-536,679},{-534,679},{-535,679},{-513,678},{-501,677},{-500,677},{-538,677},{-537,677},{-537,678},{-536,677},{-536,680},{-320,680},{-534,680},{-533,680},{-535,680},{-538,681},{-317,681},{-318,681},{-537,682},{-538,682},{-515,682},{-516,682},{-537,681},{-526,679},{-512,679},{-511,680},{-519,681},{-514,682},{-512,681},{-520,681},{-533,681},{-516,681},{-522,681},{-520,682},{-519,682},{-523,682},{-516,683},{-515,683},{-531,681},{-535,681},{-536,681},{-532,681},{-537,680},{-538,680},{-532,680},{-538,679},{-364,659},{-365,659},{-369,659},{-375,657},{-380,657},{-377,659},{-373,658},{-375,658},{-380,659},{-384,659},{-396,651},{-522,652},{-397,651},{-398,652},{-399,652},{-418,628},{-501,628},{-501,627},{-505,628},{-425,627},{-424,628},{-423,628},{-420,628},{-535,682},{-536,682},{-318,682},{-320,682},{-317,682},{-529,682},{-528,682},{-512,682},{-513,682},{-527,682},{-526,682},{-533,682},{-534,682},{-530,682},{-525,682},{-532,682},{-531,682},{-530,683},{-533,683},{-449,602},{-448,602},{-445,605},{-445,606},{-449,603},{-448,605},{-450,605},{-446,607},{-451,607},{-455,605},{-453,606},{-453,607},{-452,607},{-452,608},{-454,607},{-456,605},{-456,606},{-453,609},{-454,610},{-457,608},{-455,610},{-453,611},{-452,612},{-454,611},{-455,612},{-456,610},{-456,611},{-459,612},{-457,613},{-458,613},{-461,612},{-458,611},{-469,609},{-467,609},{-470,610},{-479,609},{-482,608},{-477,610},{-479,612},{-482,612},{-479,613},{-485,612},{-484,613},{-485,614},{-483,613},{-483,614},{-483,615},{-485,615},{-483,616},{-490,614},{-489,615},{-486,616},{-489,618},{-488,620},{-492,619},{-488,621},{-491,621},{-490,622},{-492,620},{-495,621},{-493,621},{-494,622},{-493,622},{-493,623},{-499,624},{-496,624},{-498,624},{-498,625},{-503,625},{-499,628},{-502,629},{-497,630},{-502,630},{-506,630},{-505,630},{-501,632},{-510,632},{-502,634},{-511,634},{-510,634},{-510,635},{-512,634},{-508,635},{-511,635},{-511,636},{-506,636},{-505,636},{-511,637},{-512,636},{-513,636},{-515,637},{-513,637},{-516,637},{-513,638},{-514,638},{-512,638},{-509,639},{-514,640},{-505,642},{-514,641},{-518,642},{-509,642},{-508,642},{-511,643},{-509,644},{-504,644},{-502,644},{-509,646},{-505,647},{-501,645},{-496,643},{-501,646},{-500,647},{-502,647},{-501,648},{-506,648},{-507,650},{-509,651},{-507,652},{-510,652},{-506,647},{-512,646},{-510,648},{-512,648},{-521,647},{-516,648},{-516,649},{-513,650},{-517,649},{-519,649},{-520,650},{-520,652},{-520,653},{-514,656},{-519,656},{-517,657},{-513,658},{-506,657},{-512,658},{-520,657},{-519,655},{-524,655},{-525,657},{-526,657},{-527,658},{-528,657},{-527,659},{-523,658},{-520,660},{-517,659},{-519,660},{-517,661},{-522,660},{-523,659},{-526,660},{-529,660},{-513,668},{-503,668},{-509,669},{-507,670},{-509,670},{-531,662},{-531,663},{-530,664},{-532,665},{-529,666},{-525,665},{-524,665},{-528,666},{-533,665},{-526,667},{-530,667},{-532,667},{-528,667},{-527,668},{-524,668},{-522,668},{-525,669},{-523,669},{-524,670},{-537,669},{-532,670},{-538,670},{-534,671},{-539,672},{-521,674},{-521,673},{-515,673},{-513,672},{-512,671},{-504,672},{-516,674},{-511,674},{-532,673},{-538,672},{-538,674},{-525,677},{-529,677},{-528,678},{-524,678},{-518,676},{-513,677},{-508,675},{-502,675},{-501,675},{-509,676},{-499,677},{-510,677},{-502,679},{-508,679},{-510,678},{-506,678},{-512,678},{-514,679},{-510,679},{-510,680},{-516,679},{-517,677},{-516,680},{-530,678},{-538,675},{-535,677},{-529,680},{-522,679},{-521,679},{-521,680},{-506,679},{-501,679},{-510,682},{-512,683},{-512,684},{-508,685},{-517,684},{-525,683},{-529,683},{-526,684},{-527,684},{-528,684},{-510,686},{-507,688},{-509,689},{-511,691},{-502,690},{-507,691},{-501,692},{-505,692},{-504,693},{-511,692},{-509,693},{-509,695},{-505,694},{-502,695},{-508,695},{-508,696},{-504,696},{-508,697},{-502,698},{-503,700},{-523,701},{-546,707},{-541,708},{-530,708},{-506,703},{-507,704},{-505,705},{-508,704},{-509,705},{-508,705},{-510,706},{-507,706},{-515,707},{-507,707},{-509,709},{-520,710},{-512,710},{-509,710},{-523,711},{-515,713},{-526,712},{-523,714},{-514,715},{-529,714},{-517,717},{-527,720},{-534,718},{-533,719},{-535,720},{-539,718},{-537,716},{-541,717},{-539,716},{-555,714},{-557,716},{-556,717},{-559,717},{-546,720},{-556,720},{-549,723},{-548,725},{-547,727},{-551,727},{-546,728},{-548,730},{-557,731},{-551,732},{-551,734},{-561,737},{-558,738},{-556,739},{-564,741},{-561,743},{-573,741},{-563,743},{-567,744},{-561,744},{-568,745},{-562,745},{-570,747},{-572,748},{-568,748},{-570,749},{-579,752},{-584,753},{-584,754},{-587,754},{-581,755},{-586,757},{-584,757},{-591,757},{-592,759},{-596,759},{-622,763},{-634,764},{-638,762},{-664,791},{-649,795},{-648,796},{-651,797},{-649,798},{-651,798},{-649,799},{-651,800},{-636,801},{-640,801},{-639,803},{-641,803},{-644,801},{-670,800},{-674,802},{-674,803},{-659,807},{-652,806},{-656,807},{-636,811},{-627,807},{-633,811},{-611,811},{-609,812},{-608,815},{-614,817},{-608,819},{-590,819},{-587,817},{-565,813},{-595,820},{-586,821},{-559,823},{-551,821},{-556,823},{-545,824},{-536,821},{-535,819},{-539,817},{-537,815},{-535,815},{-536,817},{-530,818},{-529,820},{-501,816},{-496,816},{-511,819},{-495,819},{-508,822},{-512,825},{-499,825},{-464,821},{-461,819},{-452,818},{-447,818},{-442,818},{-450,820},{-443,821},{-449,822},{-447,823},{-423,822},{-439,823},{-437,824},{-458,828},{-421,828},{-422,827},{-416,825},{-417,827},{-420,827},{-418,828},{-400,824},{-397,825},{-401,825},{-399,826},{-447,829},{-451,829},{-449,830},{-441,829},{-434,829},{-450,830},{-456,831},{-429,831},{-427,833},{-418,832},{-420,831},{-395,830},{-386,828},{-385,828},{-392,830},{-373,830},{-388,831},{-370,831},{-388,832},{-387,833},{-389,834},{-378,834},{-381,835},{-377,835},{-365,834},{-370,835},{-348,836},{-339,835},{-342,836},{-303,836},{-257,833},{-319,831},{-335,832},{-325,831},{-357,829},{-353,829},{-356,828},{-340,829},{-338,829},{-340,828},{-338,827},{-337,828},{-336,829},{-317,829},{-301,831},{-253,832},{-248,830},{-259,828},{-240,829},{-238,829},{-241,828},{-234,829},{-213,826},{-226,823},{-250,822},{-301,822},{-300,821},{-328,818},{-321,817},{-314,818},{-277,820},{-245,820},{-247,818},{-263,814},{-233,817},{-233,819},{-231,820},{-213,821},{-210,819},{-210,817},{-213,815},{-229,811},{-226,811},{-240,806},{-206,814},{-198,815},{-189,816},{-195,814},{-185,815},{-171,814},{-172,815},{-167,815},{-170,816},{-169,816},{-164,816},{-165,817},{-165,818},{-156,818},{-137,818},{-113,815},{-133,810},{-143,810},{-145,810},{-141,808},{-155,806},{-173,808},{-175,807},{-174,806},{-181,806},{-195,807},{-209,806},{-202,805},{-204,804},{-194,806},{-157,804},{-169,802},{-193,803},{-205,801},{-200,801},{-205,798},{-200,797},{-195,798},{-199,798},{-197,799},{-190,801},{-172,800},{-179,797},{-190,797},{-194,796},{-193,796},{-194,795},{-227,797},{-229,759},{-195,757},{-194,757},{-196,757},{-193,754},{-196,751},{-221,757},{-214,755},{-225,755},{-214,754},{-205,751},{-212,751},{-218,750},{-221,751},{-225,752},{-206,751},{-208,749},{-206,747},{-211,747},{-197,746},{-194,747},{-193,746},{-194,745},{-190,745},{-196,742},{-202,743},{-204,744},{-212,745},{-217,744},{-221,746},{-218,744},{-208,744},{-201,742},{-211,741},{-220,742},{-219,744},{-225,743},{-220,743},{-224,742},{-222,741},{-225,741},{-220,740},{-218,739},{-219,736},{-217,737},{-219,740},{-217,741},{-205,737},{-204,735},{-206,734},{-216,735},{-225,733},{-241,737},{-228,735},{-225,736},{-223,736},{-228,736},{-241,738},{-245,737},{-245,735},{-257,740},{-247,735},{-260,732},{-274,735},{-264,732},{-277,731},{-274,731},{-274,730},{-272,731},{-261,732},{-262,728},{-267,729},{-274,729},{-264,728},{-268,727},{-263,727},{-264,726},{-255,728},{-247,727},{-249,725},{-259,724},{-263,724},{-255,722},{-255,720},{-244,723},{-245,712},{-246,713},{-251,713},{-256,715},{-269,716},{-279,720},{-287,721},{-273,717},{-285,715},{-259,715},{-254,713},{-268,709},{-279,711},{-276,709},{-284,710},{-279,709},{-283,706},{-293,705},{-263,704},{-286,701},{-274,700},{-269,703},{-263,702},{-253,704},{-254,704},{-239,701},{-221,701},{-233,699},{-229,698},{-230,698},{-234,699},{-239,698},{-236,696},{-238,695},{-243,696},{-241,694},{-248,694},{-246,693},{-247,692},{-252,693},{-250,692},{-253,691},{-253,690},{-256,691},{-255,690},{-264,687},{-278,685},{-276,685},{-280,686},{-280,684},{-292,684},{-291,683},{-294,682},{-299,684},{-301,683},{-303,683},{-300,681},{-307,683},{-308,682},{-304,681},{-310,682},{-312,682},{-309,681},{-316,681},{-316,682},{-315,682},{-320,683},{-321,685},{-323,684},{-325,686},{-324,685},{-326,685},{-321,682},{-322,682},{-325,682},{-320,681},{-322,680},{-320,679},{-332,677},{-331,676},{-334,675},{-336,674},{-337,672},{-340,670},{-339,670},{-341,668},{-343,666},{-344,668},{-345,666},{-344,665},{-346,664},{-351,664},{-353,663},{-351,662},{-358,664},{-357,663},{-358,663},{-357,662},{-358,662},{-360,661},{-361,659},{-364,661},{-370,659},{-371,661},{-373,661},{-372,659},{-375,660},{-374,659},{-371,659},{-372,658},{-378,659},{-377,660},{-378,660},{-372,663},{-379,664},{-382,663},{-377,663},{-381,661},{-380,661},{-385,660},{-382,656},{-388,657},{-394,657},{-392,656},{-397,657},{-398,655},{-402,655},{-400,653},{-401,652},{-411,651},{-410,650},{-412,649},{-407,645},{-416,643},{-406,641},{-406,640},{-408,639},{-406,639},{-415,639},{-417,638},{-408,635},{-412,635},{-413,636},{-412,634},{-414,636},{-416,635},{-412,633},{-416,634},{-417,636},{-419,635},{-419,632},{-421,632},{-422,632},{-420,630},{-423,629},{-426,628},{-432,627},{-421,624},{-430,625},{-423,623},{-425,619},{-421,620},{-424,619},{-423,618},{-428,618},{-429,618},{-426,617},{-422,617},{-431,616},{-424,615},{-429,613},{-433,613},{-427,612},{-426,612},{-432,612},{-427,611},{-426,611},{-436,611},{-428,609},{-435,609},{-435,608},{-433,607},{-432,606},{-428,606},{-429,606},{-433,605},{-436,605},{-437,607},{-441,606},{-442,606},{-438,604},{-436,603},{-433,602},{-442,602},{-440,603},{-441,604},{-447,601}}}, + {"Australia/Currie",6,{{1438,-397},{1440,-401},{1439,-401},{1438,-399},{1439,-396},{1441,-399}}}, + {"Asia/Harbin",120,{{1256,409},{1258,412},{1253,417},{1255,421},{1253,422},{1249,428},{1249,431},{1245,428},{1243,432},{1238,435},{1237,434},{1233,435},{1235,437},{1231,445},{1223,443},{1220,449},{1222,453},{1219,457},{1216,458},{1218,460},{1227,457},{1228,461},{1232,463},{1230,464},{1230,466},{1236,467},{1236,469},{1234,470},{1233,468},{1230,467},{1228,471},{1224,473},{1243,485},{1244,481},{1246,482},{1245,486},{1248,491},{1251,491},{1253,494},{1253,501},{1259,505},{1258,507},{1260,510},{1253,516},{1244,513},{1237,514},{1233,513},{1229,515},{1226,521},{1234,524},{1235,528},{1242,534},{1249,531},{1251,532},{1256,531},{1257,530},{1257,529},{1261,528},{1260,526},{1264,523},{1263,522},{1266,521},{1265,519},{1269,514},{1268,513},{1270,513},{1269,511},{1273,507},{1273,503},{1276,502},{1275,498},{1282,495},{1287,496},{1291,494},{1295,494},{1302,489},{1307,489},{1305,486},{1308,483},{1307,481},{1310,477},{1326,477},{1327,479},{1344,484},{1347,483},{1346,480},{1348,478},{1342,473},{1342,471},{1339,465},{1339,463},{1335,459},{1335,456},{1332,455},{1331,451},{1329,450},{1319,453},{1315,450},{1310,449},{1313,441},{1312,436},{1313,434},{1311,429},{1304,427},{1306,426},{1306,424},{1303,427},{1303,429},{1299,430},{1297,424},{1293,425},{1289,420},{1281,420},{1283,416},{1281,414},{1273,415},{1269,418},{1266,417},{1265,414},{1260,409}}}, + {"America/Belize",46,{{-881,163},{-882,163},{-877,167},{-883,165},{-881,168},{-882,168},{-881,169},{-880,170},{-881,171},{-880,171},{-875,174},{-875,175},{-878,175},{-878,176},{-879,181},{-880,181},{-881,175},{-882,175},{-882,176},{-881,176},{-881,177},{-880,177},{-880,176},{-880,175},{-880,178},{-880,179},{-882,177},{-879,180},{-879,182},{-876,172},{-879,172},{-883,166},{-889,159},{-892,159},{-891,179},{-888,179},{-885,185},{-883,185},{-884,183},{-881,183},{-879,173},{-878,173},{-878,172},{-881,173},{-881,174},{-878,174}}}, + {"America/Vancouver",790,{{-1233,487},{-1232,484},{-1233,486},{-1234,486},{-1234,487},{-1231,488},{-1230,488},{-1232,488},{-1232,487},{-1233,488},{-1253,489},{-1252,489},{-1252,490},{-1252,488},{-1234,488},{-1235,489},{-1235,487},{-1236,489},{-1236,490},{-1233,489},{-1234,489},{-1251,489},{-1254,490},{-1253,490},{-1305,545},{-1311,546},{-1310,546},{-1304,546},{-1304,547},{-1310,545},{-1309,545},{-1308,545},{-1308,544},{-1309,544},{-1307,544},{-1308,546},{-1309,546},{-1302,548},{-1302,547},{-1305,548},{-1304,548},{-1305,547},{-1306,548},{-1302,550},{-1301,550},{-1303,548},{-1296,550},{-1295,550},{-1295,551},{-1294,551},{-1294,552},{-1293,552},{-1293,551},{-1297,554},{-1298,553},{-1298,554},{-1298,555},{-1330,543},{-1330,542},{-1331,542},{-1295,542},{-1303,542},{-1304,543},{-1304,542},{-1305,543},{-1303,543},{-1332,539},{-1301,540},{-1302,540},{-1301,539},{-1302,539},{-1302,541},{-1307,540},{-1303,541},{-1303,540},{-1306,540},{-1287,535},{-1329,535},{-1330,535},{-1306,535},{-1304,535},{-1300,535},{-1299,535},{-1301,536},{-1302,536},{-1301,535},{-1300,536},{-1324,533},{-1325,533},{-1292,534},{-1293,534},{-1295,533},{-1295,534},{-1294,533},{-1291,534},{-1290,535},{-1289,533},{-1291,533},{-1321,537},{-1322,538},{-1321,538},{-1292,536},{-1290,537},{-1288,537},{-1289,536},{-1289,537},{-1324,536},{-1299,536},{-1329,536},{-1305,536},{-1306,536},{-1325,537},{-1324,537},{-1304,537},{-1288,538},{-1287,539},{-1287,538},{-1303,537},{-1302,538},{-1304,536},{-1291,537},{-1289,538},{-1323,538},{-1304,538},{-1303,538},{-1314,524},{-1305,538},{-1306,539},{-1307,539},{-1306,538},{-1304,540},{-1304,541},{-1305,539},{-1306,541},{-1301,541},{-1307,541},{-1308,541},{-1308,542},{-1302,542},{-1312,521},{-1316,526},{-1315,526},{-1314,526},{-1313,526},{-1291,526},{-1292,526},{-1291,525},{-1294,525},{-1314,525},{-1283,526},{-1284,525},{-1284,528},{-1283,527},{-1282,527},{-1283,528},{-1281,528},{-1285,526},{-1284,521},{-1283,521},{-1313,524},{-1313,523},{-1310,519},{-1311,520},{-1311,521},{-1309,521},{-1281,522},{-1285,522},{-1284,522},{-1283,522},{-1282,522},{-1311,523},{-1282,523},{-1285,523},{-1283,524},{-1283,523},{-1284,523},{-1280,523},{-1279,523},{-1279,522},{-1281,523},{-1284,524},{-1288,526},{-1288,527},{-1281,524},{-1287,525},{-1286,524},{-1287,523},{-1288,524},{-1280,525},{-1281,525},{-1312,524},{-1285,524},{-1283,525},{-1290,524},{-1290,525},{-1317,527},{-1317,526},{-1318,527},{-1318,528},{-1316,527},{-1316,528},{-1314,527},{-1294,527},{-1285,527},{-1285,529},{-1285,528},{-1286,525},{-1285,525},{-1288,525},{-1293,528},{-1289,526},{-1289,525},{-1321,529},{-1321,530},{-1324,530},{-1323,531},{-1326,531},{-1318,533},{-1316,530},{-1320,531},{-1319,529},{-1320,529},{-1317,528},{-1319,528},{-1310,522},{-1313,522},{-1313,521},{-1321,527},{-1320,528},{-1321,528},{-1324,529},{-1323,530},{-1322,530},{-1296,530},{-1295,530},{-1297,531},{-1296,531},{-1315,528},{-1294,528},{-1217,492},{-1294,529},{-1317,529},{-1287,529},{-1287,530},{-1315,529},{-1291,532},{-1286,531},{-1286,526},{-1288,528},{-1291,528},{-1288,530},{-1289,531},{-1290,531},{-1289,530},{-1292,529},{-1289,532},{-1318,530},{-1316,529},{-1318,529},{-1319,530},{-1218,493},{-1218,494},{-1218,496},{-1297,530},{-1292,530},{-1292,531},{-1287,532},{-1286,532},{-1298,531},{-1324,531},{-1325,531},{-1321,532},{-1293,533},{-1294,532},{-1294,534},{-1298,532},{-1294,531},{-1293,530},{-1296,532},{-1295,532},{-1320,532},{-1240,498},{-1266,497},{-1293,532},{-1292,533},{-1291,531},{-1293,531},{-1300,532},{-1301,533},{-1300,534},{-1303,534},{-1303,539},{-1278,516},{-1279,516},{-1323,536},{-1321,539},{-1321,540},{-1322,541},{-1316,542},{-1320,533},{-1326,532},{-1327,533},{-1328,533},{-1330,536},{-1328,536},{-1331,538},{-1326,541},{-1327,539},{-1323,541},{-1326,537},{-1327,537},{-1265,496},{-1266,496},{-1265,497},{-1264,497},{-1264,496},{-1241,497},{-1242,497},{-1241,498},{-1242,498},{-1261,493},{-1260,493},{-1233,494},{-1262,494},{-1261,494},{-1262,493},{-1235,494},{-1234,493},{-1234,494},{-1243,494},{-1243,495},{-1260,492},{-1259,492},{-1260,491},{-1242,495},{-1244,495},{-1218,495},{-1219,495},{-1234,495},{-1233,495},{-1240,495},{-1233,496},{-1247,495},{-1246,495},{-1248,495},{-1248,496},{-1246,498},{-1243,497},{-1241,495},{-1246,497},{-1239,492},{-1237,491},{-1238,492},{-1268,498},{-1270,498},{-1267,499},{-1268,496},{-1270,497},{-1271,498},{-1247,498},{-1247,499},{-1246,499},{-1248,499},{-1249,499},{-1248,500},{-1274,500},{-1272,500},{-1273,500},{-1275,501},{-1272,501},{-1251,504},{-1251,502},{-1250,502},{-1251,501},{-1252,501},{-1229,492},{-1230,492},{-1232,492},{-1231,492},{-1248,503},{-1248,501},{-1249,503},{-1247,503},{-1246,502},{-1250,503},{-1252,503},{-1251,503},{-1249,500},{-1250,501},{-1247,501},{-1252,500},{-1254,501},{-1253,503},{-1254,503},{-1227,492},{-1249,501},{-1250,500},{-1223,491},{-1224,491},{-1258,491},{-1232,491},{-1231,491},{-1238,491},{-1222,492},{-1220,492},{-1261,492},{-1221,492},{-1228,492},{-1259,491},{-1257,491},{-1258,492},{-1237,490},{-1236,491},{-1287,508},{-1286,508},{-1273,509},{-1275,511},{-1275,510},{-1276,511},{-1276,510},{-1278,513},{-1276,513},{-1274,513},{-1275,513},{-1277,513},{-1277,515},{-1280,516},{-1279,514},{-1281,516},{-1276,515},{-1278,515},{-1276,516},{-1281,518},{-1282,519},{-1282,520},{-1285,519},{-1284,519},{-1284,520},{-1282,518},{-1283,518},{-1280,518},{-1280,517},{-1283,519},{-1280,519},{-1280,521},{-1281,517},{-1279,509},{-1280,509},{-1268,509},{-1269,509},{-1278,509},{-1259,504},{-1253,504},{-1284,508},{-1269,505},{-1236,488},{-1236,485},{-1233,485},{-1237,483},{-1248,487},{-1247,487},{-1247,488},{-1249,487},{-1249,490},{-1248,491},{-1248,493},{-1252,491},{-1251,490},{-1255,489},{-1256,492},{-1258,494},{-1259,493},{-1259,494},{-1260,495},{-1263,495},{-1263,493},{-1266,494},{-1260,496},{-1261,497},{-1264,498},{-1265,498},{-1268,500},{-1268,499},{-1269,500},{-1269,499},{-1272,499},{-1271,500},{-1271,501},{-1273,502},{-1274,502},{-1279,501},{-1277,503},{-1280,503},{-1279,505},{-1276,505},{-1274,503},{-1275,505},{-1275,506},{-1274,506},{-1280,507},{-1276,506},{-1280,504},{-1254,504},{-1255,504},{-1277,505},{-1257,504},{-1258,504},{-1258,505},{-1260,504},{-1269,506},{-1267,506},{-1268,506},{-1265,506},{-1266,505},{-1266,506},{-1264,505},{-1267,505},{-1262,506},{-1270,506},{-1266,507},{-1267,507},{-1262,507},{-1266,508},{-1275,509},{-1275,508},{-1276,508},{-1276,509},{-1267,509},{-1268,508},{-1269,508},{-1266,509},{-1271,508},{-1267,508},{-1265,508},{-1270,508},{-1277,509},{-1277,508},{-1263,506},{-1272,506},{-1269,507},{-1263,507},{-1264,508},{-1263,508},{-1262,508},{-1283,520},{-1274,524},{-1272,524},{-1279,519},{-1278,522},{-1282,521},{-1280,522},{-1279,521},{-1281,521},{-1350,593},{-1350,596},{-1355,598},{-1363,596},{-1362,595},{-1365,595},{-1366,592},{-1375,589},{-1376,592},{-1391,600},{-1200,600},{-1200,572},{-1204,572},{-1205,575},{-1217,572},{-1219,570},{-1231,571},{-1238,569},{-1238,568},{-1236,565},{-1235,559},{-1229,556},{-1230,554},{-1226,554},{-1219,549},{-1216,548},{-1214,545},{-1208,545},{-1205,541},{-1202,541},{-1203,540},{-1197,537},{-1199,536},{-1197,534},{-1190,531},{-1189,532},{-1184,529},{-1182,524},{-1187,522},{-1181,519},{-1182,518},{-1179,517},{-1180,515},{-1172,513},{-1173,513},{-1172,510},{-1166,506},{-1167,505},{-1164,500},{-1169,498},{-1169,496},{-1167,493},{-1170,492},{-1169,490},{-1231,490},{-1221,491},{-1214,494},{-1217,493},{-1221,498},{-1219,492},{-1224,492},{-1222,493},{-1222,495},{-1226,493},{-1225,494},{-1225,495},{-1226,495},{-1233,493},{-1228,493},{-1229,494},{-1230,493},{-1231,497},{-1233,501},{-1232,497},{-1238,495},{-1238,496},{-1236,497},{-1235,497},{-1238,497},{-1237,497},{-1237,498},{-1239,498},{-1239,499},{-1240,500},{-1237,501},{-1238,502},{-1240,502},{-1238,501},{-1240,499},{-1245,498},{-1247,500},{-1247,504},{-1245,504},{-1243,505},{-1249,506},{-1248,509},{-1247,509},{-1245,508},{-1244,509},{-1243,510},{-1249,510},{-1250,511},{-1251,512},{-1250,512},{-1250,510},{-1250,508},{-1252,504},{-1253,505},{-1251,505},{-1254,506},{-1256,504},{-1254,507},{-1263,505},{-1259,506},{-1257,507},{-1255,509},{-1256,511},{-1256,508},{-1260,507},{-1260,508},{-1262,509},{-1261,510},{-1262,511},{-1261,511},{-1262,512},{-1265,510},{-1265,511},{-1265,512},{-1265,509},{-1268,510},{-1272,509},{-1274,509},{-1272,510},{-1273,510},{-1268,511},{-1267,510},{-1267,512},{-1277,511},{-1278,512},{-1275,512},{-1273,512},{-1271,513},{-1278,514},{-1272,514},{-1273,517},{-1266,516},{-1267,518},{-1267,517},{-1274,517},{-1274,518},{-1274,519},{-1275,518},{-1275,517},{-1277,517},{-1275,516},{-1277,516},{-1279,517},{-1271,523},{-1267,520},{-1270,523},{-1263,524},{-1272,523},{-1272,525},{-1270,526},{-1269,527},{-1270,528},{-1271,529},{-1270,527},{-1272,526},{-1273,524},{-1276,526},{-1275,523},{-1278,523},{-1279,524},{-1277,524},{-1279,525},{-1280,526},{-1282,524},{-1280,527},{-1279,528},{-1278,527},{-1280,528},{-1280,529},{-1284,530},{-1285,531},{-1284,531},{-1288,535},{-1285,533},{-1284,535},{-1281,534},{-1278,531},{-1275,531},{-1281,535},{-1280,535},{-1285,534},{-1288,536},{-1285,538},{-1285,543},{-1288,539},{-1290,539},{-1290,538},{-1294,536},{-1300,542},{-1298,540},{-1297,540},{-1297,539},{-1296,539},{-1299,542},{-1296,542},{-1293,543},{-1301,543},{-1302,544},{-1305,544},{-1300,543},{-1301,544},{-1300,545},{-1300,546},{-1299,546},{-1301,549},{-1302,549},{-1300,550},{-1297,550},{-1295,554},{-1295,555},{-1296,554},{-1298,556},{-1299,553},{-1301,556},{-1300,559},{-1301,561},{-1318,566},{-1319,568},{-1321,569},{-1320,570},{-1324,571},{-1322,572},{-1334,584}}}, + {"Pacific/Pago_Pago",11,{{-1695,-142},{-1694,-143},{-1695,-143},{-1708,-143},{-1707,-142},{-1706,-143},{-1708,-144},{-1705,-143},{-1696,-142},{-1697,-142},{-1711,-111}}}, + {"Asia/Magadan",266,{{1599,609},{1611,692},{1611,693},{1610,693},{1513,715},{1520,710},{1521,710},{1518,712},{1517,713},{1518,713},{1503,715},{1502,715},{1515,713},{1512,714},{1513,714},{1506,591},{1508,591},{1505,590},{1505,591},{1490,591},{1492,592},{1555,592},{1553,592},{1491,593},{1556,593},{1555,593},{1544,595},{1544,596},{1504,596},{1614,694},{1615,694},{1616,694},{1620,695},{1619,695},{1611,696},{1611,695},{1620,696},{1610,697},{1611,697},{1605,697},{1606,697},{1607,697},{1601,697},{1602,697},{1624,706},{1623,706},{1625,706},{1617,706},{1617,707},{1619,696},{1610,696},{1610,695},{1621,696},{1613,696},{1509,714},{1508,714},{1508,715},{1509,715},{1616,695},{1617,695},{1613,694},{1614,695},{1615,696},{1614,696},{1618,696},{1618,695},{1616,696},{1617,696},{1544,600},{1545,599},{1542,599},{1542,597},{1541,594},{1544,594},{1545,594},{1550,595},{1552,593},{1552,592},{1545,592},{1540,590},{1538,592},{1534,592},{1529,589},{1524,591},{1521,589},{1514,588},{1511,591},{1523,592},{1517,593},{1514,596},{1508,594},{1505,595},{1508,596},{1496,598},{1491,596},{1492,595},{1488,595},{1487,594},{1490,594},{1489,592},{1484,592},{1482,594},{1475,592},{1469,594},{1471,594},{1471,599},{1468,599},{1464,603},{1458,602},{1455,605},{1461,607},{1464,607},{1465,609},{1467,610},{1468,614},{1460,620},{1447,621},{1452,623},{1451,625},{1455,625},{1452,632},{1456,637},{1455,638},{1463,641},{1459,644},{1449,645},{1444,649},{1433,652},{1408,656},{1401,656},{1400,656},{1402,658},{1396,663},{1400,665},{1404,664},{1405,666},{1389,672},{1402,677},{1413,679},{1412,682},{1410,684},{1420,686},{1420,688},{1415,692},{1428,692},{1424,695},{1425,696},{1421,696},{1423,698},{1418,698},{1409,700},{1409,701},{1420,708},{1426,711},{1425,713},{1426,715},{1438,722},{1445,721},{1476,723},{1492,722},{1501,719},{1496,717},{1495,719},{1493,719},{1491,717},{1499,717},{1506,715},{1516,713},{1517,710},{1523,709},{1560,711},{1582,710},{1599,706},{1601,703},{1597,699},{1610,692},{1612,692},{1624,697},{1624,694},{1628,692},{1625,691},{1625,690},{1628,689},{1626,688},{1627,686},{1624,683},{1614,684},{1585,681},{1581,679},{1583,677},{1578,677},{1577,675},{1579,674},{1579,673},{1588,670},{1589,668},{1584,664},{1592,662},{1589,657},{1600,655},{1605,652},{1613,651},{1619,648},{1633,647},{1632,646},{1635,644},{1628,641},{1629,639},{1627,638},{1630,635},{1627,634},{1628,632},{1623,631},{1623,629},{1628,627},{1627,626},{1627,623},{1622,622},{1625,621},{1623,619},{1625,617},{1616,613},{1608,607},{1604,607},{1602,606},{1602,608},{1604,610},{1598,609},{1600,611},{1598,612},{1603,615},{1604,619},{1596,617},{1596,618},{1592,619},{1580,617},{1575,618},{1567,615},{1567,612},{1559,609},{1559,607},{1615,708},{1617,708},{1616,709},{1615,709},{1522,709},{1521,709},{1607,708},{1605,708},{1605,709},{1608,708},{1505,715},{1504,715},{1512,715},{1511,716},{1503,716},{1502,716},{1504,716},{1510,715},{1507,715},{1501,716},{1494,718},{1495,718},{1507,714},{1511,714},{1510,714}}}, + {"Asia/Tbilisi",29,{{426,416},{425,414},{415,415},{418,419},{415,427},{409,431},{403,432},{400,434},{401,436},{407,436},{416,432},{429,432},{438,428},{438,426},{445,428},{448,426},{452,427},{458,425},{456,422},{464,420},{463,416},{467,413},{465,411},{453,415},{448,413},{449,412},{435,411},{432,412},{428,416}}}, + {"Asia/Yerevan",31,{{450,413},{452,412},{451,411},{451,410},{454,410},{456,409},{454,407},{454,405},{460,403},{459,400},{456,400},{462,396},{466,396},{464,394},{466,392},{464,392},{465,389},{461,388},{458,396},{455,395},{451,398},{448,397},{444,400},{436,401},{435,405},{437,407},{435,411},{450,411},{452,410},{455,407},{455,406}}}, + {"Europe/Tallinn",80,{{218,583},{226,582},{225,581},{225,582},{218,584},{219,584},{233,578},{232,578},{241,582},{240,581},{240,582},{234,586},{232,585},{231,586},{232,587},{232,588},{231,588},{230,588},{240,593},{244,595},{248,594},{248,596},{254,595},{257,597},{282,594},{279,592},{275,586},{275,582},{278,579},{275,578},{273,575},{269,576},{265,575},{260,578},{253,581},{244,579},{246,583},{235,586},{235,587},{238,588},{235,588},{234,589},{237,590},{234,590},{235,592},{234,588},{230,589},{231,589},{226,586},{230,586},{233,585},{223,582},{220,579},{222,581},{220,584},{218,585},{221,584},{238,583},{233,584},{234,585},{235,585},{226,587},{224,589},{220,589},{226,591},{234,593},{239,593},{239,594},{240,594},{231,590},{233,590},{232,590},{251,596},{250,596},{258,597},{252,596},{245,595},{245,596},{246,596},{247,596}}}, + {"Pacific/Johnston",1,{{-1695,167}}}, + {"Asia/Baku",71,{{499,403},{463,418},{464,419},{467,419},{473,413},{478,412},{484,416},{485,419},{495,406},{501,406},{503,404},{504,402},{499,404},{495,402},{493,395},{494,393},{493,393},{492,390},{491,389},{492,391},{489,392},{489,384},{486,384},{480,388},{484,390},{481,392},{484,394},{480,397},{465,389},{464,392},{466,392},{464,394},{466,396},{462,396},{456,400},{459,400},{460,403},{454,405},{454,407},{456,409},{451,410},{452,412},{450,412},{453,415},{459,412},{466,411},{467,413},{463,415},{455,407},{455,406},{505,403},{505,404},{506,403},{500,403},{496,400},{495,399},{497,400},{490,392},{450,394},{448,397},{451,398},{455,395},{458,396},{461,388},{455,390},{494,398},{503,405},{504,404},{452,410},{450,411},{501,403}}}, + {"America/North_Dakota/New_Salem",7,{{-1009,470},{-1005,465},{-1010,463},{-1013,464},{-1013,466},{-1021,467},{-1021,470}}}, + {"Europe/Vilnius",28,{{211,561},{220,564},{245,563},{249,564},{251,562},{257,561},{266,557},{265,553},{269,553},{258,548},{256,543},{258,542},{255,542},{255,543},{248,541},{248,540},{236,539},{234,542},{228,544},{227,546},{229,548},{226,551},{221,550},{213,553},{210,553},{209,553},{211,557},{211,554}}}, + {"America/Indiana/Petersburg",4,{{-871,385},{-871,382},{-873,382},{-875,385}}}, + {"Asia/Tehran",199,{{514,279},{515,279},{515,278},{509,290},{509,291},{504,293},{503,293},{507,293},{508,291},{507,291},{506,292},{503,292},{569,270},{568,270},{565,270},{564,270},{564,271},{565,271},{568,271},{566,271},{566,272},{565,272},{592,255},{581,256},{582,256},{583,256},{578,257},{545,259},{544,261},{551,262},{551,263},{545,263},{571,264},{571,263},{553,263},{585,256},{584,256},{536,267},{537,267},{556,268},{559,266},{558,266},{559,267},{540,265},{539,265},{539,266},{540,266},{533,268},{532,268},{531,268},{534,268},{563,268},{563,269},{564,269},{564,268},{559,269},{563,270},{553,266},{558,268},{557,269},{556,269},{557,268},{558,269},{536,368},{536,369},{491,305},{492,305},{492,304},{490,305},{491,304},{490,304},{491,301},{492,301},{492,302},{490,302},{491,302},{489,303},{489,304},{611,315},{617,314},{618,310},{609,299},{618,286},{628,283},{628,272},{633,271},{632,266},{624,266},{623,264},{618,262},{617,253},{614,251},{606,253},{605,254},{605,253},{591,254},{586,256},{573,258},{570,270},{567,272},{556,270},{555,268},{552,268},{548,265},{543,267},{535,270},{527,273},{524,276},{510,288},{508,289},{506,295},{501,299},{501,302},{496,300},{492,303},{489,305},{489,300},{485,300},{484,302},{480,305},{480,310},{477,310},{479,318},{475,324},{461,330},{462,333},{454,340},{456,341},{454,345},{455,346},{457,345},{457,347},{459,351},{462,351},{460,356},{463,358},{458,358},{455,360},{453,360},{453,364},{451,364},{451,367},{448,368},{449,370},{447,371},{448,373},{446,374},{446,377},{442,379},{445,383},{443,384},{443,388},{440,394},{444,394},{446,398},{454,390},{462,388},{465,389},{480,397},{484,394},{481,392},{484,390},{480,388},{486,384},{489,384},{491,377},{502,374},{507,369},{518,366},{540,369},{540,368},{539,373},{547,374},{549,378},{555,381},{563,381},{565,383},{572,383},{574,379},{584,376},{588,377},{593,375},{596,371},{600,370},{604,366},{612,366},{611,360},{613,356},{611,348},{607,345},{609,343},{607,343},{605,341},{606,336},{609,335},{606,331},{609,322},{609,315},{506,294}}}, + {"America/Inuvik",4,{{-1334,683},{-1337,683},{-1338,684},{-1336,683}}}, + {"Europe/Lisbon",53,{{-79,370},{-80,370},{-78,370},{-87,384},{-88,385},{-87,385},{-87,407},{-90,389},{-75,375},{-74,372},{-85,372},{-90,370},{-87,377},{-89,385},{-88,384},{-86,384},{-87,386},{-92,384},{-93,387},{-90,386},{-89,390},{-88,390},{-88,391},{-87,391},{-91,387},{-95,388},{-94,394},{-91,396},{-86,407},{-87,409},{-88,406},{-86,411},{-88,417},{-87,417},{-89,418},{-82,421},{-81,418},{-66,420},{-66,417},{-62,416},{-69,410},{-68,404},{-70,402},{-69,400},{-70,397},{-75,397},{-70,391},{-73,384},{-71,382},{-69,382},{-91,388},{-91,389},{-90,388}}}, + {"Europe/Vatican",2,{{124,419},{125,419}}}, + {"Pacific/Chatham",25,{{-1762,-444},{-1763,-444},{-1759,-443},{-1763,-443},{-1764,-443},{-1762,-443},{-1763,-442},{-1762,-442},{-1761,-443},{-1759,-440},{-1758,-440},{-1769,-439},{-1762,-437},{-1768,-436},{-1764,-438},{-1765,-441},{-1763,-440},{-1764,-439},{-1765,-439},{-1767,-438},{-1769,-438},{-1766,-437},{-1763,-441},{-1766,-441},{-1760,-442}}}, + {"Antarctica/Macquarie",4,{{1588,-548},{1589,-545},{1590,-545},{1589,-548}}}, + {"America/Araguaina",53,{{-470,-80},{-466,-79},{-465,-81},{-465,-84},{-468,-85},{-471,-90},{-465,-95},{-467,-98},{-463,-102},{-458,-103},{-463,-108},{-462,-109},{-466,-113},{-461,-116},{-463,-118},{-461,-119},{-463,-121},{-463,-124},{-462,-125},{-462,-128},{-475,-133},{-477,-131},{-478,-133},{-482,-132},{-482,-130},{-488,-132},{-490,-126},{-494,-132},{-504,-128},{-503,-125},{-505,-128},{-506,-128},{-507,-115},{-506,-107},{-501,-93},{-493,-84},{-492,-78},{-494,-75},{-492,-73},{-492,-69},{-484,-64},{-483,-57},{-481,-56},{-484,-54},{-487,-54},{-485,-52},{-479,-52},{-475,-56},{-474,-63},{-475,-70},{-477,-72},{-475,-73},{-476,-74}}}, + {"Asia/Thimphu",17,{{920,272},{921,269},{919,268},{907,268},{904,269},{899,267},{891,268},{888,271},{894,280},{900,283},{904,282},{904,281},{911,280},{913,281},{917,280},{916,275},{920,275}}}, + {"Atlantic/Madeira",12,{{-159,301},{-159,302},{-165,325},{-165,324},{-165,326},{-164,330},{-163,331},{-164,331},{-167,327},{-169,328},{-169,326},{-173,328}}}, + {"America/Coral_Harbour",76,{{-824,639},{-825,639},{-832,640},{-828,629},{-819,629},{-820,627},{-831,622},{-837,621},{-840,624},{-835,629},{-828,630},{-827,630},{-826,630},{-862,649},{-862,650},{-817,644},{-862,641},{-815,642},{-814,642},{-836,632},{-837,632},{-857,637},{-849,660},{-851,661},{-850,661},{-848,659},{-847,659},{-848,660},{-855,659},{-851,658},{-850,656},{-853,655},{-849,652},{-845,655},{-841,652},{-834,651},{-832,649},{-818,646},{-816,641},{-820,640},{-814,641},{-809,640},{-809,641},{-805,639},{-807,639},{-801,638},{-811,634},{-825,637},{-831,640},{-829,641},{-831,642},{-837,640},{-836,638},{-843,636},{-846,633},{-854,631},{-856,632},{-856,636},{-857,638},{-872,636},{-869,639},{-864,646},{-861,649},{-861,655},{-860,658},{-845,656},{-847,658},{-846,658},{-851,657},{-850,657},{-847,655},{-846,655},{-849,657},{-850,660},{-846,656},{-852,660}}}, + {"Pacific/Funafuti",13,{{1799,-94},{1798,-94},{1791,-86},{1792,-85},{1784,-80},{1787,-75},{1787,-74},{1772,-72},{1771,-72},{1763,-63},{1773,-61},{1761,-57},{1761,-56}}}, + {"Indian/Mahe",58,{{510,-92},{512,-102},{512,-101},{477,-101},{478,-101},{465,-97},{465,-98},{477,-97},{476,-97},{475,-97},{476,-98},{510,-95},{463,-94},{462,-94},{507,-93},{563,-71},{562,-72},{528,-71},{528,-70},{527,-70},{527,-72},{528,-72},{531,-62},{530,-62},{532,-62},{530,-59},{554,-59},{533,-58},{464,-94},{465,-94},{463,-95},{462,-93},{464,-93},{463,-93},{537,-57},{532,-57},{533,-54},{533,-51},{554,-47},{559,-46},{560,-46},{553,-45},{552,-45},{552,-44},{553,-44},{555,-48},{554,-46},{555,-47},{555,-46},{559,-43},{558,-43},{557,-43},{557,-42},{557,-38},{552,-37},{559,-44},{558,-44},{556,-43}}}, + {"Australia/Adelaide",119,{{1361,-353},{1322,-321},{1332,-323},{1335,-324},{1338,-324},{1335,-323},{1336,-323},{1337,-322},{1343,-339},{1343,-340},{1369,-337},{1361,-352},{1345,-337},{1344,-338},{1348,-336},{1347,-332},{1346,-332},{1343,-327},{1378,-326},{1333,-326},{1333,-325},{1337,-325},{1337,-324},{1334,-324},{1336,-325},{1372,-360},{1367,-361},{1365,-359},{1366,-358},{1376,-356},{1376,-357},{1378,-357},{1378,-358},{1377,-358},{1379,-357},{1381,-358},{1377,-359},{1375,-361},{1365,-352},{1364,-352},{1365,-351},{1356,-350},{1360,-350},{1362,-350},{1362,-351},{1361,-349},{1360,-349},{1385,-348},{1386,-348},{1348,-347},{1348,-346},{1359,-347},{1360,-347},{1363,-347},{1364,-347},{1363,-346},{1360,-346},{1359,-346},{1373,-345},{1374,-345},{1342,-340},{1363,-345},{1350,-260},{1410,-260},{1410,-381},{1404,-379},{1398,-373},{1397,-370},{1399,-367},{1397,-363},{1389,-356},{1394,-358},{1388,-355},{1381,-356},{1384,-354},{1381,-341},{1378,-351},{1369,-353},{1368,-352},{1370,-349},{1374,-349},{1374,-341},{1380,-336},{1378,-333},{1380,-331},{1379,-330},{1379,-328},{1377,-324},{1378,-330},{1374,-331},{1372,-337},{1366,-339},{1361,-345},{1359,-345},{1358,-348},{1351,-346},{1352,-344},{1354,-346},{1355,-346},{1353,-340},{1344,-332},{1344,-331},{1343,-330},{1343,-332},{1341,-330},{1341,-327},{1342,-328},{1343,-326},{1341,-325},{1338,-325},{1339,-324},{1337,-321},{1331,-322},{1327,-319},{1322,-320},{1312,-315},{1308,-316},{1290,-317},{1290,-260}}}, + {"Africa/Freetown",49,{{-132,81},{-131,85},{-131,86},{-132,89},{-130,86},{-131,77},{-125,77},{-115,69},{-116,70},{-124,74},{-125,75},{-125,74},{-130,76},{-131,76},{-130,77},{-127,75},{-126,76},{-125,76},{-126,77},{-111,73},{-114,69},{-123,74},{-123,75},{-125,78},{-127,77},{-130,79},{-128,79},{-130,82},{-132,82},{-133,85},{-131,84},{-129,86},{-132,85},{-133,88},{-131,88},{-133,90},{-128,93},{-124,99},{-112,100},{-107,93},{-107,91},{-106,90},{-105,87},{-106,85},{-107,83},{-103,85},{-103,82},{-105,81},{-106,78}}}, + {"Atlantic/South_Georgia",47,{{-272,-595},{-273,-595},{-273,-594},{-274,-594},{-271,-594},{-266,-590},{-265,-590},{-265,-591},{-267,-590},{-262,-584},{-262,-585},{-265,-584},{-264,-584},{-265,-578},{-265,-577},{-264,-578},{-271,-567},{-272,-567},{-276,-563},{-275,-563},{-268,-571},{-267,-571},{-266,-571},{-377,-541},{-378,-541},{-370,-545},{-371,-545},{-418,-536},{-418,-537},{-382,-540},{-373,-540},{-380,-540},{-381,-540},{-358,-548},{-370,-541},{-365,-542},{-367,-543},{-365,-544},{-362,-543},{-361,-549},{-365,-545},{-374,-543},{-372,-541},{-377,-542},{-376,-540},{-380,-541},{-374,-540}}}, + {"Africa/Accra",35,{{7,58},{2,57},{-21,47},{-31,51},{-28,51},{-27,54},{-28,56},{-30,57},{-32,68},{-30,72},{-28,79},{-25,82},{-28,91},{-27,92},{-28,104},{-29,106},{-28,110},{-6,109},{-3,112},{0,111},{-1,106},{4,103},{4,96},{2,95},{6,94},{5,89},{4,87},{7,83},{6,82},{5,75},{7,73},{5,68},{8,64},{12,62},{9,58}}}, + {"America/North_Dakota/Beulah",6,{{-1013,473},{-1018,472},{-1018,470},{-1021,470},{-1022,476},{-1014,476}}}, + {"America/Jamaica",14,{{-770,179},{-771,179},{-763,180},{-762,179},{-765,178},{-768,180},{-769,178},{-772,177},{-777,179},{-781,182},{-784,183},{-782,185},{-773,185},{-769,184}}}, + {"America/Scoresbysund",48,{{-217,715},{-218,715},{-215,707},{-217,713},{-218,713},{-216,715},{-225,716},{-237,722},{-215,706},{-216,706},{-214,706},{-214,707},{-216,708},{-225,708},{-217,709},{-216,709},{-244,723},{-225,719},{-231,716},{-224,718},{-227,716},{-219,717},{-226,715},{-224,712},{-222,715},{-219,715},{-219,714},{-217,714},{-219,713},{-216,713},{-217,712},{-217,711},{-219,712},{-223,710},{-220,710},{-216,710},{-219,708},{-218,707},{-216,707},{-218,706},{-215,705},{-224,705},{-225,709},{-227,707},{-226,704},{-240,706},{-242,710},{-245,712}}}, + {"America/Swift_Current",1,{{-1078,503}}}, + {"Europe/Tirane",27,{{193,405},{203,398},{202,396},{200,397},{199,400},{195,402},{193,404},{195,404},{193,407},{195,409},{194,414},{196,416},{193,422},{197,427},{198,425},{201,426},{205,422},{206,420},{205,416},{205,412},{207,409},{210,409},{211,407},{207,401},{203,400},{204,398},{195,410}}}, + {"Asia/Ashgabat",93,{{535,396},{535,397},{526,415},{525,415},{529,408},{531,387},{530,389},{530,391},{531,391},{647,368},{644,362},{641,360},{631,359},{632,357},{631,354},{623,351},{621,354},{616,354},{612,357},{611,367},{604,366},{600,370},{596,371},{593,375},{588,377},{584,376},{574,379},{572,383},{564,382},{563,381},{555,381},{549,378},{547,374},{539,373},{538,385},{540,389},{535,393},{532,394},{532,392},{531,394},{533,397},{532,395},{535,395},{536,396},{536,395},{537,396},{534,397},{534,400},{529,400},{529,399},{528,400},{527,405},{529,410},{524,418},{530,421},{542,423},{548,420},{555,413},{570,413},{572,414},{570,414},{570,419},{574,422},{579,422},{580,425},{585,423},{581,426},{586,427},{586,428},{594,423},{600,422},{599,420},{603,418},{601,418},{601,414},{604,413},{613,411},{614,413},{619,411},{621,406},{623,404},{625,400},{654,383},{667,380},{665,373},{657,375},{655,372},{648,371},{531,397},{535,399},{530,398},{531,398},{530,399}}}, + {"America/Moncton",79,{{-668,446},{-667,447},{-668,447},{-667,446},{-669,446},{-668,448},{-667,449},{-667,450},{-670,449},{-669,449},{-669,450},{-669,448},{-670,450},{-648,467},{-649,468},{-648,468},{-650,471},{-651,471},{-651,472},{-650,472},{-650,473},{-649,473},{-648,478},{-645,479},{-645,478},{-646,478},{-647,478},{-649,478},{-645,480},{-646,479},{-662,480},{-661,480},{-667,480},{-668,480},{-668,481},{-667,481},{-670,451},{-671,451},{-638,462},{-645,462},{-646,463},{-645,463},{-646,464},{-669,451},{-668,451},{-668,450},{-664,481},{-658,479},{-656,476},{-651,478},{-654,471},{-648,471},{-649,469},{-650,468},{-647,467},{-646,462},{-638,461},{-641,461},{-645,457},{-645,458},{-645,459},{-646,460},{-648,456},{-659,452},{-661,453},{-670,452},{-673,451},{-675,453},{-674,456},{-678,457},{-678,471},{-682,474},{-689,472},{-691,473},{-684,476},{-684,479},{-681,480},{-676,480},{-674,478}}}, + {"Europe/Vaduz",3,{{95,473},{96,471},{95,471}}}, + {"Australia/Eucla",7,{{1290,-313},{1290,-317},{1283,-320},{1272,-323},{1262,-322},{1255,-326},{1255,-313}}}, + {"America/Montserrat",3,{{-622,167},{-622,168},{-621,167}}}, + {"America/Glace_Bay",13,{{-604,462},{-597,460},{-598,460},{-600,462},{-598,462},{-600,460},{-602,459},{-602,457},{-607,458},{-604,460},{-608,459},{-603,463},{-602,461}}}, + {"Atlantic/Stanley",159,{{-583,-519},{-596,-519},{-598,-519},{-612,-519},{-612,-518},{-605,-519},{-605,-518},{-587,-519},{-597,-519},{-585,-519},{-586,-519},{-611,-519},{-592,-529},{-589,-525},{-589,-524},{-590,-524},{-591,-525},{-591,-524},{-596,-523},{-595,-523},{-597,-524},{-596,-524},{-598,-524},{-598,-523},{-597,-523},{-607,-522},{-609,-522},{-605,-522},{-604,-522},{-586,-522},{-586,-521},{-597,-520},{-591,-521},{-597,-521},{-610,-520},{-583,-520},{-584,-520},{-585,-520},{-609,-520},{-609,-512},{-608,-512},{-602,-512},{-603,-512},{-584,-521},{-599,-520},{-598,-520},{-596,-520},{-587,-521},{-608,-521},{-598,-522},{-598,-521},{-597,-522},{-590,-523},{-590,-522},{-588,-522},{-589,-522},{-588,-521},{-590,-521},{-599,-521},{-599,-512},{-604,-512},{-608,-511},{-607,-511},{-609,-511},{-611,-511},{-611,-510},{-612,-511},{-613,-510},{-612,-510},{-580,-518},{-581,-518},{-582,-518},{-613,-519},{-613,-518},{-611,-518},{-609,-518},{-600,-514},{-592,-514},{-603,-520},{-605,-521},{-606,-523},{-607,-521},{-610,-521},{-605,-520},{-604,-519},{-606,-519},{-602,-518},{-606,-518},{-606,-517},{-600,-517},{-606,-513},{-601,-515},{-584,-515},{-582,-517},{-579,-514},{-577,-515},{-582,-516},{-577,-517},{-583,-517},{-584,-518},{-582,-519},{-584,-519},{-589,-518},{-586,-520},{-593,-520},{-595,-521},{-593,-524},{-596,-521},{-595,-518},{-591,-517},{-590,-518},{-590,-517},{-592,-516},{-589,-515},{-591,-515},{-589,-514},{-590,-512},{-584,-513},{-583,-515},{-585,-514},{-586,-514},{-595,-517},{-599,-513},{-598,-513},{-613,-517},{-612,-517},{-610,-518},{-596,-518},{-597,-518},{-603,-516},{-604,-516},{-605,-516},{-607,-517},{-607,-516},{-580,-516},{-581,-516},{-583,-516},{-607,-515},{-605,-515},{-605,-513},{-606,-512},{-597,-513},{-601,-514},{-602,-514},{-598,-514},{-599,-514},{-596,-514},{-597,-514},{-607,-514},{-607,-513},{-604,-514},{-603,-514},{-603,-513},{-600,-513},{-596,-513},{-595,-513},{-594,-513},{-608,-516},{-609,-516}}}, + {"Africa/Bujumbura",16,{{302,-40},{298,-45},{294,-44},{292,-31},{290,-28},{291,-26},{293,-27},{294,-28},{297,-28},{299,-27},{300,-23},{306,-24},{304,-29},{308,-30},{308,-33},{304,-36}}}, + {"Africa/Porto-Novo",27,{{27,77},{27,64},{16,62},{18,63},{16,67},{16,90},{13,95},{14,100},{8,104},{9,110},{11,110},{11,113},{14,115},{20,114},{25,120},{24,122},{28,124},{36,117},{35,113},{37,111},{39,106},{38,104},{36,104},{36,99},{31,95},{31,91},{28,91}}}, + {"America/Argentina/Rio_Gallegos",51,{{-672,-488},{-690,-516},{-692,-509},{-692,-510},{-716,-460},{-676,-460},{-674,-466},{-668,-470},{-657,-472},{-659,-478},{-658,-479},{-660,-480},{-659,-481},{-671,-487},{-676,-491},{-678,-499},{-683,-501},{-686,-499},{-684,-502},{-691,-506},{-689,-515},{-692,-517},{-684,-523},{-684,-524},{-700,-520},{-720,-520},{-720,-519},{-724,-516},{-723,-513},{-724,-511},{-723,-510},{-723,-507},{-727,-506},{-731,-508},{-736,-503},{-734,-498},{-736,-495},{-735,-492},{-731,-491},{-726,-488},{-726,-485},{-723,-483},{-725,-477},{-720,-472},{-719,-472},{-719,-468},{-716,-467},{-719,-461},{-662,-485},{-662,-483},{-661,-481}}}, + {"America/Grenada",8,{{-616,122},{-616,120},{-618,120},{-617,122},{-616,123},{-615,124},{-615,125},{-614,125}}}, + {"Asia/Novokuznetsk",41,{{886,568},{887,567},{885,566},{886,564},{891,563},{895,559},{884,553},{888,548},{884,544},{892,543},{892,541},{890,541},{893,538},{888,536},{888,534},{890,533},{891,531},{889,530},{892,528},{887,522},{884,522},{884,525},{872,526},{869,529},{871,531},{867,532},{870,535},{866,535},{861,540},{851,545},{849,554},{846,554},{848,555},{844,560},{857,562},{856,563},{862,566},{870,565},{871,567},{875,567},{878,565}}}, + {"America/Argentina/Catamarca",87,{{-636,-424},{-636,-423},{-655,-450},{-655,-449},{-657,-448},{-656,-448},{-665,-452},{-654,-451},{-659,-451},{-660,-451},{-657,-451},{-658,-451},{-656,-451},{-656,-450},{-662,-450},{-666,-451},{-669,-453},{-676,-460},{-716,-460},{-718,-456},{-713,-453},{-716,-450},{-720,-449},{-721,-448},{-713,-448},{-711,-445},{-718,-444},{-718,-441},{-717,-439},{-718,-438},{-716,-437},{-719,-435},{-717,-432},{-721,-429},{-721,-423},{-720,-421},{-717,-421},{-718,-420},{-651,-420},{-645,-422},{-646,-424},{-644,-424},{-640,-424},{-644,-422},{-638,-421},{-637,-428},{-641,-429},{-642,-426},{-646,-425},{-650,-427},{-643,-430},{-650,-432},{-653,-436},{-652,-444},{-657,-447},{-651,-300},{-664,-289},{-666,-284},{-675,-282},{-678,-284},{-679,-281},{-684,-280},{-684,-277},{-691,-278},{-688,-271},{-685,-272},{-683,-269},{-686,-265},{-684,-262},{-686,-254},{-685,-252},{-666,-253},{-665,-256},{-668,-257},{-668,-259},{-664,-264},{-662,-262},{-662,-266},{-659,-267},{-662,-273},{-660,-274},{-656,-281},{-653,-279},{-652,-279},{-651,-284},{-652,-287},{-649,-296}}}, + {"America/Indiana/Indianapolis",14,{{-852,387},{-858,386},{-860,384},{-867,384},{-867,389},{-875,389},{-877,391},{-875,394},{-875,407},{-865,409},{-865,418},{-848,418},{-848,393},{-851,393}}}, + {"America/Indiana/Tell_City",5,{{-867,378},{-868,380},{-868,382},{-866,383},{-864,381}}}, + {"America/Curacao",5,{{-686,120},{-687,120},{-690,121},{-691,123},{-692,124}}}, + {"America/Miquelon",4,{{-562,468},{-563,469},{-564,471},{-564,468}}}, + {"America/Menominee",19,{{-877,454},{-879,454},{-878,457},{-881,458},{-881,459},{-901,463},{-904,466},{-899,468},{-899,466},{-894,465},{-894,463},{-881,464},{-881,462},{-876,462},{-876,460},{-874,460},{-873,455},{-876,451},{-877,452}}}, + {"Asia/Novosibirsk",94,{{844,560},{848,555},{846,554},{849,554},{849,550},{851,549},{849,547},{851,545},{845,541},{836,541},{834,539},{832,541},{825,535},{822,537},{818,537},{817,538},{819,540},{816,539},{809,544},{795,537},{787,537},{784,535},{779,536},{781,535},{778,533},{764,541},{767,542},{769,545},{757,541},{758,547},{753,549},{754,550},{751,554},{753,555},{751,558},{754,558},{753,559},{757,561},{763,562},{761,565},{758,564},{763,567},{761,573},{756,576},{756,579},{751,581},{752,582},{751,583},{754,585},{751,586},{757,590},{756,592},{759,594},{766,596},{767,601},{769,603},{768,605},{770,605},{770,607},{771,609},{779,607},{792,608},{794,606},{807,608},{822,605},{828,609},{835,610},{843,609},{847,605},{848,604},{845,600},{847,599},{871,599},{872,597},{875,597},{879,593},{886,593},{888,590},{884,589},{879,585},{881,581},{894,579},{894,576},{891,576},{885,571},{887,571},{886,568},{878,565},{875,567},{871,567},{870,565},{862,566},{856,563},{857,562}}}, + {"Africa/Lagos",64,{{83,46},{57,45},{83,48},{76,45},{60,43},{55,48},{54,54},{45,63},{38,64},{27,64},{28,91},{31,91},{31,95},{36,99},{36,104},{38,104},{38,106},{37,111},{35,113},{37,118},{36,125},{41,130},{41,135},{45,137},{55,139},{64,136},{69,130},{78,133},{90,128},{97,128},{101,132},{107,134},{115,134},{125,131},{129,135},{136,137},{141,131},{142,124},{147,122},{146,115},{141,113},{140,113},{137,110},{135,102},{132,100},{132,96},{129,94},{128,88},{122,84},{122,80},{118,73},{118,71},{116,70},{114,65},{111,65},{106,72},{105,69},{102,69},{102,70},{88,58},{88,52},{85,47},{83,49},{83,45}}}, + {"Indian/Cocos",5,{{968,-121},{968,-122},{969,-122},{969,-121},{968,-118}}}, + {"America/Yakutat",32,{{-1393,594},{-1392,594},{-1385,592},{-1392,593},{-1393,593},{-1410,603},{-1400,602},{-1391,604},{-1392,601},{-1376,592},{-1375,589},{-1379,588},{-1382,590},{-1386,591},{-1390,594},{-1399,595},{-1395,597},{-1396,599},{-1395,600},{-1393,599},{-1393,596},{-1393,598},{-1390,598},{-1389,598},{-1395,601},{-1402,597},{-1410,598},{-1397,596},{-1398,596},{-1396,596},{-1396,597},{-1400,598}}}, + {"Europe/Volgograd",208,{{480,452},{481,452},{482,454},{491,461},{490,462},{491,462},{492,462},{491,463},{492,463},{484,609},{485,604},{488,604},{485,602},{485,597},{491,597},{490,595},{495,594},{496,592},{498,592},{498,596},{501,597},{500,598},{508,599},{511,601},{515,599},{521,603},{535,602},{537,600},{537,598},{532,593},{534,591},{539,591},{537,589},{539,588},{537,586},{538,584},{533,584},{531,585},{529,584},{522,585},{518,584},{517,582},{519,580},{519,576},{516,574},{512,575},{511,573},{513,569},{515,569},{511,565},{515,562},{513,561},{508,562},{508,564},{506,564},{505,566},{501,566},{501,568},{497,569},{497,571},{493,570},{492,573},{490,571},{483,572},{481,570},{477,571},{475,569},{467,569},{469,572},{467,573},{467,575},{475,575},{476,578},{478,579},{463,581},{466,586},{470,586},{473,589},{476,589},{472,592},{473,594},{471,594},{471,597},{469,598},{470,601},{466,601},{463,602},{467,603},{469,605},{471,606},{470,607},{472,611},{492,461},{480,455},{479,455},{479,457},{480,456},{495,459},{496,459},{488,460},{489,460},{492,460},{491,460},{491,459},{486,456},{486,457},{486,458},{485,458},{466,487},{465,484},{471,483},{472,481},{470,480},{472,478},{481,478},{484,474},{486,474},{490,468},{485,467},{492,464},{490,464},{490,461},{489,461},{487,456},{485,460},{485,457},{484,458},{484,456},{483,457},{478,457},{477,455},{477,456},{476,455},{474,457},{469,456},{472,461},{468,461},{469,462},{465,463},{470,464},{469,466},{472,467},{468,470},{465,474},{468,476},{461,475},{457,478},{457,480},{450,482},{445,481},{445,482},{443,483},{443,481},{445,480},{444,479},{441,479},{437,477},{437,474},{429,475},{425,480},{420,480},{421,484},{426,485},{427,488},{423,492},{421,492},{422,497},{415,501},{414,502},{415,506},{412,508},{419,512},{429,512},{425,517},{428,520},{428,522},{432,525},{443,523},{445,526},{451,523},{456,525},{460,524},{466,527},{471,526},{477,526},{483,528},{489,524},{492,525},{502,521},{502,520},{507,519},{508,516},{506,516},{504,513},{494,511},{494,509},{488,506},{486,506},{489,500},{487,499},{484,498},{476,504},{473,503},{473,501},{469,499},{468,496},{468,493},{470,491}}}, + {"Asia/Rangoon",532,{{980,96},{981,96},{981,97},{980,97},{979,97},{982,98},{980,98},{981,98},{985,99},{985,100},{982,99},{975,118},{974,118},{975,116},{978,125},{985,125},{985,126},{979,126},{979,125},{978,126},{982,126},{986,126},{982,127},{986,125},{986,124},{981,124},{981,125},{982,125},{983,125},{983,126},{986,123},{982,123},{982,124},{984,123},{981,123},{985,123},{985,124},{980,123},{980,124},{984,124},{978,124},{984,125},{983,123},{983,127},{980,121},{985,122},{984,122},{981,122},{982,122},{983,122},{984,121},{980,122},{981,121},{978,123},{979,122},{979,123},{986,101},{983,101},{979,101},{979,102},{983,102},{982,102},{982,103},{983,103},{980,101},{980,102},{981,101},{981,102},{982,101},{982,100},{983,100},{981,100},{980,100},{980,103},{980,104},{979,103},{979,104},{982,104},{982,105},{977,105},{979,105},{982,106},{983,106},{982,107},{983,107},{982,108},{986,109},{986,108},{980,108},{980,109},{985,109},{985,108},{982,109},{981,109},{981,108},{980,106},{980,105},{979,106},{981,106},{986,110},{987,111},{987,110},{987,109},{985,111},{983,112},{979,113},{980,113},{985,120},{986,120},{935,199},{983,113},{982,112},{986,113},{985,113},{980,114},{983,114},{982,114},{981,114},{982,113},{983,110},{986,111},{987,115},{983,116},{983,115},{985,116},{984,116},{984,118},{985,118},{981,118},{977,118},{976,118},{987,119},{987,120},{977,120},{978,120},{979,120},{981,120},{980,120},{980,119},{983,119},{982,119},{983,120},{985,119},{983,118},{980,117},{980,118},{981,116},{984,119},{976,119},{977,119},{982,118},{985,114},{985,115},{980,115},{944,183},{981,115},{979,109},{979,108},{981,110},{983,108},{984,109},{982,110},{984,110},{985,110},{977,121},{976,120},{976,121},{944,181},{945,181},{942,185},{979,121},{932,140},{934,142},{934,141},{937,148},{937,149},{977,152},{963,168},{963,169},{972,169},{977,166},{976,166},{941,180},{941,181},{939,184},{938,186},{938,187},{940,187},{967,173},{968,174},{946,176},{967,174},{968,175},{937,188},{937,187},{935,189},{936,189},{941,189},{941,188},{940,188},{939,188},{940,190},{941,190},{940,191},{935,195},{936,195},{936,194},{938,193},{937,193},{937,194},{939,193},{940,193},{941,193},{922,211},{923,210},{923,209},{924,209},{927,206},{926,207},{925,207},{926,208},{933,204},{933,203},{928,204},{927,204},{929,204},{931,204},{930,204},{931,205},{928,205},{938,195},{939,195},{935,196},{937,196},{936,196},{937,195},{938,197},{935,197},{937,197},{936,197},{937,199},{936,199},{947,163},{935,200},{927,202},{930,202},{929,202},{929,203},{931,202},{930,200},{930,199},{930,198},{929,201},{931,200},{931,201},{933,198},{932,198},{931,199},{930,201},{934,200},{933,201},{932,201},{932,200},{933,200},{933,202},{982,128},{932,202},{934,202},{934,201},{934,198},{935,198},{936,198},{938,198},{937,198},{938,199},{934,197},{983,128},{983,129},{932,203},{928,203},{950,157},{951,157},{943,159},{951,158},{951,159},{986,131},{948,158},{948,159},{945,159},{953,160},{947,160},{953,159},{952,159},{951,160},{977,155},{976,156},{952,157},{953,157},{942,164},{976,165},{977,165},{942,165},{943,165},{960,164},{959,164},{963,165},{975,165},{953,161},{983,130},{982,136},{943,160},{948,160},{948,161},{949,161},{951,161},{952,161},{952,160},{947,161},{946,160},{946,161},{945,162},{945,163},{946,162},{945,161},{951,162},{976,163},{961,163},{960,162},{959,162},{960,163},{961,164},{959,163},{944,158},{947,162},{954,161},{953,162},{954,162},{946,163},{947,164},{975,162},{974,164},{976,164},{962,165},{962,166},{963,164},{984,127},{987,128},{982,150},{986,143},{991,139},{992,133},{991,131},{994,126},{997,118},{988,107},{986,100},{985,107},{988,110},{988,117},{982,138},{982,135},{981,138},{981,142},{978,147},{977,158},{976,161},{976,160},{977,160},{977,164},{978,164},{978,163},{979,163},{974,165},{974,167},{973,171},{971,171},{966,173},{969,173},{969,170},{968,167},{964,165},{963,166},{965,166},{962,168},{964,169},{965,169},{961,168},{962,164},{958,161},{957,161},{957,163},{955,157},{953,158},{954,159},{952,158},{950,158},{951,163},{947,159},{946,159},{949,162},{948,164},{948,166},{947,165},{947,166},{947,167},{942,160},{941,187},{942,187},{943,187},{940,189},{941,194},{939,192},{935,194},{938,192},{940,194},{939,194},{940,195},{931,203},{932,204},{931,206},{930,206},{930,203},{928,202},{928,206},{925,208},{927,203},{922,212},{924,215},{927,213},{927,221},{929,219},{932,223},{931,230},{934,231},{934,237},{933,241},{942,239},{947,250},{946,252},{946,254},{952,261},{951,266},{961,272},{966,274},{971,271},{969,276},{974,279},{973,282},{976,285},{981,282},{983,275},{984,277},{987,276},{988,267},{987,261},{986,261},{987,259},{985,258},{984,256},{982,256},{981,254},{977,251},{978,248},{976,247},{975,244},{978,243},{975,239},{976,238},{981,241},{989,242},{987,240},{989,236},{989,232},{995,231},{996,229},{993,228},{994,225},{992,222},{1000,221},{1000,217},{1002,217},{1002,214},{1007,215},{1011,218},{1012,216},{1007,213},{1005,209},{1006,209},{1003,207},{1001,204},{1000,205},{997,203},{995,204},{995,201},{991,201},{989,197},{983,197},{980,198},{977,189},{978,186},{973,186},{975,183},{976,183},{977,178},{985,169},{987,163},{989,164},{988,161},{986,161},{986,154},{982,152},{986,128},{985,128},{979,128},{978,128},{982,137},{979,138},{979,139},{983,131},{985,131},{985,132},{986,132},{986,129},{982,129},{985,129},{983,132},{982,132},{978,143},{978,144},{978,141},{978,142},{977,151}}}, + {"Indian/Antananarivo",145,{{436,-213},{437,-211},{498,-171},{500,-167},{499,-169},{448,-162},{449,-162},{463,-160},{463,-159},{464,-160},{465,-160},{464,-159},{465,-159},{461,-159},{460,-158},{459,-157},{432,-221},{442,-252},{432,-222},{433,-222},{470,-155},{470,-156},{442,-204},{444,-201},{444,-200},{445,-199},{444,-199},{444,-196},{445,-196},{445,-195},{444,-198},{444,-197},{444,-193},{483,-138},{483,-137},{482,-137},{478,-136},{484,-135},{485,-135},{483,-135},{483,-134},{485,-134},{485,-133},{482,-133},{481,-133},{476,-146},{476,-145},{476,-144},{477,-141},{478,-141},{478,-140},{478,-139},{483,-132},{484,-134},{482,-134},{486,-130},{485,-130},{486,-129},{486,-128},{485,-129},{499,-129},{498,-128},{487,-128},{487,-127},{497,-127},{496,-127},{489,-126},{488,-126},{496,-126},{487,-125},{487,-124},{496,-124},{495,-124},{490,-122},{494,-122},{494,-121},{491,-121},{490,-121},{486,-204},{471,-250},{452,-256},{440,-250},{437,-243},{436,-237},{438,-235},{434,-229},{432,-223},{435,-213},{437,-213},{445,-200},{439,-176},{444,-167},{444,-162},{450,-162},{452,-159},{453,-161},{453,-160},{456,-159},{456,-161},{457,-158},{462,-157},{466,-160},{463,-158},{465,-155},{469,-152},{471,-153},{469,-156},{472,-155},{471,-151},{475,-147},{474,-151},{475,-151},{478,-143},{480,-141},{480,-144},{481,-142},{479,-136},{481,-135},{488,-134},{490,-129},{489,-125},{492,-119},{492,-121},{492,-123},{496,-128},{499,-130},{502,-149},{505,-153},{502,-160},{500,-159},{499,-154},{496,-156},{497,-161},{499,-162},{497,-167},{498,-168},{496,-168},{495,-171},{494,-182},{472,-154},{471,-155},{480,-140},{480,-139},{498,-155},{478,-142}}}, + {"America/Grand_Turk",36,{{-717,212},{-712,212},{-713,212},{-717,213},{-716,213},{-712,213},{-711,214},{-711,213},{-712,214},{-716,215},{-711,215},{-712,215},{-715,215},{-715,216},{-724,217},{-725,216},{-725,217},{-717,217},{-715,217},{-716,217},{-716,218},{-721,218},{-721,219},{-718,219},{-719,219},{-720,220},{-719,218},{-720,219},{-718,217},{-719,217},{-723,219},{-723,218},{-723,217},{-717,218},{-718,218},{-716,216}}}, + {"Asia/Khandyga",62,{{1403,624},{1403,621},{1400,620},{1396,615},{1383,611},{1383,610},{1382,609},{1384,607},{1382,605},{1382,597},{1380,598},{1376,597},{1375,595},{1367,593},{1358,595},{1351,591},{1335,593},{1328,591},{1328,589},{1324,588},{1317,593},{1319,600},{1323,603},{1325,607},{1332,609},{1330,613},{1331,615},{1329,616},{1340,618},{1349,614},{1354,616},{1351,617},{1358,622},{1353,626},{1342,628},{1339,631},{1332,631},{1332,633},{1321,637},{1328,642},{1327,646},{1331,646},{1328,649},{1329,651},{1343,654},{1348,657},{1356,658},{1360,661},{1365,662},{1402,658},{1400,656},{1404,655},{1398,654},{1394,650},{1404,645},{1400,644},{1406,640},{1405,637},{1406,636},{1397,634},{1396,632},{1396,629}}}, + {"America/North_Dakota/Center",5,{{-1010,472},{-1009,470},{-1018,470},{-1018,472},{-1011,473}}}, + {"Pacific/Guam",4,{{1446,134},{1449,137},{1450,136},{1447,132}}}, + {"Pacific/Pitcairn",5,{{-1301,-251},{-1248,-247},{-1283,-243},{-1283,-244},{-1307,-239}}}, + {"Pacific/Marquesas",29,{{-1386,-104},{-1386,-105},{-1387,-105},{-1388,-100},{-1391,-100},{-1391,-99},{-1390,-99},{-1389,-98},{-1392,-98},{-1390,-97},{-1400,-95},{-1389,-94},{-1400,-94},{-1401,-95},{-1401,-94},{-1401,-93},{-1396,-89},{-1395,-89},{-1400,-88},{-1400,-89},{-1402,-90},{-1402,-88},{-1406,-87},{-1407,-80},{-1406,-80},{-1407,-81},{-1406,-79},{-1404,-79},{-1404,-78}}}, + {"Africa/Cairo",111,{{355,238},{356,238},{354,243},{353,243},{362,236},{358,238},{357,232},{356,232},{354,244},{352,247},{352,246},{351,247},{350,250},{340,267},{340,268},{339,272},{340,272},{339,273},{340,275},{339,275},{337,275},{338,275},{339,276},{338,276},{337,278},{336,278},{336,277},{338,277},{337,276},{337,277},{315,220},{315,222},{313,220},{250,220},{250,293},{247,301},{250,308},{249,314},{251,317},{253,315},{259,316},{273,314},{274,312},{279,312},{279,311},{284,311},{291,308},{301,313},{303,313},{304,315},{310,316},{305,314},{307,314},{311,315},{316,314},{319,315},{322,313},{318,313},{321,312},{321,311},{323,311},{324,312},{326,311},{329,311},{327,310},{342,313},{349,295},{343,277},{332,286},{332,290},{327,294},{326,300},{323,296},{326,293},{329,286},{335,276},{338,272},{339,267},{351,245},{358,239},{355,239},{356,231},{352,228},{350,229},{347,223},{342,222},{340,218},{336,217},{332,220},{334,311},{333,311},{331,311},{333,312},{334,312},{335,311},{322,311},{331,312},{332,312},{322,312},{323,312},{323,313},{320,314},{321,313},{320,313},{319,313},{319,314},{308,315},{309,315},{310,315},{308,314},{320,312}}}, + {"America/Cambridge_Bay",1460,{{-1040,681},{-1064,734},{-1065,734},{-1057,730},{-1068,682},{-1142,681},{-1142,682},{-1128,681},{-983,681},{-984,681},{-987,681},{-1080,681},{-1081,681},{-1072,681},{-990,681},{-1129,681},{-1130,681},{-1139,682},{-1139,681},{-1086,681},{-1087,681},{-1068,681},{-1092,681},{-1092,682},{-1123,681},{-1123,682},{-1122,682},{-1122,681},{-1129,682},{-1127,682},{-986,682},{-984,682},{-1121,682},{-1046,682},{-1103,682},{-1088,682},{-963,682},{-964,682},{-1118,682},{-1117,682},{-1075,682},{-1087,682},{-1074,682},{-1124,682},{-1128,682},{-1120,682},{-1093,681},{-1093,682},{-1075,681},{-1076,682},{-1086,682},{-985,682},{-988,682},{-1073,682},{-1119,682},{-1098,681},{-1098,682},{-1095,683},{-1097,682},{-987,682},{-1091,682},{-1090,682},{-1147,682},{-1134,682},{-1133,682},{-1133,683},{-1132,682},{-1132,683},{-902,683},{-901,683},{-986,683},{-1076,683},{-963,683},{-1091,683},{-1044,682},{-966,682},{-1095,682},{-1067,682},{-1070,682},{-1069,682},{-1085,682},{-1072,682},{-1072,683},{-1090,683},{-1119,683},{-969,683},{-985,683},{-987,683},{-1045,682},{-1046,683},{-1045,683},{-1115,682},{-1115,683},{-1114,683},{-1049,683},{-988,683},{-989,683},{-1048,683},{-1047,683},{-1094,683},{-970,683},{-1150,680},{-1106,680},{-1105,680},{-1133,680},{-967,680},{-967,681},{-989,680},{-989,681},{-1091,680},{-1091,681},{-1100,681},{-1102,680},{-1103,681},{-1101,681},{-1085,680},{-1084,681},{-985,681},{-1043,681},{-966,681},{-1090,681},{-1089,681},{-1083,681},{-1033,681},{-1074,681},{-1085,681},{-1136,680},{-1135,680},{-1092,680},{-988,680},{-1104,680},{-1103,680},{-1093,680},{-1140,681},{-1095,681},{-986,681},{-988,681},{-991,681},{-1099,682},{-1099,681},{-1045,681},{-1113,683},{-1118,683},{-1078,683},{-1075,683},{-971,683},{-1051,683},{-1050,683},{-1000,683},{-1116,683},{-1069,683},{-1070,683},{-1070,684},{-958,683},{-1117,683},{-990,683},{-1077,683},{-1051,684},{-982,684},{-982,683},{-1052,683},{-1050,684},{-991,684},{-990,684},{-981,684},{-1089,684},{-1090,684},{-1069,684},{-1068,683},{-1053,684},{-1052,684},{-1008,684},{-1002,683},{-1001,684},{-1001,683},{-1049,684},{-898,690},{-979,684},{-980,684},{-1006,684},{-1063,684},{-1063,685},{-980,685},{-992,684},{-983,684},{-984,684},{-970,684},{-971,684},{-1113,684},{-988,684},{-977,684},{-978,684},{-1112,684},{-1061,684},{-1060,684},{-1055,684},{-1111,684},{-1078,668},{-1079,668},{-1081,668},{-1081,669},{-1080,669},{-1072,669},{-1073,669},{-1074,670},{-1073,670},{-1079,671},{-1075,669},{-1079,669},{-1078,669},{-1078,670},{-1079,670},{-1081,670},{-1080,670},{-954,672},{-953,672},{-959,673},{-960,673},{-961,673},{-956,672},{-956,673},{-955,672},{-953,673},{-1078,671},{-1077,671},{-1078,672},{-1079,672},{-1077,672},{-963,675},{-963,676},{-1075,671},{-1076,672},{-1073,671},{-960,674},{-1082,674},{-1077,673},{-961,674},{-956,675},{-1081,674},{-1080,674},{-1077,674},{-962,674},{-962,675},{-1129,677},{-1130,677},{-962,676},{-961,676},{-1084,676},{-1085,676},{-1083,676},{-1082,675},{-1082,676},{-1081,675},{-1083,675},{-961,675},{-1084,675},{-1080,677},{-1079,676},{-1081,677},{-1076,673},{-962,673},{-1079,675},{-1079,673},{-1131,677},{-1132,677},{-957,677},{-957,678},{-992,677},{-1014,677},{-1015,677},{-1022,677},{-1095,677},{-1090,677},{-1018,677},{-1138,677},{-1138,678},{-991,677},{-991,678},{-1011,677},{-1011,678},{-1119,677},{-1119,678},{-993,678},{-992,678},{-1017,678},{-1144,678},{-1143,678},{-1137,678},{-1018,678},{-1134,678},{-1091,677},{-1091,678},{-990,678},{-1116,677},{-1117,678},{-1118,678},{-1019,678},{-1093,678},{-1115,678},{-1116,678},{-1006,678},{-1090,678},{-1089,678},{-960,678},{-962,678},{-960,679},{-1012,678},{-1125,678},{-1009,678},{-1094,678},{-1092,678},{-1088,678},{-1087,678},{-1021,678},{-1022,678},{-1023,678},{-1016,678},{-961,677},{-1089,677},{-1128,677},{-1088,677},{-1004,679},{-1005,679},{-1001,679},{-1002,679},{-1003,679},{-1155,679},{-1147,679},{-1146,679},{-1145,679},{-1144,679},{-1029,679},{-1143,680},{-1142,679},{-1141,680},{-1141,679},{-1129,680},{-1128,680},{-1128,679},{-1131,679},{-1130,679},{-1031,679},{-1136,679},{-1135,679},{-1137,679},{-1143,679},{-1078,679},{-1132,679},{-1091,679},{-1092,679},{-1040,679},{-1040,680},{-1077,679},{-1129,679},{-1094,679},{-1093,679},{-1151,679},{-1149,679},{-1148,679},{-1007,679},{-1008,679},{-1079,679},{-1097,679},{-1082,679},{-1006,679},{-1083,679},{-1100,679},{-1014,679},{-1028,679},{-1138,679},{-1139,679},{-1022,679},{-1027,679},{-1086,679},{-1098,679},{-1080,679},{-1015,679},{-1099,679},{-1140,679},{-1111,679},{-1108,680},{-1109,679},{-1030,679},{-1084,679},{-1133,679},{-1081,679},{-1081,680},{-1007,678},{-1079,680},{-1078,680},{-1090,679},{-1088,679},{-1150,678},{-1151,678},{-1145,678},{-1008,678},{-1025,678},{-1026,678},{-1142,678},{-1140,678},{-1005,678},{-1146,678},{-995,678},{-1139,678},{-995,679},{-997,678},{-996,678},{-1000,679},{-998,678},{-998,679},{-997,679},{-999,679},{-1081,678},{-1096,679},{-1097,678},{-1089,679},{-1140,680},{-1137,680},{-1138,680},{-987,680},{-990,680},{-1126,680},{-1090,680},{-1029,680},{-1080,680},{-1127,680},{-1125,680},{-1124,680},{-1095,679},{-1094,680},{-1031,680},{-1032,680},{-1084,680},{-1095,680},{-1088,728},{-1087,728},{-1079,681},{-1077,681},{-1082,721},{-1084,722},{-1085,722},{-1081,722},{-1082,722},{-952,722},{-952,723},{-1006,721},{-1006,722},{-954,722},{-944,720},{-952,721},{-1081,721},{-1080,721},{-1077,721},{-1076,721},{-1077,720},{-1078,721},{-1051,725},{-1052,725},{-1084,725},{-1085,725},{-1084,726},{-1085,726},{-1091,727},{-1090,727},{-1089,727},{-1092,728},{-1093,728},{-1094,728},{-1089,728},{-1090,728},{-1005,732},{-1006,732},{-1052,726},{-1053,726},{-971,726},{-1086,726},{-1052,727},{-1053,727},{-1054,727},{-1008,728},{-1010,727},{-1011,727},{-1053,728},{-1005,729},{-1008,729},{-1052,728},{-1010,728},{-1005,728},{-1006,728},{-1004,728},{-1011,728},{-1018,730},{-1017,730},{-1010,730},{-1009,730},{-1003,731},{-1020,731},{-1019,731},{-1001,730},{-1002,730},{-1076,736},{-1079,735},{-1080,736},{-1075,736},{-1047,753},{-1041,754},{-1036,752},{-1042,750},{-1049,751},{-1089,756},{-1090,756},{-1020,755},{-1026,755},{-1028,756},{-1021,757},{-1024,758},{-1020,759},{-1069,758},{-1034,759},{-1037,758},{-1038,759},{-1033,759},{-1020,760},{-1026,758},{-1034,758},{-1029,759},{-1092,769},{-1093,769},{-1090,769},{-1037,770},{-1036,771},{-1036,770},{-1028,761},{-1023,760},{-1039,759},{-1035,760},{-1036,760},{-1034,760},{-1020,762},{-1022,763},{-1020,764},{-1021,763},{-1089,768},{-1090,768},{-1039,760},{-1045,762},{-1031,763},{-1025,762},{-1039,766},{-1034,765},{-1030,764},{-1043,763},{-1047,766},{-1094,749},{-1087,749},{-1088,750},{-1087,750},{-1088,768},{-1084,767},{-1087,766},{-1084,765},{-1086,764},{-1080,763},{-1084,761},{-1076,760},{-1080,758},{-1072,759},{-1068,757},{-1068,760},{-1063,761},{-1056,759},{-1053,757},{-1057,755},{-1056,754},{-1060,751},{-1084,749},{-1088,751},{-1100,748},{-1100,755},{-1089,755},{-1088,756},{-1100,759},{-1093,761},{-1100,762},{-1100,765},{-1093,768},{-1038,771},{-1039,771},{-1021,779},{-1020,777},{-1025,778},{-1024,779},{-1100,781},{-1096,781},{-1095,780},{-1100,779},{-1042,772},{-1040,772},{-1044,771},{-1045,771},{-1056,730},{-1057,775},{-1061,777},{-1054,777},{-1043,772},{-1052,772},{-1097,786},{-1093,786},{-1092,785},{-1094,783},{-1100,783},{-1100,787},{-1040,789},{-1039,789},{-1036,786},{-1035,786},{-1037,794},{-1029,793},{-1028,792},{-1055,793},{-1052,794},{-1051,794},{-1053,794},{-1031,782},{-1029,783},{-1028,782},{-1033,781},{-1054,729},{-1055,729},{-1052,729},{-1054,793},{-1031,793},{-1026,791},{-1027,790},{-1026,789},{-1020,791},{-1020,783},{-1047,783},{-1050,785},{-1035,785},{-1034,786},{-1040,786},{-1033,787},{-1042,788},{-1038,789},{-1041,790},{-1050,788},{-1047,790},{-1056,790},{-1041,794},{-1042,794},{-1095,728},{-1096,729},{-1095,729},{-1090,729},{-1088,729},{-1087,729},{-1082,732},{-1081,732},{-1066,732},{-1063,733},{-1062,733},{-1064,732},{-1061,732},{-1053,729},{-1058,730},{-1060,731},{-1061,731},{-1059,731},{-1023,731},{-1022,731},{-1060,732},{-1062,732},{-1063,732},{-1063,731},{-1055,730},{-1070,733},{-1074,733},{-1075,733},{-1004,687},{-1143,689},{-1144,689},{-1145,689},{-1064,689},{-989,689},{-1024,689},{-939,689},{-938,689},{-1001,689},{-900,689},{-1068,735},{-1070,735},{-1065,737},{-1054,738},{-1044,735},{-1047,732},{-1053,730},{-1064,733},{-1052,685},{-974,685},{-899,685},{-900,685},{-1110,685},{-1109,685},{-974,686},{-975,685},{-976,685},{-1060,685},{-1011,685},{-1010,685},{-981,685},{-981,686},{-977,685},{-977,686},{-1109,686},{-980,686},{-978,686},{-935,686},{-1146,688},{-1147,688},{-900,687},{-1044,689},{-990,690},{-989,690},{-937,689},{-995,689},{-995,690},{-900,690},{-899,690},{-899,689},{-996,690},{-901,690},{-944,690},{-938,690},{-937,690},{-902,690},{-1005,687},{-1001,687},{-956,687},{-947,687},{-947,688},{-946,687},{-904,688},{-905,688},{-987,688},{-1007,688},{-1008,688},{-983,688},{-1027,688},{-1028,688},{-1002,688},{-988,688},{-1026,688},{-1026,689},{-984,689},{-1008,689},{-900,688},{-1001,688},{-1002,689},{-1027,689},{-1024,688},{-1007,689},{-946,689},{-945,689},{-1006,688},{-1006,690},{-1004,691},{-1142,687},{-1140,686},{-1141,686},{-900,686},{-899,687},{-899,686},{-1054,686},{-1054,687},{-1053,687},{-1008,686},{-1009,686},{-1008,687},{-1055,687},{-1006,687},{-1002,687},{-1138,686},{-1139,686},{-1137,686},{-1057,686},{-1021,686},{-1022,686},{-1007,686},{-1106,685},{-1105,686},{-1108,686},{-1053,686},{-1059,686},{-1060,686},{-1103,686},{-979,686},{-1061,686},{-1106,686},{-1104,686},{-1051,685},{-1052,686},{-981,687},{-980,687},{-898,688},{-1018,687},{-1018,686},{-1023,687},{-1019,688},{-1017,688},{-1135,685},{-957,685},{-1123,685},{-958,685},{-1122,685},{-1061,685},{-993,685},{-994,685},{-1008,685},{-1121,685},{-992,685},{-956,685},{-1062,684},{-1007,684},{-1007,685},{-982,685},{-979,685},{-983,685},{-985,685},{-986,685},{-1009,685},{-1057,685},{-1058,685},{-991,685},{-973,685},{-1108,685},{-1107,685},{-1111,685},{-1050,685},{-1048,686},{-1044,685},{-1046,684},{-1020,643},{-1104,647},{-1116,655},{-1135,655},{-1220,685},{-1220,697},{-1210,697},{-1203,694},{-1171,689},{-1160,688},{-1163,690},{-1156,690},{-1139,684},{-1140,682},{-1150,683},{-1152,682},{-1151,680},{-1157,679},{-1152,678},{-1100,680},{-1096,677},{-1097,677},{-1088,674},{-1087,676},{-1085,673},{-1083,673},{-1083,674},{-1080,673},{-1086,672},{-1072,663},{-1077,668},{-1076,670},{-1076,671},{-1077,670},{-1076,668},{-1074,668},{-1071,668},{-1074,671},{-1071,671},{-1075,672},{-1076,675},{-1080,678},{-1076,679},{-1063,682},{-1065,682},{-1064,683},{-1057,684},{-1056,686},{-1066,685},{-1064,685},{-1065,684},{-1065,683},{-1071,683},{-1079,683},{-1084,683},{-1088,683},{-1084,686},{-1062,689},{-1056,687},{-1053,685},{-1054,685},{-1047,681},{-1045,680},{-1041,679},{-1034,682},{-1006,677},{-984,677},{-983,678},{-983,682},{-987,684},{-975,684},{-964,683},{-968,681},{-959,683},{-963,677},{-965,675},{-962,672},{-956,674},{-958,672},{-951,673},{-954,675},{-953,675},{-955,681},{-947,681},{-933,686},{-937,686},{-936,688},{-939,690},{-938,691},{-941,689},{-941,688},{-946,688},{-946,690},{-940,692},{-943,692},{-943,693},{-935,694},{-938,692},{-933,694},{-936,694},{-934,695},{-935,695},{-942,694},{-946,696},{-945,697},{-948,696},{-956,698},{-958,697},{-965,701},{-965,704},{-962,706},{-958,705},{-960,706},{-958,707},{-966,708},{-963,711},{-965,711},{-963,712},{-965,713},{-960,714},{-955,713},{-954,714},{-955,715},{-952,715},{-959,716},{-952,717},{-952,718},{-947,718},{-946,719},{-952,720},{-945,720},{-944,719},{-946,718},{-943,718},{-944,717},{-942,718},{-937,718},{-938,717},{-929,714},{-928,709},{-930,709},{-921,706},{-923,705},{-920,704},{-921,703},{-917,704},{-917,702},{-915,702},{-920,701},{-923,703},{-926,701},{-919,700},{-929,697},{-927,697},{-925,697},{-930,697},{-923,697},{-918,695},{-915,697},{-912,697},{-916,695},{-910,695},{-913,694},{-907,696},{-908,695},{-903,695},{-907,695},{-906,694},{-909,693},{-914,694},{-904,689},{-906,688},{-906,685},{-903,684},{-906,683},{-898,686},{-897,686},{-897,690},{-893,692},{-890,693},{-890,670},{-1020,670},{-899,691},{-900,691},{-901,694},{-902,694},{-901,691},{-903,691},{-902,692},{-902,691},{-901,692},{-900,692},{-904,692},{-905,692},{-902,693},{-903,692},{-904,693},{-903,693},{-901,693},{-905,696},{-904,696},{-903,694},{-904,694},{-902,695},{-901,695},{-904,695},{-905,695},{-902,696},{-903,696},{-905,701},{-906,702},{-908,702},{-907,702},{-918,704},{-919,705},{-920,705},{-921,705},{-926,707},{-926,708},{-925,708},{-925,707},{-1004,708},{-1005,708},{-1006,708},{-1036,707},{-1004,707},{-1003,708},{-1003,707},{-1035,707},{-1001,705},{-1002,705},{-1001,706},{-1007,706},{-1002,706},{-1003,706},{-1002,707},{-1032,707},{-1031,706},{-1032,706},{-1035,706},{-1034,706},{-1004,705},{-1005,705},{-1003,705},{-1007,707},{-1004,706},{-1005,707},{-1006,707},{-1033,707},{-1034,707},{-1014,702},{-1012,702},{-1011,702},{-920,703},{-1021,703},{-1021,704},{-1007,704},{-1020,704},{-1022,704},{-1001,704},{-1002,704},{-1015,703},{-1008,703},{-1009,703},{-1007,703},{-922,699},{-921,699},{-1008,700},{-1009,699},{-918,701},{-919,701},{-924,701},{-923,701},{-1009,709},{-1008,709},{-1046,711},{-1082,720},{-967,713},{-954,715},{-1044,717},{-968,717},{-969,717},{-983,717},{-964,713},{-963,713},{-965,712},{-966,712},{-966,713},{-968,713},{-989,713},{-990,713},{-989,714},{-1080,718},{-941,718},{-1074,718},{-1075,718},{-966,718},{-984,718},{-1081,719},{-940,719},{-941,719},{-941,720},{-943,720},{-942,720},{-953,719},{-955,718},{-970,717},{-970,718},{-968,718},{-955,717},{-953,718},{-954,718},{-953,717},{-1078,720},{-1081,720},{-1080,720},{-939,722},{-940,720},{-952,724},{-971,727},{-972,726},{-969,727},{-963,725},{-967,723},{-965,721},{-968,720},{-965,720},{-967,719},{-965,718},{-975,716},{-982,717},{-984,717},{-982,719},{-983,719},{-985,717},{-980,715},{-987,713},{-992,714},{-994,716},{-1018,723},{-1019,725},{-1027,728},{-1005,730},{-1002,729},{-1003,729},{-1000,729},{-1002,731},{-1006,731},{-1137,691},{-1059,691},{-1003,691},{-1000,691},{-1060,691},{-1061,691},{-999,691},{-998,691},{-961,691},{-961,692},{-1059,690},{-1058,690},{-1000,690},{-1052,691},{-1007,690},{-1150,693},{-1150,692},{-1147,692},{-1139,692},{-1140,692},{-1143,693},{-1142,693},{-1170,696},{-1171,696},{-1138,692},{-1137,692},{-1136,692},{-1031,692},{-908,692},{-907,692},{-1016,692},{-1015,692},{-1017,691},{-907,691},{-906,692},{-991,692},{-909,696},{-910,696},{-968,696},{-1002,690},{-1001,692},{-980,695},{-983,696},{-983,697},{-980,699},{-977,699},{-973,697},{-975,697},{-974,696},{-962,693},{-962,691},{-961,690},{-960,693},{-958,689},{-952,689},{-966,685},{-985,688},{-992,690},{-990,689},{-992,688},{-984,693},{-986,694},{-984,695},{-985,696},{-909,692},{-937,692},{-1016,693},{-992,693},{-957,693},{-958,693},{-938,693},{-956,693},{-907,693},{-908,693},{-910,692},{-911,693},{-910,693},{-992,692},{-993,692},{-993,693},{-994,693},{-910,697},{-1015,696},{-1015,697},{-916,697},{-974,697},{-969,697},{-968,697},{-916,696},{-912,696},{-911,697},{-955,696},{-973,696},{-921,696},{-922,696},{-911,696},{-1066,694},{-1012,695},{-1013,695},{-1014,695},{-957,694},{-1016,694},{-1017,694},{-1017,695},{-940,694},{-941,694},{-939,694},{-1016,695},{-905,693},{-1029,693},{-955,693},{-958,694},{-1012,694},{-1013,694},{-1030,694},{-1029,694},{-963,694},{-1011,694},{-1021,697},{-1022,697},{-961,695},{-961,694},{-967,696},{-962,696},{-1012,696},{-1010,695},{-1009,695},{-1029,695},{-1030,695},{-1028,695},{-968,695},{-915,695},{-919,695},{-911,695},{-909,695},{-1031,695},{-1031,696},{-906,696},{-908,696},{-922,697},{-956,695},{-958,696},{-960,694},{-953,695},{-955,694},{-954,694},{-906,695},{-1030,696},{-954,696},{-953,696},{-917,696},{-969,696},{-913,697},{-924,697},{-1019,697},{-1017,697},{-959,698},{-914,698},{-913,698},{-925,698},{-914,697},{-924,698},{-923,698},{-974,698},{-973,698},{-926,697},{-1014,698},{-917,698},{-917,699},{-918,699},{-916,699},{-973,699},{-975,700},{-973,700},{-974,699},{-914,699},{-915,699},{-972,699},{-915,698},{-918,698},{-972,698},{-916,698},{-922,698},{-923,699},{-1080,733},{-1070,732},{-1067,733},{-1056,729},{-1049,719},{-1043,716},{-1043,714},{-1045,713},{-1044,712},{-1029,705},{-1030,707},{-1028,705},{-1016,702},{-1015,701},{-1010,702},{-1009,697},{-1013,697},{-1014,699},{-1020,700},{-1021,698},{-1022,699},{-1023,698},{-1027,698},{-1025,697},{-1025,696},{-1035,697},{-1032,696},{-1031,694},{-1030,693},{-1032,692},{-1032,691},{-1023,695},{-1019,694},{-1022,694},{-1020,693},{-1022,693},{-1022,692},{-1017,692},{-1018,690},{-1029,688},{-1044,690},{-1051,689},{-1052,690},{-1049,691},{-1064,692},{-1063,694},{-1066,695},{-1074,690},{-1086,689},{-1085,689},{-1090,687},{-1132,685},{-1130,685},{-1137,688},{-1135,690},{-1134,692},{-1165,694},{-1166,696},{-1169,696},{-1172,700},{-1130,700},{-1129,698},{-1124,698},{-1123,699},{-1123,700},{-1100,700},{-1100,725},{-1098,725},{-1100,727},{-1097,727},{-1100,730},{-1090,726},{-1084,719},{-1083,717},{-1078,716},{-1078,717},{-1073,719},{-1078,723},{-1077,723},{-1079,724},{-1077,724},{-1079,725},{-1078,726},{-1082,731},{-1079,732},{-1081,733}}}, + {"Asia/Bahrain",15,{{508,256},{508,257},{508,255},{507,256},{504,262},{504,261},{508,258},{506,262},{506,263},{507,263},{507,262},{506,260},{506,258},{505,262},{506,261}}}, + {"America/Kentucky/Monticello",4,{{-848,370},{-846,368},{-850,366},{-851,369}}}, + {"Arctic/Longyearbyen",374,{{-80,712},{-80,710},{-91,709},{-83,711},{191,745},{193,745},{191,743},{188,745},{165,765},{166,765},{225,783},{224,783},{122,786},{122,785},{208,786},{250,765},{255,767},{256,767},{249,764},{217,769},{228,772},{229,772},{220,770},{219,770},{218,770},{220,772},{146,777},{147,777},{148,777},{149,776},{231,773},{232,773},{233,773},{230,773},{214,773},{225,774},{224,774},{237,778},{244,778},{241,778},{243,777},{239,776},{241,776},{227,772},{226,773},{228,775},{225,776},{209,774},{208,775},{216,779},{208,781},{228,783},{252,778},{205,782},{204,782},{207,782},{206,782},{286,788},{287,788},{288,789},{287,789},{303,790},{302,790},{301,790},{281,788},{279,789},{284,790},{297,789},{266,787},{213,786},{212,786},{212,787},{213,787},{203,786},{202,786},{146,786},{146,787},{215,786},{219,786},{222,784},{210,782},{202,785},{112,787},{119,784},{121,782},{110,785},{105,789},{110,788},{109,788},{147,787},{148,787},{115,787},{116,787},{111,788},{154,788},{153,788},{211,789},{212,789},{217,790},{216,790},{218,790},{211,790},{209,790},{212,790},{204,791},{205,791},{208,791},{201,790},{267,786},{265,787},{264,788},{270,787},{367,802},{368,801},{366,802},{332,802},{324,801},{318,801},{331,802},{179,801},{180,801},{220,801},{221,801},{254,803},{253,803},{239,803},{186,803},{212,803},{260,802},{261,802},{210,802},{188,802},{198,806},{197,806},{207,806},{206,806},{205,807},{208,807},{250,807},{204,808},{203,808},{211,807},{214,807},{213,807},{184,802},{181,803},{187,803},{188,803},{213,803},{215,804},{214,803},{248,803},{247,804},{248,804},{243,804},{241,804},{244,804},{261,804},{261,805},{262,805},{262,804},{260,805},{259,805},{241,805},{240,805},{242,805},{200,805},{201,805},{198,805},{202,805},{203,805},{178,798},{181,797},{176,796},{178,795},{177,794},{183,796},{189,794},{186,793},{189,792},{198,792},{199,790},{215,788},{190,785},{191,782},{189,782},{191,781},{184,780},{185,780},{183,779},{184,778},{183,775},{177,775},{173,771},{171,771},{173,770},{169,768},{172,767},{171,766},{164,766},{163,767},{155,769},{165,770},{152,770},{144,772},{139,775},{162,774},{163,775},{171,778},{168,779},{170,779},{140,777},{138,778},{136,781},{144,780},{142,781},{173,784},{163,785},{169,787},{154,785},{151,786},{155,786},{152,787},{153,787},{150,786},{144,787},{146,785},{144,785},{147,784},{148,784},{130,782},{129,784},{124,785},{132,785},{120,786},{119,788},{113,790},{125,789},{117,791},{121,793},{115,793},{117,792},{112,791},{109,794},{109,795},{107,795},{115,796},{112,797},{117,798},{123,797},{122,798},{125,797},{138,799},{140,798},{124,796},{135,796},{132,795},{136,795},{141,793},{138,795},{147,798},{153,796},{154,794},{158,792},{156,791},{164,789},{159,793},{156,798},{161,799},{159,799},{163,801},{169,799},{195,792},{194,792},{202,793},{212,793},{211,793},{207,793},{206,794},{200,793},{201,793},{199,792},{197,793},{198,793},{136,796},{110,797},{111,797},{108,797},{109,797},{107,797},{109,798},{107,798},{108,798},{114,798},{113,798},{113,799},{116,798},{115,799},{115,798},{114,799},{116,799},{117,799},{133,797},{134,797},{181,799},{181,800},{183,800},{184,800},{180,800},{185,800},{145,800},{144,800},{146,800},{283,801},{280,800},{277,802},{279,802},{182,800},{223,800},{223,801},{224,801},{200,794},{196,794},{197,794},{195,794},{193,796},{194,796},{197,797},{198,797},{250,802},{272,801},{270,800},{271,799},{257,796},{259,795},{258,794},{236,792},{227,793},{228,794},{201,795},{196,796},{211,795},{213,796},{205,797},{217,798},{188,797},{188,800},{189,801},{177,801},{196,801},{190,803},{196,802},{198,802},{197,803},{199,804},{194,804},{196,805},{209,802},{219,803},{216,801},{222,800},{225,800},{226,803},{223,804},{228,803},{228,805},{233,804},{231,804},{233,803},{230,802},{232,801},{244,803},{241,803},{242,804}}}, + {"Australia/Hobart",140,{{1480,-402},{1483,-423},{1482,-423},{1476,-408},{1451,-408},{1450,-408},{1449,-408},{1479,-401},{1481,-407},{1448,-407},{1483,-405},{1450,-407},{1449,-407},{1449,-406},{1447,-406},{1463,-436},{1464,-436},{1465,-436},{1460,-434},{1471,-433},{1480,-432},{1470,-431},{1471,-434},{1476,-430},{1476,-429},{1478,-430},{1478,-429},{1481,-427},{1480,-427},{1481,-426},{1482,-427},{1455,-424},{1478,-401},{1477,-401},{1478,-400},{1479,-403},{1482,-403},{1482,-402},{1483,-402},{1483,-403},{1473,-433},{1473,-435},{1471,-435},{1474,-431},{1475,-431},{1475,-430},{1482,-408},{1483,-410},{1482,-415},{1484,-422},{1482,-422},{1483,-421},{1482,-421},{1482,-420},{1481,-421},{1479,-423},{1480,-425},{1480,-429},{1476,-431},{1477,-429},{1478,-431},{1479,-430},{1474,-428},{1476,-428},{1475,-429},{1474,-429},{1473,-428},{1472,-427},{1473,-431},{1472,-433},{1470,-432},{1470,-433},{1470,-434},{1469,-434},{1470,-435},{1469,-435},{1469,-436},{1468,-436},{1466,-435},{1460,-436},{1459,-434},{1461,-434},{1462,-433},{1460,-433},{1459,-432},{1459,-433},{1458,-433},{1455,-430},{1452,-422},{1455,-425},{1456,-424},{1453,-422},{1452,-420},{1449,-417},{1446,-410},{1453,-407},{1453,-409},{1464,-412},{1468,-411},{1468,-412},{1469,-412},{1470,-413},{1471,-414},{1470,-412},{1474,-410},{1477,-408},{1479,-409},{1479,-407},{1443,-405},{1444,-405},{1480,-404},{1478,-403},{1481,-403},{1483,-400},{1483,-399},{1484,-400},{1479,-397},{1477,-397},{1480,-397},{1480,-396},{1473,-395},{1474,-395},{1473,-394},{1479,-402},{1480,-398},{1480,-403},{1477,-399},{1482,-405},{1482,-406},{1481,-406},{1481,-405},{1448,-404},{1448,-405},{1448,-406},{1447,-405},{1480,-405},{1450,-404},{1449,-405},{1449,-404},{1485,-404}}}, + {"Pacific/Galapagos",55,{{-897,-14},{-897,-13},{-896,-14},{-896,-13},{-903,-13},{-904,-12},{-904,-13},{-905,-13},{-905,-12},{-893,-7},{-894,-9},{-896,-9},{-894,-7},{-901,-8},{-900,-8},{-907,-6},{-906,-6},{-909,-10},{-908,-9},{-900,3},{-899,3},{-907,-4},{-908,6},{-907,6},{-907,5},{-905,3},{-905,4},{-904,3},{-918,14},{-920,17},{-920,16},{-903,-4},{-902,-5},{-903,-5},{-916,-3},{-914,-3},{-914,-5},{-916,-5},{-905,-3},{-906,-3},{-908,-1},{-906,-2},{-906,-4},{-908,-3},{-916,0},{-913,2},{-912,0},{-908,-7},{-912,-11},{-915,-9},{-911,-6},{-914,0},{-902,-7},{-905,-7},{-905,-5}}}, + {"Asia/Oral",33,{{474,504},{477,504},{484,498},{489,500},{486,506},{488,506},{494,509},{494,511},{504,513},{506,516},{508,516},{507,518},{516,515},{519,517},{523,518},{526,515},{534,515},{545,508},{545,505},{544,503},{546,500},{544,496},{536,495},{535,491},{528,490},{526,485},{514,487},{494,480},{465,484},{471,492},{468,493},{469,498},{473,500}}}, + {"America/Dawson_Creek",20,{{-1200,572},{-1200,538},{-1203,540},{-1202,541},{-1205,541},{-1208,545},{-1214,545},{-1216,548},{-1219,549},{-1226,554},{-1230,554},{-1229,556},{-1235,559},{-1236,565},{-1238,569},{-1229,572},{-1219,570},{-1217,572},{-1205,575},{-1204,572}}}, + {"Africa/Mbabane",9,{{318,-259},{321,-260},{321,-268},{320,-268},{320,-273},{315,-273},{310,-270},{308,-266},{313,-257}}}, + {"Asia/Aqtau",127,{{526,461},{500,450},{501,449},{502,449},{502,448},{500,449},{501,450},{503,448},{504,448},{506,448},{506,449},{507,449},{506,450},{508,449},{527,454},{525,455},{526,455},{527,455},{504,450},{503,449},{502,450},{528,457},{527,456},{527,457},{527,460},{510,469},{509,469},{516,468},{525,468},{526,468},{530,466},{529,466},{530,467},{517,467},{516,467},{517,468},{493,462},{492,463},{493,463},{492,464},{493,464},{496,461},{496,462},{560,450},{560,413},{555,413},{548,420},{542,423},{530,421},{524,418},{524,422},{527,426},{526,427},{527,427},{519,428},{516,432},{513,432},{513,435},{508,442},{503,443},{502,446},{515,445},{508,448},{512,450},{514,454},{528,453},{530,454},{529,456},{528,461},{531,464},{529,468},{528,467},{526,469},{523,467},{517,469},{518,468},{515,468},{516,469},{512,470},{502,468},{498,465},{498,464},{496,464},{496,463},{494,463},{494,465},{493,465},{492,465},{485,467},{490,468},{486,474},{484,474},{480,478},{474,478},{474,477},{470,480},{472,481},{471,482},{494,480},{514,487},{526,485},{529,491},{535,491},{536,492},{540,492},{540,488},{549,487},{549,481},{551,479},{550,472},{552,469},{563,465},{566,460},{568,452},{528,460},{530,464},{529,464},{499,465},{499,464},{528,465},{529,465},{497,462},{495,462},{495,463},{498,463},{497,463},{497,464}}}, + {"Pacific/Tongatapu",69,{{-1746,-198},{-1762,-223},{-1750,-215},{-1749,-213},{-1749,-215},{-1750,-214},{-1752,-212},{-1752,-211},{-1751,-211},{-1751,-212},{-1750,-211},{-1753,-210},{-1753,-211},{-1750,-210},{-1752,-210},{-1754,-205},{-1754,-206},{-1747,-205},{-1744,-198},{-1743,-198},{-1750,-212},{-1751,-213},{-1748,-205},{-1745,-204},{-1745,-203},{-1747,-203},{-1748,-203},{-1746,-203},{-1748,-202},{-1746,-201},{-1747,-200},{-1747,-201},{-1748,-200},{-1745,-200},{-1745,-199},{-1748,-199},{-1744,-199},{-1747,-199},{-1747,-198},{-1751,-197},{-1750,-197},{-1750,-198},{-1751,-198},{-1743,-197},{-1750,-196},{-1744,-197},{-1743,-196},{-1745,-196},{-1749,-192},{-1740,-190},{-1740,-188},{-1740,-189},{-1746,-188},{-1747,-188},{-1741,-188},{-1740,-187},{-1741,-187},{-1742,-188},{-1742,-182},{-1743,-180},{-1737,-159},{-1737,-160},{-1738,-160},{-1737,-158},{-1756,-156},{-1757,-156},{-1739,-186},{-1739,-187},{-1740,-186}}}, + {"uninhabited",1993,{{1507,-177},{-1473,-762},{-1474,-761},{-1469,-761},{-1466,-763},{-1500,-767},{-1498,-767},{-1508,-768},{-1505,-767},{-1472,-767},{-1473,-766},{-1469,-766},{-1468,-767},{-686,-678},{-1488,-767},{-1487,-767},{-1484,-767},{-1480,-767},{-1478,-766},{-1474,-767},{-1476,-767},{-1477,-766},{-1476,-766},{-1474,-766},{1668,-770},{1669,-770},{-1469,-770},{-1470,-769},{-1463,-769},{-1464,-770},{-1491,-768},{-1492,-768},{-1482,-768},{-1487,-769},{-1636,-788},{-1614,-789},{-1591,-797},{-1613,-799},{-1635,-796},{-1644,-792},{-1637,-790},{-685,-786},{-671,-784},{-655,-784},{-693,-792},{-708,-791},{1665,-774},{1662,-773},{1668,-772},{1674,-774},{1693,-776},{1684,-777},{1675,-777},{1666,-779},{1668,-777},{1660,-776},{-1500,-775},{-1499,-775},{-1503,-775},{-1501,-775},{1660,-783},{1659,-782},{1667,-783},{1662,-784},{1509,-176},{1674,-781},{1675,-782},{1673,-783},{-800,-776},{-796,-772},{-775,-770},{-768,-772},{-769,-773},{-766,-774},{-767,-777},{-757,-781},{-775,-782},{-796,-781},{-807,-778},{-1490,-775},{-1491,-775},{-1488,-775},{-1489,-775},{-1471,-773},{-1469,-772},{-1470,-773},{-1488,-774},{-1492,-774},{-1496,-773},{-1491,-773},{-1529,-774},{-1528,-774},{-1530,-774},{-1529,-773},{-1528,-773},{-1527,-773},{-1512,-773},{-1508,-772},{-1502,-774},{-1513,-773},{-1530,-773},{-1532,-773},{-1489,-773},{-1488,-772},{-1484,-771},{-1477,-772},{-1475,-774},{-1482,-775},{-1490,-773},{-1490,-772},{-1475,-772},{-1472,-772},{-1470,-772},{-1473,-773},{-1540,-771},{-1538,-772},{-1543,-772},{-1542,-771},{-1492,-770},{-1486,-769},{-1483,-770},{-1489,-771},{-1480,-771},{-1481,-771},{-1479,-771},{-1480,-772},{-1478,-771},{-1476,-771},{-1477,-771},{-1500,-769},{-1496,-769},{-1491,-771},{-1506,-770},{1681,-761},{1683,-761},{1682,-762},{1632,-757},{1631,-757},{1631,-756},{1632,-756},{1631,-758},{-1457,-756},{-1452,-757},{-1460,-756},{1637,-750},{1635,-750},{1635,-749},{1637,-749},{-1403,-747},{-1402,-748},{-1404,-748},{-1433,-755},{-1432,-755},{-1430,-755},{-1432,-756},{-1024,-744},{-1026,-744},{-1025,-744},{-1027,-744},{-1028,-744},{-1025,-745},{-1024,-745},{-1326,-743},{-1324,-743},{-1323,-745},{-1328,-745},{-1321,-741},{-1319,-741},{-1037,-742},{-1036,-742},{-1036,-741},{-1029,-743},{-1030,-743},{-1172,-743},{-1171,-743},{-1167,-742},{-1168,-743},{-1274,-746},{-1278,-744},{-1279,-742},{-1269,-744},{-1269,-746},{-933,-725},{-931,-725},{-931,-726},{-934,-726},{-1319,-743},{-1308,-743},{-1307,-744},{-1311,-746},{-1319,-745},{-1236,-738},{-1235,-737},{-1235,-738},{1668,-737},{1669,-737},{1670,-737},{1669,-738},{-1053,-741},{-1052,-741},{-1027,-741},{-1027,-740},{-1050,-740},{-1026,-740},{-1025,-740},{-1024,-741},{-1025,-741},{-1034,-741},{-1033,-741},{-1035,-741},{-1159,-739},{-1166,-742},{-1177,-742},{-1174,-740},{-1200,-737},{-1186,-738},{-1202,-743},{-1216,-743},{-1226,-742},{-1226,-741},{-1225,-741},{-1226,-740},{-1223,-738},{-1229,-737},{-1225,-736},{1698,-736},{1696,-737},{1694,-736},{1697,-734},{-1025,-736},{-1024,-736},{-1023,-735},{-1023,-736},{-783,-733},{-783,-734},{-784,-733},{-943,-726},{-944,-726},{-718,-693},{-719,-693},{1510,-174},{-780,-734},{-781,-733},{-774,-733},{-775,-734},{-720,-732},{-719,-732},{-719,-733},{-722,-733},{-1249,-732},{-1250,-732},{-1254,-732},{-1248,-733},{-1249,-734},{-1246,-735},{-1251,-737},{-1250,-737},{-1240,-736},{-1234,-740},{-1235,-741},{-1244,-741},{-1257,-738},{-1262,-734},{-1265,-736},{-1269,-734},{-1266,-731},{-1048,-731},{-1044,-732},{-1043,-733},{-1049,-731},{-1261,-730},{-1261,-731},{-1262,-730},{-1264,-730},{-1263,-730},{-939,-728},{-750,-706},{-747,-707},{-742,-705},{-737,-706},{-749,-709},{-756,-707},{1670,-707},{1669,-707},{1671,-707},{-660,-664},{-659,-664},{-607,-707},{-610,-707},{-610,-706},{-607,-705},{-606,-707},{-730,-713},{-729,-713},{-606,-709},{-604,-710},{-610,-710},{-608,-709},{1633,-704},{1634,-704},{1635,-704},{720,-704},{721,-704},{1617,-703},{1618,-702},{1618,-703},{-713,-701},{-712,-701},{-711,-701},{718,-701},{719,-702},{720,-703},{717,-702},{728,-702},{727,-702},{-996,-726},{-1003,-726},{-1004,-725},{-993,-726},{-689,-725},{-688,-725},{-600,-723},{-602,-723},{-604,-722},{-601,-722},{-981,-727},{-983,-727},{-983,-726},{-980,-726},{-611,-726},{-610,-725},{-609,-725},{-610,-726},{-946,-725},{-953,-726},{-952,-726},{-955,-722},{-956,-722},{-1002,-720},{-997,-718},{-995,-720},{-994,-719},{-988,-720},{-992,-718},{-988,-716},{-981,-718},{-985,-719},{-984,-720},{-985,-721},{-980,-721},{-980,-718},{-979,-718},{-975,-719},{-977,-720},{-974,-722},{-971,-718},{-964,-718},{-961,-719},{-971,-721},{-957,-720},{-955,-721},{-965,-722},{-954,-723},{-964,-724},{-959,-724},{-960,-725},{-985,-725},{-990,-725},{-988,-724},{-1001,-724},{-1024,-721},{-1004,-718},{-1002,-719},{-1006,-720},{-736,-732},{-739,-734},{-742,-733},{-739,-732},{-938,-729},{-942,-729},{-942,-728},{-690,-684},{-691,-684},{-755,-731},{-758,-730},{-750,-728},{-743,-731},{-746,-733},{-744,-735},{-746,-737},{-758,-734},{-762,-732},{-927,-732},{-928,-732},{-928,-731},{-964,-732},{-965,-731},{-959,-732},{-961,-731},{-925,-731},{-924,-731},{-934,-732},{-934,-731},{-933,-731},{-875,-729},{-874,-730},{-876,-729},{-919,-730},{-918,-730},{-934,-730},{-933,-730},{-961,-730},{-962,-730},{-961,-729},{-903,-731},{-904,-731},{-929,-731},{-927,-731},{-923,-731},{-920,-731},{-919,-731},{-932,-731},{-930,-731},{-928,-730},{-927,-730},{-900,-729},{-899,-728},{-895,-729},{-898,-731},{-904,-730},{-920,-730},{-958,-729},{-957,-729},{-933,-729},{-781,-726},{-772,-727},{-774,-729},{-785,-732},{-791,-730},{-783,-729},{-909,-726},{-910,-728},{-909,-729},{-913,-732},{-915,-731},{-913,-730},{-913,-728},{-917,-726},{-911,-725},{-719,-700},{-717,-700},{-716,-700},{-720,-701},{-717,-693},{-722,-691},{-706,-688},{-701,-689},{-700,-691},{-701,-692},{-697,-693},{-693,-696},{-691,-702},{-687,-703},{-684,-706},{-681,-716},{-682,-719},{-685,-720},{-684,-721},{-684,-723},{-689,-723},{-691,-725},{-696,-727},{-720,-727},{-727,-725},{-721,-722},{-707,-723},{-710,-721},{-707,-720},{-723,-716},{-725,-717},{-724,-719},{-734,-718},{-730,-719},{-736,-722},{-752,-718},{-757,-715},{-755,-713},{-748,-716},{-747,-716},{-751,-713},{-748,-712},{-735,-716},{-734,-715},{-742,-712},{-736,-711},{-724,-713},{-733,-710},{-713,-708},{-708,-710},{-707,-709},{-716,-705},{-716,-704},{-700,-702},{-719,-698},{-720,-695},{-748,-695},{-745,-698},{-747,-700},{-759,-699},{-761,-697},{385,-697},{383,-697},{384,-697},{-611,-698},{-610,-699},{-614,-699},{-613,-698},{-685,-698},{-723,-694},{-722,-694},{-726,-695},{-728,-694},{-724,-693},{-721,-695},{-676,-691},{-677,-691},{-672,-691},{-671,-691},{397,-690},{396,-690},{-622,-692},{-619,-695},{-620,-697},{-626,-692},{-683,-692},{-678,-692},{-685,-692},{-686,-692},{-685,-691},{-684,-691},{-684,-692},{-906,-687},{-905,-687},{-905,-689},{-907,-689},{-720,-687},{-721,-687},{-678,-686},{1496,-683},{1497,-683},{1498,-684},{1496,-684},{-673,-682},{-673,-681},{-672,-682},{-688,-681},{-689,-681},{-688,-678},{-687,-678},{-670,-678},{-669,-679},{-671,-679},{-674,-679},{-675,-679},{1648,-676},{1646,-676},{1645,-674},{1647,-674},{-677,-672},{-676,-672},{-678,-673},{-678,-672},{-677,-673},{-676,-673},{-678,-674},{492,-674},{491,-674},{595,-674},{594,-673},{596,-673},{-682,-676},{-683,-676},{478,-676},{477,-676},{-679,-676},{-678,-675},{-678,-676},{-671,-675},{-669,-675},{-668,-675},{-672,-675},{-651,-678},{-650,-678},{-684,-677},{-672,-677},{-671,-677},{1511,-174},{-673,-679},{-674,-678},{-671,-678},{-694,-677},{476,-675},{480,-676},{474,-676},{-648,-676},{-646,-676},{-650,-676},{-677,-676},{-673,-676},{-672,-676},{-675,-678},{-678,-677},{1626,-666},{1010,-662},{-672,-664},{-673,-664},{1105,-664},{1105,-665},{1104,-664},{-671,-663},{-670,-664},{-672,-663},{1106,-664},{1559,-174},{1558,-174},{971,-664},{973,-663},{974,-664},{972,-664},{1368,-663},{1369,-663},{-637,-663},{-669,-663},{-670,-663},{-637,-665},{1621,-663},{1622,-663},{1625,-665},{1622,-665},{509,-671},{508,-671},{-680,-667},{-677,-666},{-680,-669},{-677,-671},{-682,-673},{-680,-674},{-681,-676},{-685,-676},{-692,-676},{-685,-668},{588,-671},{589,-671},{587,-671},{586,-671},{504,-671},{503,-671},{-676,-671},{-675,-671},{-678,-670},{-677,-670},{1630,-668},{1629,-667},{1632,-668},{1631,-669},{-669,-669},{-670,-669},{-667,-669},{856,-667},{860,-668},{863,-669},{861,-670},{-668,-669},{-674,-667},{-672,-668},{-676,-669},{-675,-668},{489,-667},{489,-668},{483,-668},{485,-667},{854,-665},{855,-665},{856,-666},{854,-666},{866,-667},{868,-667},{869,-667},{865,-667},{-679,-689},{-567,-632},{-566,-631},{-566,-632},{-565,-630},{-560,-630},{-563,-632},{1509,-174},{-624,-630},{-626,-631},{-627,-631},{-623,-629},{-607,-629},{-605,-629},{-605,-630},{-608,-630},{-600,-626},{-599,-626},{-604,-625},{-604,-624},{-603,-625},{-580,-618},{-580,-619},{-592,-623},{-590,-622},{-588,-623},{-615,-628},{-614,-627},{-612,-627},{-616,-628},{-613,-626},{-612,-626},{1521,-171},{1519,-174},{-582,-619},{-577,-619},{-576,-620},{-583,-622},{-584,-621},{-586,-622},{-585,-622},{-600,-625},{-601,-624},{-596,-625},{-597,-626},{-596,-623},{-594,-624},{-597,-624},{427,-171},{427,-170},{428,-171},{1491,-170},{1492,-169},{1491,-160},{545,-159},{1236,-125},{-598,-626},{-603,-628},{-605,-627},{-604,-626},{-602,-625},{-560,-615},{-559,-615},{-555,-614},{-554,-615},{-556,-615},{-556,-614},{-558,-614},{-559,-614},{-540,-611},{-540,-613},{-542,-612},{-541,-611},{1230,-123},{1231,-123},{1229,-123},{473,-116},{473,-115},{-547,-610},{-546,-611},{-552,-612},{-554,-611},{-451,-608},{-452,-608},{-448,-606},{-460,-606},{-461,-606},{-446,-607},{-445,-607},{-444,-607},{-447,-608},{-448,-607},{-450,-607},{-451,-607},{-451,-606},{-450,-606},{737,-531},{735,-532},{733,-530},{739,-531},{726,-530},{-338,-39},{1116,165},{-457,-605},{-455,-605},{-452,-607},{-457,-607},{-456,-607},{34,-544},{35,-544},{34,-545},{736,-529},{403,-224},{403,-223},{404,-223},{404,-224},{-293,-205},{-288,-205},{-1600,-4},{-1765,2},{-1766,8},{-1625,59},{-1624,59},{-1621,59},{1144,97},{-1627,62},{-1629,62},{-1626,62},{-1624,62},{-1625,62},{-1625,65},{-1623,63},{-1628,66},{1140,100},{1144,102},{-1092,103},{1145,104},{1158,107},{1158,108},{1158,109},{1143,110},{1143,111},{1150,111},{1144,104},{1112,158},{1118,160},{1127,167},{1123,168},{1123,169},{-750,184},{-584,-638},{-589,-644},{-588,-645},{-597,-643},{-607,-647},{-611,-650},{-622,-653},{-617,-655},{-621,-656},{-624,-659},{-619,-662},{-613,-661},{-613,-659},{-610,-660},{-610,-659},{-606,-659},{-609,-663},{-611,-663},{-614,-661},{-617,-663},{-617,-665},{-629,-662},{-624,-664},{-627,-665},{-624,-666},{-626,-667},{-636,-662},{-638,-663},{-636,-664},{-639,-664},{-638,-664},{-640,-665},{-638,-666},{-641,-666},{-642,-668},{-637,-669},{-649,-670},{-650,-670},{-647,-671},{-650,-672},{-650,-673},{-656,-674},{-656,-675},{-654,-677},{-657,-679},{-653,-680},{-657,-682},{-648,-681},{-655,-683},{-650,-684},{-654,-685},{-652,-687},{-641,-688},{-640,-688},{-643,-686},{-640,-686},{-638,-685},{-629,-685},{-639,-687},{-632,-688},{-638,-690},{-633,-690},{-636,-692},{-632,-692},{-630,-694},{-624,-695},{-624,-697},{-627,-698},{-619,-702},{-625,-704},{-614,-706},{-621,-709},{-613,-708},{-614,-710},{-609,-712},{-614,-712},{-610,-714},{-616,-715},{-608,-717},{-619,-720},{-606,-720},{-611,-722},{-607,-723},{-610,-724},{-606,-724},{-614,-724},{-616,-725},{-614,-726},{-616,-727},{-605,-727},{-605,-729},{-609,-731},{-598,-729},{-599,-733},{-606,-732},{-608,-735},{-607,-737},{-610,-739},{-608,-741},{-617,-743},{-607,-743},{-607,-744},{-619,-746},{-621,-747},{-620,-749},{-628,-751},{-645,-753},{-631,-753},{-640,-756},{-699,-764},{-676,-769},{-676,-776},{-691,-781},{-715,-781},{-741,-778},{-758,-771},{-758,-766},{-810,-770},{-809,-772},{-814,-775},{-820,-771},{-832,-772},{-827,-773},{-820,-779},{-819,-780},{-824,-781},{-819,-782},{-820,-784},{-811,-787},{-814,-789},{-810,-791},{-816,-792},{-811,-795},{-803,-797},{-800,-796},{-804,-793},{-795,-793},{-773,-800},{-800,-800},{-769,-802},{-770,-803},{-762,-805},{-745,-807},{-696,-807},{-600,-802},{-590,-796},{-542,-792},{-531,-787},{-489,-777},{-464,-780},{-449,-785},{-482,-788},{-484,-789},{-445,-788},{-442,-788},{-441,-791},{-465,-793},{-460,-795},{-441,-793},{-429,-794},{-431,-797},{-430,-799},{-449,-799},{-449,-800},{-443,-802},{-459,-805},{-489,-807},{-515,-807},{-548,-800},{-584,-805},{-608,-810},{-706,-813},{-717,-814},{-721,-817},{-710,-820},{-678,-824},{-602,-824},{-590,-826},{-593,-830},{-584,-830},{-557,-824},{-516,-818},{-429,-815},{-346,-802},{-320,-801},{-318,-801},{-321,-804},{-307,-804},{-308,-803},{-301,-800},{-308,-795},{-299,-794},{-300,-793},{-339,-792},{-359,-789},{-365,-787},{-364,-783},{-356,-781},{-354,-778},{-315,-772},{-318,-771},{-314,-772},{-315,-770},{-310,-771},{-284,-764},{-289,-763},{-248,-758},{-235,-752},{-227,-746},{-184,-735},{-151,-729},{-137,-729},{-121,-726},{-114,-723},{-111,-719},{-120,-717},{-123,-714},{-116,-713},{-117,-714},{-110,-717},{-101,-711},{-105,-710},{-102,-709},{-95,-709},{-97,-710},{-90,-712},{-88,-714},{-87,-717},{-85,-718},{-74,-717},{-78,-714},{-73,-711},{-77,-709},{-70,-707},{-58,-707},{-57,-710},{-62,-713},{-60,-714},{-30,-713},{-37,-711},{-34,-709},{-35,-707},{-34,-704},{-30,-703},{-27,-704},{-32,-707},{-20,-708},{-26,-710},{-22,-715},{-10,-713},{-8,-714},{-10,-716},{-5,-717},{5,-713},{23,-709},{30,-705},{44,-703},{57,-705},{78,-702},{95,-702},{118,-706},{124,-703},{162,-702},{243,-705},{317,-696},{333,-697},{335,-696},{334,-693},{336,-692},{332,-690},{333,-688},{340,-686},{354,-691},{358,-694},{369,-696},{372,-698},{378,-697},{383,-698},{387,-701},{386,-700},{389,-700},{392,-699},{392,-697},{398,-696},{396,-695},{400,-694},{397,-693},{399,-692},{398,-690},{410,-686},{423,-683},{428,-681},{463,-677},{463,-674},{465,-673},{475,-674},{473,-675},{474,-677},{482,-676},{493,-673},{488,-673},{488,-672},{484,-671},{484,-670},{493,-668},{500,-671},{498,-673},{502,-671},{509,-672},{511,-671},{505,-671},{505,-669},{509,-668},{503,-667},{504,-664},{521,-660},{538,-658},{557,-660},{564,-664},{574,-666},{563,-668},{567,-668},{565,-669},{568,-669},{567,-670},{570,-671},{576,-670},{589,-672},{591,-673},{586,-673},{592,-675},{606,-673},{628,-677},{637,-675},{685,-679},{699,-678},{699,-681},{702,-683},{700,-685},{701,-687},{692,-690},{701,-689},{691,-691},{699,-693},{687,-693},{690,-694},{685,-696},{692,-698},{684,-699},{681,-703},{684,-704},{692,-703},{693,-708},{715,-714},{724,-709},{725,-707},{733,-704},{729,-701},{743,-697},{759,-697},{764,-694},{781,-691},{783,-688},{781,-687},{785,-686},{782,-686},{788,-685},{783,-685},{794,-682},{830,-676},{846,-671},{860,-672},{881,-667},{899,-668},{919,-665},{928,-666},{940,-665},{943,-666},{956,-665},{959,-666},{971,-665},{977,-666},{990,-664},{987,-664},{990,-663},{991,-662},{987,-657},{995,-659},{995,-657},{1000,-657},{1002,-657},{1001,-661},{1003,-662},{1008,-660},{1007,-661},{1010,-661},{1011,-661},{1007,-662},{1015,-660},{1013,-660},{1014,-659},{1030,-658},{1066,-663},{1082,-666},{1089,-669},{1093,-669},{1093,-667},{1095,-666},{1103,-666},{1102,-666},{1107,-664},{1105,-662},{1109,-660},{1132,-657},{1145,-662},{1145,-664},{1161,-664},{1177,-670},{1211,-668},{1211,-671},{1247,-667},{1261,-663},{1274,-666},{1279,-670},{1293,-670},{1296,-669},{1297,-668},{1296,-666},{1300,-662},{1295,-659},{1317,-662},{1334,-661},{1341,-662},{1347,-660},{1346,-659},{1348,-658},{1345,-656},{1345,-653},{1349,-653},{1355,-657},{1351,-660},{1361,-661},{1360,-662},{1364,-664},{1370,-663},{1401,-667},{1419,-668},{1425,-670},{1434,-669},{1438,-669},{1439,-671},{1444,-670},{1446,-672},{1453,-669},{1454,-670},{1455,-668},{1465,-668},{1468,-671},{1452,-676},{1460,-676},{1471,-679},{1485,-678},{1486,-683},{1478,-683},{1479,-684},{1491,-683},{1498,-685},{1510,-683},{1511,-686},{1514,-687},{1520,-687},{1526,-684},{1538,-683},{1547,-686},{1548,-687},{1544,-686},{1546,-687},{1545,-688},{1549,-690},{1554,-689},{1568,-692},{1571,-692},{1571,-690},{1574,-692},{1589,-693},{1597,-698},{1605,-699},{1606,-700},{1603,-701},{1610,-703},{1615,-703},{1617,-705},{1619,-703},{1619,-705},{1626,-703},{1631,-707},{1635,-707},{1637,-707},{1635,-705},{1658,-707},{1667,-707},{1668,-707},{1663,-707},{1677,-708},{1679,-709},{1678,-710},{1681,-712},{1701,-717},{1703,-715},{1701,-713},{1703,-714},{1709,-719},{1700,-721},{1698,-723},{1700,-723},{1698,-724},{1702,-724},{1702,-726},{1698,-727},{1696,-731},{1690,-732},{1692,-733},{1689,-733},{1690,-735},{1686,-734},{1684,-736},{1680,-736},{1679,-734},{1667,-736},{1665,-736},{1667,-737},{1656,-740},{1662,-741},{1647,-742},{1654,-746},{1653,-747},{1643,-746},{1638,-749},{1636,-748},{1639,-746},{1634,-745},{1631,-747},{1632,-747},{1626,-748},{1628,-750},{1624,-749},{1627,-750},{1624,-752},{1626,-753},{1642,-752},{1643,-754},{1647,-754},{1646,-756},{1627,-755},{1629,-756},{1625,-757},{1630,-758},{1627,-759},{1630,-760},{1622,-762},{1627,-763},{1626,-764},{1628,-765},{1626,-766},{1628,-766},{1625,-767},{1629,-768},{1623,-771},{1631,-771},{1634,-774},{1637,-775},{1634,-776},{1636,-777},{1634,-777},{1644,-778},{1645,-780},{1643,-781},{1633,-783},{1646,-784},{1653,-781},{1655,-782},{1652,-782},{1656,-785},{1669,-786},{1671,-787},{1661,-786},{1641,-786},{1626,-789},{1627,-789},{1625,-791},{1609,-791},{1603,-792},{1605,-794},{1600,-797},{1604,-800},{1600,-802},{1608,-805},{1597,-807},{1610,-807},{1601,-809},{1607,-810},{1603,-810},{1606,-811},{1604,-813},{1608,-813},{1605,-814},{1613,-815},{1609,-816},{1622,-817},{1623,-819},{1627,-819},{1638,-822},{1612,-824},{1617,-825},{1632,-827},{1631,-826},{1633,-826},{1632,-825},{1647,-824},{1653,-825},{1648,-827},{1663,-827},{1671,-829},{1666,-830},{1686,-832},{1678,-833},{1676,-835},{1677,-835},{1691,-834},{1716,-836},{1719,-836},{1713,-838},{1728,-838},{1735,-838},{1729,-839},{1748,-839},{1800,-844},{1800,-900},{-1800,-900},{-1800,-844},{-1783,-844},{-1791,-843},{-1670,-848},{-1659,-850},{-1629,-852},{-1618,-854},{-1605,-854},{-1610,-855},{-1582,-855},{-1586,-854},{-1584,-854},{-1515,-856},{-1515,-855},{-1503,-855},{-1483,-852},{-1393,-853},{-1374,-851},{-1461,-849},{-1511,-845},{-1530,-840},{-1532,-839},{-1528,-837},{-1529,-834},{-1542,-828},{-1542,-822},{-1549,-819},{-1550,-818},{-1549,-816},{-1534,-812},{-1459,-809},{-1452,-807},{-1479,-803},{-1511,-803},{-1520,-799},{-1532,-798},{-1540,-794},{-1576,-788},{-1577,-786},{-1568,-784},{-1570,-783},{-1568,-781},{-1579,-781},{-1583,-782},{-1579,-783},{-1585,-782},{-1580,-780},{-1582,-779},{-1577,-775},{-1580,-774},{-1579,-771},{-1567,-774},{-1559,-771},{-1531,-774},{-1537,-775},{-1535,-775},{-1524,-775},{-1521,-773},{-1494,-778},{-1490,-777},{-1496,-777},{-1487,-777},{-1485,-776},{-1486,-776},{-1477,-775},{-1475,-773},{-1469,-773},{-1460,-774},{-1458,-773},{-1462,-772},{-1459,-772},{-1460,-771},{-1453,-771},{-1462,-769},{-1455,-768},{-1469,-765},{-1487,-765},{-1495,-765},{-1494,-763},{-1485,-763},{-1487,-762},{-1483,-761},{-1456,-765},{-1454,-764},{-1464,-761},{-1460,-759},{-1441,-759},{-1442,-757},{-1427,-757},{-1426,-755},{-1418,-757},{-1415,-756},{-1405,-756},{-1399,-752},{-1374,-751},{-1367,-750},{-1372,-747},{-1360,-747},{-1355,-745},{-1343,-745},{-1344,-746},{-1342,-747},{-1342,-748},{-1340,-749},{-1327,-747},{-1297,-749},{-1261,-748},{-1187,-745},{-1178,-742},{-1170,-745},{-1158,-744},{-1155,-745},{-1147,-745},{-1146,-744},{-1149,-741},{-1140,-738},{-1136,-739},{-1142,-742},{-1132,-740},{-1131,-741},{-1136,-744},{-1130,-744},{-1128,-745},{-1130,-747},{-1127,-747},{-1128,-749},{-1112,-747},{-1117,-746},{-1113,-744},{-1116,-742},{-1113,-742},{-1103,-743},{-1099,-746},{-1092,-746},{-1090,-747},{-1093,-747},{-1088,-748},{-1083,-748},{-1082,-746},{-1073,-746},{-1072,-748},{-1066,-748},{-1069,-753},{-1067,-753},{-1053,-752},{-1053,-749},{-1050,-747},{-1031,-748},{-1033,-748},{-1021,-750},{-1020,-753},{-1004,-751},{-1017,-745},{-1009,-743},{-1005,-743},{-1005,-741},{-1010,-739},{-1020,-738},{-1004,-736},{-1000,-735},{-1000,-733},{-1010,-731},{-1027,-734},{-1032,-732},{-1035,-730},{-1031,-728},{-1022,-728},{-1021,-729},{-1022,-730},{-1018,-731},{-1007,-730},{-1000,-732},{-980,-729},{-975,-731},{-960,-733},{-944,-732},{-944,-729},{-937,-732},{-909,-733},{-895,-731},{-893,-728},{-896,-726},{-891,-726},{-881,-728},{-886,-731},{-868,-733},{-861,-732},{-858,-730},{-854,-734},{-834,-735},{-820,-739},{-808,-738},{-811,-735},{-810,-733},{-801,-734},{-803,-731},{-802,-730},{-786,-734},{-786,-736},{-766,-736},{-771,-738},{-770,-739},{-752,-737},{-740,-737},{-732,-735},{-693,-732},{-676,-728},{-669,-724},{-670,-722},{-669,-719},{-677,-714},{-674,-710},{-680,-703},{-684,-701},{-684,-697},{-689,-694},{-683,-693},{-674,-693},{-668,-690},{-675,-688},{-669,-688},{-672,-685},{-670,-683},{-672,-683},{-666,-682},{-669,-682},{-673,-680},{-668,-678},{-668,-677},{-670,-677},{-665,-675},{-676,-676},{-675,-670},{-669,-672},{-665,-673},{-666,-666},{-658,-667},{-656,-664},{-659,-663},{-657,-661},{-652,-662},{-653,-660},{-650,-659},{-645,-660},{-647,-657},{-644,-658},{-645,-656},{-641,-657},{-642,-655},{-637,-655},{-641,-654},{-641,-651},{-638,-650},{-631,-651},{-630,-650},{-633,-649},{-628,-648},{-626,-649},{-624,-649},{-627,-648},{-626,-646},{-623,-648},{-618,-645},{-616,-646},{-615,-644},{-609,-643},{-608,-641},{-610,-640},{-600,-640},{-599,-638},{-595,-639},{-594,-637},{-591,-637},{-590,-635},{-573,-632},{-571,-632},{-568,-636},{-571,-636},{-572,-635},{-574,-635},{966,-662},{963,-662},{965,-660},{970,-662},{-666,-662},{-668,-661},{1213,-667},{1218,-665},{1212,-662},{1215,-660},{1212,-659},{1213,-656},{1226,-666},{-658,-661},{1012,-661},{1013,-661},{1011,-660},{1010,-660},{-658,-660},{-658,-659},{-657,-660},{-651,-659},{-653,-659},{-651,-657},{-652,-657},{-645,-657},{-644,-657},{-653,-656},{-652,-656},{-653,-657},{-646,-656},{-644,-655},{-643,-655},{1029,-651},{1031,-652},{1035,-655},{1028,-652},{-642,-653},{-643,-653},{1003,-656},{1007,-654},{1012,-655},{1006,-657},{-656,-655},{-655,-655},{-658,-655},{-657,-655},{-656,-654},{-655,-654},{-654,-654},{-660,-659},{-659,-659},{-661,-659},{1006,-658},{1007,-658},{1006,-659},{1005,-658},{-657,-658},{-656,-658},{-658,-657},{-658,-658},{-649,-659},{-652,-659},{-653,-658},{-660,-656},{-660,-655},{-657,-657},{-659,-657},{-662,-659},{924,-657},{925,-657},{927,-657},{923,-657},{-634,-651},{-601,-650},{-600,-650},{-603,-650},{-604,-650},{-658,-650},{-605,-650},{-600,-651},{-601,-651},{-603,-651},{-602,-651},{-640,-651},{-640,-650},{-639,-650},{-622,-645},{-622,-646},{-631,-649},{-631,-648},{-629,-649},{-630,-649},{-635,-649},{-635,-648},{-632,-647},{-636,-649},{-630,-648},{-629,-648},{-621,-646},{-620,-646},{-621,-647},{-623,-646},{-622,-647},{-627,-647},{-628,-647},{-631,-647},{-621,-645},{-643,-652},{-648,-652},{-645,-652},{-642,-652},{-641,-652},{-643,-651},{-597,-651},{-596,-651},{-595,-652},{-599,-651},{-595,-651},{-569,-642},{-568,-642},{-615,-639},{-614,-639},{-610,-638},{-609,-638},{-584,-642},{-610,-642},{-617,-641},{-617,-642},{-618,-641},{-621,-641},{-620,-641},{-619,-640},{-618,-640},{-620,-640},{-577,-644},{-576,-644},{-577,-645},{-570,-645},{-573,-645},{-575,-645},{-569,-643},{-598,-645},{-597,-644},{-596,-645},{-597,-646},{-629,-644},{-628,-644},{-616,-644},{-615,-643},{-620,-633},{-622,-633},{-622,-632},{-587,-633},{-634,-644},{-632,-644},{-633,-646},{-628,-646},{-637,-648},{-643,-647},{-636,-643},{-632,-643},{-629,-643},{-630,-643},{-621,-643},{-622,-643},{-568,-643},{-566,-642},{-561,-634},{-559,-634},{-557,-634},{-560,-636},{-562,-635},{-623,-640},{-622,-642},{-621,-642},{-622,-644},{-625,-645},{-628,-645},{-625,-642},{-626,-640},{-620,-642},{-598,-636},{-599,-636},{-598,-635},{-573,-636},{-574,-636},{-547,-634},{-558,-636},{-557,-636},{-566,-636},{-564,-636},{-567,-636},{-567,-635},{-566,-635},{-591,-636},{-590,-636},{-590,-637},{-575,-636},{-576,-636},{-556,-631},{-550,-633},{-566,-634},{-575,-638},{-573,-638},{-571,-638},{-577,-638},{-607,-638},{-608,-639},{-609,-639},{-607,-637},{-608,-637},{-606,-637},{-583,-642},{-585,-641},{-582,-640},{-583,-639},{-578,-638},{-578,-641},{-575,-639},{-571,-642},{-574,-643},{-573,-644},{-580,-644},{-583,-643},{-581,-641},{-582,-638},{-583,-638},{-617,-638},{-617,-637},{-616,-638},{-579,-637},{-575,-637},{-576,-637},{-577,-637}}}, + {"Asia/Hovd",56,{{983,450},{977,438},{978,427},{964,427},{959,433},{956,440},{953,440},{954,443},{947,443},{935,450},{909,452},{907,455},{910,460},{909,463},{911,467},{909,470},{901,479},{898,478},{896,480},{890,479},{885,484},{880,485},{881,487},{877,489},{879,490},{878,492},{882,493},{881,494},{882,495},{889,495},{897,497},{896,500},{907,502},{907,505},{914,505},{918,507},{923,507},{924,509},{926,507},{930,508},{931,506},{943,506},{946,500},{970,499},{972,498},{970,494},{978,490},{991,491},{992,489},{991,483},{981,480},{983,475},{976,466},{978,462},{983,458},{984,454}}}, + {"Africa/Nairobi",62,{{413,-19},{414,-19},{414,-18},{413,-20},{394,-45},{394,-46},{397,-41},{396,-40},{397,-40},{402,-28},{408,-23},{409,-22},{409,-23},{416,-17},{410,-21},{410,-19},{409,-21},{409,-20},{408,-20},{410,-23},{408,-25},{402,-27},{401,-33},{398,-36},{398,-38},{395,-46},{392,-47},{376,-35},{377,-33},{376,-30},{339,-10},{339,1},{345,11},{348,12},{350,19},{349,25},{345,32},{345,37},{342,38},{340,42},{344,46},{359,46},{360,44},{370,44},{381,36},{385,37},{395,34},{399,39},{408,43},{412,39},{419,40},{410,28},{410,-8},{410,-22},{411,-21},{411,-20},{412,-20},{411,-22},{415,-18},{415,-17},{394,-47},{393,-47}}}, + {"Asia/Jayapura",995,{{1347,-58},{1348,-58},{1312,-11},{1343,-58},{1282,21},{1350,-15},{1305,-19},{1257,-81},{1257,-80},{1258,-80},{1258,-78},{1260,-77},{1262,-77},{1266,-76},{1268,-77},{1265,-80},{1261,-79},{1272,-81},{1271,-80},{1272,-80},{1259,-77},{1274,-76},{1273,-75},{1267,-66},{1275,-56},{1278,-54},{1362,-47},{1362,-46},{1368,-48},{1368,-49},{1367,-48},{1317,-48},{1317,-47},{1318,-47},{1365,-47},{1364,-47},{1300,-46},{1297,-46},{1297,-45},{1299,-46},{1299,-45},{1298,-45},{1317,-46},{1375,-52},{1320,-52},{1320,-51},{1375,-50},{1376,-50},{1374,-50},{1374,-49},{1371,-49},{1382,-57},{1325,-59},{1349,-60},{1349,-59},{1324,-60},{1325,-60},{1325,-58},{1326,-59},{1326,-58},{1342,-58},{1342,-59},{1347,-60},{1348,-59},{1328,-58},{1327,-60},{1326,-56},{1327,-56},{1322,-58},{1322,-57},{1328,-57},{1327,-58},{1326,-57},{1327,-57},{1323,-57},{1346,-57},{1345,-56},{1348,-56},{1345,-55},{1347,-57},{1343,-60},{1344,-58},{1348,-57},{1320,-56},{1322,-56},{1323,-56},{1330,-56},{1343,-56},{1342,-56},{1343,-57},{1328,-60},{1329,-57},{1332,-53},{1331,-56},{1328,-55},{1378,-54},{1378,-53},{1377,-54},{1377,-53},{1345,-53},{1323,-55},{1324,-55},{1327,-55},{1347,-55},{1347,-54},{1346,-54},{1347,-56},{1342,-55},{1343,-55},{1327,-54},{1345,-54},{1320,-53},{1320,-54},{1346,-53},{1401,-80},{1400,-80},{1313,-81},{1313,-80},{1389,-83},{1389,-82},{1277,-82},{1276,-82},{1364,-19},{1282,-83},{1281,-83},{1282,-82},{1307,-83},{1285,-83},{1386,-83},{1385,-83},{1385,-84},{1384,-84},{1383,-84},{1388,-84},{1386,-84},{1388,-81},{1390,-83},{1387,-82},{1288,-82},{1290,-82},{1290,-83},{1311,-81},{1312,-81},{1308,-83},{1309,-81},{1284,-82},{1273,-76},{1274,-75},{1275,-75},{1275,-76},{1281,-82},{1279,-82},{1278,-81},{1281,-81},{1287,-82},{1388,-82},{1299,-81},{1298,-82},{1286,-73},{1285,-73},{1314,-73},{1295,-79},{1295,-78},{1295,-80},{1301,-78},{1300,-78},{1311,-80},{1297,-80},{1296,-78},{1299,-78},{1298,-81},{1297,-76},{1297,-75},{1315,-69},{1389,-80},{1376,-84},{1380,-78},{1380,-77},{1381,-77},{1381,-78},{1380,-76},{1384,-74},{1388,-74},{1391,-76},{1276,-76},{1311,-78},{1311,-77},{1300,-77},{1310,-78},{1309,-77},{1310,-77},{1311,-76},{1310,-75},{1312,-75},{1311,-75},{1348,-65},{1348,-66},{1309,-76},{1309,-75},{1310,-76},{1313,-74},{1310,-74},{1312,-74},{1308,-75},{1285,-74},{1286,-74},{1313,-73},{1347,-70},{1292,-70},{1291,-70},{1317,-71},{1316,-71},{1314,-71},{1345,-71},{1320,-70},{1319,-71},{1388,-68},{1387,-69},{1387,-68},{1386,-68},{1386,-67},{1345,-69},{1387,-66},{1389,-68},{1387,-67},{1342,-65},{1346,-65},{1346,-64},{1347,-65},{1348,-64},{1345,-65},{1345,-64},{1348,-63},{1349,-63},{1343,-64},{1343,-63},{1344,-63},{1347,-64},{1344,-64},{1347,-66},{1345,-24},{1345,-23},{1347,-69},{1346,-69},{1347,-68},{1295,-68},{1295,-67},{1345,-67},{1348,-67},{1345,-68},{1315,-68},{1316,-67},{1316,-68},{1346,-67},{1338,-23},{1339,-23},{1345,-66},{1346,-66},{1342,-62},{1342,-69},{1340,-68},{1341,-64},{1341,-65},{1342,-66},{1343,-67},{1342,-64},{1396,-72},{1397,-73},{1391,-72},{1392,-72},{1314,-72},{1315,-72},{1313,-41},{1314,-42},{1346,-41},{1317,-72},{1316,-76},{1313,-79},{1313,-77},{1312,-77},{1315,-71},{1286,-72},{1285,-71},{1286,-71},{1287,-71},{1390,-72},{1335,-40},{1343,-40},{1342,-40},{1312,-39},{1320,-72},{1396,-71},{1388,-72},{1387,-72},{1387,-71},{1300,-63},{1349,-62},{1348,-62},{1349,-61},{1341,-60},{1309,-39},{1349,-39},{1349,-40},{1348,-39},{1343,-61},{1345,-59},{1317,-45},{1316,-44},{1352,-45},{1352,-44},{1335,-43},{1349,-43},{1350,-43},{1336,-43},{1333,-42},{1333,-41},{1335,-42},{1312,-41},{1312,-40},{1344,-40},{1345,-40},{1357,-29},{1341,-40},{1341,-39},{1314,-41},{1314,-40},{1315,-41},{1347,-39},{1347,-40},{1336,-34},{1335,-34},{1327,-35},{1327,-34},{1328,-34},{1308,-33},{1281,-33},{1260,-32},{1260,-33},{1276,-34},{1275,-33},{1276,-33},{1275,-32},{1282,-32},{1281,-32},{1356,-31},{1338,-31},{1338,-30},{1348,-31},{1349,-31},{1358,-29},{1357,-30},{1348,-30},{1349,-30},{1277,-32},{1277,-33},{1276,-32},{1278,-32},{1326,-32},{1325,-32},{1325,-31},{1326,-31},{1324,-31},{1280,-30},{1323,-30},{1322,-30},{1321,-30},{1279,-29},{1279,-30},{1320,-30},{1320,-29},{1280,-29},{1278,-30},{1265,-38},{1288,-37},{1288,-36},{1286,-37},{1286,-36},{1285,-36},{1284,-36},{1284,-35},{1290,-27},{1348,-27},{1349,-27},{1325,-27},{1326,-27},{1324,-26},{1280,-38},{1280,-36},{1283,-35},{1282,-37},{1281,-38},{1282,-36},{1340,-39},{1272,-39},{1272,-38},{1340,-38},{1341,-38},{1339,-37},{1339,-39},{1326,-34},{1316,-27},{1316,-26},{1317,-26},{1336,-26},{1335,-26},{1344,-26},{1344,-25},{1334,-25},{1335,-25},{1337,-25},{1338,-26},{1338,-25},{1337,-23},{1306,-23},{1306,-22},{1267,-31},{1273,-34},{1272,-37},{1267,-38},{1262,-36},{1260,-34},{1261,-31},{1287,-36},{1286,-35},{1287,-35},{1395,-21},{1363,-22},{1336,-22},{1303,-22},{1302,-22},{1305,-22},{1304,-22},{1338,-22},{1339,-22},{1282,-29},{1290,-28},{1291,-30},{1295,-28},{1300,-30},{1303,-30},{1308,-35},{1308,-39},{1299,-33},{1295,-33},{1295,-35},{1289,-33},{1289,-32},{1285,-35},{1282,-31},{1279,-36},{1281,-31},{1337,-22},{1333,-25},{1333,-24},{1336,-25},{1335,-24},{1346,-24},{1346,-23},{1340,-24},{1340,-23},{1341,-24},{1343,-25},{1338,-24},{1339,-25},{1340,-25},{1339,-24},{1278,21},{1244,-21},{1244,-20},{1243,-20},{1245,-16},{1254,-19},{1244,-17},{1251,-17},{1253,-19},{1257,-18},{1243,-18},{1243,-17},{1255,-18},{1256,-18},{1249,-17},{1250,-17},{1271,2},{1312,6},{1291,7},{1292,7},{1274,7},{1274,6},{1285,6},{1286,6},{1287,6},{1290,2},{1299,3},{1274,3},{1273,3},{1274,4},{1310,4},{1311,4},{1274,5},{1311,5},{1289,5},{1288,5},{1288,6},{1343,8},{1343,9},{1261,10},{1312,10},{1313,10},{1313,11},{1264,13},{1263,13},{1264,14},{1282,24},{1282,23},{1281,23},{1283,8},{1282,8},{1275,7},{1275,9},{1273,9},{1273,7},{1273,8},{1274,8},{1275,17},{1281,16},{1280,16},{1280,13},{1280,18},{1281,17},{1280,17},{1278,23},{1278,22},{1277,22},{1282,22},{1287,25},{1286,21},{1283,20},{1283,24},{1286,26},{1303,-2},{1304,-2},{1302,-2},{1307,-1},{1302,1},{1303,1},{1275,1},{1275,0},{1303,-1},{1302,-1},{1272,-1},{1273,-1},{1300,-1},{1301,-1},{1274,-1},{1284,-12},{1284,-11},{1293,0},{1294,0},{1295,-1},{1296,-2},{1275,-1},{1311,-1},{1311,0},{1309,0},{1272,0},{1305,0},{1274,0},{1301,0},{1296,-1},{1296,0},{1274,1},{1270,-3},{1271,-3},{1302,-3},{1312,-10},{1271,-2},{1271,1},{1272,1},{1272,2},{1301,1},{1300,2},{1301,2},{1304,-3},{1307,-3},{1308,-3},{1305,-3},{1303,-3},{1343,-39},{1342,-37},{1338,-36},{1338,-37},{1337,-37},{1337,-32},{1339,-30},{1339,-31},{1338,-29},{1337,-31},{1337,-34},{1334,-34},{1336,-36},{1334,-37},{1334,-36},{1335,-36},{1335,-35},{1333,-36},{1335,-39},{1333,-38},{1334,-39},{1329,-41},{1327,-36},{1329,-35},{1328,-33},{1327,-33},{1323,-29},{1321,-28},{1319,-28},{1322,-27},{1327,-28},{1332,-24},{1333,-27},{1334,-27},{1336,-27},{1337,-26},{1336,-28},{1338,-27},{1341,-23},{1340,-21},{1323,-23},{1320,-21},{1322,-20},{1320,-20},{1319,-19},{1321,-16},{1319,-17},{1319,-16},{1320,-16},{1320,-14},{1318,-16},{1317,-14},{1315,-15},{1316,-14},{1315,-14},{1316,-13},{1314,-15},{1314,-14},{1313,-13},{1312,-15},{1309,-14},{1312,-8},{1318,-7},{1324,-3},{1330,-4},{1334,-7},{1340,-7},{1343,-14},{1341,-17},{1342,-24},{1345,-29},{1345,-26},{1346,-25},{1347,-30},{1349,-29},{1351,-34},{1355,-34},{1359,-30},{1364,-22},{1373,-21},{1372,-18},{1378,-15},{1398,-24},{1402,-23},{1407,-25},{1407,-26},{1410,-26},{1410,-63},{1408,-66},{1410,-69},{1410,-91},{1404,-85},{1404,-84},{1405,-85},{1405,-84},{1400,-82},{1401,-81},{1401,-79},{1399,-81},{1394,-82},{1393,-80},{1389,-81},{1394,-72},{1394,-71},{1395,-72},{1395,-73},{1396,-73},{1397,-72},{1395,-71},{1393,-72},{1385,-70},{1392,-70},{1384,-63},{1382,-59},{1384,-58},{1384,-57},{1385,-58},{1383,-58},{1381,-57},{1382,-54},{1381,-55},{1379,-54},{1380,-53},{1379,-52},{1378,-52},{1379,-51},{1377,-52},{1378,-51},{1377,-51},{1376,-52},{1376,-51},{1377,-50},{1376,-49},{1375,-51},{1374,-51},{1375,-49},{1373,-50},{1373,-49},{1372,-50},{1372,-48},{1371,-50},{1371,-48},{1369,-49},{1370,-49},{1370,-48},{1369,-48},{1367,-49},{1359,-45},{1259,-20},{1260,-20},{1260,-25},{1259,-22},{1302,-21},{1305,-21},{1304,-21},{1370,-18},{1371,-19},{1338,-21},{1309,-22},{1309,-21},{1339,-21},{1303,-21},{1321,-21},{1393,-20},{1392,-20},{1347,-21},{1301,-21},{1342,-21},{1390,-19},{1372,-21},{1372,-20},{1373,-20},{1372,-19},{1371,-18},{1343,-21},{1344,-20},{1344,-22},{1348,-21},{1347,-20},{1348,-20},{1342,-20},{1304,-20},{1305,-20},{1303,-20},{1306,-20},{1387,-16},{1358,-15},{1280,-15},{1286,-15},{1353,-15},{1354,-15},{1287,-15},{1274,-15},{1352,-15},{1351,-15},{1302,-15},{1303,-15},{1342,-15},{1343,-15},{1301,-14},{1303,-14},{1289,-14},{1310,-14},{1281,-16},{1281,-15},{1317,-15},{1316,-15},{1364,-20},{1363,-19},{1373,-19},{1342,-17},{1343,-18},{1342,-19},{1253,-18},{1254,-18},{1263,-18},{1254,-20},{1276,-19},{1276,-18},{1300,-20},{1297,-19},{1304,-17},{1363,-13},{1363,-12},{1365,-13},{1365,-12},{1265,-18},{1264,-18},{1358,-18},{1297,-18},{1296,-18},{1388,-17},{1358,-17},{1366,-12},{1364,-12},{1311,-12},{1298,-12},{1366,-11},{1355,-6},{1355,-7},{1274,-12},{1274,-11},{1348,-11},{1283,-11},{1282,-11},{1282,-10},{1362,-19},{1354,-16},{1369,-18},{1302,-17},{1298,-17},{1299,-16},{1299,-17},{1284,-16},{1283,-17},{1283,-16},{1367,-12},{1366,-13},{1283,-10},{1311,-11},{1311,-10},{1312,-12},{1294,-12},{1293,-12},{1296,-12},{1310,-12},{1297,-12},{1299,-12},{1300,-12},{1298,-13},{1295,-12},{1306,-11},{1284,-10},{1283,-9},{1355,-9},{1355,-10},{1350,-10},{1349,-11},{1348,-10},{1349,-9},{1349,-10},{1313,-10},{1312,-9},{1313,-9},{1311,-9},{1273,-15},{1273,-14},{1274,-14},{1277,-13},{1281,-17},{1274,-17},{1367,-13},{1297,-13},{1296,-13},{1359,-7},{1364,-11},{1359,-12},{1357,-8},{1357,-9},{1356,-9},{1354,-6},{1310,-13},{1364,-13},{1274,-13},{1362,-13},{1362,-12},{1275,-13},{1275,-12},{1285,-6},{1303,-6},{1272,-6},{1272,-5},{1273,-5},{1273,-6},{1284,-6},{1307,-6},{1302,-6},{1283,-6},{1277,-4},{1304,-4},{1304,-5},{1306,-5},{1307,-5},{1299,-4},{1299,-5},{1298,-4},{1305,-5},{1284,-5},{1306,-4},{1281,-9},{1272,-8},{1271,-8},{1273,-8},{1281,-8},{1299,-8},{1307,-8},{1308,-8},{1303,-7},{1302,-7},{1301,-8},{1301,-7},{1306,-7},{1307,-7},{1298,-8},{1305,-8},{1273,-7},{1274,-6},{1274,-7},{1306,-6},{1276,-8},{1275,-8},{1273,-3},{1276,-3},{1277,-5},{1276,-6},{1279,-8},{1278,-9},{1277,-9},{1341,-9},{1309,-8},{1304,-9},{1307,-11},{1306,-10},{1353,-4},{1322,-4},{1322,-3},{1303,-4},{1307,-4},{1312,-4},{1313,-4},{1274,-4},{1273,-4},{1313,-3},{1271,-5},{1272,-3},{1277,-3},{1278,-4},{1302,-4},{1274,-3},{1304,-1},{1310,0},{1310,-4},{1306,-1},{1309,-4},{1305,-4},{1305,-2},{1279,0},{1284,-9},{1280,-7},{1277,3},{1275,6},{1276,9},{1274,10},{1276,18},{1280,22},{1281,22},{1278,19},{1277,9},{1279,8},{1280,11},{1282,12},{1282,14},{1287,16},{1287,11},{1287,3},{1288,3},{1289,2},{1280,5}}}, + {"Asia/Taipei",63,{{1215,226},{1215,227},{1195,236},{1167,207},{1196,236},{1200,231},{1196,237},{1195,237},{1196,238},{1202,237},{1202,238},{1182,244},{1183,244},{1184,244},{1183,245},{1184,245},{1199,260},{1200,260},{1200,259},{1220,248},{1219,248},{1199,261},{1199,262},{1200,262},{1200,261},{1200,263},{1205,264},{1216,219},{1216,220},{1215,221},{1216,221},{1215,220},{1203,223},{1204,223},{1200,232},{1201,232},{1194,232},{1196,232},{1196,233},{1201,233},{1197,232},{1197,233},{1195,234},{1193,234},{1200,234},{1200,235},{1195,235},{1197,236},{1196,235},{1203,226},{1200,230},{1201,236},{1207,246},{1210,250},{1215,253},{1219,251},{1220,250},{1218,249},{1219,245},{1216,241},{1214,231},{1210,226},{1209,219}}}, + {"Asia/Ulaanbaatar",64,{{1050,416},{1045,417},{1045,419},{1033,419},{1021,422},{1018,425},{1009,426},{995,426},{978,427},{977,438},{984,454},{983,458},{978,462},{976,466},{983,475},{981,480},{991,483},{992,489},{991,491},{978,490},{970,495},{972,498},{979,500},{983,503},{983,505},{980,507},{978,510},{980,514},{982,515},{983,517},{987,518},{989,521},{1000,518},{1021,514},{1022,513},{1023,506},{1033,502},{1041,502},{1054,505},{1067,503},{1071,500},{1080,499},{1079,497},{1085,493},{1098,492},{1108,491},{1125,495},{1124,491},{1127,478},{1122,478},{1120,474},{1116,472},{1114,465},{1115,462},{1119,461},{1119,456},{1121,452},{1117,450},{1114,443},{1120,438},{1110,433},{1102,426},{1088,424},{1075,425}}}, + {"Indian/Christmas",4,{{1057,-105},{1057,-106},{1055,-105},{1057,-104}}}, + {"America/Argentina/Salta",73,{{-652,-221},{-646,-223},{-643,-229},{-639,-220},{-628,-220},{-628,-222},{-623,-225},{-623,-244},{-634,-257},{-642,-256},{-645,-262},{-649,-263},{-657,-261},{-657,-263},{-663,-262},{-664,-264},{-668,-258},{-665,-256},{-666,-253},{-685,-252},{-683,-251},{-686,-248},{-684,-245},{-673,-240},{-672,-238},{-665,-242},{-664,-234},{-660,-235},{-660,-239},{-655,-244},{-649,-246},{-648,-245},{-646,-246},{-643,-244},{-642,-242},{-642,-235},{-644,-236},{-647,-234},{-649,-235},{-653,-226},{-634,-393},{-634,-407},{-628,-410},{-638,-412},{-649,-408},{-647,-408},{-648,-407},{-650,-407},{-652,-410},{-650,-415},{-651,-420},{-718,-420},{-719,-407},{-717,-404},{-718,-402},{-716,-399},{-717,-396},{-715,-396},{-714,-389},{-708,-386},{-712,-379},{-711,-371},{-712,-370},{-710,-365},{-707,-364},{-706,-361},{-704,-362},{-697,-371},{-682,-376},{-683,-360},{-651,-360},{-651,-350},{-634,-350}}}, + {"Australia/Broken_Hill",4,{{1410,-322},{1410,-315},{1420,-316},{1418,-323}}}, + {"Australia/Melbourne",79,{{1477,-379},{1478,-379},{1453,-383},{1453,-382},{1469,-387},{1468,-387},{1469,-386},{1466,-387},{1467,-387},{1466,-395},{1467,-395},{1470,-392},{1463,-391},{1464,-392},{1499,-376},{1499,-375},{1447,-383},{1447,-382},{1452,-385},{1453,-385},{1454,-386},{1420,-384},{1422,-384},{1423,-384},{1468,-386},{1454,-384},{1455,-384},{1462,-391},{1462,-390},{1463,-388},{1463,-389},{1465,-387},{1465,-388},{1466,-388},{1467,-388},{1464,-387},{1426,-348},{1428,-346},{1433,-348},{1434,-352},{1447,-361},{1450,-361},{1450,-359},{1451,-358},{1469,-361},{1474,-360},{1479,-360},{1482,-366},{1481,-368},{1500,-375},{1497,-375},{1498,-376},{1495,-378},{1477,-378},{1475,-381},{1479,-379},{1462,-387},{1464,-391},{1462,-388},{1459,-389},{1458,-386},{1454,-385},{1455,-382},{1452,-384},{1449,-385},{1449,-384},{1451,-382},{1449,-378},{1444,-381},{1447,-381},{1440,-385},{1436,-389},{1424,-384},{1417,-383},{1414,-384},{1410,-381},{1410,-340},{1415,-342},{1422,-342}}}, + {"America/Argentina/Tucuman",14,{{-662,-262},{-657,-263},{-657,-261},{-649,-263},{-645,-262},{-645,-267},{-651,-275},{-651,-279},{-653,-279},{-656,-281},{-660,-274},{-662,-273},{-658,-267},{-662,-266}}}, + {"America/Kentucky/Louisville",4,{{-861,380},{-863,382},{-863,384},{-854,386}}}, + {"America/Halifax",206,{{-637,445},{-638,445},{-656,434},{-600,439},{-601,439},{-601,440},{-597,440},{-664,442},{-663,443},{-628,447},{-627,447},{-627,448},{-642,445},{-643,445},{-642,446},{-629,447},{-631,447},{-635,446},{-632,447},{-633,447},{-643,444},{-636,444},{-641,445},{-639,445},{-641,444},{-638,444},{-637,444},{-642,444},{-658,435},{-657,435},{-654,435},{-653,435},{-658,436},{-655,435},{-656,435},{-653,436},{-653,437},{-661,436},{-661,437},{-660,437},{-660,436},{-662,438},{-648,439},{-646,440},{-645,441},{-643,442},{-644,442},{-642,443},{-643,443},{-644,443},{-663,442},{-662,444},{-659,437},{-660,438},{-621,449},{-621,450},{-659,438},{-602,472},{-618,474},{-617,475},{-616,476},{-617,473},{-619,473},{-620,473},{-614,478},{-615,478},{-615,476},{-619,474},{-618,472},{-620,472},{-620,474},{-614,476},{-616,475},{-613,464},{-641,465},{-641,464},{-604,464},{-632,461},{-631,461},{-624,462},{-620,450},{-643,451},{-615,452},{-616,452},{-605,462},{-607,461},{-603,463},{-604,463},{-638,465},{-638,466},{-637,466},{-639,467},{-640,467},{-640,468},{-641,468},{-626,448},{-642,450},{-642,449},{-641,450},{-642,452},{-633,454},{-649,453},{-640,460},{-632,458},{-634,458},{-633,457},{-630,457},{-631,458},{-627,458},{-625,456},{-619,459},{-620,456},{-615,457},{-613,455},{-616,455},{-615,454},{-612,454},{-610,453},{-618,453},{-617,451},{-620,451},{-619,450},{-625,448},{-625,449},{-629,448},{-636,447},{-635,445},{-639,447},{-643,446},{-646,442},{-648,438},{-651,438},{-650,437},{-654,437},{-662,441},{-659,446},{-660,446},{-644,453},{-645,453},{-643,453},{-644,451},{-624,448},{-624,449},{-623,449},{-622,449},{-620,449},{-650,453},{-650,452},{-611,452},{-612,452},{-610,454},{-641,454},{-611,455},{-610,455},{-609,455},{-626,458},{-625,458},{-611,460},{-616,460},{-638,464},{-630,464},{-620,465},{-624,464},{-626,461},{-625,460},{-628,459},{-630,461},{-629,462},{-637,462},{-641,466},{-644,467},{-640,471},{-612,456},{-608,456},{-610,456},{-609,456},{-617,456},{-617,457},{-616,457},{-625,457},{-627,457},{-608,458},{-608,457},{-633,458},{-611,458},{-612,455},{-611,456},{-602,457},{-613,456},{-615,458},{-616,461},{-611,464},{-611,466},{-606,470},{-604,470},{-605,469},{-603,469},{-606,462},{-611,459},{-610,459},{-609,459},{-612,457},{-609,458},{-609,457},{-607,458},{-616,451}}}, + {"Asia/Macau",3,{{1136,221},{1136,222},{1135,222}}}, + {"America/Ojinaga",14,{{-1065,318},{-1049,306},{-1045,296},{-1033,290},{-1034,288},{-1047,295},{-1051,304},{-1066,316},{-1080,316},{-1081,311},{-1089,312},{-1088,313},{-1082,313},{-1082,318}}}, + {"America/Nome",270,{{-1692,528},{-1692,529},{-1662,537},{-1663,538},{-1661,538},{-1662,538},{-1669,534},{-1669,535},{-1685,530},{-1684,530},{-1689,530},{-1656,542},{-1655,542},{-1654,542},{-1656,541},{-1657,542},{-1624,546},{-1680,533},{-1688,529},{-1691,528},{-1687,532},{-1684,533},{-1683,535},{-1678,535},{-1661,539},{-1660,539},{-1661,540},{-1670,536},{-1667,537},{-1672,538},{-1670,540},{-1666,540},{-1666,538},{-1664,540},{-1662,539},{-1666,537},{-1663,537},{-1667,536},{-1667,535},{-1668,536},{-1668,534},{-1675,533},{-1679,533},{-1671,535},{-1672,535},{-1670,535},{-1672,536},{-1680,539},{-1666,539},{-1665,539},{-1662,540},{-1648,542},{-1649,542},{-1649,541},{-1650,541},{-1652,541},{-1655,541},{-1622,547},{-1628,544},{-1629,544},{-1625,544},{-1624,544},{-1627,544},{-1628,545},{-1656,540},{-1655,540},{-1653,540},{-1653,541},{-1659,542},{-1658,541},{-1657,541},{-1661,541},{-1629,553},{-1628,554},{-1627,554},{-1696,565},{-1698,566},{-1695,566},{-1631,554},{-1632,554},{-1704,570},{-1649,626},{-1649,627},{-1703,571},{-1704,572},{-1701,572},{-1702,572},{-1620,586},{-1621,586},{-1622,587},{-1620,587},{-1620,592},{-1621,593},{-1620,593},{-1728,602},{-1727,602},{-1728,604},{-1731,605},{-1722,603},{-1726,603},{-1730,606},{-1731,607},{-1730,607},{-1630,553},{-1648,626},{-1649,628},{-1689,657},{-1689,658},{-1633,646},{-1681,650},{-1680,650},{-1662,645},{-1625,670},{-1624,670},{-1635,550},{-1631,547},{-1634,547},{-1646,544},{-1649,545},{-1645,549},{-1629,549},{-1623,548},{-1624,549},{-1623,550},{-1622,549},{-1624,550},{-1634,550},{-1634,551},{-1633,551},{-1628,670},{-1627,670},{-1626,670},{-1626,636},{-1627,636},{-1623,636},{-1624,635},{-1620,552},{-1620,551},{-1626,553},{-1627,552},{-1626,550},{-1626,551},{-1632,551},{-1630,549},{-1633,548},{-1634,548},{-1632,549},{-1625,554},{-1626,554},{-1620,558},{-1661,617},{-1661,618},{-1659,614},{-1660,615},{-1659,615},{-1660,619},{-1660,620},{-1659,620},{-1660,621},{-1649,625},{-1650,626},{-1620,670},{-1637,671},{-1641,676},{-1668,683},{-1663,684},{-1662,689},{-1643,689},{-1637,691},{-1632,694},{-1630,698},{-1620,703},{-1620,666},{-1625,667},{-1626,669},{-1623,669},{-1620,668},{-1688,631},{-1634,630},{-1634,631},{-1646,631},{-1635,631},{-1636,631},{-1637,631},{-1637,632},{-1644,632},{-1636,632},{-1620,647},{-1628,643},{-1631,646},{-1634,646},{-1630,645},{-1631,644},{-1637,646},{-1650,644},{-1662,646},{-1665,647},{-1664,649},{-1667,650},{-1669,652},{-1669,653},{-1669,651},{-1665,651},{-1664,653},{-1681,656},{-1655,664},{-1644,666},{-1637,666},{-1636,666},{-1639,666},{-1637,665},{-1638,663},{-1642,662},{-1620,661},{-1641,662},{-1640,662},{-1715,637},{-1710,636},{-1703,637},{-1701,636},{-1701,635},{-1687,633},{-1689,631},{-1694,632},{-1697,629},{-1705,634},{-1715,633},{-1718,634},{-1717,638},{-1642,598},{-1643,599},{-1643,600},{-1671,600},{-1675,602},{-1669,602},{-1662,604},{-1657,603},{-1657,601},{-1655,600},{-1661,597},{-1657,602},{-1620,598},{-1622,600},{-1625,601},{-1633,598},{-1641,598},{-1641,600},{-1651,604},{-1650,605},{-1654,605},{-1650,607},{-1652,610},{-1650,610},{-1653,612},{-1656,611},{-1656,613},{-1659,613},{-1658,615},{-1661,615},{-1662,616},{-1662,617},{-1658,617},{-1656,619},{-1657,621},{-1648,629},{-1631,631},{-1623,635},{-1620,635},{-1622,634},{-1620,634}}}, + {"Pacific/Wake",2,{{1666,193},{1667,193}}}, + {"Europe/Andorra",4,{{17,426},{15,424},{14,425},{15,427}}}, + {"Asia/Pyongyang",107,{{1257,378},{1258,378},{1250,378},{1257,376},{1249,385},{1248,385},{1248,386},{1251,386},{1251,377},{1252,377},{1250,379},{1262,378},{1259,378},{1254,378},{1251,378},{1252,378},{1253,378},{1253,377},{1243,399},{1242,398},{1282,400},{1303,421},{1303,422},{1244,398},{1244,399},{1244,400},{1243,400},{1245,397},{1276,397},{1246,395},{1248,395},{1247,395},{1252,395},{1251,395},{1246,396},{1247,396},{1254,395},{1254,396},{1249,396},{1249,395},{1248,396},{1281,390},{1250,386},{1250,387},{1248,394},{1246,394},{1275,392},{1276,392},{1275,394},{1274,394},{1247,394},{1270,381},{1266,378},{1264,379},{1261,377},{1261,379},{1256,380},{1257,379},{1255,379},{1252,379},{1253,381},{1247,381},{1250,382},{1249,383},{1256,387},{1253,387},{1251,389},{1254,393},{1253,395},{1248,398},{1246,398},{1243,401},{1249,405},{1260,409},{1265,414},{1267,417},{1269,418},{1273,415},{1281,414},{1283,416},{1281,420},{1289,420},{1293,425},{1297,424},{1299,430},{1303,429},{1303,427},{1305,426},{1307,423},{1304,423},{1298,418},{1297,415},{1298,414},{1297,408},{1292,407},{1283,400},{1280,401},{1279,399},{1276,398},{1276,393},{1273,394},{1274,392},{1277,391},{1284,387},{1283,384},{1281,383},{1271,383}}}, + {"America/Iqaluit",1841,{{-789,588},{-691,591},{-779,608},{-778,608},{-779,607},{-792,520},{-790,521},{-789,521},{-790,519},{-791,521},{-789,512},{-790,512},{-789,513},{-791,516},{-791,517},{-793,517},{-792,518},{-791,518},{-789,519},{-789,520},{-768,561},{-793,519},{-793,520},{-792,519},{-793,521},{-794,519},{-797,520},{-794,521},{-791,522},{-790,522},{-795,522},{-794,523},{-794,522},{-790,523},{-791,523},{-792,523},{-786,524},{-802,524},{-803,524},{-788,524},{-787,524},{-791,524},{-791,525},{-786,525},{-787,525},{-788,525},{-797,525},{-796,526},{-796,525},{-791,526},{-792,526},{-792,525},{-789,526},{-788,526},{-788,527},{-792,527},{-789,530},{-788,530},{-790,530},{-790,529},{-791,529},{-789,529},{-788,528},{-789,528},{-792,528},{-791,528},{-793,528},{-793,529},{-792,529},{-790,525},{-790,534},{-790,533},{-791,534},{-789,534},{-797,533},{-791,533},{-800,534},{-799,533},{-801,532},{-801,533},{-792,534},{-792,535},{-791,535},{-797,535},{-790,535},{-793,535},{-791,536},{-791,537},{-792,537},{-792,538},{-791,539},{-792,539},{-790,538},{-791,538},{-798,539},{-799,539},{-795,540},{-791,541},{-791,540},{-792,540},{-792,541},{-793,541},{-795,541},{-791,542},{-792,542},{-793,542},{-795,542},{-794,542},{-794,543},{-807,543},{-811,543},{-811,544},{-795,544},{-796,544},{-796,545},{-795,545},{-814,532},{-810,531},{-807,527},{-821,530},{-798,531},{-799,531},{-798,532},{-790,531},{-790,532},{-789,532},{-795,546},{-796,546},{-798,546},{-797,546},{-796,547},{-798,547},{-795,547},{-795,548},{-794,548},{-784,551},{-783,551},{-827,552},{-828,552},{-829,552},{-830,552},{-830,553},{-778,554},{-777,554},{-776,554},{-797,554},{-775,555},{-774,555},{-800,557},{-772,557},{-772,558},{-771,558},{-773,557},{-792,557},{-791,558},{-793,557},{-796,556},{-798,556},{-774,556},{-773,556},{-797,548},{-797,547},{-798,548},{-796,548},{-790,549},{-796,549},{-801,560},{-801,559},{-802,559},{-768,562},{-767,561},{-798,562},{-791,562},{-790,562},{-767,562},{-797,562},{-789,562},{-789,563},{-781,561},{-800,561},{-797,563},{-768,563},{-788,563},{-784,562},{-784,563},{-790,563},{-781,563},{-780,563},{-778,563},{-779,563},{-787,559},{-783,559},{-779,559},{-793,559},{-793,560},{-800,559},{-800,560},{-791,559},{-799,560},{-796,560},{-787,560},{-791,560},{-790,560},{-799,561},{-789,561},{-797,560},{-796,561},{-795,560},{-789,560},{-788,561},{-801,561},{-790,561},{-795,561},{-794,557},{-792,559},{-787,558},{-788,558},{-793,558},{-799,558},{-798,558},{-799,559},{-787,567},{-788,567},{-767,565},{-766,567},{-766,566},{-792,566},{-789,567},{-784,567},{-783,567},{-766,568},{-767,567},{-767,568},{-788,568},{-767,570},{-767,571},{-788,571},{-787,571},{-780,570},{-781,570},{-786,571},{-797,570},{-767,572},{-768,572},{-768,573},{-767,573},{-698,589},{-783,572},{-784,573},{-783,573},{-799,573},{-768,574},{-767,574},{-785,573},{-799,575},{-791,575},{-790,575},{-799,574},{-789,574},{-788,574},{-785,574},{-784,574},{-786,574},{-785,572},{-784,572},{-796,568},{-799,567},{-800,568},{-799,569},{-798,568},{-787,568},{-798,569},{-799,570},{-767,569},{-789,568},{-788,569},{-797,569},{-796,569},{-770,578},{-771,578},{-693,578},{-797,579},{-689,580},{-688,580},{-687,580},{-772,580},{-773,580},{-798,581},{-683,581},{-781,581},{-782,581},{-692,578},{-692,579},{-775,581},{-776,582},{-775,582},{-777,582},{-790,589},{-778,583},{-777,583},{-779,583},{-780,583},{-781,584},{-808,584},{-782,584},{-783,585},{-785,585},{-785,586},{-786,586},{-784,585},{-784,586},{-787,586},{-786,587},{-787,587},{-683,587},{-789,587},{-788,587},{-786,588},{-787,588},{-790,588},{-789,589},{-697,588},{-697,589},{-785,587},{-697,587},{-788,588},{-806,590},{-689,590},{-690,590},{-691,590},{-695,590},{-787,589},{-787,590},{-693,590},{-784,590},{-785,590},{-694,589},{-694,590},{-783,590},{-806,591},{-783,591},{-782,592},{-806,592},{-806,593},{-688,593},{-692,593},{-781,593},{-781,592},{-804,593},{-785,593},{-693,593},{-693,594},{-695,594},{-696,594},{-806,594},{-807,595},{-806,595},{-805,595},{-804,595},{-778,595},{-803,595},{-803,596},{-778,596},{-806,596},{-806,597},{-805,597},{-805,596},{-804,597},{-803,594},{-778,594},{-805,594},{-805,591},{-782,591},{-788,589},{-693,589},{-784,589},{-785,589},{-786,589},{-786,590},{-786,575},{-787,575},{-798,574},{-798,575},{-769,575},{-769,576},{-798,576},{-797,575},{-796,575},{-785,575},{-775,598},{-803,598},{-802,598},{-800,598},{-799,598},{-774,599},{-775,599},{-799,599},{-800,599},{-801,598},{-699,600},{-700,600},{-702,600},{-776,600},{-698,600},{-697,600},{-775,600},{-696,601},{-777,604},{-683,605},{-680,606},{-680,603},{-684,602},{-776,603},{-696,603},{-777,602},{-776,602},{-697,599},{-696,599},{-798,600},{-798,599},{-696,607},{-695,607},{-777,607},{-778,607},{-694,608},{-693,609},{-694,609},{-700,609},{-701,609},{-698,609},{-701,610},{-694,610},{-697,611},{-778,615},{-776,615},{-695,610},{-787,607},{-786,608},{-783,608},{-781,608},{-782,608},{-780,608},{-778,606},{-777,606},{-779,606},{-778,616},{-779,617},{-778,617},{-800,617},{-779,616},{-680,622},{-793,621},{-793,622},{-776,597},{-777,597},{-802,597},{-696,597},{-778,597},{-767,563},{-795,564},{-796,563},{-800,563},{-797,564},{-795,565},{-801,562},{-778,564},{-781,564},{-780,564},{-767,564},{-775,564},{-788,564},{-787,564},{-787,562},{-791,563},{-791,561},{-795,559},{-798,559},{-795,563},{-795,566},{-794,564},{-794,562},{-793,566},{-796,564},{-779,564},{-777,564},{-781,565},{-766,565},{-780,565},{-781,566},{-796,566},{-788,566},{-791,565},{-791,566},{-793,567},{-792,567},{-795,568},{-788,565},{-772,674},{-773,674},{-736,680},{-735,680},{-792,681},{-791,681},{-742,681},{-734,680},{-733,678},{-743,678},{-748,680},{-743,682},{-823,682},{-733,683},{-732,683},{-788,682},{-750,682},{-741,682},{-742,682},{-762,683},{-751,680},{-751,675},{-756,673},{-767,672},{-773,677},{-770,681},{-742,683},{-743,683},{-790,682},{-792,683},{-788,683},{-789,682},{-787,682},{-786,683},{-785,682},{-786,682},{-817,684},{-816,684},{-748,683},{-791,684},{-791,685},{-792,685},{-738,683},{-828,663},{-829,663},{-833,664},{-832,664},{-830,664},{-829,664},{-836,664},{-836,665},{-840,666},{-846,663},{-845,663},{-833,663},{-841,662},{-843,663},{-815,670},{-814,670},{-846,670},{-848,670},{-817,669},{-817,670},{-840,667},{-840,668},{-845,668},{-844,668},{-845,669},{-846,669},{-849,669},{-850,669},{-847,670},{-738,685},{-739,685},{-738,686},{-745,685},{-745,686},{-741,685},{-742,685},{-744,685},{-740,685},{-744,684},{-741,683},{-787,686},{-787,685},{-790,685},{-789,687},{-785,686},{-681,686},{-680,686},{-750,687},{-739,686},{-740,686},{-739,687},{-738,687},{-741,644},{-742,644},{-831,656},{-745,655},{-743,655},{-748,686},{-749,686},{-748,687},{-740,687},{-756,644},{-738,644},{-738,645},{-739,644},{-739,645},{-751,644},{-751,645},{-743,645},{-742,645},{-733,645},{-781,645},{-757,645},{-758,645},{-744,645},{-735,645},{-734,645},{-737,645},{-755,645},{-745,645},{-746,645},{-755,644},{-744,644},{-757,644},{-741,645},{-737,644},{-757,646},{-732,646},{-736,646},{-743,646},{-740,646},{-741,646},{-741,647},{-748,648},{-747,648},{-747,647},{-748,647},{-758,653},{-759,653},{-758,654},{-745,654},{-744,654},{-752,654},{-746,654},{-771,655},{-772,655},{-765,655},{-742,655},{-836,659},{-680,659},{-681,659},{-682,659},{-683,659},{-843,659},{-843,660},{-842,660},{-842,659},{-680,660},{-836,660},{-835,660},{-836,661},{-837,661},{-837,662},{-835,661},{-845,661},{-845,662},{-847,662},{-848,662},{-846,661},{-843,662},{-842,662},{-846,662},{-838,661},{-838,662},{-835,656},{-834,656},{-835,657},{-839,657},{-838,657},{-840,657},{-680,658},{-841,658},{-730,796},{-835,658},{-832,658},{-834,658},{-840,661},{-838,658},{-832,657},{-838,656},{-837,658},{-758,646},{-745,646},{-744,646},{-830,663},{-830,662},{-847,669},{-841,667},{-842,666},{-845,664},{-849,662},{-788,761},{-792,759},{-789,758},{-798,759},{-833,807},{-799,755},{-804,755},{-796,755},{-795,754},{-796,753},{-795,753},{-804,750},{-793,749},{-801,748},{-802,746},{-818,745},{-829,745},{-831,747},{-830,748},{-835,749},{-833,748},{-836,745},{-850,745},{-850,757},{-823,758},{-746,794},{-747,794},{-761,790},{-762,790},{-760,790},{-759,791},{-760,791},{-850,793},{-849,793},{-838,791},{-839,791},{-840,791},{-824,807},{-822,808},{-794,809},{-793,809},{-819,825},{-682,827},{-681,827},{-735,829},{-736,829},{-784,829},{-785,829},{-781,829},{-783,829},{-713,829},{-714,830},{-712,829},{-788,769},{-788,770},{-787,770},{-787,769},{-803,772},{-803,773},{-802,772},{-848,774},{-847,774},{-850,776},{-849,775},{-848,775},{-850,775},{-779,778},{-779,777},{-776,778},{-778,778},{-780,778},{-815,774},{-814,774},{-816,774},{-817,775},{-816,775},{-764,779},{-763,779},{-768,779},{-769,779},{-767,779},{-826,780},{-850,783},{-745,788},{-744,788},{-741,787},{-747,787},{-757,789},{-756,789},{-845,789},{-844,789},{-849,790},{-816,762},{-815,762},{-813,761},{-814,762},{-812,762},{-850,764},{-849,764},{-844,763},{-850,763},{-841,765},{-839,764},{-841,764},{-842,765},{-839,765},{-799,762},{-798,762},{-737,830},{-738,830},{-739,830},{-800,829},{-781,828},{-778,829},{-759,826},{-762,825},{-763,824},{-755,826},{-775,830},{-745,830},{-726,827},{-725,827},{-716,831},{-718,830},{-709,829},{-716,830},{-703,831},{-680,830},{-680,827},{-687,826},{-680,816},{-693,817},{-684,815},{-688,815},{-680,815},{-680,814},{-702,812},{-696,812},{-700,811},{-680,813},{-680,808},{-696,804},{-702,803},{-703,805},{-706,805},{-708,805},{-704,804},{-705,803},{-699,803},{-701,802},{-724,802},{-719,801},{-723,801},{-705,801},{-714,799},{-709,799},{-715,797},{-727,797},{-731,798},{-742,799},{-749,798},{-733,798},{-731,795},{-749,795},{-750,794},{-771,795},{-759,793},{-774,794},{-772,793},{-781,794},{-745,792},{-748,792},{-744,791},{-778,792},{-761,791},{-776,790},{-779,789},{-757,790},{-762,789},{-748,788},{-749,788},{-748,786},{-746,786},{-761,785},{-750,783},{-755,782},{-769,782},{-756,781},{-759,780},{-784,779},{-781,777},{-777,776},{-783,774},{-800,773},{-818,774},{-811,773},{-822,773},{-818,772},{-793,772},{-790,771},{-794,769},{-787,768},{-781,770},{-777,768},{-778,766},{-784,765},{-788,766},{-793,763},{-811,761},{-808,764},{-821,765},{-820,766},{-825,767},{-821,766},{-822,765},{-821,764},{-828,764},{-833,767},{-832,764},{-837,764},{-841,766},{-845,764},{-850,766},{-850,774},{-835,773},{-838,775},{-832,776},{-823,781},{-828,780},{-837,775},{-850,782},{-848,783},{-850,789},{-823,786},{-822,786},{-833,788},{-817,788},{-816,790},{-825,789},{-847,790},{-845,791},{-835,790},{-843,792},{-845,794},{-850,795},{-850,803},{-837,802},{-816,796},{-807,796},{-798,797},{-815,797},{-816,800},{-832,803},{-781,806},{-780,806},{-800,806},{-765,809},{-790,809},{-785,812},{-768,814},{-769,815},{-788,811},{-786,811},{-789,811},{-795,812},{-791,811},{-800,808},{-830,805},{-832,806},{-818,808},{-836,807},{-831,808},{-832,808},{-838,807},{-837,806},{-838,805},{-850,805},{-850,810},{-824,812},{-850,811},{-850,813},{-847,813},{-850,819},{-848,819},{-850,820},{-846,819},{-850,825},{-832,823},{-834,822},{-829,821},{-831,821},{-819,820},{-830,822},{-827,823},{-792,818},{-799,820},{-798,820},{-827,824},{-815,825},{-824,826},{-822,827},{-806,825},{-816,828},{-799,826},{-800,827},{-798,827},{-792,827},{-785,827},{-804,829},{-736,830},{-735,830},{-741,831},{-743,831},{-744,831},{-740,831},{-850,688},{-847,687},{-849,689},{-850,690},{-847,689},{-845,690},{-850,691},{-850,698},{-849,699},{-822,696},{-827,696},{-824,695},{-832,696},{-832,695},{-822,694},{-824,694},{-821,693},{-822,692},{-813,692},{-812,691},{-820,689},{-813,689},{-812,686},{-819,684},{-822,685},{-826,684},{-820,683},{-825,683},{-822,683},{-822,681},{-820,682},{-822,680},{-821,679},{-812,675},{-819,670},{-821,667},{-835,663},{-838,667},{-839,667},{-839,668},{-839,669},{-843,670},{-849,671},{-850,670},{-748,685},{-749,684},{-748,684},{-754,685},{-753,687},{-680,687},{-683,688},{-685,688},{-681,688},{-752,688},{-751,687},{-685,687},{-848,688},{-849,688},{-746,688},{-745,688},{-750,689},{-748,689},{-749,689},{-756,691},{-811,690},{-849,690},{-849,691},{-848,691},{-817,694},{-818,694},{-756,692},{-785,694},{-782,693},{-788,689},{-794,689},{-681,692},{-680,692},{-801,694},{-802,694},{-815,694},{-814,693},{-819,694},{-680,695},{-681,696},{-683,696},{-680,697},{-828,697},{-827,697},{-825,695},{-825,696},{-821,696},{-820,696},{-803,695},{-822,695},{-808,695},{-808,696},{-823,696},{-824,696},{-820,697},{-822,697},{-821,697},{-823,697},{-824,697},{-773,697},{-775,697},{-823,695},{-823,694},{-821,694},{-802,695},{-820,694},{-685,702},{-686,702},{-779,702},{-681,703},{-767,693},{-769,691},{-774,693},{-771,695},{-766,694},{-815,695},{-817,695},{-816,695},{-847,699},{-846,699},{-817,699},{-814,699},{-815,699},{-799,699},{-800,700},{-782,700},{-783,700},{-782,699},{-820,699},{-781,698},{-781,699},{-780,699},{-824,698},{-686,701},{-687,701},{-683,701},{-684,701},{-714,701},{-714,702},{-685,701},{-781,702},{-782,702},{-782,703},{-781,703},{-785,703},{-780,702},{-684,702},{-786,703},{-786,704},{-684,704},{-795,704},{-795,705},{-791,705},{-791,706},{-790,706},{-721,708},{-849,711},{-850,711},{-850,712},{-849,712},{-848,711},{-850,714},{-849,714},{-848,713},{-850,713},{-848,714},{-736,714},{-735,714},{-735,715},{-720,710},{-719,711},{-713,710},{-719,708},{-722,709},{-711,711},{-710,712},{-713,711},{-712,711},{-685,703},{-687,703},{-830,700},{-809,700},{-801,700},{-730,638},{-780,700},{-779,700},{-768,697},{-784,696},{-782,698},{-779,696},{-789,695},{-800,697},{-793,697},{-801,696},{-800,695},{-808,697},{-769,698},{-770,698},{-784,697},{-774,697},{-774,698},{-823,698},{-793,698},{-825,698},{-826,698},{-831,698},{-833,698},{-830,698},{-836,698},{-836,697},{-839,698},{-838,698},{-835,698},{-829,698},{-827,698},{-807,698},{-773,698},{-827,699},{-846,717},{-744,717},{-745,717},{-748,717},{-747,717},{-735,716},{-804,721},{-805,721},{-806,721},{-806,722},{-805,722},{-747,722},{-746,722},{-748,722},{-750,722},{-730,637},{-789,723},{-790,723},{-791,724},{-790,724},{-787,724},{-804,726},{-850,738},{-848,737},{-850,737},{-809,737},{-810,737},{-774,728},{-775,728},{-842,731},{-843,731},{-761,729},{-782,729},{-796,728},{-800,729},{-801,732},{-809,733},{-808,735},{-807,735},{-809,736},{-808,738},{-806,738},{-786,736},{-781,737},{-767,733},{-800,725},{-801,725},{-799,725},{-729,637},{-730,715},{-728,714},{-731,713},{-734,715},{-728,717},{-727,717},{-726,716},{-730,716},{-732,717},{-733,716},{-734,716},{-733,717},{-718,637},{-721,637},{-731,637},{-728,637},{-727,637},{-725,638},{-726,638},{-727,638},{-728,638},{-727,639},{-723,638},{-724,637},{-725,637},{-726,637},{-723,637},{-724,638},{-729,638},{-730,639},{-729,639},{-728,639},{-723,639},{-722,639},{-727,640},{-726,639},{-729,640},{-728,640},{-780,640},{-735,642},{-736,642},{-775,640},{-776,640},{-779,640},{-777,640},{-730,640},{-736,640},{-778,640},{-730,641},{-731,641},{-733,641},{-737,641},{-736,641},{-738,641},{-735,641},{-732,641},{-760,643},{-718,635},{-734,641},{-731,640},{-735,640},{-732,640},{-772,643},{-772,642},{-765,643},{-766,643},{-763,642},{-763,643},{-738,642},{-738,643},{-771,643},{-767,643},{-762,643},{-761,643},{-745,644},{-758,643},{-747,643},{-746,643},{-753,643},{-754,643},{-748,643},{-749,643},{-748,644},{-734,643},{-735,643},{-735,644},{-743,643},{-744,643},{-745,643},{-736,643},{-740,643},{-739,643},{-752,643},{-734,642},{-757,643},{-737,643},{-756,643},{-766,642},{-767,642},{-755,643},{-739,642},{-731,642},{-740,642},{-737,642},{-732,642},{-732,643},{-741,642},{-729,642},{-765,642},{-765,641},{-766,641},{-739,641},{-740,641},{-729,641},{-730,642},{-733,642},{-759,644},{-758,644},{-743,644},{-779,644},{-760,644},{-749,644},{-746,644},{-750,644},{-752,644},{-781,624},{-780,624},{-777,625},{-778,625},{-780,625},{-779,625},{-803,620},{-800,624},{-796,624},{-793,623},{-797,616},{-781,626},{-779,626},{-695,626},{-778,626},{-776,626},{-696,627},{-695,627},{-709,627},{-700,627},{-701,626},{-700,626},{-700,625},{-706,625},{-701,625},{-740,626},{-746,627},{-739,626},{-742,626},{-697,628},{-703,627},{-703,628},{-702,628},{-698,628},{-710,628},{-711,628},{-709,628},{-710,630},{-711,629},{-712,629},{-710,629},{-712,630},{-713,630},{-715,630},{-714,630},{-711,630},{-715,631},{-716,631},{-718,633},{-719,633},{-681,633},{-682,633},{-720,633},{-709,631},{-681,632},{-718,632},{-680,632},{-680,633},{-714,631},{-707,627},{-707,628},{-705,628},{-702,626},{-707,626},{-704,628},{-706,628},{-706,629},{-707,629},{-708,629},{-708,628},{-709,629},{-681,636},{-682,636},{-713,635},{-723,636},{-724,636},{-775,636},{-725,636},{-722,636},{-721,636},{-717,636},{-683,636},{-718,636},{-719,636},{-728,636},{-687,636},{-688,636},{-717,635},{-716,635},{-716,636},{-720,636},{-687,637},{-686,636},{-717,637},{-720,637},{-715,635},{-685,635},{-686,635},{-721,635},{-723,635},{-720,635},{-718,634},{-722,635},{-779,635},{-777,634},{-775,632},{-780,631},{-785,634},{-682,634},{-786,634},{-785,635},{-784,635},{-680,634},{-778,635},{-681,634},{-681,635},{-680,635},{-719,634},{-721,634},{-767,635},{-684,634},{-684,635},{-773,636},{-774,636},{-770,637},{-766,634},{-770,634},{-775,637},{-774,637},{-716,637},{-715,637},{-773,637},{-772,637},{-726,636},{-845,733},{-846,734},{-836,734},{-840,735},{-829,737},{-814,737},{-812,735},{-812,733},{-806,732},{-806,729},{-802,727},{-809,725},{-805,725},{-809,722},{-811,721},{-808,720},{-809,719},{-803,721},{-802,722},{-803,723},{-798,725},{-794,724},{-796,723},{-793,724},{-792,720},{-785,719},{-789,720},{-788,722},{-777,717},{-789,722},{-786,724},{-780,722},{-776,722},{-785,725},{-776,728},{-752,725},{-753,724},{-749,722},{-755,721},{-752,721},{-756,720},{-758,717},{-761,717},{-755,720},{-750,721},{-743,721},{-741,720},{-742,718},{-753,717},{-749,717},{-754,715},{-746,717},{-751,715},{-747,714},{-751,712},{-750,712},{-746,714},{-747,715},{-741,717},{-742,716},{-741,715},{-739,718},{-736,718},{-740,715},{-743,714},{-740,714},{-742,712},{-738,715},{-736,716},{-734,714},{-737,713},{-739,710},{-734,713},{-730,713},{-732,712},{-734,710},{-733,710},{-726,717},{-715,715},{-711,713},{-715,711},{-720,711},{-728,708},{-722,708},{-725,706},{-712,709},{-712,710},{-709,711},{-706,711},{-705,709},{-708,707},{-716,706},{-720,704},{-717,704},{-718,703},{-717,703},{-715,706},{-712,705},{-715,700},{-710,706},{-699,709},{-698,709},{-704,706},{-704,705},{-706,705},{-703,705},{-700,706},{-694,708},{-683,705},{-686,705},{-688,703},{-696,702},{-702,700},{-698,700},{-701,700},{-705,698},{-696,701},{-694,698},{-698,698},{-700,697},{-700,696},{-697,698},{-686,699},{-680,703},{-680,698},{-700,695},{-687,696},{-680,693},{-690,694},{-693,693},{-682,693},{-690,692},{-685,692},{-691,691},{-689,691},{-690,690},{-681,691},{-680,690},{-683,690},{-686,690},{-680,689},{-685,689},{-680,688},{-686,688},{-690,689},{-694,689},{-687,687},{-689,686},{-680,685},{-684,661},{-682,658},{-681,654},{-680,655},{-680,636},{-690,637},{-688,623},{-688,625},{-688,626},{-689,624},{-692,624},{-692,626},{-693,625},{-694,628},{-699,629},{-697,627},{-699,628},{-702,627},{-709,630},{-708,631},{-709,632},{-713,632},{-717,633},{-717,634},{-716,634},{-712,636},{-715,636},{-719,639},{-722,638},{-722,637},{-722,640},{-723,640},{-726,640},{-728,642},{-731,646},{-733,647},{-734,646},{-739,646},{-740,645},{-741,643},{-740,644},{-742,646},{-740,647},{-744,647},{-745,648},{-746,649},{-750,648},{-747,645},{-759,646},{-780,644},{-783,647},{-780,650},{-773,652},{-775,653},{-773,654},{-774,655},{-760,653},{-752,653},{-751,654},{-747,654},{-745,653},{-741,655},{-735,654},{-736,657},{-745,662},{-730,667},{-728,670},{-722,673},{-724,673},{-724,675},{-727,677},{-726,678},{-729,679},{-730,682},{-735,683},{-733,684},{-732,684},{-736,682},{-740,684},{-737,687},{-742,687},{-747,687},{-744,688},{-748,688},{-750,688},{-747,689},{-755,690},{-756,689},{-766,687},{-765,689},{-766,690},{-767,696},{-764,697},{-762,695},{-762,697},{-772,696},{-767,698},{-770,699},{-770,700},{-776,698},{-777,702},{-784,702},{-784,703},{-784,704},{-787,705},{-789,707},{-790,707},{-789,706},{-792,704},{-793,704},{-793,705},{-792,706},{-794,706},{-794,705},{-796,705},{-796,704},{-789,703},{-787,701},{-788,699},{-817,701},{-809,697},{-822,701},{-822,702},{-821,702},{-830,703},{-821,698},{-850,701},{-849,709},{-848,709},{-848,712},{-846,712},{-845,715},{-846,716},{-845,716},{-844,717},{-850,717},{-850,723},{-844,721},{-850,729},{-845,729},{-850,730},{-850,731},{-841,731},{-850,732},{-850,734},{-843,732}}}, + {"Asia/Yakutsk",514,{{1291,725},{1290,725},{1289,726},{1289,725},{1197,731},{1197,732},{1203,732},{1202,732},{1292,725},{1295,727},{1293,727},{1294,728},{1293,728},{1293,726},{1292,726},{1291,726},{1290,726},{1300,715},{1300,716},{1299,716},{1288,719},{1286,719},{1286,720},{1289,719},{1287,720},{1293,720},{1289,720},{1290,719},{1288,720},{1292,720},{1291,721},{1292,721},{1290,720},{1295,725},{1294,725},{1293,725},{1296,725},{1296,726},{1295,728},{1227,729},{1226,729},{1225,730},{1226,730},{1224,730},{1223,730},{1204,730},{1203,730},{1222,730},{1221,730},{1220,730},{1202,730},{1201,730},{1222,731},{1205,730},{1229,730},{1229,731},{1205,731},{1193,731},{1194,731},{1196,731},{1196,730},{1195,731},{1197,730},{1198,731},{1199,730},{1198,730},{1200,731},{1203,731},{1204,731},{1227,731},{1226,731},{1200,730},{1202,731},{1228,731},{1225,731},{1224,731},{1199,731},{1201,731},{1201,732},{1285,733},{1286,733},{1287,733},{1198,732},{1200,732},{1199,732},{1196,732},{1205,741},{1112,743},{1111,743},{1129,746},{1129,747},{1130,747},{1130,746},{1162,743},{1161,743},{1131,742},{1127,741},{1115,743},{1120,744},{1121,746},{1134,744},{1160,743},{1159,743},{1161,744},{1162,744},{1309,557},{1324,557},{1330,554},{1314,547},{1311,543},{1305,541},{1304,539},{1314,537},{1314,532},{1329,532},{1336,535},{1340,534},{1346,536},{1350,533},{1347,529},{1348,526},{1346,524},{1333,527},{1333,522},{1328,522},{1323,518},{1314,517},{1315,514},{1311,512},{1306,507},{1310,507},{1309,504},{1313,504},{1315,501},{1313,500},{1315,499},{1314,497},{1315,494},{1310,490},{1302,489},{1295,494},{1291,493},{1287,495},{1288,496},{1278,496},{1275,498},{1276,502},{1273,503},{1273,507},{1269,511},{1270,513},{1268,513},{1269,514},{1265,519},{1266,521},{1263,522},{1264,523},{1260,526},{1261,528},{1257,529},{1257,530},{1256,531},{1251,532},{1249,531},{1235,536},{1209,533},{1200,528},{1201,526},{1207,525},{1206,523},{1208,522},{1207,520},{1201,517},{1193,506},{1191,504},{1194,503},{1193,501},{1186,499},{1179,495},{1162,500},{1154,499},{1150,502},{1143,503},{1135,500},{1128,495},{1114,494},{1108,491},{1086,493},{1080,496},{1078,502},{1087,505},{1081,508},{1086,511},{1084,513},{1086,515},{1094,513},{1100,516},{1107,515},{1121,523},{1124,522},{1125,523},{1136,525},{1143,530},{1138,534},{1138,536},{1150,540},{1157,544},{1167,545},{1169,548},{1168,551},{1164,554},{1159,554},{1158,561},{1157,563},{1158,564},{1154,567},{1157,570},{1168,567},{1173,569},{1176,568},{1177,570},{1176,572},{1178,573},{1174,573},{1171,578},{1174,579},{1174,581},{1176,582},{1175,583},{1182,584},{1187,582},{1191,582},{1191,585},{1188,586},{1189,588},{1187,591},{1189,593},{1188,594},{1183,596},{1179,594},{1172,595},{1171,596},{1172,598},{1171,599},{1173,600},{1166,604},{1157,605},{1147,602},{1142,597},{1136,596},{1135,593},{1126,591},{1125,589},{1124,591},{1126,593},{1123,593},{1123,595},{1116,592},{1107,593},{1102,590},{1098,590},{1095,593},{1093,593},{1098,600},{1097,602},{1101,606},{1100,607},{1103,607},{1102,608},{1105,611},{1098,613},{1099,615},{1096,618},{1100,623},{1093,625},{1096,628},{1095,629},{1094,633},{1090,636},{1081,636},{1083,638},{1088,639},{1085,643},{1079,642},{1057,646},{1059,649},{1062,649},{1060,650},{1070,655},{1064,657},{1065,660},{1061,662},{1061,664},{1063,665},{1062,668},{1055,670},{1068,673},{1069,689},{1061,694},{1065,696},{1079,697},{1082,699},{1092,698},{1095,700},{1093,702},{1103,704},{1101,706},{1126,711},{1127,712},{1120,714},{1120,721},{1111,724},{1113,725},{1106,728},{1109,730},{1102,734},{1111,736},{1108,737},{1113,739},{1128,737},{1130,738},{1128,740},{1135,736},{1132,734},{1135,733},{1135,732},{1141,734},{1135,735},{1156,737},{1187,736},{1190,735},{1185,734},{1184,732},{1228,730},{1232,729},{1237,731},{1235,732},{1238,732},{1234,734},{1235,734},{1233,734},{1233,735},{1235,736},{1234,737},{1240,736},{1244,738},{1258,734},{1263,736},{1265,734},{1270,734},{1271,735},{1279,735},{1278,734},{1295,730},{1296,729},{1294,729},{1292,730},{1291,730},{1292,727},{1295,726},{1288,725},{1295,724},{1296,723},{1294,723},{1296,722},{1294,722},{1296,721},{1285,720},{1290,717},{1293,718},{1291,720},{1296,717},{1289,716},{1292,716},{1295,713},{1304,709},{1309,710},{1311,707},{1318,710},{1321,710},{1322,709},{1320,708},{1321,704},{1331,703},{1332,702},{1330,700},{1335,697},{1322,690},{1327,689},{1331,684},{1331,680},{1319,670},{1300,665},{1301,662},{1316,657},{1316,654},{1323,649},{1322,646},{1327,646},{1328,642},{1321,637},{1332,633},{1332,631},{1339,631},{1342,628},{1353,626},{1358,622},{1351,617},{1354,616},{1349,614},{1340,618},{1329,616},{1331,615},{1330,613},{1332,609},{1325,607},{1317,597},{1318,592},{1321,591},{1324,588},{1325,588},{1326,586},{1324,585},{1321,585},{1322,583},{1320,582},{1321,580},{1315,582},{1320,576},{1317,576},{1315,572},{1311,572},{1315,571},{1318,567},{1317,567},{1317,565},{1315,566},{1311,564},{1309,559},{1136,733},{1137,733},{1138,733},{1139,733},{1234,732},{1233,732},{1233,733},{1188,733},{1187,733},{1188,734},{1137,734},{1138,734},{1283,734},{1281,734},{1282,734},{1187,734},{1232,734},{1266,734},{1280,734},{1276,735},{1253,736},{1233,736},{1232,736},{1256,736},{1232,735},{1257,735},{1258,735},{1267,734},{1267,735},{1278,735},{1277,735},{1264,734},{1279,734},{1280,735},{1269,734},{1269,735},{1235,737},{1248,737},{1240,738},{1239,738},{1237,737},{1236,737},{1246,738},{1238,737},{1243,738},{1240,737},{1248,739},{1238,738},{1241,738},{1239,737},{1252,737},{1241,737},{1258,736},{1259,737},{1259,735},{1257,736},{1234,736},{1257,737},{1150,736},{1151,736},{1254,736},{1238,736},{1239,736},{1233,739},{1232,739},{1232,740},{1233,740},{1245,739},{1246,739},{1232,738},{1231,739},{1243,739},{1249,739},{1250,739},{1244,739}}}, + {"America/Fortaleza",175,{{-439,-26},{-439,-25},{-457,-13},{-457,-12},{-456,-12},{-447,-33},{-448,-33},{-447,-32},{-446,-31},{-446,-32},{-447,-30},{-446,-30},{-446,-29},{-445,-29},{-447,-29},{-442,-28},{-402,-28},{-441,-28},{-446,-28},{-445,-27},{-445,-30},{-443,-28},{-422,-28},{-420,-27},{-423,-27},{-424,-27},{-421,-27},{-445,-26},{-437,-25},{-445,-25},{-445,-24},{-444,-25},{-439,-24},{-438,-25},{-434,-24},{-438,-24},{-435,-24},{-435,-25},{-438,-26},{-436,-25},{-350,-65},{-348,-75},{-351,-74},{-355,-75},{-356,-77},{-359,-78},{-364,-78},{-369,-83},{-371,-80},{-373,-80},{-372,-76},{-370,-75},{-372,-73},{-382,-79},{-387,-76},{-391,-79},{-397,-74},{-407,-74},{-406,-81},{-415,-89},{-417,-90},{-418,-93},{-423,-93},{-426,-96},{-435,-93},{-438,-94},{-437,-99},{-439,-104},{-451,-109},{-453,-108},{-456,-103},{-463,-102},{-467,-98},{-465,-95},{-471,-90},{-468,-85},{-465,-84},{-465,-81},{-466,-79},{-470,-80},{-476,-74},{-475,-73},{-477,-72},{-475,-70},{-474,-63},{-475,-55},{-483,-52},{-488,-54},{-476,-46},{-471,-39},{-466,-29},{-467,-27},{-464,-25},{-462,-19},{-463,-17},{-460,-11},{-460,-13},{-458,-12},{-458,-13},{-457,-11},{-457,-15},{-456,-13},{-455,-14},{-454,-13},{-456,-15},{-455,-15},{-453,-13},{-453,-18},{-452,-15},{-450,-16},{-449,-14},{-450,-17},{-448,-16},{-448,-18},{-447,-17},{-445,-18},{-445,-20},{-446,-20},{-448,-23},{-446,-24},{-445,-21},{-444,-23},{-447,-26},{-448,-32},{-444,-29},{-443,-25},{-440,-24},{-442,-29},{-436,-26},{-435,-26},{-434,-23},{-422,-27},{-414,-29},{-400,-29},{-385,-37},{-371,-49},{-367,-51},{-355,-52},{-444,-24},{-436,-24},{-437,-24},{-436,-23},{-446,-22},{-446,-21},{-437,-23},{-444,-21},{-444,-20},{-446,-19},{-447,-18},{-446,-18},{-448,-17},{-453,-16},{-454,-15},{-453,-15},{-448,-15},{-450,-15},{-451,-15},{-455,-13},{-454,-14},{-450,-13},{-449,-13},{-450,-14},{-451,-14},{-451,-13},{-448,-14},{-453,-17},{-452,-17},{-447,-16},{-459,-12},{-455,-12},{-458,-11},{-459,-11},{-456,-14},{-457,-14},{-456,-11}}}, + {"America/Kralendijk",10,{{-683,121},{-683,122},{-630,175},{-629,175},{-632,176},{-632,177},{-684,123},{-682,122},{-682,120},{-684,122}}}, + {"America/Yellowknife",705,{{-1239,694},{-1338,694},{-1338,696},{-1275,701},{-1275,702},{-1115,703},{-1353,687},{-1357,689},{-1358,689},{-1360,689},{-1359,689},{-1360,690},{-1359,690},{-1358,690},{-1356,693},{-1356,694},{-1361,690},{-1361,691},{-1310,691},{-1362,691},{-1363,691},{-1310,692},{-1363,692},{-1361,692},{-1360,691},{-1360,692},{-1362,692},{-1357,693},{-1338,693},{-1339,693},{-1341,693},{-1340,693},{-1355,694},{-1354,694},{-1353,693},{-1238,694},{-1315,693},{-1315,694},{-1314,694},{-1240,694},{-1340,694},{-1339,694},{-1353,694},{-1309,694},{-1308,694},{-1308,695},{-1353,695},{-1352,695},{-1319,695},{-1351,695},{-1306,694},{-1307,694},{-1355,695},{-1354,695},{-1357,695},{-1358,695},{-1256,695},{-1347,695},{-1348,695},{-1309,695},{-1313,695},{-1254,695},{-1336,695},{-1335,695},{-1355,696},{-1356,696},{-1354,696},{-1353,696},{-1349,697},{-1350,697},{-1348,697},{-1347,697},{-1289,697},{-1290,697},{-1342,697},{-1343,697},{-1291,697},{-1305,697},{-1305,698},{-1320,698},{-1323,698},{-1322,698},{-1344,698},{-1343,698},{-1319,698},{-1318,699},{-1317,699},{-1315,699},{-1311,700},{-1344,697},{-1345,697},{-1254,696},{-1340,696},{-1339,696},{-1310,695},{-1311,696},{-1314,696},{-1314,695},{-1307,696},{-1308,696},{-1342,696},{-1309,701},{-1299,701},{-1305,701},{-1304,701},{-1306,701},{-1307,701},{-1301,701},{-1302,701},{-1303,701},{-1298,703},{-1297,703},{-1298,702},{-1299,702},{-1243,736},{-1242,736},{-1241,736},{-1154,715},{-1257,720},{-1257,721},{-1192,715},{-1192,716},{-1191,716},{-1117,724},{-1118,723},{-1117,723},{-1118,724},{-1113,724},{-1112,724},{-1115,724},{-1114,724},{-1253,725},{-1100,725},{-1102,726},{-1101,726},{-1250,726},{-1252,725},{-1251,725},{-1112,725},{-1252,728},{-1112,727},{-1111,727},{-1140,727},{-1141,727},{-1180,728},{-1181,728},{-1100,730},{-1100,727},{-1102,727},{-1102,728},{-1107,730},{-1104,726},{-1105,726},{-1106,726},{-1251,726},{-1252,726},{-1103,726},{-1111,726},{-1142,726},{-1100,726},{-1103,727},{-1101,727},{-1149,706},{-1177,707},{-1178,707},{-1171,714},{-1160,714},{-1161,714},{-1163,714},{-1162,714},{-1175,715},{-1163,706},{-1164,706},{-1177,706},{-1111,752},{-1110,752},{-1140,754},{-1160,756},{-1159,756},{-1153,756},{-1153,757},{-1118,751},{-1117,751},{-1209,767},{-1211,767},{-1212,767},{-1208,767},{-1143,769},{-1137,769},{-1134,768},{-1148,768},{-1161,776},{-1160,776},{-1159,776},{-1158,777},{-1157,777},{-1156,778},{-1156,777},{-1145,777},{-1146,778},{-1104,778},{-1106,778},{-1107,778},{-1136,778},{-1133,776},{-1133,777},{-1132,776},{-1133,771},{-1132,771},{-1135,771},{-1137,772},{-1136,771},{-1139,771},{-1138,772},{-1182,774},{-1173,774},{-1173,775},{-1171,775},{-1172,775},{-1154,775},{-1225,758},{-1216,760},{-1211,758},{-1210,759},{-1208,759},{-1210,757},{-1213,758},{-1100,759},{-1118,758},{-1119,759},{-1115,759},{-1116,759},{-1120,758},{-1121,758},{-1119,758},{-1190,756},{-1194,756},{-1186,759},{-1174,761},{-1182,756},{-1125,705},{-1124,705},{-1229,760},{-1230,760},{-1227,761},{-1227,760},{-1228,761},{-1226,760},{-1140,763},{-1141,763},{-1229,763},{-1230,763},{-1230,764},{-1100,765},{-1100,762},{-1104,764},{-1105,764},{-1187,765},{-1188,765},{-1164,776},{-1153,773},{-1164,771},{-1157,769},{-1163,769},{-1159,767},{-1170,766},{-1169,763},{-1173,763},{-1180,764},{-1179,767},{-1177,768},{-1178,768},{-1184,767},{-1183,766},{-1189,765},{-1185,763},{-1189,763},{-1189,762},{-1190,761},{-1196,763},{-1195,762},{-1197,762},{-1195,761},{-1198,761},{-1195,760},{-1199,758},{-1205,758},{-1204,760},{-1207,760},{-1207,762},{-1210,761},{-1209,760},{-1219,760},{-1223,759},{-1227,759},{-1224,761},{-1225,762},{-1230,761},{-1224,764},{-1215,764},{-1205,768},{-1192,773},{-1170,773},{-1172,773},{-1166,774},{-1134,782},{-1135,782},{-1135,783},{-1139,783},{-1140,783},{-1142,783},{-1136,783},{-1137,783},{-1138,783},{-1239,697},{-1240,697},{-1244,699},{-1243,699},{-1283,699},{-1284,699},{-1284,700},{-1249,700},{-1248,700},{-1252,700},{-1251,700},{-1253,697},{-1254,697},{-1100,787},{-1100,783},{-1103,783},{-1133,783},{-1107,788},{-1122,786},{-1121,786},{-1134,783},{-1142,780},{-1135,778},{-1143,777},{-1151,780},{-1246,701},{-1247,701},{-1251,701},{-1250,702},{-1251,702},{-1278,702},{-1279,702},{-1126,702},{-1126,703},{-1129,703},{-1131,703},{-1130,703},{-1128,702},{-1127,703},{-1127,702},{-1250,701},{-1117,780},{-1100,781},{-1100,779},{-1109,779},{-1100,778},{-1102,775},{-1120,773},{-1132,775},{-1131,776},{-1133,778},{-1132,779},{-1130,781},{-1114,781},{-1198,741},{-1191,742},{-1190,741},{-1191,740},{-1190,740},{-1187,742},{-1174,742},{-1153,735},{-1191,726},{-1193,724},{-1202,722},{-1206,715},{-1217,715},{-1228,711},{-1232,711},{-1241,717},{-1248,718},{-1251,719},{-1253,720},{-1249,720},{-1252,720},{-1258,720},{-1260,720},{-1256,721},{-1258,721},{-1249,726},{-1251,729},{-1244,729},{-1249,731},{-1237,737},{-1242,739},{-1245,743},{-1248,743},{-1215,746},{-1196,742},{-1246,737},{-1247,737},{-1245,737},{-1244,739},{-1245,739},{-1189,740},{-1246,741},{-1197,741},{-1196,741},{-1246,742},{-1247,742},{-1195,742},{-1246,743},{-1247,743},{-1250,743},{-1251,743},{-1249,743},{-1146,765},{-1141,765},{-1139,762},{-1124,762},{-1125,761},{-1124,760},{-1117,759},{-1122,758},{-1114,758},{-1116,758},{-1112,755},{-1100,755},{-1100,748},{-1116,745},{-1132,744},{-1144,747},{-1128,750},{-1117,750},{-1109,752},{-1124,751},{-1123,752},{-1126,753},{-1128,751},{-1139,751},{-1138,753},{-1134,754},{-1140,755},{-1141,752},{-1144,753},{-1146,753},{-1143,752},{-1143,751},{-1150,750},{-1152,752},{-1157,750},{-1162,751},{-1160,751},{-1162,752},{-1177,752},{-1172,755},{-1160,755},{-1151,757},{-1172,756},{-1169,758},{-1148,759},{-1167,759},{-1164,760},{-1167,760},{-1166,761},{-1162,762},{-1148,762},{-1159,763},{-1200,678},{-1135,655},{-1116,655},{-1104,647},{-1020,643},{-1020,600},{-1240,600},{-1242,605},{-1246,607},{-1245,608},{-1246,610},{-1253,608},{-1259,609},{-1268,608},{-1269,611},{-1271,611},{-1270,612},{-1272,615},{-1278,616},{-1285,621},{-1293,622},{-1293,624},{-1292,625},{-1295,626},{-1298,629},{-1296,631},{-1302,632},{-1298,635},{-1303,637},{-1301,639},{-1309,640},{-1312,644},{-1319,644},{-1317,645},{-1326,648},{-1323,651},{-1328,652},{-1322,656},{-1326,659},{-1323,660},{-1336,660},{-1336,663},{-1338,663},{-1336,666},{-1341,670},{-1338,670},{-1361,670},{-1362,676},{-1364,677},{-1364,689},{-1351,687},{-1356,691},{-1359,693},{-1356,692},{-1351,693},{-1345,694},{-1344,695},{-1346,695},{-1344,696},{-1341,695},{-1337,695},{-1342,693},{-1330,694},{-1329,697},{-1326,696},{-1323,697},{-1327,697},{-1326,697},{-1320,697},{-1314,699},{-1314,700},{-1312,698},{-1309,700},{-1310,700},{-1310,701},{-1304,702},{-1300,700},{-1294,701},{-1310,696},{-1320,695},{-1320,692},{-1319,693},{-1318,693},{-1317,694},{-1320,694},{-1319,694},{-1316,693},{-1314,693},{-1312,694},{-1313,693},{-1312,693},{-1313,696},{-1311,694},{-1311,693},{-1311,695},{-1312,696},{-1310,694},{-1309,693},{-1310,693},{-1309,691},{-1303,697},{-1289,700},{-1292,697},{-1282,699},{-1283,701},{-1278,701},{-1281,701},{-1274,701},{-1273,702},{-1282,704},{-1280,706},{-1272,703},{-1268,700},{-1270,699},{-1268,699},{-1263,695},{-1254,693},{-1253,694},{-1255,694},{-1251,694},{-1256,694},{-1251,695},{-1255,696},{-1248,697},{-1253,698},{-1246,700},{-1244,700},{-1247,702},{-1243,700},{-1245,700},{-1244,698},{-1245,697},{-1245,694},{-1244,693},{-1234,694},{-1230,698},{-1210,697},{-1220,697},{-1220,685},{-1334,683},{-1336,683},{-1338,684},{-1337,683},{-1117,703},{-1116,703},{-1126,705},{-1166,705},{-1167,705},{-1165,705},{-1282,705},{-1281,705},{-1155,706},{-1154,706},{-1173,706},{-1174,706},{-1173,705},{-1158,706},{-1157,706},{-1161,706},{-1160,706},{-1169,705},{-1155,705},{-1156,705},{-1161,705},{-1162,705},{-1163,705},{-1164,705},{-1168,705},{-1157,705},{-1156,706},{-1158,705},{-1118,703},{-1119,703},{-1283,706},{-1282,706},{-1281,706},{-1283,705},{-1167,706},{-1172,705},{-1168,706},{-1171,705},{-1159,706},{-1159,705},{-1132,703},{-1128,703},{-1133,703},{-1120,703},{-1123,704},{-1153,706},{-1153,733},{-1145,734},{-1140,732},{-1139,728},{-1146,726},{-1134,727},{-1136,728},{-1130,730},{-1114,725},{-1119,723},{-1116,723},{-1113,723},{-1111,723},{-1107,726},{-1100,724},{-1100,700},{-1123,700},{-1123,699},{-1124,698},{-1129,698},{-1130,700},{-1172,700},{-1169,697},{-1170,697},{-1174,700},{-1145,703},{-1125,702},{-1114,703},{-1138,707},{-1176,706},{-1184,710},{-1150,715},{-1182,714},{-1183,715},{-1177,715},{-1180,716},{-1177,717},{-1189,716},{-1191,717},{-1186,722},{-1181,722},{-1185,724},{-1184,725},{-1173,729}}}, + {"Europe/Jersey",4,{{-20,492},{-22,492},{-23,493},{-21,493}}}, + {"Asia/Ust-Nera",130,{{1460,434},{1462,434},{1459,434},{1459,435},{1461,434},{1463,436},{1463,437},{1464,436},{1461,435},{1462,435},{1470,446},{1470,447},{1509,465},{1507,467},{1508,467},{1467,437},{1468,437},{1468,438},{1466,438},{1469,438},{1489,454},{1479,450},{1477,450},{1472,446},{1469,445},{1472,447},{1471,448},{1479,452},{1479,454},{1481,452},{1487,455},{1489,455},{1500,458},{1494,456},{1502,462},{1506,462},{1508,464},{1508,465},{1458,440},{1455,437},{1454,437},{1461,445},{1466,445},{1518,468},{1517,469},{1523,472},{1520,469},{1525,473},{1524,474},{1525,474},{1528,475},{1529,475},{1531,478},{1531,477},{1530,477},{1530,478},{1533,481},{1532,483},{1533,483},{1532,480},{1532,481},{1540,487},{1541,489},{1542,489},{1542,488},{1535,490},{1546,491},{1545,491},{1545,492},{1539,490},{1540,490},{1540,489},{1539,489},{1548,494},{1546,493},{1548,496},{1549,496},{1545,498},{1544,497},{1544,498},{1550,502},{1557,509},{1555,508},{1555,509},{1556,509},{1463,641},{1455,638},{1456,637},{1452,632},{1455,625},{1451,625},{1452,623},{1447,621},{1445,619},{1440,617},{1439,620},{1436,619},{1436,620},{1432,621},{1430,619},{1424,619},{1422,621},{1416,621},{1413,624},{1407,626},{1406,624},{1403,624},{1396,629},{1397,634},{1406,636},{1405,637},{1406,640},{1400,644},{1404,645},{1394,650},{1400,655},{1408,656},{1443,649},{1449,645},{1457,645},{1554,500},{1552,501},{1552,503},{1556,504},{1561,508},{1562,505},{1564,506},{1563,506},{1562,507},{1565,509}}}, + {"Africa/Asmara",142,{{402,151},{405,150},{431,127},{401,152},{400,152},{413,152},{413,153},{402,152},{403,152},{401,153},{402,153},{411,154},{407,154},{406,150},{402,150},{405,151},{403,150},{403,151},{404,150},{401,151},{429,128},{430,128},{429,129},{428,129},{430,129},{430,130},{428,130},{429,130},{426,132},{422,136},{421,137},{409,147},{409,148},{419,139},{420,139},{408,147},{408,148},{407,149},{408,149},{397,155},{398,154},{407,155},{408,155},{404,155},{403,155},{412,146},{417,139},{424,132},{425,132},{428,128},{427,124},{424,125},{408,142},{402,145},{396,146},{393,144},{391,146},{385,144},{379,149},{376,141},{373,144},{370,143},{365,143},{364,152},{370,163},{370,171},{374,170},{375,173},{383,176},{386,180},{389,174},{392,161},{397,151},{398,151},{399,155},{398,155},{409,155},{400,155},{410,156},{408,157},{407,157},{399,157},{406,157},{405,157},{405,158},{401,158},{407,158},{404,158},{397,159},{396,159},{402,159},{403,159},{401,159},{401,160},{400,159},{400,160},{396,160},{399,159},{406,159},{403,158},{399,158},{406,158},{405,159},{404,159},{403,160},{399,160},{399,161},{395,161},{395,160},{394,162},{398,161},{400,161},{400,162},{401,161},{402,161},{402,160},{402,162},{406,156},{402,163},{398,163},{397,163},{396,164},{396,163},{395,163},{401,165},{402,165},{391,166},{392,166},{393,166},{399,163},{399,164},{401,162},{407,156},{405,156},{408,156},{406,155},{402,157},{402,156},{404,156},{400,156},{401,156},{400,157}}}, + {"Asia/Irkutsk",184,{{1157,570},{1154,566},{1158,564},{1157,563},{1158,561},{1159,554},{1164,554},{1168,551},{1169,548},{1167,545},{1157,544},{1150,540},{1138,536},{1138,534},{1143,530},{1136,525},{1125,523},{1124,522},{1121,523},{1107,515},{1100,516},{1094,513},{1086,515},{1084,513},{1086,511},{1081,508},{1087,505},{1080,503},{1077,500},{1071,500},{1068,503},{1054,505},{1041,502},{1029,503},{1023,506},{1022,513},{1021,514},{1000,518},{986,523},{986,524},{989,527},{989,529},{992,529},{990,530},{991,531},{983,531},{983,532},{976,534},{973,536},{969,537},{966,536},{957,543},{961,546},{966,545},{967,549},{966,550},{969,553},{968,558},{971,561},{974,560},{976,562},{976,564},{979,564},{978,568},{975,568},{976,570},{973,570},{979,578},{990,577},{994,578},{997,581},{1000,581},{1004,575},{1007,574},{1010,575},{1008,579},{1010,579},{1011,581},{1025,587},{1024,591},{1025,592},{1033,593},{1034,590},{1040,588},{1039,587},{1042,588},{1044,586},{1048,587},{1048,589},{1054,591},{1052,595},{1050,595},{1048,597},{1055,598},{1055,603},{1047,604},{1045,608},{1046,609},{1046,611},{1050,612},{1048,613},{1058,616},{1059,617},{1059,618},{1064,620},{1064,622},{1063,623},{1068,626},{1065,627},{1061,631},{1067,634},{1065,635},{1068,638},{1067,640},{1076,639},{1077,640},{1083,640},{1082,642},{1080,642},{1084,643},{1088,639},{1083,638},{1081,636},{1090,636},{1094,634},{1095,629},{1097,628},{1093,625},{1100,623},{1096,618},{1099,615},{1098,613},{1105,611},{1103,607},{1100,607},{1101,606},{1097,602},{1098,600},{1095,596},{1093,595},{1096,591},{1102,590},{1107,593},{1116,592},{1123,595},{1123,593},{1126,593},{1124,591},{1125,589},{1126,591},{1135,593},{1136,596},{1142,597},{1147,602},{1157,605},{1166,604},{1173,600},{1171,599},{1172,598},{1171,596},{1172,595},{1179,594},{1183,596},{1189,593},{1187,592},{1189,588},{1188,586},{1191,585},{1191,582},{1186,582},{1182,584},{1177,584},{1175,583},{1176,582},{1174,581},{1174,579},{1171,578},{1174,573},{1178,573},{1176,572},{1177,570},{1176,568},{1173,569},{1168,567}}}, + {"America/Tegucigalpa",45,{{-876,132},{-877,133},{-876,133},{-876,134},{-875,133},{-875,134},{-874,134},{-870,161},{-869,161},{-862,164},{-864,164},{-866,163},{-861,164},{-839,174},{-840,174},{-859,164},{-860,164},{-858,165},{-859,165},{-868,137},{-867,133},{-869,133},{-870,130},{-873,130},{-873,131},{-878,134},{-878,139},{-885,139},{-893,144},{-892,146},{-892,151},{-880,159},{-864,158},{-859,159},{-860,160},{-843,158},{-832,150},{-845,146},{-849,148},{-852,146},{-852,143},{-858,140},{-857,138},{-860,141},{-863,138}}}, + {"Europe/Zaporozhye",32,{{342,475},{349,475},{348,481},{352,481},{360,481},{361,478},{366,478},{367,476},{372,475},{369,472},{371,470},{368,466},{366,468},{364,467},{362,465},{361,465},{362,466},{359,467},{355,464},{352,461},{350,461},{352,462},{354,464},{352,465},{351,463},{350,465},{348,465},{346,467},{348,469},{346,470},{345,473},{343,473}}}, + {"Asia/Dhaka",245,{{906,235},{906,236},{923,206},{923,207},{924,207},{906,232},{905,231},{905,232},{906,233},{907,233},{907,234},{902,234},{903,234},{905,234},{904,234},{905,233},{906,234},{902,232},{901,233},{903,233},{902,233},{904,233},{905,235},{904,236},{905,236},{907,235},{907,236},{892,240},{891,240},{898,237},{898,238},{899,237},{897,239},{892,239},{893,239},{894,239},{897,238},{896,238},{895,238},{902,238},{901,238},{901,239},{902,235},{907,237},{906,237},{901,236},{903,237},{907,220},{907,221},{905,220},{905,221},{908,236},{904,237},{902,237},{920,216},{920,217},{890,219},{891,219},{891,217},{891,218},{904,218},{905,218},{892,217},{893,217},{893,216},{894,217},{919,215},{919,217},{920,215},{919,216},{919,218},{904,217},{918,217},{918,219},{919,219},{898,218},{911,221},{896,218},{896,217},{893,218},{894,219},{898,219},{897,219},{896,219},{895,219},{895,220},{899,222},{899,223},{918,223},{918,222},{903,223},{903,224},{910,222},{905,222},{906,222},{908,222},{909,222},{906,223},{910,223},{912,224},{906,224},{907,224},{906,225},{910,224},{912,223},{911,222},{910,225},{911,225},{915,224},{914,224},{914,227},{915,225},{912,225},{907,225},{906,226},{910,226},{913,226},{912,226},{911,226},{911,227},{905,227},{905,228},{906,228},{913,227},{908,227},{906,221},{908,228},{909,228},{910,227},{913,228},{912,227},{906,227},{903,218},{905,219},{900,218},{900,220},{901,220},{901,219},{900,219},{899,219},{904,220},{908,221},{906,220},{906,219},{907,219},{903,219},{904,219},{902,219},{903,220},{904,221},{903,221},{910,221},{909,221},{905,226},{907,228},{909,224},{903,227},{900,225},{901,226},{900,226},{900,227},{898,222},{897,218},{889,230},{890,232},{887,233},{888,235},{886,236},{888,240},{887,243},{881,245},{880,247},{881,249},{883,249},{884,252},{889,252},{890,253},{888,255},{885,255},{881,258},{882,261},{885,264},{883,265},{884,266},{887,264},{887,263},{890,262},{889,264},{891,264},{894,260},{896,260},{897,262},{899,259},{899,253},{904,251},{921,252},{925,249},{923,248},{919,241},{918,242},{914,241},{912,237},{913,231},{914,233},{916,229},{918,231},{920,237},{923,237},{927,213},{924,215},{922,213},{920,212},{919,224},{920,224},{921,224},{921,225},{920,225},{914,228},{915,229},{913,229},{907,229},{906,231},{908,237},{902,239},{899,240},{900,238},{900,237},{897,240},{893,240},{903,231},{904,223},{901,218},{903,222},{903,225},{904,228},{906,229},{903,230},{904,230},{904,229},{903,229},{906,230},{907,230},{905,229},{905,230},{904,231}}}, + {"Pacific/Fiji",197,{{-1795,-174},{-1787,-207},{-1782,-198},{-1787,-206},{1797,-191},{1798,-191},{1798,-192},{1797,-192},{-1784,-192},{1782,-191},{-1798,-189},{-1798,-190},{-1799,-190},{-1790,-190},{-1790,-189},{-1789,-189},{-1789,-190},{-1788,-190},{-1785,-190},{1781,-192},{-1784,-191},{-1786,-191},{-1785,-192},{-1786,-192},{-1786,-188},{-1786,-189},{-1787,-188},{1785,-188},{1785,-189},{-1786,-187},{-1785,-187},{-1785,-186},{1799,-186},{1799,-187},{1798,-186},{-1785,-184},{-1784,-184},{1776,-185},{1777,-186},{-1784,-190},{-1784,-189},{-1787,-182},{-1788,-183},{-1788,-182},{1786,-181},{1785,-181},{1784,-189},{1785,-190},{1780,-191},{1782,-190},{-1785,-189},{-1787,-183},{-1790,-180},{-1791,-180},{1794,-178},{1794,-179},{1794,-181},{1793,-181},{1792,-180},{1793,-179},{1786,-179},{1774,-178},{1785,-182},{1791,-178},{1792,-178},{-1793,-177},{-1793,-178},{1772,-178},{-1788,-177},{1787,-177},{1788,-178},{1787,-178},{1772,-177},{1771,-177},{1793,-177},{1793,-176},{1771,-176},{1787,-176},{-1787,-175},{1773,-175},{1788,-177},{1788,-176},{1790,-176},{1790,-177},{1781,-184},{1782,-184},{1780,-184},{-1793,-184},{1791,-171},{1773,-171},{1772,-172},{-1789,-172},{-1790,-172},{1769,-172},{1769,-171},{1786,-166},{1800,-166},{1799,-167},{1799,-166},{1787,-166},{1800,-165},{-1800,-165},{-1799,-164},{-1799,-165},{-1797,-165},{1791,-164},{1793,-164},{1793,-163},{1794,-163},{1794,-164},{1796,-163},{1796,-162},{1791,-162},{-1792,-161},{-1791,-161},{-1795,-159},{-1800,-157},{-1799,-157},{-1799,-158},{1771,-125},{1770,-125},{1798,-162},{1797,-162},{1799,-162},{-1800,-161},{-1799,-161},{-1800,-162},{1800,-170},{1799,-170},{1800,-168},{-1800,-170},{-1800,-168},{-1799,-167},{-1798,-168},{1784,-168},{-1797,-167},{-1791,-173},{-1792,-173},{-1792,-172},{-1795,-173},{-1795,-172},{1783,-174},{1786,-176},{1785,-180},{1784,-182},{1779,-183},{1773,-181},{1773,-179},{1775,-175},{-1798,-167},{-1797,-168},{1775,-169},{1790,-169},{1774,-170},{1773,-170},{1773,-169},{1774,-169},{1791,-168},{1783,-168},{1776,-167},{1775,-168},{1774,-168},{-1793,-170},{1789,-166},{1789,-165},{1800,-161},{1795,-167},{1799,-165},{1799,-168},{1793,-168},{1792,-167},{1791,-169},{1789,-168},{1787,-170},{1785,-168},{1782,-173},{-1788,-173},{1790,-174},{1790,-175},{-1792,-174},{-1791,-174},{-1791,-175},{-1792,-175},{1789,-174},{-1790,-173},{-1789,-173},{-1790,-174},{1788,-174},{1771,-174},{1772,-174},{-1789,-174},{1771,-173},{1772,-173},{1794,-172},{1794,-173},{1794,-174},{1781,-173}}}, + {"Europe/Athens",480,{{267,363},{268,363},{238,378},{257,349},{241,348},{240,349},{241,349},{262,353},{262,354},{262,350},{262,349},{261,350},{246,350},{259,352},{263,352},{263,353},{264,353},{271,354},{271,356},{272,358},{272,355},{262,359},{296,361},{296,362},{277,362},{233,359},{233,358},{264,361},{272,359},{268,359},{295,362},{269,354},{270,354},{269,353},{268,354},{269,355},{239,355},{252,355},{252,354},{278,365},{278,366},{279,366},{272,366},{271,366},{231,362},{229,362},{229,364},{231,363},{252,362},{252,363},{275,362},{276,362},{278,363},{277,363},{282,365},{281,361},{278,359},{258,363},{236,356},{237,355},{237,357},{238,355},{242,356},{241,355},{243,354},{250,354},{258,353},{258,351},{247,349},{247,351},{244,352},{236,352},{273,365},{259,363},{275,364},{267,364},{274,364},{273,364},{271,371},{271,373},{272,369},{271,369},{271,370},{272,370},{271,367},{272,367},{268,376},{194,398},{194,399},{196,399},{195,398},{240,391},{239,391},{241,391},{235,391},{236,392},{238,391},{237,391},{202,391},{202,392},{203,391},{229,375},{231,392},{241,390},{201,392},{201,393},{232,392},{235,392},{234,392},{239,392},{240,392},{240,393},{258,392},{242,395},{250,395},{250,396},{251,395},{241,393},{241,394},{243,393},{243,394},{242,394},{252,399},{237,401},{238,402},{233,377},{240,403},{239,403},{239,404},{251,400},{256,405},{257,404},{254,405},{247,408},{248,407},{246,406},{246,408},{251,410},{199,397},{198,397},{201,394},{196,398},{254,400},{253,398},{253,399},{250,398},{233,378},{232,378},{234,377},{235,377},{234,378},{236,378},{264,376},{265,376},{266,376},{265,375},{266,375},{235,375},{235,376},{247,376},{240,376},{239,376},{239,377},{240,377},{264,377},{262,376},{260,375},{261,376},{213,384},{213,383},{211,383},{211,384},{265,365},{264,365},{264,366},{265,366},{250,377},{252,376},{253,376},{252,375},{244,376},{243,375},{243,377},{268,377},{266,377},{271,378},{269,376},{241,377},{241,378},{242,377},{263,385},{260,384},{258,386},{262,386},{260,382},{259,383},{242,382},{243,380},{241,382},{231,386},{231,387},{207,387},{208,387},{205,381},{204,383},{204,382},{203,382},{206,385},{208,381},{212,383},{230,382},{207,383},{207,385},{211,385},{210,385},{208,385},{214,383},{221,384},{210,384},{210,377},{208,377},{206,379},{207,379},{250,378},{249,377},{247,380},{250,379},{245,379},{236,379},{235,379},{234,380},{235,380},{242,380},{207,386},{208,386},{242,386},{209,385},{209,386},{210,387},{250,366},{245,381},{246,382},{245,380},{242,381},{241,384},{237,384},{232,388},{228,389},{233,390},{236,388},{242,387},{243,382},{262,385},{255,386},{255,385},{256,385},{256,386},{246,387},{246,388},{206,388},{207,389},{207,388},{205,386},{245,388},{244,388},{243,388},{244,389},{231,390},{245,390},{247,388},{263,390},{261,391},{263,392},{260,391},{259,393},{263,394},{266,390},{265,391},{265,390},{230,365},{229,365},{257,368},{258,368},{257,366},{261,365},{261,366},{262,365},{262,366},{270,366},{263,366},{270,365},{263,365},{254,364},{254,363},{254,365},{255,364},{253,364},{253,365},{258,364},{259,364},{257,364},{218,367},{217,368},{217,367},{219,367},{247,367},{246,368},{247,368},{242,368},{243,368},{239,368},{239,369},{255,368},{254,368},{255,369},{257,369},{245,368},{259,369},{262,369},{247,369},{256,369},{216,371},{216,370},{215,371},{257,371},{232,372},{269,371},{268,371},{268,372},{269,372},{245,372},{245,371},{244,371},{258,371},{210,373},{210,372},{231,372},{231,373},{232,373},{246,373},{233,373},{256,374},{268,373},{267,373},{266,373},{265,374},{266,374},{234,373},{235,374},{236,374},{235,373},{267,374},{268,374},{244,373},{244,374},{244,375},{245,374},{253,374},{252,374},{217,369},{217,370},{251,370},{250,369},{250,370},{260,369},{261,369},{269,369},{235,369},{256,370},{247,370},{246,370},{248,370},{263,370},{251,369},{251,371},{270,369},{270,370},{269,370},{264,370},{265,370},{254,369},{253,371},{255,372},{256,371},{252,370},{249,366},{248,367},{251,366},{251,367},{252,367},{254,366},{253,368},{254,367},{243,366},{244,368},{245,367},{274,369},{270,367},{269,367},{269,375},{270,375},{270,374},{230,374},{255,375},{255,374},{239,375},{254,375},{253,375},{249,374},{249,375},{250,374},{232,380},{230,379},{231,375},{227,376},{232,365},{226,368},{225,364},{221,370},{219,370},{217,374},{211,379},{214,382},{216,381},{219,383},{229,379},{232,382},{227,384},{226,383},{224,384},{215,383},{213,385},{211,386},{208,390},{212,389},{211,390},{207,390},{200,397},{202,396},{204,398},{203,400},{207,401},{208,404},{210,406},{210,409},{216,409},{221,412},{227,411},{228,413},{243,416},{253,412},{261,414},{261,417},{266,416},{266,414},{263,413},{264,410},{261,407},{237,408},{240,405},{244,402},{237,404},{240,399},{234,403},{234,402},{238,399},{234,400},{233,402},{228,405},{230,406},{226,405},{226,400},{232,391},{231,391},{229,394},{228,392},{225,389},{233,386},{233,385},{236,380}}}, + {"Pacific/Tarawa",68,{{1768,-27},{1768,-26},{1760,-25},{1756,-20},{1755,-20},{1756,-19},{1755,-18},{1751,-15},{1751,-16},{1750,-15},{1750,-14},{1749,-14},{1748,-13},{1742,-5},{1729,13},{1729,14},{1760,-14},{1759,-13},{1747,-12},{1747,-11},{1748,-12},{1695,-9},{1695,-8},{1696,-9},{1745,-8},{1744,-6},{1745,-7},{1743,-6},{1743,-5},{1730,13},{1735,2},{1736,2},{1734,2},{1734,3},{1736,1},{1739,3},{1738,3},{1739,4},{1738,4},{1739,5},{1738,5},{1765,-14},{1764,-13},{1730,9},{1730,8},{1730,10},{1732,14},{1731,14},{1730,15},{1730,16},{1730,17},{1731,18},{1729,19},{1728,19},{1733,20},{1733,21},{1728,30},{1728,31},{1729,31},{1727,31},{1730,32},{1729,20},{1727,33},{1727,32},{1730,33},{1730,34},{1731,10},{1731,9}}}, + {"America/Resolute",14,{{-963,753},{-951,747},{-953,756},{-944,756},{-937,754},{-935,753},{-936,752},{-934,749},{-934,747},{-947,746},{-966,750},{-965,752},{-958,754},{-961,754}}}, + {"Africa/Brazzaville",63,{{112,-40},{113,-37},{115,-35},{119,-37},{120,-34},{119,-32},{121,-30},{116,-28},{116,-23},{118,-25},{120,-23},{125,-24},{124,-19},{127,-19},{130,-23},{135,-24},{138,-21},{139,-24},{141,-25},{144,-19},{145,-6},{139,-2},{139,2},{141,5},{144,6},{145,9},{143,13},{140,14},{132,12},{133,22},{146,22},{149,20},{158,19},{161,17},{161,22},{165,28},{166,35},{175,37},{182,35},{185,36},{186,32},{181,22},{181,15},{179,10},{180,4},{178,1},{177,-5},{173,-10},{168,-13},{162,-22},{162,-33},{159,-39},{156,-40},{147,-49},{144,-49},{144,-43},{140,-45},{137,-44},{137,-47},{134,-49},{128,-44},{120,-50},{117,-45}}}, + {"Africa/Libreville",48,{{88,-9},{94,8},{139,-1},{139,-2},{145,-7},{145,-17},{141,-25},{139,-24},{138,-21},{135,-24},{130,-23},{128,-19},{124,-19},{125,-24},{120,-23},{118,-25},{116,-23},{116,-28},{121,-30},{119,-32},{120,-34},{119,-37},{115,-35},{113,-37},{112,-40},{96,-24},{87,-6},{88,-8},{93,-5},{94,4},{95,1},{97,1},{99,2},{95,3},{93,5},{95,7},{96,5},{97,11},{100,9},{113,10},{114,23},{133,23},{132,12},{138,14},{143,13},{145,8},{139,3},{96,3}}}, + {"Atlantic/St_Helena",18,{{-100,-403},{-99,-403},{-99,-404},{-125,-374},{-127,-373},{-126,-373},{-123,-371},{-122,-371},{-123,-372},{-124,-371},{-57,-159},{-56,-160},{-57,-160},{-58,-160},{-143,-79},{-143,-80},{-144,-80},{-144,-79}}}, + {"Europe/Samara",81,{{501,545},{509,543},{510,546},{514,547},{519,545},{521,543},{524,545},{525,544},{522,543},{525,541},{521,535},{522,531},{517,529},{517,527},{515,527},{514,521},{508,518},{507,519},{502,520},{502,521},{497,523},{496,524},{495,523},{492,525},{489,524},{487,526},{484,527},{486,529},{482,530},{479,534},{484,535},{483,537},{486,537},{485,538},{500,538},{500,540},{502,540},{503,543},{544,564},{540,560},{533,559},{532,559},{536,562},{533,563},{533,561},{531,561},{529,564},{531,565},{528,565},{530,564},{526,563},{528,562},{527,560},{522,561},{522,559},{514,559},{517,561},{514,561},{511,565},{515,569},{513,569},{511,574},{519,576},{519,580},{517,582},{520,585},{538,584},{541,580},{542,577},{540,576},{543,575},{541,573},{543,573},{543,571},{544,570},{541,570},{540,567},{538,568},{538,566},{541,567},{540,566}}}, + {"America/Adak",152,{{-1789,514},{-1789,513},{-1790,513},{-1790,514},{-1783,515},{-1790,516},{-1791,516},{-1791,513},{-1790,512},{-1791,512},{-1789,516},{-1788,516},{-1787,515},{-1788,515},{-1788,518},{-1787,518},{-1789,518},{-1786,516},{-1787,516},{1796,520},{1798,519},{1795,519},{1795,520},{1795,514},{1792,514},{1786,516},{1789,516},{-1761,518},{-1765,517},{-1781,519},{-1778,518},{-1776,519},{-1779,516},{-1781,517},{-1779,518},{-1782,519},{-1766,517},{-1766,520},{-1764,517},{-1770,516},{-1769,518},{-1767,518},{-1768,520},{-1771,519},{-1771,517},{-1777,517},{-1772,518},{-1768,518},{-1764,518},{-1764,519},{-1763,519},{-1763,517},{1784,519},{1785,520},{1786,520},{1785,519},{-1755,522},{-1725,522},{-1726,524},{-1723,523},{-1751,522},{-1759,520},{-1713,524},{-1713,525},{-1712,525},{-1712,524},{-1712,526},{-1711,526},{1741,527},{1742,527},{1740,527},{-1708,525},{-1707,527},{-1706,527},{-1706,526},{-1700,529},{-1701,529},{-1698,531},{-1697,531},{-1698,530},{-1697,529},{-1697,530},{-1701,527},{-1702,527},{-1702,528},{-1701,528},{1739,528},{1739,527},{-1700,528},{-1699,529},{-1697,528},{1733,529},{1734,528},{1729,527},{1725,529},{1760,523},{1759,523},{1759,524},{1760,524},{1734,524},{1738,525},{1737,524},{1782,518},{1783,518},{1784,518},{-1760,518},{-1762,518},{-1762,519},{-1760,519},{-1761,519},{-1762,520},{-1757,519},{-1758,519},{-1759,519},{-1758,520},{-1760,520},{-1757,520},{-1756,520},{-1761,520},{1783,520},{1784,520},{1783,519},{1782,520},{1781,520},{1776,520},{1777,520},{1777,519},{1776,521},{1776,519},{1772,519},{1775,520},{-1754,520},{-1755,520},{-1760,521},{-1762,521},{-1761,521},{-1740,521},{-1735,522},{-1730,521},{-1735,520},{-1745,520},{-1744,520},{-1750,520},{-1751,520},{-1753,520},{-1745,521},{-1742,523},{-1745,523},{-1743,524},{-1740,523},{-1742,522},{-1741,521}}}, + {"America/Argentina/Jujuy",25,{{-672,-228},{-667,-222},{-663,-221},{-662,-218},{-658,-221},{-652,-221},{-653,-226},{-652,-229},{-650,-230},{-649,-235},{-647,-234},{-644,-236},{-642,-235},{-642,-242},{-646,-246},{-648,-245},{-649,-246},{-655,-244},{-660,-239},{-660,-235},{-663,-234},{-665,-242},{-669,-241},{-672,-238},{-670,-230}}}, + {"Africa/Sao_Tome",8,{{74,17},{74,16},{73,16},{65,0},{65,3},{67,4},{68,2},{73,14}}}, + {"Europe/Bratislava",26,{{171,481},{168,484},{170,488},{177,489},{186,495},{191,494},{195,496},{198,494},{198,492},{201,492},{203,494},{209,493},{216,494},{226,491},{221,484},{217,484},{215,486},{205,485},{203,483},{199,481},{196,482},{195,481},{188,480},{189,478},{187,478},{178,477}}}, + {"America/Lima",126,{{-769,-123},{-772,-121},{-765,-139},{-765,-138},{-764,-138},{-764,-137},{-762,-143},{-753,-153},{-785,-94},{-784,-94},{-785,-93},{-787,-90},{-786,-91},{-812,-52},{-808,-65},{-809,-64},{-808,-64},{-807,-70},{-807,-69},{-795,-78},{-777,-120},{-777,-119},{-773,-121},{-766,-128},{-769,-124},{-696,-173},{-695,-175},{-698,-177},{-698,-181},{-704,-183},{-714,-177},{-715,-173},{-752,-154},{-763,-142},{-764,-139},{-763,-139},{-762,-134},{-768,-123},{-773,-115},{-777,-113},{-777,-109},{-782,-101},{-788,-86},{-795,-77},{-797,-71},{-800,-67},{-811,-60},{-811,-58},{-808,-58},{-808,-55},{-811,-50},{-813,-47},{-813,-45},{-808,-37},{-802,-34},{-802,-39},{-805,-41},{-803,-42},{-804,-44},{-801,-43},{-798,-45},{-796,-44},{-793,-50},{-790,-50},{-786,-45},{-783,-34},{-781,-35},{-782,-34},{-778,-30},{-766,-26},{-755,-15},{-754,-10},{-752,-10},{-752,-5},{-756,-3},{-756,-1},{-752,0},{-748,-2},{-744,-6},{-743,-10},{-736,-13},{-735,-17},{-731,-18},{-732,-23},{-729,-25},{-721,-25},{-717,-21},{-714,-24},{-708,-22},{-700,-27},{-707,-38},{-702,-39},{-700,-44},{-706,-41},{-709,-44},{-719,-45},{-728,-51},{-732,-60},{-731,-65},{-737,-68},{-737,-73},{-740,-74},{-740,-75},{-737,-78},{-738,-79},{-735,-83},{-729,-90},{-732,-94},{-724,-95},{-722,-100},{-712,-100},{-705,-94},{-706,-110},{-696,-109},{-687,-125},{-690,-129},{-689,-135},{-691,-137},{-688,-142},{-694,-148},{-691,-153},{-694,-156},{-692,-161},{-688,-163},{-779,-115},{-778,-115}}}, + {"America/Toronto",278,{{-893,481},{-876,487},{-876,488},{-875,488},{-875,487},{-827,417},{-827,418},{-826,418},{-892,481},{-815,523},{-823,531},{-822,531},{-876,560},{-876,561},{-875,560},{-882,489},{-881,489},{-880,489},{-817,460},{-818,460},{-817,461},{-816,461},{-816,460},{-815,461},{-847,466},{-847,467},{-845,469},{-844,469},{-847,473},{-848,473},{-858,473},{-858,474},{-848,474},{-849,474},{-849,475},{-858,477},{-859,477},{-856,477},{-857,477},{-894,481},{-860,481},{-861,481},{-892,482},{-891,482},{-893,482},{-890,482},{-886,483},{-886,484},{-887,484},{-885,484},{-885,485},{-884,485},{-889,485},{-888,485},{-883,485},{-883,486},{-882,486},{-881,487},{-881,486},{-864,487},{-866,487},{-874,488},{-878,488},{-880,487},{-879,487},{-870,487},{-870,486},{-871,486},{-871,487},{-877,488},{-876,489},{-794,436},{-775,439},{-803,426},{-802,426},{-766,439},{-777,440},{-767,441},{-768,441},{-766,442},{-763,442},{-764,442},{-762,442},{-764,443},{-763,443},{-762,443},{-764,441},{-765,441},{-765,442},{-760,443},{-760,444},{-759,444},{-758,444},{-813,447},{-802,449},{-798,448},{-810,448},{-802,448},{-810,449},{-809,448},{-809,449},{-801,448},{-801,449},{-798,449},{-799,448},{-799,449},{-814,449},{-814,450},{-800,450},{-801,451},{-800,451},{-801,452},{-800,452},{-801,453},{-817,453},{-818,453},{-816,453},{-802,453},{-803,453},{-803,454},{-818,454},{-804,455},{-818,455},{-817,455},{-805,455},{-800,449},{-816,455},{-816,456},{-804,456},{-806,456},{-829,456},{-829,457},{-830,457},{-815,458},{-831,458},{-816,459},{-808,459},{-809,459},{-830,458},{-829,458},{-817,459},{-818,459},{-810,459},{-810,460},{-811,459},{-819,459},{-819,460},{-815,455},{-815,456},{-814,456},{-750,456},{-744,456},{-745,453},{-743,452},{-753,449},{-770,440},{-770,442},{-773,442},{-776,441},{-776,443},{-778,443},{-771,442},{-771,440},{-770,439},{-769,439},{-771,438},{-789,439},{-798,433},{-791,433},{-789,429},{-802,428},{-804,426},{-801,425},{-813,426},{-818,422},{-824,421},{-825,419},{-831,420},{-831,423},{-825,426},{-824,430},{-817,434},{-818,441},{-813,446},{-817,452},{-813,452},{-812,449},{-810,450},{-811,447},{-809,446},{-806,447},{-801,445},{-800,447},{-797,447},{-797,448},{-799,451},{-802,452},{-804,454},{-807,459},{-818,457},{-817,458},{-816,458},{-819,455},{-820,456},{-821,455},{-835,459},{-836,461},{-839,461},{-841,465},{-846,465},{-844,467},{-846,467},{-846,468},{-848,470},{-846,473},{-850,476},{-848,479},{-859,480},{-864,488},{-873,488},{-884,490},{-881,488},{-883,488},{-885,488},{-888,483},{-889,483},{-888,486},{-894,485},{-894,483},{-893,484},{-892,483},{-896,480},{-900,480},{-900,482},{-910,485},{-910,492},{-900,495},{-900,508},{-905,510},{-908,512},{-908,515},{-900,520},{-900,528},{-890,528},{-890,530},{-885,534},{-885,536},{-890,540},{-900,540},{-900,562},{-889,569},{-880,565},{-859,556},{-851,553},{-839,553},{-823,551},{-822,548},{-825,542},{-821,538},{-821,533},{-823,529},{-816,524},{-814,521},{-807,518},{-804,513},{-798,512},{-795,515},{-796,474},{-794,471},{-787,463},{-777,462},{-770,458},{-768,459},{-766,457},{-767,456},{-764,455},{-761,455},{-758,454}}}, + {"America/New_York",621,{{-816,246},{-817,246},{-818,246},{-813,247},{-813,248},{-751,199},{-752,199},{-751,200},{-752,200},{-820,245},{-819,245},{-829,246},{-821,246},{-818,245},{-816,247},{-814,246},{-814,247},{-815,246},{-817,247},{-812,247},{-815,247},{-809,248},{-815,248},{-808,248},{-816,248},{-814,248},{-807,248},{-807,249},{-806,249},{-811,247},{-813,246},{-810,247},{-827,277},{-826,277},{-826,279},{-825,279},{-824,279},{-828,280},{-828,281},{-821,269},{-822,269},{-826,273},{-827,274},{-827,275},{-828,276},{-827,276},{-829,282},{-828,282},{-827,287},{-827,288},{-826,289},{-827,289},{-831,291},{-830,292},{-830,291},{-826,288},{-831,292},{-832,293},{-849,297},{-851,297},{-851,296},{-852,297},{-850,296},{-847,298},{-846,298},{-844,300},{-843,301},{-843,300},{-842,301},{-792,333},{-792,334},{-793,333},{-802,325},{-802,326},{-804,325},{-799,328},{-798,328},{-797,328},{-794,330},{-794,331},{-793,331},{-796,329},{-797,329},{-811,318},{-811,319},{-805,324},{-806,324},{-806,323},{-804,324},{-805,323},{-807,323},{-808,323},{-806,250},{-807,250},{-808,250},{-805,250},{-804,251},{-807,251},{-806,251},{-805,251},{-806,252},{-805,252},{-810,252},{-809,252},{-810,253},{-811,253},{-809,253},{-812,253},{-811,254},{-802,254},{-803,254},{-802,253},{-802,255},{-802,257},{-801,257},{-813,257},{-814,257},{-814,258},{-815,258},{-801,258},{-801,259},{-815,259},{-818,260},{-817,260},{-819,264},{-817,259},{-817,258},{-816,259},{-821,265},{-821,266},{-822,265},{-820,265},{-821,264},{-822,266},{-822,267},{-823,268},{-823,267},{-745,393},{-744,394},{-763,353},{-764,353},{-757,360},{-756,358},{-757,359},{-756,359},{-759,365},{-758,363},{-759,363},{-743,395},{-743,396},{-675,445},{-676,445},{-743,394},{-745,394},{-748,390},{-748,391},{-747,391},{-756,396},{-756,395},{-744,395},{-751,383},{-761,394},{-761,395},{-736,406},{-735,406},{-734,406},{-738,406},{-679,444},{-679,445},{-681,444},{-682,444},{-733,406},{-741,398},{-741,397},{-740,407},{-709,423},{-710,423},{-764,439},{-763,440},{-764,440},{-764,441},{-763,441},{-670,449},{-670,448},{-673,446},{-675,446},{-676,444},{-678,445},{-678,444},{-677,446},{-677,445},{-683,441},{-683,442},{-682,443},{-683,443},{-688,438},{-688,439},{-687,439},{-686,441},{-687,441},{-684,441},{-685,441},{-686,440},{-687,440},{-689,440},{-688,441},{-689,441},{-702,435},{-703,435},{-702,436},{-702,437},{-693,438},{-696,438},{-689,438},{-699,438},{-697,438},{-697,439},{-701,437},{-700,437},{-701,438},{-702,438},{-700,438},{-689,439},{-763,439},{-693,439},{-691,439},{-691,440},{-694,439},{-694,440},{-693,440},{-762,440},{-688,440},{-763,442},{-687,443},{-761,443},{-762,442},{-760,443},{-759,444},{-758,444},{-684,444},{-689,444},{-689,445},{-689,442},{-688,442},{-690,441},{-684,442},{-685,442},{-684,443},{-685,443},{-690,442},{-690,443},{-689,443},{-688,443},{-703,413},{-687,442},{-686,442},{-686,443},{-685,444},{-726,408},{-725,408},{-728,408},{-738,408},{-738,409},{-725,410},{-737,410},{-739,408},{-729,407},{-730,407},{-731,407},{-700,412},{-701,412},{-702,413},{-701,414},{-704,416},{-707,415},{-708,416},{-713,416},{-713,417},{-714,416},{-714,417},{-716,412},{-708,413},{-705,414},{-710,414},{-709,414},{-708,414},{-708,415},{-709,415},{-705,413},{-706,413},{-706,415},{-714,415},{-713,415},{-712,417},{-712,415},{-720,410},{-719,411},{-725,409},{-723,410},{-724,410},{-724,411},{-723,411},{-721,411},{-722,412},{-720,413},{-719,413},{-828,417},{-739,405},{-740,406},{-735,409},{-732,409},{-726,409},{-828,416},{-827,415},{-827,416},{-700,419},{-702,420},{-759,366},{-760,366},{-753,379},{-761,380},{-760,380},{-760,379},{-761,379},{-757,376},{-756,376},{-756,377},{-760,378},{-754,379},{-753,380},{-752,380},{-759,373},{-759,374},{-758,373},{-757,374},{-757,373},{-770,347},{-757,375},{-763,375},{-756,375},{-758,374},{-759,371},{-760,371},{-760,367},{-759,367},{-768,372},{-767,372},{-758,372},{-759,372},{-765,381},{-760,381},{-761,381},{-767,381},{-768,382},{-767,382},{-761,382},{-760,382},{-762,382},{-762,383},{-762,389},{-761,389},{-762,390},{-780,339},{-780,340},{-779,339},{-779,341},{-780,338},{-778,342},{-772,346},{-771,346},{-763,349},{-762,349},{-762,350},{-761,350},{-763,350},{-765,346},{-766,346},{-767,347},{-766,347},{-765,347},{-780,341},{-849,309},{-851,312},{-851,318},{-849,323},{-852,329},{-856,350},{-854,350},{-851,356},{-847,359},{-849,362},{-847,364},{-848,366},{-846,369},{-851,373},{-854,372},{-856,375},{-861,374},{-863,376},{-862,378},{-865,380},{-864,382},{-860,380},{-854,385},{-854,387},{-848,388},{-848,389},{-851,389},{-851,393},{-848,393},{-848,417},{-834,417},{-829,415},{-831,415},{-831,414},{-825,414},{-817,415},{-791,426},{-789,428},{-791,433},{-785,434},{-768,433},{-762,435},{-761,440},{-762,441},{-750,450},{-715,450},{-713,453},{-709,452},{-703,459},{-703,462},{-700,467},{-692,475},{-689,472},{-683,474},{-678,471},{-678,457},{-674,456},{-675,453},{-671,452},{-672,446},{-676,447},{-679,446},{-680,445},{-681,443},{-683,445},{-685,445},{-688,444},{-688,445},{-691,444},{-692,439},{-698,437},{-700,439},{-703,437},{-704,436},{-708,429},{-708,427},{-706,426},{-711,423},{-708,423},{-706,420},{-707,420},{-703,417},{-700,418},{-703,421},{-701,420},{-699,418},{-699,417},{-700,415},{-700,417},{-702,417},{-706,418},{-714,418},{-715,414},{-730,413},{-743,405},{-740,404},{-741,400},{-749,389},{-750,389},{-749,392},{-751,392},{-754,391},{-751,388},{-751,386},{-753,386},{-751,384},{-752,384},{-758,375},{-760,373},{-758,376},{-759,376},{-756,380},{-759,379},{-758,381},{-759,383},{-759,382},{-760,383},{-760,384},{-763,385},{-761,385},{-763,386},{-761,386},{-760,386},{-762,387},{-761,388},{-762,388},{-763,387},{-763,388},{-764,387},{-763,389},{-763,390},{-764,388},{-761,390},{-761,392},{-763,391},{-759,396},{-762,393},{-762,395},{-763,394},{-763,393},{-764,394},{-764,392},{-765,393},{-766,393},{-764,390},{-766,391},{-765,389},{-766,390},{-763,380},{-769,383},{-770,385},{-772,384},{-772,386},{-773,384},{-772,383},{-770,384},{-770,382},{-762,379},{-764,376},{-765,376},{-766,378},{-769,380},{-766,376},{-763,376},{-764,375},{-763,373},{-765,372},{-768,375},{-763,371},{-763,370},{-766,372},{-769,372},{-764,369},{-760,369},{-755,358},{-760,365},{-758,361},{-761,363},{-761,361},{-767,360},{-761,360},{-760,356},{-758,360},{-757,356},{-762,353},{-766,355},{-766,354},{-769,354},{-765,353},{-769,350},{-771,347},{-768,347},{-775,345},{-780,342},{-788,338},{-792,332},{-800,326},{-805,325},{-808,325},{-807,322},{-812,317},{-811,316},{-812,316},{-812,315},{-815,310},{-812,297},{-806,286},{-806,281},{-800,268},{-804,252},{-804,253},{-811,252},{-819,265},{-818,267},{-820,270},{-823,270},{-822,268},{-824,278},{-827,280},{-829,279},{-826,287},{-828,292},{-834,297},{-840,301},{-842,302},{-845,300},{-844,299},{-854,297},{-854,300},{-850,298},{-852,301},{-849,307},{-758,352},{-760,351},{-761,351},{-756,352},{-755,353},{-755,354},{-755,352},{-757,352}}}, + {"Pacific/Honolulu",48,{{-1579,213},{-1577,213},{-1580,214},{-1558,200},{-1559,203},{-1552,200},{-1548,195},{-1557,189},{-1559,191},{-1561,197},{-1565,206},{-1566,206},{-1565,205},{-1567,205},{-1567,206},{-1570,209},{-1568,209},{-1568,208},{-1570,208},{-1572,212},{-1570,212},{-1567,212},{-1573,211},{-1566,210},{-1562,209},{-1560,207},{-1564,206},{-1567,209},{-1565,210},{-1605,217},{-1606,217},{-1601,220},{-1619,231},{-1647,236},{-1663,239},{-1717,258},{-1740,261},{-1602,219},{-1602,218},{-1603,218},{-1594,222},{-1593,221},{-1594,219},{-1598,220},{-1580,217},{-1577,215},{-1581,213},{-1583,216}}}, + {"Asia/Samarkand",82,{{682,389},{681,385},{684,382},{679,375},{678,372},{665,373},{666,375},{665,376},{666,380},{654,383},{625,400},{623,404},{621,406},{619,411},{614,413},{613,411},{604,413},{601,414},{601,418},{603,418},{599,420},{600,422},{594,423},{586,428},{586,427},{581,426},{585,423},{580,425},{579,422},{574,422},{570,419},{570,414},{572,414},{570,413},{560,413},{560,450},{586,456},{582,449},{582,444},{585,441},{595,440},{594,438},{603,441},{607,446},{620,435},{634,437},{645,436},{651,438},{657,433},{658,429},{661,430},{660,419},{665,419},{666,413},{668,412},{666,411},{668,408},{666,405},{669,405},{669,401},{675,399},{673,397},{675,393},{674,392},{588,443},{589,443},{588,441},{588,442},{591,447},{591,446},{590,444},{591,448},{590,446},{588,444},{588,446},{589,449},{589,448},{592,450},{590,448},{589,454},{594,452},{592,448}}}, + {"America/Port_of_Spain",13,{{-618,107},{-617,107},{-616,107},{-608,112},{-607,113},{-605,113},{-608,111},{-610,101},{-612,101},{-619,100},{-615,103},{-615,106},{-609,108}}}, + {"Africa/Johannesburg",101,{{378,-468},{379,-469},{376,-469},{377,-468},{379,-466},{380,-466},{380,-467},{379,-467},{184,-338},{181,-334},{182,-317},{236,-340},{234,-341},{223,-341},{217,-344},{208,-344},{209,-345},{205,-345},{200,-348},{193,-346},{194,-345},{191,-343},{188,-344},{188,-341},{185,-341},{185,-344},{184,-343},{183,-340},{185,-339},{184,-337},{178,-328},{183,-326},{183,-319},{173,-303},{165,-286},{167,-285},{169,-281},{171,-280},{174,-283},{174,-287},{182,-289},{192,-290},{196,-285},{200,-284},{200,-248},{207,-255},{208,-260},{206,-265},{207,-269},{209,-268},{217,-269},{226,-262},{230,-253},{235,-253},{239,-256},{247,-258},{254,-257},{257,-255},{259,-248},{264,-246},{269,-243},{270,-236},{277,-232},{283,-226},{289,-225},{290,-222},{296,-221},{303,-224},{313,-224},{316,-235},{320,-243},{320,-260},{313,-257},{308,-264},{308,-268},{312,-272},{315,-273},{320,-273},{320,-268},{329,-269},{324,-285},{314,-292},{300,-313},{279,-330},{265,-338},{257,-338},{257,-340},{250,-340},{248,-341},{248,-342},{274,-303},{281,-307},{284,-301},{292,-299},{292,-297},{295,-294},{293,-291},{287,-286},{278,-289},{274,-295},{270,-296}}}, + {"Pacific/Port_Moresby",556,{{1506,-102},{1506,-27},{1535,-116},{1533,-114},{1537,-115},{1538,-116},{1533,-115},{1521,-113},{1521,-112},{1541,-113},{1542,-113},{1543,-114},{1540,-114},{1534,-113},{1535,-113},{1540,-113},{1528,-112},{1528,-111},{1432,-83},{1531,-112},{1530,-112},{1531,-111},{1529,-112},{1531,-113},{1532,-113},{1533,-113},{1523,-111},{1525,-111},{1527,-111},{1528,-110},{1511,-110},{1510,-110},{1524,-111},{1525,-110},{1526,-111},{1529,-111},{1530,-109},{1530,-108},{1525,-108},{1522,-108},{1519,-108},{1524,-108},{1504,-108},{1518,-107},{1517,-108},{1513,-108},{1513,-107},{1503,-107},{1512,-107},{1498,-105},{1499,-105},{1501,-105},{1521,-104},{1494,-104},{1514,-104},{1537,-93},{1531,-92},{1528,-92},{1511,-103},{1510,-103},{1519,-103},{1519,-102},{1509,-100},{1502,-107},{1507,-107},{1504,-107},{1512,-106},{1509,-107},{1506,-106},{1507,-106},{1513,-106},{1511,-107},{1509,-106},{1510,-106},{1511,-106},{1510,-107},{1508,-106},{1508,-107},{1508,-105},{1528,-106},{1529,-107},{1527,-107},{1525,-106},{1524,-107},{1523,-107},{1514,-106},{1475,-77},{1473,-74},{1438,-75},{1438,-76},{1437,-76},{1447,-76},{1446,-77},{1472,-74},{1471,-71},{1471,-70},{1431,-92},{1430,-92},{1420,-92},{1502,-92},{1524,-91},{1524,-90},{1432,-91},{1433,-91},{1433,-86},{1434,-86},{1471,-95},{1470,-95},{1508,-93},{1507,-93},{1520,-93},{1519,-93},{1509,-93},{1509,-92},{1527,-92},{1525,-90},{1530,-92},{1530,-93},{1508,-92},{1525,-96},{1524,-96},{1508,-98},{1442,-78},{1442,-77},{1443,-78},{1435,-88},{1434,-88},{1434,-87},{1435,-87},{1510,-96},{1510,-97},{1510,-100},{1508,-97},{1511,-100},{1513,-100},{1512,-102},{1509,-97},{1509,-98},{1504,-96},{1504,-94},{1508,-94},{1520,-94},{1521,-94},{1504,-95},{1510,-95},{1462,-82},{1461,-82},{1503,-95},{1501,-94},{1524,-89},{1520,-90},{1519,-89},{1511,-89},{1512,-89},{1511,-88},{1519,-88},{1517,-87},{1513,-87},{1513,-86},{1514,-86},{1510,-87},{1510,-88},{1511,-86},{1510,-85},{1511,-84},{1512,-86},{1509,-85},{1510,-86},{1509,-86},{1476,-77},{1423,-82},{1454,-79},{1452,-78},{1452,-79},{1450,-78},{1438,-78},{1439,-78},{1439,-77},{1440,-78},{1444,-77},{1444,-78},{1443,-77},{1443,-76},{1431,-85},{1432,-85},{1429,-84},{1430,-84},{1431,-84},{1422,-82},{1424,-83},{1425,-83},{1429,-83},{1431,-83},{1434,-90},{1435,-90},{1465,-88},{1433,-85},{1508,-86},{1434,-85},{1436,-86},{1436,-87},{1432,-84},{1503,-85},{1438,-85},{1437,-84},{1437,-85},{1436,-85},{1509,-84},{1508,-83},{1509,-83},{1506,-83},{1436,-81},{1437,-81},{1437,-82},{1436,-82},{1435,-80},{1435,-81},{1434,-79},{1433,-84},{1435,-84},{1435,-83},{1437,-83},{1433,-83},{1434,-83},{1434,-84},{1557,-62},{1556,-62},{1546,-54},{1546,-53},{1545,-53},{1441,-32},{1441,-33},{1425,-31},{1424,-31},{1544,-31},{1527,-30},{1450,-40},{1547,-54},{1551,-55},{1555,-62},{1558,-64},{1560,-67},{1559,-68},{1556,-69},{1552,-66},{1552,-63},{1547,-59},{1551,-56},{1547,-56},{1546,-55},{1547,-55},{1571,-48},{1595,-46},{1547,-33},{1432,-32},{1433,-32},{1525,-31},{1526,-30},{1526,-32},{1525,-32},{1507,-30},{1527,-29},{1510,-30},{1508,-30},{1509,-29},{1527,-28},{1526,-28},{1520,-29},{1519,-29},{1520,-28},{1521,-30},{1519,-28},{1519,-27},{1507,-28},{1445,-40},{1445,-39},{1442,-38},{1547,-34},{1547,-35},{1448,-36},{1446,-36},{1532,-35},{1532,-34},{1446,-35},{1434,-34},{1435,-34},{1436,-34},{1435,-33},{1442,-34},{1476,-21},{1477,-21},{1478,-20},{1478,-21},{1444,-34},{1533,-34},{1468,-24},{1476,-23},{1475,-23},{1505,-25},{1504,-24},{1501,-24},{1503,-23},{1503,-24},{1474,-24},{1473,-24},{1464,-21},{1469,-19},{1428,-18},{1428,-17},{1429,-17},{1429,-18},{1500,-17},{1499,-17},{1500,-16},{1474,-20},{1474,-21},{1473,-21},{1473,-20},{1466,-19},{1466,-20},{1472,-20},{1496,-16},{1497,-16},{1440,-15},{1431,-15},{1430,-15},{1445,-14},{1442,-14},{1441,-13},{1442,-13},{1450,-16},{1450,-15},{1451,-15},{1496,-15},{1497,-15},{1451,-16},{1444,-12},{1444,-11},{1445,-11},{1495,-14},{1496,-13},{1440,-17},{1440,-16},{1482,-22},{1472,-22},{1478,-22},{1477,-22},{1477,-24},{1479,-23},{1478,-23},{1466,-22},{1455,-9},{1456,-9},{1443,-12},{1442,-12},{1507,-27},{1507,-26},{1497,-26},{1505,-27},{1504,-27},{1505,-26},{1506,-26},{1520,-27},{1520,-26},{1508,-26},{1473,-26},{1473,-25},{1489,-60},{1500,-25},{1502,-24},{1504,-25},{1502,-27},{1545,-52},{1546,-50},{1547,-52},{1545,-51},{1555,-48},{1541,-44},{1524,-42},{1525,-42},{1519,-42},{1524,-41},{1522,-43},{1522,-42},{1462,-48},{1463,-48},{1528,-48},{1529,-48},{1528,-47},{1495,-47},{1494,-47},{1495,-46},{1459,-47},{1459,-46},{1460,-45},{1461,-47},{1542,-45},{1542,-46},{1493,-46},{1494,-46},{1491,-46},{1491,-45},{1537,-41},{1536,-41},{1536,-40},{1537,-40},{1480,-60},{1480,-59},{1450,-41},{1451,-40},{1451,-41},{1521,-41},{1508,-28},{1520,-32},{1526,-38},{1528,-39},{1531,-43},{1523,-36},{1498,-63},{1503,-63},{1501,-63},{1500,-106},{1500,-105},{1501,-104},{1488,-101},{1484,-102},{1482,-100},{1480,-102},{1479,-100},{1477,-101},{1473,-95},{1469,-93},{1470,-91},{1466,-90},{1466,-88},{1463,-83},{1458,-79},{1449,-78},{1449,-76},{1448,-76},{1448,-77},{1446,-75},{1445,-75},{1445,-74},{1445,-77},{1445,-76},{1444,-76},{1444,-75},{1445,-78},{1441,-78},{1436,-75},{1437,-74},{1436,-74},{1436,-73},{1435,-73},{1439,-80},{1438,-79},{1433,-78},{1432,-78},{1430,-83},{1427,-83},{1424,-82},{1425,-84},{1426,-93},{1422,-91},{1423,-90},{1422,-89},{1421,-89},{1422,-92},{1420,-90},{1411,-92},{1410,-69},{1408,-66},{1410,-63},{1410,-26},{1425,-32},{1441,-38},{1445,-38},{1453,-44},{1458,-48},{1458,-55},{1476,-61},{1479,-66},{1469,-67},{1472,-75},{1477,-79},{1481,-81},{1482,-86},{1484,-87},{1486,-91},{1493,-90},{1492,-95},{1501,-97},{1497,-98},{1499,-100},{1506,-103},{1509,-102},{1506,-104},{1503,-103},{1505,-54},{1505,-53},{1499,-63},{1504,-63},{1496,-63},{1495,-63},{1495,-62},{1500,-63},{1490,-61},{1490,-62},{1489,-62},{1489,-61},{1479,-59},{1480,-58},{1481,-56},{1478,-55},{1494,-55},{1481,-54},{1480,-54},{1517,-56},{1458,-52},{1470,-51},{1469,-51},{1458,-51},{1511,-49},{1512,-49},{1512,-50},{1514,-49},{1476,-53},{1501,-53},{1493,-61},{1490,-60},{1484,-57},{1483,-55},{1499,-55},{1501,-50},{1501,-55},{1509,-55},{1513,-49},{1517,-49},{1515,-42},{1519,-43},{1522,-41},{1524,-43},{1523,-49},{1519,-50},{1521,-54},{1518,-56},{1515,-55},{1515,-57},{1512,-60},{1470,-54},{1471,-52},{1472,-54},{1471,-54},{1491,-49},{1492,-49}}}, + {"America/Bahia",96,{{-387,-130},{-386,-128},{-387,-128},{-385,-128},{-385,-127},{-386,-127},{-387,-127},{-387,-181},{-387,-180},{-393,-180},{-392,-180},{-391,-179},{-392,-179},{-392,-178},{-391,-176},{-390,-176},{-390,-156},{-390,-155},{-389,-156},{-390,-139},{-391,-139},{-389,-138},{-456,-150},{-461,-152},{-459,-144},{-463,-139},{-461,-130},{-462,-128},{-462,-125},{-463,-123},{-463,-121},{-461,-119},{-463,-118},{-461,-116},{-466,-113},{-462,-107},{-456,-103},{-453,-108},{-448,-109},{-446,-106},{-439,-104},{-437,-99},{-438,-94},{-435,-93},{-426,-96},{-423,-93},{-418,-93},{-414,-87},{-409,-88},{-409,-92},{-407,-92},{-408,-95},{-406,-95},{-394,-85},{-386,-90},{-385,-88},{-385,-90},{-383,-90},{-378,-101},{-378,-107},{-382,-107},{-382,-109},{-378,-115},{-374,-115},{-380,-126},{-385,-130},{-387,-126},{-388,-130},{-387,-129},{-386,-130},{-390,-133},{-389,-136},{-389,-139},{-391,-147},{-389,-159},{-392,-172},{-391,-177},{-397,-183},{-402,-180},{-402,-178},{-406,-174},{-405,-169},{-402,-168},{-403,-166},{-399,-162},{-402,-158},{-409,-157},{-413,-158},{-414,-155},{-418,-151},{-421,-152},{-432,-146},{-437,-147},{-439,-146},{-438,-143},{-442,-142}}}, + {"Europe/Zurich",27,{{62,463},{60,462},{62,464},{61,466},{71,473},{69,474},{70,475},{86,476},{84,477},{86,478},{96,475},{95,471},{101,468},{105,469},{105,465},{101,465},{101,462},{93,465},{90,458},{88,461},{85,463},{84,465},{79,459},{72,459},{68,462},{68,464},{87,477}}}, + {"America/St_Barthelemy",2,{{-628,179},{-629,179}}}, + {"Asia/Nicosia",11,{{330,346},{324,348},{323,351},{329,351},{329,354},{336,354},{346,357},{339,353},{341,350},{337,350},{336,348}}}, + {"Europe/Kaliningrad",18,{{196,545},{199,546},{197,545},{210,553},{209,552},{205,550},{212,549},{212,552},{214,553},{221,550},{226,551},{229,548},{227,546},{228,544},{198,544},{204,547},{200,550},{204,550}}}, + {"America/Anguilla",8,{{-630,183},{-629,183},{-634,186},{-632,182},{-631,182},{-630,182},{-633,183},{-632,183}}}, + {"Europe/Ljubljana",21,{{160,468},{163,468},{166,465},{163,465},{163,464},{156,462},{157,459},{153,457},{154,455},{148,455},{146,456},{144,455},{136,455},{139,456},{135,460},{137,462},{134,463},{137,465},{146,464},{150,467},{160,467}}}, + {"Asia/Yekaterinburg",547,{{709,664},{791,675},{790,675},{728,726},{778,675},{779,675},{780,675},{787,675},{786,675},{786,676},{787,676},{790,676},{789,676},{788,676},{674,688},{672,688},{671,688},{673,688},{657,691},{672,694},{673,694},{756,734},{754,734},{756,735},{761,735},{767,734},{765,735},{760,735},{764,735},{766,734},{718,730},{718,731},{717,731},{716,731},{715,731},{715,732},{764,731},{762,732},{761,732},{767,731},{760,731},{759,732},{760,732},{700,730},{700,734},{704,735},{712,734},{716,732},{670,694},{672,693},{676,695},{670,695},{674,696},{666,706},{665,706},{674,707},{673,707},{667,710},{667,711},{668,711},{665,708},{666,709},{666,710},{769,722},{756,722},{757,722},{772,722},{773,722},{770,722},{786,723},{756,725},{757,725},{780,723},{784,724},{784,723},{783,724},{727,727},{728,727},{729,726},{729,727},{770,723},{772,724},{776,726},{783,725},{778,723},{768,723},{698,729},{748,729},{747,728},{747,729},{746,729},{747,730},{746,728},{741,730},{743,731},{747,731},{749,730},{722,663},{723,663},{724,663},{722,664},{704,663},{704,664},{600,520},{600,519},{605,518},{604,516},{615,514},{617,513},{615,508},{606,507},{601,509},{598,506},{595,505},{586,508},{583,512},{578,511},{577,509},{575,509},{572,511},{568,511},{567,510},{564,511},{561,507},{557,506},{551,509},{547,509},{547,506},{545,505},{545,508},{534,515},{526,515},{523,518},{519,517},{517,515},{513,515},{514,517},{508,518},{514,521},{515,527},{517,527},{517,529},{522,531},{521,535},{525,541},{522,543},{530,543},{531,542},{529,542},{531,541},{535,540},{533,544},{536,549},{531,551},{536,552},{542,556},{540,559},{536,559},{544,563},{540,566},{541,567},{539,566},{538,568},{540,567},{541,570},{544,570},{543,571},{543,573},{541,573},{543,575},{540,576},{542,577},{541,580},{538,582},{539,583},{537,586},{539,588},{537,589},{539,591},{534,592},{532,593},{537,600},{535,602},{523,602},{523,604},{518,606},{519,609},{523,608},{529,611},{534,610},{533,609},{536,609},{538,608},{539,610},{550,609},{553,611},{563,612},{564,614},{567,615},{588,615},{593,617},{594,621},{597,625},{594,627},{595,629},{592,631},{596,639},{599,641},{596,642},{596,645},{595,645},{597,648},{602,651},{606,649},{619,657},{628,659},{629,661},{633,662},{632,663},{634,665},{651,669},{652,672},{661,675},{658,676},{662,677},{660,678},{661,679},{653,680},{653,682},{657,686},{653,688},{645,689},{645,690},{649,693},{662,691},{664,690},{666,689},{656,691},{664,689},{678,684},{682,684},{683,681},{686,683},{691,688},{681,692},{680,693},{682,695},{670,697},{669,696},{668,696},{670,700},{674,700},{671,702},{670,711},{670,713},{684,718},{689,727},{693,729},{716,729},{728,725},{726,725},{728,723},{723,717},{718,715},{726,711},{726,710},{728,709},{728,704},{724,703},{727,698},{725,696},{727,695},{725,694},{726,693},{725,691},{726,689},{736,685},{731,682},{732,679},{731,677},{726,676},{724,673},{721,673},{722,671},{721,671},{719,671},{721,670},{718,669},{714,670},{715,669},{705,667},{699,669},{688,669},{691,669},{689,668},{692,668},{692,666},{723,662},{723,665},{739,670},{739,673},{747,677},{748,680},{743,684},{745,687},{761,690},{766,690},{766,688},{773,685},{771,683},{773,682},{772,681},{773,679},{770,678},{777,676},{776,673},{785,676},{788,674},{792,673},{793,673},{794,673},{794,672},{796,672},{800,671},{789,674},{795,673},{775,677},{776,679},{775,681},{781,683},{778,685},{776,689},{760,693},{748,691},{738,692},{739,694},{735,698},{738,699},{737,701},{743,706},{736,712},{730,714},{735,716},{735,718},{750,722},{751,724},{748,728},{750,729},{755,727},{753,727},{755,725},{757,723},{752,718},{755,715},{752,714},{758,712},{778,711},{784,709},{783,712},{763,716},{760,719},{769,721},{776,718},{781,719},{782,720},{780,721},{774,721},{781,724},{803,719},{800,718},{801,717},{794,716},{791,714},{806,711},{807,708},{806,707},{808,707},{806,705},{808,704},{802,704},{793,701},{793,700},{789,699},{791,697},{790,697},{795,697},{799,693},{810,692},{816,693},{817,694},{819,693},{818,693},{818,692},{825,692},{823,691},{826,688},{830,687},{825,686},{827,685},{827,683},{824,682},{824,679},{817,679},{824,675},{822,674},{824,673},{821,672},{832,668},{833,667},{831,666},{831,665},{835,662},{833,661},{835,658},{840,658},{845,655},{846,653},{843,649},{859,648},{858,645},{860,643},{860,641},{850,636},{857,634},{855,631},{856,630},{844,622},{847,618},{860,615},{856,614},{857,613},{840,608},{835,610},{831,610},{822,605},{807,608},{794,606},{792,608},{779,607},{771,609},{770,607},{770,605},{768,605},{769,603},{767,601},{766,596},{759,594},{756,592},{757,590},{742,581},{712,581},{713,584},{709,585},{704,579},{707,576},{704,574},{707,572},{711,573},{717,568},{711,567},{711,566},{708,565},{709,564},{708,563},{709,560},{705,559},{708,559},{705,557},{708,556},{703,552},{690,555},{690,553},{688,554},{687,552},{682,552},{683,551},{681,549},{655,547},{652,545},{652,543},{632,542},{626,539},{624,541},{619,539},{613,541},{613,539},{610,539},{612,538},{609,536},{616,536},{613,535},{612,533},{621,530},{610,530},{607,527},{611,523},{701,664},{700,664},{710,664},{708,664},{707,664},{716,667},{716,669},{717,669},{778,674},{779,674},{777,674},{777,675},{696,668},{697,668},{695,668},{715,668},{698,668},{691,668},{694,668},{714,669},{706,667},{707,667},{694,667},{695,667},{700,667},{699,667},{701,667},{693,667},{714,666},{713,666},{694,666},{693,666},{712,665},{698,665},{697,665},{696,666},{700,665},{711,665},{711,666},{710,665},{712,666},{701,666},{700,666},{710,666},{704,666},{703,666},{702,667},{701,665},{702,665},{696,667},{713,667}}}, + {"Africa/Kampala",28,{{313,-10},{304,-11},{299,-15},{298,-13},{296,-14},{297,1},{300,5},{300,8},{313,21},{307,25},{309,35},{312,38},{315,37},{318,38},{322,35},{324,37},{330,39},{335,37},{340,42},{342,38},{345,37},{345,32},{349,25},{350,19},{348,12},{345,11},{339,1},{339,-10}}}, + {"America/Rio_Branco",21,{{-737,-72},{-738,-71},{-726,-76},{-704,-82},{-666,-99},{-674,-104},{-677,-107},{-680,-107},{-686,-111},{-694,-109},{-706,-110},{-705,-94},{-712,-100},{-722,-100},{-724,-95},{-732,-94},{-729,-90},{-735,-83},{-738,-79},{-737,-78},{-740,-76}}}, + {"Africa/Bamako",81,{{-45,127},{-44,123},{-46,121},{-54,118},{-52,114},{-55,111},{-55,104},{-62,102},{-63,107},{-64,106},{-66,107},{-67,104},{-69,104},{-70,102},{-76,105},{-79,102},{-83,105},{-83,110},{-87,110},{-84,114},{-89,116},{-88,120},{-90,124},{-94,125},{-93,122},{-97,120},{-103,122},{-107,119},{-109,122},{-112,120},{-115,121},{-114,130},{-116,134},{-118,133},{-120,136},{-120,142},{-122,145},{-122,148},{-118,149},{-117,155},{-115,156},{-109,151},{-107,154},{-94,154},{-93,157},{-93,155},{-55,155},{-53,163},{-56,165},{-66,250},{-48,250},{12,211},{12,207},{16,206},{18,203},{22,203},{24,201},{32,198},{33,194},{31,192},{33,190},{42,191},{42,170},{41,169},{39,157},{35,153},{13,153},{7,149},{-7,151},{-17,145},{-20,145},{-20,142},{-25,143},{-28,141},{-29,137},{-33,137},{-32,133},{-34,132},{-40,135},{-44,131},{-42,127}}}, + {"America/Goose_Bay",502,{{-563,537},{-565,536},{-565,537},{-564,538},{-563,538},{-568,537},{-568,538},{-566,537},{-566,538},{-569,537},{-570,538},{-570,539},{-569,539},{-565,539},{-566,539},{-569,538},{-569,545},{-569,547},{-606,558},{-606,559},{-611,558},{-611,559},{-607,559},{-609,559},{-610,559},{-608,559},{-603,557},{-603,558},{-602,558},{-602,557},{-604,558},{-603,555},{-601,555},{-600,555},{-602,555},{-601,556},{-604,556},{-603,556},{-602,556},{-604,557},{-606,557},{-601,557},{-607,560},{-606,560},{-612,560},{-613,560},{-608,560},{-610,560},{-611,560},{-614,560},{-609,561},{-609,560},{-608,561},{-612,561},{-610,561},{-613,561},{-614,561},{-599,554},{-598,554},{-599,555},{-600,554},{-601,554},{-598,555},{-600,537},{-571,537},{-571,536},{-572,537},{-570,537},{-572,545},{-571,545},{-598,551},{-588,551},{-588,552},{-587,552},{-565,538},{-564,537},{-589,539},{-589,540},{-588,540},{-572,541},{-571,541},{-571,542},{-574,541},{-574,542},{-573,542},{-575,542},{-582,543},{-584,541},{-585,541},{-571,538},{-571,539},{-578,543},{-580,543},{-579,543},{-578,544},{-577,543},{-572,544},{-574,544},{-573,546},{-573,545},{-572,546},{-571,546},{-578,547},{-579,547},{-578,548},{-584,548},{-586,548},{-574,545},{-573,543},{-581,543},{-579,549},{-581,549},{-580,549},{-597,549},{-597,550},{-586,550},{-589,549},{-588,549},{-586,549},{-603,550},{-586,551},{-604,552},{-589,552},{-590,552},{-597,552},{-592,551},{-594,551},{-593,551},{-588,550},{-582,550},{-587,550},{-587,549},{-583,550},{-589,550},{-603,552},{-592,552},{-603,553},{-593,553},{-594,553},{-595,553},{-596,552},{-596,553},{-600,552},{-600,553},{-597,553},{-596,554},{-597,554},{-599,553},{-601,553},{-603,554},{-604,553},{-602,553},{-602,554},{-593,552},{-587,548},{-583,549},{-584,549},{-585,549},{-582,549},{-644,603},{-645,603},{-611,562},{-608,562},{-612,562},{-609,562},{-613,562},{-571,520},{-638,520},{-637,520},{-637,523},{-641,525},{-634,527},{-636,529},{-641,527},{-642,521},{-644,520},{-643,518},{-646,516},{-647,518},{-653,518},{-655,521},{-657,520},{-657,521},{-660,521},{-663,523},{-664,522},{-665,523},{-663,524},{-664,527},{-663,526},{-664,530},{-666,530},{-668,527},{-673,529},{-672,530},{-674,531},{-670,531},{-669,534},{-673,536},{-678,540},{-676,542},{-678,544},{-673,545},{-671,547},{-674,551},{-667,547},{-668,554},{-662,550},{-659,549},{-657,547},{-651,550},{-648,547},{-644,548},{-639,546},{-637,546},{-639,548},{-638,549},{-636,549},{-634,553},{-637,553},{-633,554},{-638,555},{-637,558},{-638,559},{-634,560},{-640,561},{-639,562},{-642,564},{-639,565},{-641,567},{-639,569},{-637,572},{-639,573},{-636,577},{-641,578},{-642,580},{-644,581},{-638,585},{-641,586},{-640,587},{-635,588},{-637,589},{-641,587},{-643,589},{-649,589},{-647,591},{-643,590},{-645,593},{-644,595},{-647,594},{-649,596},{-647,599},{-649,601},{-646,601},{-649,603},{-644,602},{-646,603},{-647,603},{-644,601},{-647,600},{-644,600},{-646,600},{-645,599},{-642,600},{-643,599},{-641,599},{-642,598},{-639,598},{-643,598},{-639,597},{-641,596},{-641,595},{-640,596},{-637,595},{-641,594},{-634,592},{-636,591},{-640,591},{-641,590},{-639,590},{-633,591},{-631,590},{-633,589},{-631,589},{-629,588},{-629,587},{-631,587},{-629,586},{-635,585},{-633,585},{-636,583},{-631,585},{-632,584},{-626,585},{-627,584},{-626,583},{-629,583},{-630,582},{-627,583},{-626,582},{-631,582},{-633,580},{-625,582},{-625,580},{-623,580},{-626,580},{-627,580},{-627,579},{-621,580},{-619,579},{-622,578},{-619,576},{-626,575},{-618,574},{-620,573},{-614,571},{-613,570},{-619,568},{-617,566},{-625,568},{-623,568},{-621,568},{-626,569},{-626,568},{-617,565},{-621,565},{-619,565},{-622,565},{-616,563},{-621,563},{-621,562},{-615,561},{-615,560},{-607,558},{-609,557},{-607,555},{-605,558},{-605,556},{-605,553},{-607,550},{-603,551},{-601,552},{-599,552},{-598,553},{-600,551},{-594,552},{-599,547},{-591,552},{-594,550},{-589,551},{-590,550},{-590,549},{-591,548},{-584,547},{-580,548},{-579,548},{-582,547},{-577,545},{-575,545},{-576,544},{-596,540},{-584,542},{-586,540},{-601,538},{-602,535},{-600,534},{-608,532},{-602,533},{-598,535},{-599,535},{-591,537},{-578,541},{-572,538},{-574,536},{-575,536},{-573,535},{-575,534},{-575,530},{-571,528},{-610,562},{-615,562},{-616,562},{-607,563},{-614,562},{-619,563},{-608,563},{-609,563},{-610,563},{-613,563},{-614,563},{-617,562},{-611,563},{-612,563},{-615,563},{-610,564},{-611,564},{-614,564},{-618,564},{-613,564},{-612,564},{-621,564},{-609,564},{-609,565},{-611,565},{-614,566},{-612,565},{-611,566},{-613,565},{-612,566},{-619,564},{-615,564},{-616,564},{-617,564},{-616,566},{-615,565},{-618,563},{-613,566},{-609,567},{-609,568},{-610,567},{-610,568},{-612,568},{-613,568},{-617,568},{-614,567},{-614,568},{-613,567},{-612,567},{-613,571},{-615,572},{-614,572},{-635,594},{-615,573},{-618,572},{-619,572},{-619,573},{-617,573},{-618,573},{-617,574},{-616,574},{-616,573},{-623,575},{-622,575},{-621,575},{-613,576},{-614,576},{-616,576},{-617,575},{-617,576},{-618,576},{-620,575},{-615,575},{-614,575},{-616,575},{-618,575},{-615,574},{-614,574},{-637,594},{-619,574},{-613,569},{-611,568},{-611,569},{-618,577},{-620,577},{-619,577},{-642,599},{-643,601},{-642,601},{-617,577},{-618,578},{-619,578},{-617,578},{-617,579},{-620,579},{-622,580},{-622,581},{-625,581},{-624,581},{-621,582},{-625,583},{-625,584},{-624,584},{-630,585},{-629,585},{-627,585},{-628,585},{-628,586},{-627,586},{-643,602},{-642,602},{-644,604},{-626,584},{-615,566},{-609,566},{-610,566},{-618,566},{-620,566},{-621,567},{-611,567},{-616,568},{-615,568},{-617,567}}}, + {"Africa/Conakry",94,{{-134,93},{-133,91},{-133,92},{-138,95},{-138,94},{-137,95},{-146,108},{-149,109},{-150,110},{-150,108},{-151,109},{-149,108},{-148,109},{-149,110},{-147,110},{-141,101},{-140,101},{-87,76},{-88,73},{-91,72},{-93,74},{-95,74},{-93,77},{-95,84},{-98,85},{-101,84},{-104,85},{-107,83},{-105,87},{-106,90},{-107,91},{-107,93},{-112,100},{-124,99},{-128,93},{-133,90},{-133,93},{-136,96},{-136,98},{-138,98},{-137,99},{-140,102},{-141,100},{-145,102},{-145,105},{-147,105},{-145,108},{-147,106},{-147,108},{-147,107},{-149,111},{-148,114},{-143,117},{-137,117},{-137,120},{-140,122},{-137,123},{-137,127},{-131,126},{-131,125},{-129,125},{-124,123},{-115,124},{-115,122},{-113,120},{-109,122},{-107,119},{-103,122},{-97,120},{-93,122},{-94,125},{-90,124},{-88,120},{-89,116},{-84,114},{-87,110},{-83,110},{-83,105},{-80,103},{-82,99},{-81,95},{-78,94},{-79,92},{-77,91},{-80,88},{-78,88},{-76,84},{-82,85},{-82,82},{-80,82},{-79,80},{-81,80},{-82,76},{-87,77}}}, + {"America/Chihuahua",29,{{-1034,288},{-1040,279},{-1036,267},{-1042,268},{-1046,264},{-1051,265},{-1053,265},{-1060,268},{-1062,264},{-1065,264},{-1064,261},{-1065,258},{-1071,256},{-1074,261},{-1078,262},{-1080,269},{-1086,271},{-1087,275},{-1091,282},{-1091,283},{-1086,283},{-1087,294},{-1086,300},{-1088,311},{-1081,311},{-1080,316},{-1066,316},{-1051,304},{-1047,295}}}, + {"Europe/Warsaw",65,{{144,539},{144,538},{142,539},{148,540},{146,538},{147,539},{147,540},{235,502},{227,496},{227,492},{229,490},{216,494},{209,493},{203,494},{201,492},{198,492},{198,494},{195,496},{190,494},{186,499},{179,500},{176,501},{178,502},{177,503},{174,503},{169,504},{170,502},{166,501},{162,504},{164,506},{163,507},{154,508},{152,510},{148,509},{150,513},{146,518},{148,521},{145,524},{146,526},{141,528},{145,533},{143,537},{146,536},{180,548},{183,548},{188,547},{184,547},{188,544},{197,545},{192,543},{194,542},{198,544},{230,544},{235,541},{240,529},{239,527},{235,526},{232,523},{237,521},{235,517},{236,513},{242,509},{240,508},{241,506},{240,504}}}, + {"Pacific/Palau",19,{{1312,30},{1323,43},{1320,47},{1341,69},{1342,69},{1343,70},{1342,70},{1344,71},{1343,72},{1344,72},{1343,73},{1344,73},{1345,76},{1346,77},{1345,73},{1345,74},{1347,81},{1347,80},{1344,74}}}, + {"Europe/Mariehamn",72,{{203,603},{209,599},{210,599},{210,600},{211,602},{193,602},{196,602},{209,602},{194,602},{204,602},{197,602},{205,602},{203,602},{207,602},{208,602},{209,600},{203,600},{200,600},{200,601},{209,604},{201,600},{204,600},{205,600},{208,600},{206,601},{206,600},{207,600},{211,601},{207,601},{205,601},{203,601},{208,601},{204,601},{211,603},{211,604},{204,603},{209,603},{206,602},{202,604},{202,605},{211,605},{210,605},{209,605},{211,606},{210,606},{210,604},{210,602},{210,603},{207,603},{195,602},{195,603},{208,603},{196,601},{196,603},{197,603},{198,603},{198,604},{203,604},{197,604},{196,604},{200,604},{208,604},{201,604},{199,602},{202,601},{202,600},{198,601},{198,602},{199,604},{199,603},{205,603},{206,604}}}, + {"Africa/Windhoek",46,{{152,-270},{152,-271},{150,-264},{152,-266},{151,-266},{149,-263},{149,-264},{200,-274},{200,-284},{196,-285},{191,-290},{174,-287},{174,-283},{171,-280},{169,-281},{168,-284},{165,-286},{157,-280},{149,-251},{145,-241},{145,-225},{134,-209},{126,-192},{120,-185},{117,-178},{118,-173},{121,-171},{126,-172},{131,-170},{135,-170},{140,-174},{184,-174},{189,-178},{203,-179},{208,-180},{242,-175},{250,-176},{253,-178},{250,-178},{246,-181},{242,-180},{236,-185},{233,-180},{210,-183},{210,-220},{200,-220}}}, + {"America/La_Paz",75,{{-623,-210},{-626,-223},{-628,-220},{-639,-220},{-643,-229},{-646,-222},{-658,-221},{-662,-218},{-663,-221},{-667,-222},{-672,-228},{-679,-228},{-682,-213},{-685,-209},{-684,-206},{-688,-204},{-688,-201},{-685,-199},{-687,-197},{-684,-194},{-690,-189},{-691,-181},{-693,-180},{-695,-174},{-696,-173},{-688,-163},{-692,-161},{-694,-156},{-691,-153},{-694,-148},{-688,-142},{-691,-137},{-689,-135},{-690,-129},{-687,-125},{-696,-110},{-686,-111},{-680,-107},{-677,-107},{-666,-99},{-658,-97},{-656,-98},{-654,-97},{-653,-102},{-654,-105},{-653,-110},{-654,-113},{-650,-120},{-645,-122},{-643,-125},{-637,-125},{-633,-127},{-631,-127},{-628,-130},{-621,-131},{-618,-135},{-611,-135},{-605,-138},{-603,-151},{-606,-151},{-602,-155},{-602,-163},{-583,-163},{-585,-167},{-584,-172},{-578,-176},{-575,-182},{-581,-198},{-579,-200},{-582,-202},{-582,-198},{-591,-193},{-600,-193},{-617,-196},{-623,-206}}}, + {"America/Recife",33,{{-351,-89},{-351,-88},{-387,-76},{-381,-78},{-372,-73},{-370,-75},{-372,-76},{-373,-80},{-371,-80},{-370,-83},{-364,-78},{-359,-78},{-353,-74},{-348,-76},{-348,-79},{-360,-89},{-364,-92},{-369,-94},{-378,-89},{-382,-93},{-385,-88},{-386,-90},{-394,-85},{-406,-95},{-408,-95},{-407,-92},{-409,-92},{-409,-88},{-414,-87},{-406,-81},{-407,-74},{-396,-74},{-391,-79}}}, + {"America/Mexico_City",94,{{-973,211},{-972,214},{-972,215},{-973,215},{-929,152},{-930,152},{-930,153},{-948,163},{-948,164},{-949,163},{-949,164},{-1057,204},{-972,210},{-1016,176},{-1017,177},{-1016,177},{-961,192},{-960,192},{-941,161},{-940,160},{-947,162},{-946,163},{-951,163},{-951,162},{-949,162},{-948,162},{-952,162},{-954,160},{-965,156},{-978,160},{-988,165},{-997,167},{-1011,173},{-1020,180},{-1022,179},{-1035,183},{-1040,189},{-1050,193},{-1053,206},{-1051,209},{-1048,210},{-1043,207},{-1042,212},{-1040,213},{-1042,215},{-1041,218},{-1044,221},{-1041,234},{-1038,237},{-1039,241},{-1033,245},{-1025,245},{-1027,251},{-1023,252},{-1018,250},{-1016,248},{-1012,248},{-1009,246},{-1004,237},{-1004,232},{-1001,232},{-999,230},{-1000,228},{-994,227},{-992,224},{-989,223},{-982,225},{-978,223},{-973,216},{-974,212},{-972,207},{-964,199},{-963,193},{-959,189},{-948,185},{-945,181},{-925,186},{-924,185},{-922,185},{-922,182},{-919,180},{-915,181},{-910,180},{-910,173},{-914,172},{-904,164},{-904,161},{-917,161},{-922,153},{-921,151},{-922,145},{-939,160},{-939,161},{-944,163}}}, + {"America/Chicago",432,{{-892,301},{-895,301},{-896,302},{-890,302},{-889,302},{-891,302},{-892,302},{-895,302},{-897,301},{-896,301},{-897,302},{-894,301},{-889,304},{-888,304},{-865,304},{-905,469},{-904,469},{-880,305},{-881,305},{-880,306},{-880,307},{-881,303},{-875,303},{-886,303},{-866,304},{-867,304},{-872,303},{-873,303},{-884,304},{-883,303},{-882,303},{-883,304},{-886,304},{-879,307},{-879,306},{-880,308},{-879,308},{-856,301},{-857,301},{-881,302},{-884,302},{-885,302},{-887,302},{-886,302},{-888,302},{-883,302},{-882,302},{-873,452},{-874,452},{-873,450},{-872,452},{-870,453},{-873,448},{-869,453},{-868,454},{-869,454},{-905,470},{-904,471},{-904,470},{-906,470},{-907,470},{-906,471},{-907,471},{-909,470},{-908,470},{-896,480},{-908,468},{-907,469},{-907,468},{-908,467},{-906,469},{-906,468},{-910,470},{-908,469},{-939,299},{-939,300},{-939,298},{-940,298},{-938,300},{-855,300},{-894,300},{-888,300},{-889,300},{-889,301},{-892,300},{-893,300},{-889,298},{-889,299},{-934,298},{-893,298},{-893,299},{-933,298},{-895,298},{-890,298},{-894,299},{-894,298},{-892,298},{-892,299},{-888,299},{-888,298},{-895,300},{-897,300},{-898,301},{-976,269},{-975,269},{-975,268},{-975,270},{-975,271},{-974,271},{-972,278},{-971,278},{-974,268},{-973,263},{-974,263},{-973,264},{-974,264},{-975,264},{-972,264},{-974,265},{-973,265},{-973,266},{-973,267},{-974,267},{-971,279},{-971,280},{-966,283},{-966,284},{-968,281},{-968,282},{-964,284},{-964,283},{-965,284},{-970,279},{-970,280},{-970,278},{-969,281},{-972,261},{-974,269},{-974,272},{-973,277},{-903,291},{-952,291},{-951,291},{-904,290},{-905,291},{-907,291},{-906,291},{-908,292},{-908,291},{-907,292},{-903,292},{-906,292},{-904,291},{-909,291},{-907,290},{-908,290},{-952,290},{-909,290},{-910,291},{-899,293},{-901,293},{-900,292},{-900,293},{-898,293},{-893,293},{-894,293},{-898,294},{-893,294},{-892,295},{-901,294},{-900,294},{-899,294},{-899,295},{-900,295},{-891,295},{-891,296},{-890,296},{-914,295},{-897,296},{-895,295},{-897,295},{-896,295},{-896,296},{-913,294},{-913,295},{-901,295},{-950,296},{-950,297},{-894,297},{-894,296},{-889,297},{-896,297},{-893,297},{-895,297},{-921,297},{-922,297},{-904,292},{-904,293},{-919,296},{-918,296},{-917,296},{-920,296},{-914,296},{-895,296},{-895,294},{-910,292},{-911,292},{-909,292},{-905,293},{-906,293},{-950,292},{-949,293},{-947,293},{-905,292},{-910,293},{-913,293},{-912,294},{-913,292},{-914,293},{-912,293},{-948,293},{-878,385},{-875,385},{-873,382},{-868,382},{-868,379},{-866,379},{-865,380},{-862,378},{-863,376},{-861,374},{-856,375},{-854,372},{-851,373},{-848,370},{-851,369},{-850,366},{-848,366},{-847,364},{-849,362},{-847,359},{-851,356},{-854,350},{-856,350},{-852,329},{-849,323},{-851,318},{-851,312},{-849,307},{-851,302},{-850,298},{-854,300},{-857,302},{-856,302},{-856,303},{-858,303},{-861,304},{-862,305},{-869,304},{-870,306},{-871,304},{-872,306},{-872,304},{-874,303},{-873,304},{-874,305},{-876,303},{-880,302},{-877,303},{-890,305},{-894,304},{-894,302},{-902,304},{-904,302},{-901,300},{-899,300},{-897,299},{-896,300},{-896,298},{-898,296},{-890,292},{-894,289},{-895,292},{-902,296},{-901,292},{-902,291},{-902,292},{-909,293},{-912,296},{-914,297},{-916,295},{-916,297},{-919,297},{-918,298},{-922,298},{-923,295},{-933,301},{-934,299},{-938,297},{-937,300},{-948,294},{-945,296},{-948,295},{-947,298},{-951,296},{-952,292},{-953,289},{-960,287},{-962,286},{-961,288},{-964,286},{-964,287},{-964,288},{-965,286},{-966,288},{-966,286},{-967,283},{-968,285},{-972,281},{-970,281},{-974,278},{-972,277},{-974,273},{-976,273},{-977,274},{-978,275},{-977,273},{-978,273},{-976,268},{-971,260},{-974,258},{-977,260},{-982,261},{-991,264},{-995,270},{-995,276},{-1003,283},{-1007,291},{-1014,298},{-1023,299},{-1027,297},{-1029,292},{-1031,290},{-1042,294},{-1045,297},{-1050,306},{-1049,320},{-1031,320},{-1030,370},{-1020,370},{-1020,377},{-1015,377},{-1016,387},{-1014,396},{-1020,396},{-1020,400},{-1013,400},{-1012,410},{-1014,417},{-1008,417},{-1007,421},{-1009,430},{-1012,430},{-1012,438},{-1011,438},{-1010,442},{-1006,442},{-1004,444},{-1006,445},{-1007,448},{-1004,449},{-1003,452},{-1005,455},{-1003,457},{-1004,459},{-1013,459},{-1013,461},{-1005,465},{-1008,467},{-1010,473},{-1013,473},{-1014,476},{-1025,475},{-1030,477},{-1036,475},{-1040,480},{-1040,490},{-952,490},{-952,494},{-948,493},{-947,488},{-945,487},{-938,485},{-930,486},{-926,485},{-927,485},{-925,484},{-924,482},{-921,484},{-916,480},{-909,482},{-908,481},{-895,480},{-907,476},{-921,468},{-918,467},{-909,466},{-907,467},{-901,463},{-881,459},{-881,458},{-878,457},{-879,454},{-877,454},{-877,452},{-876,451},{-878,449},{-880,445},{-876,449},{-879,432},{-877,428},{-878,423},{-874,417},{-865,418},{-865,416},{-869,412},{-869,409},{-871,407},{-875,407},{-875,394},{-877,391},{-875,387}}}, + {"Asia/Amman",19,{{373,312},{380,305},{377,303},{375,300},{368,299},{361,292},{350,294},{352,304},{355,311},{356,327},{359,327},{361,325},{368,323},{388,334},{390,323},{393,324},{393,322},{390,320},{370,315}}}, + {"America/Tijuana",10,{{-1168,318},{-1147,327},{-1148,325},{-1164,324},{-1165,317},{-1167,317},{-1166,318},{-1171,325},{-1172,324},{-1173,324}}}, + {"America/Metlakatla",8,{{-1316,550},{-1316,551},{-1315,551},{-1316,553},{-1314,552},{-1314,550},{-1316,552},{-1313,552}}}, + {"Pacific/Midway",3,{{-1774,282},{-1773,282},{-1783,284}}}, + {"Europe/Simferopol",32,{{348,462},{350,457},{355,453},{358,455},{366,454},{365,454},{364,451},{355,451},{351,448},{347,448},{341,444},{338,444},{335,445},{334,446},{335,446},{335,451},{330,453},{331,454},{333,455},{329,454},{325,454},{332,458},{337,459},{336,462},{341,461},{342,463},{343,461},{343,462},{345,462},{345,460},{346,462},{335,459}}}, + {"Europe/Budapest",34,{{208,463},{206,461},{196,462},{184,457},{179,458},{173,459},{165,465},{163,468},{161,469},{165,470},{164,474},{167,475},{164,477},{171,477},{170,479},{172,480},{178,477},{187,478},{189,478},{188,480},{195,481},{196,482},{199,481},{203,483},{205,485},{208,486},{215,486},{218,483},{223,484},{226,481},{228,481},{228,478},{220,475},{212,463}}}, + {"Pacific/Apia",11,{{-1714,-141},{-1717,-140},{-1719,-140},{-1721,-139},{-1718,-138},{-1714,-140},{-1721,-138},{-1722,-138},{-1725,-138},{-1728,-135},{-1723,-134}}}, + {"America/Paramaribo",30,{{-543,52},{-545,49},{-544,40},{-540,36},{-544,23},{-547,23},{-549,26},{-554,24},{-559,25},{-561,23},{-559,20},{-560,18},{-567,20},{-572,28},{-573,34},{-577,34},{-581,41},{-579,49},{-572,52},{-573,53},{-571,60},{-571,58},{-569,60},{-559,58},{-558,60},{-551,59},{-550,60},{-540,58},{-540,55},{-552,59}}}, + {"Africa/Malabo",17,{{56,-14},{56,-15},{89,35},{87,32},{84,33},{87,38},{89,37},{93,9},{95,10},{113,17},{113,10},{99,9},{93,12},{98,19},{98,23},{100,22},{113,22}}}, + {"Asia/Riyadh",286,{{423,166},{424,166},{418,167},{419,167},{419,166},{420,166},{352,278},{426,159},{424,161},{423,161},{424,162},{425,163},{424,163},{423,163},{422,163},{420,163},{423,164},{424,164},{425,164},{428,164},{419,164},{421,165},{420,165},{421,166},{426,167},{425,167},{416,167},{417,167},{422,168},{422,164},{391,213},{390,220},{389,219},{390,219},{389,220},{401,199},{401,200},{402,202},{404,200},{401,202},{400,203},{401,203},{395,203},{397,203},{400,202},{396,205},{396,206},{395,208},{409,194},{408,194},{408,195},{407,196},{407,195},{408,196},{406,196},{407,197},{408,197},{406,197},{406,198},{405,198},{390,221},{390,222},{391,223},{389,224},{409,193},{409,191},{409,190},{414,178},{415,181},{415,182},{412,184},{411,185},{411,186},{410,186},{412,188},{412,189},{411,191},{418,171},{417,171},{419,171},{424,170},{417,170},{416,170},{417,169},{418,170},{419,170},{416,181},{420,168},{424,168},{382,239},{352,277},{418,169},{420,167},{421,168},{422,166},{417,168},{418,168},{424,169},{416,169},{416,168},{420,169},{419,168},{409,195},{374,245},{384,235},{382,235},{384,237},{380,238},{379,238},{383,238},{351,278},{382,240},{381,240},{374,244},{360,267},{361,267},{360,268},{359,268},{361,265},{361,266},{360,266},{365,261},{364,262},{365,262},{358,269},{359,269},{358,271},{357,271},{357,272},{354,276},{353,277},{346,279},{345,279},{345,280},{347,280},{347,281},{351,281},{354,277},{351,279},{347,279},{349,279},{352,279},{352,280},{353,278},{353,279},{351,280},{348,281},{350,280},{350,281},{371,250},{371,249},{369,252},{372,249},{372,250},{370,253},{368,253},{366,258},{367,257},{368,257},{366,257},{365,257},{365,258},{366,259},{367,256},{367,254},{366,255},{366,256},{367,255},{365,256},{371,254},{370,254},{369,254},{368,254},{368,255},{370,255},{369,255},{369,256},{368,256},{370,256},{390,227},{366,260},{386,234},{385,235},{385,234},{386,232},{387,233},{387,232},{386,233},{388,229},{389,230},{389,229},{388,231},{388,230},{388,232},{387,231},{389,226},{432,173},{432,167},{427,167},{424,172},{423,174},{418,179},{413,186},{397,204},{392,211},{391,218},{391,217},{390,218},{391,224},{384,238},{379,242},{372,248},{373,249},{372,252},{367,260},{346,281},{350,294},{361,292},{368,299},{375,300},{377,303},{380,305},{370,315},{392,322},{404,319},{421,311},{447,292},{475,290},{477,285},{484,285},{489,278},{489,276},{493,275},{493,274},{492,274},{491,274},{494,271},{496,272},{497,270},{500,268},{502,266},{502,263},{502,260},{500,262},{500,260},{505,254},{508,247},{511,245},{515,246},{513,243},{516,242},{526,229},{552,227},{557,220},{550,200},{520,190},{488,183},{463,156},{463,163},{461,165},{444,174},{439,173},{433,176},{385,236},{384,236},{504,255},{503,256},{498,277},{488,278},{488,277},{487,282},{486,282},{502,265},{502,264},{501,265},{500,266},{501,266},{496,271},{495,271},{495,272},{494,272},{495,273},{495,274},{497,273},{493,272},{494,273}}}, + {"Africa/Ndjamena",59,{{199,91},{189,89},{191,87},{186,81},{177,80},{168,75},{166,79},{158,74},{155,75},{156,78},{152,86},{145,90},{140,96},{142,100},{157,100},{151,105},{150,111},{151,118},{148,126},{146,128},{145,131},{141,131},{136,137},{135,144},{137,146},{144,157},{155,169},{157,198},{160,203},{152,215},{150,230},{160,235},{240,195},{240,157},{231,157},{229,156},{229,151},{227,149},{227,147},{224,145},{226,142},{221,138},{223,133},{218,128},{219,126},{222,128},{225,126},{225,120},{226,120},{226,116},{229,114},{230,111},{229,109},{225,110},{218,108},{217,103},{210,97},{208,94},{204,92}}}, + {"Asia/Choibalsan",43,{{1167,463},{1163,460},{1162,457},{1157,454},{1146,454},{1136,448},{1121,451},{1119,456},{1119,460},{1115,462},{1114,465},{1116,472},{1120,474},{1122,478},{1127,478},{1124,491},{1125,495},{1131,496},{1132,498},{1143,503},{1150,502},{1154,499},{1162,500},{1167,498},{1158,485},{1158,483},{1155,482},{1155,480},{1159,477},{1163,479},{1168,479},{1174,476},{1178,480},{1185,480},{1199,472},{1197,472},{1199,467},{1195,464},{1193,467},{1185,468},{1178,465},{1174,466},{1174,463}}}, + {"America/Antigua",10,{{-623,169},{-624,169},{-617,171},{-617,176},{-619,176},{-619,177},{-618,172},{-617,170},{-619,170},{-617,172}}}, + {"Europe/Istanbul",205,{{283,368},{282,368},{276,370},{264,384},{294,362},{305,362},{297,361},{298,361},{299,362},{298,362},{304,362},{338,362},{271,376},{272,376},{274,370},{275,370},{274,372},{275,367},{278,365},{279,365},{278,366},{278,367},{279,367},{279,366},{280,367},{289,367},{290,367},{291,367},{281,367},{284,368},{275,371},{275,372},{260,398},{261,398},{261,399},{257,401},{258,402},{260,402},{260,401},{270,406},{262,401},{262,403},{268,406},{261,406},{260,407},{264,410},{263,413},{266,414},{266,416},{263,418},{266,420},{273,421},{276,419},{280,420},{280,418},{282,415},{291,412},{288,410},{285,411},{275,410},{281,405},{277,405},{276,405},{275,405},{275,406},{285,405},{285,406},{286,406},{276,406},{275,407},{277,406},{291,409},{291,408},{292,409},{290,409},{265,384},{263,384},{264,385},{267,385},{268,385},{268,384},{269,384},{269,385},{267,387},{268,386},{367,368},{366,365},{367,363},{364,362},{362,358},{359,359},{358,363},{362,366},{360,369},{353,365},{347,368},{340,362},{339,363},{337,361},{328,360},{324,362},{320,365},{310,369},{306,368},{302,363},{291,364},{289,368},{288,366},{285,369},{280,366},{281,368},{277,367},{274,367},{280,368},{280,369},{283,371},{273,370},{273,371},{276,373},{275,373},{274,374},{272,374},{270,377},{272,377},{273,380},{262,383},{264,387},{267,383},{267,384},{272,385},{270,384},{271,389},{268,389},{269,391},{266,393},{270,396},{261,395},{268,404},{273,405},{278,403},{279,404},{278,405},{280,405},{280,404},{291,404},{292,404},{288,405},{299,407},{293,408},{290,410},{292,412},{312,411},{314,413},{326,418},{333,420},{347,419},{349,421},{352,420},{351,419},{353,417},{360,417},{364,413},{368,414},{375,410},{377,411},{384,409},{394,411},{402,409},{415,415},{425,414},{428,416},{437,409},{437,407},{435,405},{437,401},{444,400},{448,397},{446,398},{444,394},{440,394},{443,388},{443,384},{445,383},{442,379},{446,378},{446,374},{448,373},{448,371},{446,372},{443,370},{441,373},{438,372},{428,374},{426,371},{424,371},{422,373},{416,371},{408,371},{392,367},{383,369},{375,366},{371,366},{266,394},{267,394},{268,394}}}, + {"Africa/Blantyre",39,{{349,-135},{359,-149},{358,-152},{358,-160},{354,-161},{351,-166},{353,-171},{351,-171},{352,-168},{344,-163},{343,-159},{346,-153},{345,-146},{344,-144},{337,-146},{333,-140},{332,-139},{330,-140},{327,-136},{330,-132},{330,-127},{335,-124},{333,-121},{332,-114},{334,-112},{332,-109},{337,-106},{333,-101},{332,-96},{330,-96},{330,-94},{339,-97},{340,-95},{345,-100},{346,-110},{350,-116},{346,-116},{344,-123},{345,-134}}}, + {"Australia/Sydney",108,{{1516,-331},{1512,-335},{1512,-336},{1522,-328},{1522,-327},{1520,-327},{1521,-327},{1502,-363},{1502,-362},{1508,-351},{1507,-351},{1505,-352},{1503,-357},{1501,-357},{1502,-357},{1501,-356},{1502,-356},{1502,-358},{1501,-359},{1501,-363},{1499,-369},{1500,-373},{1500,-375},{1481,-368},{1482,-366},{1479,-360},{1474,-360},{1469,-361},{1451,-358},{1450,-359},{1450,-361},{1447,-361},{1434,-352},{1433,-348},{1428,-346},{1425,-348},{1424,-343},{1420,-341},{1415,-342},{1410,-341},{1410,-322},{1418,-323},{1420,-316},{1410,-315},{1410,-290},{1490,-290},{1495,-286},{1503,-285},{1510,-287},{1514,-292},{1516,-289},{1520,-289},{1520,-285},{1525,-283},{1531,-284},{1532,-283},{1534,-283},{1535,-282},{1536,-282},{1536,-289},{1534,-294},{1533,-294},{1534,-295},{1530,-307},{1531,-309},{1529,-315},{1525,-322},{1524,-322},{1525,-323},{1526,-322},{1525,-325},{1520,-325},{1519,-327},{1519,-328},{1521,-328},{1518,-329},{1518,-328},{1517,-328},{1517,-329},{1515,-331},{1517,-331},{1514,-335},{1513,-336},{1513,-334},{1512,-334},{1511,-335},{1510,-334},{1509,-334},{1509,-335},{1511,-336},{1511,-337},{1512,-337},{1513,-338},{1512,-338},{1511,-338},{1513,-339},{1510,-340},{1512,-340},{1508,-345},{1509,-346},{1508,-349},{1507,-349},{1506,-349},{1508,-350},{1523,-326},{1530,-308},{1530,-309},{1535,-283}}}, + {"Asia/Dushanbe",80,{{694,372},{692,371},{689,373},{680,369},{678,371},{679,375},{684,382},{681,385},{682,389},{677,390},{674,393},{675,393},{674,395},{677,397},{685,395},{688,400},{689,399},{688,401},{690,401},{685,401},{693,402},{692,405},{694,408},{697,406},{704,410},{708,407},{704,404},{706,402},{710,402},{705,399},{706,400},{700,402},{695,401},{695,399},{694,400},{693,398},{694,395},{705,396},{709,394},{715,396},{716,395},{718,394},{718,393},{720,394},{722,392},{725,394},{737,395},{736,393},{738,390},{737,389},{738,386},{741,385},{741,387},{744,387},{749,385},{748,382},{750,378},{749,377},{751,374},{749,372},{744,374},{737,372},{736,373},{738,374},{733,375},{727,370},{717,367},{714,371},{716,379},{712,379},{714,383},{710,385},{707,384},{702,379},{703,377},{702,375},{695,376},{694,374},{707,399},{706,398}}}, + {"Europe/Belgrade",41,{{214,450},{216,449},{214,448},{221,445},{225,447},{228,446},{225,445},{227,442},{224,438},{225,435},{230,431},{224,428},{226,425},{225,423},{214,423},{212,421},{211,422},{206,419},{205,422},{202,423},{200,427},{203,429},{192,435},{195,436},{192,440},{196,441},{191,444},{194,449},{190,449},{192,450},{191,451},{194,452},{190,454},{191,455},{189,456},{189,459},{196,462},{202,462},{208,458},{208,455},{215,452}}}, + {"Asia/Karachi",159,{{664,255},{664,256},{662,255},{662,256},{663,256},{681,238},{682,238},{681,237},{680,237},{674,240},{674,241},{673,244},{674,244},{673,248},{672,248},{666,249},{639,251},{638,251},{641,254},{665,255},{673,245},{674,245},{672,245},{672,246},{673,246},{674,246},{671,247},{672,247},{673,247},{674,247},{671,248},{702,279},{696,272},{695,268},{702,266},{701,259},{703,257},{707,257},{707,254},{711,247},{710,244},{711,244},{708,242},{706,242},{706,244},{700,242},{688,243},{687,240},{680,239},{680,238},{679,240},{677,238},{674,239},{674,242},{673,243},{674,243},{675,243},{675,248},{667,248},{667,252},{666,254},{665,256},{661,255},{665,254},{648,253},{647,252},{640,255},{641,253},{636,254},{635,252},{626,253},{624,251},{622,252},{617,250},{618,252},{616,252},{618,262},{623,264},{624,266},{632,266},{633,271},{628,272},{628,283},{618,286},{609,299},{625,294},{636,295},{641,294},{644,295},{651,295},{663,299},{664,309},{667,312},{678,313},{676,315},{682,318},{685,317},{684,318},{686,318},{689,316},{693,319},{692,325},{695,327},{695,330},{703,333},{699,340},{705,339},{711,341},{712,344},{710,346},{717,352},{715,357},{712,361},{722,368},{731,369},{741,368},{747,371},{749,369},{751,370},{754,369},{755,367},{759,366},{761,362},{759,361},{762,358},{766,359},{768,357},{772,355},{778,355},{770,349},{767,349},{767,348},{757,345},{744,348},{740,347},{738,344},{740,343},{739,340},{743,340},{740,337},{742,335},{740,332},{745,327},{747,328},{747,325},{751,325},{754,322},{745,318},{746,315},{745,312},{747,311},{739,305},{740,302},{734,299},{729,290},{724,288},{719,280},{709,277},{705,280}}}, + {"Europe/Luxembourg",7,{{62,495},{58,495},{59,497},{57,499},{60,502},{65,498},{64,495}}}, + {"Europe/Podgorica",20,{{188,423},{189,423},{189,435},{192,435},{196,432},{203,429},{200,427},{201,427},{200,425},{198,425},{197,427},{196,426},{193,422},{194,419},{185,424},{187,424},{188,425},{184,425},{187,433},{191,433}}}, + {"Australia/Lindeman",8,{{1490,-204},{1491,-204},{1491,-205},{1490,-205},{1489,-204},{1489,-203},{1489,-201},{1489,-200}}}, + {"Africa/Bangui",61,{{245,51},{234,46},{229,48},{225,42},{223,41},{206,44},{198,51},{194,51},{185,43},{186,35},{185,37},{182,35},{175,37},{167,35},{162,22},{160,30},{152,37},{151,40},{152,41},{151,43},{147,46},{147,52},{145,53},{146,59},{144,60},{148,63},{155,75},{160,75},{166,79},{168,75},{177,80},{186,81},{191,87},{189,89},{204,92},{217,102},{218,108},{225,110},{229,109},{237,99},{237,93},{234,90},{236,90},{235,87},{243,87},{242,83},{249,82},{252,79},{252,75},{264,67},{263,65},{265,62},{265,61},{272,58},{275,50},{271,52},{269,50},{265,50},{255,54},{251,49},{247,49}}}, + {"Asia/Aden",84,{{533,121},{532,121},{523,122},{521,122},{524,122},{545,125},{538,123},{533,125},{535,127},{531,121},{530,121},{530,122},{531,122},{434,126},{434,127},{432,133},{447,127},{418,156},{419,155},{418,155},{420,152},{421,152},{421,151},{422,151},{422,150},{421,150},{425,155},{424,155},{423,157},{425,157},{425,156},{426,156},{424,157},{426,157},{430,145},{429,145},{429,146},{427,139},{427,140},{427,136},{427,137},{428,137},{451,129},{451,128},{446,128},{443,126},{435,127},{429,149},{428,152},{426,152},{427,154},{428,153},{427,157},{428,160},{428,164},{433,168},{431,169},{433,173},{433,176},{439,173},{444,174},{463,163},{463,156},{488,183},{520,190},{531,167},{523,163},{522,156},{493,146},{487,140},{480,140},{474,136},{467,134},{457,133},{485,140},{483,140},{428,138},{428,139},{428,141},{428,140},{426,154},{426,153},{426,155},{426,158}}}, + {"Pacific/Chuuk",40,{{1518,73},{1537,53},{1538,55},{1536,56},{1493,67},{1519,71},{1519,72},{1520,72},{1519,73},{1439,73},{1438,73},{1439,74},{1517,74},{1517,73},{1518,74},{1516,74},{1516,73},{1470,74},{1519,74},{1519,75},{1518,75},{1476,81},{1517,84},{1519,86},{1520,86},{1497,86},{1514,86},{1504,86},{1522,86},{1523,87},{1503,87},{1503,88},{1501,90},{1381,96},{1382,96},{1381,94},{1381,95},{1405,98},{1397,99},{1398,100}}}, + {"Asia/Brunei",12,{{1141,46},{1144,47},{1149,50},{1151,50},{1148,47},{1149,44},{1147,40},{1152,49},{1153,47},{1153,43},{1151,44},{1150,48}}}, + {"Indian/Comoro",13,{{437,-124},{436,-124},{445,-121},{445,-124},{442,-122},{444,-122},{433,-114},{434,-114},{435,-119},{432,-118},{437,-123},{438,-123},{439,-124}}}, + {"America/Asuncion",42,{{-547,-262},{-548,-267},{-554,-270},{-557,-274},{-561,-273},{-564,-276},{-566,-274},{-569,-276},{-580,-273},{-586,-273},{-586,-271},{-582,-266},{-582,-262},{-578,-260},{-578,-257},{-576,-256},{-577,-253},{-591,-246},{-600,-240},{-610,-238},{-620,-230},{-623,-225},{-626,-223},{-623,-211},{-623,-206},{-617,-196},{-600,-193},{-591,-193},{-582,-198},{-582,-202},{-578,-210},{-580,-221},{-568,-223},{-564,-221},{-562,-223},{-559,-223},{-556,-227},{-557,-230},{-555,-232},{-554,-240},{-547,-238},{-543,-241}}}, + {"Europe/Prague",35,{{150,490},{150,488},{148,488},{147,486},{141,486},{127,494},{124,498},{125,499},{121,503},{123,502},{125,504},{144,509},{143,511},{148,508},{152,510},{154,508},{163,507},{164,506},{162,504},{166,501},{170,502},{169,504},{174,503},{177,503},{178,502},{176,502},{178,500},{186,499},{189,495},{182,493},{177,489},{171,488},{169,486},{165,488},{161,487}}}, + {"America/Cayman",9,{{-813,193},{-814,193},{-814,194},{-811,194},{-800,197},{-801,197},{-799,197},{-797,198},{-798,197}}}, + {"Pacific/Pohnpei",15,{{1572,58},{1571,58},{1607,62},{1598,67},{1580,67},{1579,67},{1580,68},{1584,69},{1583,69},{1583,70},{1578,71},{1582,70},{1583,68},{1582,68},{1581,69}}}, + {"America/Atikokan",12,{{-900,480},{-908,481},{-909,482},{-916,480},{-920,483},{-920,484},{-923,485},{-918,487},{-918,490},{-910,490},{-910,485},{-900,482}}}, + {"America/Pangnirtung",882,{{-659,591},{-661,584},{-670,584},{-670,585},{-675,584},{-675,583},{-677,583},{-676,584},{-679,585},{-667,585},{-667,586},{-673,586},{-665,587},{-665,588},{-663,589},{-663,588},{-660,589},{-661,590},{-659,590},{-661,588},{-661,589},{-656,590},{-656,591},{-655,591},{-657,591},{-658,592},{-656,592},{-658,591},{-658,590},{-658,593},{-654,593},{-656,593},{-657,593},{-655,594},{-656,594},{-655,595},{-680,606},{-678,605},{-680,603},{-656,595},{-654,594},{-674,621},{-675,621},{-655,616},{-650,614},{-649,614},{-649,613},{-648,613},{-647,614},{-648,618},{-649,618},{-662,619},{-652,617},{-653,618},{-652,618},{-659,618},{-659,617},{-653,617},{-658,618},{-658,617},{-657,618},{-656,617},{-660,621},{-659,621},{-657,617},{-658,619},{-654,617},{-648,617},{-655,617},{-648,614},{-647,617},{-651,617},{-641,625},{-642,625},{-666,619},{-653,619},{-649,619},{-650,619},{-658,620},{-672,621},{-660,620},{-669,620},{-659,620},{-661,620},{-667,620},{-650,618},{-652,619},{-679,621},{-673,621},{-680,622},{-661,622},{-661,623},{-643,624},{-650,625},{-644,624},{-643,625},{-647,624},{-647,623},{-646,624},{-647,625},{-645,626},{-649,625},{-676,621},{-675,622},{-646,642},{-647,642},{-648,642},{-645,643},{-646,643},{-659,622},{-658,621},{-679,622},{-678,622},{-648,625},{-651,625},{-644,625},{-643,626},{-643,639},{-642,637},{-642,638},{-644,638},{-643,637},{-644,637},{-643,638},{-641,638},{-642,639},{-644,640},{-643,640},{-642,640},{-644,639},{-641,639},{-648,641},{-649,642},{-651,642},{-648,643},{-647,643},{-645,642},{-650,644},{-649,643},{-650,642},{-651,643},{-648,644},{-647,644},{-651,644},{-645,638},{-646,638},{-645,639},{-650,641},{-651,641},{-649,641},{-649,640},{-648,640},{-646,641},{-647,641},{-645,641},{-644,641},{-652,642},{-650,645},{-652,645},{-651,645},{-653,645},{-653,646},{-651,646},{-652,646},{-650,646},{-649,646},{-655,647},{-652,647},{-653,647},{-654,647},{-655,648},{-654,646},{-657,645},{-654,648},{-638,628},{-639,628},{-649,626},{-649,627},{-670,627},{-669,627},{-655,628},{-637,629},{-646,628},{-647,629},{-648,628},{-648,629},{-647,628},{-664,628},{-663,628},{-657,629},{-658,629},{-651,629},{-668,629},{-665,630},{-667,629},{-666,629},{-665,629},{-664,629},{-650,629},{-659,629},{-660,629},{-661,629},{-645,632},{-646,632},{-647,632},{-648,633},{-670,632},{-680,632},{-679,632},{-677,632},{-671,632},{-678,632},{-639,634},{-640,634},{-680,634},{-680,635},{-675,635},{-675,634},{-676,634},{-650,634},{-651,634},{-679,634},{-641,635},{-666,630},{-642,633},{-644,634},{-645,636},{-640,633},{-650,636},{-649,635},{-648,634},{-651,636},{-677,636},{-676,636},{-640,635},{-676,635},{-643,636},{-641,637},{-640,636},{-639,636},{-642,635},{-642,636},{-668,630},{-641,636},{-646,633},{-679,633},{-678,633},{-674,633},{-675,633},{-680,633},{-660,630},{-651,630},{-669,630},{-675,630},{-670,630},{-677,631},{-678,631},{-671,631},{-669,631},{-670,631},{-648,626},{-679,631},{-680,630},{-676,631},{-678,630},{-678,629},{-676,629},{-674,630},{-670,626},{-666,626},{-663,623},{-662,623},{-661,621},{-662,621},{-659,619},{-640,637},{-648,638},{-634,669},{-635,669},{-614,665},{-615,665},{-677,664},{-678,664},{-671,665},{-672,665},{-668,664},{-669,664},{-670,665},{-669,665},{-668,665},{-624,669},{-624,670},{-623,670},{-632,670},{-620,670},{-619,670},{-627,670},{-626,670},{-632,671},{-630,671},{-631,671},{-628,671},{-626,672},{-625,672},{-631,670},{-625,670},{-625,671},{-624,671},{-631,669},{-630,670},{-674,663},{-622,671},{-623,671},{-621,671},{-629,671},{-628,670},{-624,672},{-639,673},{-640,673},{-634,673},{-639,674},{-638,674},{-637,673},{-636,674},{-637,674},{-639,675},{-640,676},{-639,676},{-637,675},{-640,675},{-649,678},{-650,678},{-649,679},{-648,679},{-647,679},{-654,679},{-659,680},{-660,680},{-652,680},{-653,680},{-653,681},{-661,682},{-662,682},{-668,682},{-667,682},{-666,682},{-662,681},{-655,681},{-656,681},{-657,682},{-656,682},{-661,680},{-662,680},{-654,680},{-655,680},{-654,681},{-659,682},{-658,681},{-657,680},{-658,680},{-621,660},{-621,661},{-620,661},{-668,685},{-672,661},{-669,661},{-670,661},{-671,661},{-673,662},{-672,662},{-662,661},{-663,661},{-663,662},{-623,662},{-675,662},{-676,662},{-676,663},{-671,662},{-618,663},{-617,663},{-621,662},{-621,663},{-620,663},{-664,662},{-672,663},{-673,663},{-671,663},{-677,663},{-675,663},{-676,664},{-675,664},{-669,663},{-670,663},{-671,664},{-670,664},{-672,664},{-667,663},{-668,663},{-666,663},{-662,662},{-622,662},{-624,662},{-623,663},{-629,655},{-630,656},{-626,656},{-626,657},{-625,655},{-625,656},{-624,656},{-628,655},{-629,656},{-628,656},{-623,659},{-658,658},{-658,659},{-679,659},{-680,659},{-677,659},{-657,659},{-673,659},{-676,659},{-680,660},{-622,659},{-622,660},{-671,660},{-669,659},{-670,660},{-669,660},{-621,658},{-622,658},{-621,659},{-674,659},{-659,659},{-671,659},{-672,659},{-672,660},{-673,657},{-672,657},{-623,656},{-625,657},{-621,657},{-623,657},{-677,657},{-678,657},{-622,657},{-680,658},{-675,658},{-674,658},{-673,658},{-678,658},{-675,657},{-676,658},{-677,658},{-674,657},{-658,657},{-659,657},{-659,658},{-676,657},{-672,658},{-679,658},{-656,658},{-656,659},{-655,659},{-655,658},{-673,686},{-674,686},{-679,686},{-678,686},{-670,686},{-669,686},{-677,687},{-674,687},{-679,687},{-680,688},{-676,687},{-676,688},{-675,688},{-675,687},{-674,688},{-678,688},{-677,688},{-679,688},{-677,689},{-675,689},{-678,689},{-676,689},{-679,689},{-680,689},{-676,690},{-676,691},{-675,691},{-675,695},{-677,695},{-673,696},{-676,695},{-677,696},{-678,691},{-679,691},{-680,695},{-672,695},{-666,692},{-677,692},{-680,693},{-675,690},{-680,691},{-677,690},{-680,690},{-676,686},{-680,686},{-677,686},{-672,700},{-673,700},{-680,703},{-674,701},{-671,697},{-680,698},{-680,813},{-651,815},{-645,815},{-680,808},{-680,815},{-671,816},{-667,815},{-680,814},{-678,827},{-679,827},{-680,827},{-677,827},{-673,827},{-671,828},{-672,827},{-646,829},{-644,829},{-645,829},{-673,828},{-672,828},{-680,830},{-671,830},{-664,829},{-650,817},{-648,817},{-652,817},{-666,816},{-669,816},{-663,816},{-667,683},{-665,683},{-666,683},{-667,684},{-668,684},{-666,684},{-658,829},{-655,828},{-652,828},{-654,828},{-648,829},{-645,828},{-635,828},{-640,827},{-630,826},{-634,824},{-623,825},{-624,825},{-611,823},{-644,817},{-680,816},{-678,696},{-679,695},{-680,697},{-678,697},{-677,697},{-664,682},{-662,683},{-663,681},{-661,683},{-668,683},{-669,683},{-670,683},{-663,683},{-664,683},{-670,685},{-669,685},{-669,684},{-670,684},{-679,685},{-678,685},{-667,685},{-667,686},{-666,686},{-674,685},{-671,685},{-672,685},{-673,685},{-675,685},{-675,686},{-671,686},{-634,649},{-634,650},{-633,649},{-634,652},{-667,652},{-668,653},{-667,653},{-630,653},{-631,653},{-632,653},{-633,652},{-633,653},{-667,649},{-667,650},{-666,649},{-662,650},{-666,651},{-667,651},{-666,650},{-640,650},{-640,651},{-639,651},{-639,650},{-669,651},{-669,652},{-644,651},{-644,652},{-642,652},{-666,652},{-670,652},{-651,652},{-650,652},{-671,653},{-672,653},{-670,653},{-669,653},{-668,652},{-669,654},{-664,649},{-663,649},{-661,649},{-662,649},{-680,655},{-673,655},{-675,655},{-670,654},{-674,653},{-672,652},{-671,650},{-669,650},{-668,650},{-667,647},{-664,647},{-663,646},{-662,647},{-660,648},{-660,647},{-658,646},{-659,649},{-657,648},{-657,647},{-653,644},{-652,643},{-656,643},{-657,643},{-650,640},{-652,640},{-647,640},{-646,640},{-650,638},{-645,637},{-647,637},{-645,634},{-646,634},{-647,634},{-645,633},{-648,635},{-651,638},{-653,638},{-649,632},{-650,633},{-651,633},{-651,632},{-648,631},{-650,631},{-646,629},{-653,630},{-652,626},{-654,627},{-652,628},{-653,628},{-653,629},{-657,630},{-658,630},{-661,630},{-662,632},{-665,631},{-665,632},{-667,633},{-665,634},{-668,633},{-668,631},{-669,633},{-669,634},{-671,633},{-676,637},{-679,638},{-677,634},{-680,636},{-633,654},{-634,653},{-668,654},{-648,654},{-649,654},{-670,655},{-669,655},{-632,654},{-635,654},{-636,654},{-668,655},{-633,655},{-680,656},{-679,656},{-674,655},{-672,656},{-673,656},{-655,655},{-656,656},{-655,656},{-635,656},{-634,656},{-671,656},{-631,656},{-632,656},{-672,655},{-671,655},{-630,655},{-656,655},{-632,655},{-631,655},{-680,657},{-680,685},{-679,684},{-676,685},{-676,684},{-674,684},{-678,683},{-679,683},{-676,682},{-670,680},{-667,681},{-667,679},{-666,681},{-665,681},{-663,680},{-664,679},{-665,678},{-668,679},{-664,678},{-661,679},{-659,679},{-660,676},{-656,678},{-653,676},{-647,680},{-651,679},{-652,678},{-652,677},{-652,676},{-645,678},{-643,677},{-644,677},{-646,677},{-646,676},{-645,675},{-648,674},{-642,673},{-648,672},{-646,671},{-647,670},{-634,672},{-638,670},{-638,669},{-631,673},{-630,672},{-633,671},{-636,668},{-638,668},{-634,667},{-633,669},{-629,666},{-628,669},{-623,667},{-620,671},{-621,669},{-618,670},{-617,669},{-618,669},{-619,669},{-620,669},{-616,669},{-618,668},{-613,666},{-620,667},{-622,666},{-618,666},{-616,665},{-620,664},{-616,664},{-615,663},{-626,664},{-627,664},{-627,662},{-628,663},{-629,663},{-619,660},{-623,660},{-629,661},{-630,661},{-624,660},{-623,658},{-628,659},{-628,658},{-627,656},{-629,657},{-635,659},{-633,657},{-637,657},{-633,656},{-637,656},{-634,654},{-635,655},{-637,655},{-635,652},{-633,651},{-635,650},{-636,650},{-635,649},{-638,650},{-637,650},{-638,652},{-641,650},{-643,651},{-641,652},{-642,654},{-646,651},{-647,651},{-646,652},{-649,653},{-647,653},{-644,654},{-644,655},{-652,654},{-647,656},{-653,656},{-648,657},{-655,657},{-653,659},{-647,660},{-648,660},{-648,662},{-644,663},{-643,663},{-647,663},{-648,661},{-660,660},{-655,662},{-655,664},{-660,661},{-661,663},{-665,662},{-664,664},{-667,665},{-667,666},{-672,667},{-668,666},{-675,667},{-679,666},{-673,665},{-674,664},{-680,665},{-678,662},{-677,662},{-677,661},{-678,659}}}, + {"Pacific/Norfolk",4,{{1679,-291},{1680,-291},{1680,-290},{1679,-290}}}, + {"Africa/Dakar",49,{{-175,147},{-175,146},{-168,139},{-167,138},{-166,138},{-168,131},{-158,132},{-158,133},{-153,134},{-151,136},{-144,132},{-138,134},{-140,136},{-143,135},{-151,138},{-155,136},{-166,136},{-166,137},{-165,139},{-167,140},{-168,138},{-172,146},{-171,149},{-169,152},{-163,165},{-144,167},{-138,161},{-134,161},{-132,156},{-122,147},{-122,144},{-119,139},{-121,137},{-118,133},{-116,134},{-114,130},{-114,125},{-124,123},{-129,125},{-131,125},{-131,126},{-152,127},{-157,124},{-167,123},{-168,125},{-164,126},{-168,126},{-167,136},{-167,137}}}, + {"Indian/Kerguelen",107,{{697,-495},{698,-495},{695,-492},{694,-492},{697,-492},{691,-495},{691,-496},{703,-495},{689,-500},{695,-500},{695,-499},{688,-498},{696,-492},{697,-491},{696,-490},{697,-490},{690,-490},{695,-490},{687,-488},{688,-486},{688,-485},{688,-484},{522,-464},{523,-464},{521,-464},{503,-461},{502,-461},{504,-464},{517,-464},{518,-464},{519,-464},{517,-465},{504,-460},{505,-460},{775,-387},{776,-387},{775,-379},{775,-378},{776,-378},{687,-486},{686,-487},{686,-486},{693,-490},{694,-489},{692,-491},{692,-490},{688,-490},{688,-489},{696,-489},{695,-489},{696,-488},{695,-487},{692,-487},{692,-489},{691,-490},{694,-488},{687,-497},{698,-497},{697,-497},{698,-496},{694,-496},{697,-496},{692,-496},{693,-496},{700,-496},{699,-495},{702,-495},{701,-495},{700,-495},{700,-494},{689,-494},{704,-494},{688,-493},{688,-494},{687,-493},{699,-494},{698,-494},{693,-492},{697,-493},{703,-491},{706,-492},{703,-494},{696,-494},{701,-496},{703,-496},{703,-497},{702,-497},{699,-497},{695,-496},{693,-495},{692,-495},{691,-497},{688,-497},{689,-495},{689,-493},{688,-492},{689,-491},{687,-491},{689,-490},{689,-487},{691,-487},{690,-488},{689,-489},{691,-488},{692,-488},{690,-491},{695,-491}}}, + {"Europe/Rome",228,{{122,453},{150,384},{149,384},{126,355},{125,355},{128,359},{129,359},{120,367},{119,368},{121,368},{124,378},{124,379},{125,379},{132,387},{152,388},{85,391},{83,391},{82,392},{83,392},{96,391},{96,392},{123,379},{123,380},{121,380},{120,380},{121,379},{150,385},{149,385},{144,385},{143,385},{146,386},{145,386},{151,386},{151,387},{148,386},{149,386},{155,421},{111,422},{111,423},{179,400},{179,401},{172,404},{171,405},{172,405},{142,405},{142,406},{143,406},{143,405},{139,407},{139,408},{140,407},{140,408},{97,400},{95,391},{91,392},{89,389},{86,389},{84,390},{84,395},{86,399},{84,399},{85,403},{83,406},{82,406},{82,410},{85,408},{92,413},{95,412},{95,410},{96,410},{97,410},{95,409},{97,408},{98,405},{96,403},{134,408},{97,409},{130,409},{129,409},{128,409},{129,410},{125,455},{125,456},{157,383},{151,375},{153,370},{151,367},{145,368},{143,370},{138,371},{132,375},{127,376},{127,382},{129,380},{133,382},{137,380},{124,380},{83,411},{94,413},{93,413},{93,412},{94,412},{131,410},{130,410},{98,440},{98,441},{99,441},{99,440},{98,430},{98,431},{99,434},{123,448},{136,457},{135,457},{134,457},{133,457},{132,457},{126,455},{126,456},{122,454},{124,454},{123,455},{124,455},{123,453},{123,454},{123,452},{103,423},{103,424},{166,401},{165,397},{172,394},{172,390},{166,388},{166,384},{161,379},{157,379},{156,382},{159,384},{158,386},{162,389},{157,400},{153,400},{149,402},{150,404},{148,407},{145,407},{137,413},{130,412},{116,423},{111,424},{112,425},{111,426},{107,429},{105,429},{105,433},{100,441},{87,444},{81,439},{75,438},{77,442},{70,442},{68,445},{71,447},{70,448},{66,451},{71,452},{72,454},{68,458},{79,459},{84,465},{85,463},{88,461},{90,458},{93,465},{95,465},{95,463},{99,464},{101,462},{101,465},{105,465},{105,469},{110,468},{112,470},{122,471},{121,469},{124,467},{137,465},{134,463},{137,462},{135,460},{136,460},{136,458},{139,456},{135,458},{131,458},{131,456},{121,454},{124,450},{125,450},{123,444},{127,440},{136,436},{140,427},{147,421},{155,419},{153,419},{161,419},{162,418},{159,416},{160,415},{180,406},{185,401},{183,398},{180,399},{179,403},{124,419},{125,419},{124,440},{125,439},{125,440},{102,427},{101,428},{104,429},{104,427},{109,423},{109,424},{101,426},{100,426}}}, + {"America/Argentina/Buenos_Aires",67,{{-584,-343},{-584,-342},{-582,-342},{-583,-342},{-584,-340},{-623,-390},{-623,-389},{-622,-389},{-623,-388},{-621,-390},{-620,-391},{-620,-390},{-624,-388},{-585,-345},{-585,-344},{-585,-343},{-622,-390},{-622,-405},{-622,-404},{-621,-404},{-624,-403},{-623,-403},{-624,-402},{-621,-402},{-621,-401},{-623,-400},{-622,-399},{-621,-399},{-623,-393},{-623,-399},{-620,-392},{-620,-393},{-622,-392},{-621,-393},{-621,-392},{-619,-391},{-619,-392},{-600,-335},{-586,-341},{-586,-343},{-575,-351},{-571,-354},{-574,-357},{-574,-360},{-569,-364},{-567,-363},{-567,-369},{-574,-377},{-576,-381},{-582,-384},{-611,-390},{-619,-390},{-622,-388},{-620,-394},{-621,-394},{-622,-393},{-621,-398},{-625,-403},{-622,-406},{-623,-409},{-628,-410},{-634,-407},{-634,-344},{-617,-344},{-609,-336},{-605,-336},{-603,-333}}}, + {"America/Edmonton",33,{{-1141,490},{-1157,490},{-1163,495},{-1167,495},{-1167,499},{-1164,500},{-1167,505},{-1166,506},{-1172,510},{-1173,513},{-1172,513},{-1180,515},{-1179,517},{-1182,518},{-1181,519},{-1187,522},{-1182,524},{-1184,529},{-1189,532},{-1192,532},{-1199,535},{-1197,536},{-1200,538},{-1200,600},{-1100,600},{-1100,536},{-1096,536},{-1088,530},{-1089,528},{-1092,529},{-1094,527},{-1100,527},{-1100,490}}}, + {"America/Barbados",4,{{-596,133},{-594,132},{-595,130},{-596,131}}}, + {"America/Santo_Domingo",38,{{-716,175},{-687,181},{-688,182},{-686,181},{-715,176},{-715,175},{-716,176},{-708,183},{-690,183},{-690,184},{-709,183},{-711,183},{-711,181},{-714,176},{-717,178},{-717,183},{-720,186},{-717,187},{-719,189},{-716,192},{-718,193},{-717,199},{-710,199},{-703,196},{-700,197},{-697,193},{-692,193},{-692,192},{-696,192},{-696,191},{-688,190},{-683,186},{-686,182},{-699,185},{-702,182},{-706,182},{-707,184},{-692,190}}}, + {"Asia/Kuwait",24,{{481,299},{484,294},{483,294},{483,295},{479,294},{479,293},{481,292},{484,285},{477,285},{475,290},{466,291},{471,300},{474,301},{480,300},{482,295},{477,294},{480,294},{481,298},{480,298},{482,300},{484,298},{482,296},{480,299},{481,300}}}, + {"Asia/Bishkek",70,{{748,405},{749,403},{739,400},{739,395},{725,394},{722,392},{720,394},{718,393},{718,394},{716,395},{715,396},{708,394},{705,396},{694,395},{693,398},{694,400},{695,399},{695,401},{700,402},{706,400},{705,399},{711,403},{717,401},{722,405},{724,404},{724,406},{726,405},{731,408},{722,410},{722,412},{719,412},{719,413},{717,416},{714,411},{708,412},{707,415},{702,415},{713,422},{709,423},{713,428},{719,428},{735,424},{736,430},{743,432},{752,428},{757,428},{759,430},{785,429},{792,428},{795,425},{799,424},{803,422},{803,421},{799,420},{797,418},{794,418},{784,414},{782,411},{769,410},{763,404},{763,405},{757,403},{756,407},{752,404},{711,400},{711,399},{712,399},{710,402},{707,399},{706,398}}}, + {"Europe/Moscow",1428,{{477,439},{476,440},{479,440},{478,439},{469,444},{475,444},{475,445},{470,445},{468,445},{470,447},{366,452},{366,453},{365,453},{473,448},{473,449},{475,451},{475,452},{383,468},{384,468},{270,601},{270,600},{272,599},{272,598},{379,640},{368,641},{368,640},{363,641},{367,641},{367,642},{366,642},{364,643},{365,643},{362,643},{363,643},{358,644},{357,644},{350,645},{349,645},{353,644},{352,644},{355,644},{354,644},{356,644},{359,643},{358,643},{360,643},{359,644},{361,643},{348,645},{396,645},{396,646},{405,646},{402,646},{403,646},{350,646},{350,647},{403,647},{401,646},{284,606},{285,606},{404,646},{402,647},{400,646},{357,646},{356,646},{302,600},{278,600},{279,600},{297,600},{296,600},{298,600},{284,600},{280,600},{281,600},{287,603},{286,603},{285,603},{278,604},{278,605},{284,604},{285,604},{284,605},{277,605},{279,605},{285,607},{286,607},{287,607},{287,608},{288,607},{287,604},{287,605},{287,606},{286,606},{286,605},{356,647},{355,647},{400,647},{398,647},{401,647},{403,648},{402,648},{401,648},{350,648},{349,648},{404,647},{348,647},{404,648},{351,647},{351,648},{399,647},{400,648},{352,649},{351,649},{348,651},{347,651},{360,650},{359,650},{348,650},{350,650},{350,649},{351,650},{352,650},{356,650},{356,649},{357,650},{402,650},{349,649},{403,649},{402,649},{368,652},{345,653},{349,656},{350,657},{350,658},{349,657},{349,658},{322,671},{321,671},{323,671},{405,678},{414,671},{326,670},{327,671},{324,671},{441,679},{396,681},{395,681},{532,681},{532,682},{542,682},{541,681},{541,682},{539,682},{535,683},{535,682},{539,683},{541,683},{542,683},{339,662},{360,652},{361,652},{363,652},{359,651},{347,658},{340,663},{338,663},{339,663},{337,663},{335,663},{334,663},{336,663},{338,664},{337,664},{334,665},{407,665},{344,666},{343,666},{331,665},{330,665},{332,666},{334,666},{335,665},{331,666},{425,667},{424,668},{426,667},{329,668},{330,667},{329,667},{466,668},{327,670},{325,670},{355,651},{358,652},{347,652},{585,702},{584,702},{584,704},{587,704},{587,705},{566,705},{567,705},{573,705},{563,705},{564,705},{524,721},{523,721},{526,715},{527,715},{531,715},{524,722},{525,722},{536,709},{535,709},{540,711},{539,711},{536,711},{535,711},{536,712},{534,712},{534,713},{534,711},{528,711},{526,713},{522,713},{527,714},{533,712},{531,710},{532,709},{532,713},{531,713},{526,714},{525,714},{530,714},{532,714},{533,713},{531,714},{533,714},{585,758},{586,758},{595,746},{568,747},{567,747},{592,759},{590,759},{593,759},{589,759},{588,759},{607,760},{608,760},{606,760},{587,744},{591,744},{590,743},{590,744},{593,745},{592,745},{594,745},{593,746},{593,744},{592,744},{594,744},{586,744},{546,736},{546,737},{580,738},{580,739},{583,740},{582,740},{583,741},{584,741},{553,742},{588,743},{587,743},{586,741},{586,742},{555,722},{555,723},{526,723},{525,723},{526,724},{527,724},{556,724},{528,725},{529,725},{527,726},{526,726},{533,729},{532,729},{531,731},{540,734},{541,734},{572,705},{562,706},{563,706},{557,706},{574,706},{575,706},{573,706},{566,706},{567,706},{561,706},{560,706},{559,706},{565,705},{574,705},{568,706},{570,706},{569,705},{571,706},{556,706},{555,706},{555,707},{545,733},{549,734},{565,732},{558,731},{564,730},{563,730},{555,729},{562,729},{561,728},{555,728},{559,727},{556,727},{556,725},{554,726},{552,726},{551,726},{551,724},{555,724},{553,723},{556,722},{553,721},{554,719},{551,719},{555,719},{562,712},{576,707},{567,707},{565,707},{562,707},{558,707},{554,707},{553,707},{552,705},{545,708},{544,707},{548,706},{535,708},{533,709},{537,708},{538,709},{540,710},{538,711},{541,711},{542,711},{535,712},{535,715},{530,715},{529,714},{525,717},{525,715},{523,716},{522,715},{523,715},{519,715},{514,718},{516,721},{525,721},{526,721},{524,723},{526,722},{527,723},{528,724},{527,725},{533,726},{537,726},{524,727},{526,728},{529,729},{534,729},{536,729},{531,729},{534,730},{534,732},{586,798},{587,798},{600,799},{599,799},{601,799},{586,800},{587,800},{590,799},{583,799},{492,800},{491,800},{493,800},{636,807},{637,807},{544,806},{543,806},{588,806},{585,806},{589,806},{580,806},{579,806},{577,806},{581,806},{573,806},{575,806},{567,805},{566,805},{564,805},{485,808},{488,807},{476,808},{473,807},{474,806},{463,804},{449,806},{472,808},{566,807},{570,807},{554,807},{560,808},{550,807},{540,808},{551,807},{590,808},{585,807},{578,808},{583,809},{601,809},{600,802},{599,802},{602,801},{601,801},{494,801},{495,801},{497,801},{591,801},{593,801},{516,803},{515,803},{543,811},{542,811},{542,802},{541,803},{544,803},{544,802},{525,802},{522,802},{533,804},{539,802},{550,803},{554,803},{556,803},{552,802},{589,803},{588,803},{540,803},{539,803},{526,803},{524,803},{523,803},{527,803},{506,800},{510,801},{514,799},{501,800},{600,800},{594,799},{588,800},{596,801},{503,801},{502,801},{550,805},{551,805},{546,805},{549,805},{500,802},{504,802},{500,800},{495,802},{570,803},{572,803},{571,801},{558,801},{562,802},{559,803},{529,801},{528,801},{581,801},{579,801},{573,802},{573,803},{570,804},{593,803},{582,803},{585,802},{580,802},{611,803},{612,803},{603,803},{602,803},{601,803},{602,804},{549,804},{548,804},{546,804},{562,804},{563,804},{558,804},{559,804},{550,804},{553,804},{551,804},{534,806},{536,805},{531,806},{587,816},{588,816},{544,804},{541,806},{541,805},{545,805},{539,804},{538,806},{600,808},{619,809},{622,808},{621,806},{611,804},{593,805},{596,808},{603,808},{600,813},{605,813},{606,813},{598,813},{557,813},{558,814},{546,812},{575,812},{574,812},{546,813},{545,813},{542,813},{544,813},{582,812},{583,812},{588,814},{587,814},{584,815},{583,815},{582,815},{568,815},{589,817},{588,817},{594,818},{582,817},{579,818},{588,819},{620,816},{619,816},{618,816},{623,815},{621,815},{583,816},{584,816},{638,816},{630,816},{622,817},{633,817},{589,816},{592,814},{594,813},{585,813},{589,814},{593,814},{549,814},{548,814},{550,814},{578,815},{586,814},{570,815},{631,809},{630,809},{632,809},{650,812},{653,811},{654,810},{652,810},{654,809},{632,806},{625,808},{581,809},{580,809},{580,810},{582,810},{615,811},{610,809},{600,810},{617,811},{567,808},{561,808},{544,810},{561,810},{572,807},{566,810},{561,811},{575,808},{495,806},{497,807},{490,807},{509,809},{510,809},{502,807},{518,807},{497,805},{498,804},{496,804},{488,804},{485,803},{491,802},{483,801},{477,801},{482,802},{478,802},{480,802},{472,802},{467,803},{481,803},{476,804},{484,804},{474,805},{581,810},{579,810},{588,810},{585,809},{509,811},{504,810},{504,811},{510,811},{586,810},{585,811},{588,811},{584,811},{582,811},{581,811},{586,811},{594,812},{598,812},{590,812},{591,812},{571,811},{569,811},{577,812},{581,812},{558,813},{566,813},{564,814},{566,814},{580,813},{565,812},{555,813},{596,760},{595,760},{597,761},{597,760},{600,759},{605,761},{608,761},{605,760},{611,761},{612,761},{609,761},{612,763},{625,762},{647,763},{646,764},{655,766},{660,765},{658,767},{676,770},{685,770},{691,767},{683,762},{638,756},{636,757},{614,752},{613,753},{608,750},{600,750},{607,749},{602,749},{603,747},{595,748},{599,747},{598,746},{591,747},{592,746},{583,746},{587,742},{581,741},{575,742},{575,741},{572,741},{578,739},{579,738},{577,737},{575,738},{566,739},{573,738},{576,736},{564,737},{572,735},{567,733},{567,732},{561,733},{561,734},{559,734},{558,735},{560,733},{542,733},{547,736},{560,736},{551,737},{554,738},{542,736},{536,737},{550,739},{546,740},{550,742},{564,740},{551,742},{558,743},{553,744},{554,744},{559,744},{562,745},{555,746},{558,747},{570,747},{559,748},{567,749},{559,750},{560,751},{558,751},{559,752},{566,751},{570,753},{567,753},{570,754},{579,753},{576,755},{583,756},{579,756},{581,757},{593,760},{595,761},{590,761},{591,761},{600,761},{599,761},{605,762},{601,761},{626,762},{629,762},{630,762},{611,763},{610,763},{613,763},{615,763},{614,763},{469,447},{467,444},{472,442},{475,438},{475,436},{475,430},{485,419},{484,416},{478,412},{473,413},{467,419},{466,418},{456,422},{458,425},{452,427},{449,427},{448,426},{445,428},{439,426},{429,432},{416,432},{407,436},{401,436},{400,434},{388,443},{366,451},{370,453},{368,454},{367,453},{375,454},{379,460},{381,460},{383,463},{379,464},{377,467},{386,467},{384,467},{385,469},{393,470},{392,473},{382,471},{383,475},{388,477},{389,479},{398,478},{400,483},{397,486},{398,488},{401,489},{397,490},{402,492},{401,495},{402,496},{383,501},{380,499},{375,504},{366,502},{361,505},{356,504},{354,506},{354,511},{352,511},{351,512},{343,513},{343,515},{341,517},{345,518},{338,524},{324,523},{323,521},{318,521},{316,523},{316,528},{313,530},{314,532},{322,531},{328,535},{325,536},{325,537},{318,538},{319,540},{313,543},{311,545},{312,547},{308,548},{310,551},{308,553},{310,556},{303,559},{295,557},{294,558},{294,560},{287,560},{282,562},{282,563},{280,568},{277,568},{279,573},{273,575},{275,578},{278,579},{275,582},{274,585},{275,589},{282,594},{280,598},{284,597},{285,598},{290,598},{291,600},{302,599},{303,600},{299,602},{291,602},{286,604},{282,605},{309,623},{316,629},{312,632},{300,638},{306,641},{301,644},{301,648},{298,648},{296,650},{299,651},{296,653},{299,656},{297,656},{301,657},{301,658},{290,669},{300,677},{293,681},{287,682},{285,685},{288,689},{284,689},{301,695},{301,697},{305,695},{309,696},{308,698},{314,697},{313,696},{318,697},{317,698},{321,698},{319,699},{320,700},{331,697},{329,696},{321,697},{320,695},{325,695},{322,694},{331,694},{328,693},{329,693},{335,694},{332,693},{334,693},{335,692},{333,692},{330,691},{336,691},{336,693},{357,692},{357,690},{358,692},{378,686},{384,683},{388,682},{386,683},{386,684},{397,680},{398,680},{398,682},{405,677},{410,677},{411,673},{412,668},{400,663},{387,661},{345,665},{344,667},{341,667},{342,667},{342,668},{339,667},{336,668},{335,667},{328,670},{330,671},{324,672},{319,671},{324,669},{327,667},{333,666},{328,666},{332,665},{329,665},{330,663},{341,662},{348,659},{346,658},{348,656},{347,654},{343,654},{347,650},{347,647},{353,643},{363,640},{374,638},{381,640},{379,642},{380,643},{378,644},{372,644},{365,647},{364,649},{368,650},{368,651},{370,652},{384,648},{380,648},{381,647},{380,646},{405,645},{407,647},{405,648},{405,647},{406,647},{404,649},{397,653},{398,656},{415,661},{423,665},{426,664},{425,664},{433,664},{437,662},{433,661},{433,660},{438,662},{442,659},{441,662},{446,667},{444,668},{445,669},{444,671},{438,673},{442,677},{441,678},{443,679},{442,680},{444,680},{442,683},{433,687},{440,685},{452,685},{455,685},{460,684},{459,684},{465,681},{467,678},{453,677},{453,676},{448,673},{456,672},{460,668},{469,668},{476,669},{479,674},{479,676},{491,676},{487,677},{488,678},{486,679},{492,679},{508,684},{522,686},{521,685},{524,683},{528,685},{523,686},{537,689},{542,690},{546,690},{536,689},{540,688},{537,686},{540,684},{533,683},{531,681},{540,680},{545,683},{548,681},{550,682},{549,683},{554,685},{561,686},{573,685},{578,687},{572,687},{589,690},{593,690},{590,689},{595,687},{592,687},{591,684},{598,684},{599,684},{598,686},{599,687},{604,687},{609,689},{610,689},{609,688},{611,688},{612,688},{602,696},{608,696},{607,697},{609,699},{634,696},{649,693},{645,689},{653,688},{657,686},{653,682},{653,680},{661,679},{660,678},{662,677},{658,676},{661,675},{652,672},{651,669},{634,665},{632,663},{633,662},{629,661},{628,659},{619,657},{606,649},{602,651},{597,648},{595,645},{596,645},{596,642},{599,641},{596,639},{592,631},{595,629},{594,627},{597,625},{594,621},{593,617},{588,615},{567,615},{564,614},{563,612},{553,611},{550,609},{539,610},{538,608},{536,609},{533,609},{534,610},{529,611},{523,608},{519,609},{518,606},{523,604},{523,602},{520,603},{515,599},{511,601},{508,599},{500,598},{497,592},{495,592},{495,594},{490,595},{491,597},{485,597},{485,602},{488,604},{485,604},{484,609},{480,609},{480,610},{472,611},{470,607},{471,606},{469,605},{467,603},{463,602},{466,601},{470,601},{469,598},{471,597},{471,594},{473,594},{472,592},{476,589},{473,589},{470,586},{466,586},{463,581},{478,579},{476,578},{475,575},{467,575},{467,573},{469,572},{467,569},{475,569},{477,571},{481,570},{483,572},{490,571},{492,573},{493,570},{497,571},{497,569},{501,568},{501,566},{505,566},{506,564},{509,564},{508,562},{513,561},{516,561},{514,559},{522,559},{522,561},{527,560},{528,562},{526,563},{529,565},{531,565},{529,564},{530,561},{533,561},{533,563},{536,562},{532,559},{539,559},{542,557},{536,552},{531,551},{536,549},{533,544},{534,540},{531,541},{529,542},{531,542},{530,543},{529,543},{524,545},{521,543},{519,545},{514,547},{510,546},{509,543},{501,545},{503,543},{502,540},{500,540},{500,538},{485,538},{486,537},{483,537},{484,535},{479,534},{482,530},{486,529},{484,528},{474,526},{466,527},{460,524},{456,525},{451,523},{445,526},{443,523},{432,525},{428,522},{428,520},{425,517},{429,512},{419,512},{412,508},{415,506},{414,502},{415,501},{422,497},{421,492},{423,492},{427,488},{426,485},{421,484},{420,480},{425,480},{429,475},{431,476},{432,474},{437,474},{437,477},{441,479},{444,479},{445,480},{443,481},{443,483},{445,482},{445,481},{450,482},{457,480},{458,477},{463,474},{468,476},{465,474},{468,470},{472,467},{469,466},{470,464},{465,463},{469,462},{468,461},{472,461},{469,456},{474,457},{476,455},{472,448},{464,683},{543,683},{540,683},{463,683},{462,683},{385,683},{463,684},{538,683},{538,684},{539,684},{524,685},{523,685},{571,687},{496,687},{495,687},{494,687},{461,684},{384,684},{385,684},{462,684},{509,684},{511,685},{515,685},{610,688},{491,687},{492,687},{487,687},{377,687},{595,690},{594,691},{348,692},{347,692},{348,693},{364,691},{363,691},{330,694},{332,694},{329,695},{327,695},{326,695},{593,691},{592,692},{589,693},{587,693},{587,694},{592,693},{335,693},{344,693},{342,693},{340,694},{341,694},{586,694},{585,695},{586,695},{553,689},{554,689},{548,689},{499,690},{499,689},{500,689},{501,690},{501,689},{546,689},{547,690},{547,689},{500,690},{550,689},{549,689},{552,689},{488,687},{484,687},{485,687},{375,688},{484,688},{374,688},{373,688},{483,688},{544,688},{542,688},{543,688},{495,688},{486,687},{595,689},{556,689},{555,689},{557,689},{500,691},{497,689},{482,689},{483,693},{489,695},{494,695},{501,693},{502,692},{503,691},{503,692},{316,698},{612,698},{612,699},{613,698},{595,699},{594,699},{606,697},{594,698},{595,698},{600,701},{606,698},{596,697},{597,698},{590,699},{592,699},{591,699},{588,702},{585,703},{591,705},{606,696},{607,696}}}, + {"Asia/Manila",915,{{1257,96},{1236,110},{1236,111},{1232,110},{1208,112},{1250,125},{1252,126},{1255,122},{1254,116},{1256,114},{1255,112},{1257,112},{1258,110},{1257,111},{1252,111},{1250,113},{1248,115},{1250,118},{1244,122},{1243,126},{1194,46},{1194,48},{1194,47},{1198,48},{1199,48},{1200,50},{1200,49},{1199,49},{1195,49},{1195,48},{1195,46},{1195,47},{1194,49},{1198,49},{1202,50},{1203,51},{1203,52},{1199,51},{1202,51},{1200,51},{1201,50},{1197,50},{1198,50},{1198,51},{1207,52},{1206,52},{1203,54},{1204,54},{1253,54},{1254,54},{1206,53},{1205,52},{1200,52},{1202,53},{1199,52},{1204,52},{1204,53},{1199,53},{1200,53},{1203,53},{1202,54},{1202,52},{1209,55},{1209,56},{1255,55},{1255,54},{1206,54},{1202,55},{1206,55},{1207,55},{1207,54},{1205,55},{1204,55},{1266,77},{1224,75},{1231,76},{1235,76},{1223,72},{1228,73},{1229,73},{1258,73},{1223,73},{1240,73},{1241,74},{1229,74},{1228,74},{1205,61},{1210,61},{1209,61},{1204,62},{1205,62},{1204,61},{1181,62},{1211,62},{1210,62},{1218,61},{1206,61},{1218,62},{1209,62},{1208,62},{1181,63},{1206,64},{1206,62},{1205,63},{1207,64},{1208,64},{1220,63},{1219,63},{1207,63},{1206,63},{1208,63},{1209,63},{1220,64},{1218,65},{1215,66},{1216,66},{1217,66},{1218,66},{1217,67},{1216,67},{1224,67},{1214,68},{1215,67},{1214,67},{1215,68},{1263,68},{1216,68},{1224,68},{1221,69},{1220,69},{1216,69},{1257,69},{1257,70},{1222,69},{1223,69},{1219,67},{1220,68},{1220,67},{1223,67},{1222,65},{1218,64},{1221,67},{1223,66},{1184,70},{1185,70},{1258,69},{1257,71},{1257,72},{1258,71},{1222,70},{1223,70},{1266,56},{1203,56},{1210,57},{1204,57},{1204,58},{1197,58},{1212,58},{1211,58},{1208,58},{1211,57},{1209,57},{1208,57},{1209,58},{1200,59},{1216,60},{1216,59},{1201,59},{1201,60},{1219,60},{1219,61},{1218,60},{1217,60},{1183,61},{1217,61},{1204,60},{1213,60},{1214,60},{1215,60},{1212,61},{1213,61},{1214,61},{1215,61},{1199,59},{1211,59},{1212,59},{1214,59},{1213,59},{1209,59},{1208,55},{1208,56},{1170,80},{1171,81},{1170,78},{1169,79},{1170,81},{1172,81},{1171,82},{1172,82},{1170,82},{1188,99},{1189,99},{1188,101},{1260,99},{1260,100},{1260,98},{1259,99},{1224,99},{1238,98},{1238,99},{1246,99},{1234,99},{1256,99},{1255,99},{1239,99},{1239,100},{1251,99},{1251,100},{1192,101},{1240,100},{1256,100},{1255,100},{1251,102},{1252,101},{1253,99},{1251,101},{1255,101},{1245,101},{1246,101},{1246,102},{1245,100},{1193,101},{1192,102},{1242,102},{1241,102},{1243,102},{1244,102},{1193,102},{1239,102},{1239,103},{1240,102},{1241,103},{1195,103},{1194,103},{1243,103},{1245,102},{1244,103},{1189,103},{1190,103},{1260,108},{1259,108},{1258,109},{1240,103},{1256,104},{1226,104},{1172,78},{1244,61},{1241,64},{1239,68},{1242,74},{1237,78},{1234,78},{1233,76},{1235,74},{1231,75},{1231,78},{1230,75},{1229,77},{1227,78},{1219,70},{1219,71},{1222,80},{1229,81},{1230,85},{1233,85},{1234,87},{1238,84},{1239,82},{1237,80},{1242,82},{1244,86},{1248,85},{1248,90},{1251,88},{1252,91},{1255,90},{1254,98},{1260,95},{1260,92},{1262,93},{1262,91},{1263,88},{1261,86},{1264,85},{1264,79},{1266,73},{1263,69},{1262,69},{1262,63},{1259,74},{1254,67},{1257,61},{1254,56},{1252,58},{1252,61},{1250,59},{1184,78},{1264,83},{1173,82},{1264,84},{1263,89},{1172,83},{1173,83},{1256,97},{1239,118},{1172,84},{1236,86},{1232,88},{1234,89},{1182,89},{1183,89},{1181,91},{1233,91},{1247,91},{1247,93},{1248,91},{1179,93},{1184,92},{1184,93},{1185,92},{1208,93},{1261,94},{1260,94},{1186,94},{1186,95},{1261,97},{1262,97},{1260,97},{1261,96},{1262,96},{1256,98},{1257,97},{1257,98},{1258,96},{1237,92},{1236,91},{1235,92},{1236,93},{1180,93},{1255,98},{1257,99},{1259,94},{1239,95},{1210,96},{1213,97},{1212,96},{1238,95},{1237,96},{1239,96},{1213,96},{1259,96},{1259,98},{1261,100},{1262,98},{1243,101},{1246,100},{1246,97},{1249,116},{1202,120},{1199,116},{1233,116},{1234,116},{1232,116},{1217,116},{1255,116},{1255,117},{1228,116},{1200,116},{1199,117},{1200,117},{1201,117},{1248,117},{1248,116},{1249,117},{1230,117},{1247,120},{1247,119},{1230,118},{1201,118},{1248,118},{1243,118},{1247,118},{1201,119},{1255,119},{1203,118},{1203,119},{1215,118},{1214,118},{1214,119},{1231,118},{1231,119},{1213,119},{1200,119},{1203,120},{1202,119},{1237,119},{1241,119},{1244,119},{1244,120},{1246,119},{1245,119},{1236,119},{1216,119},{1215,120},{1243,120},{1243,119},{1202,117},{1247,117},{1200,118},{1202,118},{1199,120},{1198,120},{1198,121},{1198,122},{1256,120},{1256,121},{1242,120},{1242,121},{1220,121},{1220,122},{1236,120},{1235,120},{1204,120},{1220,120},{1219,121},{1199,121},{1216,121},{1199,122},{1219,119},{1219,120},{1200,120},{1198,119},{1201,120},{1216,120},{1214,121},{1214,120},{1202,122},{1201,122},{1202,121},{1203,121},{1203,122},{1232,122},{1233,122},{1214,122},{1204,122},{1177,151},{1177,152},{1199,155},{1198,157},{1198,158},{1201,161},{1200,163},{1200,162},{1199,163},{1199,164},{1200,164},{1204,175},{1221,186},{1222,185},{1221,185},{1222,149},{1220,149},{1178,151},{1221,149},{1222,150},{1218,142},{1218,143},{1219,143},{1206,144},{1230,144},{1230,145},{1228,145},{1218,189},{1212,190},{1229,144},{1229,145},{1216,147},{1223,147},{1224,147},{1205,148},{1206,148},{1222,147},{1221,148},{1222,148},{1220,144},{1228,144},{1231,141},{1229,142},{1220,148},{1218,150},{1220,150},{1220,146},{1218,149},{1213,189},{1212,189},{1212,192},{1212,191},{1215,193},{1214,193},{1213,194},{1215,194},{1215,195},{1219,195},{1220,196},{1220,195},{1221,200},{1222,200},{1218,203},{1219,207},{1218,207},{1218,208},{1219,208},{1219,203},{1218,204},{1220,205},{1220,204},{1219,209},{1220,211},{1219,211},{1213,188},{1215,189},{1231,140},{1219,189},{1219,190},{1220,190},{1219,188},{1239,129},{1238,128},{1220,128},{1221,128},{1220,129},{1217,129},{1217,130},{1221,129},{1220,130},{1221,130},{1219,130},{1229,132},{1229,131},{1236,127},{1233,127},{1229,130},{1233,129},{1239,138},{1238,138},{1233,138},{1227,138},{1236,140},{1240,140},{1203,138},{1200,139},{1203,137},{1201,138},{1201,139},{1238,139},{1239,139},{1236,139},{1237,139},{1218,139},{1217,139},{1238,140},{1236,136},{1209,136},{1208,137},{1204,136},{1241,132},{1242,132},{1240,133},{1241,133},{1240,132},{1218,132},{1219,132},{1238,133},{1239,133},{1239,132},{1227,133},{1227,134},{1238,134},{1221,134},{1241,140},{1232,140},{1220,141},{1219,142},{1222,140},{1221,140},{1199,124},{1240,124},{1241,124},{1240,123},{1242,135},{1240,137},{1242,141},{1244,138},{1210,135},{1209,135},{1211,135},{1210,136},{1211,136},{1222,135},{1220,132},{1218,133},{1219,136},{1221,135},{1243,139},{1243,140},{1244,140},{1239,140},{1235,140},{1233,141},{1199,123},{1241,123},{1210,122},{1238,123},{1239,122},{1211,122},{1211,123},{1204,123},{1214,123},{1213,123},{1203,123},{1215,124},{1214,124},{1203,124},{1232,123},{1232,124},{1233,124},{1237,120},{1235,122},{1232,126},{1241,117},{1220,124},{1220,126},{1222,127},{1190,104},{1190,105},{1226,125},{1227,124},{1226,123},{1224,124},{1200,125},{1241,125},{1241,126},{1251,125},{1251,126},{1244,125},{1244,126},{1245,126},{1245,125},{1249,126},{1243,124},{1242,125},{1242,124},{1223,125},{1222,126},{1223,126},{1237,124},{1236,126},{1191,104},{1250,127},{1250,126},{1251,127},{1244,127},{1204,127},{1192,105},{1191,105},{1192,106},{1191,106},{1258,107},{1257,108},{1207,131},{1203,134},{1203,135},{1216,131},{1212,122},{1231,137},{1234,139},{1236,137},{1235,136},{1238,131},{1242,131},{1240,130},{1237,128},{1233,130},{1232,134},{1225,140},{1224,140},{1226,132},{1224,135},{1218,140},{1213,136},{1210,138},{1209,137},{1209,139},{1207,139},{1207,138},{1206,142},{1210,145},{1209,147},{1206,149},{1205,144},{1202,147},{1203,148},{1201,148},{1198,163},{1199,162},{1202,160},{1204,162},{1203,166},{1205,174},{1203,177},{1206,185},{1208,186},{1212,186},{1219,183},{1223,184},{1221,178},{1222,174},{1225,171},{1225,169},{1222,163},{1221,161},{1221,163},{1216,159},{1216,157},{1214,153},{1217,147},{1217,142},{1219,140},{1222,139},{1223,140},{1222,141},{1222,142},{1223,142},{1223,141},{1225,143},{1256,102},{1256,105},{1255,104},{1255,105},{1252,104},{1252,105},{1234,104},{1234,105},{1227,104},{1227,105},{1247,105},{1193,107},{1200,105},{1200,106},{1198,104},{1197,105},{1198,107},{1245,107},{1245,106},{1244,106},{1244,107},{1243,106},{1243,107},{1227,107},{1225,104},{1226,107},{1199,106},{1199,107},{1202,107},{1203,107},{1203,106},{1196,109},{1196,107},{1197,107},{1211,108},{1208,107},{1209,107},{1245,108},{1246,108},{1196,108},{1210,108},{1193,109},{1211,109},{1212,109},{1210,109},{1197,109},{1197,110},{1196,110},{1207,110},{1212,110},{1256,110},{1257,110},{1193,110},{1197,111},{1250,104},{1250,100},{1248,102},{1248,108},{1246,110},{1245,109},{1244,109},{1243,116},{1245,113},{1245,115},{1246,113},{1250,114},{1250,107},{1253,104},{1208,110},{1210,110},{1209,110},{1244,110},{1193,111},{1256,111},{1194,111},{1196,111},{1237,111},{1196,113},{1195,109},{1193,103},{1192,100},{1187,99},{1188,97},{1185,93},{1176,90},{1181,93},{1188,100},{1193,105},{1192,108},{1192,110},{1195,107},{1195,114},{1194,112},{1193,112},{1196,112},{1197,113},{1197,112},{1194,113},{1193,113},{1197,114},{1194,114},{1197,115},{1196,114},{1239,112},{1233,104},{1231,96},{1233,93},{1230,90},{1224,98},{1229,101},{1228,105},{1230,109},{1235,109},{1238,112},{1231,111},{1232,112},{1232,111},{1210,111},{1209,112},{1210,112},{1234,100},{1241,113},{1240,104},{1236,101},{1233,94},{1192,111},{1195,112},{1211,112},{1256,112},{1256,113},{1251,113},{1237,112},{1237,113},{1231,112},{1231,113},{1232,113},{1209,113},{1207,113},{1239,113},{1239,114},{1207,114},{1241,115},{1199,115},{1208,115},{1232,115},{1219,115},{1201,114},{1220,114},{1233,114},{1233,115},{1202,114},{1208,114},{1232,114},{1209,114},{1198,115},{1198,114},{1202,115},{1229,115},{1198,116},{1244,117},{1245,117},{1246,115},{1244,115},{1226,115},{1229,114},{1228,110},{1227,108},{1220,104},{1221,117},{1218,118}}}, + {"Indian/Mauritius",15,{{595,-168},{596,-168},{596,-167},{573,-204},{635,-197},{633,-197},{576,-200},{578,-202},{577,-204},{573,-205},{577,-200},{566,-104},{566,-105},{565,-103},{565,-104}}}, + {"America/Aruba",4,{{-700,126},{-699,125},{-699,124},{-701,126}}}, + {"Australia/Brisbane",414,{{1481,-200},{1481,-199},{1482,-200},{1476,-197},{1485,-201},{1483,-200},{1485,-200},{1486,-200},{1484,-200},{1488,-202},{1486,-202},{1486,-201},{1490,-202},{1489,-202},{1489,-201},{1490,-201},{1475,-197},{1476,-196},{1475,-195},{1428,-99},{1468,-192},{1468,-191},{1469,-191},{1469,-192},{1466,-190},{1465,-188},{1465,-189},{1465,-187},{1465,-186},{1465,-185},{1466,-187},{1466,-188},{1467,-188},{1462,-184},{1461,-184},{1461,-182},{1463,-182},{1463,-185},{1462,-185},{1462,-182},{1461,-180},{1462,-180},{1461,-179},{1462,-179},{1460,-172},{1394,-171},{1396,-171},{1409,-171},{1427,-107},{1426,-107},{1426,-106},{1427,-106},{1422,-106},{1423,-105},{1424,-104},{1422,-105},{1423,-106},{1421,-106},{1425,-102},{1422,-101},{1421,-102},{1421,-101},{1425,-103},{1422,-102},{1422,-103},{1423,-103},{1423,-101},{1423,-102},{1429,-100},{1429,-101},{1428,-100},{1435,-100},{1436,-100},{1438,-100},{1422,-100},{1422,-99},{1441,-99},{1440,-99},{1429,-98},{1429,-99},{1426,-98},{1434,-97},{1434,-98},{1438,-96},{1423,-96},{1416,-95},{1425,-94},{1428,-94},{1427,-94},{1426,-94},{1422,-92},{1423,-92},{1423,-93},{1421,-93},{1421,-92},{1420,-92},{1421,-104},{1392,-170},{1393,-171},{1391,-170},{1395,-170},{1393,-170},{1460,-169},{1391,-169},{1390,-169},{1391,-168},{1398,-165},{1397,-165},{1393,-163},{1455,-163},{1454,-151},{1455,-149},{1392,-167},{1398,-167},{1395,-167},{1394,-167},{1399,-167},{1394,-166},{1393,-167},{1392,-166},{1393,-165},{1396,-164},{1455,-147},{1454,-147},{1455,-146},{1453,-147},{1453,-146},{1449,-146},{1450,-145},{1448,-145},{1448,-144},{1443,-142},{1442,-142},{1442,-141},{1449,-145},{1445,-141},{1443,-141},{1417,-134},{1416,-134},{1436,-132},{1434,-128},{1434,-126},{1435,-126},{1434,-123},{1431,-122},{1433,-120},{1421,-110},{1427,-110},{1427,-109},{1426,-109},{1424,-108},{1424,-109},{1422,-107},{1422,-108},{1426,-108},{1424,-107},{1423,-107},{1421,-107},{1534,-278},{1534,-279},{1534,-277},{1533,-275},{1534,-275},{1533,-276},{1534,-276},{1533,-277},{1532,-274},{1531,-269},{1531,-268},{1532,-271},{1531,-270},{1533,-274},{1532,-273},{1533,-273},{1534,-273},{1534,-272},{1535,-270},{1534,-274},{1531,-258},{1530,-259},{1529,-256},{1530,-253},{1529,-253},{1529,-255},{1530,-255},{1530,-256},{1524,-247},{1524,-248},{1522,-247},{1522,-246},{1515,-241},{1532,-250},{1531,-248},{1533,-247},{1534,-250},{1530,-258},{1530,-252},{1535,-274},{1535,-277},{1516,-240},{1512,-238},{1512,-239},{1513,-239},{1509,-236},{1509,-237},{1510,-236},{1517,-235},{1507,-236},{1507,-235},{1508,-236},{1509,-235},{1508,-235},{1514,-239},{1513,-238},{1512,-234},{1511,-234},{1517,-233},{1510,-232},{1511,-232},{1509,-231},{1509,-232},{1500,-226},{1506,-225},{1497,-225},{1500,-225},{1498,-224},{1499,-225},{1499,-223},{1496,-221},{1507,-221},{1500,-221},{1499,-222},{1504,-223},{1505,-222},{1505,-223},{1507,-220},{1496,-219},{1497,-219},{1501,-219},{1495,-218},{1495,-207},{1506,-223},{1505,-224},{1503,-223},{1503,-222},{1499,-221},{1497,-224},{1503,-224},{1512,-237},{1510,-235},{1512,-235},{1511,-235},{1504,-220},{1496,-220},{1498,-220},{1499,-220},{1501,-220},{1502,-220},{1503,-218},{1503,-217},{1504,-217},{1497,-217},{1498,-218},{1497,-220},{1495,-216},{1498,-217},{1498,-216},{1503,-215},{1502,-215},{1499,-215},{1497,-215},{1497,-214},{1498,-214},{1497,-213},{1499,-210},{1498,-210},{1502,-217},{1502,-216},{1494,-209},{1495,-209},{1496,-209},{1489,-209},{1489,-208},{1492,-208},{1493,-208},{1492,-207},{1491,-207},{1491,-206},{1494,-208},{1496,-208},{1489,-206},{1491,-205},{1487,-205},{1487,-204},{1491,-204},{1490,-205},{1488,-203},{1489,-203},{1489,-204},{1488,-204},{1491,-203},{1490,-204},{1517,-240},{1517,-241},{1514,-240},{1514,-241},{1515,-240},{1490,-203},{1506,-227},{1508,-225},{1507,-226},{1508,-233},{1506,-235},{1504,-233},{1518,-240},{1525,-248},{1526,-252},{1528,-255},{1530,-254},{1529,-257},{1530,-260},{1532,-259},{1530,-264},{1532,-268},{1530,-273},{1533,-279},{1536,-282},{1531,-284},{1525,-283},{1520,-285},{1520,-289},{1516,-289},{1514,-292},{1510,-287},{1503,-285},{1495,-286},{1490,-290},{1410,-290},{1410,-260},{1380,-260},{1380,-165},{1392,-173},{1400,-177},{1408,-175},{1413,-165},{1416,-152},{1417,-153},{1417,-152},{1416,-142},{1415,-139},{1417,-135},{1418,-134},{1417,-133},{1416,-130},{1418,-127},{1419,-129},{1420,-127},{1418,-126},{1420,-126},{1417,-124},{1416,-126},{1419,-120},{1419,-122},{1419,-123},{1420,-120},{1420,-121},{1421,-120},{1421,-117},{1425,-108},{1425,-110},{1428,-111},{1429,-118},{1432,-120},{1431,-123},{1434,-129},{1435,-128},{1435,-137},{1438,-144},{1439,-145},{1445,-142},{1447,-146},{1454,-150},{1452,-155},{1455,-161},{1454,-164},{1458,-170},{1459,-172},{1461,-177},{1460,-182},{1463,-189},{1468,-193},{1470,-192},{1471,-194},{1474,-194},{1474,-193},{1477,-198},{1478,-197},{1479,-199},{1483,-202},{1489,-205},{1487,-207},{1492,-211},{1491,-211},{1492,-213},{1493,-213},{1493,-215},{1495,-215},{1494,-218},{1496,-223},{1495,-223},{1496,-225},{1496,-226},{1500,-227},{1501,-227}}}, + {"Asia/Tokyo",694,{{1347,339},{1317,339},{1322,339},{1238,240},{1238,241},{1239,242},{1415,242},{1415,243},{1540,243},{1240,242},{1237,243},{1237,244},{1422,266},{1421,266},{1230,244},{1230,245},{1312,245},{1247,247},{1247,246},{1238,245},{1241,243},{1240,243},{1242,243},{1241,244},{1243,246},{1239,243},{1238,244},{1239,244},{1253,247},{1252,247},{1252,249},{1253,249},{1413,254},{1413,255},{1413,248},{1255,247},{1253,248},{1252,248},{1251,248},{1235,258},{1312,258},{1312,259},{1313,259},{1313,258},{1246,259},{1237,259},{1313,260},{1267,264},{1268,264},{1268,263},{1269,263},{1269,264},{1272,263},{1271,264},{1272,264},{1280,264},{1280,263},{1272,262},{1273,262},{1279,262},{1279,263},{1280,262},{1274,262},{1275,262},{1422,265},{1421,265},{1280,269},{1279,269},{1280,270},{1279,270},{1422,267},{1421,267},{1272,266},{1278,267},{1280,267},{1279,266},{1278,266},{1280,266},{1274,261},{1282,279},{1293,280},{1292,280},{1300,283},{1299,283},{1300,284},{1292,283},{1291,280},{1292,281},{1283,267},{1278,264},{1277,261},{1277,264},{1279,267},{1281,267},{1283,269},{1422,271},{1422,272},{1287,274},{1286,273},{1285,274},{1422,275},{1422,276},{1421,277},{1290,278},{1289,277},{1289,279},{1293,281},{1292,282},{1294,282},{1294,281},{1291,282},{1297,285},{1290,288},{1292,291},{1292,292},{1293,292},{1296,294},{1296,295},{1297,296},{1297,297},{1295,297},{1299,298},{1298,298},{1298,299},{1299,299},{1296,299},{1295,299},{1299,300},{1300,300},{1305,302},{1304,304},{1307,304},{1306,303},{1302,304},{1302,305},{1303,304},{1403,305},{1284,320},{1309,303},{1309,305},{1311,308},{1310,304},{1308,307},{1309,308},{1309,307},{1299,308},{1300,308},{1303,308},{1304,308},{1422,270},{1280,271},{1284,270},{1284,271},{1318,327},{1298,326},{1298,327},{1398,324},{1398,325},{1305,325},{1289,326},{1298,325},{1302,324},{1304,324},{1303,324},{1303,323},{1304,323},{1301,323},{1302,323},{1302,322},{1304,325},{1301,325},{1286,327},{1286,326},{1288,326},{1305,326},{1317,326},{1304,326},{1289,327},{1287,328},{1289,328},{1288,328},{1290,328},{1289,329},{1290,329},{1319,327},{1326,328},{1325,328},{1326,327},{1325,327},{1300,327},{1300,328},{1290,327},{1319,328},{1296,329},{1290,330},{1398,330},{1398,331},{1398,332},{1399,331},{1397,331},{1290,332},{1291,332},{1291,333},{1292,333},{1320,333},{1319,333},{1324,334},{1323,334},{1297,334},{1324,329},{1325,329},{1302,329},{1302,330},{1321,329},{1321,330},{1296,330},{1319,330},{1320,330},{1292,330},{1293,330},{1294,330},{1325,332},{1324,332},{1291,328},{1320,331},{1296,331},{1323,331},{1324,331},{1295,331},{1323,332},{1320,332},{1296,332},{1370,345},{1370,346},{1294,332},{1294,333},{1296,334},{1295,333},{1295,312},{1307,313},{1302,313},{1302,314},{1314,315},{1297,316},{1297,317},{1298,318},{1315,318},{1301,322},{1302,321},{1301,321},{1299,318},{1298,319},{1299,319},{1300,322},{1300,324},{1300,325},{1302,325},{1369,378},{1369,379},{1382,378},{1383,380},{1382,381},{1385,383},{1385,379},{1415,382},{1415,383},{1416,383},{1414,383},{1411,383},{1412,384},{1412,383},{1415,385},{1415,384},{1392,384},{1392,385},{1393,385},{1416,388},{1416,389},{1396,392},{1395,392},{1390,410},{1398,413},{1398,414},{1395,421},{1394,422},{1396,422},{1454,433},{1455,433},{1456,432},{1449,429},{1449,430},{1451,430},{1451,431},{1452,436},{1453,436},{1412,451},{1411,452},{1412,453},{1413,452},{1413,444},{1414,444},{1410,453},{1410,454},{1410,455},{1411,454},{1394,415},{1393,415},{1425,450},{1434,443},{1443,441},{1444,440},{1448,439},{1453,443},{1451,438},{1454,436},{1453,433},{1452,433},{1455,432},{1457,434},{1458,434},{1450,430},{1449,431},{1448,429},{1443,430},{1439,429},{1434,424},{1432,419},{1418,426},{1414,426},{1410,423},{1407,426},{1405,426},{1403,422},{1412,418},{1406,418},{1404,415},{1401,414},{1401,419},{1398,423},{1398,426},{1405,430},{1403,433},{1412,431},{1414,433},{1413,437},{1416,439},{1418,446},{1416,452},{1416,455},{1420,455},{1311,348},{1312,348},{1318,348},{1343,347},{1353,347},{1397,355},{1398,355},{1392,350},{1368,351},{1368,350},{1369,351},{1369,350},{1398,356},{1401,356},{1331,356},{1354,357},{1331,360},{1330,360},{1333,362},{1332,362},{1332,363},{1333,363},{1369,371},{1369,372},{1371,372},{1371,371},{1319,372},{1331,361},{1332,361},{1354,345},{1354,346},{1330,361},{1313,344},{1341,344},{1338,344},{1393,345},{1314,345},{1335,344},{1342,345},{1341,345},{1335,345},{1340,344},{1340,345},{1369,345},{1343,344},{1344,346},{1313,345},{1367,345},{1342,346},{1345,347},{1345,346},{1346,346},{1346,347},{1394,347},{1394,348},{1352,347},{1349,347},{1342,347},{1348,347},{1358,334},{1358,335},{1359,335},{1295,334},{1295,335},{1296,335},{1294,334},{1298,336},{1297,336},{1299,335},{1299,336},{1301,336},{1300,336},{1296,337},{1303,336},{1345,336},{1303,337},{1302,337},{1325,337},{1317,337},{1316,337},{1300,335},{1297,335},{1298,335},{1298,334},{1346,341},{1347,338},{1343,336},{1342,332},{1337,335},{1333,334},{1330,329},{1330,327},{1327,329},{1324,330},{1325,331},{1326,332},{1324,333},{1324,335},{1327,337},{1329,341},{1331,339},{1335,340},{1337,341},{1336,343},{1346,342},{1307,339},{1310,340},{1311,336},{1317,335},{1315,333},{1318,331},{1319,329},{1313,314},{1311,315},{1310,313},{1311,313},{1307,310},{1308,313},{1306,316},{1308,317},{1306,317},{1305,315},{1306,312},{1301,314},{1303,315},{1305,323},{1307,326},{1306,328},{1304,331},{1302,332},{1301,328},{1303,329},{1304,327},{1302,326},{1302,328},{1299,327},{1297,326},{1297,331},{1298,329},{1299,328},{1299,333},{1300,334},{1304,336},{1305,339},{1308,341},{1294,343},{1294,344},{1292,342},{1292,343},{1293,343},{1292,341},{1301,342},{1334,343},{1335,343},{1309,343},{1309,344},{1295,347},{1295,346},{1293,346},{1335,341},{1363,342},{1348,342},{1330,341},{1328,341},{1332,341},{1324,341},{1324,342},{1328,342},{1326,342},{1333,342},{1332,344},{1333,344},{1336,344},{1331,344},{1337,343},{1337,344},{1333,343},{1331,341},{1330,342},{1329,342},{1323,342},{1324,343},{1325,343},{1325,341},{1327,342},{1331,342},{1391,342},{1392,342},{1332,342},{1332,343},{1323,343},{1331,343},{1329,343},{1324,340},{1317,340},{1318,340},{1330,343},{1328,343},{1393,344},{1393,343},{1392,343},{1350,343},{1351,343},{1350,346},{1347,342},{1348,344},{1322,338},{1322,337},{1321,337},{1297,337},{1297,339},{1298,338},{1320,338},{1304,338},{1324,338},{1323,338},{1396,339},{1396,338},{1300,339},{1304,339},{1325,339},{1326,339},{1308,340},{1351,340},{1325,340},{1334,340},{1323,340},{1327,339},{1327,340},{1309,340},{1324,339},{1323,339},{1319,340},{1318,339},{1316,340},{1326,340},{1348,338},{1348,339},{1325,338},{1321,338},{1321,339},{1320,339},{1322,340},{1395,340},{1395,341},{1396,341},{1325,342},{1326,341},{1344,356},{1352,358},{1353,354},{1355,356},{1357,355},{1360,358},{1360,357},{1361,357},{1360,360},{1367,367},{1368,374},{1374,375},{1370,369},{1372,367},{1386,374},{1388,378},{1394,381},{1398,389},{1401,397},{1400,399},{1397,399},{1400,402},{1399,406},{1403,408},{1403,413},{1406,412},{1407,408},{1409,410},{1411,409},{1412,413},{1408,411},{1409,415},{1413,414},{1415,414},{1415,406},{1418,402},{1420,396},{1421,396},{1420,395},{1421,395},{1419,393},{1420,393},{1419,391},{1416,390},{1417,389},{1415,387},{1411,384},{1409,380},{1410,370},{1408,369},{1406,363},{1409,357},{1405,356},{1404,352},{1399,349},{1398,350},{1399,350},{1398,353},{1398,357},{1396,355},{1397,351},{1395,353},{1392,352},{1391,349},{1388,346},{1388,350},{1389,350},{1388,351},{1384,349},{1382,346},{1376,347},{1374,348},{1370,348},{1370,349},{1369,347},{1367,351},{1365,346},{1369,344},{1369,343},{1364,342},{1351,339},{1352,341},{1355,346},{1347,348},{1339,344},{1324,344},{1322,342},{1317,341},{1312,339},{1310,341},{1309,339},{1310,344},{1314,344},{1326,353},{1326,354},{1334,355}}}, + {"Pacific/Kiritimati",18,{{-1518,-114},{-1502,-100},{-1502,-99},{-1558,-56},{-1559,-56},{-1550,-40},{-1549,-40},{-1594,38},{-1593,38},{-1594,39},{-1593,39},{-1608,47},{-1607,47},{-1575,19},{-1575,20},{-1572,17},{-1574,18},{-1574,20}}}, + {"Asia/Qyzylorda",141,{{593,453},{594,452},{589,454},{589,455},{593,456},{592,453},{592,455},{593,455},{592,454},{678,523},{677,522},{680,520},{678,515},{680,510},{677,508},{681,504},{676,502},{661,490},{655,488},{648,489},{647,487},{644,487},{646,485},{642,485},{643,483},{640,482},{638,485},{631,487},{631,489},{628,488},{623,492},{625,493},{623,495},{625,495},{626,499},{629,500},{624,507},{622,507},{624,509},{622,511},{604,517},{605,518},{600,519},{600,520},{611,523},{607,527},{610,530},{621,530},{612,533},{613,535},{616,535},{609,536},{612,538},{610,540},{613,539},{614,541},{616,540},{624,541},{626,539},{632,542},{652,543},{652,545},{659,547},{661,546},{662,543},{661,542},{664,541},{660,540},{662,538},{661,535},{663,535},{663,532},{664,532},{661,531},{664,529},{661,528},{660,524},{666,524},{665,523},{673,522},{673,524},{675,524},{660,429},{658,429},{657,433},{651,438},{645,436},{634,437},{620,435},{607,446},{610,448},{606,458},{608,460},{608,461},{612,463},{614,466},{609,464},{608,467},{606,468},{608,466},{604,465},{603,467},{600,464},{607,464},{608,462},{598,461},{598,463},{595,463},{597,460},{595,458},{592,458},{594,460},{588,459},{586,456},{586,458},{601,469},{604,469},{604,473},{610,472},{614,478},{621,478},{629,471},{627,470},{631,471},{651,465},{656,462},{671,462},{674,458},{672,453},{675,452},{675,444},{681,440},{677,434},{678,432},{662,424},{661,424},{661,430},{600,457},{602,457},{597,456},{598,457}}}, + {"Asia/Aqtobe",62,{{545,505},{547,506},{547,509},{551,509},{557,506},{561,507},{562,509},{565,511},{567,510},{568,511},{572,511},{575,509},{577,509},{578,511},{583,512},{586,508},{595,505},{598,506},{601,509},{605,507},{614,508},{616,512},{619,513},{624,509},{622,507},{624,507},{629,500},{626,499},{625,495},{623,495},{625,493},{623,492},{628,488},{631,489},{631,487},{638,485},{643,479},{629,471},{619,478},{614,478},{610,472},{604,473},{604,469},{601,469},{590,460},{587,459},{586,456},{568,452},{566,460},{563,465},{554,467},{550,472},{551,479},{549,481},{549,487},{540,488},{540,492},{536,492},{536,495},{545,496},{546,500},{544,503}}}, + {"America/Eirunepe",17,{{-676,-95},{-704,-82},{-726,-76},{-738,-71},{-736,-68},{-731,-65},{-732,-60},{-730,-57},{-729,-52},{-719,-45},{-709,-44},{-706,-41},{-703,-41},{-702,-44},{-701,-43},{-700,-44},{-699,-42}}}, + {"Europe/Isle_of_Man",5,{{-48,541},{-48,540},{-44,543},{-44,542},{-45,544}}}, + {"America/Blanc-Sablon",90,{{-579,513},{-599,503},{-598,503},{-595,505},{-577,513},{-577,514},{-594,505},{-594,506},{-578,513},{-578,514},{-596,503},{-597,503},{-602,502},{-602,503},{-598,504},{-616,502},{-613,502},{-611,502},{-609,502},{-608,502},{-603,502},{-600,502},{-605,502},{-601,502},{-604,502},{-592,506},{-591,506},{-593,505},{-593,506},{-588,510},{-596,505},{-603,503},{-609,503},{-610,503},{-610,502},{-612,502},{-617,501},{-618,501},{-612,503},{-613,504},{-603,504},{-588,508},{-589,508},{-589,509},{-589,510},{-586,510},{-587,510},{-586,511},{-588,511},{-587,511},{-585,511},{-584,512},{-584,511},{-585,512},{-586,512},{-571,514},{-572,514},{-579,514},{-582,512},{-582,513},{-576,514},{-577,515},{-573,514},{-573,515},{-571,516},{-577,516},{-584,513},{-583,512},{-583,513},{-585,513},{-591,507},{-580,513},{-583,514},{-587,512},{-584,515},{-596,507},{-596,506},{-593,507},{-591,508},{-592,507},{-587,514},{-590,510},{-590,507},{-590,509},{-594,507},{-594,509},{-591,510},{-592,512},{-589,512},{-589,514}}}, + {"America/Montevideo",42,{{-549,-350},{-550,-350},{-559,-350},{-559,-349},{-584,-340},{-575,-345},{-576,-345},{-564,-348},{-582,-331},{-581,-330},{-581,-329},{-580,-329},{-581,-331},{-560,-349},{-563,-349},{-572,-345},{-579,-345},{-584,-339},{-584,-332},{-582,-319},{-580,-317},{-581,-315},{-578,-309},{-579,-305},{-576,-302},{-574,-303},{-571,-301},{-568,-301},{-560,-308},{-560,-311},{-556,-309},{-552,-313},{-546,-314},{-537,-321},{-536,-324},{-531,-327},{-535,-332},{-535,-337},{-534,-338},{-535,-341},{-541,-347},{-555,-347}}}, + {"Asia/Tashkent",54,{{687,401},{690,401},{688,401},{689,399},{688,400},{685,395},{677,397},{674,395},{673,397},{675,399},{669,401},{669,405},{666,405},{668,408},{666,411},{668,412},{680,412},{686,409},{692,414},{700,418},{704,421},{706,420},{711,423},{713,422},{702,415},{707,415},{708,412},{714,411},{717,416},{719,413},{719,412},{722,412},{722,410},{731,408},{726,405},{724,406},{724,404},{722,405},{717,401},{712,403},{706,402},{703,405},{708,407},{704,410},{697,406},{694,408},{692,405},{693,402},{685,401},{711,400},{710,400},{710,402},{712,399},{711,399}}}, + {"America/Argentina/La_Rioja",21,{{-680,-300},{-683,-297},{-690,-296},{-689,-289},{-696,-284},{-691,-278},{-684,-277},{-684,-280},{-679,-281},{-678,-284},{-675,-282},{-665,-284},{-664,-289},{-658,-292},{-651,-301},{-654,-301},{-658,-311},{-658,-319},{-667,-319},{-670,-315},{-672,-307}}}, + {"Pacific/Kosrae",3,{{1630,53},{1629,53},{1630,54}}}, + {"America/Indiana/Winamac",4,{{-865,412},{-865,409},{-869,409},{-869,412}}}, + {"Africa/Mogadishu",63,{{423,-7},{423,-6},{425,-4},{426,-4},{419,-12},{419,-11},{420,-11},{420,-10},{421,-10},{421,-9},{422,-8},{423,-8},{435,114},{433,114},{434,115},{435,115},{429,0},{421,-8},{420,-7},{420,-9},{419,-9},{418,-11},{417,-12},{418,-12},{416,-17},{410,-8},{410,28},{421,42},{428,43},{431,46},{438,49},{450,49},{480,80},{470,80},{440,90},{433,96},{427,106},{433,115},{440,107},{446,104},{450,104},{458,109},{464,107},{474,112},{480,111},{485,113},{494,113},{503,116},{508,120},{513,118},{511,113},{512,106},{510,104},{512,104},{514,104},{509,103},{508,94},{501,82},{498,80},{490,60},{480,45},{460,24},{446,16}}}, + {"Asia/Phnom_Penh",65,{{1033,105},{1033,106},{1034,106},{1035,106},{1029,99},{1030,99},{1031,103},{1030,104},{1038,104},{1043,104},{1036,105},{1037,105},{1038,105},{1035,105},{1033,108},{1033,107},{1032,107},{1030,112},{1030,114},{1030,113},{1031,110},{1030,110},{1031,109},{1032,108},{1058,116},{1059,113},{1062,111},{1062,108},{1059,109},{1058,110},{1054,108},{1051,110},{1051,107},{1045,104},{1039,107},{1037,109},{1036,112},{1034,109},{1031,115},{1027,122},{1028,125},{1025,127},{1023,136},{1026,136},{1030,142},{1036,144},{1048,144},{1051,142},{1052,143},{1054,141},{1056,142},{1061,139},{1062,141},{1060,144},{1065,146},{1070,143},{1076,147},{1073,141},{1076,135},{1075,123},{1064,120},{1064,117},{1060,118},{1031,114},{1030,115}}}, + {"Africa/Banjul",17,{{-139,135},{-138,134},{-142,132},{-151,136},{-153,134},{-158,133},{-158,132},{-168,131},{-168,133},{-167,135},{-165,133},{-156,134},{-164,133},{-166,136},{-155,136},{-151,138},{-143,135}}}, + {"Pacific/Efate",119,{{1693,-190},{1690,-189},{1690,-186},{1693,-188},{1699,-202},{1698,-202},{1698,-201},{1702,-195},{1695,-195},{1694,-196},{1693,-193},{1694,-193},{1696,-193},{1696,-192},{1682,-176},{1681,-176},{1683,-178},{1684,-175},{1685,-175},{1683,-174},{1684,-174},{1683,-175},{1684,-178},{1682,-177},{1686,-177},{1682,-175},{1684,-173},{1684,-172},{1684,-171},{1684,-170},{1683,-171},{1686,-170},{1685,-169},{1686,-169},{1682,-164},{1680,-163},{1679,-162},{1682,-161},{1683,-163},{1678,-165},{1682,-165},{1683,-164},{1672,-157},{1673,-157},{1674,-160},{1673,-159},{1683,-168},{1682,-168},{1682,-166},{1685,-168},{1675,-166},{1678,-166},{1683,-165},{1684,-165},{1672,-159},{1681,-150},{1682,-152},{1682,-154},{1681,-149},{1672,-153},{1672,-154},{1681,-144},{1680,-144},{1675,-143},{1674,-143},{1674,-142},{1676,-142},{1677,-138},{1677,-137},{1676,-137},{1677,-136},{1675,-136},{1673,-135},{1674,-135},{1674,-136},{1667,-134},{1667,-135},{1666,-133},{1666,-134},{1676,-138},{1676,-139},{1675,-137},{1675,-139},{1674,-138},{1677,-133},{1676,-133},{1676,-132},{1677,-132},{1666,-132},{1666,-131},{1665,-132},{1671,-151},{1671,-150},{1671,-149},{1672,-150},{1672,-158},{1671,-157},{1672,-156},{1669,-156},{1670,-156},{1682,-160},{1681,-157},{1682,-155},{1683,-159},{1678,-155},{1678,-153},{1680,-153},{1679,-155},{1672,-155},{1673,-154},{1671,-156},{1673,-155},{1673,-156},{1668,-150},{1669,-153},{1670,-149},{1668,-157},{1665,-148},{1666,-146}}}, + {"America/Creston",7,{{-1157,490},{-1170,491},{-1167,493},{-1169,498},{-1166,497},{-1167,495},{-1163,495}}}, + {"Europe/Brussels",25,{{30,508},{26,508},{25,511},{32,513},{39,512},{45,515},{50,515},{52,513},{58,512},{57,508},{63,506},{62,505},{64,503},{60,502},{57,499},{59,496},{55,495},{49,498},{49,502},{42,500},{42,503},{37,503},{36,505},{33,505},{33,507}}}, + {"Asia/Gaza",4,{{345,316},{345,315},{343,312},{342,313}}}, + {"America/Managua",42,{{-830,123},{-831,121},{-831,122},{-830,122},{-850,110},{-856,112},{-858,111},{-877,130},{-876,131},{-874,129},{-870,130},{-869,133},{-867,133},{-868,138},{-863,138},{-860,141},{-857,138},{-858,140},{-852,143},{-852,146},{-849,148},{-845,146},{-835,150},{-832,150},{-833,148},{-832,143},{-836,134},{-835,124},{-837,122},{-836,116},{-839,114},{-837,108},{-842,108},{-847,111},{-826,143},{-828,143},{-828,144},{-827,144},{-829,144},{-827,145},{-827,146},{-826,145}}}, + {"Africa/Niamey",52,{{46,137},{41,135},{41,130},{36,125},{36,117},{28,124},{24,122},{24,119},{21,124},{23,124},{21,127},{16,126},{10,131},{10,134},{13,134},{6,137},{4,140},{2,145},{2,150},{10,150},{13,153},{35,153},{39,157},{41,169},{42,170},{42,191},{58,194},{74,208},{120,235},{135,232},{142,226},{150,230},{152,215},{160,203},{157,198},{155,169},{144,157},{137,146},{135,145},{136,137},{129,135},{125,131},{115,134},{107,134},{101,132},{97,128},{90,128},{78,133},{69,130},{64,136},{55,139},{53,137}}}, + {"Europe/Monaco",3,{{74,437},{74,438},{75,438}}}, + {"Africa/Ouagadougou",51,{{-7,110},{-28,110},{-29,106},{-28,104},{-28,94},{-32,99},{-39,99},{-43,96},{-45,97},{-47,97},{-52,103},{-55,104},{-55,111},{-52,114},{-54,118},{-46,121},{-44,123},{-45,127},{-42,128},{-44,131},{-40,135},{-34,132},{-32,133},{-33,137},{-29,137},{-28,141},{-25,143},{-21,142},{-20,145},{-17,145},{-7,151},{-3,151},{2,150},{2,145},{4,140},{6,137},{13,134},{10,134},{10,131},{16,126},{20,127},{22,126},{23,124},{21,124},{24,119},{20,114},{14,114},{11,113},{11,110},{5,109},{-3,112}}}, + {"Atlantic/Bermuda",5,{{-647,324},{-647,323},{-648,323},{-649,322},{-649,323}}}, + {"America/Indiana/Knox",4,{{-865,414},{-865,412},{-869,412},{-867,414}}}, + {"America/El_Salvador",14,{{-879,134},{-878,134},{-877,132},{-878,132},{-877,133},{-878,133},{-896,135},{-901,138},{-894,144},{-885,139},{-881,140},{-877,138},{-879,131},{-885,132}}}, + {"Pacific/Easter",4,{{-1093,-271},{-1092,-271},{-1095,-272},{-1094,-271}}}, + {"Atlantic/Canary",35,{{-180,278},{-180,276},{-182,277},{-182,278},{-155,281},{-154,282},{-154,279},{-157,278},{-158,280},{-173,280},{-173,282},{-171,281},{-163,286},{-161,285},{-167,280},{-169,283},{-180,288},{-177,287},{-178,284},{-180,287},{-137,291},{-135,292},{-135,293},{-135,294},{-138,285},{-139,282},{-145,281},{-142,282},{-140,287},{-138,287},{-138,288},{-134,292},{-135,290},{-139,289},{-138,291}}}, + {"Asia/Bangkok",256,{{992,65},{992,66},{993,66},{999,67},{998,67},{994,66},{1021,63},{1020,63},{995,70},{998,68},{995,68},{996,68},{997,68},{1014,69},{997,69},{997,70},{1001,65},{993,65},{995,66},{996,66},{996,67},{997,65},{998,66},{983,75},{984,76},{991,72},{996,71},{992,74},{991,75},{994,72},{994,73},{995,73},{996,73},{993,73},{992,73},{993,74},{995,74},{991,76},{992,76},{985,80},{985,81},{987,81},{976,86},{976,85},{986,82},{986,83},{985,82},{985,83},{986,81},{976,87},{978,88},{978,90},{978,91},{983,89},{983,90},{982,90},{983,92},{983,91},{993,92},{983,93},{988,77},{988,78},{984,77},{985,77},{985,78},{984,78},{995,108},{995,109},{991,77},{990,76},{985,79},{984,80},{991,79},{984,79},{990,79},{990,78},{989,78},{986,80},{986,79},{983,78},{983,79},{983,82},{984,81},{985,99},{998,101},{999,101},{987,101},{987,102},{993,102},{993,103},{993,104},{994,104},{1024,118},{1025,118},{1025,119},{1024,119},{1023,119},{1025,120},{1000,122},{1023,120},{1023,122},{1024,121},{1022,123},{1010,125},{996,111},{995,111},{1025,116},{1025,117},{1026,118},{1026,116},{1007,129},{1007,130},{1008,129},{1018,126},{1014,125},{1014,126},{1015,126},{1008,127},{1009,126},{1010,126},{1008,131},{1008,132},{1000,94},{993,93},{993,94},{979,94},{999,94},{997,94},{978,94},{978,95},{979,95},{1000,93},{999,93},{998,93},{1017,66},{1021,62},{1019,59},{1018,57},{1016,59},{1014,59},{1011,56},{1010,58},{1011,63},{1009,62},{1008,64},{1004,65},{1003,67},{1001,64},{998,71},{996,74},{993,77},{991,78},{990,77},{991,80},{988,80},{986,84},{982,86},{988,107},{997,118},{994,126},{991,131},{992,133},{991,139},{986,143},{982,151},{983,153},{986,154},{986,161},{988,161},{989,164},{987,163},{985,169},{978,177},{976,183},{975,183},{973,186},{978,186},{977,189},{980,198},{983,197},{989,197},{991,201},{995,201},{995,204},{997,203},{1000,205},{1001,203},{1003,204},{1006,202},{1004,198},{1005,195},{1013,196},{1012,194},{1014,190},{1011,184},{1012,181},{1010,176},{1012,175},{1021,182},{1027,178},{1030,180},{1033,184},{1040,183},{1048,174},{1048,165},{1056,157},{1055,153},{1056,150},{1055,146},{1051,142},{1048,144},{1036,144},{1030,142},{1026,136},{1023,136},{1025,127},{1028,124},{1027,122},{1029,118},{1029,116},{1026,122},{1026,120},{1018,127},{1010,135},{1003,135},{1000,133},{1001,130},{1000,127},{996,113},{992,105},{991,103},{992,102},{991,98},{992,93},{1000,86},{1002,84},{1005,73},{1010,69},{1015,69},{983,95},{984,95},{1000,96},{1001,95},{999,96},{997,95},{985,96},{997,96},{997,97},{1000,98},{1001,98},{1001,97},{1000,97},{984,97},{984,98},{985,98},{997,98}}}, + {"Asia/Vientiane",72,{{1063,145},{1060,144},{1062,141},{1061,139},{1052,143},{1055,146},{1056,150},{1055,153},{1056,157},{1048,165},{1048,174},{1040,183},{1033,184},{1030,180},{1027,178},{1021,182},{1012,175},{1010,176},{1012,181},{1011,184},{1014,190},{1012,194},{1013,196},{1005,195},{1004,198},{1006,202},{1003,204},{1002,202},{1001,204},{1003,207},{1006,209},{1005,209},{1007,213},{1012,216},{1013,212},{1018,211},{1018,218},{1015,222},{1017,225},{1021,224},{1027,217},{1028,218},{1030,216},{1028,213},{1032,209},{1037,207},{1041,210},{1046,207},{1044,204},{1046,204},{1050,200},{1047,196},{1040,197},{1041,195},{1039,193},{1051,187},{1052,183},{1055,182},{1058,177},{1066,170},{1067,165},{1068,165},{1070,163},{1075,161},{1072,157},{1077,153},{1075,150},{1076,149},{1075,145},{1073,146},{1069,143},{1065,146}}}, + {"Europe/Bucharest",42,{{296,449},{296,448},{295,448},{282,455},{287,452},{293,454},{297,453},{291,448},{286,443},{286,437},{270,442},{261,440},{256,436},{242,437},{229,439},{230,441},{225,445},{227,446},{224,447},{221,445},{214,448},{216,449},{214,450},{215,452},{208,455},{208,458},{203,461},{212,463},{220,475},{232,481},{239,479},{246,480},{249,477},{262,480},{263,482},{267,483},{270,481},{276,473},{281,470},{283,464},{281,462},{281,456}}}, + {"Africa/Lusaka",70,{{289,-159},{288,-165},{278,-170},{270,-180},{267,-181},{262,-179},{260,-180},{257,-178},{254,-179},{247,-175},{234,-176},{221,-165},{220,-162},{220,-130},{240,-130},{239,-128},{241,-124},{241,-109},{244,-111},{243,-114},{244,-115},{254,-112},{253,-116},{260,-119},{269,-120},{270,-116},{272,-116},{276,-123},{279,-122},{284,-125},{290,-134},{296,-132},{296,-134},{298,-135},{298,-122},{295,-122},{295,-125},{291,-124},{284,-118},{284,-115},{287,-107},{286,-102},{287,-98},{285,-94},{284,-93},{289,-88},{289,-85},{308,-82},{311,-86},{314,-86},{320,-91},{330,-94},{330,-96},{332,-96},{334,-99},{333,-101},{337,-106},{332,-109},{334,-112},{332,-114},{333,-121},{335,-124},{330,-127},{330,-132},{327,-136},{330,-140},{332,-140},{302,-150},{304,-156},{296,-156}}}, + {"Asia/Kathmandu",43,{{851,283},{856,283},{860,279},{862,282},{864,279},{867,281},{871,278},{882,279},{880,271},{882,268},{881,264},{873,264},{871,266},{867,264},{863,266},{859,266},{856,269},{852,268},{846,270},{846,273},{842,275},{839,274},{834,275},{833,273},{828,275},{827,277},{819,279},{801,289},{803,291},{804,298},{809,302},{812,300},{814,304},{816,304},{822,303},{822,301},{832,296},{835,292},{842,292},{841,289},{844,287},{849,286},{851,287}}}, + {"Africa/Harare",37,{{311,-223},{294,-222},{291,-220},{290,-218},{280,-216},{277,-211},{277,-205},{273,-205},{272,-201},{262,-195},{253,-178},{267,-181},{270,-180},{278,-170},{288,-165},{289,-159},{296,-156},{304,-156},{304,-160},{312,-160},{319,-164},{330,-167},{328,-169},{330,-173},{329,-180},{331,-184},{329,-185},{329,-188},{327,-189},{329,-191},{328,-195},{331,-198},{330,-200},{325,-206},{324,-211},{325,-213},{314,-224}}}, + {"America/Denver",97,{{-1101,358},{-1101,357},{-1102,357},{-1129,444},{-1131,448},{-1135,449},{-1139,457},{-1143,455},{-1146,456},{-1146,458},{-1144,459},{-1145,461},{-1143,466},{-1148,467},{-1153,473},{-1158,474},{-1156,475},{-1157,477},{-1160,480},{-1161,490},{-1040,490},{-1040,480},{-1038,478},{-1037,476},{-1035,475},{-1030,477},{-1025,475},{-1023,476},{-1021,467},{-1013,466},{-1013,464},{-1010,464},{-1013,459},{-1004,459},{-1003,457},{-1005,455},{-1003,454},{-1003,450},{-1005,448},{-1007,448},{-1004,444},{-1006,442},{-1010,442},{-1011,438},{-1012,438},{-1012,430},{-1009,430},{-1007,421},{-1008,417},{-1014,417},{-1012,410},{-1013,400},{-1020,400},{-1020,396},{-1014,396},{-1016,387},{-1015,377},{-1020,377},{-1020,370},{-1030,370},{-1031,320},{-1049,320},{-1049,307},{-1054,309},{-1065,318},{-1082,318},{-1082,313},{-1090,313},{-1090,352},{-1112,352},{-1113,358},{-1117,357},{-1119,364},{-1116,369},{-1114,370},{-1113,369},{-1112,369},{-1113,370},{-1141,370},{-1140,420},{-1110,420},{-1110,445},{-1114,448},{-1115,445},{-1123,446},{-1108,364},{-1110,363},{-1110,355},{-1103,355},{-1100,356},{-1101,360},{-1106,360},{-1103,364},{-1111,361},{-1112,362},{-1113,361},{-1111,360}}}, + {"America/Guadeloupe",20,{{-610,163},{-611,163},{-610,164},{-630,181},{-616,158},{-616,159},{-613,160},{-612,159},{-613,159},{-611,162},{-617,163},{-616,161},{-617,159},{-618,163},{-616,163},{-616,164},{-615,164},{-615,165},{-612,163},{-615,162}}}, + {"Africa/Lome",24,{{14,62},{11,62},{5,68},{7,73},{5,75},{6,82},{7,83},{4,87},{5,89},{6,94},{2,95},{4,96},{4,103},{-1,106},{0,111},{-1,111},{5,109},{9,110},{8,104},{14,100},{13,95},{16,90},{16,67},{18,63}}}, + {"Indian/Reunion",4,{{553,-209},{557,-209},{558,-213},{553,-213}}}, + {"Europe/Kiev",168,{{377,471},{323,465},{298,454},{298,455},{329,460},{328,460},{326,461},{331,460},{322,461},{321,462},{320,462},{350,462},{349,462},{350,463},{317,463},{319,462},{317,462},{316,463},{315,463},{315,464},{318,463},{317,464},{318,464},{390,479},{383,476},{382,473},{383,473},{382,472},{382,471},{381,470},{376,471},{373,469},{370,469},{371,470},{369,472},{372,475},{367,476},{366,478},{361,478},{360,481},{348,481},{349,475},{342,475},{343,473},{345,473},{346,470},{348,468},{346,467},{351,463},{346,462},{346,460},{344,460},{345,462},{343,462},{343,461},{342,463},{341,461},{336,462},{335,460},{332,461},{332,462},{320,465},{315,465},{315,466},{324,465},{320,466},{320,469},{319,466},{314,466},{315,467},{316,468},{316,469},{314,468},{308,465},{305,461},{302,459},{297,456},{299,457},{296,458},{297,452},{293,454},{287,452},{282,455},{285,455},{285,457},{290,460},{289,465},{292,466},{293,464},{294,465},{296,464},{301,464},{299,465},{300,468},{296,470},{296,474},{294,473},{291,475},{293,478},{292,480},{286,482},{285,481},{284,482},{276,485},{267,484},{268,483},{263,482},{262,480},{249,477},{246,480},{245,483},{241,484},{241,485},{239,485},{238,486},{229,489},{227,495},{237,504},{241,505},{240,508},{242,509},{237,513},{236,516},{242,517},{244,519},{272,518},{273,516},{277,516},{277,515},{283,517},{288,514},{292,516},{293,514},{302,515},{306,513},{307,513},{305,516},{309,521},{320,520},{324,521},{324,523},{329,522},{338,524},{345,518},{341,517},{343,515},{343,513},{351,512},{352,511},{354,511},{354,506},{356,504},{361,505},{366,502},{375,504},{380,499},{383,501},{398,496},{401,496},{402,492},{397,490},{401,489},{398,488},{397,486},{399,486},{399,483},{400,482},{397,478}}}, + {"Europe/Vienna",48,{{95,475},{100,476},{102,474},{102,473},{105,474},{104,476},{113,474},{123,477},{128,477},{130,475},{131,476},{129,477},{130,479},{128,481},{133,483},{135,486},{137,485},{138,488},{143,485},{147,486},{148,488},{150,488},{150,490},{161,487},{169,487},{168,484},{172,480},{170,479},{171,477},{164,477},{167,475},{164,474},{165,470},{160,468},{160,467},{150,467},{146,464},{124,467},{121,469},{122,471},{112,470},{110,468},{105,469},{104,470},{101,468},{96,471},{95,473},{97,474}}}, + {"America/Argentina/Cordoba",76,{{-629,-344},{-634,-344},{-634,-350},{-651,-350},{-651,-332},{-649,-326},{-649,-323},{-652,-323},{-653,-321},{-658,-319},{-658,-311},{-654,-301},{-649,-299},{-649,-296},{-652,-287},{-651,-284},{-652,-279},{-650,-278},{-651,-275},{-645,-267},{-645,-262},{-642,-256},{-634,-257},{-623,-244},{-623,-225},{-620,-230},{-610,-238},{-600,-240},{-591,-246},{-577,-253},{-576,-256},{-578,-257},{-578,-260},{-582,-262},{-582,-266},{-586,-271},{-586,-273},{-580,-273},{-569,-276},{-566,-274},{-564,-276},{-561,-273},{-557,-274},{-554,-270},{-548,-267},{-546,-256},{-544,-257},{-541,-255},{-541,-256},{-539,-256},{-536,-263},{-538,-271},{-542,-273},{-543,-274},{-548,-275},{-550,-279},{-558,-282},{-557,-284},{-559,-284},{-579,-305},{-578,-309},{-581,-315},{-580,-317},{-582,-319},{-581,-330},{-584,-331},{-585,-335},{-584,-340},{-596,-337},{-603,-333},{-605,-336},{-609,-336},{-617,-344},{-585,-339},{-583,-331},{-582,-331}}}, + {"America/Nassau",261,{{-757,235},{-767,244},{-767,245},{-771,264},{-770,264},{-788,266},{-788,267},{-758,224},{-753,236},{-760,237},{-761,237},{-756,234},{-736,211},{-733,211},{-730,213},{-732,210},{-737,209},{-730,215},{-729,215},{-730,214},{-731,215},{-739,217},{-738,217},{-743,221},{-727,223},{-758,223},{-742,223},{-741,224},{-757,222},{-758,222},{-757,223},{-731,224},{-731,225},{-728,223},{-758,225},{-736,231},{-737,231},{-738,231},{-755,234},{-756,235},{-760,234},{-760,235},{-758,235},{-759,235},{-757,234},{-739,227},{-738,225},{-740,224},{-743,222},{-739,225},{-740,226},{-740,227},{-742,225},{-743,225},{-735,226},{-736,226},{-742,227},{-744,225},{-744,226},{-743,227},{-743,226},{-743,228},{-741,227},{-752,232},{-758,234},{-760,236},{-777,237},{-759,229},{-757,230},{-750,231},{-749,230},{-748,229},{-751,233},{-753,237},{-752,235},{-804,237},{-778,238},{-762,238},{-805,239},{-805,240},{-803,240},{-804,240},{-768,245},{-768,246},{-759,246},{-758,246},{-745,240},{-746,239},{-745,241},{-744,241},{-763,239},{-763,240},{-772,240},{-777,240},{-778,240},{-777,241},{-751,238},{-751,239},{-778,239},{-762,239},{-776,238},{-777,239},{-775,238},{-775,239},{-761,238},{-777,238},{-760,246},{-785,247},{-785,246},{-784,246},{-784,247},{-778,244},{-781,252},{-781,253},{-768,247},{-777,247},{-777,246},{-773,251},{-782,251},{-763,248},{-768,248},{-779,249},{-779,250},{-780,250},{-776,250},{-774,251},{-773,250},{-774,250},{-771,251},{-772,251},{-780,271},{-766,243},{-766,244},{-779,244},{-779,243},{-777,243},{-778,243},{-777,244},{-776,242},{-779,241},{-765,242},{-776,269},{-764,241},{-764,242},{-754,241},{-755,241},{-754,243},{-758,247},{-756,246},{-753,241},{-779,242},{-780,242},{-778,242},{-765,243},{-780,243},{-776,237},{-778,237},{-777,256},{-793,256},{-777,257},{-778,257},{-793,257},{-792,257},{-793,258},{-773,264},{-772,264},{-779,248},{-777,245},{-781,245},{-782,249},{-782,252},{-780,252},{-748,237},{-748,236},{-749,237},{-762,237},{-783,272},{-779,258},{-771,263},{-773,263},{-772,263},{-775,261},{-776,262},{-775,262},{-776,263},{-775,263},{-775,269},{-776,270},{-777,270},{-777,271},{-782,270},{-782,269},{-781,271},{-773,265},{-772,265},{-773,267},{-773,266},{-770,266},{-772,258},{-773,260},{-774,260},{-772,261},{-771,265},{-770,265},{-771,267},{-771,266},{-789,267},{-774,266},{-778,266},{-779,266},{-774,267},{-772,267},{-783,267},{-785,267},{-784,268},{-784,267},{-785,268},{-783,268},{-773,268},{-779,268},{-787,266},{-774,265},{-778,265},{-772,266},{-779,265},{-779,267},{-774,268},{-779,269},{-777,269},{-775,268},{-786,269},{-778,269},{-780,269},{-761,250},{-764,253},{-768,254},{-767,256},{-761,251},{-761,246},{-762,248},{-780,267},{-787,265},{-789,266},{-790,267},{-788,265},{-786,268},{-780,268},{-769,253},{-769,254},{-778,255},{-766,255},{-777,255},{-769,255},{-768,255},{-768,253},{-779,254},{-778,254},{-793,255},{-768,256},{-767,255},{-766,256}}}, + {"Asia/Kuching",161,{{1098,19},{1163,64},{1188,44},{1187,44},{1113,26},{1113,28},{1114,23},{1113,24},{1114,27},{1114,28},{1113,14},{1103,17},{1101,17},{1102,18},{1151,52},{1153,53},{1152,53},{1152,54},{1153,54},{1191,54},{1191,55},{1156,57},{1157,57},{1157,58},{1179,58},{1181,58},{1160,58},{1160,59},{1181,59},{1179,42},{1177,42},{1176,42},{1177,43},{1186,42},{1189,43},{1186,44},{1183,43},{1189,45},{1190,46},{1189,46},{1186,45},{1187,45},{1188,45},{1185,45},{1185,46},{1186,46},{1183,47},{1185,47},{1188,46},{1187,46},{1183,48},{1183,50},{1184,50},{1183,49},{1184,47},{1184,48},{1177,62},{1177,63},{1173,71},{1170,71},{1171,71},{1173,73},{1173,72},{1169,72},{1169,73},{1170,74},{1170,72},{1171,72},{1172,71},{1172,72},{1173,74},{1171,73},{1152,49},{1155,51},{1156,52},{1154,54},{1156,56},{1159,56},{1167,70},{1169,68},{1168,66},{1171,70},{1173,66},{1177,64},{1176,59},{1180,60},{1179,57},{1183,58},{1193,53},{1191,51},{1186,49},{1181,49},{1185,43},{1180,42},{1176,44},{1172,44},{1162,44},{1161,43},{1159,44},{1156,39},{1156,32},{1151,28},{1152,25},{1148,23},{1149,19},{1147,19},{1146,14},{1140,14},{1137,12},{1130,14},{1130,16},{1125,16},{1118,10},{1112,11},{1106,9},{1097,16},{1095,19},{1096,21},{1099,17},{1103,18},{1107,16},{1107,14},{1108,16},{1111,14},{1113,13},{1110,16},{1112,17},{1112,21},{1113,21},{1112,22},{1112,24},{1115,23},{1130,32},{1139,42},{1140,46},{1143,45},{1146,40},{1149,44},{1148,47},{1150,49},{1151,44},{1153,43},{1177,59},{1177,60},{1161,61},{1180,61},{1156,62},{1176,62},{1160,60},{1161,60},{1177,61},{1174,66},{1163,67},{1173,68},{1175,69},{1172,70},{1173,70},{1174,67},{1175,68},{1175,67},{1164,67}}}, + {"America/Guyana",57,{{-585,67},{-586,67},{-586,66},{-575,63},{-572,61},{-573,53},{-572,52},{-579,48},{-578,46},{-581,40},{-577,34},{-573,34},{-572,28},{-567,20},{-565,19},{-573,20},{-575,17},{-580,17},{-580,15},{-583,16},{-585,13},{-588,12},{-598,19},{-597,23},{-599,24},{-600,29},{-598,36},{-595,39},{-597,42},{-597,44},{-602,45},{-600,51},{-602,53},{-607,52},{-614,60},{-611,62},{-612,67},{-607,68},{-603,71},{-606,72},{-607,75},{-598,83},{-600,86},{-591,80},{-585,74},{-586,64},{-583,69},{-580,68},{-585,70},{-585,71},{-585,69},{-584,70},{-583,70},{-584,69},{-586,68},{-586,69},{-585,68}}}, + {"Pacific/Enderbury",13,{{-1745,-47},{-1722,-45},{-1713,-45},{-1712,-44},{-1712,-45},{-1721,-45},{-1707,-37},{-1741,-36},{-1711,-31},{-1715,-36},{-1716,-28},{-1717,-28},{-1716,-29}}}, + {"Atlantic/Azores",34,{{-251,369},{-252,369},{-252,370},{-251,370},{-254,377},{-253,379},{-251,378},{-257,377},{-259,379},{-258,379},{-284,386},{-281,384},{-280,384},{-285,385},{-279,390},{-280,390},{-281,391},{-280,391},{-312,395},{-312,394},{-313,395},{-311,397},{-288,386},{-287,386},{-286,385},{-288,385},{-281,387},{-280,387},{-278,385},{-283,388},{-271,388},{-271,386},{-274,387},{-273,388}}}, + {"America/Winnipeg",52,{{-921,484},{-924,482},{-925,484},{-927,485},{-926,485},{-930,486},{-938,485},{-946,487},{-948,493},{-952,494},{-952,490},{-1014,490},{-1018,541},{-1025,545},{-1025,548},{-1019,551},{-1020,600},{-948,600},{-947,594},{-948,594},{-948,591},{-950,591},{-946,589},{-944,587},{-932,588},{-928,580},{-928,578},{-924,574},{-927,569},{-910,573},{-890,568},{-900,562},{-900,540},{-890,540},{-885,536},{-885,534},{-890,530},{-890,528},{-900,528},{-900,520},{-908,515},{-908,512},{-900,508},{-900,495},{-910,492},{-910,490},{-918,490},{-918,487},{-923,485},{-920,484},{-928,579},{-927,578}}}, + {"Europe/Dublin",175,{{-106,520},{-106,521},{-105,521},{-60,535},{-102,534},{-61,534},{-62,534},{-99,534},{-101,535},{-102,535},{-100,536},{-103,536},{-102,536},{-101,537},{-100,537},{-96,538},{-100,538},{-99,538},{-101,538},{-72,554},{-97,538},{-96,539},{-99,539},{-100,539},{-102,541},{-102,542},{-91,542},{-92,542},{-86,543},{-87,544},{-86,544},{-84,550},{-85,550},{-100,540},{-103,540},{-102,540},{-99,540},{-86,550},{-75,551},{-75,550},{-82,552},{-84,551},{-83,553},{-82,553},{-99,523},{-85,551},{-95,514},{-95,515},{-96,515},{-94,515},{-102,516},{-95,517},{-98,516},{-99,516},{-102,517},{-103,517},{-99,518},{-93,515},{-83,519},{-82,519},{-83,518},{-104,519},{-103,519},{-66,521},{-95,526},{-91,526},{-90,526},{-90,527},{-91,527},{-104,518},{-89,527},{-95,528},{-95,531},{-95,530},{-96,531},{-97,531},{-98,531},{-91,531},{-91,532},{-90,532},{-97,532},{-98,532},{-97,533},{-98,533},{-99,533},{-96,533},{-96,532},{-100,533},{-66,540},{-61,540},{-64,540},{-62,538},{-63,537},{-61,536},{-62,535},{-60,530},{-64,523},{-65,524},{-64,522},{-68,523},{-69,521},{-69,522},{-70,523},{-70,521},{-76,521},{-76,520},{-79,520},{-81,518},{-84,519},{-86,517},{-85,516},{-98,515},{-95,518},{-96,519},{-101,517},{-98,522},{-104,521},{-105,522},{-97,523},{-100,524},{-96,526},{-95,525},{-88,526},{-88,527},{-87,527},{-86,527},{-89,528},{-90,528},{-92,526},{-99,526},{-93,531},{-89,531},{-89,532},{-100,535},{-97,536},{-95,538},{-98,539},{-98,541},{-100,541},{-100,542},{-101,541},{-101,543},{-93,543},{-91,541},{-91,543},{-87,543},{-86,542},{-85,542},{-81,547},{-85,546},{-88,547},{-84,548},{-86,548},{-83,548},{-83,549},{-85,549},{-83,552},{-79,551},{-78,553},{-78,552},{-77,551},{-76,553},{-77,550},{-75,553},{-73,553},{-74,554},{-69,552},{-74,550},{-75,547},{-79,547},{-77,546},{-82,545},{-76,541},{-73,541},{-70,544}}}, + {"America/Argentina/Ushuaia",30,{{-642,-547},{-642,-546},{-641,-546},{-643,-547},{-642,-548},{-643,-548},{-675,-549},{-674,-549},{-685,-549},{-642,-549},{-683,-549},{-640,-548},{-646,-549},{-648,-548},{-638,-547},{-686,-549},{-686,-527},{-683,-530},{-682,-531},{-684,-530},{-685,-533},{-681,-533},{-677,-538},{-673,-541},{-660,-546},{-651,-547},{-653,-549},{-660,-549},{-664,-551},{-683,-548}}}, + {"Asia/Colombo",36,{{798,79},{798,80},{798,83},{798,82},{798,84},{798,85},{812,85},{799,90},{799,89},{798,90},{797,91},{799,91},{817,65},{806,59},{801,62},{797,81},{797,82},{797,83},{802,95},{800,98},{802,98},{808,93},{812,86},{814,85},{819,73},{800,93},{801,93},{800,95},{797,96},{797,95},{798,96},{800,96},{799,96},{799,97},{799,98},{798,97}}}, + {"Asia/Krasnoyarsk",1323,{{809,724},{808,724},{807,724},{811,723},{810,723},{811,724},{811,722},{1054,728},{1055,728},{1057,728},{1058,728},{1057,729},{936,811},{935,811},{795,728},{790,727},{786,728},{791,731},{792,731},{793,731},{795,729},{1059,729},{1060,729},{1060,730},{1084,731},{1083,732},{1084,732},{804,732},{803,732},{1058,729},{1058,730},{1083,731},{806,732},{805,732},{788,732},{790,732},{793,732},{794,732},{803,734},{806,734},{805,734},{802,734},{801,735},{802,735},{805,736},{804,736},{1067,736},{1068,736},{1063,736},{1064,736},{847,738},{846,738},{847,739},{866,739},{1093,735},{803,735},{805,735},{1092,735},{867,739},{869,739},{868,739},{865,739},{867,740},{864,739},{863,740},{869,740},{868,740},{843,740},{842,740},{839,740},{844,740},{866,740},{849,740},{848,740},{842,696},{843,696},{844,696},{843,697},{836,697},{822,701},{831,701},{837,697},{835,697},{835,698},{838,697},{833,699},{834,699},{832,699},{831,700},{833,700},{835,699},{829,701},{827,707},{826,707},{834,700},{832,700},{832,703},{832,704},{835,704},{836,704},{833,704},{822,703},{829,702},{823,703},{822,704},{828,702},{831,702},{824,702},{823,702},{830,702},{830,703},{824,703},{826,702},{825,702},{825,708},{824,708},{833,708},{827,708},{826,708},{835,706},{836,706},{823,707},{824,707},{824,706},{831,706},{833,707},{832,707},{835,707},{825,707},{832,708},{834,704},{837,704},{822,705},{827,702},{829,704},{823,704},{828,704},{827,704},{827,705},{826,705},{837,705},{836,705},{823,706},{821,705},{831,704},{831,705},{833,705},{829,741},{830,741},{946,764},{945,764},{835,705},{834,705},{825,706},{833,706},{834,706},{832,705},{830,706},{829,707},{831,708},{829,706},{828,709},{830,708},{830,709},{833,709},{824,709},{825,709},{827,709},{830,710},{832,709},{824,710},{823,709},{829,709},{828,710},{829,710},{831,709},{825,710},{827,710},{826,710},{823,710},{1113,739},{1097,737},{1095,738},{1100,740},{1110,739},{1112,740},{1116,740},{864,741},{863,741},{824,740},{823,740},{873,740},{872,740},{873,741},{865,740},{867,741},{866,741},{868,741},{827,740},{825,741},{824,741},{828,741},{848,741},{836,741},{833,741},{853,742},{856,743},{855,743},{865,741},{852,741},{857,741},{854,741},{856,741},{854,742},{850,743},{852,743},{851,743},{853,743},{874,744},{873,744},{852,744},{851,744},{1104,745},{853,744},{849,744},{850,745},{850,744},{843,744},{856,744},{854,744},{843,745},{844,744},{842,745},{849,743},{1005,786},{1004,786},{998,779},{997,779},{795,745},{793,745},{792,746},{796,746},{857,747},{842,746},{842,747},{843,747},{843,746},{851,748},{852,749},{863,749},{864,749},{869,749},{868,749},{857,749},{856,749},{855,749},{882,752},{883,752},{881,753},{821,751},{821,752},{822,752},{863,750},{864,750},{866,747},{865,748},{868,748},{866,748},{855,747},{854,747},{856,748},{853,748},{852,748},{860,748},{859,748},{864,748},{1004,780},{1005,780},{1029,781},{858,748},{857,748},{859,749},{860,749},{867,749},{866,750},{872,749},{870,748},{869,748},{1137,754},{895,755},{895,756},{896,755},{897,755},{892,755},{893,755},{902,756},{899,756},{898,756},{880,756},{879,756},{881,757},{888,757},{891,757},{892,757},{887,757},{886,757},{918,757},{919,758},{928,758},{818,758},{817,758},{1137,759},{1136,759},{933,758},{933,759},{934,759},{927,758},{928,759},{930,758},{927,760},{926,760},{924,760},{923,760},{827,759},{826,759},{965,764},{966,764},{824,759},{819,759},{817,759},{820,760},{922,759},{921,759},{831,759},{829,760},{825,759},{823,760},{826,760},{833,759},{821,753},{863,753},{862,753},{823,753},{820,753},{820,752},{816,753},{818,752},{820,751},{817,752},{817,754},{821,754},{819,755},{864,753},{865,753},{818,754},{822,754},{820,755},{821,755},{823,755},{852,745},{853,746},{857,745},{1030,781},{932,811},{933,811},{1063,775},{1062,776},{859,745},{860,745},{860,746},{863,745},{848,744},{846,744},{845,745},{847,745},{846,745},{862,746},{861,746},{856,746},{857,746},{851,745},{850,746},{851,746},{848,745},{849,746},{938,782},{937,782},{936,782},{1069,782},{1066,784},{1065,784},{1066,783},{1067,784},{987,786},{988,787},{988,786},{979,787},{979,788},{980,788},{987,787},{978,788},{988,785},{987,785},{1068,783},{1063,782},{1061,782},{1048,783},{1049,783},{1075,780},{1076,781},{1064,781},{1077,781},{1029,782},{1021,782},{1032,782},{1031,782},{768,795},{761,796},{776,795},{775,795},{912,795},{911,795},{910,795},{909,795},{906,796},{909,796},{914,795},{929,796},{1001,796},{1002,796},{912,796},{911,796},{1001,797},{1002,797},{1004,797},{1000,796},{917,795},{918,794},{915,795},{916,794},{929,790},{927,791},{923,791},{924,791},{919,794},{924,794},{926,794},{923,794},{929,794},{927,794},{931,794},{930,794},{928,794},{925,794},{925,795},{986,788},{987,788},{1033,792},{1034,792},{1035,792},{1017,792},{1016,792},{1035,791},{1034,791},{968,790},{969,790},{999,792},{998,792},{998,793},{1000,793},{1000,794},{1001,795},{1002,794},{1001,794},{980,806},{915,804},{914,804},{927,805},{928,805},{974,802},{975,803},{975,802},{916,803},{981,807},{981,808},{795,808},{788,808},{786,808},{800,809},{1028,781},{1016,782},{1001,779},{995,780},{1006,786},{1007,788},{1013,787},{1009,788},{1011,790},{1017,790},{1015,791},{1013,791},{1014,792},{1019,793},{1023,792},{1022,793},{1025,794},{1032,793},{1024,788},{1028,788},{1030,790},{1039,792},{1047,789},{1045,788},{1041,789},{1053,787},{1054,785},{1008,788},{1050,789},{1049,789},{1048,789},{1042,790},{1044,790},{1043,790},{1033,791},{925,807},{926,807},{909,810},{902,811},{901,811},{911,812},{917,811},{969,801},{981,800},{979,800},{980,799},{965,797},{977,798},{972,797},{972,796},{983,798},{981,799},{985,799},{985,800},{987,801},{1001,798},{1002,798},{999,797},{1000,797},{998,796},{999,795},{992,793},{1000,789},{984,788},{956,791},{951,790},{944,792},{944,795},{939,794},{940,795},{937,796},{939,796},{935,795},{934,795},{932,795},{930,796},{947,798},{943,799},{950,801},{979,799},{978,799},{973,797},{968,797},{983,799},{982,799},{983,800},{944,799},{982,800},{945,800},{946,800},{984,800},{968,801},{980,801},{981,801},{917,801},{918,801},{951,801},{952,801},{914,800},{910,801},{939,799},{932,798},{935,798},{931,797},{918,796},{913,797},{924,798},{912,799},{914,799},{912,800},{940,800},{943,800},{944,800},{927,800},{926,800},{928,800},{949,801},{960,801},{961,801},{956,762},{957,762},{951,761},{950,762},{953,762},{952,761},{956,813},{980,807},{967,807},{972,806},{971,805},{973,802},{938,800},{922,801},{930,801},{922,803},{934,802},{933,803},{915,803},{928,803},{920,804},{929,805},{934,808},{933,809},{932,809},{967,536},{969,537},{983,532},{983,531},{989,532},{992,530},{988,528},{989,527},{986,524},{986,523},{989,521},{987,518},{983,517},{978,510},{980,507},{983,505},{983,503},{973,498},{966,500},{946,500},{943,506},{931,506},{930,508},{926,507},{924,509},{923,507},{918,507},{914,505},{907,505},{907,502},{896,499},{893,503},{895,505},{899,505},{891,511},{890,514},{887,516},{884,513},{879,515},{881,518},{878,518},{881,521},{887,522},{892,528},{889,530},{891,531},{890,533},{888,534},{888,536},{893,538},{890,541},{892,543},{889,544},{886,543},{884,544},{888,548},{884,553},{894,559},{891,563},{885,566},{887,567},{886,568},{887,571},{885,571},{891,576},{894,576},{894,579},{880,582},{879,585},{884,589},{888,590},{886,593},{879,593},{875,597},{872,597},{871,599},{845,600},{848,604},{843,609},{860,615},{847,618},{844,622},{856,630},{855,631},{857,634},{850,636},{860,641},{860,643},{858,645},{859,648},{843,649},{846,653},{845,655},{840,658},{835,658},{833,661},{835,662},{831,665},{831,666},{833,667},{832,668},{821,672},{824,673},{822,674},{824,675},{817,679},{824,679},{824,682},{827,683},{827,685},{825,686},{830,687},{826,688},{823,691},{825,692},{818,692},{818,693},{819,693},{817,694},{816,693},{810,692},{799,693},{795,697},{790,697},{791,697},{789,699},{793,700},{793,701},{802,704},{808,704},{806,705},{808,707},{806,707},{807,708},{806,711},{791,714},{794,716},{801,717},{800,718},{803,719},{789,721},{784,724},{806,721},{817,717},{833,717},{830,715},{830,714},{822,713},{823,711},{822,710},{821,706},{819,704},{818,702},{821,703},{820,703},{823,701},{827,701},{830,700},{827,700},{843,695},{846,696},{838,705},{834,710},{832,711},{837,716},{833,718},{827,719},{823,721},{825,721},{820,723},{808,725},{809,726},{807,727},{809,728},{808,730},{808,732},{803,733},{807,734},{871,738},{872,739},{875,741},{869,741},{867,742},{859,744},{863,743},{861,744},{865,745},{867,744},{870,744},{867,743},{870,743},{872,744},{858,747},{861,748},{870,746},{868,747},{874,749},{872,750},{878,750},{869,751},{882,751},{889,754},{891,754},{891,753},{892,754},{887,754},{898,754},{903,756},{917,756},{917,757},{921,757},{942,759},{928,760},{933,761},{935,761},{934,760},{948,761},{946,762},{963,761},{956,759},{957,758},{964,760},{967,760},{965,759},{979,760},{976,760},{989,763},{996,761},{998,761},{989,765},{1011,765},{1013,767},{1010,768},{1014,771},{1033,776},{1041,777},{1059,776},{1063,774},{1042,771},{1059,771},{1055,770},{1069,770},{1075,769},{1064,766},{1066,765},{1077,765},{1083,768},{1112,768},{1123,765},{1120,764},{1119,763},{1119,762},{1124,765},{1128,763},{1125,762},{1129,761},{1126,761},{1134,761},{1130,762},{1133,763},{1139,759},{1135,755},{1134,756},{1136,757},{1133,757},{1130,757},{1131,757},{1126,758},{1122,759},{1128,757},{1126,757},{1129,756},{1128,755},{1134,755},{1137,755},{1135,754},{1136,753},{1130,750},{1121,749},{1118,747},{1102,745},{1104,744},{1101,743},{1102,744},{1098,743},{1097,743},{1096,743},{1094,743},{1099,743},{1083,738},{1084,738},{1082,737},{1061,736},{1071,735},{1068,733},{1061,733},{1053,728},{1060,728},{1064,732},{1081,732},{1082,731},{1085,731},{1086,733},{1082,733},{1108,737},{1112,736},{1102,734},{1109,730},{1106,729},{1107,727},{1113,725},{1111,724},{1120,721},{1120,714},{1127,712},{1123,710},{1101,706},{1103,704},{1093,702},{1095,700},{1092,698},{1082,699},{1079,697},{1065,696},{1061,694},{1069,689},{1068,673},{1055,670},{1062,668},{1063,665},{1061,664},{1061,662},{1065,660},{1064,657},{1070,655},{1060,650},{1062,649},{1059,649},{1057,646},{1062,644},{1066,645},{1073,642},{1082,642},{1083,640},{1077,640},{1076,639},{1067,640},{1068,638},{1065,635},{1067,634},{1061,631},{1065,627},{1068,626},{1063,623},{1064,622},{1064,620},{1059,618},{1059,617},{1058,616},{1048,613},{1050,612},{1046,611},{1046,609},{1045,608},{1046,604},{1055,602},{1055,598},{1048,597},{1050,595},{1052,595},{1054,591},{1048,589},{1049,587},{1044,586},{1042,588},{1039,587},{1039,589},{1036,589},{1032,592},{1033,593},{1030,593},{1024,591},{1025,587},{1008,579},{1009,574},{1004,575},{1000,581},{997,581},{994,578},{990,577},{979,578},{973,570},{976,570},{975,568},{978,568},{979,564},{976,564},{976,562},{974,560},{971,561},{968,558},{969,553},{966,550},{967,549},{966,545},{961,546},{957,543},{968,760},{974,761},{972,760},{919,760},{918,760},{918,761},{919,761},{921,761},{937,761},{965,761},{1135,761},{1136,761},{941,761},{941,762},{939,762},{995,762},{994,762},{955,762},{991,762},{981,762},{982,762},{969,764},{968,764},{951,764},{984,763},{983,763},{959,763},{967,763},{965,763},{963,762},{965,762},{950,763},{949,762},{944,762},{948,762},{968,762},{967,762},{969,763},{968,763},{971,763},{1131,763},{1132,763},{947,763},{948,763},{953,763},{954,763},{966,763},{964,763},{961,763},{962,763},{1129,763},{1129,764},{1130,763},{953,765},{952,765},{954,765},{955,765},{1128,765},{944,765},{943,766},{939,766},{945,766},{947,766},{946,766},{955,766},{1127,765},{1127,766},{956,765},{957,766},{957,765},{960,765},{961,766},{1122,766},{1118,766},{1119,767},{1119,766},{962,765},{962,766},{963,766},{965,766},{966,766},{960,766},{956,766},{951,766},{974,764},{949,764},{948,764},{952,764},{1127,764},{1125,764},{1128,764},{1134,764},{1135,763},{1132,764},{1133,764},{950,764},{950,765},{951,765},{956,764},{955,764},{1131,765},{1130,765},{1132,765},{966,765},{954,764},{1126,764},{1120,766},{1123,766},{1126,766},{1125,766},{1124,766},{1114,767},{1113,768},{1111,768},{945,768},{946,768},{1108,768},{1109,768},{1099,767},{948,768},{954,767},{953,767},{952,767},{951,767},{975,767},{972,767},{977,768},{949,767},{950,767},{958,768},{957,768},{979,767},{978,768},{980,768},{979,768},{951,769},{952,769},{978,769},{969,768},{969,769},{965,768},{965,769},{966,769},{968,769},{967,769},{958,769},{957,769},{959,769},{1081,770},{1082,770},{952,770},{953,771},{953,770},{1080,770},{1079,770},{1013,770},{962,770},{963,770},{1003,770},{1004,770},{1044,771},{1001,771},{1079,769},{1080,769},{899,770},{898,770},{1005,769},{1004,769},{961,769},{964,769},{963,769},{960,769},{1006,772},{1005,772},{1058,772},{1058,773},{1060,773},{1059,772},{907,773},{906,773},{1072,773},{1071,773},{963,772},{965,772},{964,772},{1003,772},{1004,772},{1076,773},{1076,774},{1077,774},{824,775},{823,775},{827,775},{822,775},{1022,774},{1021,774},{1023,774},{1075,774},{1065,774},{1067,775},{1070,775},{1067,774},{920,776},{919,776},{921,776},{1013,777},{1012,777},{1014,777},{1044,777},{1045,777},{1040,777},{1017,776},{1016,776},{1015,776},{1025,775},{1026,775},{1064,775},{1078,773},{1074,772},{1072,772},{908,773},{1061,773},{1064,773},{1063,773},{1065,773},{890,770},{889,770},{887,770},{887,771},{888,771},{890,771},{891,770},{1045,771},{1043,771},{976,766},{973,766},{973,767},{975,766},{959,770},{966,771},{900,771},{901,771},{902,771},{899,771},{895,772},{892,772},{894,773},{897,773},{1002,771},{1060,772},{1058,771},{1057,772},{972,768},{973,768},{976,768},{959,768},{974,768},{975,768},{976,769},{944,766},{959,766},{962,767},{965,767},{948,767},{948,766},{945,767},{946,767},{966,767},{944,767},{950,766},{954,766},{952,766},{955,767},{959,767},{958,766},{947,767},{981,767},{980,767},{960,767},{961,767},{958,767},{957,767},{956,767}}}, + {"Asia/Shanghai",778,{{1141,220},{1133,223},{1134,223},{1138,225},{1139,225},{1148,225},{1137,219},{1137,220},{1134,222},{1131,218},{1131,219},{1132,219},{1140,219},{1141,219},{1133,219},{1133,220},{1132,220},{1142,220},{1138,220},{1136,228},{1136,229},{1135,231},{1135,229},{1135,230},{1135,228},{1171,234},{1170,234},{1169,234},{1171,235},{1168,234},{1177,235},{1171,236},{1170,236},{1170,235},{1169,235},{1137,221},{1139,221},{1134,221},{1135,221},{1138,221},{1140,221},{1136,221},{1143,221},{1143,220},{1139,220},{1140,220},{1134,220},{1133,221},{1138,222},{1133,222},{1135,222},{1146,224},{1147,224},{1146,225},{1130,224},{1130,225},{1131,224},{1138,224},{1136,224},{1137,224},{1136,226},{1147,226},{1146,226},{1146,227},{1151,228},{1137,228},{1135,227},{1134,227},{1135,226},{1177,238},{1181,243},{1182,243},{1182,244},{1180,244},{1179,244},{1176,237},{1175,237},{1174,237},{1174,238},{1173,236},{1169,236},{1196,257},{1181,244},{1181,245},{1205,272},{1205,271},{1207,270},{1205,270},{1222,289},{1217,288},{1217,289},{1218,287},{1219,287},{1216,287},{1217,287},{1219,288},{1218,288},{1216,282},{1217,283},{1216,284},{1217,284},{1219,284},{1218,284},{1218,286},{1196,254},{1195,254},{1216,285},{1219,285},{1217,285},{1206,273},{1206,274},{1211,275},{1211,274},{1206,272},{1212,276},{1211,278},{1212,279},{1212,278},{1214,280},{1214,281},{1215,281},{1212,280},{1211,280},{1211,279},{1208,276},{1208,277},{1210,277},{1209,277},{1203,269},{1209,279},{1208,280},{1209,280},{1210,280},{1207,280},{1210,278},{1210,279},{1213,281},{1212,282},{1211,282},{1212,283},{1211,283},{1212,284},{1195,256},{1197,256},{1197,257},{1196,256},{1212,281},{1211,281},{1197,258},{1196,261},{1197,261},{1196,262},{1197,262},{1197,264},{1199,264},{1200,265},{1201,265},{1195,253},{1197,253},{1198,253},{1197,254},{1198,254},{1197,255},{1196,255},{1199,256},{1194,256},{1198,257},{1202,265},{1200,266},{1198,266},{1202,266},{1201,266},{1203,267},{1204,267},{1201,267},{1197,267},{1196,267},{1199,267},{1198,267},{1204,266},{1203,266},{1197,266},{1200,267},{1196,268},{1201,268},{1202,268},{1202,269},{1206,379},{1206,380},{1184,245},{1184,246},{1183,245},{1183,246},{1188,248},{1188,249},{1195,250},{1194,250},{1194,251},{1190,250},{1191,250},{1191,251},{1192,251},{1181,246},{1182,245},{1182,246},{1182,247},{1190,252},{1196,252},{1195,252},{1194,252},{1193,253},{1194,253},{1193,255},{1193,254},{1193,256},{1192,393},{1192,394},{1204,269},{1203,270},{1204,270},{1204,271},{1229,304},{1228,307},{1218,313},{1218,314},{1219,314},{1217,314},{1202,358},{1209,359},{1219,319},{1218,319},{1205,320},{1205,321},{1204,320},{1208,320},{1206,320},{1206,321},{1207,320},{1216,314},{1216,315},{1214,316},{1213,316},{1212,317},{1212,318},{1215,318},{1214,318},{1218,315},{1211,318},{1210,318},{1195,347},{1194,348},{1195,348},{1238,398},{1237,397},{1237,398},{1238,397},{1236,398},{1218,409},{1208,383},{1209,383},{1209,384},{1208,384},{1210,364},{1209,364},{1209,366},{1216,367},{1215,367},{1216,368},{1203,361},{1216,375},{1216,374},{1222,375},{1215,376},{1215,375},{1204,378},{1205,378},{1207,379},{1208,379},{1207,380},{1209,380},{1206,381},{1207,382},{1208,382},{1188,382},{1228,390},{1228,391},{1229,390},{1229,391},{1227,390},{1232,390},{1232,391},{1231,391},{1218,389},{1185,389},{1186,390},{1188,390},{1188,391},{1187,390},{1186,391},{1189,391},{1224,392},{1223,391},{1223,392},{1216,392},{1190,392},{1212,391},{1223,393},{1224,393},{1217,393},{1215,393},{1216,393},{1215,394},{1217,394},{1218,394},{1193,394},{1214,392},{1215,392},{1226,392},{1228,392},{1191,392},{1191,393},{1226,393},{1225,393},{1227,393},{1227,392},{1225,392},{1231,394},{1206,404},{1208,405},{1193,395},{1231,395},{1230,395},{1215,395},{1213,395},{1212,395},{1215,396},{1230,396},{1216,291},{1216,292},{1217,291},{1218,291},{1219,291},{1215,291},{1085,297},{1084,298},{1085,299},{1086,302},{1084,305},{1091,306},{1093,305},{1102,310},{1101,314},{1096,317},{1095,323},{1096,326},{1100,326},{1102,327},{1094,332},{1096,333},{1102,332},{1105,333},{1107,331},{1110,333},{1110,336},{1106,339},{1106,342},{1104,343},{1105,344},{1103,347},{1106,356},{1104,370},{1107,373},{1108,377},{1106,377},{1105,382},{1109,385},{1112,393},{1111,394},{1113,394},{1114,396},{1119,396},{1123,403},{1128,402},{1130,404},{1135,403},{1141,405},{1141,408},{1138,411},{1140,412},{1139,414},{1142,415},{1142,418},{1145,421},{1148,422},{1146,423},{1144,422},{1143,422},{1140,420},{1134,422},{1131,420},{1126,424},{1121,425},{1118,429},{1112,434},{1120,438},{1114,443},{1116,447},{1120,451},{1136,448},{1145,454},{1157,454},{1162,457},{1166,463},{1174,463},{1174,466},{1178,465},{1183,468},{1190,468},{1194,466},{1195,464},{1199,468},{1197,472},{1199,472},{1198,473},{1195,473},{1191,477},{1185,480},{1178,480},{1174,476},{1168,479},{1162,479},{1159,477},{1155,480},{1155,482},{1158,483},{1158,485},{1167,498},{1179,495},{1186,499},{1193,501},{1194,503},{1191,504},{1201,517},{1206,519},{1208,522},{1206,523},{1207,525},{1201,526},{1200,528},{1208,533},{1233,536},{1242,534},{1235,528},{1234,524},{1226,521},{1229,515},{1233,513},{1237,514},{1244,513},{1253,516},{1260,510},{1258,507},{1259,505},{1253,501},{1253,494},{1251,491},{1248,491},{1245,486},{1246,482},{1244,481},{1243,485},{1224,473},{1228,471},{1230,467},{1233,468},{1234,470},{1236,469},{1236,467},{1230,466},{1230,464},{1232,463},{1228,461},{1227,457},{1218,460},{1216,458},{1219,457},{1222,453},{1220,449},{1223,443},{1231,445},{1235,437},{1233,435},{1237,434},{1238,435},{1243,432},{1245,428},{1249,431},{1249,428},{1253,422},{1255,421},{1253,418},{1258,412},{1256,409},{1257,408},{1249,405},{1242,398},{1237,399},{1234,397},{1233,398},{1233,397},{1222,393},{1221,391},{1218,390},{1219,389},{1217,391},{1216,389},{1217,389},{1212,387},{1211,389},{1219,394},{1213,394},{1216,395},{1215,398},{1219,400},{1223,405},{1218,410},{1216,408},{1212,409},{1204,402},{1194,398},{1183,390},{1179,392},{1175,387},{1180,381},{1185,380},{1191,377},{1189,373},{1193,372},{1198,372},{1198,374},{1203,376},{1202,377},{1207,378},{1221,376},{1222,374},{1227,374},{1224,370},{1226,370},{1225,369},{1222,368},{1222,370},{1214,369},{1214,367},{1208,366},{1210,365},{1207,364},{1207,361},{1203,360},{1203,363},{1201,362},{1199,356},{1196,356},{1192,349},{1192,348},{1198,344},{1203,343},{1202,341},{1205,338},{1204,337},{1208,330},{1208,326},{1214,324},{1213,322},{1217,320},{1219,318},{1203,319},{1207,318},{1217,313},{1219,310},{1210,306},{1209,304},{1203,303},{1205,303},{1206,301},{1207,301},{1213,303},{1217,300},{1221,299},{1214,295},{1215,294},{1220,296},{1220,292},{1218,292},{1218,294},{1217,292},{1217,293},{1214,291},{1215,290},{1216,290},{1215,289},{1214,287},{1216,283},{1214,283},{1206,280},{1208,279},{1206,276},{1207,275},{1200,269},{1199,265},{1199,266},{1198,269},{1198,264},{1196,265},{1197,263},{1200,264},{1197,260},{1195,255},{1194,255},{1191,254},{1191,253},{1190,253},{1189,253},{1190,251},{1188,251},{1187,248},{1187,249},{1187,250},{1186,248},{1187,246},{1184,247},{1180,246},{1178,239},{1178,241},{1176,241},{1177,240},{1176,239},{1174,240},{1175,238},{1172,236},{1169,237},{1165,234},{1168,232},{1166,232},{1165,229},{1158,227},{1156,229},{1156,227},{1152,228},{1153,229},{1149,225},{1148,228},{1145,227},{1145,224},{1144,226},{1138,228},{1137,227},{1134,231},{1133,228},{1133,224},{1131,225},{1130,221},{1127,226},{1123,228},{1122,235},{1118,234},{1116,232},{1114,233},{1116,238},{1119,240},{1119,242},{1121,244},{1120,248},{1114,247},{1114,251},{1110,249},{1115,259},{1112,259},{1113,263},{1106,263},{1103,260},{1100,262},{1097,259},{1095,260},{1095,263},{1093,263},{1094,266},{1093,267},{1095,268},{1095,271},{1088,271},{1095,276},{1093,278},{1093,286},{1092,286},{1093,291},{1091,294},{1089,293},{1089,296},{1086,299},{1224,300},{1223,301},{1228,301},{1227,302},{1226,302},{1224,298},{1223,299},{1225,299},{1224,299},{1223,298},{1223,300},{1219,292},{1220,291},{1221,292},{1218,293},{1220,294},{1220,293},{1222,295},{1220,295},{1216,295},{1217,295},{1217,296},{1222,296},{1221,296},{1222,294},{1222,298},{1222,297},{1223,297},{1220,297},{1220,298},{1219,297},{1219,298},{1221,298},{1219,300},{1218,300},{1218,301},{1219,301},{1221,300},{1220,301},{1222,301},{1221,302},{1222,302},{1220,302},{1219,299},{1220,300},{1220,299},{1222,299},{1222,300},{1219,302},{1228,308},{1227,308},{1227,309},{1224,307},{1224,308},{1226,308},{1227,307},{1225,307},{1226,306},{1226,307},{1223,306},{1225,306},{1225,308},{1225,302},{1219,303},{1225,304},{1224,304},{1223,304},{1223,305},{1221,303},{1220,303},{1224,303},{1223,302},{1223,303},{1224,302},{1222,303},{1224,306},{1221,306},{1220,306},{1216,306}}}, + {"Pacific/Kwajalein",15,{{1668,93},{1669,93},{1676,90},{1675,91},{1673,91},{1674,91},{1672,91},{1673,93},{1677,87},{1677,88},{1676,88},{1677,89},{1678,89},{1671,93},{1675,94}}}, + {"America/St_Johns",398,{{-536,493},{-550,494},{-539,488},{-538,488},{-582,491},{-536,491},{-537,490},{-583,491},{-584,491},{-537,489},{-538,489},{-538,490},{-584,492},{-535,492},{-583,492},{-535,493},{-551,493},{-552,493},{-552,494},{-550,493},{-547,494},{-548,494},{-551,494},{-557,494},{-553,494},{-549,494},{-542,494},{-542,495},{-544,494},{-544,495},{-550,495},{-549,495},{-554,495},{-548,495},{-542,478},{-541,478},{-536,480},{-528,481},{-528,482},{-535,482},{-537,485},{-592,486},{-537,488},{-542,474},{-536,481},{-539,481},{-540,482},{-536,486},{-538,487},{-539,487},{-538,486},{-537,486},{-537,487},{-536,487},{-536,488},{-536,489},{-539,489},{-558,468},{-558,469},{-537,470},{-537,471},{-552,470},{-536,471},{-536,472},{-528,472},{-528,473},{-559,473},{-560,473},{-548,473},{-548,472},{-550,473},{-549,473},{-558,474},{-546,473},{-547,473},{-549,474},{-548,474},{-530,475},{-530,476},{-590,476},{-560,476},{-554,476},{-560,477},{-538,478},{-560,478},{-559,478},{-559,477},{-542,476},{-550,476},{-574,476},{-543,476},{-529,477},{-529,476},{-577,476},{-578,476},{-575,476},{-561,476},{-562,476},{-552,476},{-553,476},{-583,477},{-580,477},{-559,476},{-561,477},{-562,477},{-543,477},{-542,477},{-540,474},{-539,474},{-547,474},{-557,474},{-541,475},{-562,475},{-574,475},{-544,475},{-542,475},{-559,475},{-557,475},{-556,475},{-573,475},{-554,475},{-543,475},{-541,477},{-543,474},{-544,474},{-558,478},{-553,520},{-554,519},{-554,520},{-557,524},{-558,524},{-558,523},{-557,523},{-560,525},{-558,525},{-559,526},{-558,526},{-559,525},{-562,525},{-561,525},{-561,526},{-557,525},{-557,526},{-560,526},{-558,527},{-559,527},{-560,527},{-559,528},{-560,528},{-558,528},{-559,520},{-558,520},{-557,522},{-556,522},{-556,523},{-559,536},{-559,537},{-563,537},{-560,537},{-558,529},{-559,529},{-559,530},{-558,530},{-557,531},{-558,531},{-557,532},{-557,533},{-558,533},{-558,534},{-559,534},{-560,535},{-561,535},{-562,535},{-559,535},{-560,536},{-558,535},{-557,535},{-557,495},{-547,495},{-555,495},{-546,495},{-551,495},{-556,495},{-557,496},{-554,516},{-556,513},{-560,514},{-561,513},{-557,511},{-561,507},{-561,509},{-563,509},{-567,501},{-566,501},{-569,498},{-568,497},{-569,495},{-562,502},{-561,501},{-562,499},{-560,500},{-555,500},{-561,497},{-562,496},{-559,497},{-562,494},{-558,495},{-556,494},{-555,494},{-554,493},{-553,493},{-553,495},{-552,495},{-554,490},{-551,492},{-549,493},{-548,493},{-545,496},{-545,493},{-541,495},{-536,490},{-542,488},{-541,487},{-540,486},{-542,484},{-538,485},{-539,484},{-536,485},{-537,484},{-535,486},{-533,485},{-530,487},{-532,483},{-537,481},{-539,480},{-539,479},{-540,479},{-537,475},{-533,480},{-529,481},{-533,476},{-531,474},{-528,478},{-526,475},{-531,467},{-534,468},{-536,466},{-535,469},{-537,468},{-535,470},{-534,472},{-542,468},{-540,472},{-539,473},{-540,473},{-538,474},{-541,479},{-543,479},{-545,474},{-544,476},{-553,469},{-560,470},{-547,477},{-551,476},{-550,478},{-549,478},{-551,477},{-555,477},{-556,474},{-556,476},{-558,475},{-557,476},{-559,474},{-560,475},{-556,477},{-557,478},{-557,479},{-558,480},{-562,479},{-563,476},{-563,478},{-564,476},{-566,477},{-565,476},{-569,475},{-572,477},{-572,476},{-573,477},{-573,478},{-579,477},{-584,477},{-583,478},{-585,476},{-593,476},{-593,478},{-592,478},{-594,479},{-583,485},{-592,485},{-588,488},{-590,486},{-587,486},{-581,490},{-579,490},{-579,491},{-579,492},{-581,492},{-583,493},{-580,496},{-579,494},{-577,495},{-580,497},{-578,499},{-578,498},{-577,498},{-577,500},{-576,500},{-574,506},{-572,506},{-574,507},{-569,509},{-571,510},{-569,510},{-566,514},{-559,516},{-559,515},{-539,495},{-556,496},{-543,495},{-543,496},{-538,496},{-546,497},{-545,497},{-548,497},{-547,497},{-567,497},{-532,497},{-532,498},{-559,498},{-568,498},{-557,502},{-558,502},{-573,506},{-559,502},{-556,507},{-556,508},{-555,508},{-555,507},{-572,508},{-559,495},{-558,496},{-548,496},{-547,496},{-550,496},{-539,496},{-546,496},{-549,496},{-559,496},{-559,512},{-560,512},{-544,496},{-544,497},{-558,497},{-541,497},{-540,496},{-543,497},{-556,509},{-556,510},{-555,510},{-569,511},{-568,511},{-568,512},{-557,512},{-558,512},{-560,513},{-555,515},{-554,515},{-559,513},{-556,516},{-555,516},{-558,516},{-573,535},{-571,536},{-563,536},{-559,533},{-562,530},{-562,528},{-565,526},{-556,524},{-561,524},{-562,524},{-558,522},{-557,521},{-571,514},{-571,528},{-575,530},{-575,534},{-573,508}}}, + {"Africa/Kigali",17,{{300,-23},{299,-27},{297,-28},{294,-28},{291,-26},{290,-27},{289,-25},{292,-21},{291,-19},{294,-15},{298,-13},{299,-15},{300,-14},{305,-11},{308,-16},{309,-23},{301,-24}}}, + {"Europe/Chisinau",30,{{300,465},{301,464},{296,464},{294,465},{293,464},{292,466},{289,465},{290,460},{285,457},{285,455},{282,455},{281,460},{283,466},{281,470},{276,473},{270,481},{266,483},{268,483},{267,484},{276,485},{284,482},{285,481},{286,482},{292,480},{293,478},{291,475},{294,473},{296,474},{296,470},{300,468}}}, + {"America/Noronha",3,{{-324,-38},{-324,-39},{-325,-39}}}, + {"Africa/Luanda",71,{{118,-168},{117,-166},{117,-165},{126,-61},{126,-60},{127,-60},{128,-60},{128,-44},{131,-46},{125,-51},{125,-57},{122,-58},{120,-50},{129,-60},{129,-59},{130,-60},{131,-90},{131,-89},{223,-106},{222,-109},{223,-112},{226,-110},{231,-111},{234,-109},{240,-110},{241,-124},{239,-128},{240,-130},{220,-130},{220,-162},{221,-165},{234,-176},{208,-180},{203,-179},{189,-178},{184,-174},{140,-174},{135,-170},{131,-170},{126,-172},{121,-171},{118,-173},{117,-159},{122,-152},{125,-134},{130,-130},{129,-128},{137,-122},{139,-110},{130,-91},{134,-87},{134,-84},{128,-70},{123,-61},{130,-59},{165,-59},{167,-62},{170,-72},{176,-81},{185,-79},{194,-80},{195,-70},{206,-69},{205,-73},{218,-73},{217,-79},{220,-85},{218,-94},{222,-99},{132,-88},{133,-88}}}, + {"Europe/Guernsey",7,{{-25,495},{-25,494},{-27,494},{-26,495},{-22,497},{-24,495},{-24,494}}}, + {"Europe/Paris",202,{{93,413},{92,413},{93,414},{94,430},{96,422},{92,414},{88,416},{89,417},{87,418},{88,419},{86,419},{87,421},{86,422},{87,423},{85,424},{87,426},{93,427},{-12,447},{-6,450},{-7,451},{-7,452},{-7,453},{-11,460},{-12,460},{-12,459},{-12,458},{-14,460},{-15,462},{-13,462},{-13,461},{-16,462},{53,433},{71,435},{70,435},{46,434},{58,431},{62,430},{64,430},{65,431},{65,430},{-50,484},{-29,476},{-28,476},{-51,485},{-50,485},{-49,480},{-42,479},{-42,478},{-34,476},{-35,476},{-45,483},{-49,483},{-48,484},{-49,484},{-39,487},{-40,487},{-36,488},{-32,489},{-30,489},{-30,488},{-18,489},{-31,473},{-32,473},{-32,474},{-29,473},{-30,474},{-29,474},{-23,467},{-24,467},{-22,470},{-22,469},{-23,470},{42,435},{40,436},{32,432},{30,430},{32,424},{27,423},{20,424},{17,426},{7,429},{7,427},{0,427},{-13,431},{-14,431},{-14,433},{-18,434},{-14,437},{-13,446},{-10,447},{-12,448},{-11,455},{-11,456},{-8,455},{-12,457},{-10,457},{-10,459},{-12,462},{-11,463},{-18,465},{-21,468},{-20,470},{-22,471},{-20,473},{-25,473},{-25,475},{-28,475},{-29,475},{-27,475},{-27,476},{-30,477},{-31,475},{-31,477},{-32,476},{-34,477},{-33,477},{-33,478},{-39,478},{-41,480},{-44,478},{-44,480},{-47,480},{-43,481},{-46,482},{-46,483},{-42,483},{-43,484},{-48,483},{-48,485},{-36,487},{-35,488},{-31,489},{-27,485},{-23,487},{-22,486},{-18,487},{-14,486},{-16,488},{-15,492},{-18,494},{-19,497},{-13,497},{-11,493},{-2,493},{4,494},{1,495},{2,497},{17,502},{15,503},{16,509},{25,511},{28,507},{31,508},{33,505},{36,505},{37,503},{42,503},{42,500},{49,502},{49,498},{55,495},{63,495},{65,494},{67,492},{74,492},{82,490},{78,486},{76,481},{76,476},{74,474},{70,475},{69,474},{71,473},{64,469},{60,462},{62,462},{65,465},{68,464},{68,462},{70,460},{68,458},{72,454},{71,452},{66,451},{70,448},{71,447},{68,445},{70,442},{77,442},{75,438},{67,434},{66,432},{54,432},{53,434},{48,433},{48,434},{47,434},{48,435},{47,435},{47,436},{20,425},{19,425}}}, + {"Africa/Abidjan",49,{{-61,50},{-62,49},{-75,44},{-76,49},{-74,53},{-74,58},{-78,60},{-79,63},{-86,65},{-83,70},{-85,76},{-82,75},{-81,80},{-79,80},{-80,82},{-82,82},{-82,85},{-76,84},{-78,88},{-80,88},{-77,91},{-79,92},{-78,94},{-81,95},{-82,100},{-76,105},{-70,102},{-69,104},{-67,104},{-66,107},{-64,106},{-63,107},{-62,102},{-57,105},{-52,103},{-50,99},{-44,96},{-39,99},{-32,99},{-28,94},{-27,95},{-28,91},{-25,83},{-28,79},{-33,66},{-30,57},{-28,56},{-27,51},{-40,52}}}, + {"America/Tortola",15,{{-646,183},{-646,184},{-645,184},{-648,184},{-648,185},{-647,184},{-644,187},{-643,188},{-643,187},{-644,185},{-643,185},{-644,184},{-645,185},{-646,185},{-647,185}}}, + {"Europe/Malta",6,{{145,359},{146,358},{144,358},{143,360},{143,361},{142,360}}}, + {"Europe/London",565,{{-64,499},{-63,499},{-47,516},{-32,541},{-32,540},{-33,541},{-57,544},{-56,544},{-55,547},{-56,545},{-57,545},{-74,549},{-70,552},{-61,552},{-57,548},{-59,546},{-56,547},{-54,545},{-55,543},{-57,546},{-58,543},{-61,540},{-63,542},{-63,541},{-66,540},{-70,544},{-73,541},{-76,541},{-82,545},{-77,546},{-79,547},{-75,547},{-74,550},{-73,551},{-73,550},{-51,553},{-51,552},{-56,553},{-62,553},{-63,553},{-51,555},{-52,556},{-52,554},{-54,556},{-53,557},{-61,556},{-62,556},{-57,556},{-58,556},{-18,557},{-19,557},{-63,560},{-62,560},{-72,575},{-63,557},{-63,558},{-65,557},{-61,559},{-60,557},{-63,556},{-57,557},{-49,557},{-50,557},{-49,558},{-52,558},{-51,558},{-52,559},{-50,558},{-26,562},{-58,560},{-60,558},{-61,558},{-57,562},{6,514},{-62,561},{-61,561},{-56,561},{-55,562},{-64,500},{-63,500},{-9,508},{-10,508},{-11,507},{-13,506},{-16,507},{-13,508},{-20,507},{-47,512},{7,514},{9,514},{8,514},{-53,517},{9,518},{10,518},{-53,519},{-54,519},{8,517},{7,517},{13,519},{12,519},{-48,528},{-48,527},{-6,537},{-5,537},{-46,533},{-44,534},{-40,533},{-43,531},{-46,532},{-47,533},{5,515},{6,515},{-58,562},{-56,562},{-58,563},{-55,564},{-56,564},{-64,564},{-64,563},{-56,563},{-68,565},{-69,564},{-70,565},{-68,566},{-67,565},{-54,565},{-54,566},{-67,566},{-77,568},{-76,568},{-58,568},{-59,568},{-63,568},{-62,568},{-76,569},{-65,567},{-66,566},{-59,567},{-60,567},{-61,565},{-64,565},{-63,565},{-62,564},{-63,564},{-73,572},{-59,573},{-58,573},{-60,573},{-72,573},{-65,573},{-58,574},{-74,574},{-72,574},{-58,572},{-58,571},{-73,571},{-63,571},{-63,569},{-65,570},{-64,571},{-62,565},{-63,566},{-61,567},{-57,564},{-63,563},{-60,564},{-60,565},{-56,565},{-55,566},{-55,565},{-60,566},{-75,569},{-61,569},{-62,569},{-74,569},{-74,570},{-76,570},{-73,570},{-75,571},{-75,570},{-74,571},{-65,571},{-66,570},{-66,571},{-62,572},{-73,574},{-74,572},{-72,571},{-86,578},{-87,578},{-85,579},{-14,601},{-29,588},{-30,587},{-30,588},{-32,588},{-31,588},{-32,589},{-30,589},{-31,587},{-26,590},{-27,589},{-61,591},{-62,591},{-58,591},{-44,591},{-28,591},{-28,590},{-29,590},{-29,591},{-30,591},{-29,594},{-29,593},{-26,592},{-28,592},{-27,592},{-27,591},{-28,593},{-12,605},{-26,593},{-24,593},{-30,593},{-30,594},{-29,592},{-17,595},{-16,596},{-16,595},{-24,594},{-25,594},{-26,591},{-25,591},{-30,592},{-31,592},{-11,601},{-10,602},{-10,601},{-13,601},{-12,602},{-11,602},{-16,602},{-15,603},{-17,603},{-10,603},{-9,604},{-11,604},{-10,604},{-14,603},{-8,606},{-9,606},{-10,606},{-8,608},{-8,607},{-10,607},{-9,607},{-9,608},{-8,604},{-12,604},{-11,605},{-13,605},{-14,605},{-14,604},{-16,605},{-13,606},{-11,607},{-10,605},{-12,600},{-14,600},{-13,600},{-21,601},{-21,602},{-29,589},{-33,589},{-54,580},{-13,604},{-13,599},{-14,599},{-13,603},{-15,601},{-15,604},{-33,588},{-34,589},{-77,575},{-76,575},{-32,592},{-31,590},{-34,590},{-27,516},{-34,514},{-38,516},{-43,516},{-41,517},{-43,518},{-49,516},{-51,517},{-49,517},{-51,519},{-42,523},{-39,526},{-41,526},{-39,528},{-42,528},{-41,529},{-42,532},{-33,534},{-33,533},{-31,532},{-32,534},{-30,534},{-29,533},{-28,533},{-27,533},{-31,536},{-28,537},{-31,538},{-30,539},{-29,539},{-29,540},{-28,542},{-31,542},{-36,545},{-34,549},{-31,550},{-36,550},{-36,549},{-40,548},{-41,549},{-41,548},{-42,549},{-45,549},{-44,547},{-49,549},{-50,548},{-49,546},{-52,549},{-51,550},{-50,549},{-50,551},{-46,555},{-49,559},{-45,559},{-49,560},{-48,562},{-49,562},{-50,559},{-51,560},{-51,559},{-52,560},{-53,559},{-53,560},{-49,563},{-54,560},{-53,558},{-56,554},{-55,554},{-58,553},{-55,558},{-54,559},{-57,558},{-55,563},{-57,563},{-52,566},{-53,567},{-50,567},{-52,567},{-51,568},{-52,569},{-53,569},{-57,565},{-55,567},{-62,567},{-57,568},{-57,569},{-59,569},{-58,570},{-56,570},{-55,570},{-57,571},{-55,571},{-54,571},{-57,572},{-54,573},{-55,573},{-57,573},{-55,574},{-54,574},{-58,576},{-56,575},{-55,575},{-57,577},{-58,579},{-52,578},{-54,579},{-51,578},{-55,581},{-52,582},{-53,582},{-54,582},{-54,583},{-49,582},{-52,584},{-50,584},{-51,585},{-50,586},{-47,586},{-48,584},{-44,586},{-45,584},{-30,586},{-31,584},{-41,580},{-40,579},{-44,579},{-41,578},{-38,579},{-45,575},{-33,577},{-18,576},{-18,575},{-20,574},{-21,571},{-26,567},{-24,567},{-25,566},{-34,564},{-28,565},{-29,564},{-26,563},{-34,560},{-37,560},{-38,561},{-39,561},{-31,559},{-27,561},{-21,559},{-16,556},{-16,552},{-12,547},{-12,546},{-6,545},{-1,541},{-2,540},{1,537},{1,536},{-3,537},{-7,537},{2,535},{3,531},{0,529},{4,528},{5,530},{13,529},{17,526},{16,521},{13,520},{11,520},{11,519},{12,518},{10,519},{9,517},{8,516},{9,516},{5,516},{3,514},{14,514},{14,512},{10,509},{-8,507},{-15,509},{-19,506},{-21,506},{-24,506},{-25,505},{-28,507},{-35,507},{-37,502},{-42,504},{-42,503},{-50,502},{-52,500},{-55,501},{-57,501},{-46,508},{-45,510},{-41,511},{-42,512},{-30,512},{-30,514},{-27,515},{-24,518},{-73,575},{-60,575},{-60,574},{-61,573},{-61,574},{-65,576},{-66,576},{-71,576},{-72,576},{-67,575},{-66,575},{-74,575},{-74,576},{-55,580},{-76,583},{-67,574},{-66,574},{-63,575},{-64,576},{-63,577},{-61,576},{-62,573},{-56,573},{-60,570},{-63,572},{-64,574},{-71,575},{-60,576},{-73,577},{-70,577},{-71,577},{-75,576},{-74,577},{-52,579},{-53,580},{-54,581},{-71,581},{-69,582},{-71,580},{-72,580},{-67,580},{-64,580},{-65,580},{-43,586},{-70,582},{-52,583},{-53,583},{-69,583},{-58,577},{-71,578},{-72,578},{-72,577},{-56,579},{-56,578},{-55,579},{-64,579},{-67,579},{-66,579},{-70,579},{-71,579},{-63,579},{-64,582},{-66,581},{-64,581},{-66,580},{-65,579},{-67,581},{-67,578},{-68,579},{-69,580},{-69,581},{-67,582},{-68,583},{-62,585},{-62,583},{-61,583}}}, + {"Pacific/Guadalcanal",261,{{1688,-123},{1622,-108},{1659,-108},{1660,-108},{1660,-107},{1659,-107},{1615,-105},{1605,-119},{1603,-116},{1599,-115},{1604,-117},{1606,-118},{1668,-117},{1668,-116},{1670,-117},{1669,-117},{1670,-116},{1598,-113},{1665,-113},{1664,-113},{1665,-112},{1624,-109},{1625,-109},{1657,-104},{1658,-104},{1614,-104},{1614,-103},{1662,-103},{1662,-102},{1657,-107},{1657,-106},{1625,-108},{1658,-106},{1660,-106},{1658,-108},{1657,-101},{1673,-100},{1619,-101},{1672,-100},{1672,-99},{1671,-99},{1671,-98},{1608,-98},{1620,-97},{1620,-98},{1620,-99},{1619,-97},{1609,-98},{1663,-102},{1617,-102},{1618,-103},{1617,-103},{1620,-103},{1620,-102},{1613,-101},{1621,-104},{1624,-108},{1616,-106},{1615,-103},{1613,-103},{1619,-102},{1662,-101},{1591,-90},{1592,-90},{1600,-90},{1607,-90},{1600,-89},{1601,-89},{1601,-90},{1608,-90},{1608,-89},{1607,-89},{1627,-84},{1583,-88},{1581,-88},{1581,-87},{1582,-88},{1582,-87},{1576,-88},{1575,-87},{1574,-87},{1576,-87},{1592,-91},{1610,-87},{1611,-88},{1610,-88},{1603,-92},{1613,-92},{1602,-92},{1588,-90},{1587,-90},{1612,-90},{1593,-90},{1590,-90},{1591,-92},{1591,-91},{1598,-91},{1594,-91},{1593,-91},{1604,-91},{1604,-92},{1603,-91},{1602,-91},{1601,-91},{1603,-90},{1590,-91},{1602,-90},{1615,-96},{1613,-96},{1613,-95},{1612,-95},{1608,-95},{1606,-95},{1615,-98},{1614,-97},{1613,-93},{1616,-96},{1600,-98},{1597,-97},{1596,-93},{1604,-94},{1608,-99},{1606,-99},{1614,-95},{1614,-94},{1612,-94},{1611,-94},{1611,-93},{1603,-93},{1604,-93},{1565,-83},{1571,-83},{1572,-83},{1574,-83},{1573,-83},{1575,-83},{1602,-83},{1602,-82},{1565,-82},{1578,-83},{1578,-82},{1570,-82},{1571,-82},{1593,-82},{1608,-83},{1572,-82},{1571,-81},{1577,-82},{1576,-82},{1583,-75},{1583,-74},{1555,-74},{1556,-74},{1582,-74},{1581,-74},{1555,-73},{1606,-83},{1576,-73},{1556,-71},{1557,-71},{1559,-69},{1558,-71},{1557,-70},{1559,-71},{1560,-70},{1558,-70},{1559,-70},{1576,-74},{1572,-73},{1572,-74},{1571,-74},{1571,-73},{1579,-75},{1580,-74},{1580,-75},{1582,-75},{1578,-75},{1577,-75},{1577,-74},{1578,-74},{1575,-74},{1574,-74},{1595,-55},{1597,-55},{1594,-51},{1594,-54},{1594,-55},{1560,-69},{1561,-68},{1561,-69},{1560,-68},{1564,-67},{1566,-67},{1570,-73},{1561,-67},{1596,-81},{1595,-81},{1568,-80},{1568,-81},{1590,-81},{1576,-81},{1576,-80},{1569,-81},{1566,-81},{1566,-82},{1565,-79},{1566,-80},{1606,-79},{1566,-78},{1586,-77},{1567,-80},{1565,-78},{1570,-80},{1570,-79},{1572,-79},{1565,-77},{1566,-76},{1568,-77},{1585,-77},{1587,-75},{1585,-76},{1584,-77},{1584,-76},{1588,-76},{1587,-76},{1583,-76},{1584,-75},{1573,-84},{1573,-87},{1572,-86},{1573,-85},{1599,-85},{1599,-86},{1582,-86},{1580,-88},{1579,-87},{1580,-85},{1581,-86},{1582,-85},{1598,-85},{1579,-84},{1579,-83},{1581,-85},{1576,-84},{1596,-84},{1597,-85},{1597,-86},{1595,-85},{1580,-84},{1598,-84},{1575,-84},{1614,-96},{1608,-91},{1607,-83},{1610,-86},{1609,-88},{1575,-79},{1579,-85},{1578,-87},{1599,-84},{1589,-80}}}, + {"Pacific/Gambier",15,{{-1356,-215},{-1362,-220},{-1355,-215},{-1350,-231},{-1349,-231},{-1364,-215},{-1364,-214},{-1366,-213},{-1365,-213},{-1365,-214},{-1367,-213},{-1368,-213},{-1349,-232},{-1351,-232},{-1351,-231}}}, + {"America/Thule",117,{{-718,774},{-713,774},{-726,774},{-723,775},{-710,774},{-701,774},{-731,767},{-730,767},{-733,767},{-732,767},{-669,776},{-666,776},{-668,776},{-729,781},{-661,775},{-662,774},{-663,775},{-662,775},{-666,775},{-665,775},{-667,775},{-729,784},{-728,784},{-669,791},{-673,791},{-674,791},{-667,792},{-666,792},{-670,791},{-670,792},{-703,768},{-702,768},{-728,774},{-651,760},{-652,760},{-650,760},{-658,760},{-657,760},{-687,761},{-641,761},{-640,761},{-637,761},{-660,761},{-659,760},{-661,761},{-649,761},{-658,761},{-659,761},{-700,764},{-702,764},{-699,764},{-700,766},{-701,766},{-695,766},{-697,765},{-692,767},{-693,767},{-726,767},{-725,767},{-729,767},{-728,767},{-638,762},{-641,762},{-641,763},{-643,764},{-644,762},{-647,763},{-646,761},{-655,760},{-655,762},{-657,763},{-662,763},{-664,761},{-669,763},{-673,762},{-665,759},{-685,761},{-684,762},{-696,764},{-679,767},{-701,768},{-699,770},{-706,768},{-710,769},{-707,769},{-714,770},{-702,772},{-681,772},{-691,773},{-683,774},{-662,773},{-666,774},{-660,775},{-670,777},{-678,775},{-684,775},{-687,777},{-688,777},{-686,775},{-702,776},{-703,776},{-695,777},{-707,777},{-702,778},{-703,779},{-713,778},{-714,778},{-712,779},{-722,779},{-723,780},{-723,781},{-730,782},{-727,782},{-726,785},{-693,788},{-686,790},{-664,791}}}, + {"America/Rankin_Inlet",1245,{{-852,688},{-886,567},{-886,568},{-887,568},{-906,572},{-907,572},{-908,573},{-909,573},{-929,582},{-930,584},{-931,584},{-945,588},{-950,590},{-948,591},{-948,590},{-949,591},{-948,593},{-947,594},{-948,597},{-936,588},{-937,588},{-938,588},{-933,588},{-948,598},{-947,598},{-880,642},{-899,641},{-897,641},{-898,641},{-886,640},{-895,640},{-871,650},{-869,652},{-883,654},{-882,654},{-890,654},{-891,654},{-884,654},{-884,655},{-885,655},{-890,657},{-892,658},{-899,658},{-900,658},{-897,659},{-897,658},{-896,659},{-850,662},{-851,662},{-853,663},{-859,665},{-867,665},{-863,665},{-851,669},{-850,669},{-871,672},{-872,672},{-872,673},{-874,673},{-866,674},{-874,672},{-873,672},{-865,675},{-866,676},{-866,677},{-863,680},{-860,680},{-860,681},{-876,681},{-877,682},{-872,683},{-858,684},{-857,684},{-867,683},{-864,682},{-863,679},{-865,677},{-869,679},{-868,680},{-869,681},{-853,688},{-851,688},{-854,688},{-850,688},{-852,689},{-850,689},{-925,636},{-925,635},{-916,636},{-902,636},{-903,636},{-915,636},{-904,636},{-905,636},{-906,636},{-907,636},{-913,636},{-907,635},{-911,636},{-912,636},{-914,635},{-914,637},{-901,637},{-921,637},{-900,637},{-900,638},{-928,638},{-935,639},{-930,639},{-931,639},{-899,639},{-900,639},{-901,639},{-929,638},{-929,639},{-928,639},{-915,637},{-937,639},{-936,639},{-893,639},{-933,639},{-932,639},{-894,639},{-936,640},{-935,640},{-900,640},{-896,639},{-896,640},{-890,640},{-891,640},{-893,640},{-894,640},{-892,640},{-895,639},{-874,711},{-898,640},{-899,640},{-897,640},{-938,612},{-939,612},{-940,611},{-941,611},{-940,612},{-941,612},{-941,613},{-942,614},{-943,614},{-937,614},{-938,614},{-939,615},{-939,614},{-938,615},{-932,618},{-933,618},{-934,618},{-929,618},{-930,618},{-927,618},{-927,619},{-936,619},{-935,619},{-935,618},{-929,620},{-928,620},{-925,620},{-931,620},{-930,620},{-929,621},{-927,620},{-927,621},{-926,620},{-928,619},{-930,619},{-931,619},{-933,619},{-931,618},{-929,619},{-932,619},{-923,628},{-922,627},{-931,622},{-932,622},{-925,622},{-929,622},{-927,622},{-927,623},{-928,623},{-921,624},{-926,625},{-926,624},{-921,623},{-922,623},{-924,625},{-925,625},{-926,626},{-922,626},{-910,627},{-919,627},{-920,627},{-917,627},{-916,627},{-918,627},{-923,627},{-922,628},{-911,627},{-913,627},{-912,627},{-912,628},{-913,628},{-921,629},{-921,628},{-907,630},{-906,631},{-918,628},{-919,628},{-920,628},{-906,632},{-906,633},{-907,633},{-905,634},{-906,634},{-909,634},{-908,634},{-910,635},{-911,635},{-913,635},{-912,635},{-918,626},{-916,626},{-917,626},{-930,621},{-931,621},{-925,621},{-906,635},{-853,699},{-854,699},{-860,720},{-861,720},{-853,712},{-853,713},{-857,722},{-858,722},{-867,702},{-868,702},{-869,700},{-872,700},{-874,701},{-864,700},{-869,701},{-873,702},{-874,702},{-872,702},{-870,704},{-875,710},{-872,710},{-876,710},{-876,711},{-851,712},{-852,712},{-869,702},{-854,712},{-850,712},{-855,697},{-854,697},{-850,698},{-1006,732},{-1005,732},{-969,732},{-970,732},{-971,733},{-972,733},{-957,735},{-957,734},{-970,733},{-982,730},{-981,731},{-980,731},{-957,730},{-981,730},{-980,730},{-956,726},{-970,727},{-970,728},{-969,727},{-965,728},{-964,726},{-958,729},{-956,728},{-969,728},{-967,729},{-966,728},{-958,730},{-959,730},{-967,731},{-965,730},{-971,730},{-992,742},{-991,742},{-988,743},{-985,743},{-986,743},{-1010,736},{-1011,737},{-1012,737},{-993,738},{-992,738},{-1008,739},{-1007,739},{-1011,738},{-900,741},{-899,740},{-903,740},{-902,741},{-952,740},{-953,740},{-972,739},{-973,739},{-990,740},{-980,741},{-976,741},{-984,739},{-994,739},{-876,756},{-877,756},{-875,756},{-885,747},{-886,747},{-962,747},{-961,747},{-974,739},{-969,737},{-977,735},{-972,735},{-971,734},{-985,730},{-973,730},{-1001,732},{-1003,734},{-1009,733},{-1016,735},{-1009,736},{-1005,735},{-1005,736},{-1005,739},{-1000,738},{-998,739},{-1003,739},{-1001,739},{-991,737},{-973,735},{-974,735},{-1007,736},{-956,736},{-957,736},{-963,748},{-964,748},{-983,747},{-983,748},{-981,747},{-886,748},{-885,748},{-1020,760},{-1020,759},{-1009,755},{-1008,755},{-1014,755},{-1015,755},{-1012,755},{-1013,755},{-1011,755},{-1007,755},{-1006,755},{-1005,755},{-1007,756},{-1010,756},{-1003,756},{-1001,756},{-965,758},{-965,757},{-967,757},{-964,758},{-955,757},{-954,757},{-973,755},{-972,755},{-1000,756},{-969,756},{-968,757},{-1000,757},{-999,757},{-998,757},{-986,750},{-985,750},{-977,750},{-976,750},{-971,752},{-972,753},{-973,753},{-971,753},{-975,753},{-976,753},{-976,754},{-1006,754},{-965,754},{-1004,755},{-1003,755},{-964,755},{-976,755},{-964,756},{-965,755},{-967,754},{-966,754},{-968,754},{-970,755},{-963,757},{-959,756},{-961,755},{-963,758},{-947,760},{-944,760},{-943,758},{-948,758},{-949,759},{-958,759},{-959,760},{-957,760},{-976,760},{-1001,760},{-1002,760},{-904,761},{-903,761},{-905,761},{-948,760},{-948,761},{-947,761},{-950,760},{-951,761},{-949,761},{-1004,762},{-1003,762},{-970,762},{-969,762},{-973,746},{-974,745},{-978,745},{-974,746},{-917,815},{-919,815},{-920,816},{-916,816},{-906,816},{-905,816},{-957,746},{-955,746},{-952,745},{-958,746},{-959,771},{-958,772},{-957,772},{-958,771},{-1018,782},{-1017,782},{-1016,782},{-1012,790},{-1013,790},{-1015,791},{-1014,791},{-970,781},{-913,772},{-909,773},{-907,772},{-909,771},{-873,772},{-874,772},{-952,772},{-953,772},{-954,772},{-959,772},{-960,772},{-855,774},{-855,775},{-854,775},{-850,775},{-852,775},{-850,776},{-937,774},{-938,774},{-936,774},{-964,776},{-900,772},{-910,773},{-912,774},{-912,776},{-902,776},{-896,773},{-856,777},{-853,778},{-852,778},{-1020,779},{-1013,778},{-1009,777},{-1020,777},{-967,778},{-968,778},{-952,778},{-953,778},{-950,775},{-963,776},{-955,778},{-931,777},{-954,778},{-931,793},{-932,793},{-947,793},{-948,793},{-946,793},{-945,793},{-954,793},{-953,793},{-954,794},{-976,794},{-977,794},{-1001,801},{-1002,801},{-893,818},{-894,819},{-895,819},{-893,819},{-906,819},{-907,819},{-905,819},{-898,819},{-899,819},{-998,801},{-989,801},{-986,798},{-989,797},{-1002,799},{-1002,800},{-992,802},{-994,801},{-994,802},{-976,796},{-977,796},{-975,796},{-972,796},{-971,796},{-947,797},{-963,798},{-965,798},{-966,798},{-850,796},{-864,798},{-864,799},{-862,800},{-865,800},{-867,802},{-864,803},{-850,803},{-964,798},{-949,801},{-948,801},{-885,801},{-887,802},{-885,802},{-963,805},{-962,805},{-953,808},{-954,808},{-950,807},{-952,806},{-961,807},{-952,807},{-953,809},{-954,809},{-944,810},{-945,810},{-916,815},{-920,815},{-918,815},{-891,819},{-892,819},{-893,820},{-892,820},{-850,819},{-851,820},{-850,820},{-866,821},{-869,822},{-857,822},{-854,823},{-859,824},{-850,825},{-850,811},{-861,810},{-873,806},{-895,809},{-858,811},{-860,811},{-850,813},{-850,810},{-850,805},{-859,805},{-856,806},{-868,806},{-857,810},{-943,810},{-942,810},{-944,811},{-943,811},{-936,812},{-937,812},{-851,810},{-869,811},{-870,811},{-868,811},{-884,764},{-885,764},{-887,765},{-888,765},{-986,766},{-985,767},{-989,767},{-977,765},{-978,763},{-975,761},{-976,759},{-979,757},{-973,757},{-973,754},{-977,756},{-977,755},{-980,755},{-978,754},{-981,753},{-976,751},{-981,752},{-980,750},{-999,750},{-1004,750},{-1005,752},{-1000,752},{-1008,754},{-1000,755},{-997,757},{-1020,755},{-1012,757},{-1016,759},{-1014,760},{-1019,761},{-1016,762},{-1020,762},{-1020,764},{-1013,764},{-1011,763},{-1011,762},{-999,759},{-996,759},{-1002,761},{-997,761},{-994,762},{-1000,763},{-1010,765},{-997,766},{-991,764},{-988,765},{-990,766},{-897,810},{-903,812},{-889,812},{-900,813},{-888,815},{-873,815},{-883,816},{-904,814},{-909,814},{-895,816},{-903,817},{-914,815},{-889,818},{-888,819},{-891,820},{-881,821},{-868,819},{-872,820},{-863,820},{-854,818},{-858,820},{-852,820},{-944,792},{-943,792},{-946,792},{-850,781},{-850,782},{-998,784},{-997,784},{-945,783},{-943,782},{-947,783},{-946,783},{-980,782},{-881,784},{-882,783},{-884,783},{-882,784},{-959,785},{-984,788},{-985,788},{-863,790},{-858,791},{-852,790},{-865,789},{-850,783},{-855,781},{-863,781},{-859,783},{-860,783},{-867,781},{-875,781},{-871,782},{-875,782},{-875,784},{-868,788},{-852,789},{-850,789},{-853,777},{-857,779},{-975,763},{-1010,763},{-1009,763},{-1008,763},{-1007,763},{-1006,763},{-1007,764},{-1006,764},{-952,763},{-953,763},{-962,763},{-962,764},{-980,765},{-981,766},{-978,765},{-980,766},{-964,766},{-852,690},{-950,783},{-954,782},{-949,781},{-951,779},{-971,778},{-970,779},{-978,780},{-969,781},{-979,782},{-978,782},{-984,785},{-980,785},{-975,788},{-948,784},{-1020,791},{-1010,789},{-1012,788},{-1004,788},{-999,787},{-1000,786},{-995,786},{-999,784},{-989,781},{-991,780},{-990,779},{-1003,778},{-1006,779},{-1010,782},{-1020,783},{-900,785},{-894,782},{-902,783},{-904,783},{-904,781},{-921,782},{-930,785},{-916,785},{-933,786},{-938,788},{-930,788},{-943,790},{-934,792},{-907,792},{-927,793},{-920,793},{-926,794},{-922,794},{-924,795},{-939,793},{-943,793},{-938,794},{-944,794},{-952,793},{-952,794},{-957,794},{-958,795},{-943,797},{-959,796},{-966,799},{-962,799},{-967,800},{-964,800},{-968,801},{-944,800},{-941,802},{-953,801},{-957,802},{-953,802},{-952,802},{-967,803},{-954,803},{-961,805},{-959,805},{-960,806},{-938,805},{-947,807},{-941,807},{-956,808},{-949,811},{-939,810},{-931,811},{-931,812},{-944,812},{-933,814},{-918,812},{-919,811},{-906,806},{-908,806},{-892,805},{-890,804},{-893,804},{-891,803},{-893,803},{-888,801},{-882,801},{-887,803},{-886,804},{-877,804},{-876,802},{-881,801},{-869,799},{-871,796},{-874,796},{-873,795},{-867,797},{-860,795},{-857,796},{-850,793},{-853,792},{-870,790},{-870,789},{-876,786},{-880,788},{-879,790},{-882,790},{-882,788},{-881,787},{-884,787},{-879,786},{-882,785},{-886,786},{-888,786},{-885,784},{-888,781},{-900,786},{-891,763},{-892,763},{-972,766},{-971,766},{-960,765},{-959,765},{-971,765},{-972,765},{-894,764},{-896,764},{-895,765},{-913,765},{-914,765},{-905,765},{-904,765},{-850,745},{-885,745},{-897,745},{-910,747},{-908,749},{-912,747},{-911,746},{-919,747},{-923,751},{-920,751},{-925,752},{-924,755},{-920,756},{-922,757},{-921,758},{-927,760},{-931,764},{-954,762},{-948,763},{-961,765},{-958,765},{-956,766},{-970,767},{-963,768},{-969,770},{-957,771},{-937,769},{-932,767},{-933,765},{-937,764},{-936,764},{-931,766},{-910,767},{-916,765},{-893,763},{-892,762},{-905,762},{-901,761},{-913,762},{-902,761},{-911,760},{-910,760},{-899,760},{-897,759},{-898,758},{-892,758},{-893,756},{-896,756},{-889,754},{-887,755},{-889,756},{-888,757},{-883,755},{-874,755},{-873,756},{-863,754},{-865,754},{-850,757},{-1018,766},{-1017,766},{-993,766},{-994,766},{-992,766},{-1004,767},{-1003,767},{-1009,767},{-991,767},{-992,767},{-990,767},{-989,766},{-997,767},{-1012,768},{-1013,768},{-1000,768},{-996,768},{-994,767},{-1001,767},{-1000,767},{-1002,767},{-974,770},{-971,770},{-975,770},{-952,770},{-900,768},{-897,767},{-899,766},{-897,765},{-901,765},{-906,767},{-967,767},{-965,766},{-966,766},{-972,769},{-943,769},{-944,769},{-942,769},{-967,768},{-968,768},{-971,768},{-972,768},{-970,768},{-969,769},{-970,769},{-850,717},{-853,717},{-855,721},{-855,723},{-850,723},{-857,723},{-856,722},{-861,723},{-862,723},{-859,723},{-858,723},{-860,723},{-850,724},{-851,724},{-850,766},{-850,763},{-852,763},{-865,765},{-867,763},{-871,764},{-875,765},{-874,764},{-883,764},{-886,767},{-885,765},{-886,764},{-887,764},{-886,766},{-889,764},{-897,766},{-894,767},{-895,768},{-890,770},{-887,770},{-884,771},{-885,771},{-866,772},{-872,772},{-869,773},{-872,773},{-868,773},{-877,774},{-877,775},{-882,777},{-881,778},{-882,779},{-873,779},{-862,778},{-857,775},{-858,774},{-850,774},{-955,726},{-850,701},{-862,701},{-866,704},{-863,705},{-864,705},{-867,704},{-866,703},{-870,705},{-872,704},{-870,703},{-878,702},{-888,705},{-894,709},{-892,710},{-895,711},{-870,710},{-878,713},{-899,714},{-900,716},{-898,718},{-901,719},{-896,722},{-899,722},{-899,724},{-895,727},{-896,728},{-892,728},{-894,728},{-891,732},{-880,736},{-865,739},{-850,738},{-850,737},{-861,733},{-867,727},{-862,724},{-865,722},{-864,720},{-855,715},{-850,714},{-850,713},{-868,710},{-851,711},{-850,711},{-850,732},{-852,732},{-850,734},{-855,725},{-856,725},{-855,726},{-857,726},{-857,729},{-850,729},{-953,726},{-954,726},{-897,726},{-897,727},{-896,727},{-943,727},{-942,727},{-859,727},{-859,728},{-941,727},{-850,730},{-851,730},{-855,730},{-851,731},{-950,737},{-949,737},{-954,738},{-854,689},{-902,640},{-901,638},{-907,637},{-909,636},{-914,638},{-922,637},{-934,640},{-941,640},{-937,640},{-933,638},{-926,635},{-917,637},{-907,634},{-914,628},{-924,628},{-927,626},{-923,624},{-927,625},{-928,624},{-926,623},{-931,623},{-932,620},{-933,620},{-935,621},{-935,620},{-938,620},{-939,620},{-933,617},{-942,613},{-943,613},{-940,614},{-941,614},{-938,613},{-942,611},{-947,605},{-948,600},{-1020,600},{-1020,670},{-890,670},{-890,693},{-879,687},{-878,683},{-879,682},{-882,682},{-882,684},{-884,683},{-883,681},{-884,680},{-881,677},{-873,673},{-875,671},{-872,671},{-869,672},{-870,674},{-865,673},{-859,681},{-856,687},{-850,670},{-852,669},{-850,663},{-852,663},{-854,666},{-866,663},{-859,662},{-864,659},{-865,657},{-873,653},{-880,653},{-888,656},{-884,656},{-898,660},{-900,659},{-904,659},{-902,659},{-915,660},{-910,658},{-911,659},{-890,653},{-869,651},{-879,643},{-882,643},{-881,641},{-887,641},{-888,641},{-888,640},{-892,641},{-898,642},{-900,642},{-901,641},{-851,689},{-851,690},{-850,690},{-853,689},{-853,690},{-853,691},{-951,738},{-935,742},{-926,741},{-923,739},{-916,740},{-902,739},{-915,732},{-913,732},{-921,728},{-943,728},{-937,727},{-938,726},{-935,725},{-939,722},{-952,724},{-951,725},{-956,731},{-958,731},{-955,732},{-957,737},{-946,737},{-854,690},{-850,691},{-851,691},{-851,692},{-854,691},{-855,691},{-852,691},{-850,692},{-854,693},{-853,693},{-855,694},{-853,694},{-855,695},{-853,696},{-855,698},{-852,698},{-856,698},{-855,699}}}, + {"America/Regina",17,{{-1050,490},{-1100,490},{-1100,527},{-1094,527},{-1092,529},{-1089,528},{-1088,530},{-1096,536},{-1100,536},{-1100,600},{-1020,600},{-1019,551},{-1025,548},{-1025,545},{-1018,541},{-1014,490},{-1078,503}}}, + {"America/Indiana/Vincennes",7,{{-877,384},{-875,387},{-875,389},{-867,389},{-867,382},{-871,382},{-871,385}}}, + {"America/Santarem",53,{{-530,0},{-526,-4},{-524,-11},{-521,-12},{-518,-12},{-519,-15},{-523,-17},{-520,-28},{-518,-32},{-519,-35},{-522,-32},{-526,-38},{-527,-45},{-529,-50},{-524,-63},{-520,-67},{-526,-72},{-529,-82},{-528,-85},{-521,-89},{-520,-93},{-522,-96},{-525,-96},{-526,-97},{-568,-94},{-576,-88},{-576,-82},{-585,-67},{-563,-22},{-567,-22},{-571,-18},{-577,-16},{-587,-6},{-590,13},{-588,12},{-585,13},{-583,16},{-580,15},{-580,17},{-575,17},{-573,20},{-560,18},{-559,20},{-561,23},{-560,25},{-554,24},{-549,26},{-547,24},{-547,18},{-544,18},{-534,13},{-534,9},{-531,7}}}, + {"Africa/Djibouti",14,{{432,114},{430,110},{426,111},{418,110},{418,117},{424,124},{427,124},{431,127},{434,124},{434,120},{425,116},{426,115},{431,116},{432,117}}}, + {"Pacific/Tahiti",289,{{-1462,-158},{-1506,-177},{-1506,-176},{-1476,-239},{-1477,-239},{-1477,-238},{-1513,-225},{-1514,-224},{-1547,-218},{-1406,-216},{-1406,-217},{-1407,-217},{-1443,-276},{-1443,-277},{-1444,-276},{-1476,-238},{-1494,-234},{-1495,-234},{-1528,-226},{-1529,-227},{-1529,-226},{-1385,-208},{-1385,-209},{-1431,-207},{-1433,-206},{-1391,-208},{-1392,-208},{-1435,-204},{-1436,-204},{-1450,-199},{-1449,-199},{-1404,-196},{-1387,-194},{-1404,-197},{-1392,-193},{-1392,-194},{-1393,-194},{-1388,-193},{-1412,-192},{-1413,-192},{-1407,-192},{-1407,-191},{-1454,-175},{-1455,-175},{-1418,-187},{-1392,-186},{-1365,-185},{-1363,-185},{-1363,-186},{-1422,-183},{-1421,-183},{-1421,-182},{-1408,-184},{-1407,-184},{-1408,-183},{-1371,-183},{-1370,-183},{-1370,-184},{-1422,-181},{-1424,-181},{-1424,-180},{-1422,-180},{-1481,-179},{-1406,-177},{-1406,-178},{-1408,-179},{-1431,-178},{-1431,-179},{-1408,-178},{-1407,-177},{-1422,-182},{-1410,-181},{-1409,-181},{-1408,-182},{-1388,-188},{-1418,-188},{-1434,-175},{-1435,-175},{-1435,-174},{-1455,-174},{-1415,-174},{-1384,-173},{-1384,-174},{-1426,-173},{-1443,-172},{-1383,-173},{-1385,-174},{-1456,-173},{-1456,-174},{-1414,-174},{-1415,-173},{-1414,-173},{-1455,-173},{-1385,-173},{-1444,-171},{-1443,-171},{-1496,-170},{-1495,-170},{-1431,-170},{-1446,-170},{-1447,-170},{-1454,-174},{-1446,-169},{-1419,-168},{-1540,-168},{-1514,-169},{-1447,-168},{-1443,-168},{-1450,-168},{-1514,-168},{-1515,-169},{-1515,-168},{-1430,-164},{-1539,-168},{-1449,-168},{-1428,-167},{-1429,-167},{-1429,-168},{-1510,-168},{-1509,-168},{-1451,-167},{-1451,-168},{-1510,-167},{-1429,-166},{-1428,-166},{-1438,-166},{-1437,-166},{-1442,-166},{-1436,-166},{-1442,-167},{-1546,-166},{-1546,-165},{-1547,-165},{-1438,-165},{-1454,-165},{-1518,-165},{-1515,-166},{-1452,-167},{-1441,-167},{-1440,-168},{-1453,-167},{-1454,-167},{-1515,-167},{-1444,-164},{-1432,-164},{-1431,-164},{-1435,-166},{-1434,-166},{-1434,-167},{-1433,-169},{-1432,-169},{-1448,-169},{-1491,-178},{-1496,-177},{-1496,-176},{-1493,-175},{-1426,-176},{-1425,-176},{-1426,-175},{-1499,-175},{-1498,-175},{-1498,-176},{-1427,-175},{-1409,-158},{-1518,-164},{-1517,-164},{-1517,-165},{-1522,-164},{-1523,-165},{-1523,-164},{-1443,-164},{-1455,-164},{-1455,-163},{-1431,-163},{-1518,-163},{-1518,-162},{-1424,-162},{-1425,-162},{-1432,-163},{-1424,-161},{-1425,-163},{-1448,-162},{-1401,-160},{-1402,-160},{-1452,-159},{-1452,-160},{-1459,-159},{-1459,-160},{-1457,-160},{-1456,-160},{-1456,-161},{-1450,-162},{-1463,-162},{-1464,-162},{-1464,-161},{-1449,-161},{-1448,-161},{-1450,-161},{-1458,-161},{-1457,-161},{-1425,-161},{-1408,-158},{-1460,-158},{-1424,-159},{-1424,-160},{-1423,-159},{-1423,-160},{-1546,-158},{-1545,-158},{-1446,-158},{-1447,-157},{-1446,-157},{-1469,-157},{-1469,-156},{-1455,-156},{-1462,-154},{-1462,-153},{-1464,-153},{-1462,-155},{-1455,-154},{-1454,-155},{-1455,-155},{-1483,-158},{-1482,-159},{-1483,-159},{-1451,-158},{-1452,-158},{-1451,-159},{-1465,-158},{-1463,-153},{-1472,-153},{-1466,-152},{-1466,-153},{-1477,-152},{-1478,-152},{-1468,-152},{-1483,-151},{-1482,-151},{-1474,-152},{-1473,-152},{-1479,-151},{-1476,-150},{-1475,-151},{-1474,-151},{-1472,-152},{-1445,-150},{-1446,-150},{-1477,-149},{-1477,-150},{-1481,-149},{-1480,-149},{-1478,-149},{-1479,-149},{-1487,-149},{-1388,-148},{-1486,-149},{-1480,-150},{-1474,-153},{-1475,-153},{-1452,-146},{-1451,-146},{-1464,-146},{-1464,-145},{-1451,-145},{-1462,-145},{-1450,-145},{-1463,-144},{-1462,-144},{-1450,-144},{-1460,-144},{-1460,-145},{-1459,-144},{-1461,-144},{-1449,-145},{-1459,-143},{-1458,-143},{-1458,-144},{-1412,-142},{-1413,-142},{-1414,-141},{-1412,-141},{-1449,-144},{-1452,-147},{-1453,-147},{-1440,-165},{-1439,-165},{-1442,-165},{-1454,-164},{-1453,-165}}}, + {"Europe/San_Marino",3,{{125,439},{124,439},{125,440}}}, + {"America/Argentina/San_Luis",13,{{-658,-319},{-653,-321},{-652,-323},{-649,-323},{-649,-325},{-651,-332},{-651,-360},{-666,-360},{-665,-349},{-668,-344},{-668,-340},{-672,-334},{-674,-319}}}, + {"Africa/Ceuta",5,{{-24,352},{-30,353},{-29,353},{-54,359},{-53,359}}}, + {"Asia/Singapore",9,{{1037,12},{1038,12},{1038,13},{1040,14},{1039,14},{1037,13},{1041,14},{1036,13},{1038,15}}}, + {"America/Campo_Grande",40,{{-531,-180},{-530,-184},{-528,-184},{-529,-187},{-525,-187},{-509,-194},{-510,-202},{-516,-206},{-521,-217},{-524,-221},{-536,-229},{-537,-233},{-540,-234},{-541,-240},{-543,-241},{-547,-238},{-554,-240},{-557,-230},{-556,-227},{-559,-223},{-562,-223},{-564,-221},{-568,-223},{-580,-220},{-578,-210},{-582,-202},{-579,-200},{-581,-198},{-575,-182},{-577,-177},{-575,-180},{-571,-178},{-568,-173},{-561,-172},{-552,-177},{-546,-175},{-544,-177},{-541,-176},{-537,-173},{-540,-179}}}, + {"Africa/Tunis",64,{{111,334},{108,335},{109,336},{108,337},{109,337},{107,337},{107,339},{111,338},{110,346},{110,347},{111,347},{112,347},{113,348},{112,348},{89,375},{90,375},{109,371},{108,371},{98,372},{112,323},{103,317},{101,315},{103,308},{99,304},{96,302},{91,321},{84,325},{81,331},{77,333},{75,340},{83,346},{85,352},{83,353},{83,358},{84,364},{82,365},{92,372},{98,373},{99,373},{98,371},{103,372},{101,371},{104,367},{111,371},{111,368},{108,365},{105,364},{105,361},{107,358},{110,356},{112,352},{107,347},{101,343},{100,340},{104,336},{111,336},{113,333},{111,333},{112,332},{116,332},{115,327},{116,325},{110,357},{110,358}}}, + {"Europe/Copenhagen",191,{{105,550},{121,549},{121,550},{107,550},{107,549},{150,550},{147,551},{148,553},{152,551},{110,548},{110,549},{118,549},{118,550},{122,548},{120,546},{105,549},{114,550},{113,550},{104,548},{103,549},{102,550},{105,548},{106,549},{117,549},{119,547},{115,546},{112,548},{112,550},{111,549},{111,548},{115,549},{120,549},{120,550},{116,549},{114,549},{104,550},{115,550},{116,550},{119,550},{128,556},{127,556},{128,557},{117,562},{118,562},{110,572},{109,573},{112,573},{111,573},{116,567},{115,567},{117,567},{108,561},{83,555},{108,555},{105,555},{97,555},{126,556},{125,556},{126,557},{102,556},{121,557},{118,558},{119,558},{83,560},{103,557},{102,558},{103,558},{113,558},{101,558},{100,558},{101,559},{106,559},{107,559},{106,558},{105,560},{112,559},{111,559},{108,559},{104,559},{104,560},{85,552},{86,552},{86,551},{85,551},{96,551},{95,551},{117,552},{114,552},{115,552},{112,552},{98,550},{100,550},{101,549},{108,548},{107,547},{106,548},{110,552},{103,550},{123,550},{122,551},{126,550},{106,550},{106,551},{96,554},{97,553},{96,553},{95,553},{97,552},{94,550},{97,550},{98,548},{87,549},{86,554},{81,556},{81,560},{82,558},{84,559},{82,561},{82,566},{86,566},{82,568},{86,571},{94,572},{100,576},{107,577},{104,576},{106,572},{103,570},{103,567},{102,567},{110,564},{107,561},{104,562},{105,563},{103,562},{99,559},{100,557},{95,557},{99,556},{95,555},{101,551},{117,551},{112,551},{111,552},{122,550},{101,550},{107,551},{103,551},{102,551},{123,554},{125,553},{120,552},{116,551},{111,553},{112,554},{112,556},{109,557},{111,557},{115,559},{113,560},{118,560},{117,557},{118,557},{119,559},{121,558},{120,557},{119,557},{120,559},{119,560},{125,561},{122,555},{86,553},{85,553},{110,553},{99,552},{99,553},{98,553},{84,554},{84,555},{85,554},{97,554},{106,556},{107,556},{107,555},{106,555},{105,554},{109,553},{100,551},{103,556},{104,556},{105,556}}}, + {"Asia/Pontianak",110,{{1091,-1},{1142,-34},{1080,2},{1086,1},{1089,5},{1088,5},{1089,7},{1087,7},{1087,8},{1088,8},{1092,17},{1093,18},{1093,17},{1088,7},{1091,-13},{1092,-13},{1092,-12},{1093,-12},{1096,-13},{1094,-13},{1095,-10},{1098,-10},{1098,-11},{1093,-7},{1094,-7},{1093,-6},{1091,-2},{1134,-33},{1134,-32},{1102,-29},{1101,-29},{1101,-27},{1101,-28},{1100,-27},{1101,-26},{1101,-24},{1093,-17},{1087,-17},{1088,-17},{1091,-17},{1094,-17},{1092,-16},{1087,-16},{1088,-16},{1094,-15},{1090,-15},{1101,-14},{1092,-14},{1100,-14},{1093,-15},{1089,-16},{1089,-15},{1156,-15},{1154,-15},{1153,-20},{1146,-30},{1144,-35},{1141,-33},{1136,-35},{1136,-32},{1133,-33},{1130,-29},{1130,-31},{1126,-34},{1122,-33},{1119,-36},{1118,-35},{1118,-30},{1117,-28},{1115,-30},{1114,-29},{1107,-31},{1105,-29},{1103,-30},{1101,-20},{1099,-18},{1099,-12},{1100,-11},{1097,-9},{1093,-9},{1095,-7},{1096,-8},{1096,-7},{1091,-5},{1092,-2},{1092,1},{1089,3},{1090,15},{1093,19},{1096,21},{1095,19},{1097,16},{1106,9},{1112,11},{1118,10},{1125,16},{1130,16},{1130,14},{1137,12},{1141,15},{1137,6},{1144,5},{1149,7},{1151,4},{1149,3},{1149,-1},{1153,-1},{1152,-3},{1154,-8},{1158,-12}}}, + {"Asia/Dubai",82,{{524,241},{525,241},{533,241},{530,241},{530,242},{540,241},{540,242},{520,242},{541,242},{531,242},{534,242},{535,242},{515,244},{516,244},{538,241},{536,242},{538,243},{517,243},{526,243},{527,243},{531,244},{543,244},{542,243},{542,244},{543,243},{537,243},{532,243},{534,243},{533,243},{531,243},{536,243},{545,244},{517,245},{534,245},{545,245},{544,244},{534,244},{529,252},{529,251},{542,252},{558,257},{559,257},{550,259},{560,258},{556,255},{556,256},{557,256},{554,254},{555,255},{555,254},{558,247},{558,242},{560,241},{555,240},{556,238},{551,226},{526,229},{516,241},{519,239},{526,242},{536,240},{542,242},{541,243},{544,242},{547,248},{553,252},{562,261},{564,250},{561,247},{559,250},{523,245},{543,245},{544,245},{517,246},{546,246},{545,246},{526,248},{529,249},{546,247},{547,247},{548,248},{531,249}}}, + {"Africa/Khartoum",129,{{385,182},{385,181},{362,226},{362,227},{384,182},{384,181},{383,182},{377,187},{375,187},{376,187},{380,188},{381,188},{382,188},{374,191},{374,190},{374,189},{375,188},{377,188},{376,192},{378,192},{377,192},{372,208},{373,208},{371,211},{372,211},{369,221},{357,127},{351,117},{350,109},{348,107},{346,109},{343,106},{343,102},{341,95},{339,95},{339,102},{331,107},{332,122},{327,122},{327,120},{321,120},{323,117},{325,111},{312,98},{308,97},{299,103},{295,101},{295,98},{289,97},{287,93},{280,93},{279,96},{266,95},{263,97},{258,104},{251,103},{246,89},{241,87},{235,87},{236,90},{234,90},{237,93},{237,99},{229,109},{230,113},{226,116},{226,120},{225,120},{225,126},{222,128},{219,126},{218,128},{223,133},{221,138},{226,142},{224,145},{227,147},{227,149},{229,151},{229,156},{231,157},{240,157},{240,200},{250,200},{250,220},{313,220},{315,222},{314,220},{332,220},{336,217},{340,218},{342,222},{347,223},{350,229},{352,228},{356,231},{358,228},{368,222},{370,214},{373,211},{371,212},{372,196},{386,180},{383,176},{375,173},{374,170},{370,171},{370,163},{364,152},{365,138},{362,127},{368,221},{366,223},{367,223},{367,222},{366,224},{365,224},{364,226},{363,226},{364,227},{363,227},{361,227},{363,228},{362,228},{357,229},{363,229},{362,229},{361,228},{360,227}}}, + {"Europe/Helsinki",400,{{207,632},{207,633},{266,604},{265,604},{214,616},{216,616},{215,616},{214,617},{215,617},{276,604},{275,604},{275,605},{208,631},{209,630},{208,630},{230,598},{229,598},{210,606},{210,607},{214,612},{213,612},{215,612},{215,613},{212,609},{212,610},{210,608},{215,614},{214,615},{213,615},{237,642},{236,642},{244,647},{253,650},{249,650},{248,649},{246,650},{248,651},{251,650},{251,651},{252,653},{253,653},{253,654},{254,651},{253,651},{252,651},{249,654},{248,654},{250,654},{243,657},{242,658},{241,658},{250,656},{246,656},{246,657},{245,657},{249,656},{226,637},{225,638},{226,638},{228,639},{227,639},{233,639},{232,639},{232,640},{235,641},{237,641},{227,637},{228,637},{227,638},{228,638},{211,625},{211,626},{211,627},{210,627},{212,624},{213,624},{212,623},{213,621},{213,623},{216,617},{215,618},{214,618},{214,619},{213,618},{213,619},{211,628},{212,628},{211,629},{212,629},{214,629},{214,630},{213,630},{214,631},{212,630},{211,630},{216,631},{213,631},{215,631},{220,632},{215,632},{214,632},{222,633},{223,633},{270,604},{217,634},{216,634},{223,634},{222,634},{220,633},{221,633},{212,633},{212,634},{220,634},{221,634},{213,634},{212,632},{214,633},{213,632},{211,633},{213,633},{216,633},{217,633},{219,633},{218,633},{212,604},{213,604},{221,632},{214,634},{211,634},{218,634},{218,635},{221,635},{224,636},{224,635},{225,635},{274,604},{271,604},{269,604},{257,604},{264,604},{263,604},{218,604},{219,604},{267,604},{217,604},{216,604},{215,604},{261,604},{214,604},{262,604},{221,604},{222,604},{223,604},{225,604},{224,604},{220,604},{225,598},{225,599},{213,609},{212,608},{213,607},{214,608},{214,607},{213,608},{211,608},{212,605},{270,605},{271,605},{274,605},{273,605},{268,604},{216,605},{269,605},{218,605},{219,605},{268,605},{212,606},{218,606},{217,606},{213,606},{215,606},{214,606},{216,598},{217,598},{223,598},{224,598},{214,605},{217,605},{215,605},{213,605},{236,598},{224,599},{217,599},{236,599},{226,599},{230,599},{234,599},{222,599},{221,599},{222,598},{223,599},{233,599},{229,599},{238,599},{239,599},{237,599},{238,600},{227,599},{226,600},{223,600},{218,599},{218,600},{224,600},{225,600},{235,599},{231,599},{213,602},{212,602},{255,602},{254,602},{251,602},{221,602},{215,601},{215,602},{253,602},{259,602},{219,602},{222,602},{223,602},{220,603},{250,602},{214,602},{217,602},{216,602},{273,603},{271,603},{272,603},{266,603},{267,603},{212,603},{260,603},{261,603},{262,603},{230,603},{218,603},{215,603},{216,603},{213,603},{223,603},{219,603},{214,603},{217,603},{260,602},{256,602},{258,602},{257,602},{220,602},{224,602},{252,602},{225,602},{255,603},{258,603},{259,603},{252,603},{218,602},{222,603},{221,603},{256,603},{224,603},{225,603},{239,600},{240,600},{246,601},{228,600},{212,601},{213,601},{214,601},{228,601},{229,601},{247,601},{251,601},{224,601},{221,601},{223,601},{222,601},{219,601},{220,601},{218,601},{217,601},{216,601},{230,601},{212,600},{213,600},{243,600},{244,600},{227,600},{219,600},{242,600},{241,600},{229,600},{230,600},{250,601},{249,602},{249,601},{226,602},{211,603},{268,603},{264,603},{263,603},{265,605},{265,603},{248,602},{245,601},{243,601},{235,600},{232,598},{232,600},{233,601},{229,602},{227,604},{219,607},{215,607},{214,609},{213,611},{216,612},{215,615},{217,616},{213,620},{215,622},{212,626},{217,631},{215,633},{224,633},{222,635},{224,634},{223,635},{223,636},{229,637},{230,638},{231,639},{234,639},{234,641},{236,640},{245,648},{253,648},{252,650},{255,650},{253,655},{245,658},{239,661},{237,663},{236,664},{240,668},{236,672},{238,674},{234,675},{237,680},{228,684},{220,685},{206,691},{211,690},{210,692},{216,693},{224,687},{232,686},{240,688},{249,686},{251,688},{257,689},{259,697},{265,699},{280,701},{284,698},{291,697},{293,695},{288,692},{289,691},{284,689},{288,689},{285,685},{287,682},{293,681},{300,677},{290,669},{301,658},{301,657},{297,656},{299,656},{296,653},{299,651},{296,650},{298,648},{301,648},{301,644},{306,641},{300,638},{312,632},{316,629},{309,623},{277,605}}}, + {"America/Whitehorse",67,{{-1366,689},{-1365,689},{-1373,690},{-1372,690},{-1386,693},{-1389,694},{-1372,689},{-1364,689},{-1364,677},{-1362,676},{-1361,670},{-1338,670},{-1341,670},{-1336,666},{-1338,663},{-1336,663},{-1336,660},{-1323,660},{-1326,659},{-1322,656},{-1328,652},{-1323,651},{-1326,648},{-1317,645},{-1319,644},{-1312,644},{-1309,640},{-1301,639},{-1303,637},{-1298,635},{-1302,632},{-1296,631},{-1298,629},{-1295,626},{-1292,625},{-1293,624},{-1293,622},{-1285,621},{-1278,616},{-1272,615},{-1270,612},{-1271,611},{-1269,611},{-1268,608},{-1259,609},{-1253,608},{-1246,610},{-1245,608},{-1246,607},{-1242,605},{-1240,600},{-1391,600},{-1392,601},{-1391,604},{-1400,602},{-1410,603},{-1410,696},{-1398,696},{-1395,640},{-1394,641},{-1395,696},{-1393,695},{-1394,695},{-1391,695},{-1393,696},{-1391,696},{-1389,696}}}, + {"America/Maceio",18,{{-372,-112},{-364,-105},{-369,-107},{-374,-115},{-378,-115},{-382,-109},{-382,-107},{-378,-107},{-378,-101},{-380,-97},{-380,-95},{-382,-94},{-382,-93},{-378,-89},{-369,-94},{-364,-92},{-360,-89},{-352,-89}}}, + {"Africa/Douala",69,{{96,36},{85,47},{144,61},{146,59},{145,53},{147,52},{147,46},{151,43},{152,41},{151,40},{152,37},{161,29},{161,17},{146,22},{117,23},{114,23},{114,22},{99,22},{98,25},{100,31},{95,38},{97,39},{97,41},{94,39},{92,39},{86,47},{87,45},{85,45},{88,52},{88,58},{95,64},{97,65},{98,68},{102,70},{102,69},{105,69},{106,72},{111,65},{114,65},{116,70},{118,71},{118,73},{122,80},{122,84},{128,88},{129,94},{132,96},{132,100},{135,102},{137,110},{140,113},{141,113},{146,115},{147,122},{142,124},{141,131},{145,131},{146,128},{148,126},{151,118},{150,111},{151,105},{157,100},{142,100},{140,97},{145,90},{152,86},{156,78},{148,63}}}, + {"Asia/Kuala_Lumpur",93,{{1040,15},{1034,13},{1033,15},{1023,21},{1041,23},{1041,22},{1045,25},{1045,24},{1043,26},{1041,29},{1035,35},{1037,48},{1037,49},{1033,52},{1006,40},{1005,40},{1005,42},{1006,42},{1005,43},{1012,29},{1012,30},{1013,30},{1013,29},{1013,31},{1012,31},{1040,24},{1040,25},{1039,25},{1038,25},{1042,28},{1041,28},{1042,29},{1038,26},{1038,27},{1039,27},{989,57},{997,63},{999,63},{999,64},{996,64},{999,65},{997,62},{998,62},{1022,62},{998,63},{999,62},{1002,52},{1004,53},{1036,27},{1040,23},{1043,14},{1041,14},{1040,16},{1040,14},{1037,15},{1035,13},{1033,16},{1013,28},{1013,32},{1007,39},{1008,40},{1006,43},{1007,47},{1004,51},{1002,67},{1004,65},{1007,65},{1009,62},{1011,63},{1010,58},{1011,56},{1016,59},{1018,57},{1021,62},{1024,62},{1031,54},{1034,48},{1035,43},{1033,37},{1034,29},{1031,56},{1003,53},{1002,53},{1002,55},{1004,54},{1030,57},{1003,57},{1003,58},{1030,58},{1029,58},{1003,59},{1028,59},{1027,59}}}, + {"America/Martinique",8,{{-610,148},{-609,146},{-609,148},{-609,144},{-611,145},{-610,146},{-612,148},{-609,147}}}, + {"America/Sao_Paulo",232,{{-511,-305},{-512,-305},{-497,-293},{-508,-311},{-521,-322},{-520,-319},{-521,-318},{-519,-319},{-512,-315},{-512,-311},{-507,-308},{-507,-304},{-506,-305},{-506,-302},{-509,-304},{-513,-300},{-513,-303},{-511,-304},{-513,-305},{-513,-308},{-514,-306},{-514,-311},{-519,-313},{-520,-317},{-522,-317},{-521,-320},{-523,-321},{-527,-332},{-534,-338},{-535,-337},{-535,-332},{-531,-327},{-536,-324},{-537,-321},{-546,-314},{-552,-313},{-556,-308},{-560,-311},{-560,-308},{-568,-301},{-571,-301},{-574,-303},{-576,-302},{-559,-284},{-557,-284},{-558,-282},{-550,-279},{-548,-275},{-543,-274},{-542,-273},{-538,-272},{-537,-270},{-538,-266},{-536,-263},{-538,-260},{-538,-257},{-541,-255},{-544,-257},{-546,-256},{-543,-244},{-543,-241},{-541,-239},{-540,-234},{-537,-233},{-536,-229},{-525,-222},{-521,-217},{-516,-206},{-510,-202},{-509,-195},{-525,-187},{-529,-187},{-528,-184},{-530,-184},{-532,-173},{-524,-161},{-522,-159},{-519,-158},{-516,-152},{-511,-149},{-509,-137},{-504,-125},{-503,-125},{-504,-128},{-494,-132},{-490,-126},{-488,-132},{-482,-130},{-482,-132},{-478,-133},{-477,-131},{-475,-133},{-462,-128},{-461,-130},{-463,-139},{-459,-144},{-461,-152},{-442,-142},{-438,-143},{-439,-146},{-437,-147},{-432,-146},{-421,-152},{-418,-151},{-414,-155},{-413,-158},{-408,-157},{-399,-160},{-399,-163},{-403,-166},{-402,-168},{-405,-169},{-406,-174},{-402,-178},{-402,-180},{-397,-183},{-397,-194},{-410,-213},{-411,-215},{-410,-220},{-420,-225},{-419,-228},{-420,-230},{-430,-230},{-431,-227},{-433,-228},{-432,-228},{-432,-230},{-435,-231},{-440,-231},{-436,-231},{-438,-229},{-442,-231},{-444,-229},{-447,-232},{-445,-233},{-451,-234},{-454,-236},{-454,-238},{-459,-238},{-469,-243},{-479,-250},{-482,-255},{-481,-253},{-483,-254},{-484,-252},{-485,-255},{-487,-254},{-483,-256},{-486,-262},{-487,-262},{-488,-261},{-488,-262},{-487,-264},{-485,-262},{-487,-267},{-486,-271},{-485,-271},{-486,-273},{-486,-282},{-488,-286},{-494,-289},{-522,-320},{-506,-304},{-506,-303},{-507,-303},{-484,-275},{-483,-273},{-484,-274},{-483,-274},{-484,-273},{-487,-284},{-487,-285},{-486,-284},{-487,-283},{-486,-281},{-485,-279},{-485,-277},{-485,-278},{-485,-275},{-486,-278},{-486,-275},{-485,-272},{-410,-216},{-420,-229},{-439,-230},{-439,-229},{-443,-229},{-419,-229},{-431,-228},{-418,-228},{-451,-236},{-451,-235},{-450,-235},{-449,-234},{-448,-234},{-446,-232},{-443,-232},{-444,-232},{-441,-232},{-446,-231},{-445,-231},{-444,-230},{-444,-231},{-443,-230},{-445,-230},{-470,-244},{-467,-242},{-457,-241},{-484,-253},{-483,-253},{-479,-251},{-478,-251},{-451,-238},{-453,-236},{-453,-240},{-455,-239},{-453,-237},{-452,-238},{-463,-241},{-462,-240},{-452,-236},{-487,-266},{-486,-265},{-487,-263},{-484,-255},{-482,-254},{-483,-255},{-484,-254},{-484,-256},{-486,-255},{-488,-263}}}, + {"America/Dawson",2,{{-1395,640},{-1394,641}}}, + {"Africa/Kinshasa",93,{{129,-59},{127,-60},{128,-60},{129,-60},{124,-60},{125,-60},{126,-60},{150,-46},{156,-40},{159,-39},{162,-33},{162,-22},{168,-13},{173,-10},{177,-6},{178,1},{180,4},{179,10},{181,15},{181,22},{186,32},{185,43},{188,44},{191,49},{197,51},{203,48},{206,44},{217,43},{225,41},{229,39},{235,38},{234,36},{232,37},{226,34},{228,33},{228,30},{231,31},{230,26},{234,25},{237,22},{230,22},{228,20},{226,21},{223,15},{226,14},{230,4},{234,-2},{230,-4},{235,-4},{236,-6},{234,-8},{239,-13},{243,-14},{244,-18},{238,-18},{237,-20},{232,-21},{226,-18},{225,-20},{222,-19},{223,-25},{221,-23},{218,-25},{215,-23},{214,-25},{210,-25},{207,-33},{207,-42},{203,-44},{200,-43},{202,-57},{197,-62},{200,-70},{195,-70},{194,-80},{185,-79},{175,-81},{170,-72},{167,-62},{165,-59},{130,-59},{125,-61},{122,-58},{125,-57},{125,-51},{131,-46},{134,-49},{137,-47},{137,-44},{140,-45},{144,-43},{144,-49},{146,-49}}}, + {"Europe/Riga",30,{{221,576},{226,578},{226,576},{231,574},{233,571},{238,570},{244,573},{244,579},{253,581},{260,578},{265,575},{269,576},{276,575},{279,573},{277,568},{280,568},{282,563},{276,558},{271,559},{266,557},{257,561},{251,562},{249,564},{245,563},{220,564},{211,561},{211,568},{214,570},{214,573},{217,576}}}, + {"Africa/Tripoli",51,{{250,270},{250,200},{240,200},{240,195},{160,235},{142,226},{135,232},{120,235},{116,242},{114,242},{110,245},{102,246},{100,249},{100,253},{94,262},{99,266},{98,273},{100,279},{98,294},{94,302},{99,303},{102,307},{103,311},{101,315},{103,317},{115,324},{116,332},{123,328},{134,329},{152,324},{157,314},{178,309},{191,303},{196,304},{201,308},{202,312},{199,318},{202,323},{211,328},{222,329},{231,326},{231,323},{233,322},{250,319},{250,318},{251,317},{251,316},{249,314},{250,308},{247,301},{250,293}}}, + {"Europe/Madrid",137,{{-30,359},{-30,360},{-56,360},{-69,371},{-69,372},{-8,377},{-7,377},{-8,378},{-7,378},{43,398},{38,399},{38,400},{42,401},{23,396},{16,390},{29,391},{29,392},{30,392},{30,391},{-5,382},{16,387},{14,386},{14,387},{14,388},{15,388},{12,390},{12,389},{16,391},{20,425},{20,424},{19,425},{-88,419},{-89,422},{-89,423},{-89,424},{-90,425},{-88,425},{-89,425},{-89,426},{31,398},{35,397},{31,393},{27,396},{25,395},{28,399},{32,400},{-9,377},{-7,376},{-13,376},{-18,373},{-21,367},{-24,368},{-27,367},{-44,367},{-46,365},{-52,364},{-55,361},{-60,362},{-64,367},{-63,368},{-63,369},{-62,369},{-61,371},{-64,368},{-68,373},{-70,373},{-74,372},{-75,376},{-69,382},{-71,382},{-73,384},{-70,391},{-75,397},{-70,397},{-69,400},{-70,402},{-68,404},{-69,410},{-62,416},{-66,417},{-66,420},{-81,418},{-82,421},{-89,419},{-89,421},{-88,421},{-88,422},{-86,423},{-87,424},{-87,427},{-89,428},{-91,427},{-93,431},{-88,433},{-83,434},{-82,433},{-82,434},{-82,435},{-83,435},{-83,436},{-77,438},{-70,435},{-62,436},{-61,435},{-58,437},{-45,434},{-36,435},{-30,433},{-28,435},{-23,433},{-18,434},{-14,433},{-14,431},{-8,430},{-6,428},{7,427},{7,429},{14,427},{15,424},{27,423},{30,425},{33,423},{30,422},{32,420},{29,417},{21,413},{10,410},{7,408},{9,407},{8,407},{7,407},{6,407},{5,406},{-3,395},{-1,390},{2,387},{-5,383}}}, + {"America/Nipigon",2,{{-882,490},{-884,490}}}, + {"Pacific/Fakaofo",5,{{-1712,-94},{-1712,-93},{-1718,-92},{-1719,-92},{-1725,-86}}}, + {"Europe/Skopje",11,{{224,423},{229,420},{230,417},{230,414},{228,413},{227,411},{221,412},{216,409},{207,409},{205,415},{208,421}}}, + {"America/St_Thomas",13,{{-647,177},{-649,177},{-646,178},{-651,183},{-651,184},{-649,184},{-648,183},{-650,183},{-649,183},{-647,184},{-647,183},{-648,184},{-650,184}}}, + {"Africa/Maseru",12,{{284,-302},{281,-307},{278,-306},{274,-303},{274,-302},{270,-296},{274,-295},{278,-289},{287,-286},{295,-294},{292,-297},{292,-299}}}, + {"Europe/Sofia",34,{{279,428},{279,427},{275,425},{277,424},{280,420},{276,419},{273,421},{266,420},{264,417},{261,417},{261,414},{253,412},{243,416},{230,413},{230,417},{229,420},{224,423},{226,425},{224,428},{228,429},{230,432},{225,435},{224,438},{227,442},{230,441},{229,439},{230,438},{254,436},{263,440},{273,441},{286,437},{285,434},{282,434},{279,432}}}, + {"America/Porto_Velho",40,{{-600,-119},{-598,-124},{-604,-134},{-608,-137},{-611,-135},{-618,-135},{-621,-131},{-628,-130},{-631,-127},{-633,-127},{-637,-125},{-643,-125},{-645,-122},{-650,-120},{-654,-113},{-654,-97},{-656,-98},{-658,-97},{-666,-99},{-668,-98},{-664,-94},{-660,-94},{-658,-96},{-652,-92},{-651,-94},{-648,-90},{-641,-90},{-640,-84},{-635,-80},{-629,-80},{-621,-88},{-619,-89},{-617,-87},{-615,-89},{-616,-93},{-615,-96},{-615,-110},{-600,-111},{-599,-114},{-601,-117}}}, + {"America/St_Kitts",6,{{-626,171},{-626,172},{-625,171},{-628,173},{-628,174},{-627,172}}}, + {"Africa/Casablanca",46,{{-98,315},{-58,298},{-65,296},{-72,296},{-87,287},{-87,277},{-132,277},{-129,280},{-122,281},{-123,280},{-115,283},{-102,293},{-96,302},{-96,304},{-99,306},{-98,314},{-93,322},{-93,326},{-85,333},{-68,340},{-59,358},{-54,359},{-51,354},{-44,352},{-37,353},{-33,352},{-30,355},{-29,351},{-27,351},{-29,353},{-22,351},{-17,348},{-18,346},{-17,345},{-17,333},{-14,327},{-10,325},{-13,323},{-12,321},{-29,321},{-28,318},{-37,316},{-38,312},{-36,309},{-48,306},{-51,300}}}, + {"Asia/Hebron",9,{{352,317},{350,319},{350,322},{352,326},{356,324},{356,318},{355,315},{349,313},{350,316}}}, + {"Asia/Dili",18,{{1245,-92},{1243,-95},{1242,-94},{1241,-94},{1273,-84},{1255,-83},{1255,-82},{1256,-81},{1256,-83},{1251,-87},{1270,-83},{1265,-90},{1251,-94},{1250,-92},{1252,-91},{1249,-90},{1251,-88},{1253,-88}}}, + {"America/Argentina/San_Juan",27,{{-699,-300},{-700,-293},{-698,-291},{-696,-284},{-695,-284},{-689,-289},{-690,-296},{-683,-297},{-676,-303},{-671,-309},{-670,-315},{-667,-319},{-674,-319},{-674,-324},{-680,-321},{-685,-322},{-692,-320},{-697,-323},{-703,-323},{-704,-320},{-702,-320},{-705,-316},{-705,-312},{-703,-310},{-702,-303},{-700,-304},{-698,-302}}}, + {"Asia/Almaty",158,{{709,423},{706,420},{704,421},{700,418},{692,414},{686,409},{680,412},{666,413},{665,419},{660,419},{660,424},{678,432},{677,434},{681,440},{675,444},{675,452},{672,453},{674,458},{672,461},{656,462},{651,465},{631,471},{627,470},{643,479},{640,482},{643,483},{642,485},{646,485},{644,487},{647,487},{648,489},{655,488},{661,490},{676,502},{681,504},{677,508},{680,510},{678,515},{680,520},{677,522},{678,523},{675,524},{673,524},{673,522},{665,523},{666,524},{660,524},{661,528},{664,530},{661,530},{664,532},{663,532},{663,535},{661,535},{662,538},{660,540},{664,541},{661,542},{662,543},{661,546},{681,549},{683,551},{682,552},{687,552},{688,554},{690,553},{690,555},{702,551},{708,553},{710,551},{709,549},{713,547},{712,544},{710,543},{711,541},{717,541},{718,542},{722,541},{721,544},{725,541},{724,541},{725,539},{727,539},{725,540},{726,541},{733,540},{738,541},{737,539},{735,539},{733,537},{734,534},{739,536},{744,535},{745,537},{750,538},{755,540},{754,541},{769,545},{767,542},{764,541},{779,533},{801,508},{805,510},{804,512},{807,513},{811,512},{811,509},{814,510},{815,508},{825,507},{827,509},{834,510},{840,508},{843,502},{850,501},{853,496},{862,495},{868,498},{866,496},{870,493},{873,492},{873,491},{867,490},{868,488},{866,485},{857,484},{855,479},{857,472},{855,471},{848,468},{847,470},{840,470},{830,472},{823,456},{826,454},{825,451},{820,452},{817,454},{798,449},{805,447},{803,445},{808,432},{804,430},{806,429},{803,428},{802,422},{799,424},{795,425},{792,428},{785,429},{759,430},{757,428},{752,428},{743,432},{736,430},{735,424},{719,428},{713,428}}}, + {"Europe/Sarajevo",23,{{158,450},{158,452},{163,450},{165,452},{169,452},{178,450},{187,451},{188,449},{194,449},{191,444},{196,441},{192,440},{195,436},{189,435},{191,433},{187,433},{185,426},{176,429},{177,430},{172,435},{162,442},{161,445},{158,448}}}, + {"America/Boa_Vista",46,{{-600,51},{-602,45},{-597,44},{-597,42},{-595,39},{-599,36},{-600,27},{-597,23},{-597,18},{-590,13},{-589,2},{-601,2},{-604,-5},{-603,-7},{-607,-9},{-609,-6},{-612,-5},{-615,-7},{-616,-14},{-619,-14},{-625,-8},{-623,-6},{-626,0},{-624,8},{-628,16},{-627,19},{-633,22},{-634,24},{-640,25},{-642,36},{-648,43},{-646,42},{-641,42},{-640,39},{-635,39},{-634,40},{-629,36},{-627,37},{-628,40},{-625,42},{-619,41},{-613,45},{-610,45},{-606,50},{-607,52},{-602,53}}}, + {"Africa/Addis_Ababa",55,{{450,50},{435,48},{431,46},{428,43},{421,42},{418,39},{412,39},{408,43},{399,39},{395,34},{385,37},{381,36},{370,44},{360,45},{358,48},{359,53},{353,53},{350,59},{349,66},{342,70},{339,75},{330,78},{330,79},{332,84},{338,84},{341,86},{341,96},{343,102},{343,106},{346,109},{348,107},{350,109},{351,117},{357,127},{362,127},{366,143},{370,143},{373,144},{376,141},{379,149},{385,144},{391,146},{393,144},{396,146},{408,142},{424,125},{418,117},{418,110},{426,111},{430,110},{427,106},{435,94},{440,90},{470,80},{480,80}}}, + {"Indian/Mayotte",7,{{452,-128},{453,-128},{451,-127},{452,-130},{451,-130},{450,-126},{450,-127}}}, + {"Africa/Lubumbashi",120,{{294,-50},{297,-64},{302,-70},{308,-82},{289,-85},{289,-88},{284,-93},{285,-94},{287,-98},{286,-102},{287,-107},{284,-116},{284,-118},{290,-124},{295,-125},{295,-122},{298,-122},{298,-135},{296,-134},{296,-132},{290,-134},{284,-125},{279,-122},{276,-123},{272,-116},{270,-116},{269,-120},{260,-119},{253,-116},{254,-112},{244,-115},{243,-114},{244,-111},{241,-109},{231,-111},{226,-110},{223,-112},{222,-109},{223,-108},{223,-104},{222,-99},{218,-94},{220,-85},{217,-79},{218,-73},{205,-73},{206,-69},{200,-70},{197,-62},{202,-57},{200,-43},{203,-44},{207,-42},{207,-33},{210,-25},{214,-25},{215,-23},{218,-25},{221,-23},{223,-25},{222,-19},{225,-20},{226,-18},{232,-21},{237,-20},{238,-18},{244,-18},{243,-14},{239,-13},{234,-8},{236,-6},{235,-4},{230,-4},{234,-2},{230,4},{226,14},{223,15},{226,21},{228,20},{230,22},{237,22},{234,25},{230,26},{231,31},{228,30},{228,33},{226,33},{232,37},{234,36},{235,38},{229,39},{225,41},{229,48},{234,46},{244,51},{247,49},{251,49},{255,54},{265,50},{271,52},{284,43},{288,46},{292,43},{295,47},{296,46},{302,39},{305,39},{306,36},{308,37},{309,35},{307,25},{313,21},{300,8},{300,5},{297,1},{296,-14},{293,-16},{292,-21},{289,-24},{292,-31}}}, + {"Atlantic/Cape_Verde",43,{{-247,148},{-248,149},{-247,149},{-245,150},{-243,150},{-243,148},{-245,149},{-247,150},{-246,150},{-237,150},{-238,151},{-238,153},{-234,150},{-232,153},{-231,152},{-232,151},{-233,152},{-228,162},{-227,161},{-229,160},{-229,162},{-247,167},{-247,166},{-229,169},{-229,167},{-229,166},{-230,168},{-243,166},{-241,166},{-240,166},{-243,165},{-244,166},{-246,166},{-250,169},{-249,169},{-249,168},{-251,168},{-250,171},{-252,169},{-253,169},{-253,171},{-248,168},{-247,168}}}, + {"America/Lower_Princes",3,{{-631,181},{-630,181},{-630,180}}}, + {"Europe/Oslo",1433,{{47,607},{48,607},{76,580},{74,580},{73,580},{77,580},{70,580},{75,580},{72,580},{70,581},{69,581},{80,581},{82,581},{83,582},{85,582},{84,583},{84,582},{67,582},{66,582},{65,582},{91,586},{93,587},{59,584},{59,585},{60,585},{60,584},{90,586},{89,585},{88,584},{88,585},{87,584},{49,593},{51,594},{52,594},{51,596},{52,596},{51,597},{51,598},{52,597},{52,598},{54,591},{111,591},{52,593},{53,591},{52,591},{54,592},{54,593},{55,592},{55,593},{96,589},{97,589},{55,589},{58,590},{58,589},{95,589},{94,589},{96,588},{95,588},{110,590},{111,590},{109,590},{109,591},{98,590},{97,590},{101,590},{57,590},{60,589},{60,590},{59,590},{110,591},{97,591},{58,591},{56,590},{56,591},{57,591},{105,591},{108,591},{52,608},{59,591},{104,591},{105,592},{104,592},{59,592},{103,591},{103,592},{60,592},{58,592},{108,592},{106,592},{61,592},{107,592},{60,593},{61,593},{58,593},{59,593},{107,593},{57,593},{108,593},{56,594},{57,594},{56,593},{105,594},{60,595},{61,595},{104,595},{103,595},{106,597},{105,597},{57,597},{53,597},{54,597},{56,597},{57,598},{52,616},{51,616},{48,616},{121,665},{58,598},{47,613},{50,612},{50,613},{49,613},{48,613},{48,614},{49,614},{53,614},{54,614},{50,614},{51,613},{51,614},{50,615},{49,615},{51,615},{52,615},{47,616},{49,616},{53,616},{50,616},{48,617},{49,617},{53,618},{52,619},{51,619},{50,620},{52,620},{53,620},{53,619},{50,619},{52,618},{49,618},{48,618},{50,618},{48,619},{49,619},{53,621},{48,606},{47,608},{47,612},{48,612},{48,611},{49,612},{51,612},{47,611},{47,610},{51,611},{50,611},{64,628},{64,627},{63,627},{65,628},{66,628},{68,629},{69,629},{70,629},{78,630},{79,630},{74,631},{74,630},{75,631},{71,628},{72,628},{84,629},{67,628},{68,628},{72,627},{71,627},{67,627},{73,627},{74,627},{65,627},{69,628},{77,631},{77,630},{79,631},{76,631},{80,631},{78,631},{79,632},{80,632},{82,632},{82,633},{85,631},{86,631},{81,632},{83,635},{82,635},{81,635},{80,633},{81,633},{79,633},{79,634},{78,634},{82,634},{54,622},{53,622},{55,622},{62,626},{61,626},{62,625},{61,625},{60,625},{59,622},{59,623},{63,626},{62,627},{57,622},{56,622},{55,623},{58,623},{54,623},{57,623},{56,623},{58,624},{59,624},{61,624},{57,624},{56,624},{55,624},{59,625},{66,626},{65,626},{63,624},{64,624},{67,625},{65,624},{63,625},{64,625},{66,625},{65,625},{73,626},{69,627},{66,627},{49,604},{49,605},{48,605},{49,606},{52,602},{52,603},{50,603},{51,604},{50,604},{49,603},{51,603},{50,605},{52,605},{53,604},{53,605},{52,606},{108,599},{106,599},{105,599},{51,599},{52,599},{56,599},{53,599},{57,599},{59,600},{60,600},{58,599},{52,600},{51,600},{50,600},{53,600},{55,600},{56,601},{57,600},{54,600},{54,601},{52,601},{53,601},{51,601},{60,601},{59,601},{61,602},{61,601},{53,602},{50,601},{54,602},{51,602},{50,602},{51,607},{48,609},{48,610},{49,610},{49,609},{56,598},{55,599},{55,598},{54,598},{55,605},{56,607},{57,607},{57,605},{50,606},{51,606},{49,607},{50,607},{53,608},{48,608},{50,608},{50,609},{50,610},{49,611},{51,610},{49,608},{86,637},{86,638},{84,637},{87,639},{86,639},{91,640},{89,637},{89,638},{88,638},{91,637},{90,637},{87,638},{114,644},{113,644},{113,645},{112,645},{107,645},{108,645},{107,646},{115,646},{108,646},{109,645},{109,646},{129,665},{111,637},{110,637},{111,638},{112,638},{99,639},{100,639},{98,639},{97,639},{94,638},{95,638},{92,640},{100,641},{99,640},{98,640},{99,641},{100,640},{102,642},{100,642},{101,642},{103,642},{102,643},{103,643},{104,643},{104,644},{129,666},{114,647},{113,646},{112,647},{113,647},{111,647},{112,648},{118,648},{117,648},{116,648},{113,648},{115,648},{114,649},{107,649},{108,649},{115,650},{111,650},{110,650},{109,650},{114,650},{108,650},{110,648},{112,649},{113,649},{108,648},{107,648},{110,649},{111,649},{131,666},{130,666},{117,651},{117,650},{116,650},{118,657},{117,657},{131,668},{132,667},{131,667},{129,667},{130,667},{134,668},{135,668},{132,668},{133,668},{136,668},{134,669},{133,669},{132,669},{130,665},{120,665},{128,665},{127,666},{128,666},{126,666},{137,669},{136,669},{135,669},{129,670},{128,670},{136,670},{136,671},{138,671},{139,671},{147,672},{146,672},{142,670},{140,671},{143,672},{140,672},{138,672},{142,672},{140,670},{139,670},{137,671},{187,700},{186,700},{139,673},{140,673},{144,673},{143,673},{125,657},{124,657},{123,657},{121,658},{121,657},{120,657},{121,656},{122,656},{119,656},{118,656},{119,657},{120,658},{123,658},{122,658},{125,658},{124,658},{121,659},{123,660},{122,660},{124,660},{122,659},{123,659},{126,659},{126,658},{126,664},{125,664},{125,659},{124,659},{121,661},{120,661},{123,661},{127,661},{127,662},{128,662},{128,661},{123,663},{123,662},{122,663},{125,661},{124,661},{124,662},{126,663},{124,664},{123,664},{125,663},{131,664},{130,664},{129,664},{128,664},{130,662},{129,662},{129,663},{132,663},{130,663},{121,660},{128,660},{129,660},{125,660},{126,661},{126,660},{120,660},{126,662},{124,652},{123,652},{123,653},{122,654},{120,655},{120,654},{121,654},{121,655},{122,655},{123,655},{125,651},{124,651},{123,651},{116,651},{118,651},{115,651},{143,686},{174,691},{174,692},{171,695},{171,694},{178,696},{179,696},{180,696},{178,689},{177,689},{174,690},{176,691},{175,690},{165,690},{165,691},{188,695},{187,695},{188,696},{189,696},{188,697},{182,697},{181,696},{181,697},{183,697},{182,698},{181,698},{204,697},{203,697},{190,697},{189,697},{184,698},{158,686},{171,688},{172,688},{168,687},{170,689},{167,687},{166,687},{162,688},{161,688},{148,688},{147,688},{149,688},{148,689},{150,689},{149,689},{153,689},{160,689},{160,688},{169,690},{166,690},{164,690},{172,689},{174,689},{175,689},{167,689},{167,690},{163,689},{163,690},{166,689},{165,689},{157,690},{154,689},{158,693},{162,693},{298,699},{220,698},{186,698},{185,699},{188,700},{192,701},{197,700},{191,698},{187,699},{181,694},{179,693},{179,692},{168,691},{172,692},{169,692},{172,694},{169,694},{175,694},{173,695},{172,695},{174,695},{176,695},{177,695},{175,696},{176,696},{178,695},{180,695},{311,704},{253,711},{253,712},{254,711},{302,698},{301,698},{301,699},{300,699},{300,698},{297,698},{184,696},{186,697},{183,698},{187,697},{187,696},{207,699},{207,698},{205,698},{206,699},{186,699},{218,699},{217,699},{216,699},{185,700},{298,701},{198,700},{197,699},{194,698},{195,699},{207,700},{206,700},{200,700},{199,700},{189,702},{189,701},{188,702},{209,700},{211,700},{208,699},{185,701},{217,700},{215,700},{216,700},{210,700},{210,701},{213,700},{212,700},{213,701},{194,701},{193,701},{188,701},{198,703},{266,704},{279,707},{252,703},{214,703},{213,703},{214,704},{215,703},{288,701},{287,701},{251,702},{190,702},{233,701},{232,701},{202,702},{200,702},{199,702},{201,702},{187,701},{190,701},{214,701},{209,701},{208,701},{208,702},{196,701},{195,701},{194,702},{207,702},{204,701},{204,702},{200,701},{201,701},{197,701},{195,702},{191,702},{252,702},{250,702},{197,702},{197,703},{251,703},{203,703},{202,703},{254,703},{253,703},{229,703},{230,703},{223,703},{228,704},{217,704},{218,704},{217,703},{259,708},{258,708},{272,708},{231,708},{230,708},{231,709},{242,709},{237,709},{253,709},{245,709},{243,709},{260,711},{259,711},{240,711},{242,711},{241,710},{240,710},{239,711},{259,710},{258,710},{242,710},{240,709},{239,710},{244,709},{247,710},{246,710},{245,710},{250,710},{249,710},{250,711},{255,710},{257,711},{255,712},{257,712},{261,711},{262,710},{248,711},{248,710},{246,711},{247,711},{253,705},{235,707},{234,707},{268,705},{267,705},{252,705},{251,705},{269,705},{270,706},{269,706},{234,706},{233,706},{237,705},{236,706},{237,707},{241,706},{147,676},{146,676},{148,676},{132,680},{235,704},{232,703},{231,704},{236,705},{259,707},{258,707},{229,707},{229,708},{152,676},{151,676},{151,677},{150,676},{126,676},{127,677},{147,678},{146,678},{146,677},{128,678},{128,677},{148,679},{149,679},{150,679},{162,680},{161,681},{162,681},{130,679},{131,681},{155,680},{154,680},{233,708},{235,708},{227,705},{221,705},{223,706},{219,706},{225,707},{227,706},{228,707},{227,708},{230,707},{232,707},{145,674},{146,674},{144,674},{142,674},{139,674},{119,675},{120,675},{121,675},{140,674},{151,680},{153,679},{152,679},{153,680},{152,680},{159,680},{156,680},{157,680},{164,682},{163,682},{161,682},{160,682},{142,682},{148,682},{147,682},{138,683},{139,683},{153,683},{150,683},{149,682},{149,683},{158,682},{158,681},{157,681},{155,681},{163,681},{163,680},{162,683},{161,683},{160,683},{161,684},{150,684},{152,685},{151,685},{106,636},{84,636},{133,682},{135,682},{134,680},{143,683},{137,681},{135,681},{137,683},{170,685},{169,685},{150,686},{149,686},{147,685},{146,686},{147,686},{86,636},{85,636},{94,636},{93,636},{150,687},{152,687},{144,687},{145,688},{151,688},{151,690},{154,688},{153,688},{154,687},{148,686},{149,684},{148,684},{162,685},{165,685},{164,684},{159,684},{158,684},{164,686},{161,686},{159,685},{157,683},{153,684},{156,685},{155,685},{154,685},{152,686},{156,686},{155,687},{157,687},{155,688},{157,688},{155,689},{156,690},{158,687},{157,685},{163,687},{163,688},{166,688},{166,686},{84,635},{145,683},{144,684},{85,633},{85,632},{83,632},{84,632},{83,633},{86,632},{84,633},{86,633},{87,633},{94,635},{92,635},{92,636},{91,635},{87,636},{91,636},{90,636},{92,637},{90,634},{90,635},{83,634},{89,634},{89,635},{81,581},{82,583},{71,580},{71,581},{68,581},{69,582},{66,581},{69,583},{64,583},{55,587},{57,589},{62,588},{63,588},{61,590},{67,591},{63,590},{61,589},{66,593},{66,596},{63,595},{64,596},{63,597},{62,595},{60,594},{59,594},{59,595},{54,594},{52,595},{55,597},{55,595},{58,596},{64,599},{60,598},{63,601},{64,604},{67,604},{66,602},{65,601},{71,605},{62,605},{62,603},{60,603},{58,600},{58,602},{56,602},{58,604},{52,604},{54,604},{58,607},{55,606},{56,609},{51,608},{51,609},{53,610},{55,610},{60,611},{64,610},{66,612},{70,611},{70,610},{69,609},{68,609},{71,609},{75,611},{74,611},{77,612},{73,613},{76,615},{73,614},{73,612},{67,613},{67,614},{65,611},{61,612},{52,611},{53,612},{56,614},{52,614},{55,615},{54,616},{50,617},{52,617},{51,618},{54,619},{58,619},{57,618},{56,618},{60,618},{59,617},{62,618},{61,618},{65,618},{68,619},{64,618},{57,619},{59,619},{55,619},{54,620},{51,622},{55,620},{56,621},{54,621},{57,621},{59,620},{60,621},{61,621},{63,621},{66,621},{67,622},{70,623},{69,621},{72,621},{70,621},{74,623},{69,625},{71,625},{72,626},{76,625},{78,626},{76,626},{74,626},{81,627},{70,627},{73,630},{74,629},{80,630},{82,628},{85,627},{81,631},{83,629},{87,628},{86,630},{84,630},{85,630},{83,630},{82,631},{90,632},{92,634},{91,633},{95,634},{97,637},{100,634},{99,633},{103,633},{101,634},{102,635},{108,634},{109,636},{106,635},{107,636},{115,638},{111,639},{115,640},{112,640},{114,641},{113,641},{106,638},{110,639},{109,637},{101,635},{98,637},{101,638},{95,637},{102,639},{101,640},{107,644},{105,644},{108,644},{106,645},{110,646},{112,644},{112,643},{117,645},{114,645},{118,646},{114,646},{117,649},{122,650},{116,649},{114,648},{122,652},{121,651},{130,653},{124,653},{124,654},{120,652},{123,656},{125,654},{128,655},{124,656},{126,657},{126,656},{128,656},{127,658},{127,659},{132,658},{130,661},{135,662},{136,661},{138,661},{136,662},{138,662},{142,663},{136,663},{132,665},{133,664},{137,666},{132,666},{134,666},{136,667},{140,668},{135,670},{145,672},{155,671},{154,673},{150,673},{152,673},{151,675},{146,675},{149,675},{154,675},{156,674},{157,673},{158,674},{155,675},{159,676},{153,675},{155,676},{153,677},{156,678},{158,677},{159,677},{154,679},{152,677},{148,677},{152,678},{148,678},{159,679},{160,680},{153,681},{156,682},{156,681},{162,679},{165,678},{165,679},{167,681},{166,682},{168,682},{163,684},{172,684},{173,682},{173,684},{179,684},{175,685},{175,686},{170,687},{177,687},{178,687},{175,688},{179,689},{182,692},{180,692},{182,695},{184,695},{185,692},{186,694},{190,693},{184,694},{190,694},{193,693},{192,692},{196,692},{194,694},{190,695},{192,695},{191,697},{197,698},{197,695},{195,694},{197,694},{197,696},{200,696},{201,696},{198,697},{203,700},{204,696},{199,693},{206,695},{209,695},{205,696},{211,698},{213,699},{214,700},{220,697},{221,697},{219,698},{220,699},{219,700},{221,700},{218,700},{220,701},{221,701},{217,701},{212,702},{215,702},{218,701},{218,703},{219,703},{222,701},{226,701},{223,702},{224,703},{230,702},{228,701},{224,701},{223,700},{229,701},{230,701},{231,700},{231,699},{230,699},{235,700},{231,701},{234,701},{232,702},{235,702},{233,703},{239,705},{243,705},{241,705},{243,707},{247,706},{242,708},{246,708},{252,708},{254,709},{253,710},{256,709},{254,708},{259,709},{250,705},{249,702},{250,700},{266,710},{267,709},{267,708},{263,707},{266,707},{265,704},{271,705},{273,706},{271,707},{277,708},{271,709},{273,709},{273,710},{276,710},{275,711},{276,711},{285,710},{282,708},{278,708},{281,707},{276,706},{283,707},{278,705},{279,704},{285,705},{284,705},{286,707},{285,707},{290,709},{294,708},{292,707},{301,707},{303,706},{300,705},{306,705},{302,701},{287,702},{286,702},{297,700},{294,699},{297,699},{295,697},{301,697},{302,699},{304,698},{303,697},{305,698},{309,697},{308,695},{301,695},{293,693},{290,690},{288,691},{293,695},{291,697},{284,698},{280,701},{276,701},{265,699},{259,697},{257,693},{258,690},{251,688},{249,686},{240,688},{232,686},{224,687},{216,693},{213,693},{210,692},{211,690},{201,691},{203,688},{200,686},{203,685},{200,684},{184,686},{181,685},{182,682},{179,680},{173,681},{167,679},{165,676},{161,674},{164,672},{164,670},{154,665},{155,663},{145,661},{146,658},{145,653},{136,646},{141,645},{141,642},{140,640},{129,641},{121,636},{122,635},{120,633},{122,630},{121,626},{123,623},{121,617},{129,614},{127,611},{122,610},{126,604},{124,600},{119,598},{119,597},{117,596},{118,592},{117,589},{115,589},{112,592},{106,598},{107,599},{107,597},{106,595},{104,597},{103,598},{102,597},{105,593},{98,591},{95,591},{93,589},{91,588},{92,587},{83,637},{88,636},{88,637},{87,637},{85,637},{95,636},{96,637},{93,637},{94,637}}}, + {"Africa/Monrovia",25,{{-76,48},{-75,44},{-84,47},{-93,51},{-100,59},{-114,67},{-115,69},{-106,78},{-106,80},{-103,82},{-103,85},{-98,86},{-95,84},{-93,77},{-95,74},{-92,74},{-91,72},{-88,73},{-86,77},{-83,70},{-86,65},{-79,63},{-78,60},{-74,58},{-74,53}}}, + {"Asia/Muscat",64,{{561,176},{556,175},{558,175},{559,175},{563,175},{564,175},{560,175},{561,175},{587,235},{563,263},{563,264},{564,264},{561,261},{562,263},{562,262},{563,262},{564,262},{565,264},{562,256},{586,202},{586,203},{589,207},{590,205},{588,205},{587,204},{587,205},{582,206},{587,207},{583,205},{583,206},{564,180},{554,178},{552,175},{553,172},{550,170},{541,170},{531,167},{520,190},{550,200},{557,220},{552,227},{552,230},{556,238},{555,240},{560,241},{558,242},{558,249},{560,250},{561,247},{564,250},{566,245},{572,239},{588,235},{593,228},{598,224},{593,214},{589,211},{585,204},{582,204},{578,202},{577,197},{578,190},{568,188},{587,208}}}, + {"America/Thunder_Bay",6,{{-891,484},{-892,484},{-892,483},{-892,485},{-894,483},{-894,485}}}, + {"America/Juneau",192,{{-1359,585},{-1359,586},{-1360,585},{-1338,585},{-1361,585},{-1349,586},{-1350,585},{-1349,585},{-1358,585},{-1376,586},{-1362,586},{-1362,587},{-1360,587},{-1361,588},{-1362,588},{-1361,586},{-1359,589},{-1358,589},{-1368,589},{-1369,589},{-1365,589},{-1366,589},{-1353,590},{-1353,589},{-1365,588},{-1364,588},{-1366,588},{-1334,577},{-1335,577},{-1338,574},{-1346,575},{-1336,575},{-1345,575},{-1343,572},{-1342,572},{-1335,572},{-1340,573},{-1341,573},{-1335,573},{-1337,573},{-1337,574},{-1338,573},{-1364,578},{-1363,580},{-1360,578},{-1363,578},{-1366,579},{-1365,581},{-1364,582},{-1354,583},{-1355,583},{-1365,583},{-1364,583},{-1361,583},{-1360,583},{-1363,582},{-1351,582},{-1350,582},{-1360,582},{-1363,583},{-1349,584},{-1347,582},{-1342,582},{-1338,576},{-1343,581},{-1343,578},{-1339,576},{-1339,575},{-1341,575},{-1339,574},{-1342,574},{-1341,572},{-1346,570},{-1346,572},{-1344,573},{-1346,574},{-1343,573},{-1344,575},{-1343,576},{-1347,576},{-1336,578},{-1335,580},{-1336,580},{-1335,581},{-1341,581},{-1340,578},{-1342,578},{-1342,579},{-1341,578},{-1341,579},{-1343,580},{-1346,583},{-1347,583},{-1350,580},{-1349,578},{-1350,579},{-1352,579},{-1351,578},{-1359,580},{-1364,581},{-1363,581},{-1362,581},{-1361,581},{-1362,582},{-1358,583},{-1355,582},{-1358,580},{-1354,581},{-1343,582},{-1346,582},{-1345,583},{-1356,583},{-1357,583},{-1357,584},{-1347,584},{-1348,584},{-1375,589},{-1368,592},{-1366,592},{-1365,595},{-1362,595},{-1363,596},{-1355,598},{-1350,596},{-1350,593},{-1334,584},{-1324,573},{-1327,574},{-1331,572},{-1336,572},{-1330,574},{-1334,574},{-1333,574},{-1335,574},{-1334,576},{-1336,577},{-1331,575},{-1329,575},{-1332,576},{-1331,577},{-1336,579},{-1331,579},{-1337,578},{-1338,579},{-1337,579},{-1334,581},{-1337,580},{-1337,581},{-1339,580},{-1340,581},{-1340,584},{-1337,585},{-1341,584},{-1341,582},{-1350,587},{-1349,587},{-1349,590},{-1353,592},{-1351,592},{-1353,595},{-1354,593},{-1357,595},{-1357,594},{-1353,591},{-1355,592},{-1356,593},{-1351,586},{-1350,583},{-1355,585},{-1355,584},{-1359,584},{-1358,586},{-1360,589},{-1362,591},{-1365,590},{-1367,590},{-1367,589},{-1371,591},{-1370,589},{-1371,588},{-1363,587},{-1365,586},{-1360,584},{-1362,583},{-1365,585},{-1366,584},{-1366,583},{-1366,582},{-1369,583},{-1368,584},{-1371,584},{-1379,588}}}, + {"Pacific/Rarotonga",32,{{-1630,-135},{-1632,-134},{-1631,-134},{-1654,-116},{-1658,-109},{-1658,-110},{-1659,-109},{-1579,-219},{-1580,-219},{-1598,-212},{-1597,-212},{-1597,-213},{-1573,-202},{-1573,-201},{-1581,-200},{-1583,-198},{-1577,-198},{-1577,-199},{-1589,-193},{-1589,-192},{-1597,-189},{-1598,-189},{-1598,-188},{-1610,-104},{-1609,-104},{-1611,-100},{-1579,-91},{-1579,-90},{-1580,-91},{-1581,-90},{-1580,-90},{-1580,-89}}}, + {"Atlantic/Faroe",42,{{-69,615},{-70,616},{-67,614},{-67,616},{-68,617},{-67,617},{-75,621},{-76,621},{-77,621},{-74,621},{-68,618},{-69,618},{-69,619},{-66,618},{-67,618},{-63,623},{-63,624},{-64,622},{-64,623},{-63,622},{-65,623},{-66,622},{-68,624},{-67,622},{-66,623},{-67,623},{-67,624},{-66,624},{-69,620},{-66,620},{-67,620},{-70,620},{-72,620},{-71,621},{-68,620},{-73,622},{-72,623},{-71,623},{-69,622},{-68,623},{-66,621},{-67,621}}}, + {"America/Cayenne",25,{{-519,48},{-522,49},{-535,56},{-529,54},{-519,45},{-519,47},{-518,46},{-516,42},{-523,31},{-526,25},{-529,22},{-538,24},{-541,21},{-543,22},{-545,23},{-542,28},{-542,31},{-540,36},{-544,40},{-545,49},{-539,57},{-523,50},{-522,50},{-524,50},{-527,52}}}, + {"America/Cuiaba",56,{{-514,-150},{-516,-152},{-519,-158},{-522,-159},{-527,-167},{-530,-169},{-532,-175},{-531,-180},{-540,-179},{-537,-173},{-541,-176},{-544,-177},{-546,-175},{-552,-177},{-561,-172},{-568,-173},{-571,-178},{-575,-180},{-578,-175},{-580,-175},{-584,-172},{-585,-167},{-583,-163},{-602,-163},{-602,-155},{-606,-151},{-603,-151},{-603,-146},{-605,-142},{-604,-140},{-608,-137},{-604,-134},{-598,-124},{-601,-118},{-599,-114},{-600,-111},{-604,-110},{-615,-110},{-615,-96},{-616,-93},{-615,-89},{-616,-88},{-585,-87},{-583,-81},{-584,-78},{-581,-73},{-576,-82},{-576,-88},{-568,-94},{-502,-98},{-506,-107},{-507,-115},{-507,-126},{-505,-129},{-509,-137},{-511,-149}}}, + {"Africa/Maputo",175,{{330,-261},{329,-260},{330,-260},{327,-259},{327,-258},{355,-222},{355,-221},{354,-220},{355,-218},{355,-219},{408,-149},{408,-148},{354,-219},{354,-239},{354,-238},{347,-197},{346,-197},{357,-191},{347,-198},{348,-197},{360,-189},{361,-189},{350,-208},{350,-207},{347,-205},{347,-206},{349,-207},{349,-206},{346,-205},{348,-199},{348,-198},{355,-217},{353,-216},{354,-217},{355,-215},{369,-180},{391,-171},{391,-170},{391,-169},{406,-154},{407,-151},{407,-150},{408,-145},{406,-126},{406,-125},{405,-123},{406,-122},{406,-123},{406,-124},{405,-124},{406,-120},{406,-118},{406,-114},{407,-112},{407,-110},{406,-110},{406,-109},{407,-109},{407,-108},{406,-108},{406,-112},{399,-163},{400,-163},{399,-164},{398,-163},{364,-187},{365,-186},{368,-182},{363,-189},{362,-188},{331,-254},{328,-256},{328,-259},{327,-257},{326,-260},{325,-259},{324,-260},{327,-261},{327,-263},{327,-264},{327,-262},{329,-263},{329,-269},{321,-268},{321,-260},{319,-258},{320,-243},{316,-235},{313,-224},{325,-213},{324,-211},{325,-206},{330,-200},{331,-198},{328,-195},{329,-191},{327,-189},{329,-188},{329,-185},{331,-184},{329,-180},{330,-173},{328,-169},{330,-167},{319,-164},{312,-160},{304,-160},{302,-150},{332,-140},{337,-146},{344,-144},{345,-146},{346,-153},{343,-159},{344,-163},{352,-168},{351,-171},{353,-171},{351,-166},{354,-161},{358,-160},{358,-152},{359,-149},{351,-137},{345,-134},{344,-123},{346,-116},{355,-116},{358,-114},{362,-117},{370,-116},{375,-117},{378,-116},{379,-113},{385,-114},{389,-112},{392,-112},{405,-105},{406,-107},{405,-108},{404,-113},{405,-120},{404,-126},{406,-128},{404,-130},{406,-130},{405,-135},{406,-136},{405,-142},{407,-143},{406,-146},{406,-149},{408,-150},{405,-152},{406,-152},{407,-153},{400,-162},{387,-170},{382,-173},{381,-172},{381,-173},{359,-190},{349,-199},{351,-210},{350,-211},{351,-213},{351,-212},{353,-222},{355,-223},{356,-229},{353,-237},{353,-240},{355,-238},{355,-241},{351,-246}}}, + {"Asia/Anadyr",262,{{-1741,670},{-1742,670},{-1728,670},{-1728,671},{-1691,657},{-1691,658},{-1690,658},{-1777,654},{-1784,654},{-1786,654},{-1787,655},{-1725,646},{-1727,646},{-1725,647},{-1725,648},{-1723,648},{-1721,648},{-1726,647},{-1726,649},{-1725,649},{-1722,655},{-1774,655},{-1772,655},{-1773,655},{-1747,670},{-1747,671},{-1743,664},{-1744,664},{-1744,665},{-1730,670},{-1717,670},{-1713,666},{-1697,661},{-1706,659},{-1705,658},{-1706,656},{-1715,658},{-1710,656},{-1711,655},{-1721,655},{-1717,655},{-1722,656},{-1723,657},{-1727,657},{-1729,657},{-1724,656},{-1723,654},{-1722,653},{-1721,651},{-1732,648},{-1729,648},{-1727,648},{-1731,647},{-1728,647},{-1730,646},{-1722,644},{-1730,645},{-1728,644},{-1728,643},{-1731,642},{-1734,643},{-1732,644},{-1733,646},{-1733,644},{-1736,643},{-1742,647},{-1754,648},{-1759,650},{-1757,651},{-1760,655},{-1769,656},{-1775,655},{-1785,655},{-1784,657},{-1789,659},{-1789,660},{-1785,661},{-1785,664},{-1788,662},{-1791,662},{-1790,664},{-1794,663},{-1792,662},{-1793,661},{-1797,662},{-1798,659},{-1793,655},{-1797,651},{-1800,650},{-1800,690},{-1753,677},{-1753,676},{-1748,674},{-1747,672},{-1749,673},{-1749,671},{-1747,667},{-1750,667},{-1744,663},{-1740,665},{-1739,663},{-1740,663},{-1738,663},{-1737,664},{-1743,665},{-1739,667},{-1740,670},{-1746,671},{-1748,672},{-1748,673},{-1747,673},{-1746,674},{-1746,675},{-1756,714},{-1758,714},{-1755,714},{1800,715},{1800,710},{1787,708},{1786,710},{1797,715},{1798,715},{-1791,716},{-1793,716},{-1794,716},{-1800,715},{-1785,716},{-1775,712},{-1779,710},{-1796,709},{-1800,710},{-1783,715},{-1786,716},{-1788,716},{-1787,716},{-1795,716},{-1796,716},{-1789,716},{-1792,716},{1775,649},{1771,647},{1761,649},{1758,648},{1752,647},{1757,647},{1762,649},{1765,647},{1762,646},{1766,647},{1768,645},{1775,647},{1775,644},{1779,642},{1783,642},{1781,642},{1783,643},{1782,644},{1787,640},{1789,634},{1795,631},{1793,630},{1796,628},{1796,626},{1791,625},{1791,623},{1781,625},{1770,625},{1745,618},{1743,621},{1741,621},{1741,624},{1737,625},{1728,623},{1720,625},{1703,623},{1700,625},{1701,627},{1684,631},{1696,637},{1694,640},{1689,640},{1685,643},{1677,643},{1672,646},{1659,646},{1657,647},{1653,649},{1649,647},{1642,649},{1635,649},{1630,647},{1628,647},{1618,648},{1613,651},{1605,652},{1600,655},{1589,657},{1592,662},{1584,664},{1589,668},{1588,670},{1579,673},{1579,674},{1577,675},{1578,677},{1583,677},{1581,679},{1585,681},{1614,684},{1624,683},{1627,686},{1626,688},{1628,689},{1625,690},{1625,691},{1628,692},{1623,695},{1626,697},{1640,697},{1646,696},{1670,695},{1678,698},{1683,695},{1683,692},{1693,691},{1695,688},{1697,688},{1711,691},{1707,696},{1702,696},{1706,698},{1706,701},{1731,698},{1735,699},{1738,698},{1761,699},{1788,694},{1800,690},{1800,650},{1795,648},{1786,646},{1788,646},{1776,647},{1774,648},{1682,696},{1683,696},{1701,697},{1702,697},{1700,697},{1702,698},{1703,698},{1693,699},{1692,699},{1691,699},{1681,696},{1681,697},{1687,700},{1685,700},{1694,699},{1695,698},{1692,696},{1686,700}}}, + {"Asia/Kabul",83,{{632,295},{625,294},{609,299},{618,310},{617,314},{609,315},{609,322},{606,331},{609,335},{606,336},{605,341},{607,343},{609,343},{607,345},{610,346},{613,356},{616,354},{621,354},{623,351},{627,353},{631,354},{632,357},{631,359},{641,360},{644,362},{648,371},{655,372},{658,375},{663,373},{670,374},{673,372},{678,372},{680,369},{689,373},{693,371},{695,372},{694,374},{695,376},{702,375},{703,377},{702,379},{707,384},{710,385},{714,383},{712,379},{716,379},{714,371},{717,367},{727,370},{733,375},{738,374},{736,373},{737,372},{742,374},{749,373},{745,372},{746,370},{741,368},{722,368},{712,361},{715,357},{717,352},{710,346},{712,344},{711,341},{699,340},{703,333},{695,330},{695,327},{692,325},{693,319},{690,316},{682,318},{676,315},{678,313},{667,312},{664,309},{662,301},{664,300},{662,299},{651,295},{644,295},{641,294}}}, + {"America/Santa_Isabel",51,{{-1145,301},{-1145,300},{-1161,305},{-1131,291},{-1136,296},{-1144,298},{-1144,299},{-1144,300},{-1135,290},{-1135,291},{-1132,293},{-1131,290},{-1135,293},{-1154,281},{-1156,283},{-1129,287},{-1128,287},{-1128,286},{-1130,287},{-1152,280},{-1153,284},{-1152,282},{-1155,283},{-1130,288},{-1184,289},{-1130,289},{-1184,292},{-1183,290},{-1183,289},{-1184,291},{-1148,325},{-1150,320},{-1148,317},{-1149,312},{-1147,309},{-1147,302},{-1136,293},{-1135,289},{-1134,289},{-1131,285},{-1128,284},{-1128,280},{-1142,280},{-1141,285},{-1150,294},{-1157,298},{-1161,308},{-1163,310},{-1164,312},{-1167,315},{-1164,324}}}, + {"Asia/Damascus",37,{{375,327},{368,323},{361,325},{359,327},{356,327},{356,333},{361,336},{359,336},{361,338},{364,338},{363,339},{366,342},{366,344},{363,345},{365,346},{360,346},{360,353},{357,356},{358,359},{360,359},{362,358},{364,362},{367,362},{366,365},{367,368},{371,366},{383,369},{392,367},{408,371},{423,372},{424,371},{419,366},{414,365},{413,364},{414,356},{412,348},{410,344}}}, + {"Pacific/Noumea",91,{{1661,-221},{1675,-227},{1675,-226},{1721,-224},{1674,-227},{1689,-226},{1690,-226},{1676,-227},{1674,-225},{1713,-224},{1713,-223},{1676,-212},{1676,-211},{1678,-211},{1648,-212},{1647,-211},{1673,-211},{1670,-209},{1672,-208},{1670,-207},{1673,-207},{1673,-209},{1675,-211},{1645,-209},{1679,-216},{1678,-216},{1678,-214},{1681,-214},{1681,-216},{1650,-214},{1676,-213},{1677,-214},{1677,-213},{1660,-221},{1660,-220},{1659,-220},{1661,-219},{1661,-220},{1658,-218},{1657,-218},{1664,-217},{1668,-225},{1668,-224},{1666,-223},{1665,-223},{1664,-223},{1664,-222},{1663,-222},{1639,-202},{1639,-201},{1640,-201},{1639,-200},{1583,-199},{1637,-198},{1636,-197},{1636,-196},{1637,-197},{1582,-196},{1636,-195},{1583,-196},{1638,-200},{1638,-201},{1582,-195},{1583,-195},{1599,-193},{1599,-192},{1599,-191},{1600,-192},{1590,-192},{1586,-191},{1665,-207},{1664,-207},{1650,-213},{1644,-208},{1652,-208},{1656,-213},{1669,-221},{1670,-223},{1666,-204},{1667,-205},{1665,-204},{1661,-204},{1662,-204},{1641,-203},{1643,-203},{1642,-203},{1643,-202},{1640,-202},{1642,-201},{1642,-202},{1640,-200}}}, + {"America/Anchorage",828,{{-1463,702},{-1464,702},{-1595,551},{-1457,606},{-1458,606},{-1482,606},{-1481,606},{-1595,548},{-1596,548},{-1598,548},{-1597,548},{-1593,549},{-1592,549},{-1602,550},{-1619,550},{-1600,549},{-1601,549},{-1600,550},{-1593,550},{-1595,549},{-1595,550},{-1593,551},{-1594,551},{-1620,552},{-1620,551},{-1619,551},{-1598,550},{-1599,550},{-1598,551},{-1597,551},{-1616,551},{-1615,551},{-1617,551},{-1618,551},{-1619,552},{-1618,552},{-1596,552},{-1597,552},{-1503,611},{-1502,612},{-1502,611},{-1470,610},{-1471,610},{-1613,641},{-1610,662},{-1618,662},{-1617,670},{-1468,609},{-1471,609},{-1449,604},{-1449,605},{-1450,604},{-1483,605},{-1481,607},{-1483,607},{-1482,608},{-1479,608},{-1478,608},{-1467,608},{-1468,608},{-1477,608},{-1478,607},{-1477,607},{-1474,607},{-1475,606},{-1475,607},{-1473,607},{-1474,606},{-1467,607},{-1479,607},{-1480,607},{-1474,605},{-1473,605},{-1476,605},{-1461,702},{-1460,702},{-1459,702},{-1476,606},{-1459,604},{-1460,604},{-1457,604},{-1456,604},{-1460,605},{-1480,605},{-1479,605},{-1477,605},{-1460,606},{-1461,605},{-1463,605},{-1467,609},{-1481,608},{-1481,609},{-1479,609},{-1469,608},{-1476,609},{-1474,609},{-1475,609},{-1473,702},{-1472,702},{-1462,702},{-1472,609},{-1473,609},{-1416,698},{-1414,697},{-1419,698},{-1420,698},{-1421,699},{-1423,699},{-1421,698},{-1422,698},{-1444,700},{-1443,700},{-1442,701},{-1455,701},{-1430,701},{-1429,701},{-1431,701},{-1443,701},{-1441,701},{-1432,701},{-1459,701},{-1433,701},{-1433,702},{-1432,702},{-1434,701},{-1435,701},{-1436,701},{-1436,702},{-1439,701},{-1440,701},{-1438,701},{-1457,701},{-1456,701},{-1458,701},{-1437,701},{-1465,702},{-1466,702},{-1470,703},{-1471,703},{-1480,703},{-1479,703},{-1478,703},{-1475,704},{-1511,704},{-1512,704},{-1504,704},{-1503,704},{-1510,704},{-1510,705},{-1488,705},{-1479,705},{-1480,705},{-1483,705},{-1484,705},{-1489,705},{-1490,705},{-1487,704},{-1488,704},{-1504,705},{-1503,705},{-1489,704},{-1486,704},{-1501,705},{-1493,705},{-1492,705},{-1502,706},{-1501,706},{-1494,705},{-1496,706},{-1495,706},{-1498,706},{-1499,706},{-1497,706},{-1519,706},{-1520,706},{-1524,706},{-1523,706},{-1553,708},{-1554,708},{-1584,708},{-1585,708},{-1556,708},{-1556,709},{-1591,709},{-1589,709},{-1588,709},{-1529,709},{-1531,709},{-1587,709},{-1528,709},{-1557,709},{-1557,710},{-1556,710},{-1549,711},{-1550,711},{-1551,712},{-1552,712},{-1555,712},{-1556,712},{-1554,712},{-1551,711},{-1559,713},{-1560,713},{-1561,713},{-1562,713},{-1557,712},{-1558,712},{-1505,704},{-1505,705},{-1517,705},{-1491,705},{-1601,553},{-1600,553},{-1601,555},{-1600,555},{-1616,555},{-1617,555},{-1601,554},{-1602,554},{-1603,554},{-1600,551},{-1601,552},{-1598,553},{-1602,549},{-1601,550},{-1602,551},{-1595,553},{-1596,550},{-1613,552},{-1614,552},{-1616,552},{-1617,552},{-1615,553},{-1562,574},{-1525,586},{-1526,586},{-1603,552},{-1604,553},{-1605,553},{-1608,554},{-1605,554},{-1605,552},{-1608,551},{-1595,557},{-1556,558},{-1557,558},{-1556,559},{-1555,558},{-1589,558},{-1594,557},{-1594,558},{-1593,558},{-1609,559},{-1608,559},{-1611,560},{-1610,560},{-1593,557},{-1595,558},{-1595,559},{-1538,574},{-1539,575},{-1538,575},{-1540,576},{-1540,577},{-1539,577},{-1588,559},{-1587,558},{-1591,558},{-1592,558},{-1591,559},{-1608,560},{-1609,560},{-1566,560},{-1567,561},{-1566,561},{-1577,563},{-1586,563},{-1578,563},{-1579,563},{-1578,564},{-1577,565},{-1540,566},{-1539,565},{-1544,565},{-1542,566},{-1545,565},{-1548,564},{-1545,566},{-1544,566},{-1534,577},{-1533,577},{-1494,599},{-1570,565},{-1571,565},{-1573,565},{-1571,566},{-1581,561},{-1582,561},{-1581,562},{-1568,561},{-1568,562},{-1567,560},{-1568,560},{-1604,555},{-1574,566},{-1542,567},{-1541,567},{-1539,567},{-1540,567},{-1568,568},{-1569,568},{-1588,569},{-1587,569},{-1567,570},{-1565,570},{-1563,573},{-1563,574},{-1523,577},{-1523,578},{-1522,578},{-1531,571},{-1533,570},{-1533,571},{-1534,571},{-1533,572},{-1530,572},{-1529,572},{-1529,571},{-1536,569},{-1535,569},{-1541,569},{-1542,570},{-1541,570},{-1542,569},{-1538,567},{-1574,567},{-1574,568},{-1575,582},{-1519,582},{-1518,583},{-1518,582},{-1543,583},{-1545,581},{-1524,585},{-1528,583},{-1529,583},{-1542,583},{-1522,584},{-1523,584},{-1527,584},{-1527,585},{-1540,585},{-1523,574},{-1536,579},{-1536,578},{-1535,577},{-1535,576},{-1535,578},{-1532,577},{-1532,579},{-1530,578},{-1533,580},{-1528,579},{-1529,578},{-1529,577},{-1526,579},{-1526,577},{-1524,577},{-1525,576},{-1522,576},{-1524,574},{-1530,575},{-1531,574},{-1526,574},{-1532,574},{-1529,573},{-1535,572},{-1535,571},{-1537,571},{-1538,571},{-1536,570},{-1541,568},{-1538,570},{-1540,570},{-1538,572},{-1543,568},{-1546,572},{-1548,573},{-1542,577},{-1541,575},{-1539,574},{-1538,573},{-1536,573},{-1539,576},{-1537,575},{-1536,576},{-1533,579},{-1532,578},{-1535,579},{-1535,580},{-1527,579},{-1525,579},{-1524,580},{-1523,579},{-1524,579},{-1531,579},{-1531,580},{-1530,579},{-1530,580},{-1525,580},{-1524,578},{-1529,580},{-1534,581},{-1533,581},{-1604,587},{-1602,588},{-1602,589},{-1520,589},{-1521,589},{-1527,581},{-1532,582},{-1529,582},{-1531,583},{-1528,582},{-1529,584},{-1524,583},{-1521,584},{-1521,582},{-1520,583},{-1523,583},{-1524,582},{-1523,581},{-1526,581},{-1526,582},{-1529,579},{-1527,580},{-1522,589},{-1603,586},{-1603,587},{-1602,587},{-1521,590},{-1522,590},{-1584,590},{-1585,590},{-1534,590},{-1540,591},{-1541,591},{-1537,591},{-1538,591},{-1517,591},{-1516,591},{-1515,591},{-1514,591},{-1518,591},{-1519,591},{-1519,592},{-1518,592},{-1541,592},{-1620,593},{-1464,594},{-1463,595},{-1463,594},{-1515,595},{-1512,596},{-1513,596},{-1520,593},{-1504,593},{-1504,594},{-1508,593},{-1507,594},{-1506,594},{-1507,593},{-1535,593},{-1535,594},{-1533,594},{-1534,593},{-1536,594},{-1503,595},{-1496,596},{-1496,597},{-1497,596},{-1499,597},{-1497,597},{-1480,600},{-1480,601},{-1526,601},{-1526,602},{-1442,601},{-1443,601},{-1444,601},{-1444,602},{-1480,602},{-1453,602},{-1453,603},{-1454,603},{-1450,602},{-1451,602},{-1449,602},{-1448,602},{-1452,602},{-1452,603},{-1479,602},{-1479,603},{-1495,598},{-1442,600},{-1444,599},{-1446,598},{-1494,598},{-1474,599},{-1497,599},{-1493,599},{-1482,600},{-1481,600},{-1482,599},{-1483,599},{-1444,600},{-1479,601},{-1478,601},{-1479,600},{-1481,599},{-1521,603},{-1520,605},{-1518,605},{-1520,604},{-1477,600},{-1472,604},{-1469,603},{-1475,599},{-1479,598},{-1481,601},{-1481,602},{-1483,600},{-1498,596},{-1498,597},{-1523,589},{-1524,589},{-1570,589},{-1570,590},{-1480,604},{-1480,603},{-1482,603},{-1481,604},{-1526,585},{-1524,586},{-1523,586},{-1525,585},{-1609,587},{-1607,588},{-1609,586},{-1611,585},{-1612,587},{-1527,586},{-1588,586},{-1536,586},{-1600,586},{-1474,603},{-1475,602},{-1475,603},{-1473,603},{-1451,603},{-1478,602},{-1477,603},{-1478,605},{-1452,604},{-1451,604},{-1455,603},{-1456,603},{-1464,604},{-1461,604},{-1466,602},{-1467,603},{-1465,604},{-1467,604},{-1466,605},{-1458,604},{-1494,600},{-1496,598},{-1495,597},{-1497,600},{-1499,599},{-1498,598},{-1500,598},{-1501,597},{-1501,596},{-1502,596},{-1504,595},{-1502,597},{-1505,595},{-1505,596},{-1507,595},{-1510,592},{-1510,593},{-1516,592},{-1520,592},{-1519,594},{-1509,598},{-1514,596},{-1519,597},{-1512,605},{-1514,607},{-1504,610},{-1490,608},{-1501,612},{-1493,615},{-1495,615},{-1500,612},{-1507,613},{-1515,610},{-1518,608},{-1517,607},{-1519,608},{-1523,605},{-1522,604},{-1527,602},{-1527,599},{-1532,599},{-1530,598},{-1532,596},{-1534,596},{-1533,597},{-1535,598},{-1535,596},{-1537,596},{-1536,596},{-1539,595},{-1537,594},{-1541,593},{-1543,591},{-1542,590},{-1533,588},{-1541,585},{-1540,584},{-1544,583},{-1541,583},{-1543,582},{-1542,581},{-1545,582},{-1546,580},{-1550,580},{-1553,577},{-1556,578},{-1557,575},{-1560,576},{-1560,574},{-1565,573},{-1566,571},{-1566,570},{-1568,570},{-1572,568},{-1574,569},{-1576,567},{-1575,566},{-1578,567},{-1581,565},{-1578,566},{-1579,565},{-1584,565},{-1587,563},{-1585,561},{-1584,560},{-1586,560},{-1585,562},{-1586,562},{-1587,559},{-1588,560},{-1596,556},{-1597,556},{-1596,558},{-1598,559},{-1604,557},{-1605,555},{-1606,556},{-1608,555},{-1607,555},{-1609,555},{-1612,554},{-1615,554},{-1614,556},{-1616,556},{-1620,558},{-1618,559},{-1614,560},{-1614,559},{-1610,559},{-1608,557},{-1607,557},{-1603,558},{-1606,559},{-1603,563},{-1589,569},{-1590,568},{-1587,568},{-1587,570},{-1584,573},{-1578,575},{-1576,575},{-1577,576},{-1576,581},{-1574,582},{-1575,584},{-1570,587},{-1569,590},{-1582,586},{-1586,588},{-1583,590},{-1584,591},{-1589,587},{-1587,585},{-1589,584},{-1596,588},{-1596,590},{-1599,588},{-1603,589},{-1603,591},{-1617,586},{-1620,586},{-1618,588},{-1620,592},{-1620,594},{-1617,595},{-1620,598},{-1620,634},{-1611,635},{-1608,638},{-1610,642},{-1615,644},{-1614,645},{-1608,646},{-1609,648},{-1612,649},{-1620,647},{-1620,661},{-1615,663},{-1615,664},{-1619,663},{-1619,665},{-1620,666},{-1616,664},{-1612,665},{-1619,667},{-1615,670},{-1620,670},{-1620,703},{-1608,704},{-1593,709},{-1579,709},{-1575,710},{-1568,713},{-1565,714},{-1564,714},{-1566,713},{-1555,711},{-1561,710},{-1559,709},{-1561,709},{-1559,708},{-1560,708},{-1555,709},{-1546,710},{-1548,709},{-1542,708},{-1532,709},{-1523,708},{-1525,706},{-1521,706},{-1526,706},{-1518,705},{-1517,706},{-1520,704},{-1507,705},{-1508,705},{-1495,705},{-1450,700},{-1410,696},{-1410,598},{-1414,599},{-1415,599},{-1412,600},{-1414,601},{-1415,601},{-1414,600},{-1417,599},{-1428,601},{-1439,600},{-1443,600},{-1440,600},{-1442,602},{-1449,603},{-1447,605},{-1455,604},{-1453,604},{-1454,605},{-1456,607},{-1463,606},{-1460,607},{-1461,608},{-1465,607},{-1466,608},{-1465,610},{-1466,611},{-1463,611},{-1462,611},{-1470,609},{-1472,610},{-1474,610},{-1475,610},{-1475,612},{-1477,610},{-1476,608},{-1477,613},{-1483,610},{-1484,608},{-1485,608},{-1487,608},{-1486,607},{-1487,607},{-1484,606},{-1484,607},{-1485,605},{-1483,604},{-1485,602},{-1483,602},{-1484,599},{-1486,600},{-1486,599},{-1491,600},{-1490,601},{-1494,601}}}, + {"Asia/Kolkata",516,{{735,159},{932,82},{931,82},{931,84},{931,83},{936,84},{929,88},{928,88},{937,72},{939,72},{938,67},{937,70},{937,73},{936,74},{937,74},{936,80},{936,81},{934,80},{935,79},{933,79},{935,80},{936,79},{930,84},{930,85},{936,86},{936,85},{932,83},{935,82},{726,105},{726,106},{924,105},{924,108},{925,109},{926,106},{722,108},{722,109},{737,108},{789,92},{791,92},{736,101},{723,101},{737,101},{792,92},{730,83},{731,83},{730,82},{786,91},{788,92},{927,91},{927,92},{928,93},{928,91},{721,112},{926,109},{723,109},{922,110},{927,110},{727,111},{927,113},{927,112},{728,112},{728,113},{719,124},{943,134},{931,136},{931,137},{930,136},{930,137},{823,166},{741,149},{734,159},{738,154},{742,147},{741,147},{741,148},{740,148},{735,160},{745,140},{743,140},{745,141},{744,143},{929,136},{730,115},{926,114},{926,115},{927,114},{926,113},{722,116},{928,117},{727,117},{931,118},{926,116},{925,116},{923,115},{922,115},{922,116},{923,116},{931,121},{939,123},{938,123},{927,128},{927,127},{927,129},{928,129},{747,132},{927,130},{929,129},{929,130},{930,129},{930,130},{927,131},{930,121},{929,122},{930,122},{929,123},{929,124},{930,123},{930,124},{927,125},{931,122},{931,123},{930,118},{930,120},{928,119},{927,120},{928,120},{927,119},{926,119},{926,120},{930,119},{929,120},{931,119},{696,224},{931,120},{930,133},{930,131},{930,125},{927,115},{925,118},{927,123},{928,134},{931,134},{929,135},{747,133},{747,134},{695,224},{694,224},{693,224},{705,230},{705,231},{682,236},{684,236},{685,236},{683,236},{685,237},{683,239},{682,238},{682,239},{686,237},{686,238},{691,224},{691,225},{694,225},{693,225},{699,225},{700,226},{700,225},{699,226},{697,227},{696,228},{704,230},{704,229},{703,229},{704,231},{725,222},{727,222},{724,222},{728,188},{729,188},{729,190},{731,190},{730,190},{728,187},{835,179},{803,134},{802,125},{798,118},{799,103},{793,103},{789,95},{791,93},{793,93},{794,92},{790,93},{784,91},{782,89},{781,84},{776,81},{773,81},{765,89},{757,114},{752,121},{744,144},{735,161},{732,173},{733,173},{729,187},{731,188},{729,189},{730,192},{728,189},{728,193},{729,193},{728,194},{727,198},{730,208},{728,208},{729,210},{727,210},{728,212},{726,211},{727,213},{726,214},{731,217},{725,217},{728,220},{725,219},{726,222},{728,222},{726,223},{724,221},{724,223},{721,212},{710,207},{706,208},{689,223},{692,223},{702,226},{692,228},{684,234},{687,238},{688,238},{688,239},{684,237},{683,237},{682,237},{684,240},{687,240},{688,243},{700,242},{706,244},{707,242},{711,244},{710,244},{711,247},{707,254},{707,257},{703,257},{701,259},{702,266},{695,267},{696,272},{704,280},{706,280},{709,277},{719,280},{724,288},{729,290},{734,299},{740,302},{739,305},{747,311},{745,312},{746,315},{745,318},{754,322},{751,325},{747,325},{747,328},{745,327},{740,332},{742,335},{740,337},{743,340},{739,340},{740,343},{738,344},{740,347},{744,348},{757,345},{767,348},{767,349},{770,349},{778,355},{781,355},{780,353},{782,347},{790,343},{787,341},{787,337},{793,329},{793,325},{791,324},{788,324},{787,327},{784,325},{788,316},{788,313},{790,311},{799,310},{802,306},{811,302},{804,297},{801,288},{812,284},{819,279},{827,277},{828,275},{833,273},{834,275},{839,274},{842,275},{846,273},{846,270},{852,268},{856,269},{859,266},{863,266},{867,264},{871,266},{873,264},{879,265},{880,264},{882,268},{880,271},{881,279},{886,281},{889,278},{888,275},{889,273},{888,271},{891,268},{899,267},{904,269},{907,268},{919,268},{921,269},{921,273},{920,275},{916,275},{917,278},{925,279},{927,280},{927,281},{932,284},{933,287},{939,288},{940,290},{947,293},{953,291},{961,295},{963,292},{964,293},{961,291},{962,289},{965,291},{966,288},{963,284},{971,284},{974,282},{974,279},{969,276},{972,271},{967,274},{962,273},{951,266},{952,261},{946,254},{946,252},{947,250},{942,239},{933,241},{934,231},{931,230},{932,223},{929,219},{927,222},{926,220},{923,237},{920,237},{918,231},{916,229},{914,233},{913,231},{912,236},{914,241},{918,242},{919,241},{920,244},{921,244},{923,248},{925,249},{924,250},{921,252},{904,251},{899,253},{899,259},{897,262},{896,260},{894,260},{891,264},{889,264},{891,263},{890,262},{887,263},{887,264},{884,266},{883,265},{885,264},{882,261},{881,258},{885,255},{888,255},{890,253},{889,252},{884,252},{883,249},{881,249},{880,247},{881,245},{887,243},{888,240},{886,236},{888,235},{887,233},{890,232},{889,230},{891,222},{890,219},{891,216},{889,218},{889,216},{887,217},{888,220},{886,221},{884,216},{884,220},{884,218},{883,218},{883,219},{883,216},{882,222},{880,222},{882,221},{878,217},{869,213},{868,211},{871,207},{864,200},{856,197},{850,193},{841,183},{823,170},{817,163},{813,163},{809,157},{807,159},{803,157},{800,151},{727,195},{867,203},{868,204},{868,205},{729,207},{729,206},{728,207},{729,208},{727,211},{726,213},{888,216},{889,215},{724,216},{723,216},{726,210},{883,217},{886,216},{886,217},{885,217},{881,217},{881,216},{881,218},{882,217},{884,217},{886,218},{882,215},{882,216},{885,216},{885,215},{887,216},{885,218},{728,210},{728,209},{729,217},{887,220},{887,219},{886,220},{726,216},{728,216},{881,220},{726,217},{726,218},{882,218},{886,219},{885,219},{881,219},{882,219}}}, + {"Pacific/Niue",4,{{-1699,-190},{-1698,-190},{-1698,-191},{-1699,-192}}}, + {"Asia/Kamchatka",190,{{1595,532},{1573,512},{1565,519},{1565,520},{1680,545},{1677,547},{1674,549},{1681,545},{1667,547},{1659,552},{1657,553},{1662,553},{1662,552},{1666,549},{1622,605},{1628,608},{1633,609},{1633,608},{1725,611},{1630,615},{1626,616},{1625,616},{1627,616},{1635,623},{1625,578},{1624,578},{1634,586},{1639,590},{1637,590},{1646,592},{1648,590},{1647,589},{1642,588},{1635,585},{1604,595},{1605,595},{1647,596},{1628,573},{1628,568},{1632,568},{1634,562},{1631,560},{1626,562},{1621,561},{1617,554},{1621,548},{1617,545},{1609,546},{1600,542},{1598,538},{1600,535},{1598,534},{1600,531},{1598,533},{1587,529},{1586,530},{1584,530},{1586,529},{1585,528},{1586,526},{1584,526},{1586,523},{1579,516},{1567,509},{1568,511},{1565,513},{1566,519},{1567,519},{1562,528},{1556,550},{1557,560},{1560,567},{1570,574},{1569,578},{1575,578},{1577,580},{1582,580},{1591,584},{1597,589},{1599,591},{1619,602},{1621,605},{1630,608},{1638,608},{1635,610},{1640,613},{1638,615},{1641,617},{1642,623},{1652,625},{1645,627},{1633,625},{1631,624},{1634,623},{1631,622},{1632,621},{1630,618},{1633,617},{1628,617},{1626,617},{1628,616},{1625,617},{1623,619},{1625,621},{1622,622},{1627,623},{1627,626},{1628,627},{1623,629},{1623,631},{1628,632},{1627,634},{1630,635},{1627,638},{1629,639},{1628,641},{1635,644},{1632,646},{1633,647},{1631,648},{1642,649},{1649,647},{1652,649},{1657,648},{1659,646},{1672,646},{1677,643},{1685,643},{1689,640},{1694,640},{1696,637},{1684,631},{1701,627},{1700,625},{1703,623},{1709,622},{1720,625},{1728,623},{1737,625},{1741,625},{1741,621},{1745,620},{1745,618},{1740,618},{1741,618},{1738,616},{1735,617},{1733,614},{1727,614},{1729,613},{1727,613},{1728,613},{1722,611},{1725,610},{1720,611},{1722,610},{1721,608},{1707,604},{1703,599},{1694,605},{1684,606},{1671,604},{1663,598},{1661,598},{1664,604},{1663,605},{1650,601},{1652,600},{1649,598},{1645,601},{1642,599},{1641,599},{1643,600},{1635,599},{1634,596},{1632,596},{1633,596},{1632,595},{1634,593},{1631,592},{1633,591},{1632,591},{1630,592},{1631,590},{1624,587},{1620,581},{1622,578},{1627,579},{1633,577},{1565,572}}}, + {"Europe/Stockholm",526,{{203,636},{203,637},{185,629},{175,587},{128,559},{127,559},{161,563},{148,560},{149,560},{158,560},{158,561},{150,561},{154,561},{152,561},{157,561},{155,561},{156,561},{156,562},{157,562},{155,562},{154,562},{122,571},{165,568},{164,568},{165,569},{165,570},{166,570},{163,586},{164,586},{166,571},{167,571},{126,564},{125,564},{126,565},{193,583},{192,583},{192,584},{193,584},{170,582},{170,583},{114,581},{114,582},{168,581},{169,581},{115,582},{169,582},{116,582},{115,583},{169,583},{114,583},{118,583},{116,583},{117,583},{168,583},{192,597},{112,583},{113,583},{113,584},{112,584},{169,584},{168,584},{116,584},{167,584},{170,584},{169,585},{112,585},{112,586},{113,585},{170,585},{113,586},{110,589},{111,590},{112,587},{111,587},{111,588},{112,588},{111,589},{112,589},{118,576},{119,576},{188,573},{180,573},{185,571},{181,573},{190,574},{166,576},{116,577},{117,577},{116,578},{117,578},{118,578},{117,579},{116,579},{167,567},{164,562},{164,565},{171,574},{120,573},{119,573},{119,574},{120,574},{121,573},{122,572},{165,572},{165,571},{166,572},{166,573},{167,575},{167,574},{167,576},{117,576},{115,580},{115,581},{118,581},{117,581},{116,581},{117,580},{118,580},{191,578},{190,578},{166,578},{167,578},{167,577},{166,579},{168,580},{182,569},{183,571},{181,575},{187,579},{190,579},{188,576},{189,574},{118,577},{189,577},{190,577},{167,580},{167,579},{168,579},{168,578},{191,580},{194,580},{192,579},{118,582},{192,598},{191,597},{191,598},{191,596},{190,596},{190,597},{190,598},{173,611},{173,612},{172,614},{184,605},{177,606},{176,606},{176,607},{175,607},{185,603},{184,603},{186,603},{184,604},{191,599},{188,601},{186,602},{188,602},{187,602},{185,602},{184,602},{187,603},{173,607},{174,607},{175,608},{173,609},{172,610},{173,610},{173,608},{174,608},{213,649},{212,649},{216,650},{215,650},{194,634},{194,635},{208,636},{199,635},{195,635},{196,635},{195,634},{208,637},{209,637},{209,636},{210,638},{209,638},{202,637},{206,638},{206,637},{239,658},{238,658},{241,658},{232,658},{235,658},{234,658},{238,656},{237,656},{240,656},{242,657},{241,657},{229,657},{228,657},{235,657},{238,657},{237,657},{237,658},{240,657},{230,656},{230,657},{231,657},{236,657},{232,657},{233,657},{234,657},{233,658},{217,651},{217,652},{216,651},{220,652},{219,652},{218,652},{219,653},{220,653},{218,653},{221,654},{226,654},{226,655},{225,654},{224,654},{223,654},{223,655},{220,654},{228,655},{227,655},{221,655},{228,656},{220,655},{225,655},{223,656},{227,656},{222,654},{222,655},{224,655},{222,656},{215,653},{215,654},{216,654},{219,654},{217,653},{217,654},{218,654},{219,655},{228,659},{227,659},{224,658},{226,658},{228,658},{227,658},{225,658},{224,656},{225,656},{226,656},{224,657},{223,657},{225,657},{226,657},{227,657},{174,615},{174,616},{175,615},{173,616},{172,616},{175,617},{176,617},{171,616},{175,619},{175,620},{182,628},{183,628},{180,628},{179,629},{186,630},{187,630},{183,629},{186,631},{185,630},{185,631},{187,631},{188,631},{187,632},{176,632},{177,632},{189,632},{188,633},{192,633},{189,633},{188,632},{177,622},{178,622},{178,624},{177,624},{174,624},{174,625},{175,624},{176,624},{175,625},{179,626},{180,626},{181,626},{180,627},{181,627},{182,627},{188,595},{188,596},{187,596},{189,596},{189,597},{188,597},{190,599},{189,598},{186,591},{183,591},{184,591},{182,591},{185,590},{186,590},{180,590},{182,589},{183,590},{184,590},{180,589},{182,590},{181,590},{177,590},{176,590},{185,591},{171,587},{179,587},{179,588},{175,588},{173,587},{174,588},{181,589},{177,588},{177,589},{176,589},{176,588},{178,588},{178,589},{177,591},{124,563},{128,562},{129,564},{129,566},{124,569},{121,575},{119,583},{117,584},{116,585},{115,584},{115,585},{114,585},{113,591},{115,589},{117,589},{118,592},{117,596},{119,597},{119,598},{124,600},{126,604},{122,610},{127,611},{129,614},{121,617},{123,623},{121,626},{122,630},{120,633},{122,635},{121,636},{127,640},{132,641},{140,640},{141,642},{141,645},{136,646},{145,653},{146,658},{145,661},{155,663},{154,665},{164,670},{162,675},{164,675},{167,679},{173,681},{179,680},{182,682},{181,685},{200,684},{203,685},{200,686},{203,688},{201,691},{208,690},{220,685},{231,683},{237,680},{234,675},{238,674},{236,672},{240,668},{237,663},{242,658},{231,659},{223,659},{221,656},{220,656},{217,658},{218,657},{214,654},{213,654},{214,651},{210,648},{216,644},{211,642},{207,638},{205,638},{204,637},{203,638},{200,637},{197,634},{194,636},{193,635},{190,632},{187,633},{182,630},{181,628},{178,631},{173,625},{174,623},{175,622},{173,619},{175,616},{171,617},{170,616},{172,615},{171,615},{173,613},{171,613},{171,609},{172,607},{177,605},{180,606},{182,603},{183,603},{186,601},{187,601},{188,600},{188,599},{187,598},{182,594},{183,594},{180,594},{185,592},{179,589},{177,592},{171,588},{169,586},{164,587},{162,586},{163,585},{166,583},{166,582},{165,579},{164,579},{165,577},{165,576},{165,573},{161,562},{159,561},{147,562},{145,561},{142,559},{144,556},{142,554},{134,553},{128,554},{131,557},{182,593},{181,594},{190,594},{189,594},{188,594},{184,594},{187,594},{186,594},{185,594},{186,595},{187,595},{185,595},{187,591},{188,592},{188,591},{186,592},{187,592},{189,592},{190,593},{189,593},{187,593},{185,593},{188,593},{184,592},{184,593},{183,593},{186,593},{189,595}}}, + {"America/Havana",287,{{-806,231},{-806,232},{-788,215},{-793,210},{-793,211},{-772,199},{-772,203},{-772,204},{-779,206},{-784,206},{-778,205},{-776,205},{-778,206},{-785,206},{-786,206},{-787,207},{-786,207},{-783,206},{-783,205},{-784,205},{-782,206},{-774,206},{-781,206},{-783,207},{-781,207},{-749,207},{-796,215},{-794,211},{-788,214},{-782,208},{-790,209},{-790,208},{-791,209},{-792,210},{-789,208},{-783,208},{-786,208},{-788,208},{-787,208},{-788,207},{-777,207},{-784,207},{-778,221},{-785,207},{-782,207},{-785,208},{-790,210},{-790,211},{-789,211},{-785,213},{-787,211},{-777,221},{-778,222},{-788,216},{-822,215},{-822,216},{-831,216},{-824,216},{-825,216},{-823,216},{-830,216},{-811,217},{-825,217},{-824,217},{-826,217},{-815,216},{-814,217},{-816,216},{-819,216},{-819,217},{-818,217},{-817,216},{-820,216},{-821,216},{-820,217},{-815,217},{-818,216},{-776,218},{-774,218},{-775,218},{-776,219},{-777,219},{-808,232},{-799,217},{-821,217},{-778,219},{-844,224},{-845,224},{-844,225},{-843,225},{-810,232},{-809,232},{-810,233},{-796,235},{-795,235},{-796,236},{-809,233},{-805,232},{-807,232},{-802,231},{-803,231},{-804,231},{-807,231},{-805,231},{-802,232},{-812,232},{-811,232},{-813,231},{-803,232},{-804,232},{-809,231},{-808,231},{-810,231},{-843,226},{-842,226},{-788,227},{-789,227},{-839,228},{-838,228},{-790,226},{-791,226},{-796,228},{-795,227},{-790,227},{-795,226},{-791,227},{-794,227},{-794,226},{-827,226},{-827,227},{-825,226},{-825,227},{-797,228},{-837,228},{-836,229},{-835,229},{-797,229},{-833,229},{-834,229},{-799,229},{-798,229},{-793,226},{-792,226},{-829,221},{-828,222},{-798,230},{-799,230},{-800,230},{-804,230},{-801,230},{-803,230},{-802,230},{-820,222},{-781,222},{-816,222},{-803,229},{-801,231},{-812,231},{-811,231},{-836,220},{-835,220},{-781,221},{-819,222},{-779,222},{-784,222},{-784,223},{-783,223},{-783,222},{-779,221},{-780,221},{-817,222},{-817,221},{-812,221},{-813,221},{-819,221},{-818,221},{-818,222},{-780,222},{-782,221},{-782,222},{-815,221},{-815,222},{-816,221},{-777,222},{-779,223},{-832,218},{-832,219},{-833,220},{-834,220},{-834,219},{-829,219},{-827,219},{-826,216},{-831,215},{-832,216},{-831,218},{-747,206},{-741,202},{-751,199},{-758,200},{-777,198},{-771,204},{-773,207},{-781,208},{-785,210},{-787,216},{-792,215},{-798,217},{-805,221},{-811,221},{-812,223},{-822,224},{-816,225},{-819,227},{-828,227},{-834,222},{-839,222},{-840,219},{-845,218},{-845,219},{-850,219},{-843,220},{-844,222},{-832,230},{-822,232},{-811,230},{-799,228},{-794,224},{-779,219},{-779,220},{-778,220},{-776,221},{-777,218},{-773,216},{-761,211},{-757,211},{-756,208},{-780,220},{-826,220},{-827,220},{-817,220},{-816,220},{-812,220},{-813,220},{-829,220},{-828,221},{-814,221},{-814,220},{-826,218},{-825,218},{-826,219},{-818,219},{-780,223},{-780,224},{-779,224},{-781,224},{-783,224},{-782,223},{-784,224},{-781,225},{-782,225},{-782,224},{-785,224},{-786,224},{-786,225},{-783,225},{-828,223},{-821,224},{-825,224},{-793,224},{-823,225},{-825,225},{-787,225},{-791,225},{-788,225},{-789,225},{-790,225},{-792,224},{-793,225},{-785,225},{-784,226},{-824,225},{-787,226},{-786,226},{-795,225},{-792,225},{-826,226}}}, + {"Pacific/Auckland",304,{{1788,-496},{1666,-460},{1661,-511},{1692,-525},{1692,-526},{1690,-525},{1691,-525},{1662,-509},{1661,-509},{1659,-509},{1659,-508},{1663,-505},{1662,-505},{1662,-507},{1661,-507},{1662,-508},{1660,-506},{1788,-497},{1787,-497},{1666,-480},{1665,-480},{1791,-477},{1790,-477},{1674,-472},{1674,-471},{1677,-470},{1677,-469},{1677,-472},{1676,-472},{1686,-468},{1685,-468},{1685,-467},{1681,-469},{1682,-469},{1682,-468},{1676,-468},{1676,-467},{1677,-468},{1674,-473},{1666,-458},{1668,-458},{1668,-457},{1669,-457},{1668,-456},{1666,-457},{1665,-457},{1667,-458},{1676,-473},{1677,-467},{1680,-469},{1679,-470},{1682,-471},{1669,-453},{1669,-452},{1670,-451},{1670,-453},{1715,-419},{1715,-418},{1727,-436},{1678,-465},{1678,-464},{1679,-464},{1666,-461},{1667,-461},{1665,-461},{1665,-460},{1665,-458},{1666,-456},{1667,-457},{1664,-457},{1665,-456},{1684,-466},{1685,-466},{1669,-466},{1779,-393},{1772,-375},{1763,-373},{1762,-373},{1761,-369},{1761,-370},{1770,-379},{1770,-378},{1764,-376},{1759,-371},{1759,-370},{1760,-370},{1759,-366},{1759,-367},{1749,-367},{1751,-369},{1752,-369},{1757,-369},{1749,-368},{1748,-368},{1752,-368},{1750,-368},{1747,-360},{1747,-359},{1752,-367},{1754,-368},{1754,-367},{1754,-361},{1754,-360},{1751,-360},{1751,-359},{1748,-359},{1747,-355},{1747,-354},{1745,-357},{1742,-352},{1741,-352},{1721,-342},{1721,-341},{-1786,-305},{-1784,-302},{-1780,-292},{-1779,-293},{-1780,-293},{1739,-350},{1740,-350},{1738,-350},{1758,-366},{1757,-366},{1749,-366},{1748,-365},{1758,-364},{1751,-362},{1750,-362},{1753,-362},{1749,-364},{1748,-364},{1754,-362},{1755,-363},{1754,-363},{1755,-361},{1732,-413},{1740,-412},{1731,-413},{1691,-467},{1683,-466},{1682,-465},{1684,-465},{1683,-464},{1683,-465},{1681,-463},{1677,-461},{1667,-462},{1669,-459},{1668,-459},{1664,-459},{1670,-457},{1670,-456},{1667,-456},{1669,-455},{1670,-455},{1667,-454},{1668,-454},{1669,-454},{1668,-453},{1672,-455},{1672,-453},{1672,-452},{1673,-450},{1671,-450},{1673,-448},{1674,-450},{1674,-448},{1675,-449},{1675,-447},{1677,-446},{1678,-446},{1679,-447},{1678,-445},{1684,-440},{1688,-440},{1708,-429},{1711,-426},{1717,-417},{1721,-414},{1721,-409},{1726,-405},{1729,-405},{1730,-405},{1730,-406},{1728,-405},{1727,-407},{1731,-409},{1730,-411},{1738,-409},{1739,-410},{1740,-409},{1738,-410},{1738,-411},{1739,-411},{1737,-413},{1741,-412},{1739,-412},{1740,-411},{1740,-410},{1743,-410},{1742,-412},{1739,-413},{1743,-412},{1740,-414},{1743,-417},{1733,-429},{1727,-432},{1728,-436},{1730,-437},{1731,-438},{1724,-439},{1713,-443},{1712,-449},{1706,-457},{1707,-458},{1705,-459},{1707,-459},{1702,-460},{1696,-466},{1734,-412},{1734,-411},{1748,-411},{1744,-411},{1744,-412},{1743,-411},{1731,-410},{1741,-409},{1749,-409},{1749,-408},{1741,-410},{1764,-407},{1760,-412},{1754,-416},{1749,-414},{1749,-412},{1746,-413},{1752,-407},{1752,-402},{1749,-399},{1739,-395},{1737,-393},{1745,-389},{1748,-380},{1748,-373},{1742,-365},{1744,-366},{1744,-363},{1744,-364},{1743,-364},{1743,-363},{1745,-362},{1744,-362},{1744,-361},{1743,-362},{1743,-361},{1742,-361},{1742,-363},{1740,-361},{1740,-364},{1730,-352},{1732,-350},{1727,-344},{1730,-344},{1730,-346},{1733,-350},{1734,-348},{1734,-350},{1741,-351},{1740,-351},{1740,-352},{1741,-353},{1743,-352},{1746,-359},{1745,-360},{1747,-364},{1748,-370},{1750,-369},{1753,-370},{1753,-372},{1756,-372},{1754,-365},{1756,-368},{1758,-367},{1757,-368},{1758,-369},{1760,-375},{1766,-378},{1773,-380},{1780,-375},{1786,-377},{1783,-380},{1783,-385},{1779,-387},{1780,-391},{1779,-391},{1777,-391},{1770,-392},{1769,-394},{1771,-396},{1770,-398},{1740,-408},{1738,-408},{1740,-407},{1739,-409}}}, + {"America/Matamoros",28,{{-986,259},{-993,263},{-995,267},{-997,269},{-998,274},{-1005,281},{-1009,289},{-1016,295},{-1025,295},{-1026,291},{-1031,287},{-1034,288},{-1033,290},{-1029,292},{-1027,297},{-1023,299},{-1014,298},{-1007,291},{-1003,283},{-995,276},{-995,270},{-991,264},{-982,261},{-977,260},{-974,258},{-971,259},{-972,256},{-974,256}}}, + {"America/Rainy_River",2,{{-945,487},{-946,487}}}, + {"Asia/Omsk",134,{{750,585},{754,585},{751,583},{752,582},{751,581},{756,579},{756,576},{761,573},{763,567},{758,564},{761,565},{763,562},{757,561},{753,559},{754,558},{751,558},{753,555},{751,554},{754,550},{753,549},{758,547},{757,541},{745,537},{744,535},{739,536},{734,534},{733,537},{735,539},{737,539},{738,541},{733,540},{726,541},{725,540},{727,539},{725,539},{724,541},{725,541},{721,544},{722,541},{718,542},{717,541},{711,541},{710,543},{712,544},{713,546},{709,549},{710,551},{708,553},{703,552},{708,556},{705,557},{708,559},{705,559},{709,560},{708,563},{709,564},{708,565},{711,566},{711,567},{717,568},{711,573},{707,572},{704,574},{707,576},{704,579},{709,585},{713,584},{712,581},{729,580},{731,581},{742,581},{884,522},{878,518},{881,518},{879,515},{884,513},{887,516},{890,514},{891,511},{899,505},{895,505},{893,502},{895,502},{897,498},{889,495},{882,495},{881,493},{874,491},{866,496},{868,498},{862,495},{853,496},{850,501},{843,502},{840,508},{834,510},{827,509},{825,507},{815,508},{814,510},{811,509},{811,512},{807,513},{804,512},{805,510},{801,508},{791,520},{778,533},{781,535},{779,536},{784,535},{787,537},{795,537},{809,544},{816,539},{819,540},{817,538},{818,537},{822,537},{825,535},{832,541},{834,539},{836,541},{845,541},{852,545},{854,542},{861,540},{866,535},{870,535},{867,532},{871,531},{869,529},{872,526},{884,525}}}, + {"Africa/Algiers",85,{{-11,357},{-9,358},{94,300},{98,294},{100,279},{98,273},{99,266},{94,262},{100,253},{100,249},{102,246},{110,245},{114,242},{116,242},{120,235},{74,208},{58,194},{33,190},{31,192},{33,194},{32,198},{24,201},{22,203},{18,203},{16,206},{12,207},{12,211},{0,219},{-87,273},{-87,287},{-82,290},{-71,296},{-65,296},{-51,300},{-48,306},{-36,309},{-38,312},{-37,316},{-28,318},{-29,321},{-12,321},{-13,323},{-10,325},{-15,330},{-15,331},{-17,333},{-16,336},{-17,337},{-17,345},{-18,346},{-17,348},{-22,351},{-14,353},{-8,358},{-6,357},{-4,359},{-1,358},{2,361},{9,365},{25,366},{30,368},{48,369},{53,366},{64,371},{69,369},{72,369},{72,371},{79,368},{86,369},{87,368},{82,365},{84,364},{83,358},{83,353},{85,352},{83,347},{76,342},{75,338},{77,333},{81,331},{83,328},{84,325},{91,320},{96,302},{94,302}}}, + {"America/Guayaquil",89,{{-802,-34},{-803,-34},{-803,-33},{-804,-32},{-801,-33},{-800,-33},{-801,-34},{-802,-33},{-800,-32},{-810,-13},{-811,-13},{-809,-16},{-790,12},{-788,14},{-789,14},{-800,4},{-801,4},{-801,5},{-802,-27},{-801,-27},{-799,-27},{-784,-38},{-786,-45},{-790,-50},{-793,-50},{-796,-44},{-798,-45},{-801,-43},{-804,-45},{-803,-42},{-805,-41},{-802,-39},{-802,-35},{-799,-32},{-797,-25},{-798,-23},{-799,-26},{-799,-24},{-800,-25},{-799,-23},{-800,-23},{-803,-26},{-803,-27},{-810,-22},{-807,-20},{-808,-16},{-807,-14},{-809,-11},{-806,-9},{-804,-6},{-804,-7},{-803,-7},{-805,-4},{-800,1},{-801,8},{-792,11},{-780,8},{-777,8},{-774,4},{-766,2},{-763,4},{-753,-1},{-756,-1},{-756,-3},{-752,-5},{-752,-10},{-754,-9},{-755,-15},{-761,-21},{-766,-26},{-778,-30},{-782,-34},{-781,-35},{-783,-34},{-800,-28},{-801,-29},{-801,-30},{-803,-31},{-804,-30},{-803,-30},{-802,-26},{-800,-27},{-800,-26},{-801,-26},{-798,-26},{-797,-26},{-798,-27},{-798,-25},{-798,-24}}}, + {"Indian/Maldives",141,{{732,-6},{731,-6},{734,-3},{732,-7},{731,-7},{732,2},{731,2},{734,3},{730,3},{735,3},{735,4},{730,4},{730,5},{735,5},{729,5},{734,6},{731,7},{732,7},{734,7},{734,8},{733,18},{735,18},{734,18},{735,19},{733,19},{732,19},{736,19},{733,20},{736,20},{735,20},{735,21},{736,21},{730,22},{731,22},{732,22},{729,23},{730,23},{733,23},{729,24},{734,24},{733,25},{729,27},{730,27},{730,28},{734,28},{730,29},{729,29},{728,29},{735,29},{736,29},{730,30},{736,30},{729,31},{730,31},{730,32},{730,33},{735,35},{728,35},{729,35},{729,36},{728,36},{734,37},{727,37},{734,39},{734,38},{735,39},{727,40},{729,40},{727,41},{735,41},{729,41},{735,42},{729,42},{730,43},{733,43},{734,43},{736,44},{730,44},{737,44},{734,46},{735,46},{736,46},{729,49},{734,50},{730,49},{729,50},{730,51},{731,51},{731,52},{731,53},{736,53},{733,54},{736,54},{734,54},{735,55},{730,55},{733,55},{734,55},{730,56},{733,57},{734,57},{734,58},{730,58},{735,59},{730,59},{731,58},{730,53},{734,59},{734,60},{732,60},{730,60},{731,60},{733,61},{732,61},{733,62},{732,62},{730,63},{732,63},{729,63},{732,64},{727,64},{731,63},{729,64},{730,65},{729,66},{730,66},{729,67},{731,67},{730,67},{732,68},{732,67},{731,68},{730,69},{730,68},{732,70},{732,69},{729,70},{730,70},{728,71},{729,71},{731,69}}}, + {"Asia/Makassar",831,{{1177,-84},{1170,36},{1171,36},{1173,36},{1226,-108},{1227,-108},{1228,-108},{1228,-110},{1229,-110},{1229,-107},{1230,-109},{1229,-109},{1216,-106},{1215,-106},{1220,-105},{1219,-106},{1217,-106},{1219,-104},{1234,-105},{1234,-107},{1228,-109},{1236,-100},{1201,-103},{1202,-103},{1233,-103},{1234,-103},{1234,-102},{1194,-88},{1194,-87},{1234,-101},{1235,-102},{1199,-93},{1208,-100},{1207,-102},{1205,-103},{1202,-102},{1197,-98},{1192,-98},{1189,-96},{1192,-94},{1155,-88},{1159,-88},{1159,-87},{1160,-88},{1217,-73},{1218,-73},{1218,-72},{1217,-72},{1180,-72},{1250,-90},{1252,-91},{1250,-92},{1251,-94},{1247,-99},{1244,-102},{1235,-104},{1238,-101},{1236,-99},{1238,-95},{1240,-93},{1243,-95},{1245,-92},{1215,-89},{1203,-89},{1152,-87},{1198,-86},{1182,-86},{1178,-86},{1190,-86},{1191,-86},{1182,-87},{1195,-87},{1197,-86},{1179,-86},{1180,-86},{1181,-86},{1161,-89},{1160,-89},{1181,-73},{1156,-88},{1154,-87},{1156,-87},{1168,-88},{1198,-88},{1196,-88},{1197,-88},{1198,-87},{1155,-87},{1160,-87},{1196,-86},{1167,-87},{1192,-87},{1193,-87},{1196,-87},{1192,-68},{1210,-68},{1183,-67},{1180,-87},{1196,-85},{1194,-84},{1243,-83},{1244,-83},{1168,-84},{1161,-84},{1161,-83},{1160,-84},{1160,-83},{1167,-83},{1168,-83},{1168,-85},{1168,-86},{1243,-85},{1178,-85},{1177,-86},{1177,-85},{1170,-84},{1169,-85},{1169,-84},{1239,-84},{1198,-84},{1199,-84},{1229,-86},{1230,-84},{1232,-84},{1230,-85},{1198,-85},{1194,-85},{1192,-86},{1197,-85},{1176,-85},{1199,-85},{1224,-85},{1223,-84},{1224,-84},{1223,-85},{1228,-85},{1196,-84},{1193,-84},{1193,-85},{1238,-84},{1225,-84},{1171,-84},{1210,-84},{1200,-84},{1223,-83},{1202,-84},{1201,-83},{1202,-83},{1217,-84},{1217,-83},{1218,-83},{1236,-78},{1175,-76},{1174,-76},{1180,-75},{1173,-75},{1174,-75},{1175,-75},{1217,-75},{1218,-75},{1179,-75},{1179,-74},{1178,-74},{1221,-74},{1176,-74},{1218,-74},{1217,-74},{1177,-74},{1175,-74},{1175,-73},{1212,-74},{1211,-74},{1211,-73},{1208,-73},{1210,-73},{1172,-75},{1184,-72},{1182,-71},{1183,-71},{1206,-71},{1180,-71},{1180,-70},{1222,-69},{1189,-69},{1208,-71},{1206,-70},{1205,-71},{1205,-70},{1204,-67},{1204,-66},{1189,-66},{1188,-66},{1210,-65},{1209,-65},{1190,-69},{1191,-69},{1191,-68},{1208,-68},{1208,-69},{1246,-61},{1240,-60},{1240,-59},{1241,-60},{1205,-58},{1205,-57},{1239,-58},{1240,-58},{1239,-57},{1204,-65},{1211,-65},{1211,-64},{1227,-62},{1204,-62},{1204,-61},{1206,-61},{1205,-65},{1247,16},{1247,17},{1166,-89},{1158,-88},{1161,-88},{1164,-82},{1167,-84},{1165,-88},{1183,-86},{1177,-82},{1179,-81},{1183,-84},{1186,-83},{1186,-86},{1188,-83},{1190,-83},{1191,-88},{1187,-87},{1189,-88},{1189,-89},{1184,-89},{1184,-88},{1184,-87},{1184,-86},{1179,-89},{1170,-91},{1167,-90},{1176,-84},{1146,-81},{1152,-81},{1157,-84},{1151,-88},{1150,-86},{1145,-83},{1144,-81},{1248,16},{1251,-83},{1244,-85},{1243,-84},{1245,-81},{1251,-81},{1204,-82},{1215,-86},{1220,-84},{1223,-86},{1229,-83},{1229,-82},{1227,-82},{1228,-81},{1230,-81},{1230,-83},{1228,-84},{1228,-86},{1225,-87},{1210,-90},{1206,-88},{1199,-89},{1239,-82},{1235,-86},{1232,-85},{1235,-83},{1234,-83},{1235,-82},{1235,-84},{1236,-82},{1243,-82},{1241,-85},{1240,-83},{1241,-84},{1254,21},{1253,21},{1233,-83},{1233,-84},{1231,-82},{1175,-84},{1175,-82},{1244,-82},{1241,-82},{1240,-82},{1174,-81},{1174,-82},{1178,-81},{1177,-81},{1145,-81},{1191,-83},{1190,-82},{1191,-81},{1191,-82},{1145,-34},{1210,-27},{1189,-26},{1189,-27},{1190,-25},{1191,-24},{1254,23},{1253,23},{1250,17},{1254,24},{1255,24},{1251,18},{1250,18},{1189,18},{1248,18},{1188,20},{1185,22},{1186,21},{1185,21},{1251,19},{1181,23},{1186,22},{1186,23},{1180,24},{1253,24},{1182,23},{1182,24},{1247,9},{1249,10},{1247,8},{1246,8},{1209,14},{1185,14},{1184,14},{1253,15},{1253,16},{1253,14},{1252,14},{1248,17},{1247,18},{1252,18},{1251,17},{1255,31},{1255,32},{1256,33},{1256,34},{1257,35},{1256,35},{1256,36},{1255,34},{1256,38},{1268,37},{1268,38},{1268,39},{1256,46},{1271,46},{1271,47},{1255,47},{1271,48},{1267,38},{1267,39},{1266,40},{1269,45},{1269,43},{1267,40},{1267,45},{1254,26},{1254,27},{1255,27},{1255,26},{1254,28},{1252,28},{1252,27},{1176,30},{1175,31},{1254,31},{1176,32},{1255,33},{1254,32},{1176,31},{1176,35},{1177,35},{1176,36},{1174,34},{1175,34},{1174,35},{1175,35},{1176,33},{1176,34},{1177,34},{1175,33},{1174,36},{1254,39},{1176,41},{1177,41},{1177,40},{1176,40},{1179,42},{1179,40},{1177,42},{1175,41},{1177,36},{1175,36},{1178,35},{1178,36},{1179,35},{1254,37},{1167,-23},{1164,-22},{1164,-21},{1165,-21},{1242,-18},{1241,-18},{1241,-17},{1240,-19},{1240,-18},{1235,-8},{1234,-8},{1175,-8},{1173,-8},{1218,-7},{1175,-7},{1176,-7},{1227,-6},{1175,-6},{1216,-6},{1176,-6},{1175,-5},{1175,-4},{1218,-4},{1222,-3},{1220,-3},{1221,-3},{1222,-2},{1221,-2},{1220,-2},{1231,-22},{1232,-22},{1239,-21},{1236,-21},{1235,-21},{1239,-20},{1219,-4},{1221,-4},{1219,-3},{1223,-3},{1224,-4},{1219,-5},{1176,-5},{1226,-5},{1225,-5},{1217,-6},{1237,-22},{1234,-21},{1238,-21},{1237,-21},{1235,-20},{1235,-19},{1238,-19},{1237,-19},{1237,-20},{1236,-19},{1238,-20},{1214,-19},{1217,-19},{1215,-19},{1167,-11},{1167,-12},{1232,-13},{1233,-13},{1233,-12},{1230,-14},{1231,-14},{1214,-18},{1233,-18},{1232,-18},{1234,-19},{1219,-17},{1228,-16},{1235,-16},{1235,-15},{1230,-17},{1231,-17},{1236,-16},{1236,-17},{1235,-17},{1231,-19},{1231,-18},{1235,-18},{1233,-17},{1234,-17},{1236,-15},{1228,-15},{1180,9},{1202,10},{1236,-13},{1233,-14},{1232,-16},{1231,-16},{1229,-16},{1229,-12},{1232,-12},{1232,-14},{1174,-9},{1175,-9},{1173,-9},{1216,-1},{1216,-2},{1175,1},{1176,1},{1196,1},{1179,11},{1179,10},{1204,10},{1207,10},{1204,11},{1206,11},{1229,9},{1228,9},{1223,5},{1224,5},{1217,5},{1199,5},{1180,8},{1180,7},{1225,5},{1220,10},{1220,11},{1188,11},{1207,12},{1171,-50},{1156,-49},{1157,-49},{1222,-50},{1228,-50},{1185,-50},{1223,-49},{1194,-49},{1157,-47},{1158,-47},{1163,-38},{1231,-36},{1230,-36},{1232,-35},{1232,-36},{1211,-39},{1210,-39},{1210,-38},{1204,-57},{1204,-56},{1223,-36},{1223,-35},{1224,-36},{1231,-43},{1229,-41},{1230,-40},{1233,-41},{1162,-41},{1215,-42},{1214,-42},{1214,-41},{1215,-41},{1160,-41},{1162,-40},{1213,-41},{1211,-40},{1228,-40},{1226,-40},{1162,-32},{1163,-39},{1161,-41},{1160,-36},{1220,-49},{1221,-49},{1231,-48},{1230,-48},{1221,-48},{1158,-48},{1159,-47},{1232,-48},{1230,-47},{1231,-47},{1224,-47},{1224,-46},{1215,-47},{1195,-47},{1194,-47},{1189,-47},{1190,-47},{1223,-47},{1204,-47},{1232,-46},{1158,-44},{1223,-46},{1227,-46},{1225,-57},{1225,-56},{1227,-45},{1230,-35},{1231,-35},{1224,-33},{1160,-34},{1160,-35},{1163,-36},{1164,-34},{1164,-37},{1194,-35},{1224,-35},{1224,-34},{1225,-35},{1163,-35},{1163,-34},{1161,-34},{1161,-30},{1162,-30},{1161,-29},{1162,-29},{1162,-31},{1226,-31},{1225,-31},{1224,-31},{1224,-30},{1223,-30},{1202,-30},{1166,-23},{1165,-26},{1163,-25},{1164,-26},{1163,-30},{1161,-28},{1163,-31},{1146,-42},{1145,-33},{1144,-35},{1145,-31},{1153,-21},{1154,-15},{1156,-15},{1158,-12},{1154,-8},{1153,0},{1149,-1},{1149,3},{1151,4},{1149,8},{1144,5},{1137,6},{1141,15},{1146,14},{1147,19},{1149,19},{1148,23},{1152,25},{1151,28},{1153,31},{1155,31},{1156,34},{1156,39},{1159,44},{1161,43},{1162,44},{1172,44},{1176,42},{1174,41},{1178,37},{1175,37},{1172,36},{1172,35},{1173,32},{1177,28},{1176,28},{1178,20},{1178,18},{1190,10},{1188,8},{1184,8},{1177,8},{1175,2},{1176,-4},{1174,-7},{1176,-8},{1169,-13},{1168,-14},{1162,-18},{1164,-18},{1163,-21},{1224,-32},{1223,-33},{1222,-34},{1222,-36},{1227,-39},{1225,-40},{1227,-42},{1228,-41},{1229,-44},{1227,-43},{1226,-44},{1221,-45},{1216,-41},{1209,-35},{1211,-32},{1211,-26},{1207,-26},{1204,-33},{1203,-41},{1205,-47},{1203,-51},{1205,-56},{1203,-55},{1198,-57},{1194,-56},{1194,-53},{1196,-40},{1189,-36},{1188,-31},{1189,-29},{1188,-28},{1191,-25},{1191,-22},{1193,-19},{1193,-12},{1197,-6},{1199,-9},{1198,-1},{1196,0},{1198,2},{1199,2},{1200,7},{1203,10},{1206,8},{1208,10},{1208,13},{1215,13},{1216,11},{1224,10},{1228,8},{1230,10},{1239,8},{1246,12},{1245,14},{1248,15},{1252,17},{1252,15},{1245,4},{1236,3},{1233,3},{1231,5},{1218,4},{1215,6},{1211,4},{1205,5},{1201,2},{1201,-6},{1203,-9},{1205,-10},{1207,-14},{1211,-14},{1216,-8},{1219,-10},{1222,-8},{1230,-7},{1227,-7},{1231,-6},{1234,-7},{1233,-10},{1231,-8},{1228,-9},{1224,-15},{1213,-18},{1223,-29},{1222,-30},{1225,-32},{1239,-56},{1238,-56},{1238,-55},{1239,-55},{1185,-55},{1193,-55},{1236,-54},{1244,-53},{1243,-53},{1235,-54},{1235,-53},{1236,-53},{1179,-53},{1179,-52},{1179,-54},{1180,-54},{1218,-54},{1218,-53},{1217,-53},{1227,-53},{1227,-52},{1221,-53},{1171,-51},{1146,-51},{1170,-51},{1170,-50},{1177,-52},{1218,-51},{1182,-51},{1181,-51},{1204,-51},{1193,-51},{1179,-51},{1192,-54},{1226,-54},{1184,-54},{1192,-55},{1186,-55},{1221,-55},{1225,-55},{1237,-55},{1220,-55},{1219,-51},{1221,-52},{1229,-45},{1231,-44},{1229,-52},{1232,-53},{1227,-57},{1226,-55},{1228,-52},{1227,-50},{1225,-53},{1223,-54},{1224,-51}}}, + {"America/Monterrey",90,{{-977,250},{-976,250},{-977,249},{-977,248},{-976,246},{-977,245},{-977,246},{-1027,251},{-1025,245},{-1033,245},{-1039,241},{-1038,237},{-1041,234},{-1043,223},{-1048,227},{-1050,225},{-1049,229},{-1057,233},{-1060,242},{-1062,244},{-1065,243},{-1071,253},{-1071,256},{-1065,258},{-1064,261},{-1065,264},{-1062,264},{-1060,268},{-1053,265},{-1051,265},{-1046,264},{-1042,268},{-1036,267},{-1040,279},{-1034,288},{-1029,288},{-1026,291},{-1025,295},{-1016,295},{-1009,289},{-1005,281},{-998,274},{-997,269},{-995,267},{-992,262},{-975,256},{-972,256},{-975,250},{-974,254},{-975,255},{-976,253},{-977,254},{-978,254},{-978,250},{-976,249},{-978,248},{-978,246},{-979,245},{-977,244},{-978,240},{-977,243},{-978,223},{-982,225},{-989,223},{-992,224},{-994,227},{-1000,228},{-999,230},{-1001,232},{-1004,232},{-1004,237},{-1008,246},{-1012,248},{-1016,248},{-1018,250},{-1023,252},{-977,241},{-978,241},{-977,242},{-978,242},{-978,245},{-977,247},{-976,247},{-976,248},{-975,254},{-975,251},{-975,252},{-977,252},{-977,253},{-975,253}}}, + {"Europe/Amsterdam",89,{{42,514},{39,512},{34,513},{35,514},{41,514},{37,516},{37,517},{39,517},{39,518},{38,517},{41,517},{44,517},{43,517},{40,518},{43,518},{40,517},{50,533},{51,533},{49,532},{52,533},{52,534},{56,534},{55,534},{56,535},{60,535},{57,534},{54,531},{48,530},{47,530},{49,531},{66,535},{66,536},{65,535},{64,535},{65,536},{61,534},{61,535},{62,535},{63,535},{49,524},{60,517},{62,514},{61,512},{62,512},{59,511},{61,509},{60,508},{57,508},{58,512},{52,513},{50,515},{45,515},{44,514},{34,515},{38,516},{43,515},{40,516},{42,516},{41,516},{43,516},{45,517},{46,517},{41,518},{40,520},{46,525},{54,522},{58,524},{59,526},{56,527},{57,528},{54,529},{56,533},{67,535},{72,532},{71,526},{67,526},{71,524},{67,521},{68,520},{61,519},{51,525},{56,524},{54,523},{51,524},{57,526},{59,525},{53,527},{50,526},{50,524}}}, + {"America/St_Lucia",4,{{-609,141},{-609,139},{-609,137},{-611,139}}}, + {"Europe/Uzhgorod",12,{{229,490},{239,485},{241,485},{241,484},{243,484},{246,481},{242,479},{232,481},{229,480},{228,481},{221,484},{226,491}}}, + {"America/Indiana/Marengo",4,{{-864,381},{-867,383},{-867,384},{-863,384}}}, + {"Pacific/Saipan",32,{{1452,142},{1453,142},{1451,141},{1456,149},{1456,148},{1455,148},{1455,149},{1457,150},{1456,151},{1458,151},{1457,152},{1458,153},{1458,152},{1461,160},{1457,164},{1457,163},{1456,164},{1458,167},{1459,169},{1458,169},{1458,173},{1459,173},{1458,176},{1458,181},{1457,180},{1458,182},{1457,188},{1457,187},{1456,188},{1454,197},{1452,200},{1449,205}}}, + {"America/Bogota",172,{{-789,18},{-784,25},{-785,25},{-784,26},{-788,18},{-787,18},{-783,27},{-783,26},{-780,26},{-780,27},{-778,27},{-778,28},{-789,15},{-789,16},{-790,16},{-817,125},{-817,126},{-814,134},{-814,133},{-742,113},{-762,94},{-759,94},{-759,97},{-759,98},{-758,102},{-758,98},{-757,102},{-756,103},{-756,104},{-755,104},{-755,103},{-775,61},{-775,62},{-774,54},{-774,51},{-774,52},{-778,71},{-769,82},{-770,82},{-769,85},{-816,40},{-774,34},{-772,37},{-771,37},{-774,39},{-773,40},{-772,40},{-773,41},{-775,41},{-774,41},{-772,38},{-771,38},{-694,-10},{-694,-13},{-699,-42},{-703,-38},{-707,-38},{-700,-28},{-703,-25},{-706,-25},{-710,-22},{-714,-24},{-717,-21},{-721,-25},{-729,-25},{-732,-23},{-731,-18},{-735,-17},{-736,-13},{-743,-10},{-744,-6},{-748,-2},{-756,0},{-763,4},{-766,2},{-774,4},{-777,8},{-780,8},{-786,18},{-787,22},{-782,27},{-778,26},{-776,28},{-777,29},{-777,31},{-770,39},{-773,38},{-772,41},{-773,47},{-774,55},{-775,55},{-772,58},{-773,66},{-779,72},{-777,77},{-776,75},{-772,79},{-774,86},{-768,81},{-769,79},{-768,79},{-768,84},{-769,86},{-763,89},{-761,93},{-756,94},{-756,96},{-757,97},{-755,102},{-757,101},{-753,108},{-749,111},{-743,110},{-741,114},{-733,113},{-722,119},{-722,122},{-719,122},{-717,125},{-712,123},{-711,120},{-720,117},{-722,112},{-725,111},{-729,105},{-729,98},{-734,92},{-730,93},{-729,91},{-728,91},{-727,86},{-724,84},{-724,74},{-722,74},{-720,70},{-701,70},{-694,61},{-678,63},{-676,62},{-674,60},{-679,53},{-679,45},{-676,38},{-673,34},{-679,29},{-679,28},{-676,28},{-672,24},{-669,12},{-671,12},{-671,17},{-674,21},{-679,18},{-682,20},{-683,18},{-681,17},{-699,17},{-699,11},{-693,11},{-691,9},{-692,6},{-695,7},{-700,6},{-701,-1},{-696,-5},{-782,29},{-782,30},{-775,33},{-775,42},{-774,42},{-774,43},{-775,43}}}, + {"America/Indiana/Vevay",4,{{-849,388},{-852,387},{-852,389},{-848,389}}}, + {"America/Guatemala",26,{{-903,138},{-902,138},{-913,139},{-918,142},{-922,145},{-921,151},{-922,153},{-917,161},{-904,161},{-904,164},{-914,172},{-910,173},{-910,178},{-891,178},{-892,159},{-888,159},{-886,157},{-885,158},{-886,160},{-882,157},{-892,151},{-892,146},{-896,144},{-895,142},{-900,139},{-901,137}}}, + {"America/Puerto_Rico",20,{{-665,179},{-679,181},{-678,181},{-656,181},{-655,182},{-653,181},{-654,181},{-656,183},{-652,183},{-653,183},{-660,184},{-656,184},{-656,182},{-659,180},{-672,180},{-673,184},{-671,185},{-675,184},{-653,184},{-662,185}}}, + {"America/Marigot",3,{{-630,181},{-631,181},{-632,181}}}, + {"Africa/Juba",68,{{350,60},{353,53},{359,53},{358,48},{359,46},{344,46},{335,37},{330,39},{324,37},{322,35},{318,38},{315,37},{312,38},{309,35},{308,37},{306,36},{305,39},{302,39},{296,47},{295,47},{292,43},{288,46},{284,43},{278,46},{278,48},{273,52},{272,58},{265,61},{265,62},{263,65},{264,66},{252,75},{253,78},{249,82},{242,83},{242,87},{246,89},{248,98},{251,103},{258,104},{263,97},{266,95},{279,96},{280,93},{287,93},{289,97},{295,98},{295,101},{299,103},{308,97},{312,98},{325,111},{323,117},{321,120},{327,120},{327,122},{332,122},{331,107},{339,101},{339,95},{341,95},{341,86},{338,84},{332,84},{330,79},{339,75},{342,70},{350,65}}}, + {"America/Costa_Rica",60,{{-870,56},{-871,55},{-839,87},{-836,89},{-836,90},{-859,108},{-859,109},{-851,95},{-847,96},{-849,98},{-850,97},{-851,96},{-853,98},{-857,99},{-858,102},{-858,105},{-856,106},{-860,109},{-857,109},{-856,112},{-849,109},{-847,111},{-844,110},{-839,107},{-837,108},{-837,109},{-833,102},{-826,95},{-829,96},{-829,95},{-829,91},{-827,89},{-829,88},{-828,85},{-831,83},{-829,83},{-829,81},{-829,80},{-831,84},{-832,86},{-835,87},{-833,84},{-836,85},{-837,86},{-835,89},{-843,95},{-845,95},{-847,100},{-848,100},{-851,102},{-852,102},{-853,103},{-854,103},{-852,100},{-849,99},{-848,98},{-851,101},{-852,101},{-851,100},{-850,100}}}, + {"America/Caracas",202,{{-609,86},{-608,86},{-606,86},{-607,86},{-606,87},{-607,88},{-606,88},{-607,89},{-607,91},{-607,92},{-610,86},{-607,87},{-608,87},{-609,87},{-608,88},{-609,88},{-609,89},{-608,89},{-610,88},{-667,119},{-669,119},{-667,120},{-610,89},{-608,90},{-608,91},{-609,90},{-608,92},{-609,92},{-608,93},{-718,92},{-718,94},{-612,96},{-613,96},{-614,97},{-618,98},{-676,120},{-677,120},{-668,119},{-666,119},{-623,98},{-622,100},{-616,98},{-616,99},{-610,96},{-610,92},{-600,86},{-598,83},{-607,75},{-606,72},{-603,71},{-607,68},{-612,67},{-611,62},{-614,60},{-606,50},{-610,45},{-613,45},{-615,43},{-627,40},{-627,37},{-629,36},{-634,40},{-635,39},{-640,39},{-641,42},{-646,42},{-648,43},{-645,39},{-642,36},{-640,25},{-634,24},{-633,23},{-640,20},{-642,15},{-643,14},{-644,15},{-651,11},{-655,6},{-656,10},{-663,7},{-669,12},{-672,24},{-676,28},{-679,28},{-673,34},{-676,38},{-679,45},{-679,53},{-676,55},{-675,62},{-678,63},{-694,61},{-701,70},{-720,70},{-722,74},{-725,75},{-724,83},{-727,86},{-728,91},{-729,91},{-730,93},{-732,92},{-734,92},{-729,98},{-729,105},{-725,111},{-722,112},{-720,117},{-713,119},{-720,116},{-716,107},{-721,98},{-720,94},{-717,94},{-717,91},{-712,92},{-711,93},{-710,97},{-716,108},{-714,108},{-715,110},{-700,114},{-701,116},{-700,115},{-700,117},{-702,116},{-703,119},{-700,122},{-696,115},{-688,114},{-684,112},{-681,105},{-662,106},{-658,102},{-651,100},{-642,105},{-638,104},{-636,105},{-643,107},{-619,108},{-623,105},{-627,106},{-629,105},{-625,102},{-623,99},{-624,99},{-624,100},{-623,100},{-622,101},{-649,101},{-619,106},{-645,102},{-646,103},{-645,103},{-647,103},{-646,102},{-648,103},{-650,102},{-649,102},{-658,103},{-659,102},{-659,103},{-716,110},{-637,112},{-631,114},{-644,117},{-668,117},{-669,118},{-667,118},{-644,118},{-717,110},{-639,107},{-640,108},{-639,108},{-645,104},{-644,103},{-644,104},{-715,106},{-679,105},{-683,108},{-642,108},{-641,108},{-716,109},{-715,109},{-654,109},{-653,110},{-652,109},{-653,109},{-654,110},{-682,108},{-643,111},{-640,110},{-639,112},{-638,110},{-641,109},{-644,110},{-666,118},{-661,118},{-662,118},{-646,118},{-646,119},{-661,119}}}, + {"Pacific/Nauru",1,{{1669,-5}}}, + {"Europe/Minsk",61,{{300,515},{293,514},{291,516},{288,514},{283,517},{277,515},{277,516},{273,516},{272,518},{253,520},{244,519},{242,517},{237,517},{236,515},{235,517},{237,521},{232,523},{235,526},{239,527},{239,532},{235,540},{248,540},{248,541},{255,543},{255,542},{258,542},{256,543},{258,548},{269,553},{265,553},{266,557},{271,559},{276,558},{281,562},{294,560},{294,558},{295,557},{300,559},{305,558},{310,556},{308,553},{310,551},{308,548},{312,547},{311,545},{313,543},{319,540},{318,538},{325,537},{325,536},{328,535},{322,531},{314,532},{313,530},{316,528},{316,523},{318,521},{309,521},{305,516},{307,513},{306,513}}}, + {"America/Belem",244,{{-503,-18},{-502,-18},{-493,-20},{-493,-19},{-492,-19},{-498,-19},{-497,-19},{-492,-18},{-504,-19},{-504,-18},{-503,-19},{-493,-21},{-494,-20},{-498,-18},{-497,-18},{-501,-18},{-500,-18},{-495,-18},{-496,-18},{-496,-17},{-500,-17},{-501,-17},{-489,-17},{-494,-17},{-494,-16},{-492,-16},{-491,-16},{-489,-16},{-489,-15},{-485,-14},{-485,-13},{-485,-15},{-484,-15},{-483,-15},{-490,-16},{-495,-17},{-493,-17},{-492,-17},{-493,-16},{-485,-12},{-461,-12},{-461,-11},{-462,-10},{-462,-11},{-465,-9},{-464,-9},{-466,-9},{-466,-8},{-464,-10},{-463,-10},{-465,-10},{-496,2},{-497,2},{-496,3},{-496,4},{-499,13},{-499,12},{-502,19},{-505,20},{-505,21},{-504,22},{-503,19},{-504,18},{-505,23},{-503,7},{-503,8},{-501,8},{-502,9},{-501,9},{-500,9},{-500,10},{-499,10},{-500,8},{-501,7},{-502,8},{-502,7},{-507,1},{-509,1},{-503,6},{-506,3},{-502,3},{-502,2},{-501,3},{-504,2},{-505,2},{-504,6},{-503,3},{-501,6},{-500,5},{-507,0},{-502,6},{-514,-4},{-512,-1},{-512,-3},{-514,-5},{-506,-1},{-508,-4},{-510,-6},{-511,-7},{-507,-6},{-507,-3},{-504,-1},{-484,-3},{-485,-9},{-494,-22},{-486,-13},{-485,-16},{-485,-11},{-483,-11},{-482,-8},{-479,-6},{-477,-5},{-476,-7},{-476,-6},{-474,-8},{-475,-6},{-473,-6},{-472,-8},{-471,-7},{-471,-9},{-468,-7},{-467,-9},{-466,-10},{-463,-11},{-462,-9},{-463,-17},{-462,-18},{-463,-21},{-467,-27},{-466,-29},{-471,-39},{-476,-46},{-488,-54},{-484,-54},{-481,-56},{-483,-58},{-482,-59},{-487,-67},{-492,-69},{-492,-73},{-494,-75},{-492,-78},{-493,-84},{-501,-93},{-502,-98},{-526,-97},{-525,-96},{-522,-96},{-520,-93},{-521,-89},{-528,-85},{-529,-79},{-526,-72},{-520,-67},{-524,-63},{-529,-50},{-527,-45},{-526,-38},{-522,-32},{-519,-35},{-518,-32},{-520,-28},{-523,-17},{-519,-15},{-518,-12},{-521,-12},{-525,-9},{-526,-4},{-530,0},{-531,7},{-534,9},{-534,13},{-544,18},{-547,18},{-548,20},{-548,25},{-543,22},{-541,21},{-538,24},{-529,22},{-515,42},{-515,44},{-512,41},{-512,38},{-511,39},{-511,33},{-507,21},{-505,18},{-500,17},{-499,14},{-501,12},{-499,11},{-505,7},{-506,4},{-486,-12},{-486,-10},{-468,-8},{-467,-8},{-467,-10},{-469,-8},{-469,-7},{-472,-7},{-480,-7},{-474,-7},{-475,-7},{-487,-2},{-487,-1},{-488,-2},{-489,-2},{-489,-1},{-490,-2},{-490,-1},{-490,0},{-493,-1},{-494,-1},{-491,-1},{-492,-1},{-498,0},{-495,1},{-493,0},{-497,-1},{-508,-6},{-513,-5},{-512,-5},{-512,-4},{-511,-3},{-511,-2},{-505,-2},{-505,-1},{-513,-4},{-513,-3},{-511,-4},{-511,-1},{-506,0},{-500,0},{-502,-1},{-502,0},{-509,-1},{-509,0},{-508,0},{-504,0},{-503,0},{-506,2},{-504,1}}}, + {"America/Cancun",51,{{-875,197},{-868,206},{-867,206},{-870,203},{-869,206},{-868,212},{-868,213},{-867,212},{-868,215},{-876,194},{-875,196},{-877,196},{-877,197},{-875,193},{-875,194},{-873,188},{-881,188},{-879,182},{-879,183},{-874,184},{-874,185},{-882,186},{-873,185},{-873,186},{-873,184},{-874,187},{-874,186},{-872,186},{-872,187},{-873,187},{-875,215},{-870,216},{-867,211},{-874,202},{-875,198},{-877,195},{-874,196},{-877,193},{-876,192},{-878,182},{-881,185},{-881,189},{-883,185},{-885,185},{-888,179},{-890,180},{-891,178},{-894,178},{-894,197},{-878,207},{-875,210}}}, + {"America/Hermosillo",45,{{-1125,293},{-1124,293},{-1123,292},{-1122,290},{-1123,287},{-1126,289},{-1125,292},{-1132,310},{-1139,316},{-1140,316},{-1095,267},{-1099,270},{-1100,271},{-1105,273},{-1106,273},{-1106,274},{-1108,279},{-1114,280},{-1123,284},{-1126,287},{-1125,287},{-1150,319},{-1150,322},{-1148,325},{-1111,313},{-1088,313},{-1086,300},{-1087,294},{-1086,283},{-1091,283},{-1091,282},{-1087,275},{-1085,268},{-1093,263},{-1094,267},{-1098,268},{-1106,276},{-1105,279},{-1111,279},{-1122,293},{-1131,307},{-1130,312},{-1136,313},{-1140,317},{-1142,315}}}, + {"Asia/Chongqing",321,{{1098,183},{1089,184},{1106,191},{1106,192},{1105,187},{1105,191},{1094,182},{1113,200},{1105,200},{1106,199},{1107,202},{1109,200},{1110,196},{1108,196},{1105,192},{1105,188},{1104,187},{1101,184},{1098,184},{1096,182},{1087,185},{1086,193},{1093,197},{1092,197},{1093,199},{1095,198},{1097,200},{1100,199},{1104,201},{1106,200},{1101,200},{1102,200},{1125,219},{1128,220},{1130,218},{1130,219},{1122,215},{1122,216},{1128,216},{1129,216},{1121,216},{1121,217},{1126,216},{1127,216},{1125,216},{1126,217},{1127,217},{1124,217},{1125,217},{1129,218},{1128,217},{1096,215},{1098,215},{1097,215},{1081,215},{1082,215},{1088,218},{1120,218},{1119,218},{1089,217},{1091,216},{1090,216},{1083,216},{1084,217},{1118,216},{1118,217},{1120,216},{1083,217},{1088,217},{1100,219},{1096,217},{1095,215},{1092,214},{1091,217},{1089,216},{1089,218},{1087,216},{1085,219},{1085,216},{1084,218},{1082,216},{1074,216},{1070,219},{1067,220},{1066,225},{1068,228},{1062,230},{1059,229},{1053,234},{1048,231},{1047,228},{1044,227},{1043,228},{1041,228},{1040,225},{1036,228},{1035,226},{1033,228},{1031,224},{1025,228},{1023,224},{1017,225},{1015,222},{1018,218},{1018,212},{1013,212},{1011,218},{1007,215},{1002,214},{1002,217},{1000,217},{1000,221},{992,222},{994,225},{993,228},{996,229},{995,231},{989,232},{989,236},{987,240},{989,242},{981,241},{976,238},{975,239},{978,242},{977,244},{975,244},{976,247},{978,248},{978,253},{987,259},{986,261},{987,261},{988,266},{987,276},{984,277},{983,275},{981,282},{983,284},{984,281},{987,282},{987,290},{989,288},{990,292},{991,292},{990,308},{986,313},{989,314},{984,318},{982,324},{974,327},{974,330},{978,334},{975,335},{974,338},{977,340},{978,339},{984,339},{984,341},{987,340},{990,342},{988,347},{991,345},{993,347},{990,350},{993,351},{992,353},{993,357},{989,362},{993,367},{992,371},{995,371},{995,375},{997,377},{994,380},{998,381},{993,383},{989,383},{989,384},{982,387},{974,391},{976,393},{976,397},{970,398},{969,396},{966,398},{970,408},{975,407},{982,410},{976,414},{978,417},{971,428},{995,426},{1009,426},{1018,425},{1021,422},{1033,419},{1045,419},{1045,417},{1050,416},{1075,425},{1088,424},{1102,426},{1112,434},{1118,429},{1121,425},{1126,424},{1130,420},{1134,422},{1141,420},{1141,421},{1145,421},{1144,422},{1146,423},{1148,422},{1142,418},{1142,415},{1139,414},{1140,412},{1138,411},{1141,408},{1141,405},{1135,403},{1130,404},{1128,402},{1123,403},{1119,396},{1114,396},{1113,394},{1111,394},{1112,393},{1109,385},{1105,382},{1108,377},{1106,377},{1107,373},{1104,370},{1106,356},{1103,347},{1105,344},{1104,343},{1106,342},{1106,339},{1110,336},{1110,333},{1107,331},{1105,333},{1095,332},{1094,332},{1098,331},{1098,329},{1101,328},{1102,326},{1096,326},{1095,323},{1096,317},{1101,314},{1102,310},{1093,305},{1091,306},{1084,305},{1086,302},{1085,299},{1084,299},{1084,298},{1085,297},{1086,299},{1089,296},{1089,293},{1091,294},{1093,291},{1092,286},{1093,286},{1093,278},{1095,276},{1088,271},{1095,271},{1095,268},{1093,267},{1094,266},{1093,263},{1095,263},{1095,260},{1097,259},{1100,262},{1103,260},{1106,263},{1113,263},{1112,259},{1115,259},{1110,249},{1114,251},{1114,247},{1120,248},{1121,244},{1119,242},{1119,240},{1116,238},{1114,233},{1116,232},{1118,234},{1123,235},{1123,228},{1127,226},{1130,220},{1129,219},{1126,218},{1124,221},{1119,219},{1119,217},{1117,218},{1115,215},{1113,221},{1117,225},{1114,224},{1111,227},{1107,226},{1108,223},{1106,222},{1103,222},{1104,219}}}, + {"Asia/Beirut",15,{{359,334},{356,333},{355,331},{351,331},{357,343},{360,347},{365,346},{363,345},{366,344},{366,342},{363,339},{364,338},{360,338},{359,336},{361,336}}}, + {"Europe/Gibraltar",4,{{-53,361},{-54,361},{-54,362},{-53,362}}}, + {"Asia/Urumqi",241,{{1091,210},{1091,211},{1112,214},{1106,213},{1102,210},{1104,211},{1104,212},{1106,211},{1106,212},{1105,211},{1106,214},{1108,214},{1105,203},{1106,204},{1104,206},{1104,207},{1103,207},{1105,206},{1105,207},{1092,209},{1106,209},{1105,209},{1106,210},{1098,208},{1097,208},{1103,211},{982,282},{976,285},{973,282},{971,284},{963,284},{966,288},{965,291},{962,289},{961,291},{964,293},{961,295},{953,291},{947,293},{944,292},{939,288},{933,286},{932,284},{927,281},{927,279},{920,277},{917,278},{917,279},{913,281},{910,280},{899,283},{894,280},{890,273},{888,274},{888,280},{886,281},{879,278},{871,278},{867,281},{864,279},{862,282},{860,279},{856,283},{851,283},{851,287},{849,286},{842,289},{842,292},{839,293},{836,292},{832,296},{822,301},{820,305},{824,306},{826,309},{831,305},{832,307},{830,309},{833,313},{832,314},{825,317},{832,320},{832,327},{828,335},{820,343},{823,346},{824,350},{824,352},{820,352},{821,354},{824,357},{829,357},{825,363},{826,366},{824,369},{825,395},{820,395},{820,405},{818,408},{820,411},{826,413},{827,415},{826,417},{830,419},{830,424},{827,426},{827,429},{834,431},{826,433},{825,436},{829,435},{829,437},{833,437},{850,435},{839,440},{817,444},{818,446},{827,448},{826,450},{827,452},{826,454},{823,456},{830,472},{840,470},{847,470},{848,468},{855,471},{857,472},{855,479},{857,484},{866,485},{869,491},{878,492},{879,490},{877,489},{881,487},{880,487},{880,485},{885,484},{890,479},{896,480},{898,478},{901,479},{909,470},{911,467},{909,463},{910,460},{907,455},{909,452},{935,450},{947,443},{954,443},{953,440},{956,440},{959,433},{964,427},{971,428},{978,417},{976,414},{982,410},{975,407},{970,408},{966,398},{969,396},{970,398},{976,397},{976,393},{974,391},{982,387},{989,384},{989,383},{993,383},{998,381},{994,380},{997,377},{995,375},{995,371},{992,371},{993,367},{989,362},{993,357},{992,353},{993,351},{990,350},{993,347},{991,345},{988,347},{990,342},{987,340},{984,341},{984,339},{978,339},{977,340},{974,338},{975,335},{978,334},{974,330},{974,327},{982,324},{984,318},{989,314},{986,313},{990,307},{991,292},{990,292},{989,288},{987,290},{987,282},{984,281},{983,284},{1114,216},{1113,214},{1110,215},{1108,215},{1105,214},{1104,214},{1104,215},{1103,214},{1102,211},{1102,209},{1104,208},{1105,204},{1103,202},{1099,202},{1099,204},{1100,204},{1098,205},{1097,209},{1098,213},{1100,215},{1098,215},{1097,216},{1100,219},{1104,219},{1103,222},{1108,223},{1108,226},{1111,227},{1114,224},{1117,225},{1113,221}}}, + {"America/Mazatlan",171,{{-1144,271},{-1121,272},{-1121,273},{-1120,272},{-1120,274},{-1120,275},{-1148,184},{-1147,184},{-1148,183},{-1110,188},{-1109,188},{-1110,187},{-1111,188},{-1121,190},{-1108,193},{-1066,217},{-1065,216},{-1065,215},{-1066,216},{-1067,217},{-1067,218},{-1059,219},{-1063,213},{-1062,213},{-1063,215},{-1065,214},{-1080,248},{-1081,248},{-1080,250},{-1081,250},{-1081,249},{-1080,249},{-1081,251},{-1082,250},{-1083,251},{-1082,251},{-1084,251},{-1084,252},{-1083,252},{-1082,252},{-1152,279},{-1142,277},{-1142,278},{-1142,279},{-1106,248},{-1106,249},{-1104,246},{-1121,249},{-1122,250},{-1121,253},{-1122,248},{-1121,247},{-1121,245},{-1123,248},{-1121,250},{-1107,252},{-1107,250},{-1107,251},{-1105,249},{-1050,230},{-1049,228},{-1050,225},{-1048,227},{-1046,225},{-1043,225},{-1044,221},{-1041,218},{-1042,215},{-1039,214},{-1042,212},{-1043,207},{-1047,210},{-1052,207},{-1054,209},{-1052,211},{-1052,215},{-1057,220},{-1058,226},{-1070,239},{-1080,247},{-1088,254},{-1087,255},{-1088,256},{-1089,255},{-1094,256},{-1094,259},{-1093,263},{-1084,270},{-1080,269},{-1078,262},{-1074,261},{-1071,257},{-1071,252},{-1069,248},{-1065,243},{-1062,244},{-1060,242},{-1057,233},{-1098,241},{-1099,242},{-1099,244},{-1098,242},{-1088,255},{-1117,244},{-1117,243},{-1120,245},{-1119,245},{-1104,245},{-1103,245},{-1103,244},{-1104,244},{-1115,243},{-1116,244},{-1090,254},{-1121,252},{-1107,253},{-1121,255},{-1142,280},{-1128,280},{-1122,272},{-1120,271},{-1120,270},{-1118,266},{-1118,269},{-1114,265},{-1113,258},{-1107,248},{-1107,246},{-1106,243},{-1103,242},{-1102,244},{-1095,236},{-1095,231},{-1100,229},{-1103,236},{-1116,246},{-1118,245},{-1120,248},{-1121,259},{-1132,268},{-1131,269},{-1132,270},{-1133,268},{-1136,267},{-1138,270},{-1144,272},{-1145,274},{-1151,278},{-1143,279},{-1141,276},{-1139,277},{-1141,277},{-1121,256},{-1108,256},{-1108,257},{-1112,258},{-1112,260},{-1111,261},{-1121,257},{-1110,256},{-1111,257},{-1110,257},{-1113,261},{-1131,266},{-1114,266},{-1131,267},{-1133,267},{-1132,267},{-1132,269},{-1119,271},{-1119,270}}} +}; + +struct tzoffsets_t { + char *name; + double time; + double dst; +} tzoffsets[] = { + { "Africa/Abidjan", 0, 0 }, + { "Africa/Accra", 0, 0 }, + { "Africa/Addis_Ababa", 3, 3 }, + { "Africa/Algiers", 1, 1 }, + { "Africa/Asmara", 3, 3 }, + { "Africa/Asmera", 3, 3 }, + { "Africa/Bamako", 0, 0 }, + { "Africa/Bangui", 1, 1 }, + { "Africa/Banjul", 0, 0 }, + { "Africa/Bissau", 0, 0 }, + { "Africa/Blantyre", 2, 2 }, + { "Africa/Brazzaville", 1, 1 }, + { "Africa/Bujumbura", 2, 2 }, + { "Africa/Cairo", 2, 2 }, + { "Africa/Casablanca", 0, 1 }, + { "Africa/Ceuta", 1, 2 }, + { "Africa/Conakry", 0, 0 }, + { "Africa/Dakar", 0, 0 }, + { "Africa/Dar_es_Salaam", 3, 3 }, + { "Africa/Djibouti", 3, 3 }, + { "Africa/Douala", 1, 1 }, + { "Africa/El_Aaiun", 0, 1 }, + { "Africa/Freetown", 0, 0 }, + { "Africa/Gaborone", 2, 2 }, + { "Africa/Harare", 2, 2 }, + { "Africa/Johannesburg", 2, 2 }, + { "Africa/Juba", 3, 3 }, + { "Africa/Kampala", 3, 3 }, + { "Africa/Khartoum", 3, 3 }, + { "Africa/Kigali", 2, 2 }, + { "Africa/Kinshasa", 1, 1 }, + { "Africa/Lagos", 1, 1 }, + { "Africa/Libreville", 1, 1 }, + { "Africa/Lome", 0, 0 }, + { "Africa/Luanda", 1, 1 }, + { "Africa/Lubumbashi", 2, 2 }, + { "Africa/Lusaka", 2, 2 }, + { "Africa/Malabo", 1, 1 }, + { "Africa/Maputo", 2, 2 }, + { "Africa/Maseru", 2, 2 }, + { "Africa/Mbabane", 2, 2 }, + { "Africa/Mogadishu", 3, 3 }, + { "Africa/Monrovia", 0, 0 }, + { "Africa/Nairobi", 3, 3 }, + { "Africa/Ndjamena", 1, 1 }, + { "Africa/Niamey", 1, 1 }, + { "Africa/Nouakchott", 0, 0 }, + { "Africa/Ouagadougou", 0, 0 }, + { "Africa/Porto-Novo", 1, 1 }, + { "Africa/Sao_Tome", 0, 0 }, + { "Africa/Timbuktu", 0, 0 }, + { "Africa/Tripoli", 2, 2 }, + { "Africa/Tunis", 1, 1 }, + { "Africa/Windhoek", 1, 2 }, + { "America/Adak", -10, -9 }, + { "America/Anchorage", -9, -8 }, + { "America/Anguilla", -4, -4 }, + { "America/Antigua", -4, -4 }, + { "America/Araguaina", -3, -3 }, + { "America/Argentina/Buenos_Aires", -3, -3 }, + { "America/Argentina/Catamarca", -3, -3 }, + { "America/Argentina/ComodRivadavia", -3, -3 }, + { "America/Argentina/Cordoba", -3, -3 }, + { "America/Argentina/Jujuy", -3, -3 }, + { "America/Argentina/La_Rioja", -3, -3 }, + { "America/Argentina/Mendoza", -3, -3 }, + { "America/Argentina/Rio_Gallegos", -3, -3 }, + { "America/Argentina/Salta", -3, -3 }, + { "America/Argentina/San_Juan", -3, -3 }, + { "America/Argentina/San_Luis", -3, -3 }, + { "America/Argentina/Tucuman", -3, -3 }, + { "America/Argentina/Ushuaia", -3, -3 }, + { "America/Aruba", -4, -4 }, + { "America/Asuncion", -4, -3 }, + { "America/Atikokan", -5, -5 }, + { "America/Atka", -10, -9 }, + { "America/Bahia", -3, -3 }, + { "America/Bahia_Banderas", -6, -5 }, + { "America/Barbados", -4, -4 }, + { "America/Belem", -3, -3 }, + { "America/Belize", -6, -6 }, + { "America/Blanc-Sablon", -4, -4 }, + { "America/Boa_Vista", -4, -4 }, + { "America/Bogota", -5, -5 }, + { "America/Boise", -7, -6 }, + { "America/Buenos_Aires", -3, -3 }, + { "America/Cambridge_Bay", -7, -6 }, + { "America/Campo_Grande", -4, -3 }, + { "America/Cancun", -5, -5 }, + { "America/Caracas", -4, -4 }, + { "America/Catamarca", -3, -3 }, + { "America/Cayenne", -3, -3 }, + { "America/Cayman", -5, -5 }, + { "America/Chicago", -6, -5 }, + { "America/Chihuahua", -7, -6 }, + { "America/Coral_Harbour", -5, -5 }, + { "America/Cordoba", -3, -3 }, + { "America/Costa_Rica", -6, -6 }, + { "America/Creston", -7, -7 }, + { "America/Cuiaba", -4, -3 }, + { "America/Curacao", -4, -4 }, + { "America/Danmarkshavn", 0, 0 }, + { "America/Dawson", -8, -7 }, + { "America/Dawson_Creek", -7, -7 }, + { "America/Denver", -7, -6 }, + { "America/Detroit", -5, -4 }, + { "America/Dominica", -4, -4 }, + { "America/Edmonton", -7, -6 }, + { "America/Eirunepe", -5, -5 }, + { "America/El_Salvador", -6, -6 }, + { "America/Ensenada", -8, -7 }, + { "America/Fort_Nelson", -7, -7 }, + { "America/Fort_Wayne", -5, -4 }, + { "America/Fortaleza", -3, -3 }, + { "America/Glace_Bay", -4, -3 }, + { "America/Godthab", -3, -2 }, + { "America/Goose_Bay", -4, -3 }, + { "America/Grand_Turk", -4, -4 }, + { "America/Grenada", -4, -4 }, + { "America/Guadeloupe", -4, -4 }, + { "America/Guatemala", -6, -6 }, + { "America/Guayaquil", -5, -5 }, + { "America/Guyana", -4, -4 }, + { "America/Halifax", -4, -3 }, + { "America/Havana", -5, -4 }, + { "America/Hermosillo", -7, -7 }, + { "America/Indiana/Indianapolis", -5, -4 }, + { "America/Indiana/Knox", -6, -5 }, + { "America/Indiana/Marengo", -5, -4 }, + { "America/Indiana/Petersburg", -5, -4 }, + { "America/Indiana/Tell_City", -6, -5 }, + { "America/Indiana/Vevay", -5, -4 }, + { "America/Indiana/Vincennes", -5, -4 }, + { "America/Indiana/Winamac", -5, -4 }, + { "America/Indianapolis", -5, -4 }, + { "America/Inuvik", -7, -6 }, + { "America/Iqaluit", -5, -4 }, + { "America/Jamaica", -5, -5 }, + { "America/Jujuy", -3, -3 }, + { "America/Juneau", -9, -8 }, + { "America/Kentucky/Louisville", -5, -4 }, + { "America/Kentucky/Monticello", -5, -4 }, + { "America/Knox_IN", -6, -5 }, + { "America/Kralendijk", -4, -4 }, + { "America/La_Paz", -4, -4 }, + { "America/Lima", -5, -5 }, + { "America/Los_Angeles", -8, -7 }, + { "America/Louisville", -5, -4 }, + { "America/Lower_Princes", -4, -4 }, + { "America/Maceio", -3, -3 }, + { "America/Managua", -6, -6 }, + { "America/Manaus", -4, -4 }, + { "America/Marigot", -4, -4 }, + { "America/Martinique", -4, -4 }, + { "America/Matamoros", -6, -5 }, + { "America/Mazatlan", -7, -6 }, + { "America/Mendoza", -3, -3 }, + { "America/Menominee", -6, -5 }, + { "America/Merida", -6, -5 }, + { "America/Metlakatla", -9, -8 }, + { "America/Mexico_City", -6, -5 }, + { "America/Miquelon", -3, -2 }, + { "America/Moncton", -4, -3 }, + { "America/Monterrey", -6, -5 }, + { "America/Montevideo", -3, -3 }, + { "America/Montreal", -5, -4 }, + { "America/Montserrat", -4, -4 }, + { "America/Nassau", -5, -4 }, + { "America/New_York", -5, -4 }, + { "America/Nipigon", -5, -4 }, + { "America/Nome", -9, -8 }, + { "America/Noronha", -2, -2 }, + { "America/North_Dakota/Beulah", -6, -5 }, + { "America/North_Dakota/Center", -6, -5 }, + { "America/North_Dakota/New_Salem", -6, -5 }, + { "America/Ojinaga", -7, -6 }, + { "America/Panama", -5, -5 }, + { "America/Pangnirtung", -5, -4 }, + { "America/Paramaribo", -3, -3 }, + { "America/Phoenix", -7, -7 }, + { "America/Port_of_Spain", -4, -4 }, + { "America/Port-au-Prince", -5, -5 }, + { "America/Porto_Acre", -5, -5 }, + { "America/Porto_Velho", -4, -4 }, + { "America/Puerto_Rico", -4, -4 }, + { "America/Rainy_River", -6, -5 }, + { "America/Rankin_Inlet", -6, -5 }, + { "America/Recife", -3, -3 }, + { "America/Regina", -6, -6 }, + { "America/Resolute", -6, -5 }, + { "America/Rio_Branco", -5, -5 }, + { "America/Rosario", -3, -3 }, + { "America/Santa_Isabel", -8, -7 }, + { "America/Santarem", -3, -3 }, + { "America/Santiago", -4, -3 }, + { "America/Santo_Domingo", -4, -4 }, + { "America/Sao_Paulo", -3, -2 }, + { "America/Scoresbysund", -1, 0 }, + { "America/Shiprock", -7, -6 }, + { "America/Sitka", -9, -8 }, + { "America/St_Barthelemy", -4, -4 }, + { "America/St_Johns", -3.5, -2.5 }, + { "America/St_Kitts", -4, -4 }, + { "America/St_Lucia", -4, -4 }, + { "America/St_Thomas", -4, -4 }, + { "America/St_Vincent", -4, -4 }, + { "America/Swift_Current", -6, -6 }, + { "America/Tegucigalpa", -6, -6 }, + { "America/Thule", -4, -3 }, + { "America/Thunder_Bay", -5, -4 }, + { "America/Tijuana", -8, -7 }, + { "America/Toronto", -5, -4 }, + { "America/Tortola", -4, -4 }, + { "America/Vancouver", -8, -7 }, + { "America/Virgin", -4, -4 }, + { "America/Whitehorse", -8, -7 }, + { "America/Winnipeg", -6, -5 }, + { "America/Yakutat", -9, -8 }, + { "America/Yellowknife", -7, -6 }, + { "Antarctica/Casey", 8, 8 }, + { "Antarctica/Davis", 7, 7 }, + { "Antarctica/DumontDUrville", 10, 10 }, + { "Antarctica/Macquarie", 11, 11 }, + { "Antarctica/Mawson", 5, 5 }, + { "Antarctica/McMurdo", 12, 13 }, + { "Antarctica/Palmer", -4, -3 }, + { "Antarctica/Rothera", -3, -3 }, + { "Antarctica/South_Pole", 12, 13 }, + { "Antarctica/Syowa", 3, 3 }, + { "Antarctica/Troll", 0, 2 }, + { "Antarctica/Vostok", 6, 6 }, + { "Arctic/Longyearbyen", 1, 2 }, + { "Asia/Aden", 3, 3 }, + { "Asia/Almaty", 6, 6 }, + { "Asia/Amman", 2, 3 }, + { "Asia/Anadyr", 12, 12 }, + { "Asia/Aqtau", 5, 5 }, + { "Asia/Aqtobe", 5, 5 }, + { "Asia/Ashgabat", 5, 5 }, + { "Asia/Ashkhabad", 5, 5 }, + { "Asia/Baghdad", 3, 3 }, + { "Asia/Bahrain", 3, 3 }, + { "Asia/Baku", 4, 4 }, + { "Asia/Bangkok", 7, 7 }, + { "Asia/Barnaul", 7, 7 }, + { "Asia/Beirut", 2, 3 }, + { "Asia/Bishkek", 6, 6 }, + { "Asia/Brunei", 8, 8 }, + { "Asia/Calcutta", 5.5, 5.5 }, + { "Asia/Chita", 9, 9 }, + { "Asia/Choibalsan", 8, 9 }, + { "Asia/Chongqing", 8, 8 }, + { "Asia/Chungking", 8, 8 }, + { "Asia/Colombo", 5.5, 5.5 }, + { "Asia/Dacca", 6, 6 }, + { "Asia/Damascus", 2, 3 }, + { "Asia/Dhaka", 6, 6 }, + { "Asia/Dili", 9, 9 }, + { "Asia/Dubai", 4, 4 }, + { "Asia/Dushanbe", 5, 5 }, + { "Asia/Gaza", 2, 3 }, + { "Asia/Harbin", 8, 8 }, + { "Asia/Hebron", 2, 3 }, + { "Asia/Ho_Chi_Minh", 7, 7 }, + { "Asia/Hong_Kong", 8, 8 }, + { "Asia/Hovd", 7, 8 }, + { "Asia/Irkutsk", 8, 8 }, + { "Asia/Istanbul", 2, 3 }, + { "Asia/Jakarta", 7, 7 }, + { "Asia/Jayapura", 9, 9 }, + { "Asia/Jerusalem", 2, 3 }, + { "Asia/Kabul", 4.5, 4.5 }, + { "Asia/Kamchatka", 12, 12 }, + { "Asia/Karachi", 5, 5 }, + { "Asia/Kashgar", 6, 6 }, + { "Asia/Kathmandu", 5.75, 5.75 }, + { "Asia/Katmandu", 5.75, 5.75 }, + { "Asia/Khandyga", 9, 9 }, + { "Asia/Kolkata", 5.5, 5.5 }, + { "Asia/Krasnoyarsk", 7, 7 }, + { "Asia/Kuala_Lumpur", 8, 8 }, + { "Asia/Kuching", 8, 8 }, + { "Asia/Kuwait", 3, 3 }, + { "Asia/Macao", 8, 8 }, + { "Asia/Macau", 8, 8 }, + { "Asia/Magadan", 11, 11 }, + { "Asia/Makassar", 8, 8 }, + { "Asia/Manila", 8, 8 }, + { "Asia/Muscat", 4, 4 }, + { "Asia/Nicosia", 2, 3 }, + { "Asia/Novokuznetsk", 7, 7 }, + { "Asia/Novosibirsk", 7, 7 }, + { "Asia/Omsk", 6, 6 }, + { "Asia/Oral", 5, 5 }, + { "Asia/Phnom_Penh", 7, 7 }, + { "Asia/Pontianak", 7, 7 }, + { "Asia/Pyongyang", 8.5, 8.5 }, + { "Asia/Qatar", 3, 3 }, + { "Asia/Qyzylorda", 6, 6 }, + { "Asia/Rangoon", 6.5, 6.5 }, + { "Asia/Riyadh", 3, 3 }, + { "Asia/Saigon", 7, 7 }, + { "Asia/Sakhalin", 11, 11 }, + { "Asia/Samarkand", 5, 5 }, + { "Asia/Seoul", 9, 9 }, + { "Asia/Shanghai", 8, 8 }, + { "Asia/Singapore", 8, 8 }, + { "Asia/Srednekolymsk", 11, 11 }, + { "Asia/Taipei", 8, 8 }, + { "Asia/Tashkent", 5, 5 }, + { "Asia/Tbilisi", 4, 4 }, + { "Asia/Tehran", 3.5, 4.5 }, + { "Asia/Tel_Aviv", 2, 3 }, + { "Asia/Thimbu", 6, 6 }, + { "Asia/Thimphu", 6, 6 }, + { "Asia/Tokyo", 9, 9 }, + { "Asia/Tomsk", 7, 7 }, + { "Asia/Ujung_Pandang", 8, 8 }, + { "Asia/Ulaanbaatar", 8, 9 }, + { "Asia/Ulan_Bator", 8, 9 }, + { "Asia/Urumqi", 6, 6 }, + { "Asia/Ust-Nera", 10, 10 }, + { "Asia/Vientiane", 7, 7 }, + { "Asia/Vladivostok", 10, 10 }, + { "Asia/Yakutsk", 9, 9 }, + { "Asia/Yekaterinburg", 5, 5 }, + { "Asia/Yerevan", 4, 4 }, + { "Atlantic/Azores", -1, 0 }, + { "Atlantic/Bermuda", -4, -3 }, + { "Atlantic/Canary", 0, 1 }, + { "Atlantic/Cape_Verde", -1, -1 }, + { "Atlantic/Faeroe", 0, 1 }, + { "Atlantic/Faroe", 0, 1 }, + { "Atlantic/Jan_Mayen", 1, 2 }, + { "Atlantic/Madeira", 0, 1 }, + { "Atlantic/Reykjavik", 0, 0 }, + { "Atlantic/South_Georgia", -2, -2 }, + { "Atlantic/St_Helena", 0, 0 }, + { "Atlantic/Stanley", -3, -3 }, + { "Australia/ACT", 10, 11 }, + { "Australia/Adelaide", 9.5, 10.5 }, + { "Australia/Brisbane", 10, 10 }, + { "Australia/Broken_Hill", 9.5, 10.5 }, + { "Australia/Canberra", 10, 11 }, + { "Australia/Currie", 10, 11 }, + { "Australia/Darwin", 9.5, 9.5 }, + { "Australia/Eucla", 8.75, 8.75 }, + { "Australia/Hobart", 10, 11 }, + { "Australia/LHI", 10.5, 11 }, + { "Australia/Lindeman", 10, 10 }, + { "Australia/Lord_Howe", 10.5, 11 }, + { "Australia/Melbourne", 10, 11 }, + { "Australia/North", 9.5, 9.5 }, + { "Australia/NSW", 10, 11 }, + { "Australia/Perth", 8, 8 }, + { "Australia/Queensland", 10, 10 }, + { "Australia/South", 9.5, 10.5 }, + { "Australia/Sydney", 10, 11 }, + { "Australia/Tasmania", 10, 11 }, + { "Australia/Victoria", 10, 11 }, + { "Australia/West", 8, 8 }, + { "Australia/Yancowinna", 9.5, 10.5 }, + { "Brazil/Acre", -5, -5 }, + { "Brazil/DeNoronha", -2, -2 }, + { "Brazil/East", -3, -2 }, + { "Brazil/West", -4, -4 }, + { "Canada/Atlantic", -4, -3 }, + { "Canada/Central", -6, -5 }, + { "Canada/Eastern", -5, -4 }, + { "Canada/East-Saskatchewan", -6, -6 }, + { "Canada/Mountain", -7, -6 }, + { "Canada/Newfoundland", -3.5, -2.5 }, + { "Canada/Pacific", -8, -7 }, + { "Canada/Saskatchewan", -6, -6 }, + { "Canada/Yukon", -8, -7 }, + { "CET", 1, 2 }, + { "Chile/Continental", -4, -3 }, + { "Chile/EasterIsland", -6, -5 }, + { "CST6CDT", -6, -5 }, + { "Cuba", -5, -4 }, + { "EET", 2, 3 }, + { "Egypt", 2, 2 }, + { "Eire", 0, 1 }, + { "EST", -5, -5 }, + { "EST5EDT", -5, -4 }, + { "Etc/GMT", 0, 0 }, + { "Etc/GMT0", 0, 0 }, + { "Etc/GMT+0", 0, 0 }, + { "Etc/GMT+1", -1, -1 }, + { "Etc/GMT+10", -10, -10 }, + { "Etc/GMT+11", -11, -11 }, + { "Etc/GMT+12", -12, -12 }, + { "Etc/GMT+2", -2, -2 }, + { "Etc/GMT+3", -3, -3 }, + { "Etc/GMT+4", -4, -4 }, + { "Etc/GMT+5", -5, -5 }, + { "Etc/GMT+6", -6, -6 }, + { "Etc/GMT+7", -7, -7 }, + { "Etc/GMT+8", -8, -8 }, + { "Etc/GMT+9", -9, -9 }, + { "Etc/GMT0", 0, 0 }, + { "Etc/GMT-0", 0, 0 }, + { "Etc/GMT-1", 1, 1 }, + { "Etc/GMT-10", 10, 10 }, + { "Etc/GMT-11", 11, 11 }, + { "Etc/GMT-12", 12, 12 }, + { "Etc/GMT-13", 13, 13 }, + { "Etc/GMT-14", 14, 14 }, + { "Etc/GMT-2", 2, 2 }, + { "Etc/GMT-3", 3, 3 }, + { "Etc/GMT-4", 4, 4 }, + { "Etc/GMT-5", 5, 5 }, + { "Etc/GMT-6", 6, 6 }, + { "Etc/GMT-7", 7, 7 }, + { "Etc/GMT-8", 8, 8 }, + { "Etc/GMT-9", 9, 9 }, + { "Etc/Greenwich", 0, 0 }, + { "Etc/UCT", 0, 0 }, + { "Etc/Universal", 0, 0 }, + { "Etc/UTC", 0, 0 }, + { "Etc/Zulu", 0, 0 }, + { "Europe/Amsterdam", 1, 2 }, + { "Europe/Andorra", 1, 2 }, + { "Europe/Astrakhan", 4, 4 }, + { "Europe/Athens", 2, 3 }, + { "Europe/Belfast", 0, 1 }, + { "Europe/Belgrade", 1, 2 }, + { "Europe/Berlin", 1, 2 }, + { "Europe/Bratislava", 1, 2 }, + { "Europe/Brussels", 1, 2 }, + { "Europe/Bucharest", 2, 3 }, + { "Europe/Budapest", 1, 2 }, + { "Europe/Busingen", 1, 2 }, + { "Europe/Chisinau", 2, 3 }, + { "Europe/Copenhagen", 1, 2 }, + { "Europe/Dublin", 0, 1 }, + { "Europe/Gibraltar", 1, 2 }, + { "Europe/Guernsey", 0, 1 }, + { "Europe/Helsinki", 2, 3 }, + { "Europe/Isle_of_Man", 0, 1 }, + { "Europe/Istanbul", 2, 3 }, + { "Europe/Jersey", 0, 1 }, + { "Europe/Kaliningrad", 2, 2 }, + { "Europe/Kiev", 2, 3 }, + { "Europe/Kirov", 3, 3 }, + { "Europe/Lisbon", 0, 1 }, + { "Europe/Ljubljana", 1, 2 }, + { "Europe/London", 0, 1 }, + { "Europe/Luxembourg", 1, 2 }, + { "Europe/Madrid", 1, 2 }, + { "Europe/Malta", 1, 2 }, + { "Europe/Mariehamn", 2, 3 }, + { "Europe/Minsk", 3, 3 }, + { "Europe/Monaco", 1, 2 }, + { "Europe/Moscow", 3, 3 }, + { "Europe/Nicosia", 2, 3 }, + { "Europe/Oslo", 1, 2 }, + { "Europe/Paris", 1, 2 }, + { "Europe/Podgorica", 1, 2 }, + { "Europe/Prague", 1, 2 }, + { "Europe/Riga", 2, 3 }, + { "Europe/Rome", 1, 2 }, + { "Europe/Samara", 4, 4 }, + { "Europe/San_Marino", 1, 2 }, + { "Europe/Sarajevo", 1, 2 }, + { "Europe/Simferopol", 3, 3 }, + { "Europe/Skopje", 1, 2 }, + { "Europe/Sofia", 2, 3 }, + { "Europe/Stockholm", 1, 2 }, + { "Europe/Tallinn", 2, 3 }, + { "Europe/Tirane", 1, 2 }, + { "Europe/Tiraspol", 2, 3 }, + { "Europe/Ulyanovsk", 4, 4 }, + { "Europe/Uzhgorod", 2, 3 }, + { "Europe/Vaduz", 1, 2 }, + { "Europe/Vatican", 1, 2 }, + { "Europe/Vienna", 1, 2 }, + { "Europe/Vilnius", 2, 3 }, + { "Europe/Volgograd", 3, 3 }, + { "Europe/Warsaw", 1, 2 }, + { "Europe/Zagreb", 1, 2 }, + { "Europe/Zaporozhye", 2, 3 }, + { "Europe/Zurich", 1, 2 }, + { "GB", 0, 1 }, + { "GB-Eire", 0, 1 }, + { "GMT", 0, 0 }, + { "GMT+0", 0, 0 }, + { "GMT0", 0, 0 }, + { "GMT-0", 0, 0 }, + { "Greenwich", 0, 0 }, + { "Hongkong", 8, 8 }, + { "HST", -10, -10 }, + { "Iceland", 0, 0 }, + { "Indian/Antananarivo", 3, 3 }, + { "Indian/Chagos", 6, 6 }, + { "Indian/Christmas", 7, 7 }, + { "Indian/Cocos", 6.5, 6.5 }, + { "Indian/Comoro", 3, 3 }, + { "Indian/Kerguelen", 5, 5 }, + { "Indian/Mahe", 4, 4 }, + { "Indian/Maldives", 5, 5 }, + { "Indian/Mauritius", 4, 4 }, + { "Indian/Mayotte", 3, 3 }, + { "Indian/Reunion", 4, 4 }, + { "Iran", 3.5, 4.5 }, + { "Israel", 2, 3 }, + { "Jamaica", -5, -5 }, + { "Japan", 9, 9 }, + { "Kwajalein", 12, 12 }, + { "Libya", 2, 2 }, + { "MET", 1, 2 }, + { "Mexico/BajaNorte", -8, -7 }, + { "Mexico/BajaSur", -7, -6 }, + { "Mexico/General", -6, -5 }, + { "MST", -7, -7 }, + { "MST7MDT", -7, -6 }, + { "Navajo", -7, -6 }, + { "NZ", 12, 13 }, + { "NZ-CHAT", 12.75, 13.75 }, + { "Pacific/Apia", 13, 14 }, + { "Pacific/Auckland", 12, 13 }, + { "Pacific/Bougainville", 11, 11 }, + { "Pacific/Chatham", 12.75, 13.75 }, + { "Pacific/Chuuk", 10, 10 }, + { "Pacific/Easter", -6, -5 }, + { "Pacific/Efate", 11, 11 }, + { "Pacific/Enderbury", 13, 13 }, + { "Pacific/Fakaofo", 13, 13 }, + { "Pacific/Fiji", 12, 13 }, + { "Pacific/Funafuti", 12, 12 }, + { "Pacific/Galapagos", -6, -6 }, + { "Pacific/Gambier", -9, -9 }, + { "Pacific/Guadalcanal", 11, 11 }, + { "Pacific/Guam", 10, 10 }, + { "Pacific/Honolulu", -10, -10 }, + { "Pacific/Johnston", -10, -10 }, + { "Pacific/Kiritimati", 14, 14 }, + { "Pacific/Kosrae", 11, 11 }, + { "Pacific/Kwajalein", 12, 12 }, + { "Pacific/Majuro", 12, 12 }, + { "Pacific/Marquesas", -9.5, -9.5 }, + { "Pacific/Midway", -11, -11 }, + { "Pacific/Nauru", 12, 12 }, + { "Pacific/Niue", -11, -11 }, + { "Pacific/Norfolk", 11, 11 }, + { "Pacific/Noumea", 11, 11 }, + { "Pacific/Pago_Pago", -11, -11 }, + { "Pacific/Palau", 9, 9 }, + { "Pacific/Pitcairn", -8, -8 }, + { "Pacific/Pohnpei", 11, 11 }, + { "Pacific/Ponape", 11, 11 }, + { "Pacific/Port_Moresby", 10, 10 }, + { "Pacific/Rarotonga", -10, -10 }, + { "Pacific/Saipan", 10, 10 }, + { "Pacific/Samoa", -11, -11 }, + { "Pacific/Tahiti", -10, -10 }, + { "Pacific/Tarawa", 12, 12 }, + { "Pacific/Tongatapu", 13, 13 }, + { "Pacific/Truk", 10, 10 }, + { "Pacific/Wake", 12, 12 }, + { "Pacific/Wallis", 12, 12 }, + { "Pacific/Yap", 10, 10 }, + { "Poland", 1, 2 }, + { "Portugal", 0, 1 }, + { "PRC", 8, 8 }, + { "PST8PDT", -8, -7 }, + { "ROC", 8, 8 }, + { "ROK", 9, 9 }, + { "Singapore", 8, 8 }, + { "Turkey", 2, 3 }, + { "UCT", 0, 0 }, + { "Universal", 0, 0 }, + { "US/Alaska", -9, -8 }, + { "US/Aleutian", -10, -9 }, + { "US/Arizona", -7, -7 }, + { "US/Central", -6, -5 }, + { "US/Eastern", -5, -4 }, + { "US/East-Indiana", -5, -4 }, + { "US/Hawaii", -10, -10 }, + { "US/Indiana-Starke", -6, -5 }, + { "US/Michigan", -5, -4 }, + { "US/Mountain", -7, -6 }, + { "US/Pacific", -8, -7 }, + { "US/Pacific-New", -8, -7 }, + { "US/Samoa", -11, -11 }, + { "UTC", 0, 0 }, + { "WET", 0, 1 }, + { "W-SU", 3, 3 }, + { "Zulu", 0, 0 }, +}; + +/* + Extra checks for gracefull (early) + stopping of pilight +*/ +static int searchingtz = 0; +static uv_mutex_t mutex_lock; +// static pthread_mutexattr_t mutex_attr; +static unsigned short mutex_init = 0; + +void datetime_init(void) { + // pthread_mutexattr_init(&mutex_attr); + // pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); + // pthread_mutex_init(&mutex_lock, &mutex_attr); + uv_mutex_init(&mutex_lock); + mutex_init = 1; +} + +int datetime_gc(void) { + while(searchingtz > 0) { +#ifdef _WIN32 + SleepEx(10, TRUE); +#else + usleep(10); +#endif + } + logprintf(LOG_DEBUG, "garbage collected datetime library"); + return EXIT_SUCCESS; +} + +char *coord2tz(double longitude, double latitude) { +/* + Extra checks for graceful (early) + stopping of pilight +*/ + if(mutex_init == 1) { + uv_mutex_lock(&mutex_lock); + } + searchingtz++; + int i = 0, a = 0, margin = 1, inside = 0; + int nrtz = sizeof(tzdata)/sizeof(tzdata[0]); + char *tz = NULL; + + margin *= (int)pow(10, PRECISION); + int y = (int)round(latitude*(int)pow(10, PRECISION)); + int x = (int)round(longitude*(int)pow(10, PRECISION)); + + while(!inside && margin < (5*(int)pow(10, PRECISION))) { + for(i=0;i 0) { + int p1x = 0; + int p1y = 0; + for(a=0;a round(x)) + &&(round(p2y)-margin < round(y) && round(p2y)+margin > round(y))) { + int xinters = 0; + if(y > min(p1y, p2y)) { + if(y <= max(p1y, p2y)) { + if(x <= max(p1x, p2x)) { + if(p1y != p2y) { + xinters = (y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x; + } + if(p1x == p2x || x <= xinters) { + tz = tzdata[i].timezone; + inside = 1; + break; + } + } + } + } + p1x = p2x; + p1y = p2y; + } + } + if(inside == 1) { + break; + } + } + } + margin /= (int)pow(10, PRECISION); + margin++; + margin *= (int)pow(10, PRECISION); + } + + searchingtz--; + if(mutex_init == 1) { + uv_mutex_unlock(&mutex_lock); + } + return tz; +} + +static int is_leap(int year) { + return ((year % 400 == 0 || year % 100 != 0) && (year % 4 == 0)); +} + +static const char *get_months(time_t year) { + static const char leap[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + static const char common[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + return is_leap(year) ? leap : common; +} + +static void ruleset_add(struct ruleset *ruleset, const struct lc_timezone_rule *rule) { + assert(ruleset->rules_count < (sizeof(ruleset->rules)/sizeof(ruleset->rules[0]))); + + size_t newslot = ruleset->rules_count++; + while(newslot > 0 && + (rule->month < ruleset->rules[newslot-1]->month || + (rule->month == ruleset->rules[newslot-1]->month && + rule->monthday < ruleset->rules[newslot-1]->monthday))) { + + assert((rule->month != ruleset->rules[newslot-1]->month || + rule->monthday != ruleset->rules[newslot-1]->monthday)); + + ruleset->rules[newslot] = ruleset->rules[newslot-1]; + --newslot; + } + ruleset->rules[newslot] = rule; +} + + +static void ruleset_fill_with_year(struct ruleset *ruleset, const struct lc_timezone_rule **rules, + size_t *rules_count, int year, const struct lc_timezone_rule **last, + const struct lc_timezone_rule **last_dst) { + /* + * Step 1: Determine the set of rules of the previous year, so we can + * obtain the offset at the end of that year. + */ + int last_year = 0; + while(*rules_count > 0 && (*rules)->year_from < year) { + const struct lc_timezone_rule *rule = (*rules)++; + if(last_year != rule->year_from) { + ruleset_remove_stale(ruleset, rule->year_from); + } + ruleset_add(ruleset, rule); + ruleset_get_last(ruleset, year, last, last_dst); + --*rules_count; + } + + /* + * Step 2: Determine the set of rules that apply to the current year. + */ + ruleset_remove_stale(ruleset, year); + while(*rules_count > 0 && (*rules)->year_from == year) { + ruleset_add(ruleset, (*rules)++); + --*rules_count; + } +} + +static void ruleset_get_last(struct ruleset *ruleset, int year, + const struct lc_timezone_rule **last, + const struct lc_timezone_rule **last_dst) { + ssize_t i = 0; + assert(ruleset->rules_count > 0); + + *last = ruleset->rules[ruleset->rules_count-1]; + + if((*last)->save > 0) { + *last_dst = *last; + } + + for(i = ruleset->rules_count-2; (*last)->year_to < year-1 && i >= 0; --i) { + const struct lc_timezone_rule *rule = ruleset->rules[i]; + if((*last)->year_to < rule->year_to) { + *last = rule; + if((*last)->save > 0) { + *last_dst = *last; + } + } + } +} + +static int rule_is_greater_than(const struct lc_timezone_rule *rule, + const struct tm *tm, int offset) { + + /* + * Apply the offset to the time and obtain the time of day in seconds. + */ + int seconds = tm->tm_sec + tm->tm_min * 60 + tm->tm_hour * 3600 + offset; + int monthday = tm->tm_mday + seconds / 86400; + int weekday = tm->tm_wday + seconds / 86400; + + seconds %= 86400; + if(seconds < 0) { + seconds += 86400; + --weekday; + --monthday; + } + + /* + * Normalize the month. + */ + int month = tm->tm_mon; + if(monthday < 1) { + /* + * Time went back into last year. + */ + if(month == 0) { + return 1; + } + monthday += get_months(tm->tm_year)[month-1]; + --month; + } else { + int monthlen = get_months(tm->tm_year)[month]; + if(monthday > monthlen) { + monthday -= monthlen; + ++month; + } + } + + /* + * Compare months. + */ + if(rule->month != month) { + return rule->month > month; + } + + /* + * When rule->weekday is between 0 and 6, we only want to apply the + * rule on the first occurrence of the weekday on or after the day + * of the month. More concretely, if weekday == 3 and monthday == + * 15, the rule only takes effect on the first Wednesday on or after + * the 15th of that month. + */ + int monthdaydelta = 0; + if(rule->weekday != 7) { + monthdaydelta = ((int)rule->weekday - weekday + monthday - (int)rule->monthday) % 7; + if(monthdaydelta < 0) { + monthdaydelta += 7; + } + } + + /* + * Compare day of the month and time. + */ + return (rule->monthday + monthdaydelta) * 86400 + rule->minute * 60 > monthday * 86400 + seconds; +} + +static void ruleset_remove_stale(struct ruleset *ruleset, int year) { + size_t i = 0; + size_t old_rules_count = ruleset->rules_count; + ruleset->rules_count = 0; + + for(i=0; irules[i]->year_to == UINT8_MAX || ruleset->rules[i]->year_to >= year) { + ruleset->rules[ruleset->rules_count++] = ruleset->rules[i]; + } + } +} + +static const struct lc_timezone_rule *determine_applicable_rule( + const struct lc_timezone_rule *rules, size_t rules_count, + const struct tm *std, int gmtoff) { + /* + * Start out by picking the first standard time rule as a fallback. It + * may be the case that the code below obtains no matching rule, for + * example if the timestamp is lower than any of the starting times of + * the rules. + * + * This rule has no influence on the time computation, but at least + * ensures that we have a proper timezone abbreviation. + */ + static const struct lc_timezone_rule nomatch = { 0 }; + // memset(&nomatch, 0, sizeof(nomatch)); + const struct lc_timezone_rule *match = &nomatch; + size_t i = 0; + for(i=0; itm_year, &match, &unused); + + /* + * Determine whether there is a rule for the current year that matches + * the time more accurately than the one matching the start of the + * year. + */ + for(i=0; itimebase) { + case TIMEBASE_CUR: + offset = match->save * 600; + break; + case TIMEBASE_UTC: + offset = -gmtoff; + break; + } + + if(rule_is_greater_than(rule, std, offset)) { + break; + } + match = rule; + } + return match; +} + +// static const char *compute_combined_zone_abbreviation(const char *era, const char *rule) { + // /* + // * Perform expansion. + // */ + // char abbreviation[sizeof(((struct cached_abbreviation *)0)->abbreviation)]; + // snprintf(abbreviation, sizeof(abbreviation), era, rule); + + // /* + // * See if there's already a copy of this string in the stringpool. + // */ + // struct cached_abbreviation *ca = NULL; + // static _Atomic(struct cached_abbreviation *) table = ATOMIC_VAR_INIT(NULL); + // struct cached_abbreviation *first = atomic_load_explicit(&table, memory_order_relaxed); + + // for(ca = first; ca != NULL; ca = ca->next) { + // if(strcmp(abbreviation, ca->abbreviation) == 0) { + // return ca->abbreviation; + // } + // } + + // /* + // * Allocate a copy to be stored in the stringpool. + // */ + // struct cached_abbreviation *ca_new = MALLOC(sizeof(*ca_new)); + // if(ca_new == NULL) { + // return ""; + // } + // strncpy(ca_new->abbreviation, abbreviation, sizeof(ca_new->abbreviation)); + + // for(;;) { + // struct cached_abbreviation *ca = NULL; + // /* + // * Store the new entry in the global list. The list is lockless, so + // * perform a compare-and-exchange. + // */ + // ca_new->next = first; + + // if(atomic_compare_exchange_weak(&table, &first, ca_new)) { + // char *a = ca_new->abbreviation; + // FREE(ca_new); + // return a; + // } + + // /* + // * Compare-and-exchange failed. See if an entry for the same + // * abbreviation got created in the meantime. + // */ + // for(ca = first; ca != ca_new->next; ca = ca->next) { + // if(strcmp(abbreviation, ca->abbreviation) == 0) { + // FREE(ca_new); + // return ca->abbreviation; + // } + // } + // } +// } + +static const short *get_months_cumulative(time_t year) { + static const short leap[13] = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }; + static const short common[13] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; + return is_leap(year) ? leap : common; +} + +// static const char *compute_zone_abbreviation(const struct lc_timezone_era *era, + // const struct lc_timezone_rule *rule) { + + // /* + // * If the timezone already provides explicit abbreviations for + // * standard time and daylight saving time, use those directly. + // */ + // if(*era->abbreviation_dst != '\0') { + // return rule->save == 0 ? era->abbreviation_std : era->abbreviation_dst; + // } + + // /* + // * If the era abbreviation contains %s, expand it with the + // * abbreviation of the rule. Keep track of the result in a string + // * pool, so we don't leak memory. + // */ + // if(strchr(era->abbreviation_std, '%') != NULL) { + // return compute_combined_zone_abbreviation(era->abbreviation_std, rule->abbreviation); + // } + + // /* + // * Era abbreviation does not contain %s. Use the abbreviation of the + // * era or the rule, preferring the latter if three or more characters. + // */ + // return rule->abbreviation[0] != '\0' && rule->abbreviation[1] != '\0' && rule->abbreviation[2] != '\0' + // ? rule->abbreviation + // : era->abbreviation_std; +// } + +int __localtime_utc(time_t timer, struct tm *tm) { + + /* + * The calendar repeats every 146097 days (400 years). Normalize the + * timer to lie within this range. This ensures that the timestamp is + * positive, simplifying the arithmetic below. + */ + time_t era = timer / ERALENGTH; + + timer %= ERALENGTH; + if(timer < 0) { + timer += ERALENGTH; + --era; + } + + /* + * Compute time within the day. + */ + unsigned int seconds = (unsigned int)timer % 86400; + *tm = (struct tm){.tm_sec = seconds % 60}; + uint_fast16_t minutes = seconds / 60; + tm->tm_min = minutes % 60; + tm->tm_hour = minutes / 60; + + /* + * Compute weekday. Day 0 is a Thursday. + */ + unsigned int days = (unsigned int)timer / 86400; + tm->tm_wday = (days + 4) % 7; + + /* + * Apply leap days, so that every year becomes exactly 366 days long. + * First add the three leap days at the boundaries of the centuries. + * After that we can add up to three leap days per 1461 days. + */ + days += ((int)days - 11323) / 36524; + days += days / 1461 + (days + 731) / 1461 + (days + 1096) / 1461; + tm->tm_yday = days % 366; + + /* + * Compute the year. + */ + uint_fast16_t local_year = days / 366 + 70; + time_t year = era * 400 + local_year; + + /* + * Compute month and day within month. + */ + const short *months = get_months_cumulative(local_year); + while(tm->tm_yday >= months[tm->tm_mon + 1]) { + ++tm->tm_mon; + } + tm->tm_mday = tm->tm_yday - months[tm->tm_mon] + 1; + + /* + * Determine whether the result fits in "struct tm". If it does not, + * still return a structure, but set the year to INT_MIN or INT_MAX. + */ + if(year < INT_MIN) { + tm->tm_year = INT_MIN; + return EOVERFLOW; + } else if (year > INT_MAX) { + tm->tm_year = INT_MAX; + return EOVERFLOW; + } else { + tm->tm_year = year; + return 0; + } +} + +int localtime_l(time_t t, struct tm *result, char *timezone) { + size_t i = 0; + int x = 0; + /* + * Require tv_nsec to be in bounds, like other functions that accept + */ + if(t < 0) { + return EINVAL; + } + + const char *timezone_name = timezone_names; + do { + if(strcmp(timezone, timezone_name) == 0) { + break; + } + ++x; + timezone_name += strlen(timezone_name) + 1; + } while(*timezone_name != '\0'); + + /* + * Obtain the last era from the timezone that does not end before the + * provided timestamp. + */ + const struct lc_timezone *tz = &timezones[x]; + const struct lc_timezone_era *era = &tz->eras[0]; + time_t era_start = 0; + for(i=1; ieras_count; ++i) { + if(era->end > t) { + break; + } + era_start = era->end + era->gmtoff + era->end_save * 600; + era = &tz->eras[i]; + } + + int error = 0; + if(era->rules_count > 0) { + /* + * Timezone has daylight saving time rules. First compute the + * standard time and use that to compute the actual offset. If the + * timestamp is close to the start of the era and the UTC offset got + * decreased, make sure that the timestamp used for matching is set + * to the start of the era. This ensures that we match the proper + * DST rules. + */ + time_t timer_std = t + era->gmtoff; + + struct tm std; + __localtime_utc(timer_std > era_start ? timer_std : era_start, &std); + + /* + * Obtain applicable daylight saving time rule and recompute. + */ + const struct lc_timezone_rule *rule = determine_applicable_rule(era->rules, era->rules_count, &std, era->gmtoff); + int gmtoff = era->gmtoff + rule->save * 600; + + error = __localtime_utc(t + gmtoff, result); + + result->tm_isdst = rule->save > 0; + +#ifndef _WIN32 + result->tm_gmtoff = gmtoff; + // result->tm_zone = compute_zone_abbreviation(era, rule); +#endif + } else { + /* + * Timezone has no daylight saving time rules. Compute local time + * with timezone offset directly. + */ + error = __localtime_utc(t + era->gmtoff, result); +#ifndef _WIN32 + result->tm_gmtoff = era->gmtoff; + // static const struct lc_timezone_rule rule = {}; + // result->tm_zone = compute_zone_abbreviation(era, &rule); +#endif + } + + return error; +} + +static int dayofweek(int y, int m, int d) { + static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}; + y -= m < 3; + return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7; +} + +void datefix(int *year, int *month, int *day, int *hour, int *minute, int *second, int *weekday) { + int months[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + int i = 0; + + if(((*year % 4) == 0 && (*year % 100) != 0) || (*year % 400) == 0) { + months[1] = 29; + } + while(*second >= 60) { + *minute += 1; + *second -= 60; + } + while(*second < 0) { + *minute -= 1; + *second = 60 + *second; + } + while(*minute >= 60) { + *hour += 1; + *minute -= 60; + } + while(*minute < 0) { + *hour -= 1; + *minute = 60 + *minute; + } + while(*hour > 23) { + *day += 1; + *hour -= 24; + } + while(*hour < 0) { + *day -= 1; + *hour = 24 + *hour; + } + while(*day <= 0 || *month > 12 || *month <= 0 || *day > months[*month-1]) { + if(*month > 0 && *month < 13) { + if(*day > months[*month-1]) { + i = months[*month-1]; + *month += 1; + *day -= i; + } else if(*day <= 0) { + *month -= 1; + if(*month <= 0) { + *day = months[11 + *month] + *day; + } else { + *day = months[*month-1] + *day; + } + } + } + while(*month > 12 || *month <= 0) { + if(*month > 12) { + *year += 1; + *month -= 12; + } else if(*month < 0) { + *year -= 1; + *month = 12 + *month; + } else { + *year -= 1; + *month = 12; + } + if(((*year % 4) == 0 && (*year % 100) != 0) || (*year % 400) == 0) { + months[1] = 29; + } else { + months[1] = 28; + } + } + } + + *weekday = dayofweek(*year, *month, *day); +} + +time_t datetime2ts(int year, int month, int day, int hour, int minutes, int seconds) { + int smin = 60, shour = (smin*60), sday = (shour*24); + int i = 0; + time_t t = 0; + if(year < 1970) { + return -1; + } + if(month < 1 || month > 12) { + return -1; + } + if(day < 1) { + return -1; + } + if((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && + day > 31) { + return -1; + } + if((month == 4 || month == 6 || month == 9 || month == 11) && day > 30) { + return -1; + } + if(month == 2) { + if(day > 28) { + if(((year % 400) == 0 || (year % 100) == 0 || (year % 4) == 0) && day > 29) { + return -1; + } else { + return -1; + } + } + } + if(hour < 0 || hour > 23) { + return -1; + } + if(minutes < 0 || minutes > 59) { + return -1; + } + if(seconds < 0 || seconds > 59) { + return -1; + } + + for(i=1970;i 11) { t += 30*sday; } + if(month > 10) { t += 31*sday; } + if(month > 9) { t += 30*sday; } + if(month > 8) { t += 31*sday; } + if(month > 7) { t += 31*sday; } + if(month > 6) { t += 30*sday; } + if(month > 5) { t += 31*sday; } + if(month > 4) { t += 30*sday; } + if(month > 3) { t += 31*sday; } + if(month > 2) { if(is_leap(year) == 1) { t += 29*sday; } else { t += 28*sday; } } + if(month > 1) { t += 31*sday; } + + t += (hour*shour); + t += (minutes*smin); + t += (seconds); + + t -= 86400; + + return t; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/datetime.h b/lib/ESPiLight/pilight/libs/pilight/core/datetime.h new file mode 100644 index 0000000..4b01d98 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/datetime.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _DATETIME_H_ +#define _DATETIME_H_ + +int datetime_gc(void); +char *coord2tz(double, double); +time_t datetime2ts(int, int, int, int, int, int); +int tzoffset(char *, char *, double *); +int isdst(time_t, char *); +void datefix(int *, int *, int *, int *, int *, int *, int *); +void datetime_init(void); +int localtime_l(time_t, struct tm *, char *); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/dso.c b/lib/ESPiLight/pilight/libs/pilight/core/dso.c new file mode 100644 index 0000000..7f3d4ea --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/dso.c @@ -0,0 +1,121 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#ifndef _WIN32 + #include +#endif + +#include "common.h" +#include "mem.h" +#include "log.h" +#include "dso.h" + +void *dso_load(char *object) { +#ifndef _WIN32 + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + void *handle = NULL; + int match = 0; + struct dso_t *tmp = dso; + while(tmp) { + if(strcmp(tmp->name, object) == 0) { + match = 1; + break; + } + tmp = tmp->next; + } + if(match) { + return NULL; + } + +#if defined(RTLD_GROUP) && defined(RTLD_WORLD) && defined(RTLD_PARENT) + if(!(handle = dlopen(object, RTLD_LAZY | RTLD_GLOBAL | RTLD_GROUP | RTLD_WORLD | RTLD_PARENT))) { +#elif defined(RTLD_DEEPBIND) + if(!(handle = dlopen(object, RTLD_LAZY | RTLD_GLOBAL | RTLD_DEEPBIND))) { +#else + if(!(handle = dlopen(object, RTLD_LAZY))) { +#endif + atomiclock(); + logprintf(LOG_ERR, dlerror()); + atomicunlock(); + return NULL; + } else { + struct dso_t *node = MALLOC(sizeof(struct dso_t)); + if(!node) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + node->handle = handle; + if((node->name = MALLOC(strlen(object)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(node->name, object); + node->next = dso; + dso = node; + return handle; + } +#else + logprintf(LOG_ERR, "dynamic loading not implemented on Windows"); + return NULL; +#endif +} + +int dso_gc(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct dso_t *tmp = NULL; + while(dso) { + tmp = dso; +#ifndef _WIN32 + dlclose(tmp->handle); +#endif + FREE(tmp->name); + dso = dso->next; + FREE(tmp); + } + if(dso != NULL) { + FREE(dso); + } + + logprintf(LOG_DEBUG, "garbage collected dso library"); + return 0; +} + +void *dso_function(void *handle, const char *name) { +#ifndef _WIN32 + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + void *init = (void *)dlsym(handle, name); + char *error = NULL; + atomiclock(); + if((error = dlerror()) != NULL) { + logprintf(LOG_ERR, error); + atomicunlock(); + return 0; + } else { + atomicunlock(); + return init; + } +#else + return 0; +#endif +} diff --git a/lib/ESPiLight/src/pilight/libs/pilight/core/dso.h b/lib/ESPiLight/pilight/libs/pilight/core/dso.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/core/dso.h rename to lib/ESPiLight/pilight/libs/pilight/core/dso.h diff --git a/lib/ESPiLight/pilight/libs/pilight/core/eventpool.c b/lib/ESPiLight/pilight/libs/pilight/core/eventpool.c new file mode 100644 index 0000000..77108a9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/eventpool.c @@ -0,0 +1,891 @@ +/* + Copyright (C) 2015 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include "eventpool.h" + +#include +#ifdef _WIN32 + #if _WIN32_WINNT < 0x0501 + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0501 + #endif + #define WIN32_LEAN_AND_MEAN + #include + #include + #include + #include + struct pollfd { + int fd; + short events; + short revents; + }; + #define POLLIN 0x0001 + #define POLLPRI 0x0002 + #define POLLOUT 0x0004 +#else + #include + #include + #include + #include +#endif +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "../../libuv/uv.h" +#include "mem.h" +#include "network.h" + +static uv_async_t *async_req = NULL; + +struct eventqueue_t { + int reason; + void *(*done)(void *); + void *data; + struct eventqueue_t *next; +} eventqueue_t; + +#ifdef _WIN32 +static volatile long nrlisteners[REASON_END] = {0}; +#else +static int nrlisteners[REASON_END] = {0}; +#endif +static struct eventqueue_t *eventqueue = NULL; + +static int threads = EVENTPOOL_NO_THREADS; +static uv_mutex_t listeners_lock; +// static pthread_mutexattr_t listeners_attr; +static int lockinit = 0; +static int eventpoolinit = 0; +static ssize_t zero = 0; +static ssize_t one = 1; + +static struct eventpool_listener_t *eventpool_listeners = NULL; + +static struct reasons_t { + int number; + char *reason; + int priority; +} reasons[REASON_END+1] = { + { REASON_SEND_CODE, "REASON_SEND_CODE", 0 }, + { REASON_CONTROL_DEVICE, "REASON_CONTROL_DEVICE", 0 }, + { REASON_CODE_SENT, "REASON_CODE_SENT", 0 }, + { REASON_SOCKET_SEND, "REASON_CODE_SEND_FAIL", 0 }, + { REASON_SOCKET_SEND, "REASON_CODE_SEND_SUCCESS", 0 }, + { REASON_CODE_RECEIVED, "REASON_CODE_RECEIVED", 0 }, + { REASON_RECEIVED_PULSETRAIN, "REASON_RECEIVED_PULSETRAIN", 0 }, + { REASON_BROADCAST, "REASON_BROADCAST", 0 }, + { REASON_BROADCAST_CORE, "REASON_BROADCAST_CORE", 0 }, + { REASON_FORWARD, "REASON_FORWARD", 0 }, + { REASON_CONFIG_UPDATE, "REASON_CONFIG_UPDATE", 0 }, + { REASON_CONFIG_UPDATED, "REASON_CONFIG_UPDATED", 0 }, + { REASON_SOCKET_RECEIVED, "REASON_SOCKET_RECEIVED", 0 }, + { REASON_SOCKET_DISCONNECTED, "REASON_SOCKET_DISCONNECTED", 0 }, + { REASON_SOCKET_CONNECTED, "REASON_SOCKET_CONNECTED", 0 }, + { REASON_SOCKET_SEND, "REASON_SOCKET_SEND", 0 }, + { REASON_SSDP_RECEIVED, "REASON_SSDP_RECEIVED", 0 }, + { REASON_SSDP_RECEIVED_FREE, "REASON_SSDP_RECEIVED_FREE", 0 }, + { REASON_SSDP_DISCONNECTED, "REASON_SSDP_DISCONNECTED", 0 }, + { REASON_SSDP_CONNECTED, "REASON_SSDP_CONNECTED", 0 }, + { REASON_WEBSERVER_CONNECTED, "REASON_WEBSERVER_CONNECTED", 0 }, + { REASON_DEVICE_ADDED, "REASON_DEVICE_ADDED", 0 }, + { REASON_DEVICE_ADAPT, "REASON_DEVICE_ADAPT", 0 }, + { REASON_ADHOC_MODE, "REASON_ADHOC_MODE", 0 }, + { REASON_ADHOC_CONNECTED, "REASON_ADHOC_CONNECTED", 0 }, + { REASON_ADHOC_CONFIG_RECEIVED, "REASON_ADHOC_CONFIG_RECEIVED", 0 }, + { REASON_ADHOC_DATA_RECEIVED, "REASON_ADHOC_DATA_RECEIVED", 0 }, + { REASON_ADHOC_UPDATE_RECEIVED, "REASON_ADHOC_UPDATE_RECEIVED", 0 }, + { REASON_ADHOC_DISCONNECTED, "REASON_ADHOC_DISCONNECTED", 0 }, + { REASON_SEND_BEGIN, "REASON_SEND_BEGIN", 0 }, + { REASON_SEND_END, "REASON_SEND_END", 0 }, + { REASON_ARP_FOUND_DEVICE, "REASON_ARP_FOUND_DEVICE", 0 }, + { REASON_ARP_LOST_DEVICE, "REASON_ARP_LOST_DEVICE", 0 }, + { REASON_ARP_CHANGED_DEVICE, "REASON_ARP_CHANGED_DEVICE", 0 }, + { REASON_LOG, "REASON_LOG", 0 }, + { REASON_END, "REASON_END", 0 } +}; + +static void fib_free(uv_work_t *req, int status) { + FREE(req->data); + FREE(req); +} + +static void fib(uv_work_t *req) { + struct threadpool_data_t *data = req->data; + + data->func(data->reason, data->userdata); + + int x = 0; + if(data->ref != NULL) { + x = uv_sem_trywait(data->ref); + } + if((data->ref == NULL) || (x == UV__EAGAIN)) { + if(data->done != NULL && data->reason != REASON_END) { + data->done(data->userdata); + } + if(data->ref != NULL) { + FREE(data->ref); + } + } + // FREE(req->data); +} + +void eventpool_callback(int reason, void *(*func)(int, void *)) { + if(lockinit == 1) { + uv_mutex_lock(&listeners_lock); + } + struct eventpool_listener_t *node = MALLOC(sizeof(struct eventpool_listener_t)); + if(node == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + node->func = func; + node->reason = reason; + node->next = NULL; + + node->next = eventpool_listeners; + eventpool_listeners = node; + +#ifdef _WIN32 + InterlockedIncrement(&nrlisteners[reason]); +#else + __sync_add_and_fetch(&nrlisteners[reason], 1); +#endif + + if(lockinit == 1) { + uv_mutex_unlock(&listeners_lock); + } +} + +void eventpool_trigger(int reason, void *(*done)(void *), void *data) { + if(eventpoolinit == 0) { + return; + } + +#ifdef _WIN32 + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); +#else + struct sched_param sched; + memset(&sched, 0, sizeof(sched)); + sched.sched_priority = 80; + pthread_setschedparam(pthread_self(), SCHED_RR, &sched); +#endif + int eventqueue_size = 0; + + struct eventqueue_t *node = MALLOC(sizeof(struct eventqueue_t)); + if(node == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(node, 0, sizeof(struct eventqueue_t)); + node->reason = reason; + node->done = done; + node->data = data; + + uv_mutex_lock(&listeners_lock); + struct eventqueue_t *tmp = eventqueue; + if(tmp != NULL) { + while(tmp->next != NULL) { + eventqueue_size++; + tmp = tmp->next; + } + tmp->next = node; + node = tmp; + } else { + node->next = eventqueue; + eventqueue = node; + } + + /* + * If the eventqueue size is above + * 50 entries then there must be a bug + * at the trigger side. + */ + assert(eventqueue_size < 50); + + uv_mutex_unlock(&listeners_lock); + + uv_async_send(async_req); +} + +static void eventpool_execute(uv_async_t *handle) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct threadpool_tasks_t **node = NULL; + int nrlisteners1[REASON_END] = {0}; + int nr1 = 0, nrnodes = 16, nrnodes1 = 0, i = 0; + + if((node = MALLOC(sizeof(struct threadpool_tasks_t *)*nrnodes)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + uv_mutex_lock(&listeners_lock); + + struct eventqueue_t *queue = NULL; + while(eventqueue) { + queue = eventqueue; + uv_sem_t *ref = NULL; + +#ifdef _WIN32 + if((nr1 = InterlockedExchangeAdd(&nrlisteners[queue->reason], 0)) == 0) { +#else + if((nr1 = __sync_add_and_fetch(&nrlisteners[queue->reason], 0)) == 0) { +#endif + if(queue->done != NULL) { + queue->done((void *)queue->data); + } + } else { + if(threads == EVENTPOOL_THREADED) { + if((ref = MALLOC(sizeof(uv_sem_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + uv_sem_init(ref, nr1-1); + } + + struct eventpool_listener_t *listeners = eventpool_listeners; + if(listeners == NULL) { + if(queue->done != NULL) { + queue->done((void *)queue->data); + } + } + + while(listeners) { + if(listeners->reason == queue->reason) { + if(nrnodes1 == nrnodes) { + nrnodes *= 2; + /*LCOV_EXCL_START*/ + if((node = REALLOC(node, sizeof(struct threadpool_tasks_t *)*nrnodes)) == NULL) { + OUT_OF_MEMORY + } + /*LCOV_EXCL_STOP*/ + } + if((node[nrnodes1] = MALLOC(sizeof(struct threadpool_tasks_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + node[nrnodes1]->func = listeners->func; + node[nrnodes1]->userdata = queue->data; + node[nrnodes1]->done = queue->done; + node[nrnodes1]->ref = ref; + node[nrnodes1]->reason = listeners->reason; + nrnodes1++; + if(threads == EVENTPOOL_THREADED) { + nrlisteners1[queue->reason]++; + } + } + listeners = listeners->next; + } + } + eventqueue = eventqueue->next; + FREE(queue); + } + uv_mutex_unlock(&listeners_lock); + + if(nrnodes1 > 0) { + for(i=0;ireason]++; + node[i]->func(node[i]->reason, node[i]->userdata); + +#ifdef _WIN32 + if(nrlisteners1[node[i]->reason] == InterlockedExchangeAdd(&nrlisteners[node[i]->reason], 0)) { +#else + if(nrlisteners1[node[i]->reason] == __sync_add_and_fetch(&nrlisteners[node[i]->reason], 0)) { +#endif + if(node[i]->done != NULL) { + node[i]->done((void *)node[i]->userdata); + } + nrlisteners1[node[i]->reason] = 0; + } + } else { + struct threadpool_data_t *tpdata = NULL; + tpdata = MALLOC(sizeof(struct threadpool_data_t)); + if(tpdata == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + tpdata->userdata = node[i]->userdata; + tpdata->func = node[i]->func; + tpdata->done = node[i]->done; + tpdata->ref = node[i]->ref; + tpdata->reason = node[i]->reason; + tpdata->priority = reasons[node[i]->reason].priority; + + uv_work_t *tp_work_req = MALLOC(sizeof(uv_work_t)); + if(tp_work_req == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + tp_work_req->data = tpdata; + if(uv_queue_work(uv_default_loop(), tp_work_req, reasons[node[i]->reason].reason, fib, fib_free) < 0) { + if(node[i]->done != NULL) { + node[i]->done((void *)node[i]->userdata); + } + FREE(tpdata); + FREE(node[i]->ref); + } + } + FREE(node[i]); + } + } + for(i=0;idata != NULL && eventqueue->done != NULL) { + eventqueue->done(eventqueue->data); + } + eventqueue = eventqueue->next; + FREE(queue); + } + struct eventpool_listener_t *listeners = NULL; + while(eventpool_listeners) { + listeners = eventpool_listeners; + eventpool_listeners = eventpool_listeners->next; + FREE(listeners); + } + if(eventpool_listeners != NULL) { + FREE(eventpool_listeners); + } + threads = EVENTPOOL_NO_THREADS; + + int i = 0; + for(i=0;ilock); + if(n > 0 && n <= io->len) { + memmove(io->buf, io->buf + n, io->len - n); + io->len -= n; + io->buf[io->len] = 0; + } + uv_mutex_unlock(&io->lock); +} + +static void eventpool_update_poll(uv_poll_t *req) { + struct uv_custom_poll_t *custom_poll_data = NULL; + struct iobuf_t *send_io = NULL; + int action = 0, r = 0; + + custom_poll_data = req->data; + if(custom_poll_data == NULL || uv_is_closing((uv_handle_t *)req)) { + return; + } + + send_io = &custom_poll_data->send_iobuf; + + if(custom_poll_data->doread == 1) { + action |= UV_READABLE; + } + + if(custom_poll_data->dowrite == 1) { + action |= UV_WRITABLE; + } + + if(custom_poll_data->doclose == 1 && send_io->len == 0) { + custom_poll_data->doclose = 2; + if(custom_poll_data->close_cb != NULL) { + custom_poll_data->close_cb(req); + } + if(!uv_is_closing((uv_handle_t *)req)) { + uv_poll_stop(req); + } + } else if(custom_poll_data->action != action && action > 0) { + uv_poll_start(req, action, uv_custom_poll_cb); + if(r != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_poll_start: %s", uv_strerror(r)); + return; + /*LCOV_EXCL_STOP*/ + } + custom_poll_data->action = action; + } +} + +size_t iobuf_append(struct iobuf_t *io, const void *buf, int len) { + char *p = NULL; + + uv_mutex_lock(&io->lock); + assert(io != NULL); + assert(io->len <= io->size); + + if(len <= 0) { + } else if(io->len + len <= io->size) { + memcpy(io->buf + io->len, buf, len); + io->len += len; + } else if((p = REALLOC(io->buf, io->len + len + 1)) != NULL) { + io->buf = p; + memcpy(io->buf + io->len, buf, len); + io->len += len; + io->size = io->len; + } else { + len = 0; + } + uv_mutex_unlock(&io->lock); + + return len; +} + +/*LCOV_EXCL_START*/ +static void my_debug(void *ctx, int level, const char *file, int line, const char *str) { + printf("%s:%04d: %s", file, line, str ); +} +/*LCOV_EXCL_STOP*/ + +void uv_custom_poll_cb(uv_poll_t *req, int status, int events) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = NULL; + struct iobuf_t *send_io = NULL; + char buffer[BUFFER_SIZE]; + uv_os_fd_t fd = 0; + long int fromlen = 0; + int r = 0, n = 0; + + custom_poll_data = req->data; + if(custom_poll_data == NULL) { + uv_poll_stop(req); + return; + } + + /* + * Status == -9: Socket is unreachable + * Events == 0: Client-end got disconnected + */ + r = uv_fileno((uv_handle_t *)req, &fd); + if(status < 0 || events == 0) { + logprintf(LOG_ERR, "uv_custom_poll_cb: %s", uv_strerror(status)); + if(custom_poll_data->close_cb != NULL) { + custom_poll_data->close_cb(req); + } + if(!uv_is_closing((uv_handle_t *)req)) { + uv_poll_stop(req); + } + if(fd > 0) { + close(fd); + } + return; + } + + custom_poll_data->started = 1; + + send_io = &custom_poll_data->send_iobuf; + + memset(&buffer, 0, BUFFER_SIZE); + + if(uv_is_closing((uv_handle_t *)req)) { + return; + } + + r = uv_fileno((uv_handle_t *)req, &fd); + if(r != 0) { + logprintf(LOG_ERR, "uv_fileno: %s", uv_strerror(r)); + return; + } + + if(custom_poll_data->is_ssl == 1 && custom_poll_data->ssl.init == 0) { + custom_poll_data->ssl.init = 1; + struct mbedtls_ssl_config *ssl_conf = &ssl_client_conf; + if(custom_poll_data->is_server == 1) { + custom_poll_data->ssl.handshake = 1; + ssl_conf = &ssl_server_conf; + } + if((r = mbedtls_ssl_setup(&custom_poll_data->ssl.ctx, ssl_conf)) < 0) { + mbedtls_strerror(r, (char *)&buffer, BUFFER_SIZE); + logprintf(LOG_ERR, "mbedtls_ssl_setup: %s", buffer); + FREE(req); + return; + } + + if((r = mbedtls_ssl_session_reset(&custom_poll_data->ssl.ctx)) < 0) { + mbedtls_strerror(r, (char *)&buffer, BUFFER_SIZE); + logprintf(LOG_ERR, "mbedtls_ssl_session_reset: %s", buffer); + FREE(req); + return; + } + // mbedtls_debug_set_threshold(2); + mbedtls_ssl_set_bio(&custom_poll_data->ssl.ctx, &fd, mbedtls_net_send, mbedtls_net_recv, NULL); + mbedtls_ssl_conf_dbg(ssl_conf, my_debug, stdout); + } + + if(custom_poll_data->is_ssl == 1 && custom_poll_data->ssl.handshake == 0) { + n = mbedtls_ssl_handshake(&custom_poll_data->ssl.ctx); + if(n == MBEDTLS_ERR_SSL_WANT_READ) { + custom_poll_data->doread = 1; + custom_poll_data->dowrite = 0; + goto end; + } else if(n == MBEDTLS_ERR_SSL_WANT_WRITE) { + /*LCOV_EXCL_START*/ + custom_poll_data->dowrite = 1; + custom_poll_data->doread = 0; + goto end; + /*LCOV_EXCL_STOP*/ + } + if(n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE) { + } else if(n < 0) { + /*LCOV_EXCL_START*/ + mbedtls_strerror(n, (char *)&buffer, BUFFER_SIZE); + logprintf(LOG_NOTICE, "mbedtls_ssl_handshake: %s", buffer); + uv_poll_stop(req); + return; + /*LCOV_EXCL_STOP*/ + } else { + custom_poll_data->ssl.handshake = 1; + } + custom_poll_data->dowrite = 1; + goto end; + } + + if(events & UV_WRITABLE) { + if(send_io->len > 0) { + if(custom_poll_data->is_ssl == 1) { + n = mbedtls_ssl_write(&custom_poll_data->ssl.ctx, (unsigned char *)send_io->buf, send_io->len); + if(n == MBEDTLS_ERR_SSL_WANT_READ) { + /*LCOV_EXCL_START*/ + custom_poll_data->doread = 1; + custom_poll_data->dowrite = 0; + goto end; + /*LCOV_EXCL_STOP*/ + } else if(n == MBEDTLS_ERR_SSL_WANT_WRITE) { + /*LCOV_EXCL_START*/ + custom_poll_data->dowrite = 1; + custom_poll_data->doread = 0; + goto end; + /*LCOV_EXCL_STOP*/ + } + if(n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE) { + } else if(n < 0) { + /*LCOV_EXCL_START*/ + mbedtls_strerror(n, (char *)&buffer, BUFFER_SIZE); + logprintf(LOG_NOTICE, "mbedtls_ssl_handshake: %s", buffer); + uv_poll_stop(req); + return; + /*LCOV_EXCL_STOP*/ + } + } else { + n = (int)send((unsigned int)fd, send_io->buf, send_io->len, 0); + } + if(n > 0) { + iobuf_remove(send_io, n); + if(send_io->len > 0) { + custom_poll_data->dowrite = 1; + } else { + custom_poll_data->dowrite = 0; + if(custom_poll_data->doclose == 1 && send_io->len == 0) { + custom_poll_data->doread = 0; + goto end; + } else { + custom_poll_data->dowrite = 0; + if(custom_poll_data->write_cb != NULL) { + custom_poll_data->write_cb(req); + } + } + } + } else if(n == 0) { + } else if(custom_poll_data->is_ssl == 0 && n < 0 && errno != EAGAIN && errno != EINTR) { + if(errno == ECONNRESET) { + uv_poll_stop(req); + return; + } else { + uv_poll_stop(req); + return; + } + } + } else { + custom_poll_data->dowrite = 0; + if(custom_poll_data->doclose == 1 && send_io->len == 0) { + custom_poll_data->doread = 0; + goto end; + } else { + custom_poll_data->dowrite = 0; + if(custom_poll_data->write_cb != NULL) { + custom_poll_data->write_cb(req); + } + } + } + } + + if(send_io->len > 0) { + custom_poll_data->dowrite = 1; + } + + if(events & UV_READABLE) { + if(custom_poll_data->is_ssl == 1) { + n = mbedtls_ssl_read(&custom_poll_data->ssl.ctx, (unsigned char *)buffer, BUFFER_SIZE); + if(n == MBEDTLS_ERR_SSL_WANT_READ) { + custom_poll_data->doread = 1; + custom_poll_data->dowrite = 0; + goto end; + } else if(n == MBEDTLS_ERR_SSL_WANT_WRITE) { + /*LCOV_EXCL_START*/ + custom_poll_data->dowrite = 1; + custom_poll_data->doread = 0; + goto end; + /*LCOV_EXCL_STOP*/ + } else if(n == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) { + custom_poll_data->doread = 0; + if(custom_poll_data->read_cb != NULL) { + custom_poll_data->read_cb(req, &custom_poll_data->recv_iobuf.len, custom_poll_data->recv_iobuf.buf); + } + } + if(n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE) { + } else if(n < 0) { + if(n == MBEDTLS_ERR_NET_RECV_FAILED) { + /* + * FIXME: New client not yet accepted + */ + if(custom_poll_data->read_cb != NULL) { + one = 1; + custom_poll_data->read_cb(req, &one, NULL); + } + } else if(n != MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) { + mbedtls_strerror(n, (char *)&buffer, BUFFER_SIZE); + logprintf(LOG_NOTICE, "mbedtls_ssl_handshake: %s", buffer); + uv_poll_stop(req); + } + return; + } + } else { + if(custom_poll_data->custom_recv == 0) { + if(custom_poll_data->is_udp == 1) { + n = (int)recv((unsigned int)fd, buffer, BUFFER_SIZE, 0); + } else { +#ifdef _WIN32 + n = recvfrom((SOCKET)fd, buffer, BUFFER_SIZE, 0, NULL, (socklen_t *)&fromlen); +#else + n = recvfrom(fd, buffer, BUFFER_SIZE, 0, NULL, (socklen_t *)&fromlen); +#endif + } + } + } + + if(custom_poll_data->custom_recv == 0) { + if(n > 0) { + iobuf_append(&custom_poll_data->recv_iobuf, buffer, n); + custom_poll_data->doread = 0; + if(custom_poll_data->read_cb != NULL) { + custom_poll_data->read_cb(req, &custom_poll_data->recv_iobuf.len, custom_poll_data->recv_iobuf.buf); + } + } else if(n < 0 && errno != EINTR) { +#ifdef _WIN32 + switch(WSAGetLastError()) { + case WSAENOTCONN: + if(custom_poll_data->read_cb != NULL) { + one = 1; + custom_poll_data->read_cb(req, &one, NULL); + } + break; + case WSAEWOULDBLOCK: +#else + switch(errno) { + case ENOTCONN: + if(custom_poll_data->read_cb != NULL) { + one = 1; + custom_poll_data->read_cb(req, &one, NULL); + } + break; +#if defined EAGAIN + case EAGAIN: +#endif +#if defined EWOULDBLOCK && EWOULDBLOCK != EAGAIN + case EWOULDBLOCK: +#endif +#endif + custom_poll_data->doread = 1; + break; + default: + break; + } + /* + * Client was disconnected + */ + } else if(n == 0) { + custom_poll_data->doclose = 1; + custom_poll_data->doread = 0; + goto end; + } + } else { + custom_poll_data->doread = 0; + if(custom_poll_data->read_cb != NULL) { + zero = 0; + custom_poll_data->read_cb(req, &zero, NULL); + } + } + } + +end: + eventpool_update_poll(req); +} + +static void iobuf_free(struct iobuf_t *iobuf) { + if(iobuf != NULL) { + uv_mutex_lock(&iobuf->lock); + if(iobuf->buf != NULL) { + FREE(iobuf->buf); + } + iobuf->len = iobuf->size = 0; + } + uv_mutex_unlock(&iobuf->lock); +} + +void uv_custom_poll_free(struct uv_custom_poll_t *data) { + if(data->is_ssl == 1) { + mbedtls_ssl_free(&data->ssl.ctx); + } + if(data->send_iobuf.size > 0) { + iobuf_free(&data->send_iobuf); + } + if(data->recv_iobuf.size > 0) { + iobuf_free(&data->recv_iobuf); + } + + FREE(data); +} + +static void iobuf_init(struct iobuf_t *iobuf, size_t initial_size) { + iobuf->len = iobuf->size = 0; + iobuf->buf = NULL; + uv_mutex_init(&iobuf->lock); +} + +void uv_custom_poll_init(struct uv_custom_poll_t **custom_poll, uv_poll_t *poll, void *data) { + if((*custom_poll = MALLOC(sizeof(struct uv_custom_poll_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(*custom_poll, '\0', sizeof(struct uv_custom_poll_t)); + iobuf_init(&(*custom_poll)->send_iobuf, 0); + iobuf_init(&(*custom_poll)->recv_iobuf, 0); + + poll->data = *custom_poll; + (*custom_poll)->data = data; +} + +int uv_custom_close(uv_poll_t *req) { + struct uv_custom_poll_t *custom_poll_data = req->data; + struct iobuf_t *send_io = NULL; + + if(uv_is_closing((uv_handle_t *)req)) { + return -1; + } + + if(custom_poll_data != NULL) { + custom_poll_data->doclose = 1; + } + + send_io = &custom_poll_data->send_iobuf; + + if(custom_poll_data->doclose == 1 && send_io->len == 0) { + custom_poll_data->doclose = 2; + if(custom_poll_data->close_cb != NULL) { + custom_poll_data->close_cb(req); + } + if(!uv_is_closing((uv_handle_t *)req)) { + uv_poll_stop(req); + } + } else if(send_io->len > 0) { + uv_custom_write(req); + } + + return 0; +} + +int uv_custom_read(uv_poll_t *req) { + struct uv_custom_poll_t *custom_poll_data = req->data; + + if(uv_is_closing((uv_handle_t *)req)) { + return -1; + } + + if(custom_poll_data != NULL) { + custom_poll_data->doread = 1; + } + + // if(custom_poll_data->started == 0) { + eventpool_update_poll(req); + // } + return 0; +} + +int uv_custom_write(uv_poll_t *req) { + struct uv_custom_poll_t *custom_poll_data = req->data; + + if(uv_is_closing((uv_handle_t *)req)) { + return -1; + } + + if(custom_poll_data != NULL) { + custom_poll_data->dowrite = 1; + } + + // if(custom_poll_data->started == 0) { + eventpool_update_poll(req); + // } + return 0; +} + +void eventpool_init(enum eventpool_threads_t t) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + if(eventpoolinit == 1) { + return; + } + eventpoolinit = 1; + threads = t; + + if((async_req = MALLOC(sizeof(uv_async_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + uv_async_init(uv_default_loop(), async_req, eventpool_execute); + + if(lockinit == 0) { + lockinit = 1; + // pthread_mutexattr_init(&listeners_attr); + // pthread_mutexattr_settype(&listeners_attr, PTHREAD_MUTEX_RECURSIVE); + // pthread_mutex_init(&listeners_lock, &listeners_attr); + uv_mutex_init(&listeners_lock); + } +} + +enum eventpool_threads_t eventpool_threaded(void) { + return threads; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/eventpool.h b/lib/ESPiLight/pilight/libs/pilight/core/eventpool.h new file mode 100644 index 0000000..73d411a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/eventpool.h @@ -0,0 +1,194 @@ +/* + Copyright (C) 2015 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _EVENTPOOL_H_ +#define _EVENTPOOL_H_ + +#ifdef _WIN32 + #if _WIN32_WINNT < 0x0501 + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0501 + #endif + #define WIN32_LEAN_AND_MEAN + #include + #include + #define MSG_NOSIGNAL 0 +#else + #include + #include +#endif +#include +#include +#include + +#include "../../libuv/uv.h" +#include "eventpool_structs.h" + +enum eventpool_threads_t { + EVENTPOOL_NO_THREADS, + EVENTPOOL_THREADED +} eventpool_threads_t; + +#define EVENTPOOL_STAGE_SOCKET 0 +#define EVENTPOOL_STAGE_CONNECT 1 +#define EVENTPOOL_STAGE_CONNECTING 2 +#define EVENTPOOL_STAGE_CONNECTED 3 +#define EVENTPOOL_STAGE_BIND 4 +#define EVENTPOOL_STAGE_LISTEN 5 +#define EVENTPOOL_STAGE_LISTENING 6 +#define EVENTPOOL_STAGE_READ 7 +#define EVENTPOOL_STAGE_WRITE 8 +#define EVENTPOOL_STAGE_DISCONNECTED 9 +#define EVENTPOOL_STAGE_DISCONNECT 10 + +#define EVENTPOOL_TYPE_SOCKET_CLIENT 0 +#define EVENTPOOL_TYPE_SOCKET_SERVER 1 +#define EVENTPOOL_TYPE_SOCKET_SSL_CLIENT 2 +#define EVENTPOOL_TYPE_SOCKET_SSL_SERVER 3 +#define EVENTPOOL_TYPE_IO 4 + +#define EV_SOCKET_SUCCESS 0 +#define EV_SOCKET_FAILED 1 +#define EV_CONNECT_SUCCESS 2 +#define EV_CONNECT_FAILED 3 +#define EV_BIND_SUCCESS 4 +#define EV_BIND_FAILED 5 +#define EV_LISTEN_SUCCESS 6 +#define EV_LISTEN_FAILED 7 +#define EV_READ 8 +#define EV_WRITE 9 +#define EV_HIGHPRI 10 +#define EV_IDLE 11 +#define EV_DISCONNECTED 12 +// #define EV_POLL 13 + +#define REASON_SEND_CODE 0 +#define REASON_CONTROL_DEVICE 1 +#define REASON_CODE_SENT 2 +#define REASON_CODE_SEND_FAIL 3 +#define REASON_CODE_SEND_SUCCESS 4 +#define REASON_CODE_RECEIVED 5 +#define REASON_RECEIVED_PULSETRAIN 6 +#define REASON_BROADCAST 7 +#define REASON_BROADCAST_CORE 8 +#define REASON_FORWARD 9 +#define REASON_CONFIG_UPDATE 10 +#define REASON_CONFIG_UPDATED 11 +#define REASON_SOCKET_RECEIVED 12 +#define REASON_SOCKET_DISCONNECTED 13 +#define REASON_SOCKET_CONNECTED 14 +#define REASON_SOCKET_SEND 15 +#define REASON_SSDP_RECEIVED 16 +#define REASON_SSDP_RECEIVED_FREE 17 +#define REASON_SSDP_DISCONNECTED 18 +#define REASON_SSDP_CONNECTED 19 +#define REASON_WEBSERVER_CONNECTED 20 +#define REASON_DEVICE_ADDED 21 +#define REASON_DEVICE_ADAPT 22 +#define REASON_ADHOC_MODE 23 +#define REASON_ADHOC_CONNECTED 24 +#define REASON_ADHOC_CONFIG_RECEIVED 25 +#define REASON_ADHOC_DATA_RECEIVED 26 +#define REASON_ADHOC_UPDATE_RECEIVED 27 +#define REASON_ADHOC_DISCONNECTED 28 +#define REASON_SEND_BEGIN 29 +#define REASON_SEND_END 30 +#define REASON_ARP_FOUND_DEVICE 31 +#define REASON_ARP_LOST_DEVICE 32 +#define REASON_ARP_CHANGED_DEVICE 33 +#define REASON_LOG 34 +#define REASON_END 35 + +typedef struct threadpool_data_t { + int reason; + int priority; + char name[255]; + uv_sem_t *ref; + void *userdata; + void *(*func)(int, void *); + void *(*done)(void *); +} threadpool_data_t; + +typedef struct threadpool_tasks_t { + unsigned long id; + char *name; + void *(*func)(int, void *); + void *(*done)(void *); + uv_sem_t *ref; + int priority; + int reason; + + struct { + struct timespec first; + struct timespec second; + } timestamp; + + void *userdata; + + struct threadpool_tasks_t *next; +} threadpool_tasks_t; + +typedef struct eventpool_listener_t { + void *(*func)(int, void *); + void *userdata; + int reason; + struct eventpool_listener_t *next; +} eventpool_listener_t; + +typedef struct iobuf_t { + char *buf; + ssize_t len; + ssize_t size; + uv_mutex_t lock; +} iobuf_t; + +struct uv_custom_poll_t { + int is_ssl; + int is_server; + int is_udp; + int custom_recv; + int doread; + int dowrite; + int doclose; + int started; + int action; + uv_timer_t *timer_req; + uv_poll_t *poll_req; + + void *data; + + void (*write_cb)(uv_poll_t *); + void (*close_cb)(uv_poll_t *); + void (*read_cb)(uv_poll_t *, ssize_t *, char *); + + struct { + int init; + int handshake; + mbedtls_ssl_context ctx; + } ssl; + + struct iobuf_t recv_iobuf; + struct iobuf_t send_iobuf; +} uv_custom_poll_t; + +void eventpool_callback(int, void *(*)(int, void *)); +void eventpool_trigger(int, void *(*)(void *), void *); +void eventpool_init(enum eventpool_threads_t); +int eventpool_gc(void); + +void iobuf_remove(struct iobuf_t *, size_t); +size_t iobuf_append(struct iobuf_t *, const void *, int); + +void uv_custom_poll_init(struct uv_custom_poll_t **, uv_poll_t *, void *); +void uv_custom_poll_free(struct uv_custom_poll_t *); +void uv_custom_poll_cb(uv_poll_t *, int, int); +int uv_custom_read(uv_poll_t *); +int uv_custom_write(uv_poll_t *); +int uv_custom_close(uv_poll_t *); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/eventpool_structs.h b/lib/ESPiLight/pilight/libs/pilight/core/eventpool_structs.h new file mode 100644 index 0000000..3a25d05 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/eventpool_structs.h @@ -0,0 +1,133 @@ +/* + Copyright (C) 2015 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _EVENTPOOL_STRUCTS_H_ +#define _EVENTPOOL_STRUCTS_H_ + +#include "defines.h" +#include "eventpool_structs.h" + +typedef struct reason_log_t { + char *buffer; +} reason_log_t; + +typedef struct reason_ssdp_received_t { + char name[17]; + char uuid[UUID_LENGTH+1]; + char ip[INET_ADDRSTRLEN+1]; + int port; +} reason_ssdp_received_t; + +typedef struct reason_received_pulsetrain_t { + int length; + int pulses[MAXPULSESTREAMLENGTH+1]; + char *hardware; +} reason_received_pulsetrain_t; + +typedef struct reason_code_received_t { + char message[1025]; + char origin[256]; + char *protocol; + char *uuid; + + int repeat; +} reason_code_received_t; + +typedef struct reason_code_sent_t { + char message[1025]; + char protocol[256]; + char origin[256]; + char uuid[UUID_LENGTH+1]; + + int type; + int repeat; +} reason_code_sent_t; + +typedef struct reason_code_sent_fail_t { + char message[1025]; + char uuid[UUID_LENGTH+1]; +} reason_code_sent_failed_t; + +typedef struct reason_code_sent_success_t { + char message[1025]; + char uuid[UUID_LENGTH+1]; +} reason_code_sent_success_t; + +typedef struct reason_socket_disconnected_t { + int fd; +} reason_socket_disconnected_t; + +typedef struct reason_socket_connected_t { + int fd; +} reason_socket_connected_t; + +typedef struct reason_ssdp_disconnected_t { + int fd; +} reason_ssdp_disconnected_t; + +typedef struct reason_webserver_connected_t { + int fd; +} reason_webserver_connected_t; + +typedef struct reason_socket_received_t { + int fd; + char *buffer; + char type[256]; + int endpoint; +} reason_socket_received_t; + +typedef struct reason_socket_send_t { + int fd; + char *buffer; + char type[256]; +} reason_socket_send_t; + +typedef struct reason_send_code_t { + int origin; + char message[1025]; + int rawlen; + int txrpt; + int pulses[MAXPULSESTREAMLENGTH+1]; + char protocol[256]; + int hwtype; + char uuid[UUID_LENGTH+1]; +} reason_send_code_t; + +typedef struct reason_config_update_t { + char origin[256]; + int type; + time_t timestamp; + int nrdev; + char devices[256][256]; + int nrval; + struct { + char name[256]; + union { + char string_[256]; + double number_; + }; + int decimals; + int type; + } values[256]; + char *uuid; +} reason_config_update_t; + +#define reason_config_updated_t reason_config_update_t + +typedef struct reason_control_device_t { + char *dev; + char *state; + struct JsonNode *values; +} reason_control_device_t; + +typedef struct reason_arp_device_t { + char mac[18]; + char ip[INET_ADDRSTRLEN]; +} reason_arp_device_t; + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/fcache.c b/lib/ESPiLight/pilight/libs/pilight/core/fcache.c new file mode 100644 index 0000000..36f9250 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/fcache.c @@ -0,0 +1,166 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include + +#include "fcache.h" +#include "common.h" +#include "mem.h" +#include "log.h" +#include "gc.h" + +int fcache_gc(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct fcache_t *tmp = fcache; + while(fcache) { + tmp = fcache; + FREE(tmp->name); + FREE(tmp->bytes); + fcache = fcache->next; + FREE(tmp); + } + if(fcache != NULL) { + FREE(fcache); + } + + logprintf(LOG_DEBUG, "garbage collected fcache library"); + return 1; +} + +void fcache_remove_node(struct fcache_t **cache, char *name) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct fcache_t *currP, *prevP; + + prevP = NULL; + + for(currP = *cache; currP != NULL; prevP = currP, currP = currP->next) { + + if(strcmp(currP->name, name) == 0) { + if(prevP == NULL) { + *cache = currP->next; + } else { + prevP->next = currP->next; + } + + FREE(currP->name); + FREE(currP->bytes); + FREE(currP); + + break; + } + } +} + +int fcache_rm(char *filename) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + fcache_remove_node(&fcache, filename); + logprintf(LOG_DEBUG, "removed %s from cache", filename); + return 1; +} + +int fcache_add(char *filename) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + size_t filesize = 0; + FILE *fp = NULL; + + logprintf(LOG_NOTICE, "caching %s", filename); + +/* + * dir stat doens't work on Windows if path has a trailing slash + */ +#ifdef _WIN32 + size_t i = strlen(filename); + if(filename[i-1] == '\\' || filename[i-1] == '/') { + filename[i-1] = '\0'; + } +#endif + + if((fp = fopen(filename, "rb")) == NULL) { + logprintf(LOG_NOTICE, "failed to open %s", filename); + return -1; + } else { + struct fcache_t *node = MALLOC(sizeof(struct fcache_t)); + if(node == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + fseek(fp, 0, SEEK_END); + filesize = (size_t)ftell(fp); + fseek(fp, 0, SEEK_SET); + if((node->bytes = MALLOC(filesize + 1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(node->bytes, '\0', filesize + 1); + if(fread(node->bytes, 1, filesize, fp) != filesize) { + logprintf(LOG_NOTICE, "error reading %s", filename); + FREE(node->bytes); + FREE(node); + fclose(fp); + return -1; + } + node->size = (int)filesize; + if((node->name = MALLOC(strlen(filename)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(node->name, filename); + node->next = fcache; + fcache = node; + fclose(fp); + return 0; + } + fclose(fp); + return -1; +} + +short fcache_get_size(char *filename, int *out) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct fcache_t *ftmp = fcache; + while(ftmp) { + if(strcmp(ftmp->name, filename) == 0) { + *out = ftmp->size; + return 0; + } + ftmp = ftmp->next; + } + return -1; +} + +unsigned char *fcache_get_bytes(char *filename) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct fcache_t *ftmp = fcache; + while(ftmp) { + if(strcmp(ftmp->name, filename) == 0) { + return ftmp->bytes; + } + ftmp = ftmp->next; + } + return NULL; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/fcache.h b/lib/ESPiLight/pilight/libs/pilight/core/fcache.h new file mode 100644 index 0000000..147d45c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/fcache.h @@ -0,0 +1,38 @@ +/* +Copyright 2013 CurlyMo + +This file is part of Splash - Linux GUI Framebuffer Splash. + +Splash is free software: you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the Free Software +Foundation, either version 3 of the License, or (at your option) any later +version. + +Splash is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +details. + +You should have received a copy of the GNU General Public License along +with Splash. If not, see +*/ + +#ifndef _FCACHE_H_ +#define _FCACHE_H_ + +typedef struct fcache_t { + char *name; + int size; + unsigned char *bytes; + struct fcache_t *next; +} fcaches_t; + +struct fcache_t *fcache; + +int fcache_gc(void); +int fcache_add(char *filename); +int fcache_rm(char *filename); +short fcache_get_size(char *filename, int *out); +unsigned char *fcache_get_bytes(char *filename); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/firmware.c b/lib/ESPiLight/pilight/libs/pilight/core/firmware.c new file mode 100644 index 0000000..77ef2c9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/firmware.c @@ -0,0 +1,1260 @@ +/* + * avrdude - A Downloader/Uploader for AVR device programmers + * Copyright (C) 2000-2005 Brian S. Dean + * Copyright 2007-2009 Joerg Wunsch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* $Id: main.c 916 2010-01-15 16:36:13Z joerg_wunsch $ */ + +/* + * Code to program an Atmel AVR device through one of the supported + * programmers. + * + * For parallel port connected programmers, the pin definitions can be + * changed via a config file. See the config file for instructions on + * how to add a programmer definition. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #define STRICT + #define WIN32_LEAN_AND_MEAN + #include +#else + #include +#endif + +#include "../../avrdude/avr.h" +#include "../../avrdude/arduino.h" +#ifndef _WIN32 + #include "../../avrdude/avrgpio.h" +#endif +#include "../../avrdude/fileio.h" +#include "../../avrdude/avrpart.h" +#include "../../avrdude/avrconfig.h" +#include "../../avrdude/avrupd.h" +#include "../../avrdude/safemode.h" +#include "../config/settings.h" +#include "firmware.h" +#include "pilight.h" +#include "common.h" +#include "log.h" + +/* + +pgm_bits: pgm_enable +read_bits: memory signature - read +chip_erase: chip_erase +writepage_bits: memory flash - writepage +... +*/ + +#ifdef _WIN32 + static int baudrate = 57600; +#else + static int baudrate = B57600; +#endif +static int mptype = FW_MP_UNKNOWN; +static char comport[255]; + +static void firmware_atmega328p(struct avrpart **p) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char pgm_bits[] = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 x x x x x x x x x x x x x x x x"; + char read_bits[] = "0 0 1 1 0 0 0 0 0 0 0 x x x x x x x x x x x a1 a0 o o o o o o o o"; + char erase_bits[] = "1 0 1 0 1 1 0 0 1 0 0 x x x x x x x x x x x x x x x x x x x x x"; + char writepage_bits[] = "0 1 0 0 1 1 0 0 0 0 a13 a12 a11 a10 a9 a8 a7 a6 x x x x x x x x x x x x x x"; + char readlo_bits[] = "0 0 1 0 0 0 0 0 0 0 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + char readhigh_bits[] = "0 0 1 0 1 0 0 0 0 0 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + char loadpagelo_bits[] = "0 1 0 0 0 0 0 0 0 0 0 x x x x x x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + char loadpagehigh_bits[] = "0 1 0 0 1 0 0 0 0 0 0 x x x x x x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + char lfuseread_bits[] = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 x x x x x x x x o o o o o o o o"; + char lfusewrite_bits[] = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 x x x x x x x x i i i i i i i i"; + char hfuseread_bits[] = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 x x x x x x x x o o o o o o o o"; + char hfusewrite_bits[] = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0 x x x x x x x x i i i i i i i i"; + + *p = avr_new_part(); + strcpy((*p)->id, "m328p"); + strcpy((*p)->desc, "ATmega328P"); + + (*p)->signature[0] = 0x1e; + (*p)->signature[1] = 0x95; + (*p)->signature[2] = 0x0f; + + (*p)->op[AVR_OP_PGM_ENABLE] = avr_new_opcode(); + parse_cmdbits((*p)->op[AVR_OP_PGM_ENABLE], pgm_bits); + + (*p)->op[AVR_OP_CHIP_ERASE] = avr_new_opcode(); + parse_cmdbits((*p)->op[AVR_OP_CHIP_ERASE], erase_bits); + + (*p)->sigmem = avr_new_memtype(); + strcpy((*p)->sigmem->desc, "signature"); + (*p)->sigmem->size = 3; + (*p)->sigmem->buf = MALLOC((size_t)(*p)->sigmem->size+(size_t)1); + (*p)->sigmem->op[AVR_OP_READ] = avr_new_opcode(); + parse_cmdbits((*p)->sigmem->op[AVR_OP_READ], read_bits); + + (*p)->flashmem = avr_new_memtype(); + strcpy((*p)->flashmem->desc, "flash"); + + (*p)->flashmem->paged = 1; + (*p)->flashmem->size = 32768; + (*p)->flashmem->page_size = 128; + (*p)->flashmem->num_pages = 256; + (*p)->flashmem->min_write_delay = 4500; + (*p)->flashmem->max_write_delay = 4500; + (*p)->flashmem->readback[0] = 0xff; + (*p)->flashmem->readback[1] = 0xff; + + (*p)->flashmem->op[AVR_OP_WRITEPAGE] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_WRITEPAGE], writepage_bits); + + (*p)->flashmem->op[AVR_OP_READ_LO] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_READ_LO], readlo_bits); + + (*p)->flashmem->op[AVR_OP_READ_HI] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_READ_HI], readhigh_bits); + + (*p)->flashmem->op[AVR_OP_LOADPAGE_LO] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_LOADPAGE_LO], loadpagelo_bits); + + (*p)->flashmem->op[AVR_OP_LOADPAGE_HI] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_LOADPAGE_HI], loadpagehigh_bits); + + (*p)->lfusemem = avr_new_memtype(); + strcpy((*p)->lfusemem->desc, "lfuse"); + + (*p)->lfusemem->size = 1; + (*p)->lfusemem->buf = MALLOC((size_t)(*p)->lfusemem->size+(size_t)1); + + (*p)->lfusemem->min_write_delay = 4500; + (*p)->lfusemem->max_write_delay = 4500; + + (*p)->lfusemem->op[AVR_OP_READ] = avr_new_opcode(); + parse_cmdbits((*p)->lfusemem->op[AVR_OP_READ], lfuseread_bits); + + (*p)->lfusemem->op[AVR_OP_WRITE] = avr_new_opcode(); + parse_cmdbits((*p)->lfusemem->op[AVR_OP_WRITE], lfusewrite_bits); + + (*p)->hfusemem = avr_new_memtype(); + strcpy((*p)->hfusemem->desc, "hfuse"); + + (*p)->hfusemem->size = 1; + (*p)->hfusemem->buf = MALLOC((size_t)(*p)->hfusemem->size+(size_t)1); + + (*p)->hfusemem->min_write_delay = 4500; + (*p)->hfusemem->max_write_delay = 4500; + + (*p)->hfusemem->op[AVR_OP_READ] = avr_new_opcode(); + parse_cmdbits((*p)->hfusemem->op[AVR_OP_READ], hfuseread_bits); + + (*p)->hfusemem->op[AVR_OP_WRITE] = avr_new_opcode(); + parse_cmdbits((*p)->hfusemem->op[AVR_OP_WRITE], hfusewrite_bits); +} + +// static void firmware_atmega32u4(struct avrpart **p) { + // logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + // char pgm_bits[] = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 x x x x x x x x x x x x x x x x"; + // char read_bits[] = "0 0 1 1 0 0 0 0 x x x x x x x x x x x x x x a1 a0 o o o o o o o o"; + // char erase_bits[] = "1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 x x x x x x x x x x x x x x x x"; + // char writepage_bits[] = "0 1 0 0 1 1 0 0 a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 x x x x x x x x x x x x x x"; + // char readlo_bits[] = "0 0 1 0 0 0 0 0 0 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + // char readhigh_bits[] = "0 0 1 0 1 0 0 0 0 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + // char loadpagelo_bits[] = "0 1 0 0 0 0 0 0 x x x x x x x x x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + // char loadpagehigh_bits[] = "0 1 0 0 1 0 0 0 0 0 0 x x x x x x x a5 a4 a3 a2 a1 a0 i i i i i i i i"; + // char lfuseread_bits[] = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 x x x x x x x x o o o o o o o o"; + // char lfusewrite_bits[] = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 x x x x x x x x i i i i i i i i"; + // char hfuseread_bits[] = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 x x x x x x x x o o o o o o o o"; + // char hfusewrite_bits[] = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0 x x x x x x x x i i i i i i i i"; + + // *p = avr_new_part(); + // strcpy((*p)->id, "m32u4"); + // strcpy((*p)->desc, "ATmega32U4"); + + // (*p)->signature[0] = 0x1e; + // (*p)->signature[1] = 0x95; + // (*p)->signature[2] = 0x87; + + // (*p)->op[AVR_OP_PGM_ENABLE] = avr_new_opcode(); + // parse_cmdbits((*p)->op[AVR_OP_PGM_ENABLE], pgm_bits); + + // (*p)->op[AVR_OP_CHIP_ERASE] = avr_new_opcode(); + // parse_cmdbits((*p)->op[AVR_OP_CHIP_ERASE], erase_bits); + + // (*p)->sigmem = avr_new_memtype(); + // strcpy((*p)->sigmem->desc, "signature"); + // (*p)->sigmem->size = 3; + // (*p)->sigmem->buf = MALLOC((size_t)(*p)->sigmem->size+(size_t)1); + // (*p)->sigmem->op[AVR_OP_READ] = avr_new_opcode(); + // parse_cmdbits((*p)->sigmem->op[AVR_OP_READ], read_bits); + + // (*p)->flashmem = avr_new_memtype(); + // strcpy((*p)->flashmem->desc, "flash"); + + // (*p)->flashmem->paged = 1; + // (*p)->flashmem->size = 32768; + // (*p)->flashmem->page_size = 128; + // (*p)->flashmem->num_pages = 256; + // (*p)->flashmem->min_write_delay = 4500; + // (*p)->flashmem->max_write_delay = 4500; + // (*p)->flashmem->readback[0] = 0x00; + // (*p)->flashmem->readback[1] = 0x00; + + // (*p)->flashmem->op[AVR_OP_WRITEPAGE] = avr_new_opcode(); + // parse_cmdbits((*p)->flashmem->op[AVR_OP_WRITEPAGE], writepage_bits); + + // (*p)->flashmem->op[AVR_OP_READ_LO] = avr_new_opcode(); + // parse_cmdbits((*p)->flashmem->op[AVR_OP_READ_LO], readlo_bits); + + // (*p)->flashmem->op[AVR_OP_READ_HI] = avr_new_opcode(); + // parse_cmdbits((*p)->flashmem->op[AVR_OP_READ_HI], readhigh_bits); + + // (*p)->flashmem->op[AVR_OP_LOADPAGE_LO] = avr_new_opcode(); + // parse_cmdbits((*p)->flashmem->op[AVR_OP_LOADPAGE_LO], loadpagelo_bits); + + // (*p)->flashmem->op[AVR_OP_LOADPAGE_HI] = avr_new_opcode(); + // parse_cmdbits((*p)->flashmem->op[AVR_OP_LOADPAGE_HI], loadpagehigh_bits); + + // (*p)->lfusemem = avr_new_memtype(); + // strcpy((*p)->lfusemem->desc, "lfuse"); + + // (*p)->lfusemem->size = 1; + // (*p)->lfusemem->buf = MALLOC((size_t)(*p)->lfusemem->size+(size_t)1); + + // (*p)->lfusemem->min_write_delay = 9000; + // (*p)->lfusemem->max_write_delay = 9000; + + // (*p)->lfusemem->op[AVR_OP_READ] = avr_new_opcode(); + // parse_cmdbits((*p)->lfusemem->op[AVR_OP_READ], lfuseread_bits); + + // (*p)->lfusemem->op[AVR_OP_WRITE] = avr_new_opcode(); + // parse_cmdbits((*p)->lfusemem->op[AVR_OP_WRITE], lfusewrite_bits); + + // (*p)->hfusemem = avr_new_memtype(); + // strcpy((*p)->hfusemem->desc, "hfuse"); + + // (*p)->hfusemem->size = 1; + // (*p)->hfusemem->buf = MALLOC((size_t)(*p)->hfusemem->size+(size_t)1); + + // (*p)->hfusemem->min_write_delay = 9000; + // (*p)->hfusemem->max_write_delay = 9000; + + // (*p)->hfusemem->op[AVR_OP_READ] = avr_new_opcode(); + // parse_cmdbits((*p)->hfusemem->op[AVR_OP_READ], hfuseread_bits); + + // (*p)->hfusemem->op[AVR_OP_WRITE] = avr_new_opcode(); + // parse_cmdbits((*p)->hfusemem->op[AVR_OP_WRITE], hfusewrite_bits); +// } + +static void firmware_attiny25(struct avrpart **p) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char pgm_bits[] = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 x x x x x x x x x x x x x x x x"; + char read_bits[] = "0 0 1 1 0 0 0 0 0 0 0 x x x x x x x x x x x a1 a0 o o o o o o o o"; + char erase_bits[] = "1 0 1 0 1 1 0 0 1 0 0 x x x x x x x x x x x x x x x x x x x x x"; + char writepage_bits[] = "0 1 0 0 1 1 0 0 0 0 0 0 0 0 a9 a8 a7 a6 a5 a4 x x x x x x x x x x x x"; + char readlo_bits[] = "0 0 1 0 0 0 0 0 0 0 0 0 0 0 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + char readhigh_bits[] = "0 0 1 0 1 0 0 0 0 0 0 0 0 0 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + char loadpagelo_bits[] = "0 1 0 0 0 0 0 0 0 0 0 x x x x x x x x x a3 a2 a1 a0 i i i i i i i i"; + char loadpagehigh_bits[] = "0 1 0 0 1 0 0 0 0 0 0 x x x x x x x x x a3 a2 a1 a0 i i i i i i i i"; + char lfuseread_bits[] = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 x x x x x x x x o o o o o o o o"; + char lfusewrite_bits[] = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 x x x x x x x x i i i i i i i i"; + char hfuseread_bits[] = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 x x x x x x x x o o o o o o o o"; + char hfusewrite_bits[] = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0 x x x x x x x x i i i i i i i i"; + + *p = avr_new_part(); + strcpy((*p)->id, "t25"); + strcpy((*p)->desc, "ATtiny25"); + + (*p)->signature[0] = 0x1e; + (*p)->signature[1] = 0x91; + (*p)->signature[2] = 0x08; + + (*p)->op[AVR_OP_PGM_ENABLE] = avr_new_opcode(); + parse_cmdbits((*p)->op[AVR_OP_PGM_ENABLE], pgm_bits); + + (*p)->op[AVR_OP_CHIP_ERASE] = avr_new_opcode(); + parse_cmdbits((*p)->op[AVR_OP_CHIP_ERASE], erase_bits); + + (*p)->sigmem = avr_new_memtype(); + strcpy((*p)->sigmem->desc, "signature"); + (*p)->sigmem->size = 3; + (*p)->sigmem->buf = MALLOC((size_t)(*p)->sigmem->size+(size_t)1); + (*p)->sigmem->op[AVR_OP_READ] = avr_new_opcode(); + parse_cmdbits((*p)->sigmem->op[AVR_OP_READ], read_bits); + + (*p)->flashmem = avr_new_memtype(); + strcpy((*p)->flashmem->desc, "flash"); + + (*p)->flashmem->paged = 1; + (*p)->flashmem->size = 2048; + (*p)->flashmem->page_size = 32; + (*p)->flashmem->num_pages = 64; + (*p)->flashmem->min_write_delay = 4500; + (*p)->flashmem->max_write_delay = 4500; + (*p)->flashmem->readback[0] = 0xff; + (*p)->flashmem->readback[1] = 0xff; + + (*p)->flashmem->op[AVR_OP_WRITEPAGE] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_WRITEPAGE], writepage_bits); + + (*p)->flashmem->op[AVR_OP_READ_LO] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_READ_LO], readlo_bits); + + (*p)->flashmem->op[AVR_OP_READ_HI] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_READ_HI], readhigh_bits); + + (*p)->flashmem->op[AVR_OP_LOADPAGE_LO] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_LOADPAGE_LO], loadpagelo_bits); + + (*p)->flashmem->op[AVR_OP_LOADPAGE_HI] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_LOADPAGE_HI], loadpagehigh_bits); + + (*p)->lfusemem = avr_new_memtype(); + strcpy((*p)->lfusemem->desc, "lfuse"); + + (*p)->lfusemem->size = 1; + (*p)->lfusemem->buf = MALLOC((size_t)(*p)->lfusemem->size+(size_t)1); + + (*p)->lfusemem->min_write_delay = 9000; + (*p)->lfusemem->max_write_delay = 9000; + + (*p)->lfusemem->op[AVR_OP_READ] = avr_new_opcode(); + parse_cmdbits((*p)->lfusemem->op[AVR_OP_READ], lfuseread_bits); + + (*p)->lfusemem->op[AVR_OP_WRITE] = avr_new_opcode(); + parse_cmdbits((*p)->lfusemem->op[AVR_OP_WRITE], lfusewrite_bits); + + (*p)->hfusemem = avr_new_memtype(); + strcpy((*p)->hfusemem->desc, "hfuse"); + + (*p)->hfusemem->size = 1; + (*p)->hfusemem->buf = MALLOC((size_t)(*p)->hfusemem->size+(size_t)1); + + (*p)->hfusemem->min_write_delay = 9000; + (*p)->hfusemem->max_write_delay = 9000; + + (*p)->hfusemem->op[AVR_OP_READ] = avr_new_opcode(); + parse_cmdbits((*p)->hfusemem->op[AVR_OP_READ], hfuseread_bits); + + (*p)->hfusemem->op[AVR_OP_WRITE] = avr_new_opcode(); + parse_cmdbits((*p)->hfusemem->op[AVR_OP_WRITE], hfusewrite_bits); +} + +static void firmware_attiny45(struct avrpart **p) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char pgm_bits[] = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 x x x x x x x x x x x x x x x x"; + char read_bits[] = "0 0 1 1 0 0 0 0 0 0 0 x x x x x x x x x x x a1 a0 o o o o o o o o"; + char erase_bits[] = "1 0 1 0 1 1 0 0 1 0 0 x x x x x x x x x x x x x x x x x x x x x"; + char writepage_bits[] = "0 1 0 0 1 1 0 0 0 0 0 0 0 a10 a9 a8 a7 a6 a5 x x x x x x x x x x x x x"; + char readlo_bits[] = "0 0 1 0 0 0 0 0 0 0 0 0 0 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + char readhigh_bits[] = "0 0 1 0 1 0 0 0 0 0 0 0 0 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + char loadpagelo_bits[] = "0 1 0 0 0 0 0 0 0 0 0 x x x x x x x x a4 a3 a2 a1 a0 i i i i i i i i"; + char loadpagehigh_bits[] = "0 1 0 0 1 0 0 0 0 0 0 x x x x x x x x a4 a3 a2 a1 a0 i i i i i i i i"; + char lfuseread_bits[] = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 x x x x x x x x o o o o o o o o"; + char lfusewrite_bits[] = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 x x x x x x x x i i i i i i i i"; + char hfuseread_bits[] = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 x x x x x x x x o o o o o o o o"; + char hfusewrite_bits[] = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0 x x x x x x x x i i i i i i i i"; + + *p = avr_new_part(); + strcpy((*p)->id, "t45"); + strcpy((*p)->desc, "ATtiny45"); + + (*p)->signature[0] = 0x1e; + (*p)->signature[1] = 0x92; + (*p)->signature[2] = 0x06; + + (*p)->op[AVR_OP_PGM_ENABLE] = avr_new_opcode(); + parse_cmdbits((*p)->op[AVR_OP_PGM_ENABLE], pgm_bits); + + (*p)->op[AVR_OP_CHIP_ERASE] = avr_new_opcode(); + parse_cmdbits((*p)->op[AVR_OP_CHIP_ERASE], erase_bits); + + (*p)->sigmem = avr_new_memtype(); + strcpy((*p)->sigmem->desc, "signature"); + (*p)->sigmem->size = 3; + (*p)->sigmem->buf = MALLOC((size_t)(*p)->sigmem->size+(size_t)1); + (*p)->sigmem->op[AVR_OP_READ] = avr_new_opcode(); + parse_cmdbits((*p)->sigmem->op[AVR_OP_READ], read_bits); + + (*p)->flashmem = avr_new_memtype(); + strcpy((*p)->flashmem->desc, "flash"); + + (*p)->flashmem->paged = 1; + (*p)->flashmem->size = 4096; + (*p)->flashmem->page_size = 64; + (*p)->flashmem->num_pages = 64; + (*p)->flashmem->min_write_delay = 4500; + (*p)->flashmem->max_write_delay = 4500; + (*p)->flashmem->readback[0] = 0xff; + (*p)->flashmem->readback[1] = 0xff; + + (*p)->flashmem->op[AVR_OP_WRITEPAGE] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_WRITEPAGE], writepage_bits); + + (*p)->flashmem->op[AVR_OP_READ_LO] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_READ_LO], readlo_bits); + + (*p)->flashmem->op[AVR_OP_READ_HI] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_READ_HI], readhigh_bits); + + (*p)->flashmem->op[AVR_OP_LOADPAGE_LO] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_LOADPAGE_LO], loadpagelo_bits); + + (*p)->flashmem->op[AVR_OP_LOADPAGE_HI] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_LOADPAGE_HI], loadpagehigh_bits); + + (*p)->lfusemem = avr_new_memtype(); + strcpy((*p)->lfusemem->desc, "lfuse"); + + (*p)->lfusemem->size = 1; + (*p)->lfusemem->buf = MALLOC((size_t)(*p)->lfusemem->size+(size_t)1); + + (*p)->lfusemem->min_write_delay = 9000; + (*p)->lfusemem->max_write_delay = 9000; + + (*p)->lfusemem->op[AVR_OP_READ] = avr_new_opcode(); + parse_cmdbits((*p)->lfusemem->op[AVR_OP_READ], lfuseread_bits); + + (*p)->lfusemem->op[AVR_OP_WRITE] = avr_new_opcode(); + parse_cmdbits((*p)->lfusemem->op[AVR_OP_WRITE], lfusewrite_bits); + + (*p)->hfusemem = avr_new_memtype(); + strcpy((*p)->hfusemem->desc, "hfuse"); + + (*p)->hfusemem->size = 1; + (*p)->hfusemem->buf = MALLOC((size_t)(*p)->hfusemem->size+(size_t)1); + + (*p)->hfusemem->min_write_delay = 9000; + (*p)->hfusemem->max_write_delay = 9000; + + (*p)->hfusemem->op[AVR_OP_READ] = avr_new_opcode(); + parse_cmdbits((*p)->hfusemem->op[AVR_OP_READ], hfuseread_bits); + + (*p)->hfusemem->op[AVR_OP_WRITE] = avr_new_opcode(); + parse_cmdbits((*p)->hfusemem->op[AVR_OP_WRITE], hfusewrite_bits); +} + +static void firmware_attiny85(struct avrpart **p) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char pgm_bits[] = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 x x x x x x x x x x x x x x x x"; + char read_bits[] = "0 0 1 1 0 0 0 0 0 0 0 x x x x x x x x x x x a1 a0 o o o o o o o o"; + char erase_bits[] = "1 0 1 0 1 1 0 0 1 0 0 x x x x x x x x x x x x x x x x x x x x x"; + char writepage_bits[] = "0 1 0 0 1 1 0 0 0 0 0 0 a11 a10 a9 a8 a7 a6 a5 x x x x x x x x x x x x x"; + char readlo_bits[] = "0 0 1 0 0 0 0 0 0 0 0 0 0 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + char readhigh_bits[] = "0 0 1 0 1 0 0 0 0 0 0 0 0 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0 o o o o o o o o"; + char loadpagelo_bits[] = "0 1 0 0 0 0 0 0 0 0 0 x x x x x x x x a4 a3 a2 a1 a0 i i i i i i i i"; + char loadpagehigh_bits[] = "0 1 0 0 1 0 0 0 0 0 0 x x x x x x x x a4 a3 a2 a1 a0 i i i i i i i i"; + char lfuseread_bits[] = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 x x x x x x x x o o o o o o o o"; + char lfusewrite_bits[] = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 x x x x x x x x i i i i i i i i"; + char hfuseread_bits[] = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 x x x x x x x x o o o o o o o o"; + char hfusewrite_bits[] = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0 x x x x x x x x i i i i i i i i"; + + *p = avr_new_part(); + strcpy((*p)->id, "t85"); + strcpy((*p)->desc, "ATtiny85"); + + (*p)->signature[0] = 0x1e; + (*p)->signature[1] = 0x93; + (*p)->signature[2] = 0x0b; + + (*p)->op[AVR_OP_PGM_ENABLE] = avr_new_opcode(); + parse_cmdbits((*p)->op[AVR_OP_PGM_ENABLE], pgm_bits); + + (*p)->op[AVR_OP_CHIP_ERASE] = avr_new_opcode(); + parse_cmdbits((*p)->op[AVR_OP_CHIP_ERASE], erase_bits); + + (*p)->sigmem = avr_new_memtype(); + strcpy((*p)->sigmem->desc, "signature"); + (*p)->sigmem->size = 3; + (*p)->sigmem->buf = MALLOC((size_t)(*p)->sigmem->size+(size_t)1); + (*p)->sigmem->op[AVR_OP_READ] = avr_new_opcode(); + parse_cmdbits((*p)->sigmem->op[AVR_OP_READ], read_bits); + + (*p)->flashmem = avr_new_memtype(); + strcpy((*p)->flashmem->desc, "flash"); + + (*p)->flashmem->paged = 1; + (*p)->flashmem->size = 8192; + (*p)->flashmem->page_size = 64; + (*p)->flashmem->num_pages = 128; + (*p)->flashmem->min_write_delay = 4500; + (*p)->flashmem->max_write_delay = 4500; + (*p)->flashmem->readback[0] = 0xff; + (*p)->flashmem->readback[1] = 0xff; + + (*p)->flashmem->op[AVR_OP_WRITEPAGE] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_WRITEPAGE], writepage_bits); + + (*p)->flashmem->op[AVR_OP_READ_LO] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_READ_LO], readlo_bits); + + (*p)->flashmem->op[AVR_OP_READ_HI] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_READ_HI], readhigh_bits); + + (*p)->flashmem->op[AVR_OP_LOADPAGE_LO] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_LOADPAGE_LO], loadpagelo_bits); + + (*p)->flashmem->op[AVR_OP_LOADPAGE_HI] = avr_new_opcode(); + parse_cmdbits((*p)->flashmem->op[AVR_OP_LOADPAGE_HI], loadpagehigh_bits); + + (*p)->lfusemem = avr_new_memtype(); + strcpy((*p)->lfusemem->desc, "lfuse"); + + (*p)->lfusemem->size = 1; + (*p)->lfusemem->buf = MALLOC((size_t)(*p)->lfusemem->size+(size_t)1); + + (*p)->lfusemem->min_write_delay = 9000; + (*p)->lfusemem->max_write_delay = 9000; + + (*p)->lfusemem->op[AVR_OP_READ] = avr_new_opcode(); + parse_cmdbits((*p)->lfusemem->op[AVR_OP_READ], lfuseread_bits); + + (*p)->lfusemem->op[AVR_OP_WRITE] = avr_new_opcode(); + parse_cmdbits((*p)->lfusemem->op[AVR_OP_WRITE], lfusewrite_bits); + + (*p)->hfusemem = avr_new_memtype(); + strcpy((*p)->hfusemem->desc, "hfuse"); + + (*p)->hfusemem->size = 1; + (*p)->hfusemem->buf = MALLOC((size_t)(*p)->hfusemem->size+(size_t)1); + + (*p)->hfusemem->min_write_delay = 9000; + (*p)->hfusemem->max_write_delay = 9000; + + (*p)->hfusemem->op[AVR_OP_READ] = avr_new_opcode(); + parse_cmdbits((*p)->hfusemem->op[AVR_OP_READ], hfuseread_bits); + + (*p)->hfusemem->op[AVR_OP_WRITE] = avr_new_opcode(); + parse_cmdbits((*p)->hfusemem->op[AVR_OP_WRITE], hfusewrite_bits); +} + +static void firmware_init_pgm(PROGRAMMER **pgm) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + *pgm = pgm_new(); +#ifndef _WIN32 + if(strlen(comport) == 0) { + gpio_initpgm(*pgm); + (*pgm)->pinno[3] = FIRMWARE_GPIO_RESET; + (*pgm)->pinno[4] = FIRMWARE_GPIO_SCK; + (*pgm)->pinno[5] = FIRMWARE_GPIO_MOSI; + (*pgm)->pinno[6] = FIRMWARE_GPIO_MISO; + // (*pgm)->ispdelay = 50; + + settings_find_number("firmware-gpio-reset", (int *)&(*pgm)->pinno[3]); + settings_find_number("firmware-gpio-sck", (int *)&(*pgm)->pinno[4]); + settings_find_number("firmware-gpio-mosi", (int *)&(*pgm)->pinno[5]); + settings_find_number("firmware-gpio-miso", (int *)&(*pgm)->pinno[6]); + } else { +#endif + arduino_initpgm(*pgm); +#ifdef _WIN32 + (*pgm)->baudrate = baudrate; +#else + (*pgm)->baudrate = baudrate; + } +#endif + if((*pgm)->setup) { + (*pgm)->setup(*pgm); + } +} + +static void firmware_process(int percent, double etime, char *hdr) { + static char hashes[51]; + static char *header; + static int last = 0; + int i = 0; + hashes[50] = 0; + memset (hashes, ' ', 50); + for(i=0; iopen(pgm, comport) < 0) { + exitrc = FW_PROG_OP_FAIL; + pgm->ppidata = 0; /* clear all bits at exit */ + goto main_exit; + } + + exitrc = 0; + + /* + * enable the programmer + */ + pgm->enable(pgm); + + /* + * initialize the chip in preperation for accepting commands + */ + init_ok = (pgm->initialize(pgm, *p) >= 0); + + if(!init_ok) { + exitrc = FW_INIT_FAIL; + goto main_exit; + } + + logprintf(LOG_INFO, "AVR device initialized and ready to accept instructions"); + + /* + * Let's read the signature bytes to make sure there is at least a + * chip on the other end that is responding correctly. A check + * against 0xffffff / 0x000000 should ensure that the signature bytes + * are valid. + */ + int attempt = 0; + int waittime = 10000; /* 10 ms */ + +sig_again: + usleep(waittime); + if(init_ok) { + if(avr_signature(pgm, *p) != 0) { + exitrc = FW_RD_SIG_FAIL; + goto main_exit; + } + } + + sig = (*p)->sigmem; + + if(sig != NULL) { + int ff = 1, zz = 1; + + for(i=0; isize; i++) { + if(sig->buf[i] != 0xff) + ff = 0; + if(sig->buf[i] != 0x00) + zz = 0; + } + + if(ff == 1 || zz == 1) { + if(++attempt < 3) { + waittime *= 5; + goto sig_again; + } + exitrc = FW_INV_SIG_FAIL; + goto main_exit; + } + } + + logprintf(LOG_INFO, "AVR device signature = 0x%02x 0x%02x 0x%02x", sig->buf[0], sig->buf[1], sig->buf[2]); + + if(sig->size != 3 || + sig->buf[0] != (*p)->signature[0] || + sig->buf[1] != (*p)->signature[1] || + sig->buf[2] != (*p)->signature[2]) { + exitrc = FW_MATCH_SIG_FAIL; + goto main_exit; + } + +main_exit: + pgm->close(pgm); + + FREE(pgm); + + for(i=0;iop[i] != NULL) { + FREE((*p)->op[i]); + } + } + + for(i=0;isigmem->op[i] != NULL) { + FREE((*p)->sigmem->op[i]); + } + } + if((*p)->sigmem->buf != NULL) { + FREE((*p)->sigmem->buf); + } + FREE((*p)->sigmem); + + for(i=0;iflashmem->op[i] != NULL) { + FREE((*p)->flashmem->op[i]); + } + } + if((*p)->flashmem->buf != NULL) { + FREE((*p)->flashmem->buf); + } + + FREE((*p)->flashmem); + + for(i=0;ihfusemem->op[i] != NULL) { + FREE((*p)->hfusemem->op[i]); + } + } + if((*p)->hfusemem->buf != NULL) { + FREE((*p)->hfusemem->buf); + } + FREE((*p)->hfusemem); + + for(i=0;ilfusemem->op[i] != NULL) { + FREE((*p)->lfusemem->op[i]); + } + } + if((*p)->lfusemem->buf != NULL) { + FREE((*p)->lfusemem->buf); + } + FREE((*p)->lfusemem); + + FREE(*p); + + return exitrc; +} + +static int firmware_write(char *filename, struct avrpart **p) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + int exitrc = 0, i = 0, erase = 1, nowrite = 0, verify = 1; + int safemode = 1, init_ok = 0; + unsigned char safemode_lfuse = 0xff, safemode_hfuse = 0xff; + unsigned char safemode_efuse = 0xff, safemode_fuse = 0xff; + int fuses_specified = 0, fuses_AVRUPDd = 0; + struct avrpart *v = NULL; + AVRMEM *sig = NULL; + AVRUPD *wfile = NULL; + AVRUPD *vfile = NULL; + AVRUPD *wlfuse = NULL; + AVRUPD *vlfuse = NULL; + AVRUPD *whfuse = NULL; + AVRUPD *vhfuse = NULL; + PROGRAMMER *pgm = NULL; + char lfuse[] = "lfuse:w:0xe1:m"; + char hfuse[] = "lfuse:w:0xe1:m"; + + avr_set_update_progress(firmware_process); + + wfile = parse_op(filename); + if(verify && wfile->op == DEVICE_WRITE) { + vfile = dup_AVRUPD(wfile); + vfile->op = DEVICE_VERIFY; + } + + if(mptype != FW_MP_ATMEL328P && mptype != FW_MP_UNKNOWN) { + wlfuse = parse_op(lfuse); + if(verify && wlfuse->op == DEVICE_WRITE) { + vlfuse = dup_AVRUPD(wlfuse); + vlfuse->op = DEVICE_VERIFY; + } + + whfuse = parse_op(hfuse); + if(verify && whfuse->op == DEVICE_WRITE) { + vhfuse = dup_AVRUPD(whfuse); + vhfuse->op = DEVICE_VERIFY; + } + } + + firmware_init_pgm(&pgm); + + /* + * set up seperate instances of the avr part, one for use in + * programming, one for use in verifying. These are separate + * because they need separate flash and eeprom buffer space + */ + v = avr_dup_part(*p); + + if(pgm->open(pgm, comport) < 0) { + exitrc = FW_INIT_FAIL; + pgm->ppidata = 0; /* clear all bits at exit */ + goto main_exit; + } + + exitrc = 0; + + /* + * enable the programmer + */ + pgm->enable(pgm); + + /* + * initialize the chip in preperation for accepting commands + */ + init_ok = (pgm->initialize(pgm, *p) >= 0); + + if(!init_ok) { + exitrc = FW_INIT_FAIL; + goto main_exit; + } + + logprintf(LOG_INFO, "AVR device initialized and ready to accept instructions"); + + /* + * Let's read the signature bytes to make sure there is at least a + * chip on the other end that is responding correctly. A check + * against 0xffffff / 0x000000 should ensure that the signature bytes + * are valid. + */ + if(init_ok) { + if(avr_signature(pgm, *p) != 0) { + exitrc = FW_RD_SIG_FAIL; + goto main_exit; + } + } + + sig = (*p)->sigmem; + + if(sig != NULL) { + int ff = 1, zz = 1; + + for(i=0; isize; i++) { + if(sig->buf[i] != 0xff) + ff = 0; + if(sig->buf[i] != 0x00) + zz = 0; + } + + if(ff == 1 || zz == 1) { + exitrc = FW_INV_SIG_FAIL; + goto main_exit; + } + } + + logprintf(LOG_INFO, "AVR device signature = 0x%02x 0x%02x 0x%02x", sig->buf[0], sig->buf[1], sig->buf[2]); + + if(sig->size != 3 || + sig->buf[0] != (*p)->signature[0] || + sig->buf[1] != (*p)->signature[1] || + sig->buf[2] != (*p)->signature[2]) { + exitrc = FW_MATCH_SIG_FAIL; + goto main_exit; + } + + if(init_ok && safemode == 1) { + /* If safemode is enabled, go ahead and read the current low, high, + and extended fuse bytes as needed */ + int rc = safemode_readfuses(&safemode_lfuse, &safemode_hfuse, + &safemode_efuse, &safemode_fuse, pgm, *p); + + if(rc != 0) { + if(rc == -5) { + logprintf(LOG_ERR, "AVR fuse reading not support by programmer. Safemode disabled."); + safemode = 0; + } else { + logprintf(LOG_ERR, "To protect your AVR the programming will be aborted"); + exitrc = 1; + goto main_exit; + } + } else { + safemode_memfuses(1, &safemode_lfuse, &safemode_hfuse, &safemode_efuse, &safemode_fuse); + } + } + + logprintf(LOG_INFO, "AVR FLASH memory has been specified, an erase cycle will be performed"); + + if(init_ok && erase) { + logprintf(LOG_INFO, "AVR chip being erased"); + + if(avr_chip_erase(pgm, *p)) { + exitrc = FW_ERASE_FAIL; + goto main_exit; + } + } + + /* Write high and low fuses to microprocessor + First low and then high */ + if(mptype != FW_MP_ATMEL328P && mptype != FW_MP_UNKNOWN) { + if(do_op(pgm, v, wlfuse, nowrite, verify)) { + exitrc = FW_WRITE_FAIL; + goto main_exit; + } + if(do_op(pgm, v, vlfuse, nowrite, verify)) { + exitrc = FW_VERIFY_FAIL; + goto main_exit; + } + + if(do_op(pgm, v, whfuse, nowrite, verify)) { + exitrc = FW_WRITE_FAIL; + goto main_exit; + } + if(do_op(pgm, v, vhfuse, nowrite, verify)) { + exitrc = FW_VERIFY_FAIL; + goto main_exit; + } + } + + /* Write hex file to microprocessor */ + if(do_op(pgm, v, wfile, nowrite, verify)) { + exitrc = FW_WRITE_FAIL; + goto main_exit; + } + if(do_op(pgm, v, vfile, nowrite, verify)) { + exitrc = FW_VERIFY_FAIL; + goto main_exit; + } + + /* Right before we exit programming mode, which will make the fuse + bits active, check to make sure they are still correct */ + if(safemode == 1) { + /* If safemode is enabled, go ahead and read the current low, + * high, and extended fuse bytes as needed */ + unsigned char safemodeafter_lfuse = 0xff; + unsigned char safemodeafter_hfuse = 0xff; + unsigned char safemodeafter_efuse = 0xff; + unsigned char safemodeafter_fuse = 0xff; + unsigned char failures = 0; + + //Restore the default fuse values + safemode_memfuses(0, &safemode_lfuse, &safemode_hfuse, &safemode_efuse, &safemode_fuse); + + /* Try reading back fuses, make sure they are reliable to read back */ + if(safemode_readfuses(&safemodeafter_lfuse, &safemodeafter_hfuse, + &safemodeafter_efuse, &safemodeafter_fuse, pgm, *p) != 0) { + /* Uh-oh.. try once more to read back fuses */ + if(safemode_readfuses(&safemodeafter_lfuse, &safemodeafter_hfuse, + &safemodeafter_efuse, &safemodeafter_fuse, pgm, *p) != 0) { + logprintf(LOG_ERR, "Sorry, reading back AVR fuses was unreliable. Giving Up."); + exitrc = FW_RD_FUSE_FAIL; + goto main_exit; + } + } + + /* Now check what fuses are against what they should be */ + if(safemodeafter_fuse != safemode_fuse) { + fuses_AVRUPDd = 1; + logprintf(LOG_ERR, "AVR fuse changed! Was %x, and is now %x", safemode_fuse, safemodeafter_fuse); + + /* Ask user - should we change them */ + /* Enough chit-chat, time to program some fuses and check them */ + if(safemode_writefuse(safemode_fuse, "fuse", pgm, *p, 10) == 0) { + logprintf(LOG_ERR, "AVR fuse is now rescued"); + } else { + logprintf(LOG_ERR, "AVR fuse could NOT be changed"); + failures++; + } + } + + /* Now check what fuses are against what they should be */ + if(safemodeafter_lfuse != safemode_lfuse) { + fuses_AVRUPDd = 1; + logprintf(LOG_ERR, "AVR lfuse changed! Was %x, and is now %x", safemode_lfuse, safemodeafter_lfuse); + + /* Ask user - should we change them */ + /* Enough chit-chat, time to program some fuses and check them */ + if(safemode_writefuse(safemode_lfuse, "lfuse", pgm, *p, 10) == 0) { + logprintf(LOG_ERR, "AVR lfuse is now rescued"); + } else { + logprintf(LOG_ERR, "AVR lfuse could NOT be changed"); + failures++; + } + } + + /* Now check what fuses are against what they should be */ + if(safemodeafter_hfuse != safemode_hfuse) { + fuses_AVRUPDd = 1; + logprintf(LOG_ERR, "AVR hfuse changed! Was %x, and is now %x", safemode_hfuse, safemodeafter_hfuse); + + /* Ask user - should we change them */ + /* Enough chit-chat, time to program some fuses and check them */ + if(safemode_writefuse(safemode_hfuse, "hfuse", pgm, *p, 10) == 0) { + logprintf(LOG_ERR, "AVR hfuse is now rescued"); + } else { + logprintf(LOG_ERR, "AVR hfuse could NOT be changed"); + failures++; + } + } + + /* Now check what fuses are against what they should be */ + if(safemodeafter_efuse != safemode_efuse) { + fuses_AVRUPDd = 1; + logprintf(LOG_ERR, "AVR efuse changed! Was %x, and is now %x", safemode_efuse, safemodeafter_efuse); + + /* Ask user - should we change them */ + /* Enough chit-chat, time to program some fuses and check them */ + if(safemode_writefuse(safemode_efuse, "efuse", pgm, *p, 10) == 0) { + logprintf(LOG_ERR, "AVR efuse is now rescued"); + } else { + logprintf(LOG_ERR, "AVR efuse could NOT be changed"); + failures++; + } + } + + if(failures == 0) { + logprintf(LOG_INFO, "AVR fuses OK"); + } else { + logprintf(LOG_INFO, "AVR fuses not recovered"); + } + + if(fuses_AVRUPDd && fuses_specified) { + exitrc = 1; + } + } + +main_exit: + pgm->close(pgm); + + FREE(pgm); + + FREE(wfile->memtype); + FREE(wfile->filename); + FREE(wfile); + + if(vfile != NULL) { + FREE(vfile->memtype); + FREE(vfile->filename); + FREE(vfile); + } + + if(mptype != FW_MP_ATMEL328P && mptype != FW_MP_UNKNOWN) { + FREE(whfuse->memtype); + FREE(whfuse->filename); + FREE(whfuse); + + if(vhfuse != NULL) { + FREE(vhfuse->memtype); + FREE(vhfuse->filename); + FREE(vhfuse); + } + + FREE(wlfuse->memtype); + FREE(wlfuse->filename); + FREE(wlfuse); + + if(vlfuse != NULL) { + FREE(vlfuse->memtype); + FREE(vlfuse->filename); + FREE(vlfuse); + } + } + + for(i=0;iop[i] != NULL) { + FREE((*p)->op[i]); + } + } + + for(i=0;isigmem->op[i] != NULL) { + FREE((*p)->sigmem->op[i]); + } + } + if((*p)->sigmem->buf != NULL) { + FREE((*p)->sigmem->buf); + } + FREE((*p)->sigmem); + + for(i=0;iflashmem->op[i] != NULL) { + FREE((*p)->flashmem->op[i]); + } + } + if((*p)->flashmem->buf != NULL) { + FREE((*p)->flashmem->buf); + } + FREE((*p)->flashmem); + + for(i=0;ihfusemem->op[i] != NULL) { + FREE((*p)->hfusemem->op[i]); + } + } + if((*p)->hfusemem->buf != NULL) { + FREE((*p)->hfusemem->buf); + } + FREE((*p)->hfusemem); + + for(i=0;ilfusemem->op[i] != NULL) { + FREE((*p)->lfusemem->op[i]); + } + } + if((*p)->lfusemem->buf != NULL) { + FREE((*p)->lfusemem->buf); + } + FREE((*p)->lfusemem); + + FREE(v->flashmem->buf); + FREE(v->flashmem); + FREE(v->sigmem->buf); + FREE(v->sigmem); + FREE(v->lfusemem->buf); + FREE(v->lfusemem); + FREE(v->hfusemem->buf); + FREE(v->hfusemem); + + FREE(*p); + FREE(v); + + logprintf(LOG_INFO, "Finished updating firmware"); + + return exitrc; +} + +int firmware_getmp(char *port) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(port != NULL) { + strncpy(comport, port, 255); + } else { + memset(comport, '\0', 255); + } + + struct avrpart *p = NULL; + unsigned int match = 0; + + logprintf(LOG_INFO, "Indentifying microprocessor"); + /* + mptype = FW_MP_ATMEL32U4; + firmware_atmega32u4(&p); + if(!match && firmware_identifymp(&p) != 0) { + logprintf(LOG_INFO, "Not an ATMega32u4"); + mptype = FW_MP_ATMEL328P; + firmware_atmega328p(&p); + match = 0; + } else { + return mptype; + }*/ + mptype = FW_MP_ATMEL328P; + baudrate = 115200; + firmware_atmega328p(&p); + logprintf(LOG_INFO, "Checking for an ATMega328P @%d", baudrate); + if(!match && firmware_identifymp(&p) != 0) { + logprintf(LOG_INFO, "Not an ATMega328P"); + mptype = FW_MP_ATMEL328P; + match = 0; + firmware_atmega328p(&p); + } else { + return mptype; + } + baudrate = 57600; + logprintf(LOG_INFO, "Checking for an ATMega328P @%d", baudrate); + if(!match && firmware_identifymp(&p) != 0) { + logprintf(LOG_INFO, "Not an ATMega328P"); + mptype = FW_MP_ATTINY25; + match = 0; + firmware_attiny25(&p); + } else { + return mptype; + } + logprintf(LOG_INFO, "Checking for an ATTiny25 @%d", baudrate); + if(!match && firmware_identifymp(&p) != 0) { + logprintf(LOG_INFO, "Not an ATTiny45"); + mptype = FW_MP_ATTINY45; + match = 0; + firmware_attiny45(&p); + } else { + return mptype; + } + logprintf(LOG_INFO, "Checking for an ATTiny45 @%d", baudrate); + if(!match && firmware_identifymp(&p) != 0) { + logprintf(LOG_INFO, "Not an ATTiny85"); + mptype = FW_MP_ATTINY85; + match = 0; + firmware_attiny85(&p); + } else { + return mptype; + } + logprintf(LOG_INFO, "Checking for an ATTiny85 @%d", baudrate); + if(!match && firmware_identifymp(&p) != 0) { + mptype = FW_MP_UNKNOWN; + logprintf(LOG_ERR, "AVR unknown"); + return -1; + } else { + return mptype; + } + return -1; +} + +int firmware_update(char *fwfile, char *port) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(port != NULL) { + strncpy(comport, port, 255); + } else { + memset(comport, '\0', 255); + } + + struct avrpart *p = NULL; + if(fmt_autodetect(fwfile) != FMT_IHEX) { + logprintf(LOG_ERR, "Trying to write an invalid firmware file"); + return -1; + } else { + switch(mptype) { + case FW_MP_ATMEL328P: + logprintf(LOG_INFO, "Firmware running on an ATmega328P"); + firmware_atmega328p(&p); + break; + case FW_MP_ATTINY25: + logprintf(LOG_INFO, "Firmware running on an ATTiny25"); + firmware_attiny25(&p); + break; + case FW_MP_ATTINY45: + logprintf(LOG_INFO, "Firmware running on an ATTiny45"); + firmware_attiny45(&p); + break; + case FW_MP_ATTINY85: + logprintf(LOG_INFO, "Firmware running on an ATTiny85"); + firmware_attiny85(&p); + break; + default: + logprintf(LOG_INFO, "First run firmware_getmp"); + return -1; + break; + } + + int ret = firmware_write(fwfile, &p); + mptype = FW_MP_UNKNOWN; + return ret; + } +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/firmware.h b/lib/ESPiLight/pilight/libs/pilight/core/firmware.h new file mode 100644 index 0000000..d19e744 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/firmware.h @@ -0,0 +1,54 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _FIRMWARE_H_ +#define _FIRMWARE_H_ + +typedef struct firmware_t { + double lpf; + double hpf; + double version; +} firmware_t; +struct firmware_t firmware; + +typedef enum { + FW_PROG_OP_FAIL = 1, + FW_INIT_FAIL, + FW_RD_SIG_FAIL, + FW_INV_SIG_FAIL, + FW_MATCH_SIG_FAIL, + FW_ERASE_FAIL, + FW_WRITE_FAIL, + FW_VERIFY_FAIL, + FW_RD_FUSE_FAIL, + FW_INV_FUSE_FAIL +} exitrc_t; + +typedef enum { + FW_MP_UNKNOWN, + FW_MP_ATTINY25, + FW_MP_ATTINY45, + FW_MP_ATTINY85, + FW_MP_ATMEL328P, + FW_MP_ATMEL32U4 +} mptype_t; + +int firmware_update(char *fwfile, char *comport); +int firmware_getmp(char *comport); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/gc.c b/lib/ESPiLight/pilight/libs/pilight/core/gc.c new file mode 100644 index 0000000..1a6bfde --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/gc.c @@ -0,0 +1,178 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #include +#else + #include + #define UNW_LOCAL_ONLY + #ifndef __mips__ + #include + #endif +#endif +#include + +#include "pilight.h" +#include "gc.h" +#include "json.h" +#include "log.h" +#include "mem.h" +#include "common.h" +#include "config.h" + +static unsigned short gc_enable = 1; +static int (*gc)(void) = NULL; + +void gc_handler(int sig) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); +#if !defined(_WIN32) && !defined(__mips__) + char name[256]; + unw_cursor_t cursor; unw_context_t uc; + unw_word_t ip, sp, offp; +#endif + + switch(sig) { + case SIGSEGV: +#ifndef _WIN32 + case SIGBUS: +#endif + case SIGILL: + case SIGABRT: + case SIGFPE: { +#if !defined(_WIN32) && !defined(__mips__) + log_shell_disable(); + void *stack[50]; + int n = backtrace(stack, 50); + printf("-- STACKTRACE (%d FRAMES) --\n", n); + logerror("-- STACKTRACE (%d FRAMES) --", n); + + unw_getcontext(&uc); + unw_init_local(&cursor, &uc); + + while(unw_step(&cursor) > 0) { + name[0] = '\0'; + unw_get_proc_name(&cursor, name, 256, &offp); + unw_get_reg(&cursor, UNW_REG_IP, &ip); + unw_get_reg(&cursor, UNW_REG_SP, &sp); + + printf("%-30s ip = %10p, sp = %10p\n", name, (void *)ip, (void *)sp); + logerror("%-30s ip = %10p, sp = %10p", name, (void *)ip, (void *)sp); + } +#endif + } + break; + default:; + } + if(sig == SIGSEGV) { + fprintf(stderr, "segmentation fault\n"); + exit(EXIT_FAILURE); +#ifndef _WIN32 + } else if(sig == SIGBUS) { + fprintf(stderr, "buserror\n"); + exit(EXIT_FAILURE); +#endif + } +#ifdef _WIN32 + if(((sig == SIGINT || sig == SIGTERM) && gc_enable == 1) || + (!(sig == SIGINT || sig == SIGTERM) && gc_enable == 0)) { +#else + if(((sig == SIGINT || sig == SIGTERM || sig == SIGTSTP) && gc_enable == 1) || + (!(sig == SIGINT || sig == SIGTERM || sig == SIGTSTP) && gc_enable == 0)) { +#endif + if(sig == SIGINT) { + logprintf(LOG_DEBUG, "received interrupt signal, stopping pilight..."); + } else if(sig == SIGTERM) { + logprintf(LOG_DEBUG, "received terminate signal, stopping pilight..."); + } else { + logprintf(LOG_DEBUG, "received stop signal, stopping pilight..."); + } + if(config_get_file() != NULL && gc_enable == 1) { + gc_enable = 0; + if(pilight.runmode == STANDALONE) { + config_write(1, "all"); + } + } + gc_enable = 0; + gc_run(); + } +} + +/* Add function to gc */ +void gc_attach(int (*fp)(void)) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + if(gc != NULL) { + logprintf(LOG_ERR, "multiple calls to gc_attach", __FUNCTION__); + } + gc = fp; +} + +void gc_clear(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + gc = NULL; +} + +/* Run the GC manually */ +int gc_run(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(gc != NULL) { + if(gc() == 0) { + return EXIT_SUCCESS; + } else { + return EXIT_FAILURE; + } + } else { + return EXIT_SUCCESS; + } +} + +/* Initialize the catch all gc */ +void gc_catch(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + +#ifdef _WIN32 + // signal(SIGABRT, gc_handler); + // signal(SIGFPE, gc_handler); + // signal(SIGILL, gc_handler); + // signal(SIGINT, gc_handler); + // signal(SIGSEGV, gc_handler); + // signal(SIGTERM, gc_handler); +#else + struct sigaction act; + memset(&act, 0, sizeof(act)); + act.sa_handler = gc_handler; + sigemptyset(&act.sa_mask); + sigaction(SIGINT, &act, NULL); + sigaction(SIGQUIT, &act, NULL); + sigaction(SIGTERM, &act, NULL); + + sigaction(SIGABRT, &act, NULL); + sigaction(SIGTSTP, &act, NULL); + + sigaction(SIGBUS, &act, NULL); + sigaction(SIGILL, &act, NULL); + sigaction(SIGSEGV, &act, NULL); + sigaction(SIGFPE, &act, NULL); +#endif +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/gc.h b/lib/ESPiLight/pilight/libs/pilight/core/gc.h new file mode 100644 index 0000000..c3a75eb --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/gc.h @@ -0,0 +1,33 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _GC_H_ +#define _GC_H_ + +typedef struct collectors_t { + int (*listener)(void); + struct collectors_t *next; +} collectors_t; + +void gc_handler(int signal); +void gc_attach(int (*fp)(void)); +void gc_catch(void); +int gc_run(void); +void gc_clear(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/http.c b/lib/ESPiLight/pilight/libs/pilight/core/http.c new file mode 100644 index 0000000..aef9958 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/http.c @@ -0,0 +1,815 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #if _WIN32_WINNT < 0x0501 + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0501 + #endif + #define WIN32_LEAN_AND_MEAN + #include + #include + #define MSG_NOSIGNAL 0 +#else + #include + #include + #include + #include + #include + #include + #include + #include +#endif +#include +#include + +#include "../../libuv/uv.h" +#include "pilight.h" +#include "socket.h" +#include "log.h" +#include "network.h" +#include "webserver.h" +#include "ssl.h" + +#define USERAGENT "pilight" +#define HTTP_POST 1 +#define HTTP_GET 0 + +#define STEP_WRITE 0 +#define STEP_READ 1 + +typedef struct http_clients_t { + uv_poll_t *req; + int fd; + struct uv_custom_poll_t *data; + struct http_clients_t *next; +} http_clients_t; + +#ifdef _WIN32 + static uv_mutex_t http_lock; +#else + static pthread_mutex_t http_lock; + static pthread_mutexattr_t http_attr; +#endif + +struct http_clients_t *http_clients = NULL; +static int http_lock_init = 0; + +typedef struct request_t { + char *host; + char *uri; + char *query_string; + char *auth64; + int port; + int is_ssl; + int status_code; + int reading; + void *userdata; + + int steps; + int request_method; + + char *content; + char mimetype[255]; + int chunked; + int chunksize; + int chunkread; + int gotheader; + size_t content_len; + size_t bytes_read; + + void (*callback)(int code, char *data, int size, char *type, void *userdata); +} request_t; + +int done = 0; + +static void http_client_close(uv_poll_t *req); + +static void free_request(struct request_t *request) { + if(request->host != NULL) { + FREE(request->host); + } + if(request->uri != NULL) { + FREE(request->uri); + } + if(request->content != NULL) { + FREE(request->content); + } + if(request->auth64 != NULL) { + FREE(request->auth64); + } + FREE(request); +} + +int http_gc(void) { + struct http_clients_t *node = NULL; + +#ifdef _WIN32 + uv_mutex_lock(&http_lock); +#else + pthread_mutex_lock(&http_lock); +#endif + while(http_clients) { + node = http_clients; + + if(http_clients->fd > -1) { +#ifdef _WIN32 + shutdown(http_clients->fd, SD_BOTH); + closesocket(http_clients->fd); +#else + shutdown(http_clients->fd, SHUT_RDWR); + close(http_clients->fd); +#endif + } + + struct uv_custom_poll_t *custom_poll_data = http_clients->data; + struct request_t *request = custom_poll_data->data; + if(request != NULL) { + free_request(request); + } + + if(custom_poll_data != NULL) { + uv_custom_poll_free(custom_poll_data); + } + + http_clients = http_clients->next; + FREE(node); + } + +#ifdef _WIN32 + uv_mutex_unlock(&http_lock); +#else + pthread_mutex_unlock(&http_lock); +#endif + + logprintf(LOG_DEBUG, "garbage collected http library"); + return 1; +} + +static void http_client_add(uv_poll_t *req, struct uv_custom_poll_t *data) { +#ifdef _WIN32 + uv_mutex_lock(&http_lock); +#else + pthread_mutex_lock(&http_lock); +#endif + + int fd = -1, r = 0; + + if((r = uv_fileno((uv_handle_t *)req, (uv_os_fd_t *)&fd)) != 0) { + logprintf(LOG_ERR, "uv_fileno: %s", uv_strerror(r)); /*LCOV_EXCL_LINE*/ + } + + struct http_clients_t *node = MALLOC(sizeof(struct http_clients_t)); + if(node == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + node->req = req; + node->data = data; + node->fd = fd; + + node->next = http_clients; + http_clients = node; +#ifdef _WIN32 + uv_mutex_unlock(&http_lock); +#else + pthread_mutex_unlock(&http_lock); +#endif +} + +static void http_client_remove(uv_poll_t *req) { +#ifdef _WIN32 + uv_mutex_lock(&http_lock); +#else + pthread_mutex_lock(&http_lock); +#endif + struct http_clients_t *currP, *prevP; + + prevP = NULL; + + for(currP = http_clients; currP != NULL; prevP = currP, currP = currP->next) { + if(currP->req == req) { + if(prevP == NULL) { + http_clients = currP->next; + } else { + prevP->next = currP->next; + } + + FREE(currP); + break; + } + } +#ifdef _WIN32 + uv_mutex_unlock(&http_lock); +#else + pthread_mutex_unlock(&http_lock); +#endif +} + +static int prepare_request(struct request_t **request, int method, char *url, const char *contype, char *post, void (*callback)(int, char *, int, char *, void *), void *userdata) { + char *tok = NULL, *auth = NULL; + int plen = 0, len = 0, tlen = 0; + + if(((*request) = MALLOC(sizeof(struct request_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset((*request), 0, sizeof(struct request_t)); + + /* Check which port we need to use based on the http(s) protocol */ + if(strncmp(url, "http://", 7) == 0) { + (*request)->port = 80; + plen = 8; + (*request)->is_ssl = 0; + } else if(strncmp(url, "https://", 8) == 0) { + (*request)->port = 443; + (*request)->is_ssl = 1; + plen = 9; + if(ssl_client_init_status() == -1) { + logprintf(LOG_ERR, "HTTPS URL's require a properly initialized SSL library"); + return -1; + } + } else { + logprintf(LOG_ERR, "A URL should start with either http:// or https://"); + FREE((*request)); + return -1; + } + + /* Split the url into a host and page part */ + len = strlen(url); + if((tok = strstr(&url[plen], "/"))) { + tlen = (size_t)(tok-url)-plen+1; + if(((*request)->host = MALLOC(tlen+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strncpy((*request)->host, &url[plen-1], tlen); + (*request)->host[tlen] = '\0'; + if(((*request)->uri = MALLOC(len-tlen)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strncpy((*request)->uri, &url[tlen+(plen-1)], (len-tlen)-1); + } else { + tlen = strlen(url)-(plen-1); + if(((*request)->host = MALLOC(tlen+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strncpy((*request)->host, &url[(plen-1)], tlen); + (*request)->host[tlen] = '\0'; + if(((*request)->uri = MALLOC(2)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strncpy((*request)->uri, "/", 1); + } + if((tok = strstr((*request)->host, "@"))) { + size_t pglen = strlen((*request)->uri); + tlen = (size_t)(tok-(*request)->host); + if((auth = MALLOC(tlen+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strncpy(auth, &(*request)->host[0], tlen); + auth[tlen] = '\0'; + strncpy(&(*request)->host[0], &url[plen+tlen], len-(plen+tlen+pglen)); + (*request)->host[len-(plen+tlen+pglen)] = '\0'; + (*request)->auth64 = base64encode(auth, strlen(auth)); + FREE(auth); + } + if(method == HTTP_POST) { + strncpy((*request)->mimetype, contype, sizeof((*request)->mimetype)); + if(((*request)->content = REALLOC((*request)->content, strlen(post)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy((*request)->content, post); + (*request)->content_len = strlen(post); + } + + len = strlen((*request)->host); + int i = 0; + while(i < len) { + if((tok = strstr(&(*request)->host[i], ":"))) { + size_t pglen = strlen((*request)->host); + tlen = (size_t)(tok-(*request)->host)+1; + if((*request)->host[tlen] == ':') { + i = tlen; + while(i < len && (*request)->host[i++] == ':'); + continue; + } + if(isNumeric(&(*request)->host[tlen]) == 0) { + (*request)->port = atoi(&(*request)->host[tlen]); + } else { + logprintf(LOG_ERR, "A custom URL port must be numeric"); + FREE((*request)->host); + FREE((*request)->uri); + FREE((*request)); + return -1; + } + if(pglen == tlen) { + logprintf(LOG_ERR, "A custom URL port is missing"); + FREE((*request)->host); + FREE((*request)->uri); + FREE((*request)); + return -1; + } + (*request)->host[tlen-1] = '\0'; + break; + } + i++; + } + len = strlen((*request)->host)-1; + if((*request)->host[0] == '[') { + memmove(&(*request)->host[0], &(*request)->host[1], len); + (*request)->host[len] = '\0'; + } + if((*request)->host[len-1] == ']') { + (*request)->host[len-1] = '\0'; + } + + (*request)->userdata = userdata; + (*request)->callback = callback; + (*request)->request_method = method; + + return 0; +} + +static void append_to_header(char **header, char *data, ...) { + va_list ap, apcpy; + int pos = 0, bytes = 0; + if(*header != NULL) { + pos = strlen(*header); + } + // va_copy(apcpy, ap); + va_start(apcpy, data); +#ifdef _WIN32 + bytes = _vscprintf(data, apcpy); +#else + bytes = vsnprintf(NULL, 0, data, apcpy); +#endif + if(bytes == -1) { + /* + * FIXME + */ + // fprintf(stderr, "ERROR: improperly formatted logprintf message %s\n", data); + } else { + va_end(apcpy); + if((*header = REALLOC(*header, pos+bytes+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + va_start(ap, data); + vsprintf(&(*header)[pos], data, ap); + va_end(ap); + } +} + +static void process_chunk(char **buf, ssize_t *size, struct request_t *request) { + char *p = NULL; + int pos = 0, toread = 0; + + while(1) { + toread = *size; + if(strncmp(*buf, "0\r\n\r\n", 5) == 0) { + request->reading = 0; + break; + } + + if(request->chunksize == request->chunkread) { + if((p = strstr(*buf, "\r\n")) != NULL) { + pos = p-*buf; + (*buf)[pos+1] = '\0'; + request->chunksize = strtoul(*buf, NULL, 16); + memmove(&(*buf)[0], &(*buf)[pos+2], toread-(pos+2)); + toread -= (pos+2); + *size -= (pos+2); + (*buf)[toread] = '\0'; + } + } + + if((request->chunksize-request->chunkread) < *size) { + toread = request->chunksize-request->chunkread; + } + + if((request->content = REALLOC(request->content, request->bytes_read+toread+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + /* + * Prevent uninitialised values in valgrind + */ + memset(&request->content[request->bytes_read], 0, toread+1); + memcpy(&request->content[request->bytes_read], *buf, toread); + request->bytes_read += toread; + request->chunkread += toread; + + memmove(&(*buf)[0], &(*buf)[toread], *size-toread); + + *size -= toread; + (*buf)[*size] = '\0'; + + if(request->chunkread <= request->chunksize) { + if(strncmp(*buf, "\r\n", 2) == 0) { + memmove(&(*buf)[0], &(*buf)[2], *size-2); + *size -= 2; + toread -= 2; + (*buf)[*size] = '\0'; + } + if(request->chunkread == request->chunksize) { + request->chunksize = 0; + request->chunkread = 0; + } + } + + if(request->chunksize == 0 && strstr(*buf, "\r\n") == NULL) { + break; + } else if(*size > 0 && strncmp(*buf, "0\r\n\r\n", 5) != 0) { + request->reading = 1; + } else { + break; + } + } +} + +static void close_cb(uv_handle_t *handle) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + FREE(handle); +} + +static void http_client_close(uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct request_t *request = custom_poll_data->data; + int fd = -1, r = 0; + + if((r = uv_fileno((uv_handle_t *)req, (uv_os_fd_t *)&fd)) != 0) { + logprintf(LOG_ERR, "uv_fileno: %s", uv_strerror(r)); /*LCOV_EXCL_LINE*/ + } + + if(fd > -1) { +#ifdef _WIN32 + shutdown(fd, SD_BOTH); + closesocket(fd); +#else + shutdown(fd, SHUT_RDWR); + close(fd); +#endif + } + + http_client_remove(req); + + if(!uv_is_closing((uv_handle_t *)req)) { + uv_poll_stop(req); + uv_close((uv_handle_t *)req, close_cb); + } + + if(request != NULL) { + free_request(request); + custom_poll_data->data = NULL; + } + + if(custom_poll_data != NULL) { + uv_custom_poll_free(custom_poll_data); + req->data = NULL; + } +} + +static void poll_close_cb(uv_poll_t *req) { + http_client_close(req); +} + +static void read_cb(uv_poll_t *req, ssize_t *nread, char *buf) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct request_t *request = custom_poll_data->data; + char *header = NULL, *p = NULL; + const char *a = NULL, *b = NULL; + int pos = 0; + + if(*nread > 0) { + buf[*nread] = '\0'; + } + + /* + * FIXME: Use io read buf instead of new buffer + */ + if(*nread > 0) { + if(request->gotheader == 0 && (p = strstr(buf, "\r\n\r\n")) != NULL) { + pos = p-buf; + if((header = MALLOC(pos+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strncpy(header, buf, pos); + header[pos] = '\0'; + request->gotheader = 1; + *nread -= pos+4; + memmove(buf, &buf[pos+4], *nread); + buf[*nread] = '\0'; + + struct connection_t c; + char *location = NULL; + const char *p = location; + http_parse_request(header, &c); + if(c.status_code == 301 && (p = http_get_header(&c, "Location")) != NULL) { + if(request->callback != NULL) { + request->callback(c.status_code, location, strlen(location), NULL, request->userdata); + } + FREE(header); + return; + } + request->status_code = c.status_code; + if((a = http_get_header(&c, "Content-Type")) != NULL || (b = http_get_header(&c, "Content-type")) != NULL) { + int len = 0, i = 0; + if(a != NULL) { + strcpy(request->mimetype, http_get_header(&c, "Content-Type")); + } else if(b != NULL) { + strcpy(request->mimetype, http_get_header(&c, "Content-type")); + } + len = strlen(request->mimetype); + for(i=0;imimetype[i] == ';') { + request->mimetype[i] = '\0'; + break; + } + } + } + if(http_get_header(&c, "Content-Length") != NULL) { + request->content_len = atoi(http_get_header(&c, "Content-Length")); + } + if(http_get_header(&c, "Transfer-Encoding") != NULL) { + if(strcmp(http_get_header(&c, "Transfer-Encoding"), "chunked") == 0) { + request->chunked = 1; + } + } + FREE(header); + if(*nread == 0) { + if(request->callback != NULL) { + request->callback(request->status_code, "", request->content_len, request->mimetype, request->userdata); + goto close; + } + } + } + if(request->chunked == 1) { + process_chunk(&buf, &(*nread), request); + } else if(*nread > 0) { + if((request->content = REALLOC(request->content, request->bytes_read+(*nread)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + /* + * Prevent uninitialised values in valgrind + */ + memset(&request->content[request->bytes_read], 0, *nread+1); + memcpy(&request->content[request->bytes_read], buf, *nread); + request->bytes_read += *nread; + *nread = 0; + } + + if(strcmp(buf, "0\r\n\r\n") == 0) { + request->reading = 0; + request->chunked = 0; + request->content[request->bytes_read] = '\0'; + request->content_len = request->bytes_read; + } + + if(request->chunked == 1 || request->bytes_read < request->content_len) { + request->reading = 1; + } else if(request->content != NULL) { + request->content[request->content_len] = '\0'; + if(request->callback != NULL) { + request->callback(request->status_code, request->content, request->content_len, request->mimetype, request->userdata); + goto close; + } + } + } + + if(request->reading == 1) { + uv_custom_read(req); + return; + } + +close: + uv_custom_close(req); +} + +static void write_cb(uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct request_t *request = custom_poll_data->data; + char *header = NULL; + + switch(request->steps) { + case STEP_WRITE: { + if(request->request_method == HTTP_POST) { + append_to_header(&header, "POST %s HTTP/1.0\r\n", request->uri); + append_to_header(&header, "Host: %s\r\n", request->host); + if(request->auth64 != NULL) { + append_to_header(&header, "Authorization: Basic %s\r\n", request->auth64); + } + append_to_header(&header, "User-Agent: %s\r\n", USERAGENT); + append_to_header(&header, "Content-Type: %s\r\n", request->mimetype); + append_to_header(&header, "Content-Length: %lu\r\n\r\n", request->content_len); + append_to_header(&header, "%s", request->content); + } else if(request->request_method == HTTP_GET) { + append_to_header(&header, "GET %s HTTP/1.1\r\n", request->uri); + append_to_header(&header, "Host: %s\r\n", request->host); + if(request->auth64 != NULL) { + append_to_header(&header, "Authorization: Basic %s\r\n", request->auth64); + } + append_to_header(&header, "User-Agent: %s\r\n", USERAGENT); + append_to_header(&header, "Connection: close\r\n\r\n"); + } + iobuf_append(&custom_poll_data->send_iobuf, (void *)header, strlen(header)); + + uv_custom_write(req); + FREE(header); + request->steps = STEP_READ; + } break; + case STEP_READ: + uv_custom_read(req); + return; + break; + } +} + +char *http_process(int type, char *url, const char *conttype, char *post, void (*callback)(int, char *, int, char *, void *), void *userdata) { + struct request_t *request = NULL; + struct uv_custom_poll_t *custom_poll_data = NULL; + struct sockaddr_in addr4; + struct sockaddr_in6 addr6; + char *ip = NULL; + int r = 0, sockfd = 0; + + if(http_lock_init == 0) { + http_lock_init = 1; +#ifdef _WIN32 + uv_mutex_init(&http_lock); +#else + pthread_mutexattr_init(&http_attr); + pthread_mutexattr_settype(&http_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&http_lock, &http_attr); +#endif + } + +#ifdef _WIN32 + WSADATA wsa; + + if(WSAStartup(0x202, &wsa) != 0) { + logprintf(LOG_ERR, "WSAStartup"); + exit(EXIT_FAILURE); + } +#endif + + memset(&addr4, 0, sizeof(addr4)); + memset(&addr6, 0, sizeof(addr6)); + if(prepare_request(&request, type, url, conttype, post, callback, userdata) == 0) { + int inet = host2ip(request->host, &ip); + switch(inet) { + case AF_INET: { + memset(&addr4, '\0', sizeof(struct sockaddr_in)); + r = uv_ip4_addr(ip, request->port, &addr4); + if(r != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_ip4_addr: %s", uv_strerror(r)); + goto freeuv; + /*LCOV_EXCL_END*/ + } + } break; + case AF_INET6: { + memset(&addr6, '\0', sizeof(struct sockaddr_in6)); + r = uv_ip6_addr(ip, request->port, &addr6); + if(r != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_ip6_addr: %s", uv_strerror(r)); + goto freeuv; + /*LCOV_EXCL_END*/ + } + } break; + default: { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "host2ip"); + goto freeuv; + /*LCOV_EXCL_END*/ + } break; + } + FREE(ip); + + /* + * Partly bypass libuv in case of ssl connections + */ + if((sockfd = socket(inet, SOCK_STREAM, 0)) < 0){ + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "socket: %s", strerror(errno)); + goto freeuv; + /*LCOV_EXCL_STOP*/ + } + +#ifdef _WIN32 + unsigned long on = 1; + ioctlsocket(sockfd, FIONBIO, &on); +#else + long arg = fcntl(sockfd, F_GETFL, NULL); + fcntl(sockfd, F_SETFL, arg | O_NONBLOCK); +#endif + + switch(inet) { + case AF_INET: { + r = connect(sockfd, (struct sockaddr *)&addr4, sizeof(addr4)); + } break; + case AF_INET6: { + r = connect(sockfd, (struct sockaddr *)&addr6, sizeof(addr6)); + } break; + default: { + } break; + } + + if(r < 0) { +#ifdef _WIN32 + if(!(WSAGetLastError() == WSAEWOULDBLOCK || WSAGetLastError() == WSAEISCONN)) { +#else + if(!(errno == EINPROGRESS || errno == EISCONN)) { +#endif + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "connect: %s", strerror(errno)); + goto freeuv; + /*LCOV_EXCL_STOP*/ + } + } + + uv_poll_t *poll_req = NULL; + if((poll_req = MALLOC(sizeof(uv_poll_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + uv_custom_poll_init(&custom_poll_data, poll_req, (void *)request); + custom_poll_data->is_ssl = request->is_ssl; + custom_poll_data->write_cb = write_cb; + custom_poll_data->read_cb = read_cb; + custom_poll_data->close_cb = poll_close_cb; + + r = uv_poll_init_socket(uv_default_loop(), poll_req, sockfd); + if(r != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_poll_init_socket: %s", uv_strerror(r)); + FREE(poll_req); + goto freeuv; + /*LCOV_EXCL_STOP*/ + } + + http_client_add(poll_req, custom_poll_data); + request->steps = STEP_WRITE; + uv_custom_write(poll_req); + } + + return NULL; + +freeuv: + request->callback(404, NULL, 0, 0, request->userdata); + FREE(request->uri); + FREE(request->host); + FREE(request); + + if(sockfd > 0) { +#ifdef _WIN32 + closesocket(sockfd); +#else + close(sockfd); +#endif + } + return NULL; +} + +char *http_get_content(char *url, void (*callback)(int, char *, int, char *, void *), void *userdata) { + return http_process(HTTP_GET, url, NULL, NULL, callback, userdata); +} + +char *http_post_content(char *url, const char *conttype, char *post, void (*callback)(int, char *, int, char *, void *), void *userdata) { + return http_process(HTTP_POST, url, conttype, post, callback, userdata); +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/http.h b/lib/ESPiLight/pilight/libs/pilight/core/http.h new file mode 100644 index 0000000..10e8776 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/http.h @@ -0,0 +1,16 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _HTTP_H_ +#define _HTTP_H_ + +char *http_post_content(char *url, const char *contype, char *post, void (*callback)(int, char *, int, char *, void *), void *userdata); +char *http_get_content(char *url, void (*callback)(int, char *, int, char *, void *), void *userdata); +int http_gc(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/i2c-dev.h b/lib/ESPiLight/pilight/libs/pilight/core/i2c-dev.h new file mode 100644 index 0000000..39f0fd5 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/i2c-dev.h @@ -0,0 +1,335 @@ +/* + i2c-dev.h - i2c-bus driver, char device interface + + Copyright (C) 1995-97 Simon G. Vogl + Copyright (C) 1998-99 Frodo Looijaard + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301 USA. +*/ + +/* $Id: i2c-dev.h 5894 2010-12-12 13:22:29Z khali $ */ + +#ifndef LIB_I2CDEV_H +#define LIB_I2CDEV_H + +#include +#include + + +/* -- i2c.h -- */ + + +/* + * I2C Message - used for pure i2c transaction, also from /dev interface + */ +struct i2c_msg { + __u16 addr; /* slave address */ + unsigned short flags; +#define I2C_M_TEN 0x10 /* we have a ten bit chip address */ +#define I2C_M_RD 0x01 +#define I2C_M_NOSTART 0x4000 +#define I2C_M_REV_DIR_ADDR 0x2000 +#define I2C_M_IGNORE_NAK 0x1000 +#define I2C_M_NO_RD_ACK 0x0800 + short len; /* msg length */ + char *buf; /* pointer to msg data */ +}; + +/* To determine what functionality is present */ + +#define I2C_FUNC_I2C 0x00000001 +#define I2C_FUNC_10BIT_ADDR 0x00000002 +#define I2C_FUNC_PROTOCOL_MANGLING 0x00000004 /* I2C_M_{REV_DIR_ADDR,NOSTART,..} */ +#define I2C_FUNC_SMBUS_PEC 0x00000008 +#define I2C_FUNC_SMBUS_BLOCK_PROC_CALL 0x00008000 /* SMBus 2.0 */ +#define I2C_FUNC_SMBUS_QUICK 0x00010000 +#define I2C_FUNC_SMBUS_READ_BYTE 0x00020000 +#define I2C_FUNC_SMBUS_WRITE_BYTE 0x00040000 +#define I2C_FUNC_SMBUS_READ_BYTE_DATA 0x00080000 +#define I2C_FUNC_SMBUS_WRITE_BYTE_DATA 0x00100000 +#define I2C_FUNC_SMBUS_READ_WORD_DATA 0x00200000 +#define I2C_FUNC_SMBUS_WRITE_WORD_DATA 0x00400000 +#define I2C_FUNC_SMBUS_PROC_CALL 0x00800000 +#define I2C_FUNC_SMBUS_READ_BLOCK_DATA 0x01000000 +#define I2C_FUNC_SMBUS_WRITE_BLOCK_DATA 0x02000000 +#define I2C_FUNC_SMBUS_READ_I2C_BLOCK 0x04000000 /* I2C-like block xfer */ +#define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK 0x08000000 /* w/ 1-byte reg. addr. */ + +#define I2C_FUNC_SMBUS_BYTE (I2C_FUNC_SMBUS_READ_BYTE | \ + I2C_FUNC_SMBUS_WRITE_BYTE) +#define I2C_FUNC_SMBUS_BYTE_DATA (I2C_FUNC_SMBUS_READ_BYTE_DATA | \ + I2C_FUNC_SMBUS_WRITE_BYTE_DATA) +#define I2C_FUNC_SMBUS_WORD_DATA (I2C_FUNC_SMBUS_READ_WORD_DATA | \ + I2C_FUNC_SMBUS_WRITE_WORD_DATA) +#define I2C_FUNC_SMBUS_BLOCK_DATA (I2C_FUNC_SMBUS_READ_BLOCK_DATA | \ + I2C_FUNC_SMBUS_WRITE_BLOCK_DATA) +#define I2C_FUNC_SMBUS_I2C_BLOCK (I2C_FUNC_SMBUS_READ_I2C_BLOCK | \ + I2C_FUNC_SMBUS_WRITE_I2C_BLOCK) + +/* Old name, for compatibility */ +#define I2C_FUNC_SMBUS_HWPEC_CALC I2C_FUNC_SMBUS_PEC + +/* + * Data for SMBus Messages + */ +#define I2C_SMBUS_BLOCK_MAX 32 /* As specified in SMBus standard */ +#define I2C_SMBUS_I2C_BLOCK_MAX 32 /* Not specified but we use same structure */ +union i2c_smbus_data { + __u8 byte; + __u16 word; + __u8 block[I2C_SMBUS_BLOCK_MAX + 2]; /* block[0] is used for length */ + /* and one more for PEC */ +}; + +/* smbus_access read or write markers */ +#define I2C_SMBUS_READ 1 +#define I2C_SMBUS_WRITE 0 + +/* SMBus transaction types (size parameter in the above functions) + Note: these no longer correspond to the (arbitrary) PIIX4 internal codes! */ +#define I2C_SMBUS_QUICK 0 +#define I2C_SMBUS_BYTE 1 +#define I2C_SMBUS_BYTE_DATA 2 +#define I2C_SMBUS_WORD_DATA 3 +#define I2C_SMBUS_PROC_CALL 4 +#define I2C_SMBUS_BLOCK_DATA 5 +#define I2C_SMBUS_I2C_BLOCK_BROKEN 6 +#define I2C_SMBUS_BLOCK_PROC_CALL 7 /* SMBus 2.0 */ +#define I2C_SMBUS_I2C_BLOCK_DATA 8 + + +/* ----- commands for the ioctl like i2c_command call: + * note that additional calls are defined in the algorithm and hw + * dependent layers - these can be listed here, or see the + * corresponding header files. + */ + /* -> bit-adapter specific ioctls */ +#define I2C_RETRIES 0x0701 /* number of times a device address */ + /* should be polled when not */ + /* acknowledging */ +#define I2C_TIMEOUT 0x0702 /* set timeout - call with int */ + + +/* this is for i2c-dev.c */ +#define I2C_SLAVE 0x0703 /* Change slave address */ + /* Attn.: Slave address is 7 or 10 bits */ +#define I2C_SLAVE_FORCE 0x0706 /* Change slave address */ + /* Attn.: Slave address is 7 or 10 bits */ + /* This changes the address, even if it */ + /* is already taken! */ +#define I2C_TENBIT 0x0704 /* 0 for 7 bit addrs, != 0 for 10 bit */ + +#define I2C_FUNCS 0x0705 /* Get the adapter functionality */ +#define I2C_RDWR 0x0707 /* Combined R/W transfer (one stop only)*/ +#define I2C_PEC 0x0708 /* != 0 for SMBus PEC */ + +#define I2C_SMBUS 0x0720 /* SMBus-level access */ + +/* -- i2c.h -- */ + + +/* Note: 10-bit addresses are NOT supported! */ + +/* This is the structure as used in the I2C_SMBUS ioctl call */ +struct i2c_smbus_ioctl_data { + char read_write; + __u8 command; + int size; + union i2c_smbus_data *data; +}; + +/* This is the structure as used in the I2C_RDWR ioctl call */ +struct i2c_rdwr_ioctl_data { + struct i2c_msg *msgs; /* pointers to i2c_msgs */ + int nmsgs; /* number of i2c_msgs */ +}; + + +static inline __s32 i2c_smbus_access(int file, char read_write, __u8 command, + int size, union i2c_smbus_data *data) +{ + struct i2c_smbus_ioctl_data args; + + args.read_write = read_write; + args.command = command; + args.size = size; + args.data = data; + return ioctl(file,I2C_SMBUS,&args); +} + + +static inline __s32 i2c_smbus_write_quick(int file, __u8 value) +{ + return i2c_smbus_access(file,value,0,I2C_SMBUS_QUICK,NULL); +} + +static inline __s32 i2c_smbus_read_byte(int file) +{ + union i2c_smbus_data data; + if (i2c_smbus_access(file,I2C_SMBUS_READ,0,I2C_SMBUS_BYTE,&data)) + return -1; + else + return 0x0FF & data.byte; +} + +static inline __s32 i2c_smbus_write_byte(int file, __u8 value) +{ + return i2c_smbus_access(file,I2C_SMBUS_WRITE,value, + I2C_SMBUS_BYTE,NULL); +} + +static inline __s32 i2c_smbus_read_byte_data(int file, __u8 command) +{ + union i2c_smbus_data data; + if (i2c_smbus_access(file,I2C_SMBUS_READ,command, + I2C_SMBUS_BYTE_DATA,&data)) + return -1; + else + return 0x0FF & data.byte; +} + +static inline __s32 i2c_smbus_write_byte_data(int file, __u8 command, + __u8 value) +{ + union i2c_smbus_data data; + data.byte = value; + return i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_BYTE_DATA, &data); +} + +static inline __s32 i2c_smbus_read_word_data(int file, __u8 command) +{ + union i2c_smbus_data data; + if (i2c_smbus_access(file,I2C_SMBUS_READ,command, + I2C_SMBUS_WORD_DATA,&data)) + return -1; + else + return 0x0FFFF & data.word; +} + +static inline __s32 i2c_smbus_write_word_data(int file, __u8 command, + __u16 value) +{ + union i2c_smbus_data data; + data.word = value; + return i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_WORD_DATA, &data); +} + +static inline __s32 i2c_smbus_process_call(int file, __u8 command, __u16 value) +{ + union i2c_smbus_data data; + data.word = value; + if (i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_PROC_CALL,&data)) + return -1; + else + return 0x0FFFF & data.word; +} + + +/* Returns the number of read bytes */ +static inline __s32 i2c_smbus_read_block_data(int file, __u8 command, + __u8 *values) +{ + union i2c_smbus_data data; + int i; + if (i2c_smbus_access(file,I2C_SMBUS_READ,command, + I2C_SMBUS_BLOCK_DATA,&data)) + return -1; + else { + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; + } +} + +static inline __s32 i2c_smbus_write_block_data(int file, __u8 command, + __u8 length, const __u8 *values) +{ + union i2c_smbus_data data; + int i; + if (length > 32) + length = 32; + for (i = 1; i <= length; i++) + data.block[i] = values[i-1]; + data.block[0] = length; + return i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_BLOCK_DATA, &data); +} + +/* Returns the number of read bytes */ +/* Until kernel 2.6.22, the length is hardcoded to 32 bytes. If you + ask for less than 32 bytes, your code will only work with kernels + 2.6.23 and later. */ +static inline __s32 i2c_smbus_read_i2c_block_data(int file, __u8 command, + __u8 length, __u8 *values) +{ + union i2c_smbus_data data; + int i; + + if (length > 32) + length = 32; + data.block[0] = length; + if (i2c_smbus_access(file,I2C_SMBUS_READ,command, + length == 32 ? I2C_SMBUS_I2C_BLOCK_BROKEN : + I2C_SMBUS_I2C_BLOCK_DATA,&data)) + return -1; + else { + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; + } +} + +static inline __s32 i2c_smbus_write_i2c_block_data(int file, __u8 command, + __u8 length, + const __u8 *values) +{ + union i2c_smbus_data data; + int i; + if (length > 32) + length = 32; + for (i = 1; i <= length; i++) + data.block[i] = values[i-1]; + data.block[0] = length; + return i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_I2C_BLOCK_BROKEN, &data); +} + +/* Returns the number of read bytes */ +static inline __s32 i2c_smbus_block_process_call(int file, __u8 command, + __u8 length, __u8 *values) +{ + union i2c_smbus_data data; + int i; + if (length > 32) + length = 32; + for (i = 1; i <= length; i++) + data.block[i] = values[i-1]; + data.block[0] = length; + if (i2c_smbus_access(file,I2C_SMBUS_WRITE,command, + I2C_SMBUS_BLOCK_PROC_CALL,&data)) + return -1; + else { + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; + } +} + + +#endif /* LIB_I2CDEV_H */ diff --git a/lib/ESPiLight/pilight/libs/pilight/core/irq.c b/lib/ESPiLight/pilight/libs/pilight/core/irq.c new file mode 100644 index 0000000..aeab55b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/irq.c @@ -0,0 +1,62 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 +#include +#endif + +#include "irq.h" +#include "gc.h" +#include "log.h" +#include "mem.h" + +typedef struct timestamp_t { + unsigned long first; + unsigned long second; +} timestamp_t; + +timestamp_t timestamp; + +/* Attaches an interrupt handler to a specific GPIO pin + Whenever an rising, falling or changing interrupt occurs + the function given as the last argument will be called */ +int irq_read(int gpio) { +#ifndef _WIN32 + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + int x = waitForInterrupt(gpio, 1000); + if(x > 0) { + struct timeval tv; + gettimeofday(&tv, NULL); + timestamp.first = timestamp.second; + timestamp.second = 1000000 * (unsigned int)tv.tv_sec + (unsigned int)tv.tv_usec; + return (int)timestamp.second-(int)timestamp.first; + } + return x; +#else + return -1; +#endif +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/irq.h b/lib/ESPiLight/pilight/libs/pilight/core/irq.h new file mode 100644 index 0000000..84d6431 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/irq.h @@ -0,0 +1,25 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _IRQ_H_ +#define _IRQ_H_ + +int irq_read(int gpio); +void irq_interrupt(void); + +#endif diff --git a/lib/ESPiLight/src/pilight/libs/pilight/core/json.c b/lib/ESPiLight/pilight/libs/pilight/core/json.c old mode 100755 new mode 100644 similarity index 99% rename from lib/ESPiLight/src/pilight/libs/pilight/core/json.c rename to lib/ESPiLight/pilight/libs/pilight/core/json.c index b034da6..240436f --- a/lib/ESPiLight/src/pilight/libs/pilight/core/json.c +++ b/lib/ESPiLight/pilight/libs/pilight/core/json.c @@ -24,7 +24,6 @@ #include #include #include -#include "../../../../tools/aprintf.h" #include #include @@ -1267,7 +1266,7 @@ static void emit_number(SB *out, double num, int decimals) * like 0.3 -> 0.299999999999999988898 . */ char buf[64]; - dtostrf(num, 0, decimals, buf); + sprintf(buf, "%.*f", decimals, num); if (number_is_valid(buf)) sb_puts(out, buf); diff --git a/lib/ESPiLight/src/pilight/libs/pilight/core/json.h b/lib/ESPiLight/pilight/libs/pilight/core/json.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/core/json.h rename to lib/ESPiLight/pilight/libs/pilight/core/json.h diff --git a/lib/ESPiLight/pilight/libs/pilight/core/log.c b/lib/ESPiLight/pilight/libs/pilight/core/log.c new file mode 100644 index 0000000..086e65f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/log.c @@ -0,0 +1,519 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif +#endif +#include + +#include "pilight.h" +#include "common.h" +#include "gc.h" +#include "log.h" + +struct logqueue_t { + char *line; + struct logqueue_t *next; +} logqueue_t; + +static pthread_mutex_t logqueue_lock; +static pthread_cond_t logqueue_signal; +static pthread_mutexattr_t logqueue_attr; + +static struct logqueue_t *logqueue; +static struct logqueue_t *logqueue_head; +static unsigned int logqueue_number = 0; +static unsigned int loop = 1; +static unsigned int stop = 0; +static unsigned int pthinitialized = 0; +static unsigned int pthactive = 0; +static unsigned int pthfree = 0; +static pthread_t pth; + +static char *logfile = NULL; +static int filelog = 1; +static int shelllog = 0; +static int loglevel = LOG_DEBUG; + +void logwrite(char *line) { + struct stat sb; + FILE *lf = NULL; + if(logfile != NULL) { + if((stat(logfile, &sb)) == 0) { + if(sb.st_nlink != 0 && sb.st_size > LOG_MAX_SIZE) { + if(lf != NULL) { + fclose(lf); + } + char tmp[strlen(logfile)+5]; + strcpy(tmp, logfile); + strcat(tmp, ".old"); + rename(logfile, tmp); + } + } + if((lf = fopen(logfile, "a")) == NULL) { + filelog = 0; + } else { + fwrite(line, sizeof(char), strlen(line), lf); + fflush(lf); + fclose(lf); + lf = NULL; + } + } +} + +int log_gc(void) { + if(shelllog == 1) { + fprintf(stderr, "DEBUG: garbage collected log library\n"); + } + + stop = 1; + loop = 0; + + if(pthinitialized == 1) { + pthread_mutex_unlock(&logqueue_lock); + pthread_cond_signal(&logqueue_signal); + } + + /* Flush log queue to pilight.err file */ + if(pthactive == 0) { + struct logqueue_t *tmp; + while(logqueue) { + tmp = logqueue; + if(tmp->line != NULL) { + if(filelog == 1 && logfile != NULL) { + logwrite(tmp->line); + } else { + /* [ Datetime ] Progname: */ + /* 24 + 14 + 2 */ + size_t pos = 24+strlen(progname)+3; + size_t len = strlen(tmp->line); + memmove(&tmp->line[0], &tmp->line[pos], len-pos); + /* Remove newline */ + tmp->line[(len-pos)-1] = '\0'; + logerror(tmp->line); + } + FREE(tmp->line); + } + logqueue = logqueue->next; + FREE(tmp); + logqueue_number--; + } + if(logqueue != NULL) { + FREE(logqueue); + } + if(pthfree == 1) { + pthread_join(pth, NULL); + } + } else { + /* Flush log queue by log thread */ + while(logqueue_number > 0) { + usleep(10); + } + while(pthactive > 0) { + usleep(10); + } + pthread_join(pth, NULL); + } + if(logfile != NULL) { + FREE(logfile); + } + return 1; +} + +/* + * A compatible logprint for wiringX + */ +void logprintf1(int prio, char *file, int line, const char *format_str, ...) { + va_list args; + va_start(args, format_str); + logprintf(prio, format_str, args); + va_end(args); +} + +void logprintf(int prio, const char *format_str, ...) { + struct timeval tv; + struct tm tm; + va_list ap, apcpy; + char fmt[64], buf[64], *line = MALLOC(128); + int save_errno = -1, pos = 0, bytes = 0; + + memset(&tm, '\0', sizeof(struct tm)); + + if(line == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + save_errno = errno; + + memset(line, '\0', 128); + memset(buf, '\0', 64); + + if(loglevel >= prio) { + gettimeofday(&tv, NULL); +#ifdef _WIN32 + struct tm *tm1; + if((tm1 = gmtime(&tv.tv_sec)) != 0) { + memcpy(&tm, tm1, sizeof(struct tm)); +#else + if((gmtime_r(&tv.tv_sec, &tm)) != 0) { +#endif + strftime(fmt, sizeof(fmt), "%b %d %H:%M:%S", &tm); + snprintf(buf, sizeof(buf), "%s:%03u", fmt, (unsigned int)tv.tv_usec); + } + pos += sprintf(line, "[%22.22s] %s: ", buf, progname); + + switch(prio) { + case LOG_WARNING: + pos += sprintf(&line[pos], "WARNING: "); + break; + case LOG_ERR: + pos += sprintf(&line[pos], "ERROR: "); + break; + case LOG_INFO: + pos += sprintf(&line[pos], "INFO: "); + break; + case LOG_NOTICE: + pos += sprintf(&line[pos], "NOTICE: "); + break; + case LOG_DEBUG: + pos += sprintf(&line[pos], "DEBUG: "); + break; + case LOG_STACK: + pos += sprintf(&line[pos], "STACK: "); + break; + default: + break; + } + + va_copy(apcpy, ap); + va_start(apcpy, format_str); +#ifdef _WIN32 + bytes = _vscprintf(format_str, apcpy); +#else + bytes = vsnprintf(NULL, 0, format_str, apcpy); +#endif + if(bytes == -1) { + fprintf(stderr, "ERROR: unproperly formatted logprintf message %s\n", format_str); + } else { + va_end(apcpy); + if((line = REALLOC(line, (size_t)bytes+(size_t)pos+3)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + va_start(ap, format_str); + pos += vsprintf(&line[pos], format_str, ap); + va_end(ap); + } + line[pos++]='\n'; + line[pos++]='\0'; + } + if(shelllog == 1) { + fprintf(stderr, "%s", line); + } +#ifdef _WIN32 + if(prio == LOG_ERR && strstr(progname, "daemon") != NULL && pilight.running == 0) { + MessageBox(NULL, line, "pilight :: error", MB_OK); + } +#endif + if(stop == 0 && pos > 0) { + if(prio < LOG_DEBUG) { + if(pthinitialized == 1) { + pthread_mutex_lock(&logqueue_lock); + } + if(logqueue_number < 1024) { + struct logqueue_t *node = MALLOC(sizeof(logqueue_t)); + if(node == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((node->line = MALLOC((size_t)pos+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(node->line, '\0', (size_t)pos+1); + strcpy(node->line, line); + node->next = NULL; + + if(logqueue_number == 0) { + logqueue = node; + logqueue_head = node; + } else { + logqueue_head->next = node; + logqueue_head = node; + } + + logqueue_number++; + } else { + fprintf(stderr, "log queue full\n"); + } + if(pthinitialized == 1) { + pthread_mutex_unlock(&logqueue_lock); + pthread_cond_signal(&logqueue_signal); + } + } + } + FREE(line); + errno = save_errno; +} + +void *logloop(void *param) { + pth = pthread_self(); + + pthactive = 1; + pthfree = 1; + + pthread_mutex_lock(&logqueue_lock); + while(loop) { + if(logqueue_number > 0) { + pthread_mutex_lock(&logqueue_lock); + + logwrite(logqueue->line); + + struct logqueue_t *tmp = logqueue; + FREE(tmp->line); + logqueue = logqueue->next; + FREE(tmp); + logqueue_number--; + pthread_mutex_unlock(&logqueue_lock); + } else { + pthread_cond_wait(&logqueue_signal, &logqueue_lock); + } + } + + pthactive = 0; + return (void *)NULL; +} + +void logperror(int prio, const char *s) { + // int save_errno = errno; + // if(logging == 0) + // return; + + // if(s != NULL) { + // logprintf(prio, "%s: %s", s, strerror(errno)); + // } else { + // logprintf(prio, "%s", strerror(errno)); + // } + // errno = save_errno; +} + +void log_file_enable(void) { + filelog = 1; + if(pthinitialized == 0) { + pthread_mutexattr_init(&logqueue_attr); + pthread_mutexattr_settype(&logqueue_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&logqueue_lock, &logqueue_attr); + pthread_cond_init(&logqueue_signal, NULL); + pthinitialized = 1; + } +} + +void log_file_disable(void) { + filelog = 0; +} + +void log_shell_enable(void) { + shelllog = 1; +} + +void log_shell_disable(void) { + shelllog = 0; +} + +int log_file_set(char *log) { + struct stat s; + struct stat sb; + char *logpath = NULL; + FILE *lf = NULL; + + atomiclock(); + /* basename isn't thread safe */ + char *filename = basename(log); + atomicunlock(); + + size_t i = (strlen(log)-strlen(filename)); + if((logpath = REALLOC(logpath, i+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(logpath, '\0', i+1); + strncpy(logpath, log, i); + +/* + * dir stat doens't work on windows if path has a trailing slash + */ +#ifdef _WIN32 + if(logpath[i-1] == '\\' || logpath[i-1] == '/') { + logpath[i-1] = '\0'; + } +#endif + + if(strcmp(filename, log) != 0) { + int err = stat(logpath, &s); + if(err == -1) { + if(ENOENT == errno) { + logprintf(LOG_ERR, "the log folder %s does not exist", logpath); + FREE(logpath); + return EXIT_FAILURE; + } else { + logprintf(LOG_ERR, "failed to run stat on log folder %s", logpath); + FREE(logpath); + return EXIT_FAILURE; + } + } else { + if(S_ISDIR(s.st_mode)) { + if((logfile = REALLOC(logfile, strlen(log)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(logfile, log); + } else { + logprintf(LOG_ERR, "the log folder %s does not exist", logpath); + FREE(logpath); + return EXIT_FAILURE; + } + } + } else { + if((logfile = REALLOC(logfile, strlen(log)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(logfile, log); + } + + char tmp[strlen(logfile)+5]; + strcpy(tmp, logfile); + strcat(tmp, ".old"); + + if((stat(tmp, &sb)) == 0) { + if(sb.st_nlink > 0) { + if((stat(logfile, &sb)) == 0) { + if(sb.st_nlink > 0) { + remove(tmp); + rename(logfile, tmp); + } + } + } + } + + if(lf == NULL && filelog == 1) { + if((lf = fopen(logfile, "a")) == NULL) { + filelog = 0; + shelllog = 1; + logprintf(LOG_ERR, "could not open logfile %s", logfile); + FREE(logpath); + FREE(logfile); + exit(EXIT_FAILURE); + } else { + fclose(lf); + lf = NULL; + } + } + + FREE(logpath); + return EXIT_SUCCESS; +} + +void log_level_set(int level) { + loglevel = level; +} + +int log_level_get(void) { + return loglevel; +} + +void logerror(const char *format_str, ...) { + char line[1024]; + va_list ap; + struct stat sb; + FILE *f = NULL; + char fmt[64], buf[64]; + struct timeval tv; + struct tm tm; + char date[128]; +#ifdef _WIN32 + const char *errpath = "c:/ProgramData/pilight/pilight.err"; +#else + const char *errpath = "/var/log/pilight.err"; +#endif + memset(line, '\0', 1024); + memset(&ap, '\0', sizeof(va_list)); + memset(&sb, '\0', sizeof(struct stat)); + memset(&tv, '\0', sizeof(struct timeval)); + memset(date, '\0', 128); + memset(&tm, '\0', sizeof(struct tm)); + + gettimeofday(&tv, NULL); +#ifdef _WIN32 + if((localtime(&tv.tv_sec)) != 0) { +#else + if((localtime_r(&tv.tv_sec, &tm)) != 0) { +#endif + strftime(fmt, sizeof(fmt), "%b %d %H:%M:%S", &tm); + snprintf(buf, sizeof(buf), "%s:%03u", fmt, (unsigned int)tv.tv_usec); + } + + sprintf(date, "[%22.22s] %s: ", buf, progname); + strcat(line, date); + va_start(ap, format_str); + vsprintf(&line[strlen(line)], format_str, ap); + strcat(line, "\n"); + + if((stat(errpath, &sb)) >= 0) { + if((f = fopen(errpath, "a")) == NULL) { + return; + } + } else { + if(sb.st_nlink == 0) { + if(!(f = fopen(errpath, "a"))) { + return; + } + } + if(sb.st_size > LOG_MAX_SIZE) { + if(f != NULL) { + fclose(f); + } + char tmp[strlen(errpath)+5]; + strcpy(tmp, errpath); + strcat(tmp, ".old"); + rename(errpath, tmp); + if((f = fopen(errpath, "a")) == NULL) { + return; + } + } + } + if(f != NULL) { + fwrite(line, sizeof(char), strlen(line), f); + fflush(f); + fclose(f); + f = NULL; + } + va_end(ap); +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/log.h b/lib/ESPiLight/pilight/libs/pilight/core/log.h new file mode 100644 index 0000000..c2a2fb1 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/log.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _LOG_H_ +#define _LOG_H_ + +#ifdef _WIN32 + #define LOG_EMERG 0 + #define LOG_ALERT 1 + #define LOG_CRIT 2 + #define LOG_ERR 3 + #define LOG_WARNING 4 + #define LOG_NOTICE 5 + #define LOG_INFO 6 + #define LOG_DEBUG 7 +#else + #include +#endif + +#define LOG_STACK 255 + +void logprintf1(int prio, char *file, int line, const char *format_str, ...); +void logprintf(int prio, const char *format_str, ...); +void logperror(int prio, const char *s); +void *logloop(void *param); +void log_file_enable(void); +void log_file_disable(void); +void log_shell_enable(void); +void log_shell_disable(void); +int log_file_set(char *file); +void log_level_set(int level); +int log_level_get(void); +int log_gc(void); +void logerror(const char *format_str, ...); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/mail.c b/lib/ESPiLight/pilight/libs/pilight/core/mail.c new file mode 100644 index 0000000..0d900eb --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/mail.c @@ -0,0 +1,695 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #if _WIN32_WINNT < 0x0501 + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0501 + #endif + #define WIN32_LEAN_AND_MEAN + #include + #include + #define MSG_NOSIGNAL 0 +#else + #include + #include + #include + #include + #include + #include + #include +#endif +#include + +#include "ssl.h" +#include "eventpool.h" +#include "../../libuv/uv.h" + +#include "network.h" +#include "log.h" +#include "mail.h" + +#define USERAGENT "pilight" + +#define UNSUPPORTED 0 +#define AUTHPLAIN 1 +#define STARTTLS 2 + +#define SMTP_STEP_RECV_WELCOME 0 +#define SMTP_STEP_SEND_HELLO 1 +#define SMTP_STEP_RECV_HELLO 2 +#define SMTP_STEP_SEND_STARTTLS 3 +#define SMTP_STEP_RECV_STARTTLS 4 +#define SMTP_STEP_SEND_AUTH 5 +#define SMTP_STEP_RECV_AUTH 6 +#define SMTP_STEP_SEND_FROM 7 +#define SMTP_STEP_RECV_FROM 8 +#define SMTP_STEP_SEND_TO 9 +#define SMTP_STEP_RECV_TO 10 +#define SMTP_STEP_SEND_DATA 11 +#define SMTP_STEP_RECV_DATA 12 +#define SMTP_STEP_SEND_BODY 13 +#define SMTP_STEP_RECV_BODY 14 +#define SMTP_STEP_SEND_RESET 15 +#define SMTP_STEP_RECV_RESET 16 +#define SMTP_STEP_SEND_QUIT 17 +#define SMTP_STEP_RECV_QUIT 18 +#define SMTP_STEP_END 99 + +typedef struct request_t { + const char *host; + const char *login; + const char *pass; + unsigned short port; + + char *content; + int content_len; + int step; + int authtype; + int reading; + int sending; + int bytes_read; + void (*callback)(int, struct mail_t *); + + struct mail_t *mail; + + mbedtls_ssl_context ssl; +} request_t; + +static void close_cb(uv_handle_t *handle) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + FREE(handle); +} + +static void abort_cb(uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct request_t *request = custom_poll_data->data; + int fd = -1, r = 0; + + if((r = uv_fileno((uv_handle_t *)req, (uv_os_fd_t *)&fd)) != 0) { + logprintf(LOG_ERR, "uv_fileno: %s", uv_strerror(r)); /*LCOV_EXCL_LINE*/ + } + + if(request != NULL && request->callback != NULL) { + request->callback(-1, request->mail); + } + + if(fd > -1) { +#ifdef _WIN32 + shutdown(fd, SD_BOTH); + closesocket(fd); +#else + shutdown(fd, SHUT_RDWR); + close(fd); +#endif + } + + uv_poll_stop(req); + if(!uv_is_closing((uv_handle_t *)req)) { + uv_close((uv_handle_t *)req, close_cb); + } + + if(custom_poll_data != NULL) { + uv_custom_poll_free(custom_poll_data); + } + + if(request != NULL) { + FREE(request); + } +} + +static void custom_close_cb(uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + abort_cb(req); +} + +static void read_cb(uv_poll_t *req, ssize_t *nread, char *buf) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct request_t *request = custom_poll_data->data; + char buffer[BUFFER_SIZE], testme[256], ch = 0; + int val = 0, n = 0; + memset(&buffer, '\0', BUFFER_SIZE); + + if(*nread == -1) { + /* + * We are disconnected + */ + abort_cb(req); + return; + } + + if(*nread > 0) { + buf[*nread-1] = '\0'; + } + + switch(request->step) { + case SMTP_STEP_RECV_WELCOME: { + if(strncmp(buf, "220", 3) != 0) { + uv_custom_close(req); + return; + } + request->bytes_read = 0; + *nread = 0; + request->step = SMTP_STEP_SEND_HELLO; + uv_custom_write(req); + } break; + case SMTP_STEP_RECV_HELLO: { + char **array = NULL; + int i = 0; + n = explode(buf, "\r\n", &array); + for(i=0;iauthtype = AUTHPLAIN; + } + } + if(strncmp(testme, "STARTTLS", 8) == 0) { + request->authtype = STARTTLS; + } + } + + if(val == 501 && ch == 32) { + array_free(&array, n); + uv_custom_close(req); + logprintf(LOG_NOTICE, "SMTP: EHLO error"); + return; + } + if(val == 250 && ch == 32) { + request->reading = 0; + request->bytes_read = 0; + if(request->authtype == UNSUPPORTED) { + logprintf(LOG_NOTICE, "SMTP: no supported authentication method"); + array_free(&array, n); + uv_custom_close(req); + return; + } + if(request->authtype == STARTTLS) { + request->step = SMTP_STEP_SEND_STARTTLS; + } else { + request->step = SMTP_STEP_SEND_AUTH; + } + uv_custom_write(req); + break; + } + } + array_free(&array, n); + if(request->reading == 1) { + uv_custom_read(req); + return; + } + *nread = 0; + } break; + case SMTP_STEP_RECV_AUTH: { + if(strncmp(buf, "235", 3) == 0) { + request->step = SMTP_STEP_SEND_FROM; + } + if(strncmp(buf, "451", 3) == 0) { + logprintf(LOG_NOTICE, "SMTP: protocol violation while authenticating"); + uv_custom_close(req); + return; + } + if(strncmp(buf, "501", 3) == 0) { + logprintf(LOG_NOTICE, "SMTP: improperly base64 encoded user/password"); + uv_custom_close(req); + return; + } + if(strncmp(buf, "535", 3) == 0) { + logprintf(LOG_NOTICE, "SMTP: authentication failed: wrong user/password"); + uv_custom_close(req); + return; + } + *nread = 0; + request->step = SMTP_STEP_SEND_FROM; + uv_custom_write(req); + } break; + case SMTP_STEP_RECV_FROM: { + if(strncmp(buf, "250", 3) != 0) { + uv_custom_close(req); + return; + } + request->bytes_read = 0; + *nread = 0; + request->step = SMTP_STEP_SEND_TO; + uv_custom_write(req); + } break; + case SMTP_STEP_RECV_TO: { + if(strncmp(buf, "250", 3) != 0) { + uv_custom_close(req); + return; + } + request->bytes_read = 0; + *nread = 0; + request->step = SMTP_STEP_SEND_DATA; + uv_custom_write(req); + } break; + case SMTP_STEP_RECV_DATA: { + if(strncmp(buf, "354", 3) != 0) { + uv_custom_close(req); + return; + } + request->bytes_read = 0; + *nread = 0; + request->step = SMTP_STEP_SEND_BODY; + uv_custom_write(req); + } break; + case SMTP_STEP_RECV_BODY: { + if(strncmp(buf, "250", 3) != 0) { + uv_custom_close(req); + return; + } + request->bytes_read = 0; + *nread = 0; + request->step = SMTP_STEP_SEND_RESET; + uv_custom_write(req); + } break; + case SMTP_STEP_RECV_RESET: { + if(strncmp(buf, "250", 3) != 0) { + uv_custom_close(req); + return; + } + request->bytes_read = 0; + *nread = 0; + request->step = SMTP_STEP_SEND_QUIT; + uv_custom_write(req); + } break; + case SMTP_STEP_RECV_QUIT: { + logprintf(LOG_INFO, "SMTP: successfully send mail"); + if(request->callback != NULL) { + request->callback(0, request->mail); + } + request->callback = NULL; + uv_custom_close(req); + // if(!uv_is_closing((uv_handle_t *)req)) { + // uv_close((uv_handle_t *)req, close_cb); + // } + // uv_custom_poll_free(custom_poll_data); + // FREE(request); + return; + } break; + case SMTP_STEP_RECV_STARTTLS: { + if(strncmp(buf, "220", 3) == 0) { + custom_poll_data->is_ssl = 1; + + request->bytes_read = 0; + *nread = 0; + request->step = SMTP_STEP_SEND_HELLO; + uv_custom_write(req); + } + } break; + } +} + +static void push_data(uv_poll_t *req, int step) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct request_t *request = custom_poll_data->data; + + iobuf_append(&custom_poll_data->send_iobuf, (void *)request->content, request->content_len); + + if(request->content != NULL) { + FREE(request->content); + } + request->content_len = 0; + request->step = step; + request->reading = 1; + + uv_custom_write(req); + uv_custom_read(req); +} + +static void write_cb(uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct request_t *request = custom_poll_data->data; + + switch(request->step) { + case SMTP_STEP_RECV_WELCOME: { + push_data(req, SMTP_STEP_RECV_WELCOME); + } break; + case SMTP_STEP_SEND_HELLO: { + request->content_len = strlen("EHLO \r\n")+strlen(USERAGENT)+1; + if((request->content = REALLOC(request->content, request->content_len+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + request->content_len = (size_t)snprintf(request->content, request->content_len, "EHLO %s\r\n", USERAGENT); + /*LCOV_EXCL_START*/ + if(pilight.debuglevel >= 2) { + fprintf(stderr, "SMTP: %s\n", request->content); + } + /*LCOV_EXCL_STOP*/ + + push_data(req, SMTP_STEP_RECV_HELLO); + } break; + case SMTP_STEP_SEND_AUTH: { + request->content_len = strlen(request->login)+strlen(request->pass)+2; + char *authstr = MALLOC(request->content_len), *hash = NULL; + if(authstr == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(authstr, '\0', request->content_len); + strncpy(&authstr[1], request->login, strlen(request->login)); + strncpy(&authstr[2+strlen(request->login)], request->pass, request->content_len-strlen(request->login)-2); + hash = base64encode(authstr, request->content_len); + FREE(authstr); + + request->content_len = strlen("AUTH PLAIN \r\n")+strlen(hash)+1; + if((request->content = REALLOC(request->content, request->content_len+4)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(request->content, '\0', request->content_len); + request->content_len = snprintf(request->content, request->content_len, "AUTH PLAIN %s\r\n", hash); + FREE(hash); + /*LCOV_EXCL_START*/ + if(pilight.debuglevel >= 2) { + fprintf(stderr, "SMTP: AUTH PLAIN XXX\n"); + } + /*LCOV_EXCL_STOP*/ + push_data(req, SMTP_STEP_RECV_AUTH); + } break; + case SMTP_STEP_SEND_FROM: { + request->content_len = strlen("MAIL FROM: <>\r\n")+strlen(request->mail->from)+1; + if((request->content = REALLOC(request->content, request->content_len+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + request->content_len = (size_t)snprintf(request->content, request->content_len, "MAIL FROM: <%s>\r\n", request->mail->from); + /*LCOV_EXCL_START*/ + if(pilight.debuglevel >= 2) { + fprintf(stderr, "SMTP: %s\n", request->content); + } + /*LCOV_EXCL_STOP*/ + push_data(req, SMTP_STEP_RECV_FROM); + } break; + case SMTP_STEP_SEND_TO: { + request->content_len = strlen("RCPT TO: <>\r\n")+strlen(request->mail->to)+1; + if((request->content = REALLOC(request->content, request->content_len+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + request->content_len = (size_t)snprintf(request->content, request->content_len, "RCPT TO: <%s>\r\n", request->mail->to); + /*LCOV_EXCL_START*/ + if(pilight.debuglevel >= 2) { + fprintf(stderr, "SMTP: %s\n", request->content); + } + /*LCOV_EXCL_STOP*/ + push_data(req, SMTP_STEP_RECV_TO); + } break; + case SMTP_STEP_SEND_DATA: { + request->content_len = strlen("DATA\r\n"); + if((request->content = REALLOC(request->content, request->content_len+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strncpy(request->content, "DATA\r\n", request->content_len); + /*LCOV_EXCL_START*/ + if(pilight.debuglevel >= 2) { + fprintf(stderr, "SMTP: %s\n", request->content); + } + /*LCOV_EXCL_STOP*/ + push_data(req, SMTP_STEP_RECV_DATA); + } break; + case SMTP_STEP_SEND_BODY: { + request->content_len = 255; + request->content_len += strlen(request->mail->to); + request->content_len += strlen(request->mail->from); + request->content_len += strlen(request->mail->subject); + request->content_len += strlen(request->mail->message); + + if((request->content = REALLOC(request->content, request->content_len+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + request->content_len = (size_t)snprintf(request->content, request->content_len, + "Subject: %s\r\n" + "From: <%s>\r\n" + "To: <%s>\r\n" + "Content-Type: text/plain\r\n" + "Mime-Version: 1.0\r\n" + "X-Mailer: Emoticode smtp_send\r\n" + "Content-Transfer-Encoding: 7bit\r\n\r\n" + "%s" + "\r\n.\r\n", + request->mail->subject, request->mail->from, request->mail->to, request->mail->message); + /*LCOV_EXCL_START*/ + if(pilight.debuglevel >= 2) { + fprintf(stderr, "SMTP: %s\n", request->content); + } + /*LCOV_EXCL_STOP*/ + push_data(req, SMTP_STEP_RECV_BODY); + } break; + case SMTP_STEP_SEND_RESET: { + request->content_len = strlen("RSET\r\n"); + if((request->content = REALLOC(request->content, request->content_len+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strncpy(request->content, "RSET\r\n", request->content_len); + /*LCOV_EXCL_START*/ + if(pilight.debuglevel >= 2) { + fprintf(stderr, "SMTP: %s\n", request->content); + } + /*LCOV_EXCL_STOP*/ + push_data(req, SMTP_STEP_RECV_RESET); + } break; + case SMTP_STEP_SEND_QUIT: { + request->content_len = strlen("QUIT\r\n"); + if((request->content = REALLOC(request->content, request->content_len+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strncpy(request->content, "QUIT\r\n", request->content_len); + /*LCOV_EXCL_START*/ + if(pilight.debuglevel >= 2) { + fprintf(stderr, "SMTP: %s\n", request->content); + } + /*LCOV_EXCL_STOP*/ + push_data(req, SMTP_STEP_RECV_QUIT); + } break; + case SMTP_STEP_SEND_STARTTLS: { + request->content_len = strlen("STARTTLS\r\n"); + if((request->content = REALLOC(request->content, request->content_len+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strncpy(request->content, "STARTTLS\r\n", request->content_len); + /*LCOV_EXCL_START*/ + if(pilight.debuglevel >= 2) { + fprintf(stderr, "SMTP: %s\n", request->content); + } + /*LCOV_EXCL_STOP*/ + push_data(req, SMTP_STEP_RECV_STARTTLS); + } break; + } +} + +int sendmail(char *host, char *login, char *pass, unsigned short port, int is_ssl, struct mail_t *mail, void (*callback)(int, struct mail_t *)) { + struct request_t *request = NULL; + struct uv_custom_poll_t *custom_poll_data = NULL; + struct sockaddr_in addr4; + struct sockaddr_in6 addr6; + char *ip = NULL; + int type = 0, sockfd = 0, r = 0; + + if(mail->from == NULL) { + logprintf(LOG_ERR, "SMTP: sender not set"); + return -1; + } + if(mail->subject == NULL) { + logprintf(LOG_ERR, "SMTP: subject not set"); + return -1; + } + if(mail->message == NULL) { + logprintf(LOG_ERR, "SMTP: message not set"); + return -1; + } + if(mail->to == NULL) { + logprintf(LOG_ERR, "SMTP: recipient not set"); + return -1; + } + if(strcmp(mail->message, ".") == 0) { + logprintf(LOG_ERR, "SMTP: message cannot be a single ."); + return -1; + } + + if((request = MALLOC(sizeof(struct request_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(request, 0, sizeof(struct request_t)); + request->host = host; + request->login = login; + request->pass = pass; + request->port = port; + request->mail = mail; + request->authtype = UNSUPPORTED; + request->callback = callback; + +#ifdef _WIN32 + WSADATA wsa; + + if(WSAStartup(0x202, &wsa) != 0) { + logprintf(LOG_ERR, "WSAStartup"); + exit(EXIT_FAILURE); + } +#endif + + type = host2ip(host, &ip); + switch(type) { + case AF_INET: { + memset(&addr4, '\0', sizeof(struct sockaddr_in)); + r = uv_ip4_addr(ip, port, &addr4); + if(r != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_ip4_addr: %s", uv_strerror(r)); + goto free; + /*LCOV_EXCL_END*/ + } + } break; + case AF_INET6: { + memset(&addr6, '\0', sizeof(struct sockaddr_in6)); + r = uv_ip6_addr(ip, port, &addr6); + if(r != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_ip6_addr: %s", uv_strerror(r)); + goto free; + /*LCOV_EXCL_END*/ + } + } break; + default: { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "host2ip"); + goto free; + /*LCOV_EXCL_END*/ + } break; + } + FREE(ip); + + if((sockfd = socket(type, SOCK_STREAM, 0)) < 0){ + logprintf(LOG_ERR, "socket: %s", strerror(errno)); /*LCOV_EXCL_LINE*/ + goto free; + } + +#ifdef _WIN32 + unsigned long on = 1; + ioctlsocket(sockfd, FIONBIO, &on); +#else + long arg = fcntl(sockfd, F_GETFL, NULL); + fcntl(sockfd, F_SETFL, arg | O_NONBLOCK); +#endif + + switch(type) { + case AF_INET: { + r = connect(sockfd, (struct sockaddr *)&addr4, sizeof(addr4)); + } break; + case AF_INET6: { + r = connect(sockfd, (struct sockaddr *)&addr6, sizeof(addr6)); + } break; + default: { + } break; + } + if(r < 0) { +#ifdef _WIN32 + if(!(WSAGetLastError() == WSAEWOULDBLOCK || WSAGetLastError() == WSAEISCONN)) { +#else + if(!(errno == EINPROGRESS || errno == EISCONN)) { +#endif + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "connect: %s", strerror(errno)); + goto free; + /*LCOV_EXCL_STOP*/ + } + } + + uv_poll_t *poll_req = NULL; + if((poll_req = MALLOC(sizeof(uv_poll_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + uv_custom_poll_init(&custom_poll_data, poll_req, (void *)request); + + custom_poll_data->is_ssl = is_ssl; + + if(custom_poll_data->is_ssl == 1 && ssl_client_init_status() == -1) { + logprintf(LOG_ERR, "secure e-mails require a properly initialized SSL library"); + abort_cb(poll_req); + return -1; + } + custom_poll_data->write_cb = write_cb; + custom_poll_data->read_cb = read_cb; + custom_poll_data->close_cb = custom_close_cb; + + r = uv_poll_init_socket(uv_default_loop(), poll_req, sockfd); + if(r != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_poll_init_socket: %s", uv_strerror(r)); + FREE(poll_req); + goto free; + /*LCOV_EXCL_STOP*/ + } + + request->step = SMTP_STEP_RECV_WELCOME; + uv_custom_write(poll_req); + + return 0; + +free: + if(request != NULL && request->callback != NULL) { + request->callback(-1, request->mail); + } + FREE(request); + if(custom_poll_data != NULL) { + uv_custom_poll_free(custom_poll_data); + } + if(sockfd > 0) { +#ifdef _WIN32 + closesocket(sockfd); +#else + close(sockfd); +#endif + } + return -1; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/mail.h b/lib/ESPiLight/pilight/libs/pilight/core/mail.h new file mode 100644 index 0000000..41504d9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/mail.h @@ -0,0 +1,21 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _MAIL_H_ +#define _MAIL_H_ + +typedef struct mail_t { + char *from; + char *to; + char *subject; + char *message; +} mail_t; + +int sendmail(char *, char *, char *, unsigned short, int, struct mail_t *, void (*)(int, struct mail_t *)); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/mem.c b/lib/ESPiLight/pilight/libs/pilight/core/mem.c new file mode 100644 index 0000000..f3016cb --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/mem.c @@ -0,0 +1,296 @@ +/* + Copyright (C) 2013 - 2015 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifdef _MSC_VER + #define _CRT_SECURE_NO_DEPRECATE + #define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif + #include + #include +#else + #include + #define strdup(a) _strdup(a) +#endif + +#include "mem.h" + +static unsigned short memdbg = 0; +static int lockinit = 0; +static unsigned long openallocs = 0; +static unsigned long totalnrallocs = 0; +#ifdef _WIN32 + HANDLE lock; +#else + static pthread_mutex_t lock; + static pthread_mutexattr_t attr; +#endif + +struct mallocs_t { + void *p; + unsigned long size; + int line; + char file[255]; + struct mallocs_t *next; +} mallocs_t; + +static struct mallocs_t *mallocs = NULL; + +void memtrack(void) { + memdbg = 1; + + if(lockinit == 0) { + lockinit = 1; +#ifdef _WIN32 + lock = CreateMutex(NULL, FALSE, NULL); +#else + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&lock, &attr); +#endif + } +} + +int xfree(void) { + if(memdbg == 1) { +#ifdef _WIN32 + DWORD dwWaitResult = WaitForSingleObject(lock, INFINITE); +#else + pthread_mutex_lock(&lock); +#endif + unsigned long totalsize = 0; + struct mallocs_t *tmp; + while(mallocs) { + tmp = mallocs; + totalsize += mallocs->size; + fprintf(stderr, "WARNING: unfreed pointer (%p) in %s at line #%d\n", mallocs->p, tmp->file, tmp->line); + free(mallocs->p); + mallocs = mallocs->next; + free(tmp); + } + free(mallocs); +#ifdef _WIN32 + ReleaseMutex(lock); +#else + pthread_mutex_unlock(&lock); +#endif + + /*fprintf(stderr, "%s: leaked %lu bytes from pilight libraries and programs.\n", + (totalsize > 0) ? "ERROR" : "NOTICE", totalsize); + fprintf(stderr, "NOTICE: memory allocations total: %lu, still open: %lu\n", totalnrallocs, openallocs);*/ + totalnrallocs = 0; + memdbg = 2; + } + return openallocs; +} + +void *__malloc(unsigned long a, const char *file, int line) { + if(memdbg == 1) { + struct mallocs_t *node = malloc(sizeof(mallocs_t)); + if((node->p = malloc(a)) == NULL) { + fprintf(stderr, "out of memory in %s at line #%d\n", file, line); + free(node); + xfree(); + exit(EXIT_FAILURE); + } +#ifdef _WIN32 + InterlockedIncrement(&openallocs); + InterlockedIncrement(&totalnrallocs); +#else + __sync_add_and_fetch(&openallocs, 1); + __sync_add_and_fetch(&totalnrallocs, 1); +#endif + node->size = a; + node->line = line; + strcpy(node->file, file); + +#ifdef _WIN32 + DWORD dwWaitResult = WaitForSingleObject(lock, INFINITE); +#else + pthread_mutex_lock(&lock); +#endif + node->next = mallocs; + mallocs = node; +#ifdef _WIN32 + ReleaseMutex(lock); +#else + pthread_mutex_unlock(&lock); +#endif + + return node->p; + } else { + return malloc(a); + } +} + +char *___strdup(char *a, const char *file, int line) { + char *d = __malloc(strlen(a) + 1, file, line); + if(d == NULL) { + return NULL; + } + strcpy(d, a); + return d; +} + +void *__realloc(void *a, unsigned long b, const char *file, int line) { + if(memdbg == 1) { + if(a == NULL) { + return __malloc(b, file, line); + } else { +#ifdef _WIN32 + DWORD dwWaitResult = WaitForSingleObject(lock, INFINITE); +#else + pthread_mutex_lock(&lock); +#endif + struct mallocs_t *tmp = mallocs; + while(tmp) { + if(tmp->p == a) { + tmp->line = line; + strcpy(tmp->file, file); + tmp->size = b; + if((a = realloc(a, b)) == NULL) { + fprintf(stderr, "out of memory in %s at line #%d\n", file, line); +#ifdef _WIN32 + ReleaseMutex(lock); +#else + pthread_mutex_unlock(&lock); +#endif + xfree(); + exit(EXIT_FAILURE); + } + tmp->p = a; + break; + } + tmp = tmp->next; + } +#ifdef _WIN32 + ReleaseMutex(lock); +#else + pthread_mutex_unlock(&lock); +#endif + if(tmp == NULL) { + fprintf(stderr, "ERROR: calling realloc on an unknown pointer in %s at line #%d\n", file, line); + return __malloc(b, file, line); + } else if(tmp != NULL && tmp->p != NULL) { + return a; + } else { + return __malloc(b, file, line); + } + } + } else { + return realloc(a, b); + } +} + +void *__calloc(unsigned long a, unsigned long b, const char *file, int line) { + if(memdbg == 1) { + struct mallocs_t *node = malloc(sizeof(mallocs_t)); + if((node->p = malloc(a*b)) == NULL) { + fprintf(stderr, "out of memory in %s at line #%d\n", file, line); + free(node); + xfree(); + exit(EXIT_FAILURE); + } +#ifdef _WIN32 + InterlockedIncrement(&openallocs); + InterlockedIncrement(&totalnrallocs); +#else + __sync_add_and_fetch(&openallocs, 1); + __sync_add_and_fetch(&totalnrallocs, 1); +#endif + memset(node->p, '\0', a*b); + node->size = a*b; + node->line = line; + strcpy(node->file, file); + +#ifdef _WIN32 + DWORD dwWaitResult = WaitForSingleObject(lock, INFINITE); +#else + pthread_mutex_lock(&lock); +#endif + node->next = mallocs; + mallocs = node; +#ifdef _WIN32 + ReleaseMutex(lock); +#else + pthread_mutex_unlock(&lock); +#endif + + return node->p; + } else { + return calloc(a, b); + } +} + +void __free(void *a, const char *file, int line) { + if(memdbg == 2) { + fprintf(stderr, "WARNING: calling free after xfree was called in %s at line #%d\n", file, line); + } + if(memdbg == 1) { + if(a == NULL) { + fprintf(stderr, "WARNING: calling free on already freed pointer in %s at line #%d\n", file, line); + } else { +#ifdef _WIN32 + DWORD dwWaitResult = WaitForSingleObject(lock, INFINITE); +#else + pthread_mutex_lock(&lock); +#endif + struct mallocs_t *currP, *prevP; + int match = 0; + + prevP = NULL; + + for(currP = mallocs; currP != NULL; prevP = currP, currP = currP->next) { + if(currP->p == a) { + match = 1; + if(prevP == NULL) { + mallocs = currP->next; + } else { + prevP->next = currP->next; + } + free(currP->p); + free(currP); + + break; + } + } +#ifdef _WIN32 + ReleaseMutex(lock); + InterlockedDecrement(&openallocs); +#else + __sync_add_and_fetch(&openallocs, -1); + pthread_mutex_unlock(&lock); +#endif + + if(match == 0) { + fprintf(stderr, "ERROR: trying to free an unknown pointer in %s at line #%d\n", file, line); + free(a); + } + } + } else { + free(a); + } +} diff --git a/lib/ESPiLight/src/pilight/libs/pilight/core/mem.h b/lib/ESPiLight/pilight/libs/pilight/core/mem.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/core/mem.h rename to lib/ESPiLight/pilight/libs/pilight/core/mem.h diff --git a/lib/ESPiLight/pilight/libs/pilight/core/network.c b/lib/ESPiLight/pilight/libs/pilight/core/network.c new file mode 100644 index 0000000..fa0c993 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/network.c @@ -0,0 +1,681 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef __FreeBSD__ + #define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#ifdef _WIN32 + #if _WIN32_WINNT < 0x0501 + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0501 + #endif + #include + #include + #include + #include + #include + #include +#else + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include +#endif +#include +#include +#include +#include +#include +#include +#ifndef __USE_XOPEN + #define __USE_XOPEN +#endif +#include +#include +#include +#ifdef __FreeBSD__ + #include +#endif + +#include "../config/settings.h" +#include "mem.h" +#include "network.h" +#include "log.h" + +static unsigned int ***whitelist_cache = NULL; +static unsigned int whitelist_number; + +int inetdevs(char ***array) { + unsigned int nrdevs = 0, i = 0, match = 0; + +#ifdef _WIN32 + IP_ADAPTER_INFO *pAdapter = NULL; + ULONG buflen = sizeof(IP_ADAPTER_INFO); + IP_ADAPTER_INFO *pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(buflen); + + if(GetAdaptersInfo(pAdapterInfo, &buflen) == ERROR_BUFFER_OVERFLOW) { + FREE(pAdapterInfo); + pAdapterInfo = MALLOC(buflen); + } + + if(GetAdaptersInfo(pAdapterInfo, &buflen) == NO_ERROR) { + for(pAdapter = pAdapterInfo; pAdapter; pAdapter = pAdapter->Next) { + match = 0; + + for(i=0;iAdapterName) == 0) { + match = 1; + break; + } + } + if(match == 0 && strcmp(pAdapter->IpAddressList.IpAddress.String, "0.0.0.0") != 0) { + if((*array = REALLOC(*array, sizeof(char *)*(nrdevs+1))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if(((*array)[nrdevs] = MALLOC(strlen(pAdapter->AdapterName)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy((*array)[nrdevs], pAdapter->AdapterName); + nrdevs++; + } + } + } + if(pAdapterInfo != NULL) { + FREE(pAdapterInfo); + } +#else + int family = 0, s = 0; + char host[NI_MAXHOST]; + struct ifaddrs *ifaddr = NULL, *ifa = NULL; + +#ifdef __FreeBSD__ + if(rep_getifaddrs(&ifaddr) == -1) { + logprintf(LOG_ERR, "could not get network adapter information"); + exit(EXIT_FAILURE); + } +#else + if(getifaddrs(&ifaddr) == -1) { + perror("getifaddrs"); + exit(EXIT_FAILURE); + } +#endif + + for(ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + if(ifa->ifa_addr == NULL) { + continue; + } + + family = ifa->ifa_addr->sa_family; + + if((strstr(ifa->ifa_name, "lo") == NULL && strstr(ifa->ifa_name, "vbox") == NULL + && strstr(ifa->ifa_name, "dummy") == NULL) && (family == AF_INET || family == AF_INET6)) { + memset(host, '\0', NI_MAXHOST); + + s = getnameinfo(ifa->ifa_addr, + (family == AF_INET) ? sizeof(struct sockaddr_in) : + sizeof(struct sockaddr_in6), + host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); + if(s != 0) { + logprintf(LOG_ERR, "getnameinfo() failed: %s", gai_strerror(s)); + exit(EXIT_FAILURE); + } + if(strlen(host) > 0) { + match = 0; + for(i=0;iifa_name) == 0) { + match = 1; + break; + } + } + if(match == 0) { + if((*array = REALLOC(*array, sizeof(char *)*(nrdevs+1))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if(((*array)[nrdevs] = MALLOC(strlen(ifa->ifa_name)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy((*array)[nrdevs], ifa->ifa_name); + nrdevs++; + } + } + } + } + +#ifdef __FreeBSD__ + rep_freeifaddrs(ifaddr); +#else + freeifaddrs(ifaddr); +#endif + +#endif // _WIN32 + return (int)nrdevs; +} + +int dev2mac(char *ifname, char **mac) { + memset(*mac, 0, ETH_ALEN); + +#ifdef _WIN32 + int i = 0; + + IP_ADAPTER_INFO *pAdapter = NULL; + ULONG buflen = sizeof(IP_ADAPTER_INFO); + IP_ADAPTER_INFO *pAdapterInfo = malloc(buflen); + + if(GetAdaptersInfo(pAdapterInfo, &buflen) == ERROR_BUFFER_OVERFLOW) { + free(pAdapterInfo); + pAdapterInfo = malloc(buflen); + } + + if(GetAdaptersInfo(pAdapterInfo, &buflen) == NO_ERROR) { + for(pAdapter = pAdapterInfo; pAdapter; pAdapter = pAdapter->Next) { + if(strcmp(ifname, pAdapter->AdapterName) == 0) { + for(i = 0; i < pAdapter->AddressLength; i++) { + memcpy(*mac, pAdapter->Address, ETH_ALEN); + free(pAdapterInfo); + return 0; + } + break; + } + } + } + free(pAdapterInfo); +#endif + +#ifdef linux + int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); + struct ifreq s; + + if(fd < 0) { + logprintf(LOG_ERR, "could not open new socket"); + return -1; + } + + memset(&s, '\0', sizeof(struct ifreq)); + strcpy(s.ifr_name, ifname); + if(ioctl(fd, SIOCGIFHWADDR, &s) == 0) { + memcpy(*mac, s.ifr_addr.sa_data, ETH_ALEN); + close(fd); + return 0; + } else { + logprintf(LOG_ERR, "ioctl SIOCGIFHWADDR failed"); + } + close(fd); +#endif + +#ifdef __FreeBSD__ + struct ifaddrs *ifap = NULL, *ifaptr = NULL; + + if(getifaddrs(&ifap) == 0) { + for(ifaptr = ifap; ifaptr != NULL; ifaptr = (ifaptr)->ifa_next) { + if(strcmp((ifaptr)->ifa_name, ifname) == 0 && (((ifaptr)->ifa_addr)->sa_family == AF_LINK)) { + memcpy(*mac, (unsigned char *)LLADDR((struct sockaddr_dl *)(ifaptr)->ifa_addr), ETH_ALEN); + freeifaddrs(ifap); + return 0; + } + } + } +#endif + + return -1; +} + +#ifdef __FreeBSD__ +int dev2ip(char *dev, char **ip, __sa_family_t type) { +#else +int dev2ip(char *dev, char **ip, sa_family_t type) { +#endif + +#ifdef _WIN32 + IP_ADAPTER_INFO *pAdapter = NULL; + ULONG buflen = sizeof(IP_ADAPTER_INFO); + IP_ADAPTER_INFO *pAdapterInfo = MALLOC(buflen); + + if(GetAdaptersInfo(pAdapterInfo, &buflen) == ERROR_BUFFER_OVERFLOW) { + FREE(pAdapterInfo); + pAdapterInfo = MALLOC(buflen); + } + + if(GetAdaptersInfo(pAdapterInfo, &buflen) == NO_ERROR) { + for(pAdapter = pAdapterInfo; pAdapter; pAdapter = pAdapter->Next) { + if(strcmp(dev, pAdapter->AdapterName) == 0) { + strcpy(*ip, pAdapter->IpAddressList.IpAddress.String); + break; + } + } + } + if(pAdapterInfo != NULL) { + FREE(pAdapterInfo); + } +#else + struct ifaddrs *ifaddr, *ifa; + char host[NI_MAXHOST]; + int family, s, n; + + if(getifaddrs(&ifaddr) == -1) { + perror("getifaddrs"); + exit(EXIT_FAILURE); + } + + /* Walk through linked list, maintaining head pointer so we can free list later */ + for(ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) { + if(ifa->ifa_addr == NULL) + continue; + family = ifa->ifa_addr->sa_family; + if(strcmp(ifa->ifa_name, dev) == 0 && family == type) { + s = getnameinfo(ifa->ifa_addr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); + if(s != 0) { + printf("getnameinfo() failed: %s\n", gai_strerror(s)); + exit(EXIT_FAILURE); + } + strcpy(*ip, host); + } + } + + freeifaddrs(ifaddr); +#endif + + return 0; +} + +int host2ip(char *host, char **ip) { + int rv = 0; + struct addrinfo hints, *servinfo, *p; + +#ifdef _WIN32 + WSADATA wsa; + + if(WSAStartup(0x202, &wsa) != 0) { + logprintf(LOG_ERR, "WSAStartup"); + exit(EXIT_FAILURE); + } +#endif + + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_INET6; + hints.ai_socktype = SOCK_STREAM; + + if((rv = getaddrinfo(host, NULL , NULL, &servinfo)) != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_NOTICE, "getaddrinfo: %s, %s", host, gai_strerror(rv)); + return -1; + /*LCOV_EXCL_STOP*/ + } + + for(p = servinfo; p != NULL; p = p->ai_next) { + if(p->ai_family == AF_INET6) { + if((*ip = MALLOC(INET6_ADDRSTRLEN+1)) == NULL) { + OUT_OF_MEMORY + } + struct sockaddr_in6 *h = NULL; + memcpy(&h, &p->ai_addr, sizeof(struct sockaddr_in6 *)); + memset(*ip, '\0', INET6_ADDRSTRLEN+1); + uv_inet_ntop(p->ai_family, (void *)&(h->sin6_addr), *ip, INET6_ADDRSTRLEN+1); + } else if(p->ai_family == AF_INET) { + if((*ip = MALLOC(INET_ADDRSTRLEN+1)) == NULL) { + OUT_OF_MEMORY + } + struct sockaddr_in *h = NULL; + memcpy(&h, &p->ai_addr, sizeof(struct sockaddr_in *)); + memset(*ip, '\0', INET_ADDRSTRLEN+1); + uv_inet_ntop(p->ai_family, (void *)&(h->sin_addr), *ip, INET_ADDRSTRLEN+1); + } + if(*ip != NULL && strlen(*ip) > 0) { + int r = p->ai_family; + freeaddrinfo(servinfo); + return r; + } + } + + freeaddrinfo(servinfo); + return -1; +} + +#ifdef _WIN32 +const char *inet_ntop(int af, const void *src, char *dst, int cnt) { + struct sockaddr_in srcaddr; + + memset(&srcaddr, 0, sizeof(struct sockaddr_in)); + memcpy(&(srcaddr.sin_addr), src, sizeof(srcaddr.sin_addr)); + + srcaddr.sin_family = af; + if(WSAAddressToString((struct sockaddr *)&srcaddr, sizeof(struct sockaddr_in), 0, dst, (LPDWORD)&cnt) != 0) { + DWORD rv = WSAGetLastError(); + printf("WSAAddressToString() : %d\n", (int)rv); + return NULL; + } + return dst; +} + +int inet_pton(int af, const char *src, void *dst) { + struct sockaddr_storage ss; + int size = sizeof(ss); + char src_copy[INET6_ADDRSTRLEN+1]; + + ZeroMemory(&ss, sizeof(ss)); + /* stupid non-const API */ + strncpy(src_copy, src, INET6_ADDRSTRLEN+1); + src_copy[INET6_ADDRSTRLEN] = 0; + + if(WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) { + switch(af) { + case AF_INET: + *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr; + return 1; + case AF_INET6: + *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr; + return 1; + default: + return 0; + } + } + return 0; +} +#endif + +#ifdef __FreeBSD__ +struct sockaddr *sockaddr_dup(struct sockaddr *sa) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct sockaddr *ret; + socklen_t socklen; +#ifdef HAVE_SOCKADDR_SA_LEN + socklen = sa->sa_len; +#else + socklen = sizeof(struct sockaddr_storage); +#endif + if((ret = CALLOC(1, socklen)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if (ret == NULL) + return NULL; + memcpy(ret, sa, socklen); + return ret; +} + +int rep_getifaddrs(struct ifaddrs **ifap) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct ifconf ifc; + char buff[8192]; + int fd = 0, i = 0, n = 0; + struct ifreq ifr, *ifrp = NULL; + struct ifaddrs *curif = NULL, *ifa = NULL; + struct ifaddrs *lastif = NULL; + + memset(buff, 0, 8192); + + *ifap = NULL; + + if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { + return -1; + } + + memset(&ifc, 0, sizeof(struct ifconf)); + memset(&ifr, 0, sizeof(struct ifreq)); + + ifc.ifc_len = sizeof(buff); + ifc.ifc_buf = buff; + + if (ioctl(fd, SIOCGIFCONF, &ifc) != 0) { + close(fd); + return -1; + } + +#ifndef max +#define max(a,b) ((a) > (b) ? (a) : (b)) +#endif +#ifdef __FreeBSD__ +#define ifreq_size(i) max(sizeof(struct ifreq),\ + sizeof((i).ifr_name)+(i).ifr_addr.sa_len) +#else +#define ifreq_size(i) sizeof(struct ifreq) +#endif + + n = ifc.ifc_len; + + for (i = 0; i < n; i+= (int)ifreq_size(*ifrp) ) { + int match = 0; + ifrp = (struct ifreq *)((char *) ifc.ifc_buf+i); + for(ifa = *ifap; ifa != NULL; ifa = ifa->ifa_next) { + if(strcmp(ifrp->ifr_name, ifa->ifa_name) == 0) { + match = 1; + break; + } + } + if(match == 1) { + continue; + } + curif = CALLOC(1, sizeof(struct ifaddrs)); + if(curif == NULL) { + freeifaddrs(*ifap); + close(fd); + return -1; + } + + curif->ifa_name = MALLOC(IFNAMSIZ+1); + if(curif->ifa_name == NULL) { + FREE(curif); + freeifaddrs(*ifap); + close(fd); + return -1; + } + memset(curif->ifa_name, 0, IFNAMSIZ+1); + strncpy(curif->ifa_name, ifrp->ifr_name, IFNAMSIZ); + strncpy(ifr.ifr_name, ifrp->ifr_name, IFNAMSIZ); + + curif->ifa_flags = (unsigned int)ifr.ifr_flags; + curif->ifa_dstaddr = NULL; + curif->ifa_data = NULL; + curif->ifa_next = NULL; + + curif->ifa_addr = NULL; + if(ioctl(fd, SIOCGIFADDR, &ifr) != -1) { + curif->ifa_addr = sockaddr_dup(&ifr.ifr_addr); + if (curif->ifa_addr == NULL) { + FREE(curif->ifa_name); + FREE(curif); + freeifaddrs(*ifap); + close(fd); + return -1; + } + } + + curif->ifa_netmask = NULL; + if (ioctl(fd, SIOCGIFNETMASK, &ifr) != -1) { + curif->ifa_netmask = sockaddr_dup(&ifr.ifr_addr); + if (curif->ifa_netmask == NULL) { + if (curif->ifa_addr != NULL) { + FREE(curif->ifa_addr); + } + FREE(curif->ifa_name); + FREE(curif); + freeifaddrs(*ifap); + close(fd); + return -1; + } + } + + if (lastif == NULL) { + *ifap = curif; + } else { + lastif->ifa_next = curif; + } + lastif = curif; + } + + close(fd); + + return 0; +} + +void rep_freeifaddrs(struct ifaddrs *ifaddr) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct ifaddrs *ifa; + while(ifaddr) { + ifa = ifaddr; + FREE(ifa->ifa_name); + FREE(ifa->ifa_addr); + FREE(ifa->ifa_netmask); + ifaddr = ifaddr->ifa_next; + FREE(ifa); + } + FREE(ifaddr); +} +#endif + +int whitelist_check(char *ip) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char *whitelist = NULL; + unsigned int client[4] = {0}; + int x = 0, i = 0, error = 1; + unsigned int n = 0; + char **array = NULL; + char wip[16] = {'\0'}; + + /* Check if there are any whitelisted ip address */ + if(settings_find_string("whitelist", &whitelist) != 0) { + return 0; + } + + if(strlen(whitelist) == 0) { + return 0; + } + + /* Explode ip address to a 4 elements int array */ + n = explode(ip, ".", &array); + x = 0; + for(x=0;x 0) { + FREE(array); + } + + + if(whitelist_cache == NULL) { + char *tmp = whitelist; + x = 0; + /* Loop through all whitelised ip addresses */ + while(*tmp != '\0') { + /* Remove any comma's and spaces */ + while(*tmp == ',' || *tmp == ' ') { + tmp++; + } + /* Save ip address in temporary char array */ + wip[x] = *tmp; + x++; + tmp++; + + /* Each ip address is either terminated by a comma or EOL delimiter */ + if(*tmp == '\0' || *tmp == ',') { + x = 0; + if((whitelist_cache = REALLOC(whitelist_cache, (sizeof(unsigned int ***)*(whitelist_number+1)))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((whitelist_cache[whitelist_number] = MALLOC(sizeof(unsigned int **)*2)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + /* Lower boundary */ + if((whitelist_cache[whitelist_number][0] = MALLOC(sizeof(unsigned int *)*4)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + /* Upper boundary */ + if((whitelist_cache[whitelist_number][1] = MALLOC(sizeof(unsigned int *)*4)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + /* Turn the whitelist ip address into a upper and lower boundary. + If the ip address doesn't contain a wildcard, then the upper + and lower boundary are the same. If the ip address does contain + a wildcard, then this lower boundary number will be 0 and the + upper boundary number 255. */ + i = 0; + n = explode(wip, ".", &array); + for(i=0;i 0) { + FREE(array); + } + memset(wip, '\0', 16); + whitelist_number++; + } + } + } + + for(x=0;x= wlower && nip <= wupper) || (nip == 2130706433)) { + error = 0; + } + } + + return error; +} + +void whitelist_free(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + int i = 0; + if(whitelist_cache) { + for(i=0;i +*/ + +#ifndef _NETWORK_H_ +#define _NETWORK_H_ + +#ifndef _WIN32 + #include + #include + #include +#endif +#include +#include + +#include "pilight.h" + +#ifndef ETH_ALEN +#define ETH_ALEN 6 +#endif + +#ifdef _WIN32 +#define sa_family_t uint16_t +int inet_pton(int af, const char *src, void *dst); +const char *inet_ntop(int af, const void *src, char *dst, int cnt); +#endif + +int inetdevs(char ***array); +int dev2mac(char *ifname, char **mac); +#ifdef __FreeBSD__ +int dev2ip(char *dev, char **ip, __sa_family_t type); +#else +int dev2ip(char *dev, char **ip, sa_family_t type); +#endif +int host2ip(char *host, char **ip); +int whitelist_check(char *ip); +void whitelist_free(void); + +#ifdef __FreeBSD__ +struct sockaddr *sockaddr_dup(struct sockaddr *sa); +int rep_getifaddrs(struct ifaddrs **ifap); +void rep_freeifaddrs(struct ifaddrs *ifap); +#endif + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/ntp.c b/lib/ESPiLight/pilight/libs/pilight/core/ntp.c new file mode 100644 index 0000000..6fd428f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/ntp.c @@ -0,0 +1,377 @@ +/* + Copyright (C) 2014 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #if _WIN32_WINNT < 0x0501 + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0501 + #endif + #define WIN32_LEAN_AND_MEAN + #include + #include + #define MSG_NOSIGNAL 0 +#else + #ifdef __mips__ + #define __USE_UNIX98 + #endif + #include + #include + #include + #include + #include + #include +#endif +#include +#include +#include + +#include "../../libuv/uv.h" +#include "network.h" +#include "ntp.h" +#include "socket.h" +#include "pilight.h" +#include "eventpool.h" +#include "common.h" +#include "log.h" +#ifdef PILIGHT_REWRITE + #include "../storage/storage.h" +#else + #include "../config/settings.h" +#endif + +typedef struct l_fp { + union { + unsigned int Xl_ui; + int Xl_i; + } Ul_i; + union { + unsigned int Xl_uf; + int Xl_f; + } Ul_f; +} l_fp; + +typedef struct pkt { + int li_vn_mode; + int rootdelay; + int rootdispersion; + int refid; + struct l_fp ref; + struct l_fp org; + struct l_fp rec; + /* Make sure the pkg is 48 bits */ + double tmp; +} pkt; + +typedef struct data_t { + void (*callback)(int, time_t); + uv_udp_t *stream; + uv_timer_t *timer; +} data_t; + +static int nr = 0; +static int started = 0; +static int synced = 1; +static int init = 0; +static int diff = 0; +static uv_timer_t *timer_req = NULL; + +static void close_cb(uv_handle_t *handle) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + FREE(handle); +} + +static void ntp_timeout(uv_timer_t *param) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct data_t *data = param->data; + void (*callback)(int, time_t) = data->callback; + if(callback != NULL) { + callback(-1, 0); + } + + if(!uv_is_closing((uv_handle_t *)param)) { + uv_close((uv_handle_t *)param, close_cb); + } + if(!uv_is_closing((uv_handle_t *)data->stream)) { + uv_close((uv_handle_t *)data->stream, close_cb); + } + if(data != NULL) { + FREE(data); + } + + logprintf(LOG_INFO, "could not sync with ntp server: %s", ntp_servers.server[nr].host); +} + +static void restart(uv_timer_t *req) { + nr = 0; + ntpsync(); +} + +static void on_read(uv_udp_t *stream, ssize_t len, const uv_buf_t *buf, const struct sockaddr *addr, unsigned int port) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct pkt msg; + struct data_t *data = stream->data; + + if(len == 48) { + memcpy(&msg, buf->base, 48); + + if(msg.refid != 0) { + (msg.rec).Ul_i.Xl_ui = ntohl((msg.rec).Ul_i.Xl_ui); + (msg.rec).Ul_f.Xl_f = (int)ntohl((unsigned int)(msg.rec).Ul_f.Xl_f); + + unsigned int adj = 2208988800u; + unsigned long ntptime = (time_t)(msg.rec.Ul_i.Xl_ui - adj); + diff = (int)(time(NULL) - ntptime); + + synced = 0; + if(data->callback != NULL) { + data->callback(0, (time_t)(msg.rec.Ul_i.Xl_ui - adj)); + } + logprintf(LOG_INFO, "time offset found of %d seconds", diff); + uv_timer_start(timer_req, restart, 86400*1000, 0); + + if(!uv_is_closing((uv_handle_t *)stream)) { + uv_close((uv_handle_t *)stream, close_cb); + } + if(!uv_is_closing((uv_handle_t *)data->timer)) { + uv_close((uv_handle_t *)data->timer, close_cb); + } + if(data != NULL) { + FREE(data); + } + } + free(buf->base); + return; + } +} + +static void alloc(uv_handle_t *handle, size_t len, uv_buf_t *buf) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + buf->len = len; + buf->base = malloc(len); + memset(buf->base, 0, len); +} + +static void on_send(uv_udp_send_t *req, int status) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + FREE(req); +} + +static void loop(uv_timer_t *req) { + /* + * Make sure we are called from the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + if(uv_thread_equal(&pth_main_id, &pth_cur_id) == 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "ntpsync can only be started from the main thread"); + return; + /*LCOV_EXCL_STOP*/ + } + + if(init == 0) { + if((timer_req = MALLOC(sizeof(uv_timer_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + uv_timer_init(uv_default_loop(), timer_req); + init = 1; + } + + struct sockaddr_in addr4; + struct sockaddr_in6 addr6; + struct data_t *data = NULL; + uv_udp_t *client_req = NULL; + uv_udp_send_t *send_req = NULL; + uv_timer_t *timeout_req = NULL; + char *ip = NULL; + char buffer[BUFFER_SIZE]; + int r = 0, type = 0; + +#ifdef _WIN32 + WSADATA wsa; + + if(WSAStartup(0x202, &wsa) != 0) { + logprintf(LOG_ERR, "WSAStartup"); + exit(EXIT_FAILURE); + } +#endif + + type = host2ip(ntp_servers.server[nr].host, &ip); + switch(type) { + case AF_INET: { + memset(&addr4, '\0', sizeof(struct sockaddr_in)); + r = uv_ip4_addr(ip, ntp_servers.server[nr].port, &addr4); + if(r != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_ip4_addr: %s", uv_strerror(r)); + FREE(ip); + return; + /*LCOV_EXCL_END*/ + } + } break; + case AF_INET6: { + memset(&addr6, '\0', sizeof(struct sockaddr_in6)); + r = uv_ip6_addr(ip, ntp_servers.server[nr].port, &addr6); + if(r != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_ip6_addr: %s", uv_strerror(r)); + FREE(ip); + return; + /*LCOV_EXCL_END*/ + } + } break; + default: { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "host2ip"); + FREE(ip); + /*LCOV_EXCL_END*/ + } break; + } + FREE(ip); + + if((client_req = MALLOC(sizeof(uv_udp_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + r = uv_udp_init(uv_default_loop(), client_req); + if(r != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_udp_init: %s", uv_strerror(r)); + FREE(client_req); + return; + /*LCOV_EXCL_STOP*/ + } + + if((send_req = MALLOC(sizeof(uv_udp_send_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + if((timeout_req = MALLOC(sizeof(uv_timer_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + if((data = MALLOC(sizeof(struct data_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + memset(data, 0, sizeof(struct data_t)); + data->callback = ntp_servers.callback; + data->stream = client_req; + data->timer = timeout_req; + + struct pkt msg; + memset(&msg, '\0', sizeof(struct pkt)); + msg.li_vn_mode = 227; + + memcpy(&buffer, &msg, sizeof(struct pkt)); + uv_buf_t buf = uv_buf_init(buffer, sizeof(struct pkt)); + + client_req->data = data; + + switch(type) { + case AF_INET: { + r = uv_udp_send(send_req, client_req, &buf, 1, (const struct sockaddr *)&addr4, on_send); + } break; + case AF_INET6: { + r = uv_udp_send(send_req, client_req, &buf, 1, (const struct sockaddr *)&addr6, on_send); + } break; + default: { + } break; + } + if(r != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_udp_send: %s", uv_strerror(r)); + FREE(send_req); + FREE(client_req); + return; + /*LCOV_EXCL_STOP*/ + } + + timeout_req->data = data; + + uv_timer_init(uv_default_loop(), timeout_req); + uv_timer_start(timeout_req, ntp_timeout, 1000, 0); + + r = uv_udp_recv_start(client_req, alloc, on_read); + if(r != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_udp_recv_start: %s", uv_strerror(r)); + FREE(send_req); + FREE(client_req); + return; + /*LCOV_EXCL_STOP*/ + } + logprintf(LOG_DEBUG, "syncing with ntp-server %s", ntp_servers.server[nr].host); + + if(nr+1 < ntp_servers.nrservers) { + uv_timer_start(timer_req, loop, 1.5*1000, 0); + nr++; + } else { + nr = 0; + uv_timer_start(timer_req, loop, 10*1000, 0); + } + + return; +} + +void ntpsync(void) { + if(started == 1) { + return; + } + started = 1; + loop(NULL); +} + +void ntp_gc(void) { + nr = 0; + started = 0; + synced = 1; + init = 0; + diff = 0; +} + +int getntpdiff(void) { + return diff; +} + +int isntpsynced(void) { + return synced; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/ntp.h b/lib/ESPiLight/pilight/libs/pilight/core/ntp.h new file mode 100644 index 0000000..6670f22 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/ntp.h @@ -0,0 +1,30 @@ +/* + Copyright (C) 2014 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _NTP_H_ +#define _NTP_H_ + +#include "../../libuv/uv.h" + +typedef struct ntp_servers_t { + struct { + char host[255]; + int port; + } server[10]; + int nrservers; + void (*callback)(int, time_t); +} ntp_servers_t; + +struct ntp_servers_t ntp_servers; + +void ntpsync(void); +void ntp_gc(void); +int getntpdiff(void); +int isntpsynced(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/options.c b/lib/ESPiLight/pilight/libs/pilight/core/options.c new file mode 100644 index 0000000..335ca11 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/options.c @@ -0,0 +1,584 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _WIN32 + #include +#endif +#include +#include +#include + +#include "log.h" +#include "common.h" +#include "mem.h" +#include "options.h" +#include "json.h" + +static int getOptPos = 0; +static char *longarg = NULL; +static char *shortarg = NULL; +static char *gctmp = NULL; + +int options_gc(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + FREE(longarg); + FREE(shortarg); + if(gctmp != NULL) { + FREE(gctmp); + } + + logprintf(LOG_DEBUG, "garbage collected options library"); + return EXIT_SUCCESS; +} + +/* Add a value to the specific struct id */ +void options_set_string(struct options_t **opt, int id, const char *val) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct options_t *temp = *opt; + while(temp) { + if(temp->id == id && temp->id > 0) { + if((temp->string_ = REALLOC(temp->string_, strlen(val)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + temp->vartype = JSON_STRING; + strcpy(temp->string_, val); + break; + } + temp = temp->next; + } +} + +/* Add a value to the specific struct id */ +void options_set_number(struct options_t **opt, int id, double val) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct options_t *temp = *opt; + while(temp) { + if(temp->id == id && temp->id > 0) { + temp->number_ = val; + temp->vartype = JSON_NUMBER; + break; + } + temp = temp->next; + } +} + +/* Get a certain option value identified by the id */ +int options_get_string(struct options_t **opt, int id, char **out) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct options_t *temp = *opt; + *out = NULL; + while(temp) { + if(temp->id == id && temp->id > 0) { + if(temp->string_ && temp->vartype == JSON_STRING) { + *out = temp->string_; + return 0; + } else { + return 1; + } + } + temp = temp->next; + } + + return 1; +} + +/* Get a certain option value identified by the id */ +int options_get_number(struct options_t **opt, int id, double *out) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct options_t *temp = *opt; + *out = 0; + while(temp) { + if(temp->id == id && temp->id > 0) { + if(temp->vartype == JSON_NUMBER) { + *out = temp->number_; + } + return 0; + } + temp = temp->next; + } + + return 1; +} + +/* Get a certain option argument type identified by the id */ +int options_get_argtype(struct options_t **opt, int id, int *out) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct options_t *temp = *opt; + *out = 0; + while(temp) { + if(temp->id == id && temp->id > 0) { + if(temp->argtype != 0) { + *out = temp->argtype; + return 0; + } else { + return 1; + } + } + temp = temp->next; + } + + return 1; +} + +/* Get a certain option argument type identified by the id */ +int options_get_conftype(struct options_t **opt, int id, int *out) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct options_t *temp = *opt; + *out = 0; + while(temp) { + if(temp->id == id && temp->id > 0) { + if(temp->argtype != 0) { + *out = temp->conftype; + return 0; + } else { + return 1; + } + } + temp = temp->next; + } + + return 1; +} + +/* Get a certain option name identified by the id */ +int options_get_name(struct options_t **opt, int id, char **out) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct options_t *temp = *opt; + *out = NULL; + while(temp) { + if(temp->id == id && temp->id > 0) { + if(temp->name) { + *out = temp->name; + return 0; + } else { + return 1; + } + } + temp = temp->next; + } + + return 1; +} + +/* Get a certain regex mask identified by the name */ +int options_get_mask(struct options_t **opt, int id, char **out) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct options_t *temp = *opt; + *out = NULL; + while(temp) { + if(temp->id == id && temp->id > 0) { + if(temp->mask) { + *out = temp->mask; + return 0; + } else { + return 1; + } + } + temp = temp->next; + } + + return 1; +} + +/* Get a certain option id identified by the name */ +int options_get_id(struct options_t **opt, char *name, int *out) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct options_t *temp = *opt; + *out = 0; + while(temp) { + if(temp->name) { + if(strcmp(temp->name, name) == 0) { + if(temp->id > 0) { + *out = temp->id; + return 0; + } else { + return 1; + } + } + } + temp = temp->next; + } + + return 1; +} + +/* Parse all CLI arguments */ +int options_parse(struct options_t **opt, int argc, char **argv, int error_check, char **optarg) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + int c = 0; + int itmp = 0; +#if !defined(__FreeBSD__) && !defined(_WIN32) + char *mask; + regex_t regex; + int reti; +#endif + + char *ctmp = NULL; + + /* If have read all arguments, exit and reset */ + if(getOptPos>=(argc-1)) { + getOptPos=0; + if(*optarg) { + FREE(*optarg); + *optarg = NULL; + } + return -1; + } else { + getOptPos++; + /* Reserve enough memory to store all variables */ + if((longarg = REALLOC(longarg, 4)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((shortarg = REALLOC(shortarg, 2)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((*optarg = REALLOC(*optarg, 4)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + /* The memory to null */ + memset(*optarg, '\0', 4); + memset(shortarg, '\0', 2); + memset(longarg, '\0', 4); + + /* Check if the CLI character contains an equals to (=) sign. + If it does, we have probably encountered a long argument */ + if(strchr(argv[getOptPos],'=')) { + /* Copy all characters until the equals to sign. + This will probably be the name of the argument */ + if((longarg = REALLOC(longarg, strcspn(argv[getOptPos],"=")+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(longarg, '\0', strcspn(argv[getOptPos],"=")+1); + memcpy(longarg, &argv[getOptPos][0], strcspn(argv[getOptPos],"=")); + + /* Then copy everything after the equals sign. + This will probably be the value of the argument */ + size_t i = strlen(&argv[getOptPos][strcspn(argv[getOptPos],"=")+1]); + if((*optarg = REALLOC(*optarg, i+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(*optarg, '\0', i+1); + memcpy(*optarg, &argv[getOptPos][strcspn(argv[getOptPos],"=")+1], i); + } else { + /* If the argument does not contain a equals sign. + Store the argument to check later if it's a long argument */ + if((longarg = REALLOC(longarg, strlen(argv[getOptPos])+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(longarg, argv[getOptPos]); + } + + /* A short argument only contains of two characters. + So only store the first two characters */ + if((shortarg = REALLOC(shortarg, strlen(argv[getOptPos])+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(shortarg, '\0', 3); + strncpy(shortarg, argv[getOptPos], 2); + + /* Check if the short argument and the long argument are equal, + then we probably encountered a short argument. Only store the + identifier character. If there are more CLI characters + after the current one, store it as the CLI value. However, only + do this if the first character of the argument doesn't contain*/ + if(strcmp(longarg, shortarg) == 0 && (getOptPos+1) 0) { + if(error_check == 1) { + if(strcmp(longarg,shortarg) == 0) { + if(shortarg[0] == '-') { + logprintf(LOG_ERR, "invalid option -- '-%c'", c); + } else { + logprintf(LOG_ERR, "invalid option -- '%s'", longarg); + } + } else { + logprintf(LOG_ERR, "invalid option -- '%s'", longarg); + } + goto gc; + } else { + return 0; + } + /* Check if an argument cannot have an argument that was set */ + } else if(strlen(*optarg) != 0 && options_get_argtype(opt, c, &itmp) == 0 && itmp == 1) { + if(error_check == 1) { + if(strcmp(longarg,shortarg) == 0) { + logprintf(LOG_ERR, "option '-%c' doesn't take an argument", c); + } else { + logprintf(LOG_ERR, "option '%s' doesn't take an argument", longarg); + } + goto gc; + } else { + return 0; + } + /* Check if an argument required a value that wasn't set */ + } else if(strlen(*optarg) == 0 && options_get_argtype(opt, c, &itmp) == 0 && itmp == 2) { + if(error_check == 1) { + if(strcmp(longarg, shortarg) == 0) { + logprintf(LOG_ERR, "option '-%c' requires an argument", c); + } else { + logprintf(LOG_ERR, "option '%s' requires an argument", longarg); + } + goto gc; + } else { + return 0; + } + /* Check if we have a valid argument */ + } else if(c == 0) { + if(error_check == 1) { + if(shortarg[0] == '-' && strstr(shortarg, longarg) != 0) { + logprintf(LOG_ERR, "invalid option -- '-%c'", c); + } else { + logprintf(LOG_ERR, "invalid option -- '%s'", longarg); + } + goto gc; + } else { + return 0; + } + } else { + /* If the argument didn't have a value, set it to 1 */ + if(strlen(*optarg) == 0) { + options_set_string(opt, c, "1"); + } else { +#if !defined(__FreeBSD__) && !defined(_WIN32) + if(error_check != 2) { + /* If the argument has a regex mask, check if it passes */ + if(options_get_mask(opt, c, &mask) == 0) { + reti = regcomp(®ex, mask, REG_EXTENDED); + if(reti) { + logprintf(LOG_ERR, "could not compile regex"); + goto gc; + } + reti = regexec(®ex, *optarg, 0, NULL, 0); + if(reti == REG_NOMATCH || reti != 0) { + if(error_check == 1) { + if(shortarg[0] == '-') { + logprintf(LOG_ERR, "invalid format -- '-%c'", c); + } else { + logprintf(LOG_ERR, "invalid format -- '%s'", longarg); + } + logprintf(LOG_ERR, "requires %s", mask); + } + regfree(®ex); + goto gc; + } + regfree(®ex); + } + } +#endif + options_set_string(opt, c, *optarg); + } + return c; + } + } + +gc: + getOptPos=0; + FREE(*optarg); + + return -2; +} + +/* Add a new option to the options struct */ +void options_add(struct options_t **opt, int id, const char *name, int argtype, int conftype, int vartype, void *def, const char *mask) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + char *ctmp = NULL; + char *nname = MALLOC(strlen(name)+1); + int sid = 0; + if(!nname) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(nname, name); + int itmp = 0; + if(!(argtype >= 0 && argtype <= 3)) { + logprintf(LOG_CRIT, "tying to add an invalid option type"); + FREE(nname); + exit(EXIT_FAILURE); + } else if(!(conftype >= 0 && conftype <= NROPTIONTYPES)) { + logprintf(LOG_CRIT, "trying to add an option of an invalid type"); + FREE(nname); + exit(EXIT_FAILURE); + } else if(!name) { + logprintf(LOG_CRIT, "trying to add an option without name"); + FREE(nname); + exit(EXIT_FAILURE); + } else if(id != 0 && options_get_name(opt, id, &ctmp) == 0) { + logprintf(LOG_CRIT, "duplicate option id: %c", id); + FREE(nname); + exit(EXIT_FAILURE); + } else if(options_get_id(opt, nname, &sid) == 0 && + ((options_get_conftype(opt, sid, &itmp) == 0 && itmp == conftype) || + (options_get_conftype(opt, sid, &itmp) != 0))) { + logprintf(LOG_CRIT, "duplicate option name: %s", name); + FREE(nname); + exit(EXIT_FAILURE); + } else { + struct options_t *optnode = MALLOC(sizeof(struct options_t)); + if(!optnode) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + optnode->id = id; + if((optnode->name = MALLOC(strlen(name)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(optnode->name, name); + optnode->argtype = argtype; + optnode->conftype = conftype; + optnode->vartype = vartype; + optnode->def = def; + optnode->string_ = NULL; + if(mask) { + if((optnode->mask = MALLOC(strlen(mask)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(optnode->mask, mask); + } else { + optnode->mask = NULL; + } + optnode->next = *opt; + *opt = optnode; + FREE(nname); + } +} + +/* Merge two options structs */ +void options_merge(struct options_t **a, struct options_t **b) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct options_t *temp = NULL; + temp = *b; + while(temp) { + struct options_t *optnode = MALLOC(sizeof(struct options_t)); + if(!optnode) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + optnode->id = temp->id; + if(temp->name) { + if((optnode->name = MALLOC(strlen(temp->name)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(optnode->name, '\0', strlen(temp->name)+1); + strcpy(optnode->name, temp->name); + } else { + optnode->name = NULL; + } + if(temp->string_) { + if((optnode->string_ = MALLOC(strlen(temp->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + optnode->vartype = JSON_STRING; + strcpy(optnode->string_, temp->string_); + } else { + optnode->string_ = NULL; + } + if(temp->mask) { + if((optnode->mask = MALLOC(strlen(temp->mask)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(optnode->mask, temp->mask); + } else { + optnode->mask = NULL; + } + optnode->argtype = temp->argtype; + optnode->conftype = temp->conftype; + optnode->vartype = temp->vartype; + optnode->def = temp->def; + optnode->next = *a; + *a = optnode; + temp = temp->next; + } +} + +void options_delete(struct options_t *options) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct options_t *tmp; + while(options) { + tmp = options; + if(tmp->mask) { + FREE(tmp->mask); + } + if(tmp->vartype == JSON_STRING && tmp->string_) { + FREE(tmp->string_); + } + FREE(tmp->name); + options = options->next; + FREE(tmp); + } + if(options != NULL) { + FREE(options); + } + + logprintf(LOG_DEBUG, "freed options struct"); +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/options.h b/lib/ESPiLight/pilight/libs/pilight/core/options.h new file mode 100644 index 0000000..ce67744 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/options.h @@ -0,0 +1,64 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _OPTIONS_H_ +#define _OPTIONS_H_ + +#define OPTION_NO_VALUE 1 +#define OPTION_HAS_VALUE 2 +#define OPTION_OPT_VALUE 3 + +#define DEVICES_ID 1 +#define DEVICES_STATE 2 +#define DEVICES_VALUE 3 +#define DEVICES_SETTING 4 +#define DEVICES_OPTIONAL 5 +#define GUI_SETTING 6 +#define NROPTIONTYPES 6 + + +typedef struct options_t { + int id; + char *name; + union { + char *string_; + double number_; + }; + char *mask; + void *def; + int argtype; + int conftype; + int vartype; + struct options_t *next; +} options_t; + +int options_gc(void); +void options_set_string(struct options_t **options, int id, const char *val); +void options_set_number(struct options_t **options, int id, double val); +int options_get_string(struct options_t **options, int id, char **out); +int options_get_number(struct options_t **options, int id, double *out); +int options_get_argtype(struct options_t **options, int id, int *out); +int options_get_name(struct options_t **options, int id, char **out); +int options_get_id(struct options_t **options, char *name, int *out); +int options_get_mask(struct options_t **options, int id, char **out); +int options_parse(struct options_t **options, int argc, char **argv, int error_check, char **optarg); +void options_add(struct options_t **options, int id, const char *name, int argtype, int conftype, int vartype, void *def, const char *mask); +void options_merge(struct options_t **a, struct options_t **b); +void options_delete(struct options_t *options); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/pilight.c b/lib/ESPiLight/pilight/libs/pilight/core/pilight.c new file mode 100644 index 0000000..56f4918 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/pilight.c @@ -0,0 +1,23 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include "pilight.h" + +struct pilight_t pilight; +char pilight_uuid[UUID_LENGTH]; +const uv_thread_t pth_main_id; diff --git a/lib/ESPiLight/pilight/libs/pilight/core/pilight.h b/lib/ESPiLight/pilight/libs/pilight/core/pilight.h new file mode 100644 index 0000000..2553350 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/pilight.h @@ -0,0 +1,121 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _PILIGHT_H_ +#define _PILIGHT_H_ + +typedef enum runmode_t { + STANDALONE, + ADHOC +} runmode_t; + +typedef enum process_t { + PROCESS_DAEMON, + PROCESS_CLIENT +} process_t; + +#ifdef PILIGHT_REWRITE +typedef enum origin_t { + ORIGIN_RECEIVER = 0, + ORIGIN_SENDER, + ORIGIN_CONTROLLER, + ORIGIN_MASTER, + ORIGIN_NODE, + ORIGIN_FW, + ORIGIN_STATS, + ORIGIN_ACTION, + ORIGIN_RULE, + ORIGIN_PROTOCOL, + ORIGIN_HARDWARE, + ORIGIN_CONFIG, + ORIGIN_WEBSERVER, + ORIGIN_SSDP, + ORIGIN_ADHOC +} origin_t; +#else +typedef enum origin_t { + RECEIVER = 0, + SENDER, + MASTER, + NODE, + FW, + STATS, + ACTION, + RULE, + PROTOCOL, + HARDWARE +} origin_t; + +#define ORIGIN_WEBSERVER 12 +#define ORIGIN_SENDER 1 +#define ORIGIN_MASTER 1 + +#endif + +#include "../../libuv/uv.h" + +#include "defines.h" +#include "eventpool.h" +#include "json.h" +#include "mem.h" + +#ifdef PILIGHT_REWRITE +#include "../storage/storage.h" +#else +#include "../config/devices.h" +#endif + +#include +#include +#include +#if MBEDTLS_VERSION_MAJOR <= 2 && \ + MBEDTLS_VERSION_MINOR <= 3 + #include +#else + #include +#endif +#include +#include +#include +#include +#include + +mbedtls_entropy_context ssl_entropy; +mbedtls_ctr_drbg_context ssl_ctr_drbg; +mbedtls_pk_context ssl_pk_key; +mbedtls_x509_crt ssl_server_crt; +mbedtls_ssl_cache_context ssl_cache; +struct mbedtls_ssl_config ssl_client_conf; +struct mbedtls_ssl_config ssl_server_conf; + +struct pilight_t { + // void (*broadcast)(char *name, struct JsonNode *message, enum origin_t origin); +#ifdef PILIGHT_REWRITE + int (*send)(JsonNode *, enum origin_t); + int (*control)(char *, char *, struct JsonNode *, enum origin_t); + void (*receive)(struct JsonNode *, int); + int (*socket)(char *, char *, char **); +#else + void (*broadcast)(char *name, JsonNode *message, enum origin_t origin); + int (*send)(JsonNode *json, enum origin_t origin); + int (*control)(struct devices_t *dev, char *state, JsonNode *values, enum origin_t origin); + void (*receive)(struct JsonNode *code, int hwtype); +#endif + + runmode_t runmode; + /* pilight actually runs in this stage and the configuration is fully validated */ + int running; + int debuglevel; + process_t process; +} pilight_t; + +extern struct pilight_t pilight; +extern const uv_thread_t pth_main_id; +extern char pilight_uuid[UUID_LENGTH]; + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/ping.c b/lib/ESPiLight/pilight/libs/pilight/core/ping.c new file mode 100644 index 0000000..ee2b5de --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/ping.c @@ -0,0 +1,331 @@ +/* + * icmpquery.c - send and receive ICMP queries for address mask + * and current time. + * + * Version 1.0.3 + * + * Copyright 1998, 1999, 2000 David G. Andersen + * + * http://www.angio.net/ + * + * All rights reserved. + * This information is subject to change without notice and does not + * represent a commitment on the part of David G. Andersen. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of David G. Andersen may not + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL DAVID G. ANDERSEN BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * + * Verified to work on: + * FreeBSD (2.x, 3.x) + * Linux 2.0.x, 2.2.0-pre1 + * NetBSD 1.3 + * + * Should work on Solaris and other platforms with BSD-ish stacks. + * + * If you compile it somewhere else, or it doesn't work somewhere, + * please let me know. + * + * Compilation: gcc icmpquery.c -o icmpquery + * + * One usage note: In order to receive accurate time information, + * the time on your computer must be correct; the + * ICMP timestamp reply is a relative time figure. + */ + + +/* Some portions of this code are taken from FreeBSD's ping source. + * Those portions are subject to the BSD copyright, which is appended + * at the end of this file. Namely, in_cksum. + */ + +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #define WIN32_LEAN_AND_MEAN + #include + #include + #include + #define MSG_NOSIGNAL 0 +#else + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include +#endif +#include +#include +#include + +#include "common.h" +#include "network.h" +#include "log.h" +#include "mem.h" + +#ifdef _WIN32 + typedef unsigned char u_int8_t; + typedef unsigned short u_int16_t; + typedef unsigned int u_int32_t; + + #define ICMP_ECHO 8 + #define ICMP_ECHOREPLY 0 + + struct icmp_ra_addr { + u_int32_t ira_addr; + u_int32_t ira_preference; + }; + + struct ip { + u_char ip_hl:4, /* header length */ + ip_v:4; /* version */ + u_char ip_tos; /* type of service */ + short ip_len; /* total length */ + u_short ip_id; /* identification */ + short ip_off; /* fragment offset field */ + #define IP_DF 0x4000 /* dont fragment flag */ + #define IP_MF 0x2000 /* more fragments flag */ + u_char ip_ttl; /* time to live */ + u_char ip_p; /* protocol */ + u_short ip_sum; /* checksum */ + struct in_addr ip_src,ip_dst; /* source and dest address */ + }; + + struct icmp + { + u_int8_t icmp_type; /* type of message, see below */ + u_int8_t icmp_code; /* type sub code */ + u_int16_t icmp_cksum; /* ones complement checksum of struct */ + union + { + u_char ih_pptr; /* ICMP_PARAMPROB */ + struct in_addr ih_gwaddr; /* gateway address */ + struct ih_idseq /* echo datagram */ + { + u_int16_t icd_id; + u_int16_t icd_seq; + } ih_idseq; + u_int32_t ih_void; + + /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */ + struct ih_pmtu + { + u_int16_t ipm_void; + u_int16_t ipm_nextmtu; + } ih_pmtu; + + struct ih_rtradv + { + u_int8_t irt_num_addrs; + u_int8_t irt_wpa; + u_int16_t irt_lifetime; + } ih_rtradv; + } icmp_hun; + #define icmp_pptr icmp_hun.ih_pptr + #define icmp_gwaddr icmp_hun.ih_gwaddr + #define icmp_id icmp_hun.ih_idseq.icd_id + #define icmp_seq icmp_hun.ih_idseq.icd_seq + #define icmp_void icmp_hun.ih_void + #define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void + #define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu + #define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs + #define icmp_wpa icmp_hun.ih_rtradv.irt_wpa + #define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime + union + { + struct + { + u_int32_t its_otime; + u_int32_t its_rtime; + u_int32_t its_ttime; + } id_ts; + struct + { + struct ip idi_ip; + /* options and then 64 bits of data */ + } id_ip; + struct icmp_ra_addr id_radv; + u_int32_t id_mask; + u_int8_t id_data[1]; + } icmp_dun; + #define icmp_otime icmp_dun.id_ts.its_otime + #define icmp_rtime icmp_dun.id_ts.its_rtime + #define icmp_ttime icmp_dun.id_ts.its_ttime + #define icmp_ip icmp_dun.id_ip.idi_ip + #define icmp_radv icmp_dun.id_radv + #define icmp_mask icmp_dun.id_mask + #define icmp_data icmp_dun.id_data + }; +#endif + +/* + * in_cksum -- + * Checksum routine for Internet Protocol family headers (C Version) + * From FreeBSD's ping.c + */ +static int in_cksum(int *addr, int len) { + register int nleft = len; + register int *w = addr; + register int sum = 0; + int answer = 0; + + /* + * Our algorithm is simple, using a 32 bit accumulator (sum), we add + * sequential 16 bit words to it, and at the end, fold back all the + * carry bits from the top 16 bits into the lower 16 bits. + */ + while(nleft > 1) { + sum += *w++; + nleft -= 2; + } + + /* mop up an odd byte, if necessary */ + if(nleft == 1) { + *(u_char *)(&answer) = *(u_char *)w ; + sum += answer; + } + + /* add back carry outs from top 16 bits to low 16 bits */ + sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ + sum += (sum >> 16); /* add carry */ + answer = ~sum; /* truncate to 16 bits */ + return answer; +} + +static int initpacket(char *buf) { + struct ip *ip = (struct ip *)buf; + struct icmp *icmp = (struct icmp *)(ip + 1); + int icmplen = 20; + struct in_addr fromaddr; + fromaddr.s_addr = 0; + + ip->ip_src = fromaddr; + ip->ip_v = 4; + ip->ip_hl = sizeof *ip >> 2; + ip->ip_tos = 0; + ip->ip_id = htons(4321); + ip->ip_ttl = 255; + ip->ip_p = 1; + ip->ip_sum = 0; + + icmp->icmp_seq = 1; + icmp->icmp_cksum = 0; + icmp->icmp_type = ICMP_ECHO; + icmp->icmp_code = 0; + + gettimeofday((struct timeval *)(icmp+8), NULL); + memset(icmp+12, '\0', 8); + ip->ip_len = sizeof(struct ip) + icmplen; + return icmplen; +} + +int ping(char *addr) { + char buf[1500], buf1[INET_ADDRSTRLEN+1]; + struct ip *ip = (struct ip *)buf; + struct icmp *icmp = (struct icmp *)(ip + 1); + struct sockaddr_in dst; + int icmplen = 0; + int sockfd = 0, on = 1; + long int fromlen = 0; + +#ifdef _WIN32 + WSADATA wsa; + + if(WSAStartup(0x202, &wsa) != 0) { + logprintf(LOG_ERR, "could not initialize new socket"); + exit(EXIT_FAILURE); + } +#endif + + if((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) { + logperror(LOG_DEBUG, "socket"); + return -1; + } + + if(setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, (const char *)&on, sizeof(on)) < 0) { + logperror(LOG_DEBUG, "IP_HDRINCL"); + close(sockfd); + return -1; + } + +#ifndef _WIN32 + struct timeval tv; + tv.tv_sec = 1; + tv.tv_usec = 0; + + if(setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)) < 0) { +#else + int timeout = 1000; + if(setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof(struct timeval)) < 0) { +#endif + logperror(LOG_DEBUG, "SO_RCVTIMEO"); + close(sockfd); + return -1; + } + + memset(buf, '\0', 1500); + icmplen = initpacket(buf); + dst.sin_family = AF_INET; + + ip->ip_dst.s_addr = inet_addr(addr); + dst.sin_addr.s_addr = inet_addr(addr); + dst.sin_port = htons(0); + icmp->icmp_cksum = 0; + icmp->icmp_cksum = in_cksum((int *)icmp, icmplen); + if(sendto(sockfd, buf, ip->ip_len, 0, (struct sockaddr *)&dst, sizeof(dst)) < 0) { + logperror(LOG_DEBUG, "sendto"); + close(sockfd); + return -1; + } + + memset(buf, '\0', sizeof(buf)); + if((recvfrom(sockfd, buf, sizeof(buf), 0, NULL, (socklen_t *)&fromlen)) < 0) { + logperror(LOG_DEBUG, "recvfrom"); + close(sockfd); + return -1; + } + + icmp = (struct icmp *)(buf + (ip->ip_hl << 2)); + memset(&buf1, '\0', INET_ADDRSTRLEN+1); + inet_ntop(AF_INET, (void *)&(ip->ip_src), buf1, INET_ADDRSTRLEN+1); + if(!((icmp->icmp_type == ICMP_ECHOREPLY || icmp->icmp_type == ICMP_ECHO) && strcmp(buf1, addr) == 0)) { + logprintf(LOG_DEBUG, "unexpected status reply: %d code: %d at: %s from: %s",icmp->icmp_type, icmp->icmp_code, buf1, addr); + close(sockfd); + return -1; + } + + close(sockfd); + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/ping.h b/lib/ESPiLight/pilight/libs/pilight/core/ping.h new file mode 100644 index 0000000..6e7cc6b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/ping.h @@ -0,0 +1,68 @@ +/* + * icmpquery.c - send and receive ICMP queries for address mask + * and current time. + * + * Version 1.0.3 + * + * Copyright 1998, 1999, 2000 David G. Andersen + * + * http://www.angio.net/ + * + * All rights reserved. + * This information is subject to change without notice and does not + * represent a commitment on the part of David G. Andersen. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of David G. Andersen may not + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL DAVID G. ANDERSEN BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * + * Verified to work on: + * FreeBSD (2.x, 3.x) + * Linux 2.0.x, 2.2.0-pre1 + * NetBSD 1.3 + * + * Should work on Solaris and other platforms with BSD-ish stacks. + * + * If you compile it somewhere else, or it doesn't work somewhere, + * please let me know. + * + * Compilation: gcc icmpquery.c -o icmpquery + * + * One usage note: In order to receive accurate time information, + * the time on your computer must be correct; the + * ICMP timestamp reply is a relative time figure. + */ + + +/* Some portions of this code are taken from FreeBSD's ping source. + * Those portions are subject to the BSD copyright, which is appended + * at the end of this file. Namely, in_cksum. + */ + +#ifndef _LIBPROC_H_ +#define _LIBPROC_H_ + +int ping(char *addr); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/proc.c b/lib/ESPiLight/pilight/libs/pilight/core/proc.c new file mode 100644 index 0000000..34fdd56 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/proc.c @@ -0,0 +1,241 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifdef __FreeBSD__ + #define _WITH_GETLINE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #include +#endif +#include +#include +#include + +#include "proc.h" +#include "log.h" +#include "mem.h" + +/* RAM usage */ +#ifndef _WIN32 + static unsigned long totalram = 0; +#endif +static unsigned short initialized = 0; + +/* Mounting proc subsystem */ +#ifdef __FreeBSD__ + static unsigned short mountproc = 1; +#endif + +double getCPUUsage(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + static struct cpu_usage_t cpu_usage; + if(!initialized) { + memset(&cpu_usage, '\0', sizeof(struct cpu_usage_t)); + cpu_usage.cpu_old = 0; + cpu_usage.cpu_per = 0; + cpu_usage.cpu_new = 0; + cpu_usage.sec_start = 0; + cpu_usage.sec_stop = 0; + cpu_usage.sec_diff = 0; + memset(&cpu_usage.ts, '\0', sizeof(struct timespec)); + cpu_usage.starts = 0; + initialized = 1; + } +#ifdef _WIN32 + FILETIME createTime; + FILETIME exitTime; + FILETIME kernelTime; + FILETIME userTime; + if(GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &kernelTime, &userTime) != -1) { + SYSTEMTIME userSystemTime; + if(FileTimeToSystemTime(&userTime, &userSystemTime) != -1) { + cpu_usage.cpu_new = ((double)userSystemTime.wHour * 3600.0 + (double)userSystemTime.wMinute * 60.0 + + (double)userSystemTime.wSecond + (double)userSystemTime.wMilliseconds / 1000.0); + double a = (cpu_usage.cpu_new - cpu_usage.cpu_old); + cpu_usage.cpu_old = cpu_usage.cpu_new; + return a; + } + } + return 0.0; +#else + clock_gettime(CLOCK_REALTIME, &cpu_usage.ts); + cpu_usage.sec_stop = cpu_usage.ts.tv_sec + cpu_usage.ts.tv_nsec / 1e9; + + cpu_usage.sec_diff = cpu_usage.sec_stop - cpu_usage.sec_start; + + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &cpu_usage.ts); + cpu_usage.cpu_new = (cpu_usage.ts.tv_sec + (cpu_usage.ts.tv_nsec / 1e9)); + double a = ((cpu_usage.cpu_new-cpu_usage.cpu_old) / cpu_usage.sec_diff * 100.0); + cpu_usage.cpu_old = cpu_usage.cpu_new; + + clock_gettime(CLOCK_REALTIME, &cpu_usage.ts); + cpu_usage.sec_start = cpu_usage.ts.tv_sec + cpu_usage.ts.tv_nsec / 1e9; + + return a; +#endif +} + +void getThreadCPUUsage(pthread_t pth, struct cpu_usage_t *cpu_usage) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); +#ifdef _WIN32 + FILETIME createTime; + FILETIME exitTime; + FILETIME kernelTime; + FILETIME userTime; + if(GetThreadTimes(pthread_gethandle(pth), &createTime, &exitTime, &kernelTime, &userTime) != -1) { + SYSTEMTIME userSystemTime; + if(FileTimeToSystemTime(&userTime, &userSystemTime) != -1) { + cpu_usage->cpu_new = ((double)userSystemTime.wHour * 3600.0 + (double)userSystemTime.wMinute * 60.0 + + (double)userSystemTime.wSecond + (double)userSystemTime.wMilliseconds / 1000.0); + if(cpu_usage->cpu_per > 100) { + cpu_usage->cpu_per = (cpu_usage->cpu_new - cpu_usage->cpu_old); + } + cpu_usage->cpu_old = cpu_usage->cpu_new; + } + } + cpu_usage->cpu_per = 0; +#else + clockid_t cid; + memset(&cid, '\0', sizeof(cid)); + + clock_gettime(CLOCK_REALTIME, &cpu_usage->ts); + cpu_usage->sec_stop = cpu_usage->ts.tv_sec + cpu_usage->ts.tv_nsec / 1e9; + + cpu_usage->sec_diff = cpu_usage->sec_stop - cpu_usage->sec_start; + + pthread_getcpuclockid(pth, &cid); + clock_gettime(cid, &cpu_usage->ts); + + cpu_usage->cpu_new = (cpu_usage->ts.tv_sec + (cpu_usage->ts.tv_nsec / 1e9)); + cpu_usage->cpu_per = ((cpu_usage->cpu_new-cpu_usage->cpu_old) / cpu_usage->sec_diff * 100.0); + if(cpu_usage->cpu_per > 100) { + cpu_usage->cpu_per = 0; + } + cpu_usage->cpu_old = cpu_usage->cpu_new; + + clock_gettime(CLOCK_REALTIME, &cpu_usage->ts); + cpu_usage->sec_start = cpu_usage->ts.tv_sec + cpu_usage->ts.tv_nsec / 1e9; +#endif +} + +double getRAMUsage(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + +#ifndef _WIN32 + #if defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE) + if(totalram == 0) { + totalram = (size_t)sysconf(_SC_PHYS_PAGES)*(size_t)sysconf(_SC_PAGESIZE); + } + #endif + + #ifdef __FreeBSD__ + static char statusfile[] = "/compat/proc/self/status"; + static char memfile[] = "/compat/proc/meminfo"; + #else + static char statusfile[] = "/proc/self/status"; + static char memfile[] = "/proc/meminfo"; + #endif + unsigned long VmRSS = 0, value = 0, total = 0; + size_t len = 0; + ssize_t rd = 0; + char units[32], title[32], *line = NULL; + FILE *fp = NULL; + + memset(title, '\0', 32); + memset(units, '\0', 32); + + if((fp = fopen(statusfile, "r")) != NULL) { + while((rd = getline(&line, &len, fp)) != -1) { + if(strstr(line, "VmRSS:") != NULL) { + if(sscanf(line, "%31s %lu %s\n", title, &value, units) > 0) { + VmRSS = value * 1024; + } + if(line != NULL) { + free(line); + line = NULL; + } + break; + } + } + if(line != NULL) { + free(line); + line = NULL; + } + fclose(fp); + } + #ifdef __FreeBSD__ + if(mountproc == 1) { + DIR* dir; + if(!(dir = opendir("/compat"))) { + mkdir("/compat", 0755); + } else { + closedir(dir); + } + if(!(dir = opendir("/compat/proc"))) { + mkdir("/compat/proc", 0755); + } else { + closedir(dir); + } + if(!(dir = opendir("/compat/proc/self"))) { + system("mount -t linprocfs none /compat/proc 2>/dev/null 1>/dev/null"); + mountproc = 0; + } else { + closedir(dir); + } + } + #endif + + if((fp = fopen(memfile, "r")) != NULL) { + while((rd = getline(&line, &len, fp)) != -1) { + if(strstr(line, "MemTotal:") != NULL) { + if(sscanf(line, "%31s %lu %s\n", title, &value, units) > 0) { + total = value * 1024; + } + if(line != NULL) { + free(line); + line = NULL; + } + break; + } + } + if(line != NULL) { + free(line); + line = NULL; + } + fclose(fp); + } + if(VmRSS > 0 && total > 0) { + return ((double)VmRSS*100)/(double)total; + } else { + return 0.0; + } +#else + return 0.0; +#endif +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/proc.h b/lib/ESPiLight/pilight/libs/pilight/core/proc.h new file mode 100644 index 0000000..eb2e51f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/proc.h @@ -0,0 +1,40 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROC_H_ +#define _PROC_H_ + +#include + +/* CPU usage */ +typedef struct cpu_usage_t { + double sec_start; + double sec_stop; + double sec_diff; + double cpu_old; + double cpu_new; + double cpu_per; + struct timespec ts; + clock_t starts; +} cpu_usage_t; + +double getCPUUsage(void); +double getRAMUsage(void); +void getThreadCPUUsage(pthread_t pth, struct cpu_usage_t *cpu_usage); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/sha256cache.c b/lib/ESPiLight/pilight/libs/pilight/core/sha256cache.c new file mode 100644 index 0000000..9341ea9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/sha256cache.c @@ -0,0 +1,125 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include +#include +#include +#include + +#include "sha256cache.h" +#include "common.h" +#include "mem.h" +#include "log.h" +#include "gc.h" + +int sha256cache_gc(void) { + struct sha256cache_t *tmp = sha256cache; + while(sha256cache) { + tmp = sha256cache; + FREE(tmp->name); + sha256cache = sha256cache->next; + FREE(tmp); + } + if(sha256cache != NULL) { + FREE(sha256cache); + } + + logprintf(LOG_DEBUG, "garbage collected sha256cache library"); + return 1; +} + +void sha256cache_remove_node(struct sha256cache_t **cache, char *name) { + struct sha256cache_t *currP, *prevP; + + prevP = NULL; + + for(currP = *cache; currP != NULL; prevP = currP, currP = currP->next) { + + if(strcmp(currP->name, name) == 0) { + if(prevP == NULL) { + *cache = currP->next; + } else { + prevP->next = currP->next; + } + + FREE(currP->name); + FREE(currP); + + break; + } + } +} + +int sha256cache_rm(char *name) { + sha256cache_remove_node(&sha256cache, name); + + logprintf(LOG_DEBUG, "removed %s from cache", name); + return 0; +} + +int sha256cache_add(char *name) { + logprintf(LOG_INFO, "cached new sha256 hash"); + + unsigned char output[33]; + char *password = NULL; + int i = 0, x = 0, len = 65; + mbedtls_sha256_context ctx; + + if(strlen(name) < 64) { + len = 65; + } else { + len = strlen(name)+1; + } + + if((password = MALLOC(len)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strncpy(password, name, len); + + struct sha256cache_t *node = MALLOC(sizeof(struct sha256cache_t)); + if(node == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + if((node->name = MALLOC(strlen(name)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(node->name, name); + + for(i=0;ihash[i], "%02x", output[i/2]); + } + + node->next = sha256cache; + sha256cache = node; + FREE(password); + return 0; +} + +char *sha256cache_get_hash(char *name) { + struct sha256cache_t *ftmp = sha256cache; + while(ftmp) { + if(strcmp(ftmp->name, name) == 0) { + return ftmp->hash; + } + ftmp = ftmp->next; + } + return NULL; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/sha256cache.h b/lib/ESPiLight/pilight/libs/pilight/core/sha256cache.h new file mode 100644 index 0000000..39da55d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/sha256cache.h @@ -0,0 +1,38 @@ +/* + Copyright (C) 2015 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include + +typedef struct sha256cache_t { + char *name; + char hash[65]; + struct sha256cache_t *next; +} sha256cache_t; + +struct sha256cache_t *sha256cache; + +int sha256cache_gc(void); +void sha256cache_remove_node(struct sha256cache_t **sha256cache, char *name); +int sha256cache_rm(char *name); +int sha256cache_add(char *name); +char *sha256cache_get_hash(char *name); diff --git a/lib/ESPiLight/pilight/libs/pilight/core/socket.c b/lib/ESPiLight/pilight/libs/pilight/core/socket.c new file mode 100644 index 0000000..4035bd5 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/socket.c @@ -0,0 +1,646 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #if _WIN32_WINNT < 0x0501 + #undef _WIN32_WINNT + #define _WIN32_WINNT 0x0501 + #endif + #define WIN32_LEAN_AND_MEAN + #include + #include + #define MSG_NOSIGNAL 0 + #ifndef EINPROGRESS + #define EINPROGRESS WSAEINPROGRESS + #endif +#else + #include + #include + #include + #include + #include + #include +#endif + +#include "pilight.h" +#include "network.h" +#include "log.h" +#include "gc.h" +#include "socket.h" +#include "../config/settings.h" + +static char recvBuff[BUFFER_SIZE]; +static char *waitMessage = NULL; +static unsigned short socket_loop = 1; +static unsigned int socket_port = 0; +static int socket_loopback = 0; +static int socket_server = 0; +static int socket_clients[MAX_CLIENTS]; + +int socket_gc(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + int x = 0; + + socket_loop = 0; + /* Wakeup all our select statement so the socket_wait and + socket_read functions can actually close and the + all threads using sockets can end gracefully */ + + for(x=1;x 0) { + send(socket_clients[x], "1", 1, MSG_NOSIGNAL); + } + } + + if(socket_loopback > 0) { + send(socket_loopback, "1", 1, MSG_NOSIGNAL); + socket_close(socket_loopback); + } + + if(waitMessage != NULL) { + FREE(waitMessage); + } + + logprintf(LOG_DEBUG, "garbage collected socket library"); + return EXIT_SUCCESS; +} + +/* Start the socket server */ +int socket_start(unsigned short port) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct sockaddr_in address; + int addrlen = sizeof(address); + int opt = 1; + +#ifdef _WIN32 + WSADATA wsa; + + if(WSAStartup(0x202, &wsa) != 0) { + logprintf(LOG_ERR, "could not initialize new socket"); + exit(EXIT_FAILURE); + } +#endif + + memset(&address, '\0', sizeof(struct sockaddr_in)); + memset(socket_clients, 0, sizeof(socket_clients)); + + //create a master socket + if((socket_server = socket(AF_INET, SOCK_STREAM, 0)) == 0) { + logprintf(LOG_ERR, "could not create new socket"); + exit(EXIT_FAILURE); + } + + //set master socket to allow multiple connections , this is just a good habit, it will work without this + if(setsockopt(socket_server, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)) < 0 ) { + logprintf(LOG_ERR, "could not set proper socket options"); + exit(EXIT_FAILURE); + } + + //type of socket created + address.sin_family = AF_INET; + address.sin_addr.s_addr = INADDR_ANY; + if(port <= 0) { + address.sin_port = 0; + } else { + address.sin_port = htons(port); + } + + //bind the socket to localhost + if(bind(socket_server, (struct sockaddr *)&address, sizeof(address)) < 0) { + logprintf(LOG_ERR, "cannot bind to socket port %d, address already in use?", address); + exit(EXIT_FAILURE); + } + + int x = 0; + //try to specify maximum of 3 pending connections for the master socket + if((x = listen(socket_server, 3)) < 0) { + logprintf(LOG_ERR, "failed to listen to socket"); + exit(EXIT_FAILURE); + } + + static struct linger linger = { 0, 0 }; +#ifdef _WIN32 + unsigned int lsize = sizeof(struct linger); +#else + socklen_t lsize = sizeof(struct linger); +#endif + setsockopt(socket_server, SOL_SOCKET, SO_LINGER, (void *)&linger, lsize); + + if(getsockname(socket_server, (struct sockaddr *)&address, (socklen_t *)&addrlen) == -1) + perror("getsockname"); + else + socket_port = ntohs(address.sin_port); + + /* Make a loopback socket we can close when pilight needs to be stopped + or else the select statement will wait forever for an activity */ + char localhost[16] = "127.0.0.1"; + socket_loopback = socket_connect(localhost, (unsigned short)socket_port); + socket_clients[0] = socket_loopback; + logprintf(LOG_INFO, "daemon listening to port: %d", socket_port); + + return 0; +} + +int socket_timeout_connect(int sockfd, struct sockaddr *serv_addr, int sec) { + struct timeval tv; + fd_set fdset; + int valopt; + socklen_t lon = 0; + +#ifdef _WIN32 + unsigned long on = 1; + unsigned long off = 0; + ioctlsocket(sockfd, FIONBIO, &on); +#else + long arg = fcntl(sockfd, F_GETFL, NULL); + fcntl(sockfd, F_SETFL, arg | O_NONBLOCK); +#endif + + if(connect(sockfd, serv_addr, sizeof(struct sockaddr)) < 0) { + if(errno == EINPROGRESS) { + tv.tv_sec = sec; + tv.tv_usec = 0; + FD_ZERO(&fdset); + FD_SET(sockfd, &fdset); + if(select(sockfd+1, NULL, &fdset, NULL, &tv) > 0) { + lon = sizeof(int); + getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (void*)(&valopt), &lon); + if(valopt > 0) { + return -3; + } + } else { + return -2; + } + } else { + return -1; + } + } + +#ifdef _WIN32 + ioctlsocket(sockfd, FIONBIO, &off); +#else + arg = fcntl(sockfd, F_GETFL, NULL); + fcntl(sockfd, F_SETFL, arg & ~O_NONBLOCK); +#endif + + return 0; +} + +unsigned int socket_get_port(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + return socket_port; +} + +int socket_get_fd(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + return socket_server; +} + +int socket_get_clients(int i) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + return socket_clients[i]; +} + +int socket_connect(char *address, unsigned short port) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct sockaddr_in serv_addr; + int sockfd; + fd_set fdset; + struct timeval tv; + +#ifdef _WIN32 + WSADATA wsa; + + if(WSAStartup(0x202, &wsa) != 0) { + logprintf(LOG_ERR, "could not initialize new socket"); + exit(EXIT_FAILURE); + } +#endif + + /* Try to open a new socket */ + if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + logprintf(LOG_ERR, "could not create socket"); + return -1; + } + + /* Clear the server address */ + memset(&serv_addr, '\0', sizeof(serv_addr)); + + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(port); + inet_pton(AF_INET, address, &serv_addr.sin_addr); + + /* Connect to the server */ + if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) != -1) { +#ifdef _WIN32 + unsigned long on = 1; + ioctlsocket(sockfd, FIONBIO, &on); +#else + fcntl(sockfd, F_SETFL, O_NONBLOCK); +#endif + + FD_ZERO(&fdset); + FD_SET((long unsigned int)sockfd, &fdset); + tv.tv_sec = 3; + tv.tv_usec = 0; + + if(select(sockfd+1, NULL, &fdset, NULL, &tv) == 1) { + int error = -1; + socklen_t len = sizeof(error); + +#ifdef _WIN32 + if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char *)&error, &len) != SOCKET_ERROR) { + if(error == 0) { + return sockfd; + } else { + return -1; + } + } else { + return -1; + } +#else + getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len); + + if(error == 0) { + return sockfd; + } else { + close(sockfd); + return -1; + } +#endif + } else { + close(sockfd); + return -1; + } + } else { + close(sockfd); + return -1; + } +} + +void socket_close(int sockfd) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + int i = 0; + struct sockaddr_in address; + int addrlen = sizeof(address); + char buf[INET_ADDRSTRLEN+1]; + + if(sockfd > 0) { + if(getpeername(sockfd, (struct sockaddr*)&address, (socklen_t*)&addrlen) == 0) { + memset(&buf, '\0', INET_ADDRSTRLEN+1); + inet_ntop(AF_INET, (void *)&(address.sin_addr), buf, INET_ADDRSTRLEN+1); + logprintf(LOG_DEBUG, "client disconnected, ip %s, port %d", buf, ntohs(address.sin_port)); + } + + for(i=0;i 0 && sockfd > 0) { + + va_start(ap, msg); +#ifdef _WIN32 + n = _vscprintf(msg, ap); +#else + n = vsnprintf(NULL, 0, msg, ap); +#endif + if(n == -1) { + logprintf(LOG_ERR, "improperly formatted string: %s", msg); + return -1; + } + n += (int)len; + va_end(ap); + + if((sendBuff = MALLOC((size_t)n)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(sendBuff, '\0', (size_t)n); + + va_start(ap, msg); + vsprintf(sendBuff, msg, ap); + va_end(ap); + + memcpy(&sendBuff[n-len], EOSS, (size_t)len); + + while(ptr < n) { + if((n-ptr) < BUFFER_SIZE) { + x = (n-ptr); + } else { + x = BUFFER_SIZE; + } + if((bytes = (int)send(sockfd, &sendBuff[ptr], (size_t)x, MSG_NOSIGNAL)) == -1) { + /* Change the delimiter into regular newlines */ + sendBuff[n-(len-1)] = '\0'; + sendBuff[n-(len)] = '\n'; + logprintf(LOG_DEBUG, "socket write failed: %s", sendBuff); + FREE(sendBuff); + return -1; + } + ptr += bytes; + } + + if(strncmp(&sendBuff[0], "BEAT", 4) != 0) { + /* Change the delimiter into regular newlines */ + sendBuff[n-(len-1)] = '\0'; + sendBuff[n-(len)] = '\n'; + logprintf(LOG_DEBUG, "socket write succeeded: %s", sendBuff); + } + FREE(sendBuff); + } + return n; +} + +void socket_rm_client(int i, struct socket_callback_t *socket_callback) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct sockaddr_in address; + int addrlen = sizeof(address); + int sd = socket_clients[i]; + char buf[INET_ADDRSTRLEN+1]; + + //Somebody disconnected, get his details and print + getpeername(sd, (struct sockaddr*)&address, (socklen_t*)&addrlen); + memset(&buf, '\0', INET_ADDRSTRLEN+1); + inet_ntop(AF_INET, (void *)&(address.sin_addr), buf, INET_ADDRSTRLEN+1); + logprintf(LOG_DEBUG, "client disconnected, ip %s, port %d", buf, ntohs(address.sin_port)); + if(socket_callback->client_disconnected_callback) + socket_callback->client_disconnected_callback(i); + //Close the socket and mark as 0 in list for reuse + shutdown(sd, 2); + close(sd); + socket_clients[i] = 0; +} + +int socket_read(int sockfd, char **message, time_t timeout) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct timeval tv; + int bytes = 0; + size_t msglen = 0; + int ptr = 0, n = 0, len = (int)strlen(EOSS); + fd_set fdsread; +#ifdef _WIN32 + unsigned long on = 1; + ioctlsocket(sockfd, FIONBIO, &on); +#else + fcntl(sockfd, F_SETFL, O_NONBLOCK); +#endif + + if(timeout > 0) { + tv.tv_sec = timeout; + tv.tv_usec = 0; + } + + while(socket_loop && sockfd > 0) { + FD_ZERO(&fdsread); + FD_SET((unsigned long)sockfd, &fdsread); + + do { + if(timeout > 0) { + n = select(sockfd+1, &fdsread, NULL, NULL, &tv); + } else { + n = select(sockfd+1, &fdsread, NULL, NULL, 0); + } + } while(n == -1 && errno == EINTR && socket_loop); + if(timeout > 0 && n == 0) { + return 1; + } + /* Immediatly stop loop if the select was waken up by the garbage collector */ + if(socket_loop == 0) { + break; + } + if(n == -1) { + return -1; + } else if(n > 0) { + if(FD_ISSET((unsigned long)sockfd, &fdsread)) { + bytes = (int)recv(sockfd, recvBuff, BUFFER_SIZE, 0); + + if(bytes <= 0) { + return -1; + } else { + ptr+=bytes; + if((*message = REALLOC(*message, (size_t)ptr+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(&(*message)[(ptr-bytes)], '\0', (size_t)bytes+1); + memcpy(&(*message)[(ptr-bytes)], recvBuff, (size_t)bytes); + msglen = strlen(*message); + } + if(*message && msglen > 0) { + /* When a stream is larger then the buffer size, it has to contain + the pilight delimiter to know when the stream ends. If the stream + is shorter then the buffer size, we know we received the full stream */ + int l = 0; + if(((l = strncmp(&(*message)[ptr-(len)], EOSS, (unsigned int)(len))) == 0) || ptr < BUFFER_SIZE) { + /* If the socket contains buffered TCP messages, separate them by + changing the delimiters into newlines */ + if(ptr > msglen) { + int i = 0; + for(i=0;i 0) + FD_SET((unsigned long)sd, &readfds); + + //highest file descriptor number, need it for the select function + if(sd > max_sd) + max_sd = sd; + } + //wait for an activity on one of the sockets, timeout is NULL, so wait indefinitely + activity = select(max_sd + 1, &readfds, NULL, NULL, NULL); + } while(activity == -1 && errno == EINTR && socket_loop); + + /* Immediatly stop loop if the select was waken up by the garbage collector */ + if(socket_loop == 0) { + break; + } + //If something happened on the master socket, then its an incoming connection + if(FD_ISSET((unsigned long)socket_get_fd(), &readfds)) { + if((socket_client = accept(socket_get_fd(), (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0) { + logprintf(LOG_ERR, "failed to accept client"); + exit(EXIT_FAILURE); + } + memset(&buf, '\0', INET_ADDRSTRLEN+1); + inet_ntop(AF_INET, (void *)&(address.sin_addr), buf, INET_ADDRSTRLEN+1); + if(whitelist_check(buf) != 0) { + logprintf(LOG_INFO, "rejected client, ip: %s, port: %d", buf, ntohs(address.sin_port)); + shutdown(socket_client, 2); + close(socket_client); + } else { + //inform user of socket number - used in send and receive commands + logprintf(LOG_INFO, "new client, ip: %s, port: %d", buf, ntohs(address.sin_port)); + logprintf(LOG_DEBUG, "client fd: %d", socket_client); + //send new connection accept message + //socket_write(socket_client, "{\"message\":\"accept connection\"}"); + + static struct linger linger = { 0, 0 }; + socklen_t lsize = sizeof(struct linger); + setsockopt(socket_client, SOL_SOCKET, SO_LINGER, (void *)&linger, lsize); +#ifdef _WIN32 + int flags = ioctlsocket(socket_client, FIONBIO, &on); +#else + int flags = fcntl(socket_client, F_GETFL, 0); +#endif + if(flags != -1) { +#ifdef _WIN32 + ioctlsocket(socket_client, FIONBIO, &on); +#else + fcntl(socket_client, F_SETFL, flags | O_NONBLOCK); +#endif + } + + //add new socket to array of sockets + for(i=0;iclient_connected_callback) + socket_callback->client_connected_callback(i); + logprintf(LOG_DEBUG, "client id: %d", i); + break; + } + } + } + } + + //else its some IO operation on some other socket :) + for(i=1;iclient_data_callback) { + size_t l = strlen(waitMessage); + if(l > 0) { + if(strstr(waitMessage, "\n") != NULL) { + char **array = NULL; + unsigned int n = explode(waitMessage, "\n", &array), q = 0; + for(q=0;qclient_data_callback(i, array[q]); + } + array_free(&array, n); + } else { + socket_callback->client_data_callback(i, waitMessage); + } + } + } + } else { + socket_rm_client(i, socket_callback); + i--; + } + } + } + } + +#ifdef _WIN32 + return 0; +#else + return NULL; +#endif +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/socket.h b/lib/ESPiLight/pilight/libs/pilight/core/socket.h new file mode 100644 index 0000000..7820a36 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/socket.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _SOCKETS_H_ +#define _SOCKETS_H_ + +#include + +typedef struct socket_callback_t { + void (*client_connected_callback)(int); + void (*client_disconnected_callback)(int); + void (*client_data_callback)(int, char*); +} socket_callback_t; + +/* Start the socket server */ +int socket_start(unsigned short port); +int socket_connect(char *address, unsigned short port); +int socket_timeout_connect(int sockfd, struct sockaddr *serv_addr, int usec); +void socket_close(int i); +int socket_write(int sockfd, const char *msg, ...); +int socket_read(int sockfd, char **out, time_t timeout); +void *socket_wait(void *param); +int socket_gc(void); +unsigned int socket_get_port(void); +int socket_get_fd(void); +int socket_get_clients(int i); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/ssdp.c b/lib/ESPiLight/pilight/libs/pilight/core/ssdp.c new file mode 100644 index 0000000..373a111 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/ssdp.c @@ -0,0 +1,373 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#ifdef _WIN32 + #include + #include + #include +#else + #include + #include + #include + #include + #include + #include + #include + #include +#endif +#include +#include +#include +#include +#include + +#include "pilight.h" +#include "network.h" +#include "socket.h" +#include "log.h" +#include "gc.h" +#include "ssdp.h" + +static int ssdp_socket = 0; +static int ssdp_loop = 1; + +int ssdp_gc(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct sockaddr_in addr; + int sockfd = 0; + + ssdp_loop = 0; +#ifdef _WIN32 + WSADATA wsa; + + if(WSAStartup(MAKEWORD(2,2),&wsa) != 0) { + logprintf(LOG_ERR, "could not initialize new socket"); + exit(EXIT_FAILURE); + } +#endif + + /* Make a loopback socket we can close when pilight needs to be stopped + or else the select statement will wait forever for an activity */ + if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) { + /* Wakeup our recvfrom statement so the ssdp_wait function can + actually close and the thread can end gracefully */ + addr.sin_family = AF_INET; + addr.sin_port = htons(1900); + addr.sin_addr.s_addr = inet_addr("239.255.255.250"); + sendto(sockfd, "1", 1, 0, (struct sockaddr *)&addr, sizeof(addr)); + } + + logprintf(LOG_DEBUG, "garbage collected ssdp library"); + return EXIT_SUCCESS; +} + +int ssdp_start(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct sockaddr_in addr; + struct ip_mreq mreq; + int opt = 1; + +#ifdef _WIN32 + WSADATA wsa; + + if(WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { + logprintf(LOG_ERR, "could not initialize new socket"); + exit(EXIT_FAILURE); + } +#endif + + if((ssdp_socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + logprintf(LOG_ERR, "could not create ssdp socket"); + return -1; + } + + memset((char *)&addr, '\0', sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_port = htons(1900); + + if(setsockopt(ssdp_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int)) == -1) { + perror("setsockopt"); + return 0; + } + + mreq.imr_multiaddr.s_addr = inet_addr("239.255.255.250"); + mreq.imr_interface.s_addr = htonl(INADDR_ANY); + + if(setsockopt(ssdp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0) { + logprintf(LOG_ERR, "cannot bind to the ssdp multicast network"); + return 0; + } + + if(bind(ssdp_socket, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + perror("bind"); + return 0; + } + + return -1; +} + +int ssdp_seek(struct ssdp_list_t **ssdp_list) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct sockaddr_in addr; + char message[BUFFER_SIZE] = {'\0'}; + char header[BUFFER_SIZE] = {'\0'}; + int sock, match = 0; + int timeout = 1; + ssize_t len = 0; + socklen_t addrlen = sizeof(addr); + unsigned short int nip[4], port = 0; + +#ifndef _WIN32 + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = timeout*100000; +#else + WSADATA wsa; + + timeout *= 1000; + + if(WSAStartup(0x202, &wsa) != 0) { + logprintf(LOG_ERR, "could not initialize new socket"); + return -1; + } +#endif + + if((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0){ + logprintf(LOG_ERR, "could not create ssdp socket"); + goto end; + } + + memset((void *)&addr, '\0', sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_port = htons(1900); + addr.sin_addr.s_addr = inet_addr("239.255.255.250"); + +#ifdef _WIN32 + setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof(struct timeval)); +#else + setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)); +#endif + + strcpy(header, "M-SEARCH * HTTP/1.1\r\n" + "Host:239.255.255.250:1900\r\n" + "ST:urn:schemas-upnp-org:service:pilight:1\r\n" + "Man:\"ssdp:discover\"\r\n" + "MX:3\r\n\r\n"); + + if((len = sendto(sock, header, BUFFER_SIZE, 0, (struct sockaddr *)&addr, sizeof(addr))) >= 0) { + logprintf(LOG_DEBUG, "ssdp sent search"); + } + + int x = 0; + while(ssdp_loop) { + memset(message, '\0', BUFFER_SIZE); + if((x = recvfrom(sock, message, sizeof(message), 0, (struct sockaddr *)&addr, &addrlen)) < 1) { + //perror("read"); + goto end; + } + + if(strstr(message, "pilight") > 0) { + char **array = NULL; + unsigned int n = explode(message, "\r\n", &array), q = 0; + for(q=0;q 0) { + match = 1; + } + } + array_free(&array, n); + if(match == 1) { + struct ssdp_list_t *node = MALLOC(sizeof(struct ssdp_list_t)); + if(node == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + sprintf(node->ip, "%hu.%hu.%hu.%hu", nip[0], nip[1], nip[2], nip[3]); + node->ip[16] = '\0'; + node->port = port; + node->next = *ssdp_list; + *ssdp_list = node; + } + } + } + goto end; + +end: + if(sock > 0) { + close(sock); + } + struct ssdp_list_t *ptr = *ssdp_list, *next = NULL, *prev = NULL; + if(match == 1) { + while(ptr) { + next = ptr->next; + ptr->next = prev; + prev = ptr; + ptr = next; + } + if(ptr != NULL) { + FREE(ptr); + } + if(next != NULL) { + FREE(next); + } + *ssdp_list = prev; + + return 0; + } else { + return -1; + } +} + +void ssdp_free(struct ssdp_list_t *ssdp_list) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct ssdp_list_t *tmp = NULL; + while(ssdp_list) { + tmp = ssdp_list; + ssdp_list = ssdp_list->next; + FREE(tmp); + } + if(ssdp_list != NULL) { + FREE(ssdp_list); + } +} + +void *ssdp_wait(void *param) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct timeval tv; + struct sockaddr_in addr; + char **devs = NULL, message[BUFFER_SIZE], **header = NULL, *id = NULL; + char host[INET_ADDRSTRLEN+1], *p = host, *distro = distroname(), *hname = hostname(); + int nrdevs = 0, nrheader = 0, x = 0, n = 0; + ssize_t len = 0; + socklen_t addrlen = sizeof(addr); + fd_set fdsread; + + if(distro == NULL) { + logprintf(LOG_ERR, "failed to determine the distribution"); + exit(EXIT_FAILURE); + } + + if((nrdevs = inetdevs(&devs)) > 0) { + for(x=0;x 0) { + if(FD_ISSET(ssdp_socket, &fdsread)) { + memset(message, '\0', BUFFER_SIZE); + if(recvfrom(ssdp_socket, message, sizeof(message), 0, (struct sockaddr *)&addr, &addrlen) < 1) { + //perror("read"); + break; + } + + if(strstr(message, "M-SEARCH * HTTP/1.1") > 0 && strstr(message, "urn:schemas-upnp-org:service:pilight:1") > 0) { + for(x=0;x 0) { + if((len = sendto(ssdp_socket, header[x], BUFFER_SIZE, 0, (struct sockaddr *)&addr, sizeof(addr))) >= 0) { + logprintf(LOG_DEBUG, "ssdp sent notify"); + } + } + } + } + } + } + } + +clear: + for(x=0;x +*/ + +#ifndef _SSDP_H_ +#define _SSDP_H_ + +#ifndef _WIN32 + #include +#endif + +typedef struct ssdp_list_t { + char ip[17]; + unsigned short port; + struct ssdp_list_t *next; +} ssdp_list_t; + +int ssdp_gc(void); +int ssdp_start(void); +int ssdp_seek(struct ssdp_list_t **ssdp_list); +void ssdp_free(struct ssdp_list_t *ssdp_list); +void *ssdp_wait(void* param); +void ssdp_close(int ssdp_socket); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/ssl.c b/lib/ESPiLight/pilight/libs/pilight/core/ssl.c new file mode 100644 index 0000000..e2a916d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/ssl.c @@ -0,0 +1,139 @@ +/* + Copyright (C) 2015 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include + +#include "pilight.h" +#include "ssl.h" +#include "mem.h" +#include "log.h" + +#include "../config/settings.h" + +static int client_success = 0; +static int server_success = 0; + +int ssl_client_init_status(void) { + return client_success; +} + +int ssl_server_init_status(void) { + return server_success; +} + +void ssl_init(void) { + char *pemfile = NULL, buffer[BUFFER_SIZE]; + int ret = 0, pem_free = 0; + +#ifdef PILIGHT_REWRITE + if(settings_select_string(ORIGIN_WEBSERVER, "pem-file", &pemfile) != 0) { +#else + if(settings_find_string("pem-file", &pemfile) != 0) { +#endif + if((pemfile = REALLOC(pemfile, strlen(PEM_FILE)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(pemfile, PEM_FILE); + pem_free = 1; + } + if(file_exists(pemfile) != 0) { + logprintf(LOG_NOTICE, "pemfile does not exists: %s", pemfile); + server_success = -1; + } + + if(server_success == 0) { + mbedtls_ssl_config_init(&ssl_server_conf); + } + + mbedtls_ssl_config_init(&ssl_client_conf); + mbedtls_entropy_init(&ssl_entropy); + mbedtls_ctr_drbg_init(&ssl_ctr_drbg); + mbedtls_ssl_cache_init(&ssl_cache); + + if((ret = mbedtls_ssl_config_defaults(&ssl_client_conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT)) != 0) { + /*LCOV_EXCL_START*/ + mbedtls_strerror(ret, (char *)&buffer, BUFFER_SIZE); + logprintf(LOG_ERR, "mbedtls_ctr_drbg_seed failed: %s", buffer); + client_success = -1; + /*LCOV_EXCL_STOP*/ + } + + if((ret = mbedtls_ssl_config_defaults(&ssl_server_conf, MBEDTLS_SSL_IS_SERVER, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT)) != 0) { + mbedtls_strerror(ret, (char *)&buffer, BUFFER_SIZE); + logprintf(LOG_ERR, "mbedtls_ssl_config_defaults failed: %s", buffer); + server_success = -1; + } + + if(client_success == 0 && server_success == 0) { + if((ret = mbedtls_ctr_drbg_seed(&ssl_ctr_drbg, mbedtls_entropy_func, &ssl_entropy, (const unsigned char *)"pilight", strlen("pilight"))) != 0) { + /*LCOV_EXCL_START*/ + mbedtls_strerror(ret, (char *)&buffer, BUFFER_SIZE); + logprintf(LOG_ERR, "mbedtls_ctr_drbg_seed failed: %s", buffer); + server_success = -1; + client_success = -1; + /*LCOV_EXCL_STOP*/ + } + } + + mbedtls_ssl_conf_rng(&ssl_client_conf, mbedtls_ctr_drbg_random, &ssl_ctr_drbg); + mbedtls_ssl_conf_rng(&ssl_server_conf, mbedtls_ctr_drbg_random, &ssl_ctr_drbg); + mbedtls_ssl_conf_authmode(&ssl_client_conf, MBEDTLS_SSL_VERIFY_NONE); + mbedtls_ssl_conf_session_cache(&ssl_server_conf, &ssl_cache, mbedtls_ssl_cache_get, mbedtls_ssl_cache_set); + mbedtls_ssl_conf_session_cache(&ssl_client_conf, &ssl_cache, mbedtls_ssl_cache_get, mbedtls_ssl_cache_set); + + memset(&ssl_server_crt, 0, sizeof(mbedtls_x509_crt)); + mbedtls_x509_crt_init(&ssl_server_crt); + + if(server_success == 0) { + if((ret = mbedtls_x509_crt_parse_file(&ssl_server_crt, pemfile)) != 0) { + mbedtls_strerror(ret, (char *)&buffer, BUFFER_SIZE); + logprintf(LOG_NOTICE, "mbedtls_x509_crt_parse_file failed: %s", buffer); + server_success = -1; + } + } + + mbedtls_pk_init(&ssl_pk_key); + if(server_success == 0) { + if((ret = mbedtls_pk_parse_keyfile(&ssl_pk_key, pemfile, NULL)) != 0) { + mbedtls_strerror(ret, (char *)&buffer, BUFFER_SIZE); + logprintf(LOG_NOTICE, "mbedtls_pk_parse_keyfile failed: %s", buffer); + server_success = -1; + } + } + + mbedtls_ssl_conf_ca_chain(&ssl_server_conf, ssl_server_crt.next, NULL); + + if(server_success == 0) { + if((ret = mbedtls_ssl_conf_own_cert(&ssl_server_conf, &ssl_server_crt, &ssl_pk_key)) != 0) { + /*LCOV_EXCL_START*/ + mbedtls_strerror(ret, (char *)&buffer, BUFFER_SIZE); + logprintf(LOG_ERR, "mbedtls_ssl_conf_own_cert failed: %s", buffer); + server_success = -1; + /*LCOV_EXCL_STOP*/ + } + } + + if(pem_free == 1) { + FREE(pemfile); + } +} + +void ssl_gc(void) { + client_success = 0; + server_success = 0; + + mbedtls_entropy_free(&ssl_entropy); + mbedtls_ssl_config_free(&ssl_server_conf); + mbedtls_ssl_config_free(&ssl_client_conf); + mbedtls_x509_crt_free(&ssl_server_crt); + mbedtls_pk_free(&ssl_pk_key); + mbedtls_ssl_cache_free(&ssl_cache); +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/ssl.h b/lib/ESPiLight/pilight/libs/pilight/core/ssl.h new file mode 100644 index 0000000..2ebd98e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/ssl.h @@ -0,0 +1,42 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _SSL_H_ +#define _SSL_H_ + +#include +#include +#include +#if MBEDTLS_VERSION_MAJOR <= 2 && \ + MBEDTLS_VERSION_MINOR <= 3 + #include +#else + #include +#endif +#include +#include +#include +#include +#include +#include +#include + +mbedtls_entropy_context ssl_entropy; +mbedtls_ctr_drbg_context ssl_ctr_drbg; +mbedtls_pk_context ssl_pk_key; +mbedtls_x509_crt ssl_server_crt; +mbedtls_ssl_cache_context ssl_cache; +struct mbedtls_ssl_config ssl_client_conf; +struct mbedtls_ssl_config ssl_server_conf; + +int ssl_client_init_status(void); +int ssl_server_init_status(void); +void ssl_init(void); +void ssl_gc(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/strptime.c b/lib/ESPiLight/pilight/libs/pilight/core/strptime.c new file mode 100644 index 0000000..30a9e2c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/strptime.c @@ -0,0 +1,558 @@ +/*- + * Copyright (c) 1997, 1998, 2005, 2008 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code was contributed to The NetBSD Foundation by Klaus Klein. + * Heavily optimised by David Laight + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#undef __XSI_VISIBLE +#include + +#if defined(_WIN32) && !defined(__MINGW32__) + #define strncasecmp(x,y,z) _strnicmp(x,y,z) +#endif + +/* + * We do not implement alternate representations. However, we always + * check whether a given modifier is allowed for a certain conversion. + */ +#define ALT_E 0x01 +#define ALT_O 0x02 +#define LEGAL_ALT(x) { if (alt_format & ~(x)) return NULL; } + +static char gmt[] = { "GMT" }; +#ifdef TM_ZONE +static char utc[] = { "UTC" }; +#endif + +/* RFC-822/RFC-2822 */ +static const char * const nast[5] = { + "EST", "CST", "MST", "PST", "\0\0\0" +}; +static const char * const nadt[5] = { + "EDT", "CDT", "MDT", "PDT", "\0\0\0" +}; + +#define TM_YEAR_BASE 1900 + +static const char *day[7] = { + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday" +}; +static const char *abday[7] = { + "Sun","Mon","Tue","Wed","Thu","Fri","Sat" +}; +static const char *mon[12] = { + "January", "February", "March", "April", "May", "June", "July", + "August", "September", "October", "November", "December" +}; +static const char *abmon[12] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; +static const char *am_pm[2] = { + "AM", "PM" +}; + +static const unsigned char *conv_num (const unsigned char *, int *, + unsigned int, unsigned int); +static const unsigned char *find_string (const unsigned char *, int *, const char * const *, + const char * const *, int); + + +const char * +strptime (const char *buf, const char *fmt, struct tm *tm) +{ + unsigned char c; + const unsigned char *bp, *ep; + int alt_format, i, split_year = 0, neg = 0, offs; + const char *new_fmt; + + bp = (const unsigned char *)buf; + + while (bp != NULL && (c = *fmt++) != '\0') { + /* Clear 'alternate' modifier prior to new conversion. */ + alt_format = 0; + i = 0; + + /* Eat up white-space. */ + if (isspace(c)) { + while (isspace(*bp)) + bp++; + continue; + } + + if (c != '%') + goto literal; + + +again: + switch (c = *fmt++) { + case '%': /* "%%" is converted to "%". */ +literal: + if (c != *bp++) + return NULL; + LEGAL_ALT(0); + continue; + + /* + * "Alternative" modifiers. Just set the appropriate flag + * and start over again. + */ + case 'E': /* "%E?" alternative conversion modifier. */ + LEGAL_ALT(0); + alt_format |= ALT_E; + goto again; + + case 'O': /* "%O?" alternative conversion modifier. */ + LEGAL_ALT(0); + alt_format |= ALT_O; + goto again; + + /* + * "Complex" conversion rules, implemented through recursion. + */ + case 'c': /* Date and time, using the locale's format. */ + new_fmt = "%x %X"; + goto recurse; + + case 'D': /* The date as "%m/%d/%y". */ + new_fmt = "%m/%d/%y"; + LEGAL_ALT(0); + goto recurse; + + case 'F': /* The date as "%Y-%m-%d". */ + new_fmt = "%Y-%m-%d"; + LEGAL_ALT(0); + goto recurse; + + case 'R': /* The time as "%H:%M". */ + new_fmt = "%H:%M"; + LEGAL_ALT(0); + goto recurse; + + case 'r': /* The time in 12-hour clock representation. */ + new_fmt = "%I:%M:%S %p"; + LEGAL_ALT(0); + goto recurse; + + case 'T': /* The time as "%H:%M:%S". */ + new_fmt = "%H:%M:%S"; + LEGAL_ALT(0); + goto recurse; + + case 'X': /* The time, using the locale's format. */ + new_fmt = "%H:%M:%S"; + goto recurse; + + case 'x': /* The date, using the locale's format. */ + new_fmt = "%m/%d/%y"; + recurse: + bp = (const unsigned char *)strptime((const char *)bp, new_fmt, tm); + LEGAL_ALT(ALT_E); + continue; + + /* + * "Elementary" conversion rules. + */ + case 'A': /* The day of week, using the locale's form. */ + case 'a': + bp = find_string(bp, &tm->tm_wday, day, abday, 7); + LEGAL_ALT(0); + continue; + + case 'B': /* The month, using the locale's form. */ + case 'b': + case 'h': + bp = find_string(bp, &tm->tm_mon, mon, abmon, 12); + LEGAL_ALT(0); + continue; + + case 'C': /* The century number. */ + i = 20; + bp = conv_num(bp, &i, 0, 99); + + i = i * 100 - TM_YEAR_BASE; + if (split_year) + i += tm->tm_year % 100; + split_year = 1; + tm->tm_year = i; + LEGAL_ALT(ALT_E); + continue; + + case 'd': /* The day of month. */ + case 'e': + bp = conv_num(bp, &tm->tm_mday, 1, 31); + LEGAL_ALT(ALT_O); + continue; + + case 'k': /* The hour (24-hour clock representation). */ + LEGAL_ALT(0); + /* FALLTHROUGH */ + case 'H': + bp = conv_num(bp, &tm->tm_hour, 0, 23); + LEGAL_ALT(ALT_O); + continue; + + case 'l': /* The hour (12-hour clock representation). */ + LEGAL_ALT(0); + /* FALLTHROUGH */ + case 'I': + bp = conv_num(bp, &tm->tm_hour, 1, 12); + if (tm->tm_hour == 12) + tm->tm_hour = 0; + LEGAL_ALT(ALT_O); + continue; + + case 'j': /* The day of year. */ + i = 1; + bp = conv_num(bp, &i, 1, 366); + tm->tm_yday = i - 1; + LEGAL_ALT(0); + continue; + + case 'M': /* The minute. */ + bp = conv_num(bp, &tm->tm_min, 0, 59); + LEGAL_ALT(ALT_O); + continue; + + case 'm': /* The month. */ + i = 1; + bp = conv_num(bp, &i, 1, 12); + tm->tm_mon = i - 1; + LEGAL_ALT(ALT_O); + continue; + + case 'p': /* The locale's equivalent of AM/PM. */ + bp = find_string(bp, &i, am_pm, NULL, 2); + if (tm->tm_hour > 11) + return NULL; + tm->tm_hour += i * 12; + LEGAL_ALT(0); + continue; + + case 'S': /* The seconds. */ + bp = conv_num(bp, &tm->tm_sec, 0, 61); + LEGAL_ALT(ALT_O); + continue; + + case 'U': /* The week of year, beginning on sunday. */ + case 'W': /* The week of year, beginning on monday. */ + /* + * XXX This is bogus, as we can not assume any valid + * information present in the tm structure at this + * point to calculate a real value, so just check the + * range for now. + */ + bp = conv_num(bp, &i, 0, 53); + LEGAL_ALT(ALT_O); + continue; + + case 'w': /* The day of week, beginning on sunday. */ + bp = conv_num(bp, &tm->tm_wday, 0, 6); + LEGAL_ALT(ALT_O); + continue; + + case 'u': /* The day of week, monday = 1. */ + bp = conv_num(bp, &i, 1, 7); + tm->tm_wday = i % 7; + LEGAL_ALT(ALT_O); + continue; + + case 'g': + /* The year corresponding to the ISO week + * number but without the century. + */ + bp = conv_num(bp, &i, 0, 99); + continue; + + case 'G': + /* The year corresponding to the ISO week + * number with century. + */ + do + bp++; + while (isdigit(*bp)); + continue; + + case 'V': /* The ISO 8601:1988 week number as decimal */ + bp = conv_num(bp, &i, 0, 53); + continue; + + case 'Y': /* The year. */ + i = TM_YEAR_BASE; /* just for data sanity... */ + bp = conv_num(bp, &i, 0, 9999); + tm->tm_year = i - TM_YEAR_BASE; + LEGAL_ALT(ALT_E); + continue; + + case 'y': /* The year within 100 years of the epoch. */ + /* LEGAL_ALT(ALT_E | ALT_O); */ + bp = conv_num(bp, &i, 0, 99); + + if (split_year) + /* preserve century */ + i += (tm->tm_year / 100) * 100; + else { + split_year = 1; + if (i <= 68) + i = i + 2000 - TM_YEAR_BASE; + else + i = i + 1900 - TM_YEAR_BASE; + } + tm->tm_year = i; + continue; + + case 'Z': + if (strncmp((const char *)bp, gmt, 3) == 0) { + tm->tm_isdst = 0; +#ifdef TM_GMTOFF + tm->TM_GMTOFF = 0; +#endif +#ifdef TM_ZONE + tm->TM_ZONE = gmt; +#endif + bp += 3; + } else { +#if defined(_TM_DEFINED) && !defined(_WIN32_WCE) + _tzset(); + ep = find_string(bp, &i, + (const char * const *)tzname, + NULL, 2); + if (ep != NULL) { + tm->tm_isdst = i; +#ifdef TM_GMTOFF + tm->TM_GMTOFF = -(timezone); +#endif +#ifdef TM_ZONE + tm->TM_ZONE = tzname[i]; +#endif + } + bp = ep; +#endif + } + continue; + + case 'z': + /* + * We recognize all ISO 8601 formats: + * Z = Zulu time/UTC + * [+-]hhmm + * [+-]hh:mm + * [+-]hh + * We recognize all RFC-822/RFC-2822 formats: + * UT|GMT + * North American : UTC offsets + * E[DS]T = Eastern : -4 | -5 + * C[DS]T = Central : -5 | -6 + * M[DS]T = Mountain: -6 | -7 + * P[DS]T = Pacific : -7 | -8 + * Military + * [A-IL-M] = -1 ... -9 (J not used) + * [N-Y] = +1 ... +12 + */ + while (isspace(*bp)) + bp++; + + switch (*bp++) { + case 'G': + if (*bp++ != 'M') + return NULL; + /*FALLTHROUGH*/ + case 'U': + if (*bp++ != 'T') + return NULL; + /*FALLTHROUGH*/ + case 'Z': + tm->tm_isdst = 0; +#ifdef TM_GMTOFF + tm->TM_GMTOFF = 0; +#endif +#ifdef TM_ZONE + tm->TM_ZONE = utc; +#endif + continue; + case '+': + neg = 0; + break; + case '-': + neg = 1; + break; + default: + --bp; + ep = find_string(bp, &i, nast, NULL, 4); + if (ep != NULL) { +#ifdef TM_GMTOFF + tm->TM_GMTOFF = -5 - i; +#endif +#ifdef TM_ZONE + tm->TM_ZONE = __UNCONST(nast[i]); +#endif + bp = ep; + continue; + } + ep = find_string(bp, &i, nadt, NULL, 4); + if (ep != NULL) { + tm->tm_isdst = 1; +#ifdef TM_GMTOFF + tm->TM_GMTOFF = -4 - i; +#endif +#ifdef TM_ZONE + tm->TM_ZONE = __UNCONST(nadt[i]); +#endif + bp = ep; + continue; + } + + if ((*bp >= 'A' && *bp <= 'I') || + (*bp >= 'L' && *bp <= 'Y')) { +#ifdef TM_GMTOFF + /* Argh! No 'J'! */ + if (*bp >= 'A' && *bp <= 'I') + tm->TM_GMTOFF = + ('A' - 1) - (int)*bp; + else if (*bp >= 'L' && *bp <= 'M') + tm->TM_GMTOFF = 'A' - (int)*bp; + else if (*bp >= 'N' && *bp <= 'Y') + tm->TM_GMTOFF = (int)*bp - 'M'; +#endif +#ifdef TM_ZONE + tm->TM_ZONE = NULL; /* XXX */ +#endif + bp++; + continue; + } + return NULL; + } + offs = 0; + for (i = 0; i < 4; ) { + if (isdigit(*bp)) { + offs = offs * 10 + (*bp++ - '0'); + i++; + continue; + } + if (i == 2 && *bp == ':') { + bp++; + continue; + } + break; + } + switch (i) { + case 2: + offs *= 100; + break; + case 4: + i = offs % 100; + if (i >= 60) + return NULL; + /* Convert minutes into decimal */ + offs = (offs / 100) * 100 + (i * 50) / 30; + break; + default: + return NULL; + } + if (neg) + offs = -offs; + tm->tm_isdst = 0; /* XXX */ +#ifdef TM_GMTOFF + tm->TM_GMTOFF = offs; +#endif +#ifdef TM_ZONE + tm->TM_ZONE = NULL; /* XXX */ +#endif + continue; + + /* + * Miscellaneous conversions. + */ + case 'n': /* Any kind of white-space. */ + case 't': + while (isspace(*bp)) + bp++; + LEGAL_ALT(0); + continue; + + + default: /* Unknown/unsupported conversion. */ + return NULL; + } + } + + return ((const char *)bp); +} + + +static const unsigned char * +conv_num (const unsigned char *buf, int *dest, + unsigned int llim, unsigned int ulim) +{ + unsigned int result = 0; + unsigned char ch; + + /* The limit also determines the number of valid digits. */ + unsigned int rulim = ulim; + + ch = *buf; + if (ch < '0' || ch > '9') + return NULL; + + do { + result *= 10; + result += ch - '0'; + rulim /= 10; + ch = *++buf; + } while ((result * 10 <= ulim) && rulim && ch >= '0' && ch <= '9'); + + if (result < llim || result > ulim) + return NULL; + + *dest = result; + return buf; +} + +static const unsigned char * +find_string (const unsigned char *bp, int *tgt, const char * const *n1, + const char * const *n2, int c) +{ + int i; + unsigned int len; + + /* check full name - then abbreviated ones */ + for (; n1 != NULL; n1 = n2, n2 = NULL) { + for (i = 0; i < c; i++, n1++) { + len = strlen(*n1); + if (strncasecmp(*n1, (const char *)bp, len) == 0) { + *tgt = i; + return bp + len; + } + } + } + + /* Nothing matched */ + return NULL; +} + diff --git a/lib/ESPiLight/pilight/libs/pilight/core/strptime.h b/lib/ESPiLight/pilight/libs/pilight/core/strptime.h new file mode 100644 index 0000000..c17216e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/strptime.h @@ -0,0 +1,6 @@ +#ifndef _STRPTIME_H_ +#define _STRPTIME_H_ + +char *strptime(const char *s, const char *format, struct tm *tm); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/threads.c b/lib/ESPiLight/pilight/libs/pilight/core/threads.c new file mode 100644 index 0000000..29a7095 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/threads.c @@ -0,0 +1,315 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif +#endif +#include +#include + +#include "threads.h" +#include "common.h" +#include "log.h" +#include "mem.h" + +static unsigned short thread_loop = 1; +static unsigned short thread_running = 0; +static unsigned int threads_initialized = 0; + +static pthread_mutex_t threadqueue_lock; +static pthread_cond_t threadqueue_signal; +static pthread_mutexattr_t threadqueue_attr; + +static int threadqueue_number = 0; +static struct threadqueue_t *threadqueue; +static int threads_loop_running = 0; +static int thread_started = 0; +static pthread_t pth; + +struct threadqueue_t *threads_register(const char *id, void *(*function)(void *param), void *param, int force) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(threads_initialized == 1) { + pthread_mutex_lock(&threadqueue_lock); + } + + struct threadqueue_t *tnode = MALLOC(sizeof(struct threadqueue_t)); + if(tnode == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + struct timeval tcurrent; + memset(&tcurrent, '\0', sizeof(struct timeval)); + gettimeofday(&tcurrent, NULL); + + tnode->ts = 1000000 * (unsigned int)tcurrent.tv_sec + (unsigned int)tcurrent.tv_usec; + tnode->function = function; + tnode->running = 0; + tnode->force = force; + if((tnode->id = MALLOC(strlen(id)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(tnode->id, id); + tnode->param = param; + memset(&tnode->pth, '\0', sizeof(pthread_t)); + tnode->next = NULL; + + memset(&tnode->cpu_usage, '\0', sizeof(struct cpu_usage_t)); + tnode->cpu_usage.cpu_old = 0; + tnode->cpu_usage.cpu_per = 0; + tnode->cpu_usage.cpu_new = 0; + tnode->cpu_usage.sec_start = 0; + tnode->cpu_usage.sec_stop = 0; + tnode->cpu_usage.sec_diff = 0; + memset(&tnode->cpu_usage.ts, '\0', sizeof(struct timespec)); + tnode->cpu_usage.starts = 0; + + struct threadqueue_t *tmp = threadqueue; + if(tmp) { + while(tmp->next != NULL) { + tmp = tmp->next; + } + tmp->next = tnode; + } else { + tnode->next = tmp; + threadqueue = tnode; + } + threadqueue_number++; + + if(threads_initialized == 1) { + pthread_mutex_unlock(&threadqueue_lock); + pthread_cond_signal(&threadqueue_signal); + } + + return tnode; +} + +void threads_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + +#ifndef _WIN32 + sigset_t new, old; + sigemptyset(&new); + sigaddset(&new, SIGINT); + sigaddset(&new, SIGQUIT); + sigaddset(&new, SIGTERM); + pthread_sigmask(SIG_BLOCK, &new, &old); +#endif + pthread_create(thread, attr, start_routine, arg); +#ifndef _WIN32 + pthread_sigmask(SIG_SETMASK, &old, NULL); +#endif +} + +void thread_signal(char *id, int s) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct threadqueue_t *tmp_threads = threadqueue; + while(tmp_threads) { + if(strcmp(tmp_threads->id, id) == 0) { + pthread_kill(tmp_threads->pth, s); + break; + } + tmp_threads = tmp_threads->next; + } +} + +static void *threads_loop(void *param) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct threadqueue_t *tmp_threads = NULL; + + pthread_mutex_lock(&threadqueue_lock); + threads_loop_running = 1; + while(thread_loop) { + if(threadqueue_number > 0) { + pthread_mutex_lock(&threadqueue_lock); + + logprintf(LOG_STACK, "%s::unlocked", __FUNCTION__); + + tmp_threads = threadqueue; + while(tmp_threads) { + if(tmp_threads->running == 0) { + break; + } + tmp_threads = tmp_threads->next; + } + threads_create(&tmp_threads->pth, NULL, tmp_threads->function, (void *)tmp_threads->param); + thread_running++; + tmp_threads->running = 1; + if(thread_running == 1) { + logprintf(LOG_DEBUG, "new thread %s, %d thread running", tmp_threads->id, thread_running); + } else { + logprintf(LOG_DEBUG, "new thread %s, %d threads running", tmp_threads->id, thread_running); + } + + threadqueue_number--; + pthread_mutex_unlock(&threadqueue_lock); + } else { + pthread_cond_wait(&threadqueue_signal, &threadqueue_lock); + } + } + threads_loop_running = 0; + return (void *)NULL; +} + +void threads_start() { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(threads_initialized == 0) { + pthread_mutexattr_init(&threadqueue_attr); + pthread_mutexattr_settype(&threadqueue_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&threadqueue_lock, &threadqueue_attr); + pthread_cond_init(&threadqueue_signal, NULL); + threads_initialized = 1; + } + + threads_create(&pth, NULL, &threads_loop, (void *)NULL); + thread_started = 1; +} + +void thread_stop(char *id) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + if(threads_initialized == 1) { + pthread_mutex_lock(&threadqueue_lock); + } + + struct threadqueue_t *currP, *prevP; + + prevP = NULL; + + for(currP = threadqueue; currP != NULL; prevP = currP, currP = currP->next) { + + if(strcmp(currP->id, id) == 0) { + if(prevP == NULL) { + threadqueue = currP->next; + } else { + prevP->next = currP->next; + } + + if(currP->running == 1) { + thread_running--; + logprintf(LOG_DEBUG, "stopping thread %s", currP->id); + if(currP->force == 1) { + pthread_cancel(currP->pth); + } + pthread_join(currP->pth, NULL); + if(thread_running == 1) { + logprintf(LOG_DEBUG, "stopped thread %s, %d thread running", currP->id, thread_running); + } else { + logprintf(LOG_DEBUG, "stopped thread %s, %d threads running", currP->id, thread_running); + } + } + + FREE(currP->id); + FREE(currP); + + break; + } + } + if(threads_initialized == 1) { + pthread_mutex_unlock(&threadqueue_lock); + } +} + +void threads_cpu_usage(int print) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(print == 1) { + logprintf(LOG_INFO, "----- Thread Profiling -----"); + } + struct threadqueue_t *tmp_threads = threadqueue; + while(tmp_threads) { + if(tmp_threads->running == 1) { + getThreadCPUUsage(tmp_threads->pth, &tmp_threads->cpu_usage); + if(print) { + if(tmp_threads->cpu_usage.cpu_per > 0) { + logprintf(LOG_INFO, "- thread %s: %f%%", tmp_threads->id, tmp_threads->cpu_usage.cpu_per); + } else { + logprintf(LOG_INFO, "- thread %s: 0.000000%%", tmp_threads->id); + } + } + } + tmp_threads = tmp_threads->next; + } + if(print == 1) { + logprintf(LOG_INFO, "----- Thread Profiling -----"); + } +} + +int threads_gc(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + thread_loop = 0; + + if(threads_initialized == 1) { + pthread_mutex_unlock(&threadqueue_lock); + pthread_cond_signal(&threadqueue_signal); + } + + struct threadqueue_t *tmp_threads = threadqueue; + while(tmp_threads) { + if(tmp_threads->running == 1) { + tmp_threads->running = 0; + thread_running--; + + logprintf(LOG_DEBUG, "stopping %s thread", tmp_threads->id); + if(tmp_threads->force == 1) { + pthread_cancel(tmp_threads->pth); + } + pthread_join(tmp_threads->pth, NULL); + if(thread_running == 1) { + logprintf(LOG_DEBUG, "stopped thread %s, %d thread running", tmp_threads->id, thread_running); + } else { + logprintf(LOG_DEBUG, "stopped thread %s, %d threads running", tmp_threads->id, thread_running); + } + } + usleep(10000); + tmp_threads = tmp_threads->next; + } + + struct threadqueue_t *ttmp = NULL; + while(threadqueue) { + ttmp = threadqueue; + FREE(ttmp->id); + threadqueue = threadqueue->next; + FREE(ttmp); + } + if(threadqueue != NULL) { + FREE(threadqueue); + } + + while(threads_loop_running > 0) { + usleep(10); + } + if(thread_started == 1) { + pthread_join(pth, NULL); + } + + logprintf(LOG_DEBUG, "garbage collected threads library"); + return EXIT_SUCCESS; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/threads.h b/lib/ESPiLight/pilight/libs/pilight/core/threads.h new file mode 100644 index 0000000..efc1181 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/threads.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _THREADS_H_ +#define _THREADS_H_ + +#ifdef _WIN32 + #include "windows.h" +#endif +#include +#include "proc.h" + +struct threadqueue_t { + unsigned int ts; + pthread_t pth; +#ifdef _WIN32 + HANDLE handle; +#endif + int force; + char *id; + void *param; + unsigned int running; + struct cpu_usage_t cpu_usage; + void *(*function)(void *param); + struct threadqueue_t *next; +} threadqueue_t; + +struct threadqueue_t *threads_register(const char *id, void *(*function)(void* param), void *param, int force); +void threads_create(pthread_t *pth, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); +void threads_start(void); +void thread_stop(char *id); +void threads_cpu_usage(int print); +int threads_gc(void); +void thread_signal(char *id, int signal); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/tzdata.h b/lib/ESPiLight/pilight/libs/pilight/core/tzdata.h new file mode 100644 index 0000000..5115236 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/tzdata.h @@ -0,0 +1,6195 @@ +// Copyright (c) 2016 Nuxi, https://nuxi.nl/ +// +// This file is distributed under a 2-clause BSD license. +// See the LICENSE file for details. + +// The IANA "tzdata" time zone database, version 2017b. +// This file has been generated by gen_tzdata.py. + +// Updated on 2017-08-20 09:45:56.065070 + +static const struct lc_timezone_rule rules_020[] = { + {0, 255, 0, 7, 1, 0, TIMEBASE_CUR, 2, "\0"}, +}; +static const struct lc_timezone_rule rules_030[] = { + {0, 255, 0, 7, 1, 0, TIMEBASE_CUR, 3, "\0"}, +}; +static const struct lc_timezone_rule rules_100[] = { + {0, 255, 0, 7, 1, 0, TIMEBASE_CUR, 6, "\0"}, +}; +static const struct lc_timezone_rule rules_AN[] = { + {71, 85, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {72, 72, 1, 7, 27, 120, TIMEBASE_STD, 0, "S\0"}, + {73, 81, 2, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {82, 82, 3, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {83, 85, 2, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {86, 89, 2, 0, 15, 120, TIMEBASE_STD, 0, "S\0"}, + {86, 86, 9, 7, 19, 120, TIMEBASE_STD, 6, "D\0"}, + {87, 99, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {90, 95, 2, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {96, 105, 2, 0, 25, 120, TIMEBASE_STD, 0, "S\0"}, + {100, 100, 7, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {101, 107, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {106, 106, 3, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {107, 107, 2, 0, 25, 120, TIMEBASE_STD, 0, "S\0"}, + {108, 255, 3, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {108, 255, 9, 0, 1, 120, TIMEBASE_STD, 6, "D\0"}, +}; +static const struct lc_timezone_rule rules_AQ[] = { + {71, 71, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {72, 72, 1, 0, 22, 120, TIMEBASE_STD, 0, "S\0"}, + {89, 91, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {90, 92, 2, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_AS[] = { + {71, 85, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {72, 72, 1, 7, 27, 120, TIMEBASE_STD, 0, "S\0"}, + {73, 85, 2, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {86, 90, 2, 0, 15, 120, TIMEBASE_STD, 0, "S\0"}, + {86, 86, 9, 7, 19, 120, TIMEBASE_STD, 6, "D\0"}, + {87, 107, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {91, 91, 2, 7, 3, 120, TIMEBASE_STD, 0, "S\0"}, + {92, 92, 2, 7, 22, 120, TIMEBASE_STD, 0, "S\0"}, + {93, 93, 2, 7, 7, 120, TIMEBASE_STD, 0, "S\0"}, + {94, 94, 2, 7, 20, 120, TIMEBASE_STD, 0, "S\0"}, + {95, 105, 2, 0, 25, 120, TIMEBASE_STD, 0, "S\0"}, + {106, 106, 3, 7, 2, 120, TIMEBASE_STD, 0, "S\0"}, + {107, 107, 2, 0, 25, 120, TIMEBASE_STD, 0, "S\0"}, + {108, 255, 3, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {108, 255, 9, 0, 1, 120, TIMEBASE_STD, 6, "D\0"}, +}; +static const struct lc_timezone_rule rules_AT[] = { + {67, 67, 9, 0, 1, 120, TIMEBASE_STD, 6, "D\0"}, + {68, 68, 2, 0, 25, 120, TIMEBASE_STD, 0, "S\0"}, + {68, 85, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {69, 71, 2, 0, 8, 120, TIMEBASE_STD, 0, "S\0"}, + {72, 72, 1, 0, 22, 120, TIMEBASE_STD, 0, "S\0"}, + {73, 81, 2, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {82, 83, 2, 0, 25, 120, TIMEBASE_STD, 0, "S\0"}, + {84, 86, 2, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {86, 86, 9, 0, 15, 120, TIMEBASE_STD, 6, "D\0"}, + {87, 90, 2, 0, 15, 120, TIMEBASE_STD, 0, "S\0"}, + {87, 87, 9, 0, 22, 120, TIMEBASE_STD, 6, "D\0"}, + {88, 90, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {91, 105, 2, 0, 25, 120, TIMEBASE_STD, 0, "S\0"}, + {91, 99, 9, 0, 1, 120, TIMEBASE_STD, 6, "D\0"}, + {100, 100, 7, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {101, 255, 9, 0, 1, 120, TIMEBASE_STD, 6, "D\0"}, + {106, 106, 3, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {107, 107, 2, 0, 25, 120, TIMEBASE_STD, 0, "S\0"}, + {108, 255, 3, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_AV[] = { + {71, 85, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {72, 72, 1, 0, 22, 120, TIMEBASE_STD, 0, "S\0"}, + {73, 85, 2, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {86, 90, 2, 0, 15, 120, TIMEBASE_STD, 0, "S\0"}, + {86, 87, 9, 0, 15, 120, TIMEBASE_STD, 6, "D\0"}, + {88, 99, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {91, 94, 2, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {95, 105, 2, 0, 25, 120, TIMEBASE_STD, 0, "S\0"}, + {100, 100, 7, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {101, 107, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {106, 106, 3, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {107, 107, 2, 0, 25, 120, TIMEBASE_STD, 0, "S\0"}, + {108, 255, 3, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {108, 255, 9, 0, 1, 120, TIMEBASE_STD, 6, "D\0"}, +}; +static const struct lc_timezone_rule rules_AW[] = { + {74, 74, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {75, 75, 2, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {83, 83, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {84, 84, 2, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {91, 91, 10, 7, 17, 120, TIMEBASE_STD, 6, "D\0"}, + {92, 92, 2, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {106, 106, 11, 7, 3, 120, TIMEBASE_STD, 6, "D\0"}, + {107, 109, 2, 0, 25, 120, TIMEBASE_STD, 0, "S\0"}, + {107, 108, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, +}; +static const struct lc_timezone_rule rules_Albania[] = { + {40, 40, 5, 7, 16, 0, TIMEBASE_CUR, 6, "S\0"}, + {42, 42, 10, 7, 2, 180, TIMEBASE_CUR, 0, "\0"}, + {43, 43, 2, 7, 29, 120, TIMEBASE_CUR, 6, "S\0"}, + {43, 43, 3, 7, 10, 180, TIMEBASE_CUR, 0, "\0"}, + {74, 74, 4, 7, 4, 0, TIMEBASE_CUR, 6, "S\0"}, + {74, 74, 9, 7, 2, 0, TIMEBASE_CUR, 0, "\0"}, + {75, 75, 4, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {75, 75, 9, 7, 2, 0, TIMEBASE_CUR, 0, "\0"}, + {76, 76, 4, 7, 2, 0, TIMEBASE_CUR, 6, "S\0"}, + {76, 76, 9, 7, 3, 0, TIMEBASE_CUR, 0, "\0"}, + {77, 77, 4, 7, 8, 0, TIMEBASE_CUR, 6, "S\0"}, + {77, 77, 9, 7, 2, 0, TIMEBASE_CUR, 0, "\0"}, + {78, 78, 4, 7, 6, 0, TIMEBASE_CUR, 6, "S\0"}, + {78, 78, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {79, 79, 4, 7, 5, 0, TIMEBASE_CUR, 6, "S\0"}, + {79, 79, 8, 7, 30, 0, TIMEBASE_CUR, 0, "\0"}, + {80, 80, 4, 7, 3, 0, TIMEBASE_CUR, 6, "S\0"}, + {80, 80, 9, 7, 4, 0, TIMEBASE_CUR, 0, "\0"}, + {81, 81, 3, 7, 26, 0, TIMEBASE_CUR, 6, "S\0"}, + {81, 81, 8, 7, 27, 0, TIMEBASE_CUR, 0, "\0"}, + {82, 82, 4, 7, 2, 0, TIMEBASE_CUR, 6, "S\0"}, + {82, 82, 9, 7, 3, 0, TIMEBASE_CUR, 0, "\0"}, + {83, 83, 3, 7, 18, 0, TIMEBASE_CUR, 6, "S\0"}, + {83, 83, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {84, 84, 3, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_Algeria[] = { + {16, 16, 5, 7, 14, 1380, TIMEBASE_STD, 6, "S\0"}, + {16, 19, 9, 0, 1, 1380, TIMEBASE_STD, 0, "\0"}, + {17, 17, 2, 7, 24, 1380, TIMEBASE_STD, 6, "S\0"}, + {18, 18, 2, 7, 9, 1380, TIMEBASE_STD, 6, "S\0"}, + {19, 19, 2, 7, 1, 1380, TIMEBASE_STD, 6, "S\0"}, + {20, 20, 1, 7, 14, 1380, TIMEBASE_STD, 6, "S\0"}, + {20, 20, 9, 7, 23, 1380, TIMEBASE_STD, 0, "\0"}, + {21, 21, 2, 7, 14, 1380, TIMEBASE_STD, 6, "S\0"}, + {21, 21, 5, 7, 21, 1380, TIMEBASE_STD, 0, "\0"}, + {39, 39, 8, 7, 11, 1380, TIMEBASE_STD, 6, "S\0"}, + {39, 39, 10, 7, 19, 60, TIMEBASE_CUR, 0, "\0"}, + {44, 45, 3, 1, 1, 120, TIMEBASE_CUR, 6, "S\0"}, + {44, 44, 9, 7, 8, 120, TIMEBASE_CUR, 0, "\0"}, + {45, 45, 8, 7, 16, 60, TIMEBASE_CUR, 0, "\0"}, + {71, 71, 3, 7, 25, 1380, TIMEBASE_STD, 6, "S\0"}, + {71, 71, 8, 7, 26, 1380, TIMEBASE_STD, 0, "\0"}, + {77, 77, 4, 7, 6, 0, TIMEBASE_CUR, 6, "S\0"}, + {77, 77, 9, 7, 21, 0, TIMEBASE_CUR, 0, "\0"}, + {78, 78, 2, 7, 24, 60, TIMEBASE_CUR, 6, "S\0"}, + {78, 78, 8, 7, 22, 180, TIMEBASE_CUR, 0, "\0"}, + {80, 80, 3, 7, 25, 0, TIMEBASE_CUR, 6, "S\0"}, + {80, 80, 9, 7, 31, 120, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Arg[] = { + {30, 30, 11, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {31, 31, 3, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {31, 31, 9, 7, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {32, 40, 2, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {32, 39, 10, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {40, 40, 6, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {41, 41, 5, 7, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {41, 41, 9, 7, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {43, 43, 7, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {43, 43, 9, 7, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {46, 46, 2, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {46, 46, 9, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {63, 63, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {63, 63, 11, 7, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {64, 66, 2, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {64, 66, 9, 7, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {67, 67, 3, 7, 2, 0, TIMEBASE_CUR, 0, "\0"}, + {67, 68, 9, 0, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {68, 69, 3, 0, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {74, 74, 0, 7, 23, 0, TIMEBASE_CUR, 6, "S\0"}, + {74, 74, 4, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {88, 88, 11, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {89, 93, 2, 0, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {89, 92, 9, 0, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {99, 99, 9, 0, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {100, 100, 2, 7, 3, 0, TIMEBASE_CUR, 0, "\0"}, + {107, 107, 11, 7, 30, 0, TIMEBASE_CUR, 6, "S\0"}, + {108, 109, 2, 0, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {108, 108, 9, 0, 15, 0, TIMEBASE_CUR, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_Aus[] = { + {17, 17, 0, 7, 1, 1, TIMEBASE_CUR, 6, "D\0"}, + {17, 17, 2, 7, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {42, 42, 0, 7, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {42, 42, 2, 7, 29, 120, TIMEBASE_CUR, 0, "S\0"}, + {42, 42, 8, 7, 27, 120, TIMEBASE_CUR, 6, "D\0"}, + {43, 44, 2, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {43, 43, 9, 7, 3, 120, TIMEBASE_CUR, 6, "D\0"}, +}; +static const struct lc_timezone_rule rules_Austria[] = { + {20, 20, 3, 7, 5, 120, TIMEBASE_STD, 6, "S\0"}, + {20, 20, 8, 7, 13, 120, TIMEBASE_STD, 0, "\0"}, + {46, 46, 3, 7, 14, 120, TIMEBASE_STD, 6, "S\0"}, + {46, 48, 9, 0, 1, 120, TIMEBASE_STD, 0, "\0"}, + {47, 47, 3, 7, 6, 120, TIMEBASE_STD, 6, "S\0"}, + {48, 48, 3, 7, 18, 120, TIMEBASE_STD, 6, "S\0"}, + {80, 80, 3, 7, 6, 0, TIMEBASE_CUR, 6, "S\0"}, + {80, 80, 8, 7, 28, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Azer[] = { + {97, 115, 2, 0, 25, 240, TIMEBASE_CUR, 6, "S\0"}, + {97, 115, 9, 0, 25, 300, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Bahamas[] = { + {64, 75, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {64, 75, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Barb[] = { + {77, 77, 5, 7, 12, 120, TIMEBASE_CUR, 6, "D\0"}, + {77, 78, 9, 0, 1, 120, TIMEBASE_CUR, 0, "S\0"}, + {78, 80, 3, 0, 15, 120, TIMEBASE_CUR, 6, "D\0"}, + {79, 79, 8, 7, 30, 120, TIMEBASE_CUR, 0, "S\0"}, + {80, 80, 8, 7, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Belgium[] = { + {18, 18, 2, 7, 9, 0, TIMEBASE_STD, 6, "S\0"}, + {18, 19, 9, 6, 1, 1380, TIMEBASE_STD, 0, "\0"}, + {19, 19, 2, 7, 1, 1380, TIMEBASE_STD, 6, "S\0"}, + {20, 20, 1, 7, 14, 1380, TIMEBASE_STD, 6, "S\0"}, + {20, 20, 9, 7, 23, 1380, TIMEBASE_STD, 0, "\0"}, + {21, 21, 2, 7, 14, 1380, TIMEBASE_STD, 6, "S\0"}, + {21, 21, 9, 7, 25, 1380, TIMEBASE_STD, 0, "\0"}, + {22, 22, 2, 7, 25, 1380, TIMEBASE_STD, 6, "S\0"}, + {22, 27, 9, 6, 1, 1380, TIMEBASE_STD, 0, "\0"}, + {23, 23, 3, 7, 21, 1380, TIMEBASE_STD, 6, "S\0"}, + {24, 24, 2, 7, 29, 1380, TIMEBASE_STD, 6, "S\0"}, + {25, 25, 3, 7, 4, 1380, TIMEBASE_STD, 6, "S\0"}, + {26, 26, 3, 7, 17, 1380, TIMEBASE_STD, 6, "S\0"}, + {27, 27, 3, 7, 9, 1380, TIMEBASE_STD, 6, "S\0"}, + {28, 28, 3, 7, 14, 1380, TIMEBASE_STD, 6, "S\0"}, + {28, 38, 9, 0, 2, 120, TIMEBASE_STD, 0, "\0"}, + {29, 29, 3, 7, 21, 120, TIMEBASE_STD, 6, "S\0"}, + {30, 30, 3, 7, 13, 120, TIMEBASE_STD, 6, "S\0"}, + {31, 31, 3, 7, 19, 120, TIMEBASE_STD, 6, "S\0"}, + {32, 32, 3, 7, 3, 120, TIMEBASE_STD, 6, "S\0"}, + {33, 33, 2, 7, 26, 120, TIMEBASE_STD, 6, "S\0"}, + {34, 34, 3, 7, 8, 120, TIMEBASE_STD, 6, "S\0"}, + {35, 35, 2, 7, 31, 120, TIMEBASE_STD, 6, "S\0"}, + {36, 36, 3, 7, 19, 120, TIMEBASE_STD, 6, "S\0"}, + {37, 37, 3, 7, 4, 120, TIMEBASE_STD, 6, "S\0"}, + {38, 38, 2, 7, 27, 120, TIMEBASE_STD, 6, "S\0"}, + {39, 39, 3, 7, 16, 120, TIMEBASE_STD, 6, "S\0"}, + {39, 39, 10, 7, 19, 120, TIMEBASE_STD, 0, "\0"}, + {40, 40, 1, 7, 25, 120, TIMEBASE_STD, 6, "S\0"}, + {44, 44, 8, 7, 17, 120, TIMEBASE_STD, 0, "\0"}, + {45, 45, 3, 7, 2, 120, TIMEBASE_STD, 6, "S\0"}, + {45, 45, 8, 7, 16, 120, TIMEBASE_STD, 0, "\0"}, + {46, 46, 4, 7, 19, 120, TIMEBASE_STD, 6, "S\0"}, + {46, 46, 9, 7, 7, 120, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Belize[] = { + {18, 42, 9, 0, 2, 0, TIMEBASE_CUR, 3, "-0530\0"}, + {19, 43, 1, 0, 9, 0, TIMEBASE_CUR, 0, "CST\0"}, + {73, 73, 11, 7, 5, 0, TIMEBASE_CUR, 6, "CDT\0"}, + {74, 74, 1, 7, 9, 0, TIMEBASE_CUR, 0, "CST\0"}, + {82, 82, 11, 7, 18, 0, TIMEBASE_CUR, 6, "CDT\0"}, + {83, 83, 1, 7, 12, 0, TIMEBASE_CUR, 0, "CST\0"}, +}; +static const struct lc_timezone_rule rules_Brazil[] = { + {31, 31, 9, 7, 3, 660, TIMEBASE_CUR, 6, "S\0"}, + {32, 33, 3, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {32, 32, 9, 7, 3, 0, TIMEBASE_CUR, 6, "S\0"}, + {49, 52, 11, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {50, 50, 3, 7, 16, 60, TIMEBASE_CUR, 0, "\0"}, + {51, 52, 3, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {53, 53, 2, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {63, 63, 11, 7, 9, 0, TIMEBASE_CUR, 6, "S\0"}, + {64, 64, 2, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {65, 65, 0, 7, 31, 0, TIMEBASE_CUR, 6, "S\0"}, + {65, 65, 2, 7, 31, 0, TIMEBASE_CUR, 0, "\0"}, + {65, 65, 11, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {66, 68, 2, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {66, 67, 10, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {85, 85, 10, 7, 2, 0, TIMEBASE_CUR, 6, "S\0"}, + {86, 86, 2, 7, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {86, 86, 9, 7, 25, 0, TIMEBASE_CUR, 6, "S\0"}, + {87, 87, 1, 7, 14, 0, TIMEBASE_CUR, 0, "\0"}, + {87, 87, 9, 7, 25, 0, TIMEBASE_CUR, 6, "S\0"}, + {88, 88, 1, 7, 7, 0, TIMEBASE_CUR, 0, "\0"}, + {88, 88, 9, 7, 16, 0, TIMEBASE_CUR, 6, "S\0"}, + {89, 89, 0, 7, 29, 0, TIMEBASE_CUR, 0, "\0"}, + {89, 89, 9, 7, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {90, 90, 1, 7, 11, 0, TIMEBASE_CUR, 0, "\0"}, + {90, 90, 9, 7, 21, 0, TIMEBASE_CUR, 6, "S\0"}, + {91, 91, 1, 7, 17, 0, TIMEBASE_CUR, 0, "\0"}, + {91, 91, 9, 7, 20, 0, TIMEBASE_CUR, 6, "S\0"}, + {92, 92, 1, 7, 9, 0, TIMEBASE_CUR, 0, "\0"}, + {92, 92, 9, 7, 25, 0, TIMEBASE_CUR, 6, "S\0"}, + {93, 93, 0, 7, 31, 0, TIMEBASE_CUR, 0, "\0"}, + {93, 95, 9, 0, 11, 0, TIMEBASE_CUR, 6, "S\0"}, + {94, 95, 1, 0, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {96, 96, 1, 7, 11, 0, TIMEBASE_CUR, 0, "\0"}, + {96, 96, 9, 7, 6, 0, TIMEBASE_CUR, 6, "S\0"}, + {97, 97, 1, 7, 16, 0, TIMEBASE_CUR, 0, "\0"}, + {97, 97, 9, 7, 6, 0, TIMEBASE_CUR, 6, "S\0"}, + {98, 98, 2, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {98, 98, 9, 7, 11, 0, TIMEBASE_CUR, 6, "S\0"}, + {99, 99, 1, 7, 21, 0, TIMEBASE_CUR, 0, "\0"}, + {99, 99, 9, 7, 3, 0, TIMEBASE_CUR, 6, "S\0"}, + {100, 100, 1, 7, 27, 0, TIMEBASE_CUR, 0, "\0"}, + {100, 101, 9, 0, 8, 0, TIMEBASE_CUR, 6, "S\0"}, + {101, 106, 1, 0, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {102, 102, 10, 7, 3, 0, TIMEBASE_CUR, 6, "S\0"}, + {103, 103, 9, 7, 19, 0, TIMEBASE_CUR, 6, "S\0"}, + {104, 104, 10, 7, 2, 0, TIMEBASE_CUR, 6, "S\0"}, + {105, 105, 9, 7, 16, 0, TIMEBASE_CUR, 6, "S\0"}, + {106, 106, 10, 7, 5, 0, TIMEBASE_CUR, 6, "S\0"}, + {107, 107, 1, 7, 25, 0, TIMEBASE_CUR, 0, "\0"}, + {107, 107, 9, 0, 8, 0, TIMEBASE_CUR, 6, "S\0"}, + {108, 111, 1, 0, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {108, 255, 9, 0, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {112, 112, 1, 0, 22, 0, TIMEBASE_CUR, 0, "\0"}, + {113, 114, 1, 0, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {115, 115, 1, 0, 22, 0, TIMEBASE_CUR, 0, "\0"}, + {116, 122, 1, 0, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {123, 123, 1, 0, 22, 0, TIMEBASE_CUR, 0, "\0"}, + {124, 125, 1, 0, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {126, 126, 1, 0, 22, 0, TIMEBASE_CUR, 0, "\0"}, + {127, 133, 1, 0, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {134, 134, 1, 0, 22, 0, TIMEBASE_CUR, 0, "\0"}, + {135, 136, 1, 0, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {137, 137, 1, 0, 22, 0, TIMEBASE_CUR, 0, "\0"}, + {138, 255, 1, 0, 15, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Bulg[] = { + {79, 79, 2, 7, 31, 1380, TIMEBASE_CUR, 6, "S\0"}, + {79, 79, 9, 7, 1, 60, TIMEBASE_CUR, 0, "\0"}, + {80, 82, 3, 6, 1, 1380, TIMEBASE_CUR, 6, "S\0"}, + {80, 80, 8, 7, 29, 60, TIMEBASE_CUR, 0, "\0"}, + {81, 81, 8, 7, 27, 120, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_CA[] = { + {48, 48, 2, 7, 14, 121, TIMEBASE_CUR, 6, "D\0"}, + {49, 49, 0, 7, 1, 120, TIMEBASE_CUR, 0, "S\0"}, + {50, 66, 3, 0, 24, 60, TIMEBASE_CUR, 6, "D\0"}, + {50, 61, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {62, 66, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_CO[] = { + {92, 92, 4, 7, 3, 0, TIMEBASE_CUR, 6, "S\0"}, + {93, 93, 3, 7, 4, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_CR[] = { + {79, 80, 1, 0, 22, 0, TIMEBASE_CUR, 6, "D\0"}, + {79, 80, 5, 0, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {91, 92, 0, 6, 15, 0, TIMEBASE_CUR, 6, "D\0"}, + {91, 91, 6, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {92, 92, 2, 7, 15, 0, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_C_Eur[] = { + {16, 16, 3, 7, 30, 1380, TIMEBASE_CUR, 6, "S\0"}, + {16, 16, 9, 7, 1, 60, TIMEBASE_CUR, 0, "\0"}, + {17, 18, 3, 1, 15, 120, TIMEBASE_STD, 6, "S\0"}, + {17, 18, 8, 1, 15, 120, TIMEBASE_STD, 0, "\0"}, + {40, 40, 3, 7, 1, 120, TIMEBASE_STD, 6, "S\0"}, + {42, 42, 10, 7, 2, 120, TIMEBASE_STD, 0, "\0"}, + {43, 43, 2, 7, 29, 120, TIMEBASE_STD, 6, "S\0"}, + {43, 43, 9, 7, 4, 120, TIMEBASE_STD, 0, "\0"}, + {44, 45, 3, 1, 1, 120, TIMEBASE_STD, 6, "S\0"}, + {44, 44, 9, 7, 2, 120, TIMEBASE_STD, 0, "\0"}, + {45, 45, 8, 7, 16, 120, TIMEBASE_STD, 0, "\0"}, + {77, 80, 3, 0, 1, 120, TIMEBASE_STD, 6, "S\0"}, + {77, 77, 8, 0, 24, 120, TIMEBASE_STD, 0, "\0"}, + {78, 78, 9, 7, 1, 120, TIMEBASE_STD, 0, "\0"}, + {79, 95, 8, 0, 24, 120, TIMEBASE_STD, 0, "\0"}, + {81, 255, 2, 0, 25, 120, TIMEBASE_STD, 6, "S\0"}, + {96, 255, 9, 0, 25, 120, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Canada[] = { + {18, 18, 3, 7, 14, 120, TIMEBASE_CUR, 6, "D\0"}, + {18, 18, 9, 7, 27, 120, TIMEBASE_CUR, 0, "S\0"}, + {42, 42, 1, 7, 9, 120, TIMEBASE_CUR, 6, "W\0"}, + {45, 45, 7, 7, 14, 1380, TIMEBASE_UTC, 6, "P\0"}, + {45, 45, 8, 7, 30, 120, TIMEBASE_CUR, 0, "S\0"}, + {74, 86, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {74, 106, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {87, 106, 3, 0, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {107, 255, 2, 0, 8, 120, TIMEBASE_CUR, 6, "D\0"}, + {107, 255, 10, 0, 1, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Chatham[] = { + {74, 74, 10, 0, 1, 165, TIMEBASE_STD, 6, "D\0"}, + {75, 75, 1, 0, 22, 165, TIMEBASE_STD, 0, "S\0"}, + {75, 88, 9, 0, 25, 165, TIMEBASE_STD, 6, "D\0"}, + {76, 89, 2, 0, 1, 165, TIMEBASE_STD, 0, "S\0"}, + {89, 89, 9, 0, 8, 165, TIMEBASE_STD, 6, "D\0"}, + {90, 107, 2, 0, 15, 165, TIMEBASE_STD, 0, "S\0"}, + {90, 106, 9, 0, 1, 165, TIMEBASE_STD, 6, "D\0"}, + {107, 255, 8, 0, 24, 165, TIMEBASE_STD, 6, "D\0"}, + {108, 255, 3, 0, 1, 165, TIMEBASE_STD, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Chicago[] = { + {20, 20, 5, 7, 13, 120, TIMEBASE_CUR, 6, "D\0"}, + {20, 21, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {21, 21, 2, 0, 25, 120, TIMEBASE_CUR, 6, "D\0"}, + {22, 66, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {22, 54, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {55, 66, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Chile[] = { + {27, 31, 8, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {28, 32, 3, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {68, 68, 10, 7, 3, 240, TIMEBASE_UTC, 6, "S\0"}, + {69, 69, 2, 7, 30, 180, TIMEBASE_UTC, 0, "\0"}, + {69, 69, 10, 7, 23, 240, TIMEBASE_UTC, 6, "S\0"}, + {70, 70, 2, 7, 29, 180, TIMEBASE_UTC, 0, "\0"}, + {70, 72, 9, 0, 9, 240, TIMEBASE_UTC, 6, "S\0"}, + {71, 71, 2, 7, 14, 180, TIMEBASE_UTC, 0, "\0"}, + {72, 86, 2, 0, 9, 180, TIMEBASE_UTC, 0, "\0"}, + {73, 73, 8, 7, 30, 240, TIMEBASE_UTC, 6, "S\0"}, + {74, 87, 9, 0, 9, 240, TIMEBASE_UTC, 6, "S\0"}, + {87, 87, 3, 7, 12, 180, TIMEBASE_UTC, 0, "\0"}, + {88, 90, 2, 0, 9, 180, TIMEBASE_UTC, 0, "\0"}, + {88, 89, 9, 0, 9, 240, TIMEBASE_UTC, 6, "S\0"}, + {90, 90, 8, 7, 16, 240, TIMEBASE_UTC, 6, "S\0"}, + {91, 96, 2, 0, 9, 180, TIMEBASE_UTC, 0, "\0"}, + {91, 97, 9, 0, 9, 240, TIMEBASE_UTC, 6, "S\0"}, + {97, 97, 2, 7, 30, 180, TIMEBASE_UTC, 0, "\0"}, + {98, 98, 2, 0, 9, 180, TIMEBASE_UTC, 0, "\0"}, + {98, 98, 8, 7, 27, 240, TIMEBASE_UTC, 6, "S\0"}, + {99, 99, 3, 7, 4, 180, TIMEBASE_UTC, 0, "\0"}, + {99, 110, 9, 0, 9, 240, TIMEBASE_UTC, 6, "S\0"}, + {100, 107, 2, 0, 9, 180, TIMEBASE_UTC, 0, "\0"}, + {108, 108, 2, 7, 30, 180, TIMEBASE_UTC, 0, "\0"}, + {109, 109, 2, 0, 9, 180, TIMEBASE_UTC, 0, "\0"}, + {110, 110, 3, 0, 1, 180, TIMEBASE_UTC, 0, "\0"}, + {111, 111, 4, 0, 2, 180, TIMEBASE_UTC, 0, "\0"}, + {111, 111, 7, 0, 16, 240, TIMEBASE_UTC, 6, "S\0"}, + {112, 114, 3, 0, 23, 180, TIMEBASE_UTC, 0, "\0"}, + {112, 114, 8, 0, 2, 240, TIMEBASE_UTC, 6, "S\0"}, + {116, 255, 4, 0, 9, 180, TIMEBASE_UTC, 0, "\0"}, + {116, 255, 7, 0, 9, 240, TIMEBASE_UTC, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_Cook[] = { + {78, 78, 10, 7, 12, 0, TIMEBASE_CUR, 3, "HS\0"}, + {79, 91, 2, 0, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {79, 90, 9, 0, 25, 0, TIMEBASE_CUR, 3, "HS\0"}, +}; +static const struct lc_timezone_rule rules_Cuba[] = { + {28, 28, 5, 7, 10, 0, TIMEBASE_CUR, 6, "D\0"}, + {28, 28, 9, 7, 10, 0, TIMEBASE_CUR, 0, "S\0"}, + {40, 42, 5, 0, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {40, 42, 8, 0, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {45, 46, 5, 0, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {45, 46, 8, 0, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {65, 65, 5, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {65, 65, 8, 7, 30, 0, TIMEBASE_CUR, 0, "S\0"}, + {66, 66, 4, 7, 29, 0, TIMEBASE_CUR, 6, "D\0"}, + {66, 66, 9, 7, 2, 0, TIMEBASE_CUR, 0, "S\0"}, + {67, 67, 3, 7, 8, 0, TIMEBASE_CUR, 6, "D\0"}, + {67, 68, 8, 0, 8, 0, TIMEBASE_CUR, 0, "S\0"}, + {68, 68, 3, 7, 14, 0, TIMEBASE_CUR, 6, "D\0"}, + {69, 77, 3, 0, 24, 0, TIMEBASE_CUR, 6, "D\0"}, + {69, 71, 9, 0, 25, 0, TIMEBASE_CUR, 0, "S\0"}, + {72, 74, 9, 7, 8, 0, TIMEBASE_CUR, 0, "S\0"}, + {75, 77, 9, 0, 25, 0, TIMEBASE_CUR, 0, "S\0"}, + {78, 78, 4, 7, 7, 0, TIMEBASE_CUR, 6, "D\0"}, + {78, 90, 9, 0, 8, 0, TIMEBASE_CUR, 0, "S\0"}, + {79, 80, 2, 0, 15, 0, TIMEBASE_CUR, 6, "D\0"}, + {81, 85, 4, 0, 5, 0, TIMEBASE_CUR, 6, "D\0"}, + {86, 89, 2, 0, 14, 0, TIMEBASE_CUR, 6, "D\0"}, + {90, 97, 3, 0, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {91, 95, 9, 0, 8, 0, TIMEBASE_STD, 0, "S\0"}, + {96, 96, 9, 7, 6, 0, TIMEBASE_STD, 0, "S\0"}, + {97, 97, 9, 7, 12, 0, TIMEBASE_STD, 0, "S\0"}, + {98, 99, 2, 0, 25, 0, TIMEBASE_STD, 6, "D\0"}, + {98, 103, 9, 0, 25, 0, TIMEBASE_STD, 0, "S\0"}, + {100, 103, 3, 0, 1, 0, TIMEBASE_STD, 6, "D\0"}, + {104, 104, 2, 0, 25, 0, TIMEBASE_STD, 6, "D\0"}, + {106, 110, 9, 0, 25, 0, TIMEBASE_STD, 0, "S\0"}, + {107, 107, 2, 0, 8, 0, TIMEBASE_STD, 6, "D\0"}, + {108, 108, 2, 0, 15, 0, TIMEBASE_STD, 6, "D\0"}, + {109, 110, 2, 0, 8, 0, TIMEBASE_STD, 6, "D\0"}, + {111, 111, 2, 0, 15, 0, TIMEBASE_STD, 6, "D\0"}, + {111, 111, 10, 7, 13, 0, TIMEBASE_STD, 0, "S\0"}, + {112, 112, 3, 7, 1, 0, TIMEBASE_STD, 6, "D\0"}, + {112, 255, 10, 0, 1, 0, TIMEBASE_STD, 0, "S\0"}, + {113, 255, 2, 0, 8, 0, TIMEBASE_STD, 6, "D\0"}, +}; +static const struct lc_timezone_rule rules_Cyprus[] = { + {75, 75, 3, 7, 13, 0, TIMEBASE_CUR, 6, "S\0"}, + {75, 75, 9, 7, 12, 0, TIMEBASE_CUR, 0, "\0"}, + {76, 76, 4, 7, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {76, 76, 9, 7, 11, 0, TIMEBASE_CUR, 0, "\0"}, + {77, 80, 3, 0, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {77, 77, 8, 7, 25, 0, TIMEBASE_CUR, 0, "\0"}, + {78, 78, 9, 7, 2, 0, TIMEBASE_CUR, 0, "\0"}, + {79, 97, 8, 0, 24, 0, TIMEBASE_CUR, 0, "\0"}, + {81, 98, 2, 0, 25, 0, TIMEBASE_CUR, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_Czech[] = { + {45, 45, 3, 7, 8, 120, TIMEBASE_STD, 6, "S\0"}, + {45, 45, 10, 7, 18, 120, TIMEBASE_STD, 0, "\0"}, + {46, 46, 4, 7, 6, 120, TIMEBASE_STD, 6, "S\0"}, + {46, 49, 9, 0, 1, 120, TIMEBASE_STD, 0, "\0"}, + {47, 47, 3, 7, 20, 120, TIMEBASE_STD, 6, "S\0"}, + {48, 48, 3, 7, 18, 120, TIMEBASE_STD, 6, "S\0"}, + {49, 49, 3, 7, 9, 120, TIMEBASE_STD, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_DR[] = { + {66, 66, 9, 7, 30, 0, TIMEBASE_CUR, 6, "EDT\0"}, + {67, 67, 1, 7, 28, 0, TIMEBASE_CUR, 0, "EST\0"}, + {69, 73, 9, 0, 25, 0, TIMEBASE_CUR, 3, "-0430\0"}, + {70, 70, 1, 7, 21, 0, TIMEBASE_CUR, 0, "EST\0"}, + {71, 71, 0, 7, 20, 0, TIMEBASE_CUR, 0, "EST\0"}, + {72, 74, 0, 7, 21, 0, TIMEBASE_CUR, 0, "EST\0"}, +}; +static const struct lc_timezone_rule rules_Denmark[] = { + {16, 16, 4, 7, 14, 1380, TIMEBASE_CUR, 6, "S\0"}, + {16, 16, 8, 7, 30, 1380, TIMEBASE_CUR, 0, "\0"}, + {40, 40, 4, 7, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {45, 45, 3, 7, 2, 120, TIMEBASE_STD, 6, "S\0"}, + {45, 45, 7, 7, 15, 120, TIMEBASE_STD, 0, "\0"}, + {46, 46, 4, 7, 1, 120, TIMEBASE_STD, 6, "S\0"}, + {46, 46, 8, 7, 1, 120, TIMEBASE_STD, 0, "\0"}, + {47, 47, 4, 7, 4, 120, TIMEBASE_STD, 6, "S\0"}, + {47, 47, 7, 7, 10, 120, TIMEBASE_STD, 0, "\0"}, + {48, 48, 4, 7, 9, 120, TIMEBASE_STD, 6, "S\0"}, + {48, 48, 7, 7, 8, 120, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Denver[] = { + {20, 21, 2, 0, 25, 120, TIMEBASE_CUR, 6, "D\0"}, + {20, 20, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {21, 21, 4, 7, 22, 120, TIMEBASE_CUR, 0, "S\0"}, + {65, 66, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {65, 66, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Detroit[] = { + {48, 48, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {48, 48, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {67, 67, 5, 7, 14, 120, TIMEBASE_CUR, 6, "D\0"}, + {67, 67, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Dhaka[] = { + {109, 109, 5, 7, 19, 1380, TIMEBASE_CUR, 6, "S\0"}, + {109, 109, 11, 7, 31, 1440, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_EU[] = { + {77, 80, 3, 0, 1, 60, TIMEBASE_UTC, 6, "S\0"}, + {77, 77, 8, 0, 24, 60, TIMEBASE_UTC, 0, "\0"}, + {78, 78, 9, 7, 1, 60, TIMEBASE_UTC, 0, "\0"}, + {79, 95, 8, 0, 24, 60, TIMEBASE_UTC, 0, "\0"}, + {81, 255, 2, 0, 25, 60, TIMEBASE_UTC, 6, "S\0"}, + {96, 255, 9, 0, 25, 60, TIMEBASE_UTC, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_EUAsia[] = { + {79, 95, 8, 0, 24, 60, TIMEBASE_UTC, 0, "\0"}, + {81, 255, 2, 0, 25, 60, TIMEBASE_UTC, 6, "S\0"}, + {96, 255, 9, 0, 25, 60, TIMEBASE_UTC, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_E_Eur[] = { + {77, 80, 3, 0, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {77, 77, 8, 0, 24, 0, TIMEBASE_CUR, 0, "\0"}, + {78, 78, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {79, 95, 8, 0, 24, 0, TIMEBASE_CUR, 0, "\0"}, + {81, 255, 2, 0, 25, 0, TIMEBASE_CUR, 6, "S\0"}, + {96, 255, 9, 0, 25, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_E_EurAsia[] = { + {79, 95, 8, 0, 24, 0, TIMEBASE_CUR, 0, "\0"}, + {81, 255, 2, 0, 25, 0, TIMEBASE_CUR, 6, "S\0"}, + {96, 255, 9, 0, 25, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Ecuador[] = { + {92, 92, 10, 7, 28, 0, TIMEBASE_CUR, 6, "S\0"}, + {93, 93, 1, 7, 5, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Edm[] = { + {18, 19, 3, 0, 8, 120, TIMEBASE_CUR, 6, "D\0"}, + {18, 18, 9, 7, 27, 120, TIMEBASE_CUR, 0, "S\0"}, + {19, 19, 4, 7, 27, 120, TIMEBASE_CUR, 0, "S\0"}, + {20, 23, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {20, 20, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {21, 23, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {42, 42, 1, 7, 9, 120, TIMEBASE_CUR, 6, "W\0"}, + {45, 45, 7, 7, 14, 1380, TIMEBASE_UTC, 6, "P\0"}, + {45, 45, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {47, 47, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {47, 47, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {67, 67, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {67, 67, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {69, 69, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {69, 69, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {72, 86, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {72, 106, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Egypt[] = { + {40, 40, 6, 7, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {40, 40, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {41, 41, 3, 7, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {41, 41, 8, 7, 16, 0, TIMEBASE_CUR, 0, "\0"}, + {42, 44, 3, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {42, 42, 9, 7, 27, 0, TIMEBASE_CUR, 0, "\0"}, + {43, 45, 10, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {45, 45, 3, 7, 16, 0, TIMEBASE_CUR, 6, "S\0"}, + {57, 57, 4, 7, 10, 0, TIMEBASE_CUR, 6, "S\0"}, + {57, 58, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {58, 58, 4, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {59, 81, 4, 7, 1, 60, TIMEBASE_CUR, 6, "S\0"}, + {59, 65, 8, 7, 30, 180, TIMEBASE_CUR, 0, "\0"}, + {66, 94, 9, 7, 1, 180, TIMEBASE_CUR, 0, "\0"}, + {82, 82, 6, 7, 25, 60, TIMEBASE_CUR, 6, "S\0"}, + {83, 83, 6, 7, 12, 60, TIMEBASE_CUR, 6, "S\0"}, + {84, 88, 4, 7, 1, 60, TIMEBASE_CUR, 6, "S\0"}, + {89, 89, 4, 7, 6, 60, TIMEBASE_CUR, 6, "S\0"}, + {90, 94, 4, 7, 1, 60, TIMEBASE_CUR, 6, "S\0"}, + {95, 110, 3, 5, 24, 0, TIMEBASE_STD, 6, "S\0"}, + {95, 105, 8, 4, 24, 1440, TIMEBASE_CUR, 0, "\0"}, + {106, 106, 8, 7, 21, 1440, TIMEBASE_CUR, 0, "\0"}, + {107, 107, 8, 4, 1, 1440, TIMEBASE_CUR, 0, "\0"}, + {108, 108, 7, 4, 25, 1440, TIMEBASE_CUR, 0, "\0"}, + {109, 109, 7, 7, 20, 1440, TIMEBASE_CUR, 0, "\0"}, + {110, 110, 7, 7, 10, 1440, TIMEBASE_CUR, 0, "\0"}, + {110, 110, 8, 7, 9, 1440, TIMEBASE_CUR, 6, "S\0"}, + {110, 110, 8, 4, 24, 1440, TIMEBASE_CUR, 0, "\0"}, + {114, 114, 4, 7, 15, 1440, TIMEBASE_CUR, 6, "S\0"}, + {114, 114, 5, 7, 26, 1440, TIMEBASE_CUR, 0, "\0"}, + {114, 114, 6, 7, 31, 1440, TIMEBASE_CUR, 6, "S\0"}, + {114, 114, 8, 4, 24, 1440, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_EgyptAsia[] = { + {57, 57, 4, 7, 10, 0, TIMEBASE_CUR, 6, "S\0"}, + {57, 58, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {58, 58, 4, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {59, 67, 4, 7, 1, 60, TIMEBASE_CUR, 6, "S\0"}, + {59, 65, 8, 7, 30, 180, TIMEBASE_CUR, 0, "\0"}, + {66, 66, 9, 7, 1, 180, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Falk[] = { + {37, 38, 8, 0, 24, 0, TIMEBASE_CUR, 6, "S\0"}, + {38, 42, 2, 0, 19, 0, TIMEBASE_CUR, 0, "\0"}, + {39, 39, 9, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {40, 42, 8, 0, 24, 0, TIMEBASE_CUR, 6, "S\0"}, + {42, 42, 11, 7, 31, 1440, TIMEBASE_CUR, 0, "\0"}, + {83, 83, 8, 0, 24, 0, TIMEBASE_CUR, 6, "S\0"}, + {84, 85, 3, 0, 24, 0, TIMEBASE_CUR, 0, "\0"}, + {84, 84, 8, 7, 16, 0, TIMEBASE_CUR, 6, "S\0"}, + {85, 100, 8, 0, 9, 0, TIMEBASE_CUR, 6, "S\0"}, + {86, 100, 3, 0, 16, 0, TIMEBASE_CUR, 0, "\0"}, + {101, 110, 3, 0, 15, 120, TIMEBASE_CUR, 0, "\0"}, + {101, 110, 8, 0, 1, 120, TIMEBASE_CUR, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_Fiji[] = { + {98, 99, 10, 0, 1, 120, TIMEBASE_CUR, 6, "S\0"}, + {99, 100, 1, 0, 22, 180, TIMEBASE_CUR, 0, "\0"}, + {109, 109, 10, 7, 29, 120, TIMEBASE_CUR, 6, "S\0"}, + {110, 110, 2, 0, 25, 180, TIMEBASE_CUR, 0, "\0"}, + {110, 113, 9, 0, 21, 120, TIMEBASE_CUR, 6, "S\0"}, + {111, 111, 2, 0, 1, 180, TIMEBASE_CUR, 0, "\0"}, + {112, 113, 0, 0, 18, 180, TIMEBASE_CUR, 0, "\0"}, + {114, 114, 0, 0, 18, 120, TIMEBASE_CUR, 0, "\0"}, + {114, 255, 10, 0, 1, 120, TIMEBASE_CUR, 6, "S\0"}, + {115, 255, 0, 0, 15, 180, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Finland[] = { + {42, 42, 3, 7, 2, 1440, TIMEBASE_CUR, 6, "S\0"}, + {42, 42, 9, 7, 4, 60, TIMEBASE_CUR, 0, "\0"}, + {81, 82, 2, 0, 25, 120, TIMEBASE_CUR, 6, "S\0"}, + {81, 82, 8, 0, 24, 180, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_France[] = { + {16, 16, 5, 7, 14, 1380, TIMEBASE_STD, 6, "S\0"}, + {16, 19, 9, 0, 1, 1380, TIMEBASE_STD, 0, "\0"}, + {17, 17, 2, 7, 24, 1380, TIMEBASE_STD, 6, "S\0"}, + {18, 18, 2, 7, 9, 1380, TIMEBASE_STD, 6, "S\0"}, + {19, 19, 2, 7, 1, 1380, TIMEBASE_STD, 6, "S\0"}, + {20, 20, 1, 7, 14, 1380, TIMEBASE_STD, 6, "S\0"}, + {20, 20, 9, 7, 23, 1380, TIMEBASE_STD, 0, "\0"}, + {21, 21, 2, 7, 14, 1380, TIMEBASE_STD, 6, "S\0"}, + {21, 21, 9, 7, 25, 1380, TIMEBASE_STD, 0, "\0"}, + {22, 22, 2, 7, 25, 1380, TIMEBASE_STD, 6, "S\0"}, + {22, 38, 9, 6, 1, 1380, TIMEBASE_STD, 0, "\0"}, + {23, 23, 4, 7, 26, 1380, TIMEBASE_STD, 6, "S\0"}, + {24, 24, 2, 7, 29, 1380, TIMEBASE_STD, 6, "S\0"}, + {25, 25, 3, 7, 4, 1380, TIMEBASE_STD, 6, "S\0"}, + {26, 26, 3, 7, 17, 1380, TIMEBASE_STD, 6, "S\0"}, + {27, 27, 3, 7, 9, 1380, TIMEBASE_STD, 6, "S\0"}, + {28, 28, 3, 7, 14, 1380, TIMEBASE_STD, 6, "S\0"}, + {29, 29, 3, 7, 20, 1380, TIMEBASE_STD, 6, "S\0"}, + {30, 30, 3, 7, 12, 1380, TIMEBASE_STD, 6, "S\0"}, + {31, 31, 3, 7, 18, 1380, TIMEBASE_STD, 6, "S\0"}, + {32, 32, 3, 7, 2, 1380, TIMEBASE_STD, 6, "S\0"}, + {33, 33, 2, 7, 25, 1380, TIMEBASE_STD, 6, "S\0"}, + {34, 34, 3, 7, 7, 1380, TIMEBASE_STD, 6, "S\0"}, + {35, 35, 2, 7, 30, 1380, TIMEBASE_STD, 6, "S\0"}, + {36, 36, 3, 7, 18, 1380, TIMEBASE_STD, 6, "S\0"}, + {37, 37, 3, 7, 3, 1380, TIMEBASE_STD, 6, "S\0"}, + {38, 38, 2, 7, 26, 1380, TIMEBASE_STD, 6, "S\0"}, + {39, 39, 3, 7, 15, 1380, TIMEBASE_STD, 6, "S\0"}, + {39, 39, 10, 7, 18, 1380, TIMEBASE_STD, 0, "\0"}, + {40, 40, 1, 7, 25, 120, TIMEBASE_CUR, 6, "S\0"}, + {41, 41, 4, 7, 5, 0, TIMEBASE_CUR, 12, "M\0"}, + {41, 41, 9, 7, 6, 0, TIMEBASE_CUR, 6, "S\0"}, + {42, 42, 2, 7, 9, 0, TIMEBASE_CUR, 12, "M\0"}, + {42, 42, 10, 7, 2, 180, TIMEBASE_CUR, 6, "S\0"}, + {43, 43, 2, 7, 29, 120, TIMEBASE_CUR, 12, "M\0"}, + {43, 43, 9, 7, 4, 180, TIMEBASE_CUR, 6, "S\0"}, + {44, 44, 3, 7, 3, 120, TIMEBASE_CUR, 12, "M\0"}, + {44, 44, 9, 7, 8, 60, TIMEBASE_CUR, 6, "S\0"}, + {45, 45, 3, 7, 2, 120, TIMEBASE_CUR, 12, "M\0"}, + {45, 45, 8, 7, 16, 180, TIMEBASE_CUR, 0, "\0"}, + {76, 76, 2, 7, 28, 60, TIMEBASE_CUR, 6, "S\0"}, + {76, 76, 8, 7, 26, 60, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_GB_Eire[] = { + {16, 16, 4, 7, 21, 120, TIMEBASE_STD, 6, "BST\0"}, + {16, 16, 9, 7, 1, 120, TIMEBASE_STD, 0, "GMT\0"}, + {17, 17, 3, 7, 8, 120, TIMEBASE_STD, 6, "BST\0"}, + {17, 17, 8, 7, 17, 120, TIMEBASE_STD, 0, "GMT\0"}, + {18, 18, 2, 7, 24, 120, TIMEBASE_STD, 6, "BST\0"}, + {18, 18, 8, 7, 30, 120, TIMEBASE_STD, 0, "GMT\0"}, + {19, 19, 2, 7, 30, 120, TIMEBASE_STD, 6, "BST\0"}, + {19, 19, 8, 7, 29, 120, TIMEBASE_STD, 0, "GMT\0"}, + {20, 20, 2, 7, 28, 120, TIMEBASE_STD, 6, "BST\0"}, + {20, 20, 9, 7, 25, 120, TIMEBASE_STD, 0, "GMT\0"}, + {21, 21, 3, 7, 3, 120, TIMEBASE_STD, 6, "BST\0"}, + {21, 21, 9, 7, 3, 120, TIMEBASE_STD, 0, "GMT\0"}, + {22, 22, 2, 7, 26, 120, TIMEBASE_STD, 6, "BST\0"}, + {22, 22, 9, 7, 8, 120, TIMEBASE_STD, 0, "GMT\0"}, + {23, 23, 3, 0, 16, 120, TIMEBASE_STD, 6, "BST\0"}, + {23, 24, 8, 0, 16, 120, TIMEBASE_STD, 0, "GMT\0"}, + {24, 24, 3, 0, 9, 120, TIMEBASE_STD, 6, "BST\0"}, + {25, 26, 3, 0, 16, 120, TIMEBASE_STD, 6, "BST\0"}, + {25, 38, 9, 0, 2, 120, TIMEBASE_STD, 0, "GMT\0"}, + {27, 27, 3, 0, 9, 120, TIMEBASE_STD, 6, "BST\0"}, + {28, 29, 3, 0, 16, 120, TIMEBASE_STD, 6, "BST\0"}, + {30, 30, 3, 0, 9, 120, TIMEBASE_STD, 6, "BST\0"}, + {31, 32, 3, 0, 16, 120, TIMEBASE_STD, 6, "BST\0"}, + {33, 33, 3, 0, 9, 120, TIMEBASE_STD, 6, "BST\0"}, + {34, 34, 3, 0, 16, 120, TIMEBASE_STD, 6, "BST\0"}, + {35, 35, 3, 0, 9, 120, TIMEBASE_STD, 6, "BST\0"}, + {36, 37, 3, 0, 16, 120, TIMEBASE_STD, 6, "BST\0"}, + {38, 38, 3, 0, 9, 120, TIMEBASE_STD, 6, "BST\0"}, + {39, 39, 3, 0, 16, 120, TIMEBASE_STD, 6, "BST\0"}, + {39, 39, 10, 0, 16, 120, TIMEBASE_STD, 0, "GMT\0"}, + {40, 40, 1, 0, 23, 120, TIMEBASE_STD, 6, "BST\0"}, + {41, 41, 4, 0, 2, 60, TIMEBASE_STD, 12, "BDST\0"}, + {41, 43, 7, 0, 9, 60, TIMEBASE_STD, 6, "BST\0"}, + {42, 44, 3, 0, 2, 60, TIMEBASE_STD, 12, "BDST\0"}, + {44, 44, 8, 0, 16, 60, TIMEBASE_STD, 6, "BST\0"}, + {45, 45, 3, 1, 2, 60, TIMEBASE_STD, 12, "BDST\0"}, + {45, 45, 6, 0, 9, 60, TIMEBASE_STD, 6, "BST\0"}, + {45, 46, 9, 0, 2, 120, TIMEBASE_STD, 0, "GMT\0"}, + {46, 46, 3, 0, 9, 120, TIMEBASE_STD, 6, "BST\0"}, + {47, 47, 2, 7, 16, 120, TIMEBASE_STD, 6, "BST\0"}, + {47, 47, 3, 7, 13, 60, TIMEBASE_STD, 12, "BDST\0"}, + {47, 47, 7, 7, 10, 60, TIMEBASE_STD, 6, "BST\0"}, + {47, 47, 10, 7, 2, 120, TIMEBASE_STD, 0, "GMT\0"}, + {48, 48, 2, 7, 14, 120, TIMEBASE_STD, 6, "BST\0"}, + {48, 48, 9, 7, 31, 120, TIMEBASE_STD, 0, "GMT\0"}, + {49, 49, 3, 7, 3, 120, TIMEBASE_STD, 6, "BST\0"}, + {49, 49, 9, 7, 30, 120, TIMEBASE_STD, 0, "GMT\0"}, + {50, 52, 3, 0, 14, 120, TIMEBASE_STD, 6, "BST\0"}, + {50, 52, 9, 0, 21, 120, TIMEBASE_STD, 0, "GMT\0"}, + {53, 53, 3, 0, 16, 120, TIMEBASE_STD, 6, "BST\0"}, + {53, 60, 9, 0, 2, 120, TIMEBASE_STD, 0, "GMT\0"}, + {54, 54, 3, 0, 9, 120, TIMEBASE_STD, 6, "BST\0"}, + {55, 56, 3, 0, 16, 120, TIMEBASE_STD, 6, "BST\0"}, + {57, 57, 3, 0, 9, 120, TIMEBASE_STD, 6, "BST\0"}, + {58, 59, 3, 0, 16, 120, TIMEBASE_STD, 6, "BST\0"}, + {60, 60, 3, 0, 9, 120, TIMEBASE_STD, 6, "BST\0"}, + {61, 63, 2, 0, 25, 120, TIMEBASE_STD, 6, "BST\0"}, + {61, 68, 9, 0, 23, 120, TIMEBASE_STD, 0, "GMT\0"}, + {64, 67, 2, 0, 19, 120, TIMEBASE_STD, 6, "BST\0"}, + {68, 68, 1, 7, 18, 120, TIMEBASE_STD, 6, "BST\0"}, + {72, 80, 2, 0, 16, 120, TIMEBASE_STD, 6, "BST\0"}, + {72, 80, 9, 0, 23, 120, TIMEBASE_STD, 0, "GMT\0"}, + {81, 95, 2, 0, 25, 60, TIMEBASE_UTC, 6, "BST\0"}, + {81, 89, 9, 0, 23, 60, TIMEBASE_UTC, 0, "GMT\0"}, + {90, 95, 9, 0, 22, 60, TIMEBASE_UTC, 0, "GMT\0"}, +}; +static const struct lc_timezone_rule rules_Germany[] = { + {46, 46, 3, 7, 14, 120, TIMEBASE_STD, 6, "S\0"}, + {46, 46, 9, 7, 7, 120, TIMEBASE_STD, 0, "\0"}, + {47, 47, 3, 7, 6, 180, TIMEBASE_STD, 6, "S\0"}, + {47, 47, 4, 7, 11, 120, TIMEBASE_STD, 12, "M\0"}, + {47, 47, 5, 7, 29, 180, TIMEBASE_CUR, 6, "S\0"}, + {47, 49, 9, 0, 1, 120, TIMEBASE_STD, 0, "\0"}, + {48, 48, 3, 7, 18, 120, TIMEBASE_STD, 6, "S\0"}, + {49, 49, 3, 7, 10, 120, TIMEBASE_STD, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_Ghana[] = { + {20, 42, 8, 7, 1, 0, TIMEBASE_CUR, 2, "GHST\0"}, + {20, 42, 11, 7, 31, 0, TIMEBASE_CUR, 0, "GMT\0"}, +}; +static const struct lc_timezone_rule rules_Greece[] = { + {32, 32, 6, 7, 7, 0, TIMEBASE_CUR, 6, "S\0"}, + {32, 32, 8, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {41, 41, 3, 7, 7, 0, TIMEBASE_CUR, 6, "S\0"}, + {42, 42, 10, 7, 2, 180, TIMEBASE_CUR, 0, "\0"}, + {43, 43, 2, 7, 30, 0, TIMEBASE_CUR, 6, "S\0"}, + {43, 43, 9, 7, 4, 0, TIMEBASE_CUR, 0, "\0"}, + {52, 52, 6, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {52, 52, 10, 7, 2, 0, TIMEBASE_CUR, 0, "\0"}, + {75, 75, 3, 7, 12, 0, TIMEBASE_STD, 6, "S\0"}, + {75, 75, 10, 7, 26, 0, TIMEBASE_STD, 0, "\0"}, + {76, 76, 3, 7, 11, 120, TIMEBASE_STD, 6, "S\0"}, + {76, 76, 9, 7, 10, 120, TIMEBASE_STD, 0, "\0"}, + {77, 78, 3, 0, 1, 120, TIMEBASE_STD, 6, "S\0"}, + {77, 77, 8, 7, 26, 120, TIMEBASE_STD, 0, "\0"}, + {78, 78, 8, 7, 24, 240, TIMEBASE_CUR, 0, "\0"}, + {79, 79, 3, 7, 1, 540, TIMEBASE_CUR, 6, "S\0"}, + {79, 79, 8, 7, 29, 120, TIMEBASE_CUR, 0, "\0"}, + {80, 80, 3, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {80, 80, 8, 7, 28, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Guat[] = { + {73, 73, 10, 7, 25, 0, TIMEBASE_CUR, 6, "D\0"}, + {74, 74, 1, 7, 24, 0, TIMEBASE_CUR, 0, "S\0"}, + {83, 83, 4, 7, 21, 0, TIMEBASE_CUR, 6, "D\0"}, + {83, 83, 8, 7, 22, 0, TIMEBASE_CUR, 0, "S\0"}, + {91, 91, 2, 7, 23, 0, TIMEBASE_CUR, 6, "D\0"}, + {91, 91, 8, 7, 7, 0, TIMEBASE_CUR, 0, "S\0"}, + {106, 106, 3, 7, 30, 0, TIMEBASE_CUR, 6, "D\0"}, + {106, 106, 9, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_HK[] = { + {41, 41, 3, 7, 1, 210, TIMEBASE_CUR, 6, "S\0"}, + {41, 41, 8, 7, 30, 210, TIMEBASE_CUR, 0, "\0"}, + {46, 46, 3, 7, 20, 210, TIMEBASE_CUR, 6, "S\0"}, + {46, 46, 11, 7, 1, 210, TIMEBASE_CUR, 0, "\0"}, + {47, 47, 3, 7, 13, 210, TIMEBASE_CUR, 6, "S\0"}, + {47, 47, 11, 7, 30, 210, TIMEBASE_CUR, 0, "\0"}, + {48, 48, 4, 7, 2, 210, TIMEBASE_CUR, 6, "S\0"}, + {48, 51, 9, 0, 25, 210, TIMEBASE_CUR, 0, "\0"}, + {49, 53, 3, 0, 1, 210, TIMEBASE_CUR, 6, "S\0"}, + {52, 52, 9, 7, 25, 210, TIMEBASE_CUR, 0, "\0"}, + {53, 53, 10, 7, 1, 210, TIMEBASE_CUR, 0, "\0"}, + {54, 64, 2, 0, 18, 210, TIMEBASE_CUR, 6, "S\0"}, + {54, 54, 9, 7, 31, 210, TIMEBASE_CUR, 0, "\0"}, + {55, 64, 10, 0, 1, 210, TIMEBASE_CUR, 0, "\0"}, + {65, 76, 3, 0, 16, 210, TIMEBASE_CUR, 6, "S\0"}, + {65, 76, 9, 0, 16, 210, TIMEBASE_CUR, 0, "\0"}, + {73, 73, 11, 7, 30, 210, TIMEBASE_CUR, 6, "S\0"}, + {79, 79, 4, 0, 8, 210, TIMEBASE_CUR, 6, "S\0"}, + {79, 79, 9, 0, 16, 210, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Haiti[] = { + {83, 83, 4, 7, 8, 0, TIMEBASE_CUR, 6, "D\0"}, + {83, 87, 9, 0, 25, 0, TIMEBASE_CUR, 0, "S\0"}, + {84, 87, 3, 0, 24, 0, TIMEBASE_CUR, 6, "D\0"}, + {88, 97, 3, 0, 1, 60, TIMEBASE_STD, 6, "D\0"}, + {88, 97, 9, 0, 25, 60, TIMEBASE_STD, 0, "S\0"}, + {105, 106, 3, 0, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {105, 106, 9, 0, 25, 0, TIMEBASE_CUR, 0, "S\0"}, + {112, 115, 2, 0, 8, 120, TIMEBASE_CUR, 6, "D\0"}, + {112, 115, 10, 0, 1, 120, TIMEBASE_CUR, 0, "S\0"}, + {117, 255, 2, 0, 8, 120, TIMEBASE_CUR, 6, "D\0"}, + {117, 255, 10, 0, 1, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Halifax[] = { + {16, 16, 3, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {16, 16, 9, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {20, 20, 4, 7, 9, 0, TIMEBASE_CUR, 6, "D\0"}, + {20, 20, 7, 7, 29, 0, TIMEBASE_CUR, 0, "S\0"}, + {21, 21, 4, 7, 6, 0, TIMEBASE_CUR, 6, "D\0"}, + {21, 22, 8, 7, 5, 0, TIMEBASE_CUR, 0, "S\0"}, + {22, 22, 3, 7, 30, 0, TIMEBASE_CUR, 6, "D\0"}, + {23, 25, 4, 0, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {23, 23, 8, 7, 4, 0, TIMEBASE_CUR, 0, "S\0"}, + {24, 24, 8, 7, 15, 0, TIMEBASE_CUR, 0, "S\0"}, + {25, 25, 8, 7, 28, 0, TIMEBASE_CUR, 0, "S\0"}, + {26, 26, 4, 7, 16, 0, TIMEBASE_CUR, 6, "D\0"}, + {26, 26, 8, 7, 13, 0, TIMEBASE_CUR, 0, "S\0"}, + {27, 27, 4, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {27, 27, 8, 7, 26, 0, TIMEBASE_CUR, 0, "S\0"}, + {28, 31, 4, 0, 8, 0, TIMEBASE_CUR, 6, "D\0"}, + {28, 28, 8, 7, 9, 0, TIMEBASE_CUR, 0, "S\0"}, + {29, 29, 8, 7, 3, 0, TIMEBASE_CUR, 0, "S\0"}, + {30, 30, 8, 7, 15, 0, TIMEBASE_CUR, 0, "S\0"}, + {31, 32, 8, 1, 24, 0, TIMEBASE_CUR, 0, "S\0"}, + {32, 32, 4, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {33, 33, 3, 7, 30, 0, TIMEBASE_CUR, 6, "D\0"}, + {33, 33, 9, 7, 2, 0, TIMEBASE_CUR, 0, "S\0"}, + {34, 34, 4, 7, 20, 0, TIMEBASE_CUR, 6, "D\0"}, + {34, 34, 8, 7, 16, 0, TIMEBASE_CUR, 0, "S\0"}, + {35, 35, 5, 7, 2, 0, TIMEBASE_CUR, 6, "D\0"}, + {35, 35, 8, 7, 30, 0, TIMEBASE_CUR, 0, "S\0"}, + {36, 36, 5, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {36, 36, 8, 7, 14, 0, TIMEBASE_CUR, 0, "S\0"}, + {37, 38, 4, 0, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {37, 41, 8, 1, 24, 0, TIMEBASE_CUR, 0, "S\0"}, + {39, 39, 4, 7, 28, 0, TIMEBASE_CUR, 6, "D\0"}, + {40, 41, 4, 0, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {46, 49, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {46, 49, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {51, 54, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {51, 54, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {56, 59, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {56, 59, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {62, 73, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {62, 73, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Holiday[] = { + {92, 93, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {93, 94, 2, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Hond[] = { + {87, 88, 4, 0, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {87, 88, 8, 0, 24, 0, TIMEBASE_CUR, 0, "S\0"}, + {106, 106, 4, 0, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {106, 106, 7, 1, 1, 0, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Hungary[] = { + {18, 18, 3, 7, 1, 180, TIMEBASE_CUR, 6, "S\0"}, + {18, 18, 8, 7, 16, 180, TIMEBASE_CUR, 0, "\0"}, + {19, 19, 3, 7, 15, 180, TIMEBASE_CUR, 6, "S\0"}, + {19, 19, 10, 7, 24, 180, TIMEBASE_CUR, 0, "\0"}, + {45, 45, 4, 7, 1, 1380, TIMEBASE_CUR, 6, "S\0"}, + {45, 45, 10, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {46, 46, 2, 7, 31, 120, TIMEBASE_STD, 6, "S\0"}, + {46, 49, 9, 0, 1, 120, TIMEBASE_STD, 0, "\0"}, + {47, 49, 3, 0, 4, 120, TIMEBASE_STD, 6, "S\0"}, + {50, 50, 3, 7, 17, 120, TIMEBASE_STD, 6, "S\0"}, + {50, 50, 9, 7, 23, 120, TIMEBASE_STD, 0, "\0"}, + {54, 55, 4, 7, 23, 0, TIMEBASE_CUR, 6, "S\0"}, + {54, 55, 9, 7, 3, 0, TIMEBASE_CUR, 0, "\0"}, + {56, 56, 5, 0, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {56, 56, 8, 0, 24, 0, TIMEBASE_CUR, 0, "\0"}, + {57, 57, 5, 0, 1, 60, TIMEBASE_CUR, 6, "S\0"}, + {57, 57, 8, 0, 24, 180, TIMEBASE_CUR, 0, "\0"}, + {80, 80, 3, 7, 6, 60, TIMEBASE_CUR, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_Iceland[] = { + {17, 19, 1, 7, 19, 1380, TIMEBASE_CUR, 6, "S\0"}, + {17, 17, 9, 7, 21, 60, TIMEBASE_CUR, 0, "\0"}, + {18, 19, 10, 7, 16, 60, TIMEBASE_CUR, 0, "\0"}, + {21, 21, 2, 7, 19, 1380, TIMEBASE_CUR, 6, "S\0"}, + {21, 21, 5, 7, 23, 60, TIMEBASE_CUR, 0, "\0"}, + {39, 39, 3, 7, 29, 1380, TIMEBASE_CUR, 6, "S\0"}, + {39, 39, 9, 7, 29, 120, TIMEBASE_CUR, 0, "\0"}, + {40, 40, 1, 7, 25, 120, TIMEBASE_CUR, 6, "S\0"}, + {40, 41, 10, 0, 2, 60, TIMEBASE_STD, 0, "\0"}, + {41, 42, 2, 0, 2, 60, TIMEBASE_STD, 6, "S\0"}, + {42, 48, 9, 0, 22, 60, TIMEBASE_STD, 0, "\0"}, + {43, 46, 2, 0, 1, 60, TIMEBASE_STD, 6, "S\0"}, + {47, 67, 3, 0, 1, 60, TIMEBASE_STD, 6, "S\0"}, + {49, 49, 9, 7, 30, 60, TIMEBASE_STD, 0, "\0"}, + {50, 66, 9, 0, 22, 60, TIMEBASE_STD, 0, "\0"}, + {67, 67, 9, 7, 29, 60, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Indianapolis[] = { + {41, 41, 5, 7, 22, 120, TIMEBASE_CUR, 6, "D\0"}, + {41, 54, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {46, 54, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, +}; +static const struct lc_timezone_rule rules_Iran[] = { + {78, 80, 2, 7, 21, 0, TIMEBASE_CUR, 6, "D\0"}, + {78, 78, 9, 7, 21, 0, TIMEBASE_CUR, 0, "S\0"}, + {79, 79, 8, 7, 19, 0, TIMEBASE_CUR, 0, "S\0"}, + {80, 80, 8, 7, 23, 0, TIMEBASE_CUR, 0, "S\0"}, + {91, 91, 4, 7, 3, 0, TIMEBASE_CUR, 6, "D\0"}, + {91, 95, 8, 7, 22, 0, TIMEBASE_CUR, 0, "S\0"}, + {92, 95, 2, 7, 22, 0, TIMEBASE_CUR, 6, "D\0"}, + {96, 96, 2, 7, 21, 0, TIMEBASE_CUR, 6, "D\0"}, + {96, 96, 8, 7, 21, 0, TIMEBASE_CUR, 0, "S\0"}, + {97, 99, 2, 7, 22, 0, TIMEBASE_CUR, 6, "D\0"}, + {97, 99, 8, 7, 22, 0, TIMEBASE_CUR, 0, "S\0"}, + {100, 100, 2, 7, 21, 0, TIMEBASE_CUR, 6, "D\0"}, + {100, 100, 8, 7, 21, 0, TIMEBASE_CUR, 0, "S\0"}, + {101, 103, 2, 7, 22, 0, TIMEBASE_CUR, 6, "D\0"}, + {101, 103, 8, 7, 22, 0, TIMEBASE_CUR, 0, "S\0"}, + {104, 104, 2, 7, 21, 0, TIMEBASE_CUR, 6, "D\0"}, + {104, 104, 8, 7, 21, 0, TIMEBASE_CUR, 0, "S\0"}, + {105, 105, 2, 7, 22, 0, TIMEBASE_CUR, 6, "D\0"}, + {105, 105, 8, 7, 22, 0, TIMEBASE_CUR, 0, "S\0"}, + {108, 108, 2, 7, 21, 0, TIMEBASE_CUR, 6, "D\0"}, + {108, 108, 8, 7, 21, 0, TIMEBASE_CUR, 0, "S\0"}, + {109, 111, 2, 7, 22, 0, TIMEBASE_CUR, 6, "D\0"}, + {109, 111, 8, 7, 22, 0, TIMEBASE_CUR, 0, "S\0"}, + {112, 112, 2, 7, 21, 0, TIMEBASE_CUR, 6, "D\0"}, + {112, 112, 8, 7, 21, 0, TIMEBASE_CUR, 0, "S\0"}, + {113, 115, 2, 7, 22, 0, TIMEBASE_CUR, 6, "D\0"}, + {113, 115, 8, 7, 22, 0, TIMEBASE_CUR, 0, "S\0"}, + {116, 116, 2, 7, 21, 0, TIMEBASE_CUR, 6, "D\0"}, + {116, 116, 8, 7, 21, 0, TIMEBASE_CUR, 0, "S\0"}, + {117, 119, 2, 7, 22, 0, TIMEBASE_CUR, 6, "D\0"}, + {117, 119, 8, 7, 22, 0, TIMEBASE_CUR, 0, "S\0"}, + {120, 120, 2, 7, 21, 0, TIMEBASE_CUR, 6, "D\0"}, + {120, 120, 8, 7, 21, 0, TIMEBASE_CUR, 0, "S\0"}, + {121, 123, 2, 7, 22, 0, TIMEBASE_CUR, 6, "D\0"}, + {121, 123, 8, 7, 22, 0, TIMEBASE_CUR, 0, "S\0"}, + {124, 124, 2, 7, 21, 0, TIMEBASE_CUR, 6, "D\0"}, + {124, 124, 8, 7, 21, 0, TIMEBASE_CUR, 0, "S\0"}, + {125, 127, 2, 7, 22, 0, TIMEBASE_CUR, 6, "D\0"}, + {125, 127, 8, 7, 22, 0, TIMEBASE_CUR, 0, "S\0"}, + {128, 129, 2, 7, 21, 0, TIMEBASE_CUR, 6, "D\0"}, + {128, 129, 8, 7, 21, 0, TIMEBASE_CUR, 0, "S\0"}, + {130, 131, 2, 7, 22, 0, TIMEBASE_CUR, 6, "D\0"}, + {130, 131, 8, 7, 22, 0, TIMEBASE_CUR, 0, "S\0"}, + {132, 133, 2, 7, 21, 0, TIMEBASE_CUR, 6, "D\0"}, + {132, 133, 8, 7, 21, 0, TIMEBASE_CUR, 0, "S\0"}, + {134, 135, 2, 7, 22, 0, TIMEBASE_CUR, 6, "D\0"}, + {134, 135, 8, 7, 22, 0, TIMEBASE_CUR, 0, "S\0"}, + {136, 255, 2, 7, 21, 0, TIMEBASE_CUR, 6, "D\0"}, + {136, 255, 8, 7, 21, 0, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Iraq[] = { + {82, 82, 4, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {82, 84, 9, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {83, 83, 2, 7, 31, 0, TIMEBASE_CUR, 6, "D\0"}, + {84, 85, 3, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {85, 90, 8, 0, 24, 60, TIMEBASE_STD, 0, "S\0"}, + {86, 90, 2, 0, 25, 60, TIMEBASE_STD, 6, "D\0"}, + {91, 107, 3, 7, 1, 180, TIMEBASE_STD, 6, "D\0"}, + {91, 107, 9, 7, 1, 180, TIMEBASE_STD, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Italy[] = { + {16, 16, 5, 7, 3, 1440, TIMEBASE_CUR, 6, "S\0"}, + {16, 17, 8, 7, 30, 1440, TIMEBASE_CUR, 0, "\0"}, + {17, 17, 2, 7, 31, 1440, TIMEBASE_CUR, 6, "S\0"}, + {18, 18, 2, 7, 9, 1440, TIMEBASE_CUR, 6, "S\0"}, + {18, 18, 9, 7, 6, 1440, TIMEBASE_CUR, 0, "\0"}, + {19, 19, 2, 7, 1, 1440, TIMEBASE_CUR, 6, "S\0"}, + {19, 19, 9, 7, 4, 1440, TIMEBASE_CUR, 0, "\0"}, + {20, 20, 2, 7, 20, 1440, TIMEBASE_CUR, 6, "S\0"}, + {20, 20, 8, 7, 18, 1440, TIMEBASE_CUR, 0, "\0"}, + {40, 40, 5, 7, 14, 1440, TIMEBASE_CUR, 6, "S\0"}, + {42, 42, 10, 7, 2, 120, TIMEBASE_STD, 0, "\0"}, + {43, 43, 2, 7, 29, 120, TIMEBASE_STD, 6, "S\0"}, + {43, 43, 9, 7, 4, 120, TIMEBASE_STD, 0, "\0"}, + {44, 44, 3, 7, 2, 120, TIMEBASE_STD, 6, "S\0"}, + {44, 44, 8, 7, 17, 120, TIMEBASE_STD, 0, "\0"}, + {45, 45, 3, 7, 2, 120, TIMEBASE_CUR, 6, "S\0"}, + {45, 45, 8, 7, 15, 60, TIMEBASE_CUR, 0, "\0"}, + {46, 46, 2, 7, 17, 120, TIMEBASE_STD, 6, "S\0"}, + {46, 46, 9, 7, 6, 120, TIMEBASE_STD, 0, "\0"}, + {47, 47, 2, 7, 16, 0, TIMEBASE_STD, 6, "S\0"}, + {47, 47, 9, 7, 5, 0, TIMEBASE_STD, 0, "\0"}, + {48, 48, 1, 7, 29, 120, TIMEBASE_STD, 6, "S\0"}, + {48, 48, 9, 7, 3, 120, TIMEBASE_STD, 0, "\0"}, + {66, 68, 4, 0, 22, 0, TIMEBASE_STD, 6, "S\0"}, + {66, 66, 8, 7, 24, 1440, TIMEBASE_CUR, 0, "\0"}, + {67, 69, 8, 0, 22, 0, TIMEBASE_STD, 0, "\0"}, + {69, 69, 5, 7, 1, 0, TIMEBASE_STD, 6, "S\0"}, + {70, 70, 4, 7, 31, 0, TIMEBASE_STD, 6, "S\0"}, + {70, 70, 8, 0, 24, 0, TIMEBASE_STD, 0, "\0"}, + {71, 72, 4, 0, 22, 0, TIMEBASE_STD, 6, "S\0"}, + {71, 71, 8, 0, 24, 0, TIMEBASE_STD, 0, "\0"}, + {72, 72, 9, 7, 1, 0, TIMEBASE_STD, 0, "\0"}, + {73, 73, 5, 7, 3, 0, TIMEBASE_STD, 6, "S\0"}, + {73, 74, 8, 0, 24, 0, TIMEBASE_STD, 0, "\0"}, + {74, 74, 4, 7, 26, 0, TIMEBASE_STD, 6, "S\0"}, + {75, 75, 5, 7, 1, 0, TIMEBASE_STD, 6, "S\0"}, + {75, 77, 8, 0, 24, 0, TIMEBASE_STD, 0, "\0"}, + {76, 76, 4, 7, 30, 0, TIMEBASE_STD, 6, "S\0"}, + {77, 79, 4, 0, 22, 0, TIMEBASE_STD, 6, "S\0"}, + {78, 78, 9, 7, 1, 0, TIMEBASE_STD, 0, "\0"}, + {79, 79, 8, 7, 30, 0, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Japan[] = { + {48, 48, 4, 0, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {48, 51, 8, 6, 8, 120, TIMEBASE_CUR, 0, "S\0"}, + {49, 49, 3, 0, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {50, 51, 4, 0, 1, 120, TIMEBASE_CUR, 6, "D\0"}, +}; +static const struct lc_timezone_rule rules_Jordan[] = { + {73, 73, 5, 7, 6, 0, TIMEBASE_CUR, 6, "S\0"}, + {73, 75, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {74, 77, 4, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {76, 76, 10, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {77, 77, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {78, 78, 3, 7, 30, 0, TIMEBASE_CUR, 6, "S\0"}, + {78, 78, 8, 7, 30, 0, TIMEBASE_CUR, 0, "\0"}, + {85, 85, 3, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {85, 85, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {86, 88, 3, 5, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {86, 90, 9, 5, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {89, 89, 4, 7, 8, 0, TIMEBASE_CUR, 6, "S\0"}, + {90, 90, 3, 7, 27, 0, TIMEBASE_CUR, 6, "S\0"}, + {91, 91, 3, 7, 17, 0, TIMEBASE_CUR, 6, "S\0"}, + {91, 91, 8, 7, 27, 0, TIMEBASE_CUR, 0, "\0"}, + {92, 92, 3, 7, 10, 0, TIMEBASE_CUR, 6, "S\0"}, + {92, 93, 9, 5, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {93, 98, 3, 5, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {94, 94, 8, 5, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {95, 98, 8, 5, 15, 0, TIMEBASE_STD, 0, "\0"}, + {99, 99, 6, 7, 1, 0, TIMEBASE_STD, 6, "S\0"}, + {99, 102, 8, 5, 24, 0, TIMEBASE_STD, 0, "\0"}, + {100, 101, 2, 4, 25, 0, TIMEBASE_STD, 6, "S\0"}, + {102, 112, 2, 4, 25, 1440, TIMEBASE_CUR, 6, "S\0"}, + {103, 103, 9, 7, 24, 0, TIMEBASE_STD, 0, "\0"}, + {104, 104, 9, 7, 15, 0, TIMEBASE_STD, 0, "\0"}, + {105, 105, 8, 5, 24, 0, TIMEBASE_STD, 0, "\0"}, + {106, 111, 9, 5, 25, 0, TIMEBASE_STD, 0, "\0"}, + {113, 113, 11, 7, 20, 0, TIMEBASE_CUR, 0, "\0"}, + {114, 255, 2, 4, 25, 1440, TIMEBASE_CUR, 6, "S\0"}, + {114, 255, 9, 5, 25, 0, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Kyrgyz[] = { + {92, 96, 3, 0, 7, 0, TIMEBASE_STD, 6, "S\0"}, + {92, 96, 8, 0, 24, 0, TIMEBASE_CUR, 0, "\0"}, + {97, 105, 2, 0, 25, 150, TIMEBASE_CUR, 6, "S\0"}, + {97, 104, 9, 0, 25, 150, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_LH[] = { + {81, 84, 9, 0, 25, 120, TIMEBASE_CUR, 6, "D\0"}, + {82, 85, 2, 0, 1, 120, TIMEBASE_CUR, 0, "S\0"}, + {85, 85, 9, 0, 25, 120, TIMEBASE_CUR, 3, "D\0"}, + {86, 89, 2, 0, 15, 120, TIMEBASE_CUR, 0, "S\0"}, + {86, 86, 9, 7, 19, 120, TIMEBASE_CUR, 3, "D\0"}, + {87, 99, 9, 0, 25, 120, TIMEBASE_CUR, 3, "D\0"}, + {90, 95, 2, 0, 1, 120, TIMEBASE_CUR, 0, "S\0"}, + {96, 105, 2, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {100, 100, 7, 0, 25, 120, TIMEBASE_CUR, 3, "D\0"}, + {101, 107, 9, 0, 25, 120, TIMEBASE_CUR, 3, "D\0"}, + {106, 106, 3, 0, 1, 120, TIMEBASE_CUR, 0, "S\0"}, + {107, 107, 2, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {108, 255, 3, 0, 1, 120, TIMEBASE_CUR, 0, "S\0"}, + {108, 255, 9, 0, 1, 120, TIMEBASE_CUR, 3, "D\0"}, +}; +static const struct lc_timezone_rule rules_Latvia[] = { + {89, 96, 2, 0, 25, 120, TIMEBASE_STD, 6, "S\0"}, + {89, 96, 8, 0, 24, 120, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Lebanon[] = { + {20, 20, 2, 7, 28, 0, TIMEBASE_CUR, 6, "S\0"}, + {20, 20, 9, 7, 25, 0, TIMEBASE_CUR, 0, "\0"}, + {21, 21, 3, 7, 3, 0, TIMEBASE_CUR, 6, "S\0"}, + {21, 21, 9, 7, 3, 0, TIMEBASE_CUR, 0, "\0"}, + {22, 22, 2, 7, 26, 0, TIMEBASE_CUR, 6, "S\0"}, + {22, 22, 9, 7, 8, 0, TIMEBASE_CUR, 0, "\0"}, + {23, 23, 3, 7, 22, 0, TIMEBASE_CUR, 6, "S\0"}, + {23, 23, 8, 7, 16, 0, TIMEBASE_CUR, 0, "\0"}, + {57, 61, 4, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {57, 61, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {72, 72, 5, 7, 22, 0, TIMEBASE_CUR, 6, "S\0"}, + {72, 77, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {73, 77, 4, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {78, 78, 3, 7, 30, 0, TIMEBASE_CUR, 6, "S\0"}, + {78, 78, 8, 7, 30, 0, TIMEBASE_CUR, 0, "\0"}, + {84, 87, 4, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {84, 91, 9, 7, 16, 0, TIMEBASE_CUR, 0, "\0"}, + {88, 88, 5, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {89, 89, 4, 7, 10, 0, TIMEBASE_CUR, 6, "S\0"}, + {90, 92, 4, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {92, 92, 9, 7, 4, 0, TIMEBASE_CUR, 0, "\0"}, + {93, 255, 2, 0, 25, 0, TIMEBASE_CUR, 6, "S\0"}, + {93, 98, 8, 0, 24, 0, TIMEBASE_CUR, 0, "\0"}, + {99, 255, 9, 0, 25, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Libya[] = { + {51, 51, 9, 7, 14, 120, TIMEBASE_CUR, 6, "S\0"}, + {51, 51, 11, 7, 31, 1440, TIMEBASE_CUR, 0, "\0"}, + {53, 53, 9, 7, 9, 120, TIMEBASE_CUR, 6, "S\0"}, + {53, 53, 11, 7, 31, 1440, TIMEBASE_CUR, 0, "\0"}, + {55, 55, 8, 7, 30, 0, TIMEBASE_CUR, 6, "S\0"}, + {55, 55, 11, 7, 31, 1440, TIMEBASE_CUR, 0, "\0"}, + {82, 84, 3, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {82, 85, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {85, 85, 3, 7, 6, 0, TIMEBASE_CUR, 6, "S\0"}, + {86, 86, 3, 7, 4, 0, TIMEBASE_CUR, 6, "S\0"}, + {86, 86, 9, 7, 3, 0, TIMEBASE_CUR, 0, "\0"}, + {87, 89, 3, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {87, 89, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {97, 97, 3, 7, 4, 0, TIMEBASE_CUR, 6, "S\0"}, + {97, 97, 9, 7, 4, 0, TIMEBASE_CUR, 0, "\0"}, + {113, 113, 2, 5, 25, 60, TIMEBASE_CUR, 6, "S\0"}, + {113, 113, 9, 5, 25, 120, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Louisville[] = { + {21, 21, 4, 7, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {21, 21, 8, 7, 1, 120, TIMEBASE_CUR, 0, "S\0"}, + {41, 61, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {41, 41, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {46, 46, 5, 7, 2, 120, TIMEBASE_CUR, 0, "S\0"}, + {50, 55, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {56, 60, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Lux[] = { + {16, 16, 4, 7, 14, 1380, TIMEBASE_CUR, 6, "S\0"}, + {16, 16, 9, 7, 1, 60, TIMEBASE_CUR, 0, "\0"}, + {17, 17, 3, 7, 28, 1380, TIMEBASE_CUR, 6, "S\0"}, + {17, 17, 8, 7, 17, 60, TIMEBASE_CUR, 0, "\0"}, + {18, 18, 3, 1, 15, 120, TIMEBASE_STD, 6, "S\0"}, + {18, 18, 8, 1, 15, 120, TIMEBASE_STD, 0, "\0"}, + {19, 19, 2, 7, 1, 1380, TIMEBASE_CUR, 6, "S\0"}, + {19, 19, 9, 7, 5, 180, TIMEBASE_CUR, 0, "\0"}, + {20, 20, 1, 7, 14, 1380, TIMEBASE_CUR, 6, "S\0"}, + {20, 20, 9, 7, 24, 120, TIMEBASE_CUR, 0, "\0"}, + {21, 21, 2, 7, 14, 1380, TIMEBASE_CUR, 6, "S\0"}, + {21, 21, 9, 7, 26, 120, TIMEBASE_CUR, 0, "\0"}, + {22, 22, 2, 7, 25, 1380, TIMEBASE_CUR, 6, "S\0"}, + {22, 22, 9, 0, 2, 60, TIMEBASE_CUR, 0, "\0"}, + {23, 23, 3, 7, 21, 1380, TIMEBASE_CUR, 6, "S\0"}, + {23, 23, 9, 0, 2, 120, TIMEBASE_CUR, 0, "\0"}, + {24, 24, 2, 7, 29, 1380, TIMEBASE_CUR, 6, "S\0"}, + {24, 28, 9, 0, 2, 60, TIMEBASE_CUR, 0, "\0"}, + {25, 25, 3, 7, 5, 1380, TIMEBASE_CUR, 6, "S\0"}, + {26, 26, 3, 7, 17, 1380, TIMEBASE_CUR, 6, "S\0"}, + {27, 27, 3, 7, 9, 1380, TIMEBASE_CUR, 6, "S\0"}, + {28, 28, 3, 7, 14, 1380, TIMEBASE_CUR, 6, "S\0"}, + {29, 29, 3, 7, 20, 1380, TIMEBASE_CUR, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_Macau[] = { + {61, 62, 2, 0, 16, 210, TIMEBASE_CUR, 6, "D\0"}, + {61, 64, 10, 0, 1, 210, TIMEBASE_CUR, 0, "S\0"}, + {63, 63, 2, 0, 16, 0, TIMEBASE_CUR, 6, "D\0"}, + {64, 64, 2, 0, 16, 210, TIMEBASE_CUR, 6, "D\0"}, + {65, 65, 2, 0, 16, 0, TIMEBASE_CUR, 6, "D\0"}, + {65, 65, 9, 7, 31, 0, TIMEBASE_CUR, 0, "S\0"}, + {66, 71, 3, 0, 16, 210, TIMEBASE_CUR, 6, "D\0"}, + {66, 71, 9, 0, 16, 210, TIMEBASE_CUR, 0, "S\0"}, + {72, 74, 3, 0, 15, 0, TIMEBASE_CUR, 6, "D\0"}, + {72, 73, 9, 0, 15, 0, TIMEBASE_CUR, 0, "S\0"}, + {74, 77, 9, 0, 15, 210, TIMEBASE_CUR, 0, "S\0"}, + {75, 77, 3, 0, 15, 210, TIMEBASE_CUR, 6, "D\0"}, + {78, 80, 3, 0, 15, 0, TIMEBASE_CUR, 6, "D\0"}, + {78, 80, 9, 0, 15, 0, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Malta[] = { + {73, 73, 2, 7, 31, 0, TIMEBASE_STD, 6, "S\0"}, + {73, 73, 8, 7, 29, 0, TIMEBASE_STD, 0, "\0"}, + {74, 74, 3, 7, 21, 0, TIMEBASE_STD, 6, "S\0"}, + {74, 74, 8, 7, 16, 0, TIMEBASE_STD, 0, "\0"}, + {75, 79, 3, 0, 15, 120, TIMEBASE_CUR, 6, "S\0"}, + {75, 80, 8, 0, 15, 120, TIMEBASE_CUR, 0, "\0"}, + {80, 80, 2, 7, 31, 120, TIMEBASE_CUR, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_Marengo[] = { + {51, 51, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {51, 51, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {54, 60, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {54, 60, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Mauritius[] = { + {82, 82, 9, 7, 10, 0, TIMEBASE_CUR, 6, "S\0"}, + {83, 83, 2, 7, 21, 0, TIMEBASE_CUR, 0, "\0"}, + {108, 108, 9, 0, 25, 120, TIMEBASE_CUR, 6, "S\0"}, + {109, 109, 2, 0, 25, 120, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Menominee[] = { + {46, 46, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {46, 46, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {66, 66, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {66, 66, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Mexico[] = { + {39, 39, 1, 7, 5, 0, TIMEBASE_CUR, 6, "D\0"}, + {39, 39, 5, 7, 25, 0, TIMEBASE_CUR, 0, "S\0"}, + {40, 40, 11, 7, 9, 0, TIMEBASE_CUR, 6, "D\0"}, + {41, 41, 3, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {43, 43, 11, 7, 16, 0, TIMEBASE_CUR, 6, "W\0"}, + {44, 44, 4, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {50, 50, 1, 7, 12, 0, TIMEBASE_CUR, 6, "D\0"}, + {50, 50, 6, 7, 30, 0, TIMEBASE_CUR, 0, "S\0"}, + {96, 100, 3, 0, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {96, 100, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {101, 101, 4, 0, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {101, 101, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {102, 255, 3, 0, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {102, 255, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Moldova[] = { + {97, 255, 2, 0, 25, 120, TIMEBASE_CUR, 6, "S\0"}, + {97, 255, 9, 0, 25, 180, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Moncton[] = { + {33, 35, 5, 0, 8, 60, TIMEBASE_CUR, 6, "D\0"}, + {33, 35, 8, 0, 8, 60, TIMEBASE_CUR, 0, "S\0"}, + {36, 38, 5, 0, 1, 60, TIMEBASE_CUR, 6, "D\0"}, + {36, 38, 8, 0, 1, 60, TIMEBASE_CUR, 0, "S\0"}, + {39, 39, 4, 7, 27, 60, TIMEBASE_CUR, 6, "D\0"}, + {39, 41, 8, 6, 21, 60, TIMEBASE_CUR, 0, "S\0"}, + {40, 40, 4, 7, 19, 60, TIMEBASE_CUR, 6, "D\0"}, + {41, 41, 4, 7, 4, 60, TIMEBASE_CUR, 6, "D\0"}, + {46, 72, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {46, 56, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {57, 72, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {93, 106, 3, 0, 1, 1, TIMEBASE_CUR, 6, "D\0"}, + {93, 106, 9, 0, 25, 1, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Mongol[] = { + {83, 84, 3, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {83, 83, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {84, 98, 8, 0, 24, 0, TIMEBASE_CUR, 0, "\0"}, + {85, 98, 2, 0, 25, 0, TIMEBASE_CUR, 6, "S\0"}, + {101, 101, 3, 6, 24, 120, TIMEBASE_CUR, 6, "S\0"}, + {101, 106, 8, 6, 24, 120, TIMEBASE_CUR, 0, "\0"}, + {102, 106, 2, 6, 25, 120, TIMEBASE_CUR, 6, "S\0"}, + {115, 116, 2, 6, 25, 120, TIMEBASE_CUR, 6, "S\0"}, + {115, 116, 8, 6, 24, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Morocco[] = { + {39, 39, 8, 7, 12, 0, TIMEBASE_CUR, 6, "S\0"}, + {39, 39, 10, 7, 19, 0, TIMEBASE_CUR, 0, "\0"}, + {40, 40, 1, 7, 25, 0, TIMEBASE_CUR, 6, "S\0"}, + {45, 45, 10, 7, 18, 0, TIMEBASE_CUR, 0, "\0"}, + {50, 50, 5, 7, 11, 0, TIMEBASE_CUR, 6, "S\0"}, + {50, 50, 9, 7, 29, 0, TIMEBASE_CUR, 0, "\0"}, + {67, 67, 5, 7, 3, 720, TIMEBASE_CUR, 6, "S\0"}, + {67, 67, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {74, 74, 5, 7, 24, 0, TIMEBASE_CUR, 6, "S\0"}, + {74, 74, 8, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {76, 77, 4, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {76, 76, 7, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {77, 77, 8, 7, 28, 0, TIMEBASE_CUR, 0, "\0"}, + {78, 78, 5, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {78, 78, 7, 7, 4, 0, TIMEBASE_CUR, 0, "\0"}, + {108, 108, 5, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {108, 108, 8, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {109, 109, 5, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {109, 109, 7, 7, 21, 0, TIMEBASE_CUR, 0, "\0"}, + {110, 110, 4, 7, 2, 0, TIMEBASE_CUR, 6, "S\0"}, + {110, 110, 7, 7, 8, 0, TIMEBASE_CUR, 0, "\0"}, + {111, 111, 3, 7, 3, 0, TIMEBASE_CUR, 6, "S\0"}, + {111, 111, 6, 7, 31, 0, TIMEBASE_CUR, 0, "\0"}, + {112, 113, 3, 0, 24, 120, TIMEBASE_CUR, 6, "S\0"}, + {112, 112, 6, 7, 20, 180, TIMEBASE_CUR, 0, "\0"}, + {112, 112, 7, 7, 20, 120, TIMEBASE_CUR, 6, "S\0"}, + {112, 112, 8, 7, 30, 180, TIMEBASE_CUR, 0, "\0"}, + {113, 113, 6, 7, 7, 180, TIMEBASE_CUR, 0, "\0"}, + {113, 113, 7, 7, 10, 120, TIMEBASE_CUR, 6, "S\0"}, + {113, 255, 9, 0, 25, 180, TIMEBASE_CUR, 0, "\0"}, + {114, 121, 2, 0, 25, 120, TIMEBASE_CUR, 6, "S\0"}, + {114, 114, 5, 7, 28, 180, TIMEBASE_CUR, 0, "\0"}, + {114, 114, 7, 7, 2, 120, TIMEBASE_CUR, 6, "S\0"}, + {115, 115, 5, 7, 14, 180, TIMEBASE_CUR, 0, "\0"}, + {115, 115, 6, 7, 19, 120, TIMEBASE_CUR, 6, "S\0"}, + {116, 116, 5, 7, 5, 180, TIMEBASE_CUR, 0, "\0"}, + {116, 116, 6, 7, 10, 120, TIMEBASE_CUR, 6, "S\0"}, + {117, 117, 4, 7, 21, 180, TIMEBASE_CUR, 0, "\0"}, + {117, 117, 6, 7, 2, 120, TIMEBASE_CUR, 6, "S\0"}, + {118, 118, 4, 7, 13, 180, TIMEBASE_CUR, 0, "\0"}, + {118, 118, 5, 7, 17, 120, TIMEBASE_CUR, 6, "S\0"}, + {119, 119, 4, 7, 5, 180, TIMEBASE_CUR, 0, "\0"}, + {119, 119, 5, 7, 9, 120, TIMEBASE_CUR, 6, "S\0"}, + {120, 120, 3, 7, 19, 180, TIMEBASE_CUR, 0, "\0"}, + {120, 120, 4, 7, 24, 120, TIMEBASE_CUR, 6, "S\0"}, + {121, 121, 3, 7, 11, 180, TIMEBASE_CUR, 0, "\0"}, + {121, 121, 4, 7, 16, 120, TIMEBASE_CUR, 6, "S\0"}, + {122, 122, 4, 7, 8, 120, TIMEBASE_CUR, 6, "S\0"}, + {123, 123, 3, 7, 23, 120, TIMEBASE_CUR, 6, "S\0"}, + {124, 124, 3, 7, 14, 120, TIMEBASE_CUR, 6, "S\0"}, + {125, 125, 3, 7, 6, 120, TIMEBASE_CUR, 6, "S\0"}, + {126, 255, 2, 0, 25, 120, TIMEBASE_CUR, 6, "S\0"}, + {136, 136, 9, 7, 19, 180, TIMEBASE_CUR, 0, "\0"}, + {137, 137, 9, 7, 4, 180, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_NBorneo[] = { + {35, 41, 8, 7, 14, 0, TIMEBASE_CUR, 2, "TS\0"}, + {35, 41, 11, 7, 14, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_NC[] = { + {77, 78, 11, 0, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {78, 79, 1, 7, 27, 0, TIMEBASE_CUR, 0, "\0"}, + {96, 96, 11, 7, 1, 120, TIMEBASE_STD, 6, "S\0"}, + {97, 97, 2, 7, 2, 120, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_NT_YK[] = { + {18, 18, 3, 7, 14, 120, TIMEBASE_CUR, 6, "D\0"}, + {18, 18, 9, 7, 27, 120, TIMEBASE_CUR, 0, "S\0"}, + {19, 19, 4, 7, 25, 120, TIMEBASE_CUR, 6, "D\0"}, + {19, 19, 10, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {42, 42, 1, 7, 9, 120, TIMEBASE_CUR, 6, "W\0"}, + {45, 45, 7, 7, 14, 1380, TIMEBASE_UTC, 6, "P\0"}, + {45, 45, 8, 7, 30, 120, TIMEBASE_CUR, 0, "S\0"}, + {65, 65, 3, 0, 24, 0, TIMEBASE_CUR, 12, "DD\0"}, + {65, 65, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {80, 86, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {80, 106, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {87, 106, 3, 0, 1, 120, TIMEBASE_CUR, 6, "D\0"}, +}; +static const struct lc_timezone_rule rules_NYC[] = { + {20, 20, 2, 0, 25, 120, TIMEBASE_CUR, 6, "D\0"}, + {20, 20, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {21, 66, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {21, 54, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {55, 66, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_NZ[] = { + {27, 27, 10, 7, 6, 120, TIMEBASE_CUR, 6, "S\0"}, + {28, 28, 2, 7, 4, 120, TIMEBASE_CUR, 0, "M\0"}, + {28, 33, 9, 0, 8, 120, TIMEBASE_CUR, 3, "S\0"}, + {29, 33, 2, 0, 15, 120, TIMEBASE_CUR, 0, "M\0"}, + {34, 40, 3, 0, 24, 120, TIMEBASE_CUR, 0, "M\0"}, + {34, 40, 8, 0, 24, 120, TIMEBASE_CUR, 3, "S\0"}, + {45, 45, 11, 7, 31, 1440, TIMEBASE_CUR, 0, "S\0"}, + {74, 74, 10, 0, 1, 120, TIMEBASE_STD, 6, "D\0"}, + {75, 75, 1, 0, 22, 120, TIMEBASE_STD, 0, "S\0"}, + {75, 88, 9, 0, 25, 120, TIMEBASE_STD, 6, "D\0"}, + {76, 89, 2, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, + {89, 89, 9, 0, 8, 120, TIMEBASE_STD, 6, "D\0"}, + {90, 107, 2, 0, 15, 120, TIMEBASE_STD, 0, "S\0"}, + {90, 106, 9, 0, 1, 120, TIMEBASE_STD, 6, "D\0"}, + {107, 255, 8, 0, 24, 120, TIMEBASE_STD, 6, "D\0"}, + {108, 255, 3, 0, 1, 120, TIMEBASE_STD, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Namibia[] = { + {94, 255, 8, 0, 1, 120, TIMEBASE_CUR, 6, "S\0"}, + {95, 255, 3, 0, 1, 120, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Neth[] = { + {16, 16, 4, 7, 1, 0, TIMEBASE_CUR, 6, "NST\0"}, + {16, 16, 9, 7, 1, 0, TIMEBASE_CUR, 0, "AMT\0"}, + {17, 17, 3, 7, 16, 120, TIMEBASE_STD, 6, "NST\0"}, + {17, 17, 8, 7, 17, 120, TIMEBASE_STD, 0, "AMT\0"}, + {18, 21, 3, 1, 1, 120, TIMEBASE_STD, 6, "NST\0"}, + {18, 21, 8, 1, 24, 120, TIMEBASE_STD, 0, "AMT\0"}, + {22, 22, 2, 0, 25, 120, TIMEBASE_STD, 6, "NST\0"}, + {22, 36, 9, 0, 2, 120, TIMEBASE_STD, 0, "AMT\0"}, + {23, 23, 5, 5, 1, 120, TIMEBASE_STD, 6, "NST\0"}, + {24, 24, 2, 0, 25, 120, TIMEBASE_STD, 6, "NST\0"}, + {25, 25, 5, 5, 1, 120, TIMEBASE_STD, 6, "NST\0"}, + {26, 31, 4, 7, 15, 120, TIMEBASE_STD, 6, "NST\0"}, + {32, 32, 4, 7, 22, 120, TIMEBASE_STD, 6, "NST\0"}, + {33, 36, 4, 7, 15, 120, TIMEBASE_STD, 6, "NST\0"}, + {37, 37, 4, 7, 22, 120, TIMEBASE_STD, 6, "NST\0"}, + {37, 37, 6, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {37, 39, 9, 0, 2, 120, TIMEBASE_STD, 0, "\0"}, + {38, 39, 4, 7, 15, 120, TIMEBASE_STD, 6, "S\0"}, + {45, 45, 3, 7, 2, 120, TIMEBASE_STD, 6, "S\0"}, + {45, 45, 8, 7, 16, 120, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Nic[] = { + {79, 80, 2, 0, 16, 0, TIMEBASE_CUR, 6, "D\0"}, + {79, 80, 5, 1, 23, 0, TIMEBASE_CUR, 0, "S\0"}, + {105, 105, 3, 7, 10, 0, TIMEBASE_CUR, 6, "D\0"}, + {105, 105, 9, 0, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {106, 106, 3, 7, 30, 120, TIMEBASE_CUR, 6, "D\0"}, + {106, 106, 9, 0, 1, 60, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Norway[] = { + {16, 16, 4, 7, 22, 60, TIMEBASE_CUR, 6, "S\0"}, + {16, 16, 8, 7, 30, 0, TIMEBASE_CUR, 0, "\0"}, + {45, 45, 3, 7, 2, 120, TIMEBASE_STD, 6, "S\0"}, + {45, 45, 9, 7, 1, 120, TIMEBASE_STD, 0, "\0"}, + {59, 64, 2, 0, 15, 120, TIMEBASE_STD, 6, "S\0"}, + {59, 65, 8, 0, 15, 120, TIMEBASE_STD, 0, "\0"}, + {65, 65, 3, 7, 25, 120, TIMEBASE_STD, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_PRC[] = { + {86, 86, 4, 7, 4, 0, TIMEBASE_CUR, 6, "D\0"}, + {86, 91, 8, 0, 11, 0, TIMEBASE_CUR, 0, "S\0"}, + {87, 91, 3, 0, 10, 0, TIMEBASE_CUR, 6, "D\0"}, +}; +static const struct lc_timezone_rule rules_Pakistan[] = { + {102, 102, 3, 0, 2, 0, TIMEBASE_CUR, 6, "S\0"}, + {102, 102, 9, 0, 2, 0, TIMEBASE_CUR, 0, "\0"}, + {108, 108, 5, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {108, 109, 10, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {109, 109, 3, 7, 15, 0, TIMEBASE_CUR, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_Palestine[] = { + {99, 105, 3, 5, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {99, 103, 9, 5, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {104, 104, 9, 7, 1, 60, TIMEBASE_CUR, 0, "\0"}, + {105, 105, 9, 7, 4, 120, TIMEBASE_CUR, 0, "\0"}, + {106, 107, 3, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {106, 106, 8, 7, 22, 0, TIMEBASE_CUR, 0, "\0"}, + {107, 107, 8, 4, 8, 120, TIMEBASE_CUR, 0, "\0"}, + {108, 109, 2, 5, 25, 0, TIMEBASE_CUR, 6, "S\0"}, + {108, 108, 8, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {109, 109, 8, 5, 1, 60, TIMEBASE_CUR, 0, "\0"}, + {110, 110, 2, 7, 26, 0, TIMEBASE_CUR, 6, "S\0"}, + {110, 110, 7, 7, 11, 0, TIMEBASE_CUR, 0, "\0"}, + {111, 111, 3, 7, 1, 1, TIMEBASE_CUR, 6, "S\0"}, + {111, 111, 7, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {111, 111, 7, 7, 30, 0, TIMEBASE_CUR, 6, "S\0"}, + {111, 111, 8, 7, 30, 0, TIMEBASE_CUR, 0, "\0"}, + {112, 114, 2, 4, 25, 1440, TIMEBASE_CUR, 6, "S\0"}, + {112, 112, 8, 7, 21, 60, TIMEBASE_CUR, 0, "\0"}, + {113, 113, 8, 5, 21, 0, TIMEBASE_CUR, 0, "\0"}, + {114, 115, 9, 5, 21, 0, TIMEBASE_CUR, 0, "\0"}, + {115, 115, 2, 5, 25, 1440, TIMEBASE_CUR, 6, "S\0"}, + {116, 255, 2, 6, 25, 60, TIMEBASE_CUR, 6, "S\0"}, + {116, 255, 9, 6, 25, 60, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Para[] = { + {75, 78, 2, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {75, 88, 9, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {79, 91, 3, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {89, 89, 9, 7, 22, 0, TIMEBASE_CUR, 6, "S\0"}, + {90, 90, 9, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {91, 91, 9, 7, 6, 0, TIMEBASE_CUR, 6, "S\0"}, + {92, 92, 2, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {92, 92, 9, 7, 5, 0, TIMEBASE_CUR, 6, "S\0"}, + {93, 93, 2, 7, 31, 0, TIMEBASE_CUR, 0, "\0"}, + {93, 95, 9, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {94, 95, 1, 0, 22, 0, TIMEBASE_CUR, 0, "\0"}, + {96, 96, 2, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {96, 101, 9, 0, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {97, 97, 1, 0, 22, 0, TIMEBASE_CUR, 0, "\0"}, + {98, 101, 2, 0, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {102, 104, 3, 0, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {102, 103, 8, 0, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {104, 109, 9, 0, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {105, 109, 2, 0, 8, 0, TIMEBASE_CUR, 0, "\0"}, + {110, 112, 3, 0, 8, 0, TIMEBASE_CUR, 0, "\0"}, + {110, 255, 9, 0, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {113, 255, 2, 0, 22, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Perry[] = { + {46, 46, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {46, 46, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {53, 54, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {53, 59, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {55, 55, 4, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {56, 63, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {60, 60, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {61, 61, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {62, 63, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Peru[] = { + {37, 37, 11, 7, 31, 1440, TIMEBASE_CUR, 6, "S\0"}, + {38, 38, 3, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {38, 39, 8, 0, 24, 0, TIMEBASE_CUR, 6, "S\0"}, + {39, 40, 2, 0, 24, 0, TIMEBASE_CUR, 0, "\0"}, + {85, 86, 11, 7, 31, 1440, TIMEBASE_CUR, 6, "S\0"}, + {86, 87, 3, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {89, 89, 11, 7, 31, 1440, TIMEBASE_CUR, 6, "S\0"}, + {90, 90, 3, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {93, 93, 11, 7, 31, 1440, TIMEBASE_CUR, 6, "S\0"}, + {94, 94, 3, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Phil[] = { + {36, 36, 10, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {37, 37, 1, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {54, 54, 3, 7, 12, 0, TIMEBASE_CUR, 6, "S\0"}, + {54, 54, 6, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {78, 78, 2, 7, 22, 0, TIMEBASE_CUR, 6, "S\0"}, + {78, 78, 8, 7, 21, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Pike[] = { + {55, 55, 4, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {55, 60, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {56, 64, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {61, 64, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Poland[] = { + {18, 19, 8, 7, 16, 120, TIMEBASE_STD, 0, "\0"}, + {19, 19, 3, 7, 15, 120, TIMEBASE_STD, 6, "S\0"}, + {44, 44, 3, 7, 3, 120, TIMEBASE_STD, 6, "S\0"}, + {44, 44, 9, 7, 4, 120, TIMEBASE_CUR, 0, "\0"}, + {45, 45, 3, 7, 29, 0, TIMEBASE_CUR, 6, "S\0"}, + {45, 45, 10, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {46, 46, 3, 7, 14, 0, TIMEBASE_STD, 6, "S\0"}, + {46, 46, 9, 7, 7, 120, TIMEBASE_STD, 0, "\0"}, + {47, 47, 4, 7, 4, 120, TIMEBASE_STD, 6, "S\0"}, + {47, 49, 9, 0, 1, 120, TIMEBASE_STD, 0, "\0"}, + {48, 48, 3, 7, 18, 120, TIMEBASE_STD, 6, "S\0"}, + {49, 49, 3, 7, 10, 120, TIMEBASE_STD, 6, "S\0"}, + {57, 57, 5, 7, 2, 60, TIMEBASE_STD, 6, "S\0"}, + {57, 58, 8, 0, 24, 60, TIMEBASE_STD, 0, "\0"}, + {58, 58, 2, 7, 30, 60, TIMEBASE_STD, 6, "S\0"}, + {59, 59, 4, 7, 31, 60, TIMEBASE_STD, 6, "S\0"}, + {59, 61, 9, 0, 1, 60, TIMEBASE_STD, 0, "\0"}, + {60, 60, 3, 7, 3, 60, TIMEBASE_STD, 6, "S\0"}, + {61, 64, 4, 0, 25, 60, TIMEBASE_STD, 6, "S\0"}, + {62, 64, 8, 0, 24, 60, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Port[] = { + {16, 16, 5, 7, 17, 1380, TIMEBASE_CUR, 6, "S\0"}, + {16, 16, 10, 7, 1, 60, TIMEBASE_CUR, 0, "\0"}, + {17, 17, 1, 7, 28, 1380, TIMEBASE_STD, 6, "S\0"}, + {17, 21, 9, 7, 14, 1380, TIMEBASE_STD, 0, "\0"}, + {18, 18, 2, 7, 1, 1380, TIMEBASE_STD, 6, "S\0"}, + {19, 19, 1, 7, 28, 1380, TIMEBASE_STD, 6, "S\0"}, + {20, 20, 1, 7, 29, 1380, TIMEBASE_STD, 6, "S\0"}, + {21, 21, 1, 7, 28, 1380, TIMEBASE_STD, 6, "S\0"}, + {24, 24, 3, 7, 16, 1380, TIMEBASE_STD, 6, "S\0"}, + {24, 24, 9, 7, 14, 1380, TIMEBASE_STD, 0, "\0"}, + {26, 26, 3, 7, 17, 1380, TIMEBASE_STD, 6, "S\0"}, + {26, 29, 9, 6, 1, 1380, TIMEBASE_STD, 0, "\0"}, + {27, 27, 3, 7, 9, 1380, TIMEBASE_STD, 6, "S\0"}, + {28, 28, 3, 7, 14, 1380, TIMEBASE_STD, 6, "S\0"}, + {29, 29, 3, 7, 20, 1380, TIMEBASE_STD, 6, "S\0"}, + {31, 31, 3, 7, 18, 1380, TIMEBASE_STD, 6, "S\0"}, + {31, 32, 9, 6, 1, 1380, TIMEBASE_STD, 0, "\0"}, + {32, 32, 3, 7, 2, 1380, TIMEBASE_STD, 6, "S\0"}, + {34, 34, 3, 7, 7, 1380, TIMEBASE_STD, 6, "S\0"}, + {34, 38, 9, 6, 1, 1380, TIMEBASE_STD, 0, "\0"}, + {35, 35, 2, 7, 30, 1380, TIMEBASE_STD, 6, "S\0"}, + {36, 36, 3, 7, 18, 1380, TIMEBASE_STD, 6, "S\0"}, + {37, 37, 3, 7, 3, 1380, TIMEBASE_STD, 6, "S\0"}, + {38, 38, 2, 7, 26, 1380, TIMEBASE_STD, 6, "S\0"}, + {39, 39, 3, 7, 15, 1380, TIMEBASE_STD, 6, "S\0"}, + {39, 39, 10, 7, 18, 1380, TIMEBASE_STD, 0, "\0"}, + {40, 40, 1, 7, 24, 1380, TIMEBASE_STD, 6, "S\0"}, + {40, 41, 9, 7, 5, 1380, TIMEBASE_STD, 0, "\0"}, + {41, 41, 3, 7, 5, 1380, TIMEBASE_STD, 6, "S\0"}, + {42, 45, 2, 6, 8, 1380, TIMEBASE_STD, 6, "S\0"}, + {42, 42, 3, 7, 25, 1320, TIMEBASE_STD, 12, "M\0"}, + {42, 42, 7, 7, 15, 1320, TIMEBASE_STD, 6, "S\0"}, + {42, 45, 9, 6, 24, 1380, TIMEBASE_STD, 0, "\0"}, + {43, 43, 3, 7, 17, 1320, TIMEBASE_STD, 12, "M\0"}, + {43, 45, 7, 6, 25, 1320, TIMEBASE_STD, 6, "S\0"}, + {44, 45, 3, 6, 21, 1320, TIMEBASE_STD, 12, "M\0"}, + {46, 46, 3, 6, 1, 1380, TIMEBASE_STD, 6, "S\0"}, + {46, 46, 9, 6, 1, 1380, TIMEBASE_STD, 0, "\0"}, + {47, 49, 3, 0, 1, 120, TIMEBASE_STD, 6, "S\0"}, + {47, 49, 9, 0, 1, 120, TIMEBASE_STD, 0, "\0"}, + {51, 65, 3, 0, 1, 120, TIMEBASE_STD, 6, "S\0"}, + {51, 65, 9, 0, 1, 120, TIMEBASE_STD, 0, "\0"}, + {77, 77, 2, 7, 27, 0, TIMEBASE_STD, 6, "S\0"}, + {77, 77, 8, 7, 25, 0, TIMEBASE_STD, 0, "\0"}, + {78, 79, 3, 0, 1, 0, TIMEBASE_STD, 6, "S\0"}, + {78, 78, 9, 7, 1, 0, TIMEBASE_STD, 0, "\0"}, + {79, 82, 8, 0, 24, 60, TIMEBASE_STD, 0, "\0"}, + {80, 80, 2, 0, 25, 0, TIMEBASE_STD, 6, "S\0"}, + {81, 82, 2, 0, 25, 60, TIMEBASE_STD, 6, "S\0"}, + {83, 83, 2, 0, 25, 120, TIMEBASE_STD, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_Pulaski[] = { + {46, 60, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {46, 54, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {55, 56, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {57, 60, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_ROK[] = { + {48, 48, 5, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {48, 48, 8, 7, 13, 0, TIMEBASE_CUR, 0, "S\0"}, + {49, 49, 3, 7, 3, 0, TIMEBASE_CUR, 6, "D\0"}, + {49, 51, 8, 0, 8, 0, TIMEBASE_CUR, 0, "S\0"}, + {50, 50, 3, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {51, 51, 4, 7, 6, 0, TIMEBASE_CUR, 6, "D\0"}, + {55, 55, 4, 7, 5, 0, TIMEBASE_CUR, 6, "D\0"}, + {55, 55, 8, 7, 9, 0, TIMEBASE_CUR, 0, "S\0"}, + {56, 56, 4, 7, 20, 0, TIMEBASE_CUR, 6, "D\0"}, + {56, 56, 8, 7, 30, 0, TIMEBASE_CUR, 0, "S\0"}, + {57, 60, 4, 0, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {57, 60, 8, 0, 18, 0, TIMEBASE_CUR, 0, "S\0"}, + {87, 88, 4, 0, 8, 120, TIMEBASE_CUR, 6, "D\0"}, + {87, 88, 9, 0, 8, 180, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Regina[] = { + {18, 18, 3, 7, 14, 120, TIMEBASE_CUR, 6, "D\0"}, + {18, 18, 9, 7, 27, 120, TIMEBASE_CUR, 0, "S\0"}, + {30, 34, 4, 0, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {30, 34, 9, 0, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {37, 41, 3, 0, 8, 0, TIMEBASE_CUR, 6, "D\0"}, + {37, 37, 9, 0, 8, 0, TIMEBASE_CUR, 0, "S\0"}, + {38, 38, 9, 0, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {39, 41, 9, 0, 8, 0, TIMEBASE_CUR, 0, "S\0"}, + {42, 42, 1, 7, 9, 120, TIMEBASE_CUR, 6, "W\0"}, + {45, 45, 7, 7, 14, 1380, TIMEBASE_UTC, 6, "P\0"}, + {45, 45, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {46, 46, 3, 0, 8, 120, TIMEBASE_CUR, 6, "D\0"}, + {46, 46, 9, 0, 8, 120, TIMEBASE_CUR, 0, "S\0"}, + {47, 57, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {47, 57, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {59, 59, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {59, 59, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Romania[] = { + {32, 32, 4, 7, 21, 0, TIMEBASE_STD, 6, "S\0"}, + {32, 39, 9, 0, 1, 0, TIMEBASE_STD, 0, "\0"}, + {33, 39, 3, 0, 2, 0, TIMEBASE_STD, 6, "S\0"}, + {79, 79, 4, 7, 27, 0, TIMEBASE_CUR, 6, "S\0"}, + {79, 79, 8, 0, 24, 0, TIMEBASE_CUR, 0, "\0"}, + {80, 80, 3, 7, 5, 1380, TIMEBASE_CUR, 6, "S\0"}, + {80, 80, 8, 0, 24, 60, TIMEBASE_CUR, 0, "\0"}, + {91, 93, 2, 0, 25, 0, TIMEBASE_STD, 6, "S\0"}, + {91, 93, 8, 0, 24, 0, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Russia[] = { + {17, 17, 6, 7, 1, 1380, TIMEBASE_CUR, 6, "MST\0"}, + {17, 17, 11, 7, 28, 0, TIMEBASE_CUR, 0, "MMT\0"}, + {18, 18, 4, 7, 31, 1320, TIMEBASE_CUR, 12, "MDST\0"}, + {18, 18, 8, 7, 16, 60, TIMEBASE_CUR, 6, "MST\0"}, + {19, 19, 4, 7, 31, 1380, TIMEBASE_CUR, 12, "MDST\0"}, + {19, 19, 6, 7, 1, 0, TIMEBASE_UTC, 6, "MSD\0"}, + {19, 19, 7, 7, 16, 0, TIMEBASE_CUR, 0, "MSK\0"}, + {21, 21, 1, 7, 14, 1380, TIMEBASE_CUR, 6, "MSD\0"}, + {21, 21, 2, 7, 20, 1380, TIMEBASE_CUR, 12, "+05\0"}, + {21, 21, 8, 7, 1, 0, TIMEBASE_CUR, 6, "MSD\0"}, + {21, 21, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {81, 84, 3, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {81, 83, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {84, 95, 8, 0, 24, 120, TIMEBASE_STD, 0, "\0"}, + {85, 110, 2, 0, 25, 120, TIMEBASE_STD, 6, "S\0"}, + {96, 110, 9, 0, 25, 120, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_RussiaAsia[] = { + {81, 84, 3, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {81, 83, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {84, 95, 8, 0, 24, 120, TIMEBASE_STD, 0, "\0"}, + {85, 111, 2, 0, 25, 120, TIMEBASE_STD, 6, "S\0"}, + {96, 111, 9, 0, 25, 120, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_SA[] = { + {42, 43, 8, 0, 15, 120, TIMEBASE_CUR, 6, "\0"}, + {43, 44, 2, 0, 15, 120, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Salv[] = { + {87, 88, 4, 0, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {87, 88, 8, 0, 24, 0, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_SanLuis[] = { + {107, 108, 9, 0, 8, 0, TIMEBASE_CUR, 6, "S\0"}, + {108, 109, 2, 0, 8, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Shang[] = { + {40, 40, 5, 7, 3, 0, TIMEBASE_CUR, 6, "D\0"}, + {40, 41, 9, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {41, 41, 2, 7, 16, 0, TIMEBASE_CUR, 6, "D\0"}, +}; +static const struct lc_timezone_rule rules_SovietZone[] = { + {45, 45, 4, 7, 24, 120, TIMEBASE_CUR, 12, "M\0"}, + {45, 45, 8, 7, 24, 180, TIMEBASE_CUR, 6, "S\0"}, + {45, 45, 10, 7, 18, 120, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Spain[] = { + {18, 18, 3, 7, 15, 1380, TIMEBASE_CUR, 6, "S\0"}, + {18, 19, 9, 7, 6, 1440, TIMEBASE_STD, 0, "\0"}, + {19, 19, 3, 7, 6, 1380, TIMEBASE_CUR, 6, "S\0"}, + {24, 24, 3, 7, 16, 1380, TIMEBASE_CUR, 6, "S\0"}, + {24, 24, 9, 7, 4, 1440, TIMEBASE_STD, 0, "\0"}, + {26, 26, 3, 7, 17, 1380, TIMEBASE_CUR, 6, "S\0"}, + {26, 29, 9, 6, 1, 1440, TIMEBASE_STD, 0, "\0"}, + {27, 27, 3, 7, 9, 1380, TIMEBASE_CUR, 6, "S\0"}, + {28, 28, 3, 7, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {29, 29, 3, 7, 20, 1380, TIMEBASE_CUR, 6, "S\0"}, + {37, 37, 5, 7, 16, 1380, TIMEBASE_CUR, 6, "S\0"}, + {37, 37, 9, 7, 2, 1440, TIMEBASE_STD, 0, "\0"}, + {38, 38, 3, 7, 2, 1380, TIMEBASE_CUR, 6, "S\0"}, + {38, 38, 3, 7, 30, 1380, TIMEBASE_CUR, 12, "M\0"}, + {38, 38, 9, 7, 2, 1440, TIMEBASE_CUR, 6, "S\0"}, + {39, 39, 9, 7, 7, 1440, TIMEBASE_STD, 0, "\0"}, + {42, 42, 4, 7, 2, 1380, TIMEBASE_CUR, 6, "S\0"}, + {42, 42, 8, 7, 1, 60, TIMEBASE_CUR, 0, "\0"}, + {43, 46, 3, 6, 13, 1380, TIMEBASE_CUR, 6, "S\0"}, + {43, 44, 9, 0, 1, 60, TIMEBASE_CUR, 0, "\0"}, + {45, 46, 8, 0, 24, 60, TIMEBASE_CUR, 0, "\0"}, + {49, 49, 3, 7, 30, 1380, TIMEBASE_CUR, 6, "S\0"}, + {49, 49, 9, 7, 2, 60, TIMEBASE_CUR, 0, "\0"}, + {74, 75, 3, 6, 12, 1380, TIMEBASE_CUR, 6, "S\0"}, + {74, 75, 9, 0, 1, 60, TIMEBASE_CUR, 0, "\0"}, + {76, 76, 2, 7, 27, 1380, TIMEBASE_CUR, 6, "S\0"}, + {76, 77, 8, 0, 24, 60, TIMEBASE_CUR, 0, "\0"}, + {77, 77, 3, 7, 2, 1380, TIMEBASE_CUR, 6, "S\0"}, + {78, 78, 3, 7, 2, 120, TIMEBASE_STD, 6, "S\0"}, + {78, 78, 9, 7, 1, 120, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_SpainAfrica[] = { + {67, 67, 5, 7, 3, 720, TIMEBASE_CUR, 6, "S\0"}, + {67, 67, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {74, 74, 5, 7, 24, 0, TIMEBASE_CUR, 6, "S\0"}, + {74, 74, 8, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {76, 77, 4, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {76, 76, 7, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {77, 77, 8, 7, 28, 0, TIMEBASE_CUR, 0, "\0"}, + {78, 78, 5, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {78, 78, 7, 7, 4, 0, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_StJohns[] = { + {17, 17, 3, 7, 8, 120, TIMEBASE_CUR, 6, "D\0"}, + {17, 17, 8, 7, 17, 120, TIMEBASE_CUR, 0, "S\0"}, + {19, 19, 4, 7, 5, 1380, TIMEBASE_CUR, 6, "D\0"}, + {19, 19, 7, 7, 12, 1380, TIMEBASE_CUR, 0, "S\0"}, + {20, 35, 4, 0, 1, 1380, TIMEBASE_CUR, 6, "D\0"}, + {20, 35, 9, 0, 25, 1380, TIMEBASE_CUR, 0, "S\0"}, + {36, 41, 4, 1, 9, 0, TIMEBASE_CUR, 6, "D\0"}, + {36, 41, 9, 1, 2, 0, TIMEBASE_CUR, 0, "S\0"}, + {46, 50, 4, 0, 8, 120, TIMEBASE_CUR, 6, "D\0"}, + {46, 50, 9, 0, 2, 120, TIMEBASE_CUR, 0, "S\0"}, + {51, 86, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {51, 59, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {60, 86, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {87, 87, 3, 0, 1, 1, TIMEBASE_CUR, 6, "D\0"}, + {87, 106, 9, 0, 25, 1, TIMEBASE_CUR, 0, "S\0"}, + {88, 88, 3, 0, 1, 1, TIMEBASE_CUR, 12, "DD\0"}, + {89, 106, 3, 0, 1, 1, TIMEBASE_CUR, 6, "D\0"}, + {107, 111, 2, 0, 8, 1, TIMEBASE_CUR, 6, "D\0"}, + {107, 110, 10, 0, 1, 1, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Starke[] = { + {47, 61, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {47, 54, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {55, 56, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {57, 58, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {59, 61, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Sudan[] = { + {70, 70, 4, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {70, 85, 9, 7, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {71, 71, 3, 7, 30, 0, TIMEBASE_CUR, 6, "S\0"}, + {72, 85, 3, 0, 24, 0, TIMEBASE_CUR, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_Swift[] = { + {57, 57, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {57, 57, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {59, 61, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {59, 59, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {60, 61, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Swiss[] = { + {41, 42, 4, 1, 1, 60, TIMEBASE_CUR, 6, "S\0"}, + {41, 42, 9, 1, 1, 120, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Syria[] = { + {20, 23, 3, 0, 15, 120, TIMEBASE_CUR, 6, "S\0"}, + {20, 23, 9, 0, 1, 120, TIMEBASE_CUR, 0, "\0"}, + {62, 62, 3, 7, 29, 120, TIMEBASE_CUR, 6, "S\0"}, + {62, 62, 9, 7, 1, 120, TIMEBASE_CUR, 0, "\0"}, + {63, 65, 4, 7, 1, 120, TIMEBASE_CUR, 6, "S\0"}, + {63, 63, 8, 7, 30, 120, TIMEBASE_CUR, 0, "\0"}, + {64, 64, 9, 7, 1, 120, TIMEBASE_CUR, 0, "\0"}, + {65, 65, 8, 7, 30, 120, TIMEBASE_CUR, 0, "\0"}, + {66, 66, 3, 7, 24, 120, TIMEBASE_CUR, 6, "S\0"}, + {66, 76, 9, 7, 1, 120, TIMEBASE_CUR, 0, "\0"}, + {67, 78, 4, 7, 1, 120, TIMEBASE_CUR, 6, "S\0"}, + {77, 78, 8, 7, 1, 120, TIMEBASE_CUR, 0, "\0"}, + {83, 84, 3, 7, 9, 120, TIMEBASE_CUR, 6, "S\0"}, + {83, 84, 9, 7, 1, 120, TIMEBASE_CUR, 0, "\0"}, + {86, 86, 1, 7, 16, 120, TIMEBASE_CUR, 6, "S\0"}, + {86, 86, 9, 7, 9, 120, TIMEBASE_CUR, 0, "\0"}, + {87, 87, 2, 7, 1, 120, TIMEBASE_CUR, 6, "S\0"}, + {87, 88, 9, 7, 31, 120, TIMEBASE_CUR, 0, "\0"}, + {88, 88, 2, 7, 15, 120, TIMEBASE_CUR, 6, "S\0"}, + {89, 89, 2, 7, 31, 120, TIMEBASE_CUR, 6, "S\0"}, + {89, 89, 9, 7, 1, 120, TIMEBASE_CUR, 0, "\0"}, + {90, 90, 3, 7, 1, 120, TIMEBASE_CUR, 6, "S\0"}, + {90, 90, 8, 7, 30, 120, TIMEBASE_CUR, 0, "\0"}, + {91, 91, 3, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {91, 92, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {92, 92, 3, 7, 8, 0, TIMEBASE_CUR, 6, "S\0"}, + {93, 93, 2, 7, 26, 0, TIMEBASE_CUR, 6, "S\0"}, + {93, 93, 8, 7, 25, 0, TIMEBASE_CUR, 0, "\0"}, + {94, 96, 3, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {94, 105, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {97, 98, 2, 1, 25, 0, TIMEBASE_CUR, 6, "S\0"}, + {99, 106, 3, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {106, 106, 8, 7, 22, 0, TIMEBASE_CUR, 0, "\0"}, + {107, 107, 2, 5, 25, 0, TIMEBASE_CUR, 6, "S\0"}, + {107, 107, 10, 5, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {108, 108, 3, 5, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {108, 108, 10, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {109, 109, 2, 5, 25, 0, TIMEBASE_CUR, 6, "S\0"}, + {109, 255, 9, 5, 25, 0, TIMEBASE_CUR, 0, "\0"}, + {110, 111, 3, 5, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {112, 255, 2, 5, 25, 0, TIMEBASE_CUR, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_Taiwan[] = { + {46, 46, 4, 7, 15, 0, TIMEBASE_CUR, 6, "D\0"}, + {46, 46, 9, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {47, 47, 3, 7, 15, 0, TIMEBASE_CUR, 6, "D\0"}, + {47, 47, 10, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {48, 51, 4, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {48, 51, 9, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {52, 52, 2, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {52, 54, 10, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {53, 59, 3, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {55, 61, 9, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {60, 61, 5, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {74, 75, 3, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {74, 75, 9, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {79, 79, 6, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {79, 79, 9, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Thule[] = { + {91, 92, 2, 0, 25, 120, TIMEBASE_CUR, 6, "D\0"}, + {91, 92, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {93, 106, 3, 0, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {93, 106, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {107, 255, 2, 0, 8, 120, TIMEBASE_CUR, 6, "D\0"}, + {107, 255, 10, 0, 1, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Tonga[] = { + {99, 99, 9, 7, 7, 120, TIMEBASE_STD, 6, "S\0"}, + {100, 100, 2, 7, 19, 120, TIMEBASE_STD, 0, "\0"}, + {100, 101, 10, 0, 1, 120, TIMEBASE_CUR, 6, "S\0"}, + {101, 102, 0, 0, 25, 120, TIMEBASE_CUR, 0, "\0"}, + {116, 255, 10, 0, 1, 120, TIMEBASE_CUR, 6, "S\0"}, + {117, 255, 0, 0, 15, 180, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Toronto[] = { + {19, 19, 2, 7, 30, 1410, TIMEBASE_CUR, 6, "D\0"}, + {19, 19, 9, 7, 26, 0, TIMEBASE_CUR, 0, "S\0"}, + {20, 20, 4, 7, 2, 120, TIMEBASE_CUR, 6, "D\0"}, + {20, 20, 8, 7, 26, 0, TIMEBASE_CUR, 0, "S\0"}, + {21, 21, 4, 7, 15, 120, TIMEBASE_CUR, 6, "D\0"}, + {21, 21, 8, 7, 15, 120, TIMEBASE_CUR, 0, "S\0"}, + {22, 23, 4, 0, 8, 120, TIMEBASE_CUR, 6, "D\0"}, + {22, 26, 8, 0, 15, 120, TIMEBASE_CUR, 0, "S\0"}, + {24, 27, 4, 0, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {27, 32, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {28, 31, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {32, 32, 4, 7, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {33, 40, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {33, 33, 9, 7, 1, 120, TIMEBASE_CUR, 0, "S\0"}, + {34, 39, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {45, 46, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {46, 46, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {47, 49, 3, 0, 24, 0, TIMEBASE_CUR, 6, "D\0"}, + {47, 48, 8, 0, 24, 0, TIMEBASE_CUR, 0, "S\0"}, + {49, 49, 10, 0, 24, 0, TIMEBASE_CUR, 0, "S\0"}, + {50, 73, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {50, 50, 10, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {51, 56, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {57, 73, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Troll[] = { + {104, 255, 9, 0, 25, 60, TIMEBASE_UTC, 0, "+00\0"}, + {105, 255, 2, 0, 25, 60, TIMEBASE_UTC, 12, "+02\0"}, +}; +static const struct lc_timezone_rule rules_Tunisia[] = { + {39, 39, 3, 7, 15, 1380, TIMEBASE_STD, 6, "S\0"}, + {39, 39, 10, 7, 18, 1380, TIMEBASE_STD, 0, "\0"}, + {40, 40, 1, 7, 25, 1380, TIMEBASE_STD, 6, "S\0"}, + {41, 41, 9, 7, 6, 0, TIMEBASE_CUR, 0, "\0"}, + {42, 42, 2, 7, 9, 0, TIMEBASE_CUR, 6, "S\0"}, + {42, 42, 10, 7, 2, 180, TIMEBASE_CUR, 0, "\0"}, + {43, 43, 2, 7, 29, 120, TIMEBASE_CUR, 6, "S\0"}, + {43, 43, 3, 7, 17, 120, TIMEBASE_CUR, 0, "\0"}, + {43, 43, 3, 7, 25, 120, TIMEBASE_CUR, 6, "S\0"}, + {43, 43, 9, 7, 4, 120, TIMEBASE_CUR, 0, "\0"}, + {44, 45, 3, 1, 1, 120, TIMEBASE_CUR, 6, "S\0"}, + {44, 44, 9, 7, 8, 0, TIMEBASE_CUR, 0, "\0"}, + {45, 45, 8, 7, 16, 0, TIMEBASE_CUR, 0, "\0"}, + {77, 77, 3, 7, 30, 0, TIMEBASE_STD, 6, "S\0"}, + {77, 77, 8, 7, 24, 0, TIMEBASE_STD, 0, "\0"}, + {78, 78, 4, 7, 1, 0, TIMEBASE_STD, 6, "S\0"}, + {78, 78, 9, 7, 1, 0, TIMEBASE_STD, 0, "\0"}, + {88, 88, 5, 7, 1, 0, TIMEBASE_STD, 6, "S\0"}, + {88, 90, 8, 0, 24, 0, TIMEBASE_STD, 0, "\0"}, + {89, 89, 2, 7, 26, 0, TIMEBASE_STD, 6, "S\0"}, + {90, 90, 4, 7, 1, 0, TIMEBASE_STD, 6, "S\0"}, + {105, 105, 4, 7, 1, 0, TIMEBASE_STD, 6, "S\0"}, + {105, 105, 8, 7, 30, 60, TIMEBASE_STD, 0, "\0"}, + {106, 108, 2, 0, 25, 120, TIMEBASE_STD, 6, "S\0"}, + {106, 108, 9, 0, 25, 120, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Turkey[] = { + {16, 16, 4, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {16, 16, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {20, 20, 2, 7, 28, 0, TIMEBASE_CUR, 6, "S\0"}, + {20, 20, 9, 7, 25, 0, TIMEBASE_CUR, 0, "\0"}, + {21, 21, 3, 7, 3, 0, TIMEBASE_CUR, 6, "S\0"}, + {21, 21, 9, 7, 3, 0, TIMEBASE_CUR, 0, "\0"}, + {22, 22, 2, 7, 26, 0, TIMEBASE_CUR, 6, "S\0"}, + {22, 22, 9, 7, 8, 0, TIMEBASE_CUR, 0, "\0"}, + {24, 24, 4, 7, 13, 0, TIMEBASE_CUR, 6, "S\0"}, + {24, 25, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {25, 25, 4, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {40, 40, 5, 7, 30, 0, TIMEBASE_CUR, 6, "S\0"}, + {40, 40, 9, 7, 5, 0, TIMEBASE_CUR, 0, "\0"}, + {40, 40, 11, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {41, 41, 8, 7, 21, 0, TIMEBASE_CUR, 0, "\0"}, + {42, 42, 3, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {42, 42, 10, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {45, 45, 3, 7, 2, 0, TIMEBASE_CUR, 6, "S\0"}, + {45, 45, 9, 7, 8, 0, TIMEBASE_CUR, 0, "\0"}, + {46, 46, 5, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {46, 46, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {47, 48, 3, 0, 16, 0, TIMEBASE_CUR, 6, "S\0"}, + {47, 50, 9, 0, 2, 0, TIMEBASE_CUR, 0, "\0"}, + {49, 49, 3, 7, 10, 0, TIMEBASE_CUR, 6, "S\0"}, + {50, 50, 3, 7, 19, 0, TIMEBASE_CUR, 6, "S\0"}, + {51, 51, 3, 7, 22, 0, TIMEBASE_CUR, 6, "S\0"}, + {51, 51, 9, 7, 8, 0, TIMEBASE_CUR, 0, "\0"}, + {62, 62, 6, 7, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {62, 62, 9, 7, 8, 0, TIMEBASE_CUR, 0, "\0"}, + {64, 64, 4, 7, 15, 0, TIMEBASE_CUR, 6, "S\0"}, + {64, 64, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {70, 72, 4, 0, 2, 0, TIMEBASE_CUR, 6, "S\0"}, + {70, 72, 9, 0, 2, 0, TIMEBASE_CUR, 0, "\0"}, + {73, 73, 5, 7, 3, 60, TIMEBASE_CUR, 6, "S\0"}, + {73, 73, 10, 7, 4, 180, TIMEBASE_CUR, 0, "\0"}, + {74, 74, 2, 7, 31, 120, TIMEBASE_CUR, 6, "S\0"}, + {74, 74, 10, 7, 3, 300, TIMEBASE_CUR, 0, "\0"}, + {75, 75, 2, 7, 30, 0, TIMEBASE_CUR, 6, "S\0"}, + {75, 76, 9, 0, 25, 0, TIMEBASE_CUR, 0, "\0"}, + {76, 76, 5, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {77, 78, 3, 0, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {77, 77, 9, 7, 16, 0, TIMEBASE_CUR, 0, "\0"}, + {79, 80, 3, 0, 1, 180, TIMEBASE_CUR, 6, "S\0"}, + {79, 82, 9, 1, 11, 0, TIMEBASE_CUR, 0, "\0"}, + {81, 82, 2, 0, 25, 180, TIMEBASE_CUR, 6, "S\0"}, + {83, 83, 6, 7, 31, 0, TIMEBASE_CUR, 6, "S\0"}, + {83, 83, 9, 7, 2, 0, TIMEBASE_CUR, 0, "\0"}, + {85, 85, 3, 7, 20, 0, TIMEBASE_CUR, 6, "S\0"}, + {85, 85, 8, 7, 28, 0, TIMEBASE_CUR, 0, "\0"}, + {86, 93, 2, 0, 25, 60, TIMEBASE_STD, 6, "S\0"}, + {86, 95, 8, 0, 24, 60, TIMEBASE_STD, 0, "\0"}, + {94, 94, 2, 7, 20, 60, TIMEBASE_STD, 6, "S\0"}, + {95, 106, 2, 0, 25, 60, TIMEBASE_STD, 6, "S\0"}, + {96, 106, 9, 0, 25, 60, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_US[] = { + {18, 19, 2, 0, 25, 120, TIMEBASE_CUR, 6, "D\0"}, + {18, 19, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {42, 42, 1, 7, 9, 120, TIMEBASE_CUR, 6, "W\0"}, + {45, 45, 7, 7, 14, 1380, TIMEBASE_UTC, 6, "P\0"}, + {45, 45, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {67, 73, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {67, 106, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {74, 74, 0, 7, 6, 120, TIMEBASE_CUR, 6, "D\0"}, + {75, 75, 1, 7, 23, 120, TIMEBASE_CUR, 6, "D\0"}, + {76, 86, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {87, 106, 3, 0, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {107, 255, 2, 0, 8, 120, TIMEBASE_CUR, 6, "D\0"}, + {107, 255, 10, 0, 1, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Uruguay[] = { + {23, 23, 9, 7, 2, 0, TIMEBASE_CUR, 3, "HS\0"}, + {24, 26, 3, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {24, 25, 9, 7, 1, 0, TIMEBASE_CUR, 3, "HS\0"}, + {33, 35, 9, 0, 25, 0, TIMEBASE_CUR, 3, "HS\0"}, + {34, 36, 2, 6, 25, 1410, TIMEBASE_STD, 0, "\0"}, + {36, 36, 10, 7, 1, 0, TIMEBASE_CUR, 3, "HS\0"}, + {37, 41, 2, 0, 25, 0, TIMEBASE_CUR, 0, "\0"}, + {37, 40, 9, 0, 25, 0, TIMEBASE_CUR, 3, "HS\0"}, + {41, 41, 7, 7, 1, 0, TIMEBASE_CUR, 3, "HS\0"}, + {41, 41, 11, 7, 31, 1440, TIMEBASE_CUR, 0, "\0"}, + {42, 42, 11, 7, 14, 0, TIMEBASE_CUR, 6, "S\0"}, + {43, 43, 2, 7, 14, 0, TIMEBASE_CUR, 0, "\0"}, + {59, 59, 4, 7, 24, 0, TIMEBASE_CUR, 6, "S\0"}, + {59, 59, 10, 7, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {60, 60, 0, 7, 17, 0, TIMEBASE_CUR, 6, "S\0"}, + {60, 60, 2, 7, 6, 0, TIMEBASE_CUR, 0, "\0"}, + {65, 67, 3, 0, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {65, 65, 8, 7, 26, 0, TIMEBASE_CUR, 0, "\0"}, + {66, 67, 9, 7, 31, 0, TIMEBASE_CUR, 0, "\0"}, + {68, 70, 4, 7, 27, 0, TIMEBASE_CUR, 3, "HS\0"}, + {68, 70, 11, 7, 2, 0, TIMEBASE_CUR, 0, "\0"}, + {72, 72, 3, 7, 24, 0, TIMEBASE_CUR, 6, "S\0"}, + {72, 72, 7, 7, 15, 0, TIMEBASE_CUR, 0, "\0"}, + {74, 74, 2, 7, 10, 0, TIMEBASE_CUR, 3, "HS\0"}, + {74, 74, 11, 7, 22, 0, TIMEBASE_CUR, 6, "S\0"}, + {76, 76, 9, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {77, 77, 11, 7, 4, 0, TIMEBASE_CUR, 6, "S\0"}, + {78, 78, 3, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {79, 79, 9, 7, 1, 0, TIMEBASE_CUR, 6, "S\0"}, + {80, 80, 4, 7, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {87, 87, 11, 7, 14, 0, TIMEBASE_CUR, 6, "S\0"}, + {88, 88, 2, 7, 14, 0, TIMEBASE_CUR, 0, "\0"}, + {88, 88, 11, 7, 11, 0, TIMEBASE_CUR, 6, "S\0"}, + {89, 89, 2, 7, 12, 0, TIMEBASE_CUR, 0, "\0"}, + {89, 89, 9, 7, 29, 0, TIMEBASE_CUR, 6, "S\0"}, + {90, 92, 2, 0, 1, 0, TIMEBASE_CUR, 0, "\0"}, + {90, 91, 9, 0, 21, 0, TIMEBASE_CUR, 6, "S\0"}, + {92, 92, 9, 7, 18, 0, TIMEBASE_CUR, 6, "S\0"}, + {93, 93, 1, 7, 28, 0, TIMEBASE_CUR, 0, "\0"}, + {104, 104, 8, 7, 19, 0, TIMEBASE_CUR, 6, "S\0"}, + {105, 105, 2, 7, 27, 120, TIMEBASE_CUR, 0, "\0"}, + {105, 105, 9, 7, 9, 120, TIMEBASE_CUR, 6, "S\0"}, + {106, 106, 2, 7, 12, 120, TIMEBASE_CUR, 0, "\0"}, + {106, 114, 9, 0, 1, 120, TIMEBASE_CUR, 6, "S\0"}, + {107, 115, 2, 0, 8, 120, TIMEBASE_CUR, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Vanc[] = { + {18, 18, 3, 7, 14, 120, TIMEBASE_CUR, 6, "D\0"}, + {18, 18, 9, 7, 27, 120, TIMEBASE_CUR, 0, "S\0"}, + {42, 42, 1, 7, 9, 120, TIMEBASE_CUR, 6, "W\0"}, + {45, 45, 7, 7, 14, 1380, TIMEBASE_UTC, 6, "P\0"}, + {45, 45, 8, 7, 30, 120, TIMEBASE_CUR, 0, "S\0"}, + {46, 86, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {46, 46, 9, 7, 13, 120, TIMEBASE_CUR, 0, "S\0"}, + {47, 61, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {62, 106, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_Vanuatu[] = { + {83, 83, 8, 7, 25, 0, TIMEBASE_CUR, 6, "S\0"}, + {84, 91, 2, 0, 23, 0, TIMEBASE_CUR, 0, "\0"}, + {84, 84, 9, 7, 23, 0, TIMEBASE_CUR, 6, "S\0"}, + {85, 91, 8, 0, 23, 0, TIMEBASE_CUR, 6, "S\0"}, + {92, 93, 0, 0, 23, 0, TIMEBASE_CUR, 0, "\0"}, + {92, 92, 9, 0, 23, 0, TIMEBASE_CUR, 6, "S\0"}, +}; +static const struct lc_timezone_rule rules_Vincennes[] = { + {46, 46, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {46, 46, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {53, 54, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {53, 59, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {55, 55, 4, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {56, 63, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {60, 60, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {61, 61, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {62, 63, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_rule rules_WS[] = { + {110, 110, 8, 0, 24, 0, TIMEBASE_CUR, 6, "D\0"}, + {111, 111, 3, 6, 1, 240, TIMEBASE_CUR, 0, "S\0"}, + {111, 111, 8, 6, 24, 180, TIMEBASE_CUR, 6, "D\0"}, + {112, 255, 3, 0, 1, 240, TIMEBASE_CUR, 0, "S\0"}, + {112, 255, 8, 0, 24, 180, TIMEBASE_CUR, 6, "D\0"}, +}; +static const struct lc_timezone_rule rules_W_Eur[] = { + {77, 80, 3, 0, 1, 60, TIMEBASE_STD, 6, "S\0"}, + {77, 77, 8, 0, 24, 60, TIMEBASE_STD, 0, "\0"}, + {78, 78, 9, 7, 1, 60, TIMEBASE_STD, 0, "\0"}, + {79, 95, 8, 0, 24, 60, TIMEBASE_STD, 0, "\0"}, + {81, 255, 2, 0, 25, 60, TIMEBASE_STD, 6, "S\0"}, + {96, 255, 9, 0, 25, 60, TIMEBASE_STD, 0, "\0"}, +}; +static const struct lc_timezone_rule rules_Winn[] = { + {16, 16, 3, 7, 23, 0, TIMEBASE_CUR, 6, "D\0"}, + {16, 16, 8, 7, 17, 0, TIMEBASE_CUR, 0, "S\0"}, + {18, 18, 3, 7, 14, 120, TIMEBASE_CUR, 6, "D\0"}, + {18, 18, 9, 7, 27, 120, TIMEBASE_CUR, 0, "S\0"}, + {37, 37, 4, 7, 16, 120, TIMEBASE_CUR, 6, "D\0"}, + {37, 37, 8, 7, 26, 120, TIMEBASE_CUR, 0, "S\0"}, + {42, 42, 1, 7, 9, 120, TIMEBASE_CUR, 6, "W\0"}, + {45, 45, 7, 7, 14, 1380, TIMEBASE_UTC, 6, "P\0"}, + {45, 45, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {46, 46, 4, 7, 12, 120, TIMEBASE_CUR, 6, "D\0"}, + {46, 46, 9, 7, 13, 120, TIMEBASE_CUR, 0, "S\0"}, + {47, 49, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {47, 49, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {50, 50, 4, 7, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {50, 50, 8, 7, 30, 120, TIMEBASE_CUR, 0, "S\0"}, + {51, 60, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {51, 58, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {59, 59, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, + {60, 60, 8, 0, 24, 120, TIMEBASE_CUR, 0, "S\0"}, + {63, 63, 3, 0, 24, 120, TIMEBASE_CUR, 6, "D\0"}, + {63, 63, 8, 7, 22, 120, TIMEBASE_CUR, 0, "S\0"}, + {66, 86, 3, 0, 24, 120, TIMEBASE_STD, 6, "D\0"}, + {66, 105, 9, 0, 25, 120, TIMEBASE_STD, 0, "S\0"}, + {87, 105, 3, 0, 1, 120, TIMEBASE_STD, 6, "D\0"}, +}; +static const struct lc_timezone_rule rules_Zion[] = { + {40, 40, 5, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {42, 44, 10, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {43, 43, 3, 7, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {44, 44, 3, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {45, 45, 3, 7, 16, 0, TIMEBASE_CUR, 6, "D\0"}, + {45, 45, 10, 7, 1, 120, TIMEBASE_CUR, 0, "S\0"}, + {46, 46, 3, 7, 16, 120, TIMEBASE_CUR, 6, "D\0"}, + {46, 46, 10, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {48, 48, 4, 7, 23, 0, TIMEBASE_CUR, 12, "DD\0"}, + {48, 48, 8, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {48, 49, 10, 7, 1, 120, TIMEBASE_CUR, 0, "S\0"}, + {49, 49, 4, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {50, 50, 3, 7, 16, 0, TIMEBASE_CUR, 6, "D\0"}, + {50, 50, 8, 7, 15, 180, TIMEBASE_CUR, 0, "S\0"}, + {51, 51, 3, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {51, 51, 10, 7, 11, 180, TIMEBASE_CUR, 0, "S\0"}, + {52, 52, 3, 7, 20, 120, TIMEBASE_CUR, 6, "D\0"}, + {52, 52, 9, 7, 19, 180, TIMEBASE_CUR, 0, "S\0"}, + {53, 53, 3, 7, 12, 120, TIMEBASE_CUR, 6, "D\0"}, + {53, 53, 8, 7, 13, 180, TIMEBASE_CUR, 0, "S\0"}, + {54, 54, 5, 7, 13, 0, TIMEBASE_CUR, 6, "D\0"}, + {54, 54, 8, 7, 12, 0, TIMEBASE_CUR, 0, "S\0"}, + {55, 55, 5, 7, 11, 120, TIMEBASE_CUR, 6, "D\0"}, + {55, 55, 8, 7, 11, 0, TIMEBASE_CUR, 0, "S\0"}, + {56, 56, 5, 7, 3, 0, TIMEBASE_CUR, 6, "D\0"}, + {56, 56, 8, 7, 30, 180, TIMEBASE_CUR, 0, "S\0"}, + {57, 57, 3, 7, 29, 120, TIMEBASE_CUR, 6, "D\0"}, + {57, 57, 8, 7, 22, 0, TIMEBASE_CUR, 0, "S\0"}, + {74, 74, 6, 7, 7, 0, TIMEBASE_CUR, 6, "D\0"}, + {74, 74, 9, 7, 13, 0, TIMEBASE_CUR, 0, "S\0"}, + {75, 75, 3, 7, 20, 0, TIMEBASE_CUR, 6, "D\0"}, + {75, 75, 7, 7, 31, 0, TIMEBASE_CUR, 0, "S\0"}, + {85, 85, 3, 7, 14, 0, TIMEBASE_CUR, 6, "D\0"}, + {85, 85, 8, 7, 15, 0, TIMEBASE_CUR, 0, "S\0"}, + {86, 86, 4, 7, 18, 0, TIMEBASE_CUR, 6, "D\0"}, + {86, 86, 8, 7, 7, 0, TIMEBASE_CUR, 0, "S\0"}, + {87, 87, 3, 7, 15, 0, TIMEBASE_CUR, 6, "D\0"}, + {87, 87, 8, 7, 13, 0, TIMEBASE_CUR, 0, "S\0"}, + {88, 88, 3, 7, 10, 0, TIMEBASE_CUR, 6, "D\0"}, + {88, 88, 8, 7, 4, 0, TIMEBASE_CUR, 0, "S\0"}, + {89, 89, 3, 7, 30, 0, TIMEBASE_CUR, 6, "D\0"}, + {89, 89, 8, 7, 3, 0, TIMEBASE_CUR, 0, "S\0"}, + {90, 90, 2, 7, 25, 0, TIMEBASE_CUR, 6, "D\0"}, + {90, 90, 7, 7, 26, 0, TIMEBASE_CUR, 0, "S\0"}, + {91, 91, 2, 7, 24, 0, TIMEBASE_CUR, 6, "D\0"}, + {91, 91, 8, 7, 1, 0, TIMEBASE_CUR, 0, "S\0"}, + {92, 92, 2, 7, 29, 0, TIMEBASE_CUR, 6, "D\0"}, + {92, 92, 8, 7, 6, 0, TIMEBASE_CUR, 0, "S\0"}, + {93, 93, 3, 7, 2, 0, TIMEBASE_CUR, 6, "D\0"}, + {93, 93, 8, 7, 5, 0, TIMEBASE_CUR, 0, "S\0"}, + {94, 94, 3, 7, 1, 0, TIMEBASE_CUR, 6, "D\0"}, + {94, 94, 7, 7, 28, 0, TIMEBASE_CUR, 0, "S\0"}, + {95, 95, 2, 7, 31, 0, TIMEBASE_CUR, 6, "D\0"}, + {95, 95, 8, 7, 3, 0, TIMEBASE_CUR, 0, "S\0"}, + {96, 96, 2, 7, 15, 0, TIMEBASE_CUR, 6, "D\0"}, + {96, 96, 8, 7, 16, 0, TIMEBASE_CUR, 0, "S\0"}, + {97, 97, 2, 7, 21, 0, TIMEBASE_CUR, 6, "D\0"}, + {97, 97, 8, 7, 14, 0, TIMEBASE_CUR, 0, "S\0"}, + {98, 98, 2, 7, 20, 0, TIMEBASE_CUR, 6, "D\0"}, + {98, 98, 8, 7, 6, 0, TIMEBASE_CUR, 0, "S\0"}, + {99, 99, 3, 7, 2, 120, TIMEBASE_CUR, 6, "D\0"}, + {99, 99, 8, 7, 3, 120, TIMEBASE_CUR, 0, "S\0"}, + {100, 100, 3, 7, 14, 120, TIMEBASE_CUR, 6, "D\0"}, + {100, 100, 9, 7, 6, 60, TIMEBASE_CUR, 0, "S\0"}, + {101, 101, 3, 7, 9, 60, TIMEBASE_CUR, 6, "D\0"}, + {101, 101, 8, 7, 24, 60, TIMEBASE_CUR, 0, "S\0"}, + {102, 102, 2, 7, 29, 60, TIMEBASE_CUR, 6, "D\0"}, + {102, 102, 9, 7, 7, 60, TIMEBASE_CUR, 0, "S\0"}, + {103, 103, 2, 7, 28, 60, TIMEBASE_CUR, 6, "D\0"}, + {103, 103, 9, 7, 3, 60, TIMEBASE_CUR, 0, "S\0"}, + {104, 104, 3, 7, 7, 60, TIMEBASE_CUR, 6, "D\0"}, + {104, 104, 8, 7, 22, 60, TIMEBASE_CUR, 0, "S\0"}, + {105, 105, 3, 7, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {105, 105, 9, 7, 9, 120, TIMEBASE_CUR, 0, "S\0"}, + {106, 110, 2, 5, 26, 120, TIMEBASE_CUR, 6, "D\0"}, + {106, 106, 9, 7, 1, 120, TIMEBASE_CUR, 0, "S\0"}, + {107, 107, 8, 7, 16, 120, TIMEBASE_CUR, 0, "S\0"}, + {108, 108, 9, 7, 5, 120, TIMEBASE_CUR, 0, "S\0"}, + {109, 109, 8, 7, 27, 120, TIMEBASE_CUR, 0, "S\0"}, + {110, 110, 8, 7, 12, 120, TIMEBASE_CUR, 0, "S\0"}, + {111, 111, 3, 7, 1, 120, TIMEBASE_CUR, 6, "D\0"}, + {111, 111, 9, 7, 2, 120, TIMEBASE_CUR, 0, "S\0"}, + {112, 112, 2, 5, 26, 120, TIMEBASE_CUR, 6, "D\0"}, + {112, 112, 8, 7, 23, 120, TIMEBASE_CUR, 0, "S\0"}, + {113, 255, 2, 5, 23, 120, TIMEBASE_CUR, 6, "D\0"}, + {113, 255, 9, 0, 25, 120, TIMEBASE_CUR, 0, "S\0"}, +}; +static const struct lc_timezone_era eras_Africa_Abidjan[] = { + {NULL, 0, -968, -1830383032LL, 0, "LMT\0", "\0"}, + {NULL, 0, 0, 0, 0, "GMT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Accra[] = { + {NULL, 0, -52, -1640995148LL, 0, "LMT\0", "\0"}, + {rules_Ghana, 2, 0, 0, 0, "GMT\0", "+0020\0"}, +}; +static const struct lc_timezone_era eras_Africa_Algiers[] = { + {NULL, 0, 732, -2486679072LL, 0, "LMT\0", "\0"}, + {NULL, 0, 561, -1855958961LL, 0, "PMT\0", "\0"}, + {rules_Algeria, 22, 0, -942012000LL, 0, "WE%sT\0", "\0"}, + {rules_Algeria, 22, 3600, -733280400LL, 0, "CE%sT\0", "\0"}, + {NULL, 0, 0, -439430400LL, 0, "WET\0", "\0"}, + {NULL, 0, 3600, -212029200LL, 0, "CET\0", "\0"}, + {rules_Algeria, 22, 0, 246236400LL, 6, "WE%sT\0", "\0"}, + {rules_Algeria, 22, 3600, 309740400LL, 0, "CE%sT\0", "\0"}, + {rules_Algeria, 22, 0, 357523200LL, 0, "WE%sT\0", "\0"}, + {NULL, 0, 3600, 0, 0, "CET\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Bissau[] = { + {NULL, 0, -3740, -1830380260LL, 0, "LMT\0", "\0"}, + {NULL, 0, -3600, 157770000LL, 0, "-01\0", "\0"}, + {NULL, 0, 0, 0, 0, "GMT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Cairo[] = { + {NULL, 0, 7509, -2185409109LL, 0, "LMT\0", "\0"}, + {rules_Egypt, 32, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Casablanca[] = { + {NULL, 0, -1820, -1773012580LL, 0, "LMT\0", "\0"}, + {rules_Morocco, 54, 0, 448243200LL, 0, "WE%sT\0", "\0"}, + {NULL, 0, 3600, 504918000LL, 0, "CET\0", "\0"}, + {rules_Morocco, 54, 0, 0, 0, "WE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Ceuta[] = { + {NULL, 0, -1276, -2177452800LL, 0, "LMT\0", "\0"}, + {NULL, 0, 0, -1630112400LL, 0, "WET\0", "\0"}, + {rules_100, 1, 0, -1616810400LL, 6, "WEST\0", "\0"}, + {NULL, 0, 0, -1451692800LL, 0, "WET\0", "\0"}, + {rules_Spain, 30, 0, -1293840000LL, 0, "WE%sT\0", "\0"}, + {rules_SpainAfrica, 9, 0, 448243200LL, 0, "WE%sT\0", "\0"}, + {NULL, 0, 3600, 504918000LL, 0, "CET\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_El_Aaiun[] = { + {NULL, 0, -3168, -1136070432LL, 0, "LMT\0", "\0"}, + {NULL, 0, -3600, 198291600LL, 0, "-01\0", "\0"}, + {rules_Morocco, 54, 0, 0, 0, "WE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Johannesburg[] = { + {NULL, 0, 6720, -2458173120LL, 0, "LMT\0", "\0"}, + {NULL, 0, 5400, -2109288600LL, 0, "SAST\0", "\0"}, + {rules_SA, 2, 7200, 0, 0, "SAST\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Khartoum[] = { + {NULL, 0, 7808, -1230775808LL, 0, "LMT\0", "\0"}, + {rules_Sudan, 4, 7200, 947930400LL, 0, "CA%sT\0", "\0"}, + {NULL, 0, 10800, 0, 0, "EAT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Lagos[] = { + {NULL, 0, 816, -1588464816LL, 0, "LMT\0", "\0"}, + {NULL, 0, 3600, 0, 0, "WAT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Maputo[] = { + {NULL, 0, 7820, -2109291020LL, 0, "LMT\0", "\0"}, + {NULL, 0, 7200, 0, 0, "CAT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Monrovia[] = { + {NULL, 0, -2588, -2776979812LL, 0, "LMT\0", "\0"}, + {NULL, 0, -2588, -1604359012LL, 0, "MMT\0", "\0"}, + {NULL, 0, -2670, 63593070LL, 0, "MMT\0", "\0"}, + {NULL, 0, 0, 0, 0, "GMT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Nairobi[] = { + {NULL, 0, 8836, -1309746436LL, 0, "LMT\0", "\0"}, + {NULL, 0, 10800, -1262314800LL, 0, "EAT\0", "\0"}, + {NULL, 0, 9000, -946780200LL, 0, "+0230\0", "\0"}, + {NULL, 0, 9900, -315629100LL, 0, "+0245\0", "\0"}, + {NULL, 0, 10800, 0, 0, "EAT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Ndjamena[] = { + {NULL, 0, 3612, -1830387612LL, 0, "LMT\0", "\0"}, + {NULL, 0, 3600, 308703600LL, 0, "WAT\0", "\0"}, + {rules_100, 1, 3600, 321314400LL, 6, "WAST\0", "\0"}, + {NULL, 0, 3600, 0, 0, "WAT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Tripoli[] = { + {NULL, 0, 3164, -1577926364LL, 0, "LMT\0", "\0"}, + {rules_Libya, 17, 3600, -347158800LL, 0, "CE%sT\0", "\0"}, + {NULL, 0, 7200, 378684000LL, 0, "EET\0", "\0"}, + {rules_Libya, 17, 3600, 641775600LL, 0, "CE%sT\0", "\0"}, + {NULL, 0, 7200, 844034400LL, 0, "EET\0", "\0"}, + {rules_Libya, 17, 3600, 875916000LL, 6, "CE%sT\0", "\0"}, + {NULL, 0, 7200, 1352505600LL, 0, "EET\0", "\0"}, + {rules_Libya, 17, 3600, 1382659200LL, 6, "CE%sT\0", "\0"}, + {NULL, 0, 7200, 0, 0, "EET\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Tunis[] = { + {NULL, 0, 2444, -2797202444LL, 0, "LMT\0", "\0"}, + {NULL, 0, 561, -1855958961LL, 0, "PMT\0", "\0"}, + {rules_Tunisia, 25, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Africa_Windhoek[] = { + {NULL, 0, 4104, -2458170504LL, 0, "LMT\0", "\0"}, + {NULL, 0, 5400, -2109288600LL, 0, "+0130\0", "\0"}, + {NULL, 0, 7200, -860976000LL, 0, "SAST\0", "\0"}, + {rules_100, 1, 7200, -845254800LL, 6, "SAST\0", "\0"}, + {NULL, 0, 7200, 637970400LL, 0, "SAST\0", "\0"}, + {NULL, 0, 7200, 765324000LL, 0, "CAT\0", "\0"}, + {rules_Namibia, 2, 3600, 0, 0, "WA%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Adak[] = { + {NULL, 0, 44001, -3225356001LL, 0, "LMT\0", "\0"}, + {NULL, 0, -42398, -2188944802LL, 0, "LMT\0", "\0"}, + {NULL, 0, -39600, -883573200LL, 0, "NST\0", "\0"}, + {rules_US, 13, -39600, -757342800LL, 0, "N%sT\0", "\0"}, + {NULL, 0, -39600, -86878800LL, 0, "NST\0", "\0"}, + {NULL, 0, -39600, -31496400LL, 0, "BST\0", "\0"}, + {rules_US, 13, -39600, 436363200LL, 6, "B%sT\0", "\0"}, + {rules_US, 13, -36000, 439034400LL, 0, "AH%sT\0", "\0"}, + {rules_US, 13, -36000, 0, 0, "H%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Anchorage[] = { + {NULL, 0, 50424, -3225362424LL, 0, "LMT\0", "\0"}, + {NULL, 0, -35976, -2188951224LL, 0, "LMT\0", "\0"}, + {NULL, 0, -36000, -883576800LL, 0, "AST\0", "\0"}, + {rules_US, 13, -36000, -86882400LL, 0, "A%sT\0", "\0"}, + {NULL, 0, -36000, -31500000LL, 0, "AHST\0", "\0"}, + {rules_US, 13, -36000, 436359600LL, 6, "AH%sT\0", "\0"}, + {rules_US, 13, -32400, 439030800LL, 0, "Y%sT\0", "\0"}, + {rules_US, 13, -32400, 0, 0, "AK%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Araguaina[] = { + {NULL, 0, -11568, -1767214032LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -10800, 653540400LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 811047600LL, 0, "-03\0", "\0"}, + {rules_Brazil, 64, -10800, 1064372400LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 1350788400LL, 0, "-03\0", "\0"}, + {rules_Brazil, 64, -10800, 1378004400LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Argentina_Buenos_Aires[] = { + {NULL, 0, -14028, -2372097972LL, 0, "LMT\0", "\0"}, + {NULL, 0, -15408, -1567453392LL, 0, "CMT\0", "\0"}, + {NULL, 0, -14400, -1233432000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -14400, -7588800LL, 0, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 938919600LL, 0, "-03\0", "-02\0"}, + {rules_Arg, 29, -14400, 952052400LL, 6, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 0, 0, "-03\0", "-02\0"}, +}; +static const struct lc_timezone_era eras_America_Argentina_Catamarca[] = { + {NULL, 0, -15788, -2372096212LL, 0, "LMT\0", "\0"}, + {NULL, 0, -15408, -1567453392LL, 0, "CMT\0", "\0"}, + {NULL, 0, -14400, -1233432000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -14400, -7588800LL, 0, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 667965600LL, 6, "-03\0", "-02\0"}, + {NULL, 0, -14400, 687931200LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 938919600LL, 0, "-03\0", "-02\0"}, + {rules_Arg, 29, -14400, 952052400LL, 6, "-04\0", "-03\0"}, + {NULL, 0, -10800, 1086058800LL, 0, "-03\0", "\0"}, + {NULL, 0, -14400, 1087704000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 1224298800LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Argentina_Cordoba[] = { + {NULL, 0, -15408, -2372096592LL, 0, "LMT\0", "\0"}, + {NULL, 0, -15408, -1567453392LL, 0, "CMT\0", "\0"}, + {NULL, 0, -14400, -1233432000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -14400, -7588800LL, 0, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 667965600LL, 6, "-03\0", "-02\0"}, + {NULL, 0, -14400, 687931200LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 938919600LL, 0, "-03\0", "-02\0"}, + {rules_Arg, 29, -14400, 952052400LL, 6, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 0, 0, "-03\0", "-02\0"}, +}; +static const struct lc_timezone_era eras_America_Argentina_Jujuy[] = { + {NULL, 0, -15672, -2372096328LL, 0, "LMT\0", "\0"}, + {NULL, 0, -15408, -1567453392LL, 0, "CMT\0", "\0"}, + {NULL, 0, -14400, -1233432000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -14400, -7588800LL, 0, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 636516000LL, 6, "-03\0", "-02\0"}, + {NULL, 0, -14400, 657086400LL, 0, "-04\0", "\0"}, + {rules_100, 1, -14400, 669178800LL, 6, "-03\0", "\0"}, + {NULL, 0, -14400, 686721600LL, 0, "-04\0", "\0"}, + {rules_100, 1, -10800, 694231200LL, 6, "-02\0", "\0"}, + {rules_Arg, 29, -10800, 938919600LL, 0, "-03\0", "-02\0"}, + {rules_Arg, 29, -14400, 952052400LL, 6, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 1224298800LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Argentina_La_Rioja[] = { + {NULL, 0, -16044, -2372095956LL, 0, "LMT\0", "\0"}, + {NULL, 0, -15408, -1567453392LL, 0, "CMT\0", "\0"}, + {NULL, 0, -14400, -1233432000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -14400, -7588800LL, 0, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 667792800LL, 6, "-03\0", "-02\0"}, + {NULL, 0, -14400, 673588800LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 938919600LL, 0, "-03\0", "-02\0"}, + {rules_Arg, 29, -14400, 952052400LL, 6, "-04\0", "-03\0"}, + {NULL, 0, -10800, 1086058800LL, 0, "-03\0", "\0"}, + {NULL, 0, -14400, 1087704000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 1224298800LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Argentina_Mendoza[] = { + {NULL, 0, -16516, -2372095484LL, 0, "LMT\0", "\0"}, + {NULL, 0, -15408, -1567453392LL, 0, "CMT\0", "\0"}, + {NULL, 0, -14400, -1233432000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -14400, -7588800LL, 0, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 636516000LL, 6, "-03\0", "-02\0"}, + {NULL, 0, -14400, 655963200LL, 0, "-04\0", "\0"}, + {rules_100, 1, -14400, 667796400LL, 6, "-03\0", "\0"}, + {NULL, 0, -14400, 687499200LL, 0, "-04\0", "\0"}, + {rules_100, 1, -14400, 699418800LL, 6, "-03\0", "\0"}, + {NULL, 0, -14400, 719380800LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 938919600LL, 0, "-03\0", "-02\0"}, + {rules_Arg, 29, -14400, 952052400LL, 6, "-04\0", "-03\0"}, + {NULL, 0, -10800, 1085281200LL, 0, "-03\0", "\0"}, + {NULL, 0, -14400, 1096171200LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 1224298800LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Argentina_Rio_Gallegos[] = { + {NULL, 0, -16612, -2372095388LL, 0, "LMT\0", "\0"}, + {NULL, 0, -15408, -1567453392LL, 0, "CMT\0", "\0"}, + {NULL, 0, -14400, -1233432000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -14400, -7588800LL, 0, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 938919600LL, 0, "-03\0", "-02\0"}, + {rules_Arg, 29, -14400, 952052400LL, 6, "-04\0", "-03\0"}, + {NULL, 0, -10800, 1086058800LL, 0, "-03\0", "\0"}, + {NULL, 0, -14400, 1087704000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 1224298800LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Argentina_Salta[] = { + {NULL, 0, -15700, -2372096300LL, 0, "LMT\0", "\0"}, + {NULL, 0, -15408, -1567453392LL, 0, "CMT\0", "\0"}, + {NULL, 0, -14400, -1233432000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -14400, -7588800LL, 0, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 667965600LL, 6, "-03\0", "-02\0"}, + {NULL, 0, -14400, 687931200LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 938919600LL, 0, "-03\0", "-02\0"}, + {rules_Arg, 29, -14400, 952052400LL, 6, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 1224298800LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Argentina_San_Juan[] = { + {NULL, 0, -16444, -2372095556LL, 0, "LMT\0", "\0"}, + {NULL, 0, -15408, -1567453392LL, 0, "CMT\0", "\0"}, + {NULL, 0, -14400, -1233432000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -14400, -7588800LL, 0, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 667792800LL, 6, "-03\0", "-02\0"}, + {NULL, 0, -14400, 673588800LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 938919600LL, 0, "-03\0", "-02\0"}, + {rules_Arg, 29, -14400, 952052400LL, 6, "-04\0", "-03\0"}, + {NULL, 0, -10800, 1085972400LL, 0, "-03\0", "\0"}, + {NULL, 0, -14400, 1090728000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 1224298800LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Argentina_San_Luis[] = { + {NULL, 0, -15924, -2372096076LL, 0, "LMT\0", "\0"}, + {NULL, 0, -15408, -1567453392LL, 0, "CMT\0", "\0"}, + {NULL, 0, -14400, -1233432000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -14400, -7588800LL, 0, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 631159200LL, 6, "-03\0", "-02\0"}, + {rules_100, 1, -10800, 637380000LL, 6, "-02\0", "\0"}, + {NULL, 0, -14400, 655963200LL, 0, "-04\0", "\0"}, + {rules_100, 1, -14400, 667796400LL, 6, "-03\0", "\0"}, + {NULL, 0, -14400, 675748800LL, 0, "-04\0", "\0"}, + {NULL, 0, -10800, 938919600LL, 0, "-03\0", "\0"}, + {rules_100, 1, -14400, 952052400LL, 6, "-03\0", "\0"}, + {NULL, 0, -10800, 1085972400LL, 0, "-03\0", "\0"}, + {NULL, 0, -14400, 1090728000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 1200880800LL, 6, "-03\0", "-02\0"}, + {rules_SanLuis, 2, -14400, 1255233600LL, 0, "-04\0", "-03\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Argentina_Tucuman[] = { + {NULL, 0, -15652, -2372096348LL, 0, "LMT\0", "\0"}, + {NULL, 0, -15408, -1567453392LL, 0, "CMT\0", "\0"}, + {NULL, 0, -14400, -1233432000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -14400, -7588800LL, 0, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 667965600LL, 6, "-03\0", "-02\0"}, + {NULL, 0, -14400, 687931200LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 938919600LL, 0, "-03\0", "-02\0"}, + {rules_Arg, 29, -14400, 952052400LL, 6, "-04\0", "-03\0"}, + {NULL, 0, -10800, 1086058800LL, 0, "-03\0", "\0"}, + {NULL, 0, -14400, 1087099200LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 0, 0, "-03\0", "-02\0"}, +}; +static const struct lc_timezone_era eras_America_Argentina_Ushuaia[] = { + {NULL, 0, -16392, -2372095608LL, 0, "LMT\0", "\0"}, + {NULL, 0, -15408, -1567453392LL, 0, "CMT\0", "\0"}, + {NULL, 0, -14400, -1233432000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -14400, -7588800LL, 0, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 938919600LL, 0, "-03\0", "-02\0"}, + {rules_Arg, 29, -14400, 952052400LL, 6, "-04\0", "-03\0"}, + {NULL, 0, -10800, 1085886000LL, 0, "-03\0", "\0"}, + {NULL, 0, -14400, 1087704000LL, 0, "-04\0", "\0"}, + {rules_Arg, 29, -10800, 1224298800LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Asuncion[] = { + {NULL, 0, -13840, -2524507760LL, 0, "LMT\0", "\0"}, + {NULL, 0, -13840, -1206389360LL, 0, "AMT\0", "\0"}, + {NULL, 0, -14400, 86760000LL, 0, "-04\0", "\0"}, + {NULL, 0, -10800, 134017200LL, 0, "-03\0", "\0"}, + {rules_Para, 22, -14400, 0, 0, "-04\0", "-03\0"}, +}; +static const struct lc_timezone_era eras_America_Atikokan[] = { + {NULL, 0, -21988, -2366733212LL, 0, "LMT\0", "\0"}, + {rules_Canada, 10, -21600, -923248800LL, 0, "C%sT\0", "\0"}, + {rules_100, 1, -21600, -880214400LL, 6, "CDT\0", "\0"}, + {rules_Canada, 10, -21600, -765392400LL, 6, "C%sT\0", "\0"}, + {NULL, 0, -18000, 0, 0, "EST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Bahia[] = { + {NULL, 0, -9244, -1767216356LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -10800, 1064372400LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 1318734000LL, 0, "-03\0", "\0"}, + {rules_Brazil, 64, -10800, 1350788400LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Bahia_Banderas[] = { + {NULL, 0, -25260, -1514739600LL, 0, "LMT\0", "\0"}, + {NULL, 0, -25200, -1343066400LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -1234807200LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -1220292000LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -1207159200LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -1191344400LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -873828000LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -661539600LL, 0, "MST\0", "\0"}, + {NULL, 0, -28800, 28800LL, 0, "PST\0", "\0"}, + {rules_Mexico, 14, -25200, 1270371600LL, 0, "M%sT\0", "\0"}, + {rules_Mexico, 14, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Barbados[] = { + {NULL, 0, -14309, -1451678491LL, 0, "LMT\0", "\0"}, + {NULL, 0, -14309, -1199217691LL, 0, "BMT\0", "\0"}, + {rules_Barb, 5, -14400, 0, 0, "A%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Belem[] = { + {NULL, 0, -11636, -1767213964LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -10800, 590036400LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Belize[] = { + {NULL, 0, -21168, -1822500432LL, 0, "LMT\0", "\0"}, + {rules_Belize, 6, -21600, 0, 0, "%s\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Blanc_Sablon[] = { + {NULL, 0, -13708, -2713896692LL, 0, "LMT\0", "\0"}, + {rules_Canada, 10, -14400, 14400LL, 0, "A%sT\0", "\0"}, + {NULL, 0, -14400, 0, 0, "AST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Boa_Vista[] = { + {NULL, 0, -14560, -1767211040LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -14400, 590040000LL, 0, "-04\0", "-03\0"}, + {NULL, 0, -14400, 938664000LL, 0, "-04\0", "\0"}, + {rules_Brazil, 64, -14400, 971578800LL, 6, "-04\0", "-03\0"}, + {NULL, 0, -14400, 0, 0, "-04\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Bogota[] = { + {NULL, 0, -17776, -2707671824LL, 0, "LMT\0", "\0"}, + {NULL, 0, -17776, -1739041424LL, 0, "BMT\0", "\0"}, + {rules_CO, 2, -18000, 0, 0, "-05\0", "-04\0"}, +}; +static const struct lc_timezone_era eras_America_Boise[] = { + {NULL, 0, -27889, -2717640000LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -28800, -1471788000LL, 0, "P%sT\0", "\0"}, + {rules_US, 13, -25200, 126255600LL, 0, "M%sT\0", "\0"}, + {NULL, 0, -25200, 129114000LL, 0, "MST\0", "\0"}, + {rules_US, 13, -25200, 0, 0, "M%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Cambridge_Bay[] = { + {NULL, 0, 0, -1577923200LL, 0, "-00\0", "\0"}, + {rules_NT_YK, 12, -25200, 941356800LL, 6, "M%sT\0", "\0"}, + {rules_Canada, 10, -21600, 972802800LL, 6, "C%sT\0", "\0"}, + {NULL, 0, -18000, 973400400LL, 0, "EST\0", "\0"}, + {NULL, 0, -21600, 986115600LL, 0, "CST\0", "\0"}, + {rules_Canada, 10, -25200, 0, 0, "M%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Campo_Grande[] = { + {NULL, 0, -13108, -1767212492LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -14400, 0, 0, "-04\0", "-03\0"}, +}; +static const struct lc_timezone_era eras_America_Cancun[] = { + {NULL, 0, -20824, -1514743200LL, 0, "LMT\0", "\0"}, + {NULL, 0, -21600, 377935200LL, 0, "CST\0", "\0"}, + {rules_Mexico, 14, -18000, 902037600LL, 6, "E%sT\0", "\0"}, + {rules_Mexico, 14, -21600, 1422777600LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -18000, 0, 0, "EST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Caracas[] = { + {NULL, 0, -16064, -2524505536LL, 0, "LMT\0", "\0"}, + {NULL, 0, -16060, -1826739140LL, 0, "CMT\0", "\0"}, + {NULL, 0, -16200, -157750200LL, 0, "-0430\0", "\0"}, + {NULL, 0, -14400, 1197183600LL, 0, "-04\0", "\0"}, + {NULL, 0, -16200, 1462086000LL, 0, "-0430\0", "\0"}, + {NULL, 0, -14400, 0, 0, "-04\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Cayenne[] = { + {NULL, 0, -12560, -1846269040LL, 0, "LMT\0", "\0"}, + {NULL, 0, -14400, -71092800LL, 0, "-04\0", "\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Chicago[] = { + {NULL, 0, -21036, -2717647200LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -21600, -1577901600LL, 0, "C%sT\0", "\0"}, + {rules_Chicago, 6, -21600, -1067788800LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -18000, -1045414800LL, 0, "EST\0", "\0"}, + {rules_Chicago, 6, -21600, -883591200LL, 0, "C%sT\0", "\0"}, + {rules_US, 13, -21600, -757360800LL, 0, "C%sT\0", "\0"}, + {rules_Chicago, 6, -21600, -94672800LL, 0, "C%sT\0", "\0"}, + {rules_US, 13, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Chihuahua[] = { + {NULL, 0, -25460, -1514739600LL, 0, "LMT\0", "\0"}, + {NULL, 0, -25200, -1343066400LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -1234807200LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -1220292000LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -1207159200LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -1191344400LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, 820476000LL, 0, "CST\0", "\0"}, + {rules_Mexico, 14, -21600, 883634400LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -21600, 891766800LL, 0, "CST\0", "\0"}, + {rules_Mexico, 14, -25200, 0, 0, "M%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Costa_Rica[] = { + {NULL, 0, -20173, -2524501427LL, 0, "LMT\0", "\0"}, + {NULL, 0, -20173, -1545071027LL, 0, "SJMT\0", "\0"}, + {rules_CR, 5, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Creston[] = { + {NULL, 0, -27964, -2713882436LL, 0, "LMT\0", "\0"}, + {NULL, 0, -25200, -1680454800LL, 0, "MST\0", "\0"}, + {NULL, 0, -28800, -1627833600LL, 0, "PST\0", "\0"}, + {NULL, 0, -25200, 0, 0, "MST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Cuiaba[] = { + {NULL, 0, -13460, -1767212140LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -14400, 1064376000LL, 0, "-04\0", "-03\0"}, + {NULL, 0, -14400, 1096603200LL, 0, "-04\0", "\0"}, + {rules_Brazil, 64, -14400, 0, 0, "-04\0", "-03\0"}, +}; +static const struct lc_timezone_era eras_America_Curacao[] = { + {NULL, 0, -16547, -1826738653LL, 0, "LMT\0", "\0"}, + {NULL, 0, -16200, -157750200LL, 0, "-0430\0", "\0"}, + {NULL, 0, -14400, 0, 0, "AST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Danmarkshavn[] = { + {NULL, 0, -4480, -1686091520LL, 0, "LMT\0", "\0"}, + {NULL, 0, -10800, 323845200LL, 0, "-03\0", "\0"}, + {rules_EU, 6, -10800, 820465200LL, 0, "-03\0", "-02\0"}, + {NULL, 0, 0, 0, 0, "GMT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Dawson[] = { + {NULL, 0, -33460, -2188996940LL, 0, "LMT\0", "\0"}, + {rules_NT_YK, 12, -32400, 120646800LL, 0, "Y%sT\0", "\0"}, + {rules_NT_YK, 12, -28800, 315561600LL, 0, "P%sT\0", "\0"}, + {rules_Canada, 10, -28800, 0, 0, "P%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Dawson_Creek[] = { + {NULL, 0, -28856, -2713881544LL, 0, "LMT\0", "\0"}, + {rules_Canada, 10, -28800, -725817600LL, 0, "P%sT\0", "\0"}, + {rules_Vanc, 9, -28800, 84013200LL, 6, "P%sT\0", "\0"}, + {NULL, 0, -25200, 0, 0, "MST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Denver[] = { + {NULL, 0, -25196, -2717643600LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -25200, -1577898000LL, 0, "M%sT\0", "\0"}, + {rules_Denver, 5, -25200, -883587600LL, 0, "M%sT\0", "\0"}, + {rules_US, 13, -25200, -757357200LL, 0, "M%sT\0", "\0"}, + {rules_Denver, 5, -25200, -94669200LL, 0, "M%sT\0", "\0"}, + {rules_US, 13, -25200, 0, 0, "M%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Detroit[] = { + {NULL, 0, -19931, -2051202469LL, 0, "LMT\0", "\0"}, + {NULL, 0, -21600, -1724083200LL, 0, "CST\0", "\0"}, + {NULL, 0, -18000, -883594800LL, 0, "EST\0", "\0"}, + {rules_US, 13, -18000, -757364400LL, 0, "E%sT\0", "\0"}, + {rules_Detroit, 4, -18000, 94712400LL, 0, "E%sT\0", "\0"}, + {rules_US, 13, -18000, 157784400LL, 0, "E%sT\0", "\0"}, + {NULL, 0, -18000, 167814000LL, 0, "EST\0", "\0"}, + {rules_US, 13, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Edmonton[] = { + {NULL, 0, -27232, -1998663968LL, 0, "LMT\0", "\0"}, + {rules_Edm, 17, -25200, 536482800LL, 0, "M%sT\0", "\0"}, + {rules_Canada, 10, -25200, 0, 0, "M%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Eirunepe[] = { + {NULL, 0, -16768, -1767208832LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -18000, 590043600LL, 0, "-05\0", "-04\0"}, + {NULL, 0, -18000, 749192400LL, 0, "-05\0", "\0"}, + {rules_Brazil, 64, -18000, 780210000LL, 0, "-05\0", "-04\0"}, + {NULL, 0, -18000, 1214283600LL, 0, "-05\0", "\0"}, + {NULL, 0, -14400, 1384056000LL, 0, "-04\0", "\0"}, + {NULL, 0, -18000, 0, 0, "-05\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_El_Salvador[] = { + {NULL, 0, -21408, -1546279392LL, 0, "LMT\0", "\0"}, + {rules_Salv, 2, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Fort_Nelson[] = { + {NULL, 0, -29447, -2713880953LL, 0, "LMT\0", "\0"}, + {rules_Vanc, 9, -28800, -757353600LL, 0, "P%sT\0", "\0"}, + {NULL, 0, -28800, -725817600LL, 0, "PST\0", "\0"}, + {rules_Vanc, 9, -28800, 536486400LL, 0, "P%sT\0", "\0"}, + {rules_Canada, 10, -28800, 1425808800LL, 0, "P%sT\0", "\0"}, + {NULL, 0, -25200, 0, 0, "MST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Fortaleza[] = { + {NULL, 0, -9240, -1767216360LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -10800, 653540400LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 938660400LL, 0, "-03\0", "\0"}, + {rules_Brazil, 64, -10800, 972180000LL, 6, "-03\0", "-02\0"}, + {NULL, 0, -10800, 1000350000LL, 0, "-03\0", "\0"}, + {rules_Brazil, 64, -10800, 1033441200LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Glace_Bay[] = { + {NULL, 0, -14388, -2131646412LL, 0, "LMT\0", "\0"}, + {rules_Canada, 10, -14400, -536443200LL, 0, "A%sT\0", "\0"}, + {rules_Halifax, 41, -14400, -504907200LL, 0, "A%sT\0", "\0"}, + {NULL, 0, -14400, 63086400LL, 0, "AST\0", "\0"}, + {rules_Halifax, 41, -14400, 126244800LL, 0, "A%sT\0", "\0"}, + {rules_Canada, 10, -14400, 0, 0, "A%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Godthab[] = { + {NULL, 0, -12416, -1686083584LL, 0, "LMT\0", "\0"}, + {NULL, 0, -10800, 323845200LL, 0, "-03\0", "\0"}, + {rules_EU, 6, -10800, 0, 0, "-03\0", "-02\0"}, +}; +static const struct lc_timezone_era eras_America_Goose_Bay[] = { + {NULL, 0, -14500, -2713895900LL, 0, "LMT\0", "\0"}, + {NULL, 0, -12652, -1640982548LL, 0, "NST\0", "\0"}, + {rules_Canada, 10, -12652, -1609446548LL, 0, "N%sT\0", "\0"}, + {NULL, 0, -12652, -1096921748LL, 0, "NST\0", "\0"}, + {NULL, 0, -12600, -1072989000LL, 0, "NST\0", "\0"}, + {rules_StJohns, 19, -12600, -872368200LL, 0, "N%sT\0", "\0"}, + {rules_Canada, 10, -12600, -757369800LL, 0, "N%sT\0", "\0"}, + {rules_StJohns, 19, -12600, -119903400LL, 0, "N%sT\0", "\0"}, + {rules_StJohns, 19, -14400, 1320116400LL, 6, "A%sT\0", "\0"}, + {rules_Canada, 10, -14400, 0, 0, "A%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Grand_Turk[] = { + {NULL, 0, -17072, -2524504528LL, 0, "LMT\0", "\0"}, + {NULL, 0, -18431, -1827687169LL, 0, "KMT\0", "\0"}, + {NULL, 0, -18000, 284014800LL, 0, "EST\0", "\0"}, + {rules_US, 13, -18000, 1446357600LL, 6, "E%sT\0", "\0"}, + {NULL, 0, -14400, 0, 0, "AST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Guatemala[] = { + {NULL, 0, -21724, -1617040676LL, 0, "LMT\0", "\0"}, + {rules_Guat, 8, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Guayaquil[] = { + {NULL, 0, -19160, -2524502440LL, 0, "LMT\0", "\0"}, + {NULL, 0, -18840, -1230749160LL, 0, "QMT\0", "\0"}, + {rules_Ecuador, 2, -18000, 0, 0, "-05\0", "-04\0"}, +}; +static const struct lc_timezone_era eras_America_Guyana[] = { + {NULL, 0, -13960, -1730578040LL, 0, "LMT\0", "\0"}, + {NULL, 0, -13500, 176010300LL, 0, "-0345\0", "\0"}, + {NULL, 0, -10800, 662698800LL, 0, "-03\0", "\0"}, + {NULL, 0, -14400, 0, 0, "-04\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Halifax[] = { + {NULL, 0, -15264, -2131645536LL, 0, "LMT\0", "\0"}, + {rules_Halifax, 41, -14400, -1640980800LL, 0, "A%sT\0", "\0"}, + {rules_Canada, 10, -14400, -1609444800LL, 0, "A%sT\0", "\0"}, + {rules_Halifax, 41, -14400, -880221600LL, 0, "A%sT\0", "\0"}, + {rules_Canada, 10, -14400, -757368000LL, 0, "A%sT\0", "\0"}, + {rules_Halifax, 41, -14400, 126244800LL, 0, "A%sT\0", "\0"}, + {rules_Canada, 10, -14400, 0, 0, "A%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Havana[] = { + {NULL, 0, -19768, -2524501832LL, 0, "LMT\0", "\0"}, + {NULL, 0, -19776, -1402813824LL, 0, "HMT\0", "\0"}, + {rules_Cuba, 39, -18000, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Hermosillo[] = { + {NULL, 0, -26632, -1514739600LL, 0, "LMT\0", "\0"}, + {NULL, 0, -25200, -1343066400LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -1234807200LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -1220292000LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -1207159200LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -1191344400LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -873828000LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -661539600LL, 0, "MST\0", "\0"}, + {NULL, 0, -28800, 28800LL, 0, "PST\0", "\0"}, + {rules_Mexico, 14, -25200, 915174000LL, 0, "M%sT\0", "\0"}, + {NULL, 0, -25200, 0, 0, "MST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Indiana_Indianapolis[] = { + {NULL, 0, -20678, -2717647200LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -21600, -1577901600LL, 0, "C%sT\0", "\0"}, + {rules_Indianapolis, 3, -21600, -883591200LL, 0, "C%sT\0", "\0"}, + {rules_US, 13, -21600, -757360800LL, 0, "C%sT\0", "\0"}, + {rules_Indianapolis, 3, -21600, -463593600LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -18000, -386787600LL, 0, "EST\0", "\0"}, + {NULL, 0, -21600, -368640000LL, 0, "CST\0", "\0"}, + {NULL, 0, -18000, -31518000LL, 0, "EST\0", "\0"}, + {rules_US, 13, -18000, 31554000LL, 0, "E%sT\0", "\0"}, + {NULL, 0, -18000, 1136091600LL, 0, "EST\0", "\0"}, + {rules_US, 13, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Indiana_Knox[] = { + {NULL, 0, -20790, -2717647200LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -21600, -725824800LL, 0, "C%sT\0", "\0"}, + {rules_Starke, 5, -21600, -242236800LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -18000, -195066000LL, 0, "EST\0", "\0"}, + {rules_US, 13, -21600, 688546800LL, 6, "C%sT\0", "\0"}, + {NULL, 0, -18000, 1143961200LL, 0, "EST\0", "\0"}, + {rules_US, 13, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Indiana_Marengo[] = { + {NULL, 0, -20723, -2717647200LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -21600, -599594400LL, 0, "C%sT\0", "\0"}, + {rules_Marengo, 4, -21600, -273686400LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -18000, -31518000LL, 0, "EST\0", "\0"}, + {rules_US, 13, -18000, 126687600LL, 0, "E%sT\0", "\0"}, + {rules_100, 1, -21600, 152089200LL, 6, "CDT\0", "\0"}, + {rules_US, 13, -18000, 189320400LL, 0, "E%sT\0", "\0"}, + {NULL, 0, -18000, 1136091600LL, 0, "EST\0", "\0"}, + {rules_US, 13, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Indiana_Petersburg[] = { + {NULL, 0, -20947, -2717647200LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -21600, -473364000LL, 0, "C%sT\0", "\0"}, + {rules_Pike, 4, -21600, -147888000LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -18000, -100112400LL, 0, "EST\0", "\0"}, + {rules_US, 13, -21600, 247042800LL, 6, "C%sT\0", "\0"}, + {NULL, 0, -18000, 1143961200LL, 0, "EST\0", "\0"}, + {rules_US, 13, -21600, 1194159600LL, 6, "C%sT\0", "\0"}, + {rules_US, 13, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Indiana_Tell_City[] = { + {NULL, 0, -20823, -2717647200LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -21600, -757360800LL, 0, "C%sT\0", "\0"}, + {rules_Perry, 9, -21600, -179337600LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -18000, -31518000LL, 0, "EST\0", "\0"}, + {rules_US, 13, -18000, 31554000LL, 0, "E%sT\0", "\0"}, + {NULL, 0, -18000, 1143961200LL, 0, "EST\0", "\0"}, + {rules_US, 13, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Indiana_Vevay[] = { + {NULL, 0, -20416, -2717647200LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -21600, -495043200LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -18000, -31518000LL, 0, "EST\0", "\0"}, + {rules_US, 13, -18000, 94712400LL, 0, "E%sT\0", "\0"}, + {NULL, 0, -18000, 1136091600LL, 0, "EST\0", "\0"}, + {rules_US, 13, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Indiana_Vincennes[] = { + {NULL, 0, -21007, -2717647200LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -21600, -757360800LL, 0, "C%sT\0", "\0"}, + {rules_Vincennes, 9, -21600, -179337600LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -18000, -31518000LL, 0, "EST\0", "\0"}, + {rules_US, 13, -18000, 31554000LL, 0, "E%sT\0", "\0"}, + {NULL, 0, -18000, 1143961200LL, 0, "EST\0", "\0"}, + {rules_US, 13, -21600, 1194159600LL, 6, "C%sT\0", "\0"}, + {rules_US, 13, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Indiana_Winamac[] = { + {NULL, 0, -20785, -2717647200LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -21600, -757360800LL, 0, "C%sT\0", "\0"}, + {rules_Pulaski, 4, -21600, -273686400LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -18000, -31518000LL, 0, "EST\0", "\0"}, + {rules_US, 13, -18000, 31554000LL, 0, "E%sT\0", "\0"}, + {NULL, 0, -18000, 1143961200LL, 0, "EST\0", "\0"}, + {rules_US, 13, -21600, 1173600000LL, 0, "C%sT\0", "\0"}, + {rules_US, 13, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Inuvik[] = { + {NULL, 0, 0, -536457600LL, 0, "-00\0", "\0"}, + {rules_NT_YK, 12, -28800, 294228000LL, 0, "P%sT\0", "\0"}, + {rules_NT_YK, 12, -25200, 315558000LL, 0, "M%sT\0", "\0"}, + {rules_Canada, 10, -25200, 0, 0, "M%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Iqaluit[] = { + {NULL, 0, 0, -865296000LL, 0, "-00\0", "\0"}, + {rules_NT_YK, 12, -18000, 941349600LL, 6, "E%sT\0", "\0"}, + {rules_Canada, 10, -21600, 972802800LL, 6, "C%sT\0", "\0"}, + {rules_Canada, 10, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Jamaica[] = { + {NULL, 0, -18431, -2524503169LL, 0, "LMT\0", "\0"}, + {NULL, 0, -18431, -1827687169LL, 0, "KMT\0", "\0"}, + {NULL, 0, -18000, 126248400LL, 0, "EST\0", "\0"}, + {rules_US, 13, -18000, 441781200LL, 0, "E%sT\0", "\0"}, + {NULL, 0, -18000, 0, 0, "EST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Juneau[] = { + {NULL, 0, 54139, -3225366139LL, 0, "LMT\0", "\0"}, + {NULL, 0, -32261, -2188954939LL, 0, "LMT\0", "\0"}, + {NULL, 0, -28800, -883584000LL, 0, "PST\0", "\0"}, + {rules_US, 13, -28800, -757353600LL, 0, "P%sT\0", "\0"}, + {NULL, 0, -28800, -31507200LL, 0, "PST\0", "\0"}, + {rules_US, 13, -28800, 325677600LL, 0, "P%sT\0", "\0"}, + {rules_US, 13, -32400, 341402400LL, 6, "Y%sT\0", "\0"}, + {rules_US, 13, -28800, 436352400LL, 6, "P%sT\0", "\0"}, + {rules_US, 13, -32400, 439030800LL, 0, "Y%sT\0", "\0"}, + {rules_US, 13, -32400, 0, 0, "AK%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Kentucky_Louisville[] = { + {NULL, 0, -20582, -2717647200LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -21600, -1546279200LL, 0, "C%sT\0", "\0"}, + {rules_Louisville, 7, -21600, -883594800LL, 6, "C%sT\0", "\0"}, + {rules_US, 13, -21600, -757360800LL, 0, "C%sT\0", "\0"}, + {rules_Louisville, 7, -21600, -266432400LL, 6, "C%sT\0", "\0"}, + {NULL, 0, -18000, -63140400LL, 0, "EST\0", "\0"}, + {rules_US, 13, -18000, 126687600LL, 0, "E%sT\0", "\0"}, + {rules_100, 1, -21600, 152089200LL, 6, "CDT\0", "\0"}, + {rules_US, 13, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Kentucky_Monticello[] = { + {NULL, 0, -20364, -2717647200LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -21600, -757360800LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -21600, -63136800LL, 0, "CST\0", "\0"}, + {rules_US, 13, -21600, 972802800LL, 6, "C%sT\0", "\0"}, + {rules_US, 13, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_La_Paz[] = { + {NULL, 0, -16356, -2524505244LL, 0, "LMT\0", "\0"}, + {NULL, 0, -16356, -1205954844LL, 0, "CMT\0", "\0"}, + {rules_100, 1, -16356, -1192307244LL, 6, "BOST\0", "\0"}, + {NULL, 0, -14400, 0, 0, "-04\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Lima[] = { + {NULL, 0, -18492, -2524503108LL, 0, "LMT\0", "\0"}, + {NULL, 0, -18516, -1938538284LL, 0, "LMT\0", "\0"}, + {rules_Peru, 10, -18000, 0, 0, "-05\0", "-04\0"}, +}; +static const struct lc_timezone_era eras_America_Los_Angeles[] = { + {NULL, 0, -28378, -2717640000LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -28800, -757353600LL, 0, "P%sT\0", "\0"}, + {rules_CA, 5, -28800, -94665600LL, 0, "P%sT\0", "\0"}, + {rules_US, 13, -28800, 0, 0, "P%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Maceio[] = { + {NULL, 0, -8572, -1767217028LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -10800, 653540400LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 813553200LL, 0, "-03\0", "\0"}, + {rules_Brazil, 64, -10800, 841806000LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 938660400LL, 0, "-03\0", "\0"}, + {rules_Brazil, 64, -10800, 972180000LL, 6, "-03\0", "-02\0"}, + {NULL, 0, -10800, 1000350000LL, 0, "-03\0", "\0"}, + {rules_Brazil, 64, -10800, 1033441200LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Managua[] = { + {NULL, 0, -20708, -2524500892LL, 0, "LMT\0", "\0"}, + {NULL, 0, -20712, -1121105688LL, 0, "MMT\0", "\0"}, + {NULL, 0, -21600, 105084000LL, 0, "CST\0", "\0"}, + {NULL, 0, -18000, 161758800LL, 0, "EST\0", "\0"}, + {rules_Nic, 6, -21600, 694260000LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -18000, 717310800LL, 0, "EST\0", "\0"}, + {NULL, 0, -21600, 725868000LL, 0, "CST\0", "\0"}, + {NULL, 0, -18000, 852094800LL, 0, "EST\0", "\0"}, + {rules_Nic, 6, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Manaus[] = { + {NULL, 0, -14404, -1767211196LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -14400, 590040000LL, 0, "-04\0", "-03\0"}, + {NULL, 0, -14400, 749188800LL, 0, "-04\0", "\0"}, + {rules_Brazil, 64, -14400, 780206400LL, 0, "-04\0", "-03\0"}, + {NULL, 0, -14400, 0, 0, "-04\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Martinique[] = { + {NULL, 0, -14660, -2524506940LL, 0, "LMT\0", "\0"}, + {NULL, 0, -14660, -1851537340LL, 0, "FFMT\0", "\0"}, + {NULL, 0, -14400, 323841600LL, 0, "AST\0", "\0"}, + {rules_100, 1, -14400, 338958000LL, 6, "ADT\0", "\0"}, + {NULL, 0, -14400, 0, 0, "AST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Matamoros[] = { + {NULL, 0, -24000, -1514743200LL, 0, "LMT\0", "\0"}, + {NULL, 0, -21600, 568015200LL, 0, "CST\0", "\0"}, + {rules_US, 13, -21600, 599637600LL, 0, "C%sT\0", "\0"}, + {rules_Mexico, 14, -21600, 1262325600LL, 0, "C%sT\0", "\0"}, + {rules_US, 13, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Mazatlan[] = { + {NULL, 0, -25540, -1514739600LL, 0, "LMT\0", "\0"}, + {NULL, 0, -25200, -1343066400LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -1234807200LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -1220292000LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -1207159200LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -1191344400LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -873828000LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -661539600LL, 0, "MST\0", "\0"}, + {NULL, 0, -28800, 28800LL, 0, "PST\0", "\0"}, + {rules_Mexico, 14, -25200, 0, 0, "M%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Menominee[] = { + {NULL, 0, -21027, -2659759773LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -21600, -757360800LL, 0, "C%sT\0", "\0"}, + {rules_Menominee, 4, -21600, -21484800LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -18000, 104914800LL, 0, "EST\0", "\0"}, + {rules_US, 13, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Merida[] = { + {NULL, 0, -21508, -1514743200LL, 0, "LMT\0", "\0"}, + {NULL, 0, -21600, 377935200LL, 0, "CST\0", "\0"}, + {NULL, 0, -18000, 407653200LL, 0, "EST\0", "\0"}, + {rules_Mexico, 14, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Metlakatla[] = { + {NULL, 0, 54822, -3225366822LL, 0, "LMT\0", "\0"}, + {NULL, 0, -31578, -2188955622LL, 0, "LMT\0", "\0"}, + {NULL, 0, -28800, -883584000LL, 0, "PST\0", "\0"}, + {rules_US, 13, -28800, -757353600LL, 0, "P%sT\0", "\0"}, + {NULL, 0, -28800, -31507200LL, 0, "PST\0", "\0"}, + {rules_US, 13, -28800, 436352400LL, 6, "P%sT\0", "\0"}, + {NULL, 0, -28800, 1446372000LL, 0, "PST\0", "\0"}, + {rules_US, 13, -32400, 0, 0, "AK%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Mexico_City[] = { + {NULL, 0, -23796, -1514739600LL, 0, "LMT\0", "\0"}, + {NULL, 0, -25200, -1343066400LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -1234807200LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -1220292000LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -1207159200LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -1191344400LL, 0, "MST\0", "\0"}, + {rules_Mexico, 14, -21600, 1001833200LL, 6, "C%sT\0", "\0"}, + {NULL, 0, -21600, 1014184800LL, 0, "CST\0", "\0"}, + {rules_Mexico, 14, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Miquelon[] = { + {NULL, 0, -13480, -1850328920LL, 0, "LMT\0", "\0"}, + {NULL, 0, -14400, 326001600LL, 0, "AST\0", "\0"}, + {NULL, 0, -10800, 536468400LL, 0, "-03\0", "\0"}, + {rules_Canada, 10, -10800, 0, 0, "-03\0", "-02\0"}, +}; +static const struct lc_timezone_era eras_America_Moncton[] = { + {NULL, 0, -15548, -2715882052LL, 0, "LMT\0", "\0"}, + {NULL, 0, -18000, -2131642800LL, 0, "EST\0", "\0"}, + {rules_Canada, 10, -14400, -1167595200LL, 0, "A%sT\0", "\0"}, + {rules_Moncton, 13, -14400, -883598400LL, 0, "A%sT\0", "\0"}, + {rules_Canada, 10, -14400, -757368000LL, 0, "A%sT\0", "\0"}, + {rules_Moncton, 13, -14400, 94708800LL, 0, "A%sT\0", "\0"}, + {rules_Canada, 10, -14400, 725860800LL, 0, "A%sT\0", "\0"}, + {rules_Moncton, 13, -14400, 1167624000LL, 0, "A%sT\0", "\0"}, + {rules_Canada, 10, -14400, 0, 0, "A%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Monterrey[] = { + {NULL, 0, -24076, -1514743200LL, 0, "LMT\0", "\0"}, + {NULL, 0, -21600, 568015200LL, 0, "CST\0", "\0"}, + {rules_US, 13, -21600, 599637600LL, 0, "C%sT\0", "\0"}, + {rules_Mexico, 14, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Montevideo[] = { + {NULL, 0, -13484, -2256668116LL, 0, "LMT\0", "\0"}, + {NULL, 0, -13484, -1567455316LL, 0, "MMT\0", "\0"}, + {rules_Uruguay, 45, -12600, -853619400LL, 0, "-0330\0", "-03\0"}, + {rules_Uruguay, 45, -10800, -63147600LL, 0, "-03\0", "-02\0"}, + {rules_Uruguay, 45, -10800, 31546800LL, 0, "-03\0", "-0230\0"}, + {rules_Uruguay, 45, -10800, 126237600LL, 6, "-03\0", "-02\0"}, + {rules_Uruguay, 45, -10800, 156911400LL, 3, "-03\0", "-0230\0"}, + {rules_Uruguay, 45, -10800, 0, 0, "-03\0", "-02\0"}, +}; +static const struct lc_timezone_era eras_America_Nassau[] = { + {NULL, 0, -18570, -1825095030LL, 0, "LMT\0", "\0"}, + {rules_Bahamas, 2, -18000, 189320400LL, 0, "E%sT\0", "\0"}, + {rules_US, 13, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_New_York[] = { + {NULL, 0, -17762, -2717650800LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -18000, -1577905200LL, 0, "E%sT\0", "\0"}, + {rules_NYC, 5, -18000, -883594800LL, 0, "E%sT\0", "\0"}, + {rules_US, 13, -18000, -757364400LL, 0, "E%sT\0", "\0"}, + {rules_NYC, 5, -18000, -94676400LL, 0, "E%sT\0", "\0"}, + {rules_US, 13, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Nipigon[] = { + {NULL, 0, -21184, -2366734016LL, 0, "LMT\0", "\0"}, + {rules_Canada, 10, -18000, -923252400LL, 0, "E%sT\0", "\0"}, + {rules_100, 1, -18000, -880218000LL, 6, "EDT\0", "\0"}, + {rules_Canada, 10, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Nome[] = { + {NULL, 0, 46701, -3225358701LL, 0, "LMT\0", "\0"}, + {NULL, 0, -39698, -2188947502LL, 0, "LMT\0", "\0"}, + {NULL, 0, -39600, -883573200LL, 0, "NST\0", "\0"}, + {rules_US, 13, -39600, -757342800LL, 0, "N%sT\0", "\0"}, + {NULL, 0, -39600, -86878800LL, 0, "NST\0", "\0"}, + {NULL, 0, -39600, -31496400LL, 0, "BST\0", "\0"}, + {rules_US, 13, -39600, 436363200LL, 6, "B%sT\0", "\0"}, + {rules_US, 13, -32400, 439030800LL, 0, "Y%sT\0", "\0"}, + {rules_US, 13, -32400, 0, 0, "AK%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Noronha[] = { + {NULL, 0, -7780, -1767217820LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -7200, 653536800LL, 0, "-02\0", "-01\0"}, + {NULL, 0, -7200, 938656800LL, 0, "-02\0", "\0"}, + {rules_Brazil, 64, -7200, 971571600LL, 6, "-02\0", "-01\0"}, + {NULL, 0, -7200, 1000346400LL, 0, "-02\0", "\0"}, + {rules_Brazil, 64, -7200, 1033437600LL, 0, "-02\0", "-01\0"}, + {NULL, 0, -7200, 0, 0, "-02\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_North_Dakota_Beulah[] = { + {NULL, 0, -24427, -2717643600LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -25200, 1289116800LL, 6, "M%sT\0", "\0"}, + {rules_US, 13, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_North_Dakota_Center[] = { + {NULL, 0, -24312, -2717643600LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -25200, 720000000LL, 6, "M%sT\0", "\0"}, + {rules_US, 13, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_North_Dakota_New_Salem[] = { + {NULL, 0, -24339, -2717643600LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -25200, 1067155200LL, 6, "M%sT\0", "\0"}, + {rules_US, 13, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Ojinaga[] = { + {NULL, 0, -25060, -1514739600LL, 0, "LMT\0", "\0"}, + {NULL, 0, -25200, -1343066400LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -1234807200LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -1220292000LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, -1207159200LL, 0, "CST\0", "\0"}, + {NULL, 0, -25200, -1191344400LL, 0, "MST\0", "\0"}, + {NULL, 0, -21600, 820476000LL, 0, "CST\0", "\0"}, + {rules_Mexico, 14, -21600, 883634400LL, 0, "C%sT\0", "\0"}, + {NULL, 0, -21600, 891766800LL, 0, "CST\0", "\0"}, + {rules_Mexico, 14, -25200, 1262329200LL, 0, "M%sT\0", "\0"}, + {rules_US, 13, -25200, 0, 0, "M%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Panama[] = { + {NULL, 0, -19088, -2524502512LL, 0, "LMT\0", "\0"}, + {NULL, 0, -19176, -1946918424LL, 0, "CMT\0", "\0"}, + {NULL, 0, -18000, 0, 0, "EST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Pangnirtung[] = { + {NULL, 0, 0, -1546300800LL, 0, "-00\0", "\0"}, + {rules_NT_YK, 12, -14400, 796802400LL, 0, "A%sT\0", "\0"}, + {rules_Canada, 10, -18000, 941349600LL, 6, "E%sT\0", "\0"}, + {rules_Canada, 10, -21600, 972802800LL, 6, "C%sT\0", "\0"}, + {rules_Canada, 10, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Paramaribo[] = { + {NULL, 0, -13240, -1861906760LL, 0, "LMT\0", "\0"}, + {NULL, 0, -13252, -1104524348LL, 0, "PMT\0", "\0"}, + {NULL, 0, -13236, -765317964LL, 0, "PMT\0", "\0"}, + {NULL, 0, -12600, 465449400LL, 0, "-0330\0", "\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Phoenix[] = { + {NULL, 0, -26898, -2717643600LL, 0, "LMT\0", "\0"}, + {rules_US, 13, -25200, -820519140LL, 6, "M%sT\0", "\0"}, + {NULL, 0, -25200, -812653140LL, 0, "MST\0", "\0"}, + {rules_US, 13, -25200, -796845540LL, 6, "M%sT\0", "\0"}, + {NULL, 0, -25200, -94669200LL, 0, "MST\0", "\0"}, + {rules_US, 13, -25200, -56221200LL, 0, "M%sT\0", "\0"}, + {NULL, 0, -25200, 0, 0, "MST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Port_au_Prince[] = { + {NULL, 0, -17360, -2524504240LL, 0, "LMT\0", "\0"}, + {NULL, 0, -17340, -1670483460LL, 0, "PPMT\0", "\0"}, + {rules_Haiti, 11, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Port_of_Spain[] = { + {NULL, 0, -14764, -1825098836LL, 0, "LMT\0", "\0"}, + {NULL, 0, -14400, 0, 0, "AST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Porto_Velho[] = { + {NULL, 0, -15336, -1767210264LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -14400, 590040000LL, 0, "-04\0", "-03\0"}, + {NULL, 0, -14400, 0, 0, "-04\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Puerto_Rico[] = { + {NULL, 0, -15865, -2233035335LL, 0, "LMT\0", "\0"}, + {NULL, 0, -14400, -873057600LL, 0, "AST\0", "\0"}, + {rules_US, 13, -14400, -757368000LL, 0, "A%sT\0", "\0"}, + {NULL, 0, -14400, 0, 0, "AST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Punta_Arenas[] = { + {NULL, 0, -17020, -2524504580LL, 0, "LMT\0", "\0"}, + {NULL, 0, -16966, -1892661434LL, 0, "SMT\0", "\0"}, + {NULL, 0, -18000, -1688410800LL, 0, "-05\0", "\0"}, + {NULL, 0, -16966, -1619205434LL, 0, "SMT\0", "\0"}, + {NULL, 0, -14400, -1593806400LL, 0, "-04\0", "\0"}, + {NULL, 0, -16966, -1335986234LL, 0, "SMT\0", "\0"}, + {rules_Chile, 32, -18000, -1178132400LL, 0, "-05\0", "-04\0"}, + {NULL, 0, -14400, -870552000LL, 0, "-04\0", "\0"}, + {NULL, 0, -18000, -865278000LL, 0, "-05\0", "\0"}, + {NULL, 0, -14400, -718056000LL, 0, "-04\0", "\0"}, + {NULL, 0, -18000, -713649600LL, 0, "-05\0", "\0"}, + {rules_Chile, 32, -14400, 1480820400LL, 6, "-04\0", "-03\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Rainy_River[] = { + {NULL, 0, -22696, -2366732504LL, 0, "LMT\0", "\0"}, + {rules_Canada, 10, -21600, -923248800LL, 0, "C%sT\0", "\0"}, + {rules_100, 1, -21600, -880214400LL, 6, "CDT\0", "\0"}, + {rules_Canada, 10, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Rankin_Inlet[] = { + {NULL, 0, 0, -410227200LL, 0, "-00\0", "\0"}, + {rules_NT_YK, 12, -21600, 972802800LL, 6, "C%sT\0", "\0"}, + {NULL, 0, -18000, 986112000LL, 0, "EST\0", "\0"}, + {rules_Canada, 10, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Recife[] = { + {NULL, 0, -8376, -1767217224LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -10800, 653540400LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 938660400LL, 0, "-03\0", "\0"}, + {rules_Brazil, 64, -10800, 971575200LL, 6, "-03\0", "-02\0"}, + {NULL, 0, -10800, 1000350000LL, 0, "-03\0", "\0"}, + {rules_Brazil, 64, -10800, 1033441200LL, 0, "-03\0", "-02\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Regina[] = { + {NULL, 0, -25116, -2030202084LL, 0, "LMT\0", "\0"}, + {rules_Regina, 17, -25200, -305737200LL, 0, "M%sT\0", "\0"}, + {NULL, 0, -21600, 0, 0, "CST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Resolute[] = { + {NULL, 0, 0, -704937600LL, 0, "-00\0", "\0"}, + {rules_NT_YK, 12, -21600, 972802800LL, 6, "C%sT\0", "\0"}, + {NULL, 0, -18000, 986112000LL, 0, "EST\0", "\0"}, + {rules_Canada, 10, -21600, 1162105200LL, 6, "C%sT\0", "\0"}, + {NULL, 0, -18000, 1173600000LL, 0, "EST\0", "\0"}, + {rules_Canada, 10, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Rio_Branco[] = { + {NULL, 0, -16272, -1767209328LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -18000, 590043600LL, 0, "-05\0", "-04\0"}, + {NULL, 0, -18000, 1214283600LL, 0, "-05\0", "\0"}, + {NULL, 0, -14400, 1384056000LL, 0, "-04\0", "\0"}, + {NULL, 0, -18000, 0, 0, "-05\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Santarem[] = { + {NULL, 0, -13128, -1767212472LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -14400, 590040000LL, 0, "-04\0", "-03\0"}, + {NULL, 0, -14400, 1214280000LL, 0, "-04\0", "\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Santiago[] = { + {NULL, 0, -16966, -2524504634LL, 0, "LMT\0", "\0"}, + {NULL, 0, -16966, -1892661434LL, 0, "SMT\0", "\0"}, + {NULL, 0, -18000, -1688410800LL, 0, "-05\0", "\0"}, + {NULL, 0, -16966, -1619205434LL, 0, "SMT\0", "\0"}, + {NULL, 0, -14400, -1593806400LL, 0, "-04\0", "\0"}, + {NULL, 0, -16966, -1335986234LL, 0, "SMT\0", "\0"}, + {rules_Chile, 32, -18000, -1178132400LL, 0, "-05\0", "-04\0"}, + {NULL, 0, -14400, -870552000LL, 0, "-04\0", "\0"}, + {NULL, 0, -18000, -865278000LL, 0, "-05\0", "\0"}, + {NULL, 0, -14400, -740520000LL, 0, "-04\0", "\0"}, + {rules_100, 1, -14400, -736376400LL, 6, "-03\0", "\0"}, + {NULL, 0, -14400, -718056000LL, 0, "-04\0", "\0"}, + {NULL, 0, -18000, -713649600LL, 0, "-05\0", "\0"}, + {rules_Chile, 32, -14400, 0, 6, "-04\0", "-03\0"}, +}; +static const struct lc_timezone_era eras_America_Santo_Domingo[] = { + {NULL, 0, -16776, -2524504824LL, 0, "LMT\0", "\0"}, + {NULL, 0, -16800, -1159773600LL, 0, "SDMT\0", "\0"}, + {rules_DR, 6, -18000, 152082000LL, 0, "%s\0", "\0"}, + {NULL, 0, -14400, 972799200LL, 0, "AST\0", "\0"}, + {rules_US, 13, -18000, 975823200LL, 0, "E%sT\0", "\0"}, + {NULL, 0, -14400, 0, 0, "AST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Sao_Paulo[] = { + {NULL, 0, -11188, -1767214412LL, 0, "LMT\0", "\0"}, + {rules_Brazil, 64, -10800, -195426000LL, 0, "-03\0", "-02\0"}, + {rules_100, 1, -10800, -189381600LL, 6, "-02\0", "\0"}, + {rules_Brazil, 64, -10800, 0, 0, "-03\0", "-02\0"}, +}; +static const struct lc_timezone_era eras_America_Scoresbysund[] = { + {NULL, 0, -5272, -1686090728LL, 0, "LMT\0", "\0"}, + {NULL, 0, -7200, 323841600LL, 0, "-02\0", "\0"}, + {rules_C_Eur, 17, -7200, 354679200LL, 0, "-02\0", "-01\0"}, + {rules_EU, 6, -3600, 0, 0, "-01\0", "+00\0"}, +}; +static const struct lc_timezone_era eras_America_Sitka[] = { + {NULL, 0, 53927, -3225365927LL, 0, "LMT\0", "\0"}, + {NULL, 0, -32473, -2188954727LL, 0, "LMT\0", "\0"}, + {NULL, 0, -28800, -883584000LL, 0, "PST\0", "\0"}, + {rules_US, 13, -28800, -757353600LL, 0, "P%sT\0", "\0"}, + {NULL, 0, -28800, -31507200LL, 0, "PST\0", "\0"}, + {rules_US, 13, -28800, 436352400LL, 6, "P%sT\0", "\0"}, + {rules_US, 13, -32400, 439030800LL, 0, "Y%sT\0", "\0"}, + {rules_US, 13, -32400, 0, 0, "AK%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_St_Johns[] = { + {NULL, 0, -12652, -2713897748LL, 0, "LMT\0", "\0"}, + {rules_StJohns, 19, -12652, -1640982548LL, 0, "N%sT\0", "\0"}, + {rules_Canada, 10, -12652, -1609446548LL, 0, "N%sT\0", "\0"}, + {rules_StJohns, 19, -12652, -1096921748LL, 0, "N%sT\0", "\0"}, + {rules_StJohns, 19, -12600, -872368200LL, 0, "N%sT\0", "\0"}, + {rules_Canada, 10, -12600, -757369800LL, 0, "N%sT\0", "\0"}, + {rules_StJohns, 19, -12600, 1320114600LL, 6, "N%sT\0", "\0"}, + {rules_Canada, 10, -12600, 0, 0, "N%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Swift_Current[] = { + {NULL, 0, -25880, -2030201320LL, 0, "LMT\0", "\0"}, + {rules_Canada, 10, -25200, -747241200LL, 0, "M%sT\0", "\0"}, + {rules_Regina, 17, -25200, -631126800LL, 0, "M%sT\0", "\0"}, + {rules_Swift, 5, -25200, 73472400LL, 0, "M%sT\0", "\0"}, + {NULL, 0, -21600, 0, 0, "CST\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Tegucigalpa[] = { + {NULL, 0, -20932, -1538503868LL, 0, "LMT\0", "\0"}, + {rules_Hond, 4, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Thule[] = { + {NULL, 0, -16508, -1686079492LL, 0, "LMT\0", "\0"}, + {rules_Thule, 6, -14400, 0, 0, "A%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Thunder_Bay[] = { + {NULL, 0, -21420, -2366733780LL, 0, "LMT\0", "\0"}, + {NULL, 0, -21600, -1893434400LL, 0, "CST\0", "\0"}, + {NULL, 0, -18000, -883594800LL, 0, "EST\0", "\0"}, + {rules_Canada, 10, -18000, 18000LL, 0, "E%sT\0", "\0"}, + {rules_Toronto, 24, -18000, 94712400LL, 0, "E%sT\0", "\0"}, + {NULL, 0, -18000, 126248400LL, 0, "EST\0", "\0"}, + {rules_Canada, 10, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Tijuana[] = { + {NULL, 0, -28084, -1514736000LL, 0, "LMT\0", "\0"}, + {NULL, 0, -25200, -1451667600LL, 0, "MST\0", "\0"}, + {NULL, 0, -28800, -1343062800LL, 0, "PST\0", "\0"}, + {NULL, 0, -25200, -1234803600LL, 0, "MST\0", "\0"}, + {NULL, 0, -28800, -1222963200LL, 0, "PST\0", "\0"}, + {rules_100, 1, -28800, -1207242000LL, 6, "PDT\0", "\0"}, + {NULL, 0, -28800, -873820800LL, 0, "PST\0", "\0"}, + {rules_100, 1, -28800, -769395600LL, 6, "PWT\0", "\0"}, + {rules_100, 1, -28800, -761677200LL, 6, "PPT\0", "\0"}, + {NULL, 0, -28800, -686073600LL, 0, "PST\0", "\0"}, + {rules_100, 1, -28800, -661539600LL, 6, "PDT\0", "\0"}, + {NULL, 0, -28800, -504892800LL, 0, "PST\0", "\0"}, + {rules_CA, 5, -28800, -283968000LL, 0, "P%sT\0", "\0"}, + {NULL, 0, -28800, 189331200LL, 0, "PST\0", "\0"}, + {rules_US, 13, -28800, 820483200LL, 0, "P%sT\0", "\0"}, + {rules_Mexico, 14, -28800, 978336000LL, 0, "P%sT\0", "\0"}, + {rules_US, 13, -28800, 1014192000LL, 0, "P%sT\0", "\0"}, + {rules_Mexico, 14, -28800, 1262332800LL, 0, "P%sT\0", "\0"}, + {rules_US, 13, -28800, 0, 0, "P%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Toronto[] = { + {NULL, 0, -19052, -2366736148LL, 0, "LMT\0", "\0"}, + {rules_Canada, 10, -18000, -1609441200LL, 0, "E%sT\0", "\0"}, + {rules_Toronto, 24, -18000, -880218000LL, 6, "E%sT\0", "\0"}, + {rules_Canada, 10, -18000, -757364400LL, 0, "E%sT\0", "\0"}, + {rules_Toronto, 24, -18000, 126248400LL, 0, "E%sT\0", "\0"}, + {rules_Canada, 10, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Vancouver[] = { + {NULL, 0, -29548, -2713880852LL, 0, "LMT\0", "\0"}, + {rules_Vanc, 9, -28800, 536486400LL, 0, "P%sT\0", "\0"}, + {rules_Canada, 10, -28800, 0, 0, "P%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Whitehorse[] = { + {NULL, 0, -32412, -2188997988LL, 0, "LMT\0", "\0"}, + {rules_NT_YK, 12, -32400, -81961200LL, 0, "Y%sT\0", "\0"}, + {rules_NT_YK, 12, -28800, 315561600LL, 0, "P%sT\0", "\0"}, + {rules_Canada, 10, -28800, 0, 0, "P%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Winnipeg[] = { + {NULL, 0, -23316, -2602258284LL, 0, "LMT\0", "\0"}, + {rules_Winn, 24, -21600, 1136095200LL, 0, "C%sT\0", "\0"}, + {rules_Canada, 10, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Yakutat[] = { + {NULL, 0, 52865, -3225364865LL, 0, "LMT\0", "\0"}, + {NULL, 0, -33535, -2188953665LL, 0, "LMT\0", "\0"}, + {NULL, 0, -32400, -883580400LL, 0, "YST\0", "\0"}, + {rules_US, 13, -32400, -757350000LL, 0, "Y%sT\0", "\0"}, + {NULL, 0, -32400, -31503600LL, 0, "YST\0", "\0"}, + {rules_US, 13, -32400, 439030800LL, 0, "Y%sT\0", "\0"}, + {rules_US, 13, -32400, 0, 0, "AK%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_America_Yellowknife[] = { + {NULL, 0, 0, -1104537600LL, 0, "-00\0", "\0"}, + {rules_NT_YK, 12, -25200, 315558000LL, 0, "M%sT\0", "\0"}, + {rules_Canada, 10, -25200, 0, 0, "M%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Antarctica_Casey[] = { + {NULL, 0, 0, -31536000LL, 0, "-00\0", "\0"}, + {NULL, 0, 28800, 1255802400LL, 0, "+08\0", "\0"}, + {NULL, 0, 39600, 1267714800LL, 0, "+11\0", "\0"}, + {NULL, 0, 28800, 1319738400LL, 0, "+08\0", "\0"}, + {NULL, 0, 39600, 1329843600LL, 0, "+11\0", "\0"}, + {NULL, 0, 28800, 1477065600LL, 0, "+08\0", "\0"}, + {NULL, 0, 39600, 0, 0, "+11\0", "\0"}, +}; +static const struct lc_timezone_era eras_Antarctica_Davis[] = { + {NULL, 0, 0, -409190400LL, 0, "-00\0", "\0"}, + {NULL, 0, 25200, -163062000LL, 0, "+07\0", "\0"}, + {NULL, 0, 0, -28857600LL, 0, "-00\0", "\0"}, + {NULL, 0, 25200, 1255806000LL, 0, "+07\0", "\0"}, + {NULL, 0, 18000, 1268251200LL, 0, "+05\0", "\0"}, + {NULL, 0, 25200, 1319742000LL, 0, "+07\0", "\0"}, + {NULL, 0, 18000, 1329854400LL, 0, "+05\0", "\0"}, + {NULL, 0, 25200, 0, 0, "+07\0", "\0"}, +}; +static const struct lc_timezone_era eras_Antarctica_DumontDUrville[] = { + {NULL, 0, 0, -725846400LL, 0, "-00\0", "\0"}, + {NULL, 0, 36000, -566992800LL, 0, "+10\0", "\0"}, + {NULL, 0, 0, -415497600LL, 0, "-00\0", "\0"}, + {NULL, 0, 36000, 0, 0, "+10\0", "\0"}, +}; +static const struct lc_timezone_era eras_Antarctica_Macquarie[] = { + {NULL, 0, 0, -2214259200LL, 0, "-00\0", "\0"}, + {NULL, 0, 36000, -1680508800LL, 0, "AEST\0", "\0"}, + {rules_100, 1, 36000, -1669892400LL, 6, "AEDT\0", "\0"}, + {rules_Aus, 7, 36000, -1601719200LL, 0, "AE%sT\0", "\0"}, + {NULL, 0, 0, -687052800LL, 0, "-00\0", "\0"}, + {rules_Aus, 7, 36000, -94730400LL, 0, "AE%sT\0", "\0"}, + {rules_AT, 19, 36000, 1270310400LL, 6, "AE%sT\0", "\0"}, + {NULL, 0, 39600, 0, 0, "+11\0", "\0"}, +}; +static const struct lc_timezone_era eras_Antarctica_Mawson[] = { + {NULL, 0, 0, -501206400LL, 0, "-00\0", "\0"}, + {NULL, 0, 21600, 1255809600LL, 0, "+06\0", "\0"}, + {NULL, 0, 18000, 0, 0, "+05\0", "\0"}, +}; +static const struct lc_timezone_era eras_Antarctica_Palmer[] = { + {NULL, 0, 0, -157766400LL, 0, "-00\0", "\0"}, + {rules_Arg, 29, -14400, -7588800LL, 0, "-04\0", "-03\0"}, + {rules_Arg, 29, -10800, 389070000LL, 0, "-03\0", "-02\0"}, + {rules_Chile, 32, -14400, 1480820400LL, 6, "-04\0", "-03\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_Antarctica_Rothera[] = { + {NULL, 0, 0, 218246400LL, 0, "-00\0", "\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_Antarctica_Syowa[] = { + {NULL, 0, 0, -407808000LL, 0, "-00\0", "\0"}, + {NULL, 0, 10800, 0, 0, "+03\0", "\0"}, +}; +static const struct lc_timezone_era eras_Antarctica_Troll[] = { + {NULL, 0, 0, 1108166400LL, 0, "-00\0", "\0"}, + {rules_Troll, 2, 0, 0, 0, "%s\0", "\0"}, +}; +static const struct lc_timezone_era eras_Antarctica_Vostok[] = { + {NULL, 0, 0, -380073600LL, 0, "-00\0", "\0"}, + {NULL, 0, 21600, 0, 0, "+06\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Almaty[] = { + {NULL, 0, 18468, -1441170468LL, 0, "LMT\0", "\0"}, + {NULL, 0, 18000, -1247547600LL, 0, "+05\0", "\0"}, + {rules_RussiaAsia, 5, 21600, 670363200LL, 0, "+06\0", "+07\0"}, + {rules_RussiaAsia, 5, 18000, 695768400LL, 0, "+05\0", "+06\0"}, + {rules_RussiaAsia, 5, 21600, 1099166400LL, 6, "+06\0", "+07\0"}, + {NULL, 0, 21600, 0, 0, "+06\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Amman[] = { + {NULL, 0, 8624, -1230776624LL, 0, "LMT\0", "\0"}, + {rules_Jordan, 31, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Anadyr[] = { + {NULL, 0, 42596, -1441194596LL, 0, "LMT\0", "\0"}, + {NULL, 0, 43200, -1247572800LL, 0, "+12\0", "\0"}, + {rules_Russia, 16, 46800, 386420400LL, 0, "+13\0", "+14\0"}, + {rules_Russia, 16, 43200, 670341600LL, 0, "+12\0", "+13\0"}, + {rules_Russia, 16, 39600, 695746800LL, 0, "+11\0", "+12\0"}, + {rules_Russia, 16, 43200, 1269698400LL, 0, "+12\0", "+13\0"}, + {rules_Russia, 16, 39600, 1301151600LL, 0, "+11\0", "+12\0"}, + {NULL, 0, 43200, 0, 0, "+12\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Aqtau[] = { + {NULL, 0, 12064, -1441164064LL, 0, "LMT\0", "\0"}, + {NULL, 0, 14400, -1247544000LL, 0, "+04\0", "\0"}, + {NULL, 0, 18000, 370724400LL, 0, "+05\0", "\0"}, + {NULL, 0, 21600, 386445600LL, 0, "+06\0", "\0"}, + {rules_RussiaAsia, 5, 18000, 670366800LL, 0, "+05\0", "+06\0"}, + {rules_RussiaAsia, 5, 14400, 695772000LL, 0, "+04\0", "+05\0"}, + {rules_RussiaAsia, 5, 18000, 780440400LL, 6, "+05\0", "+06\0"}, + {rules_RussiaAsia, 5, 14400, 1099173600LL, 6, "+04\0", "+05\0"}, + {NULL, 0, 18000, 0, 0, "+05\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Aqtobe[] = { + {NULL, 0, 13720, -1441165720LL, 0, "LMT\0", "\0"}, + {NULL, 0, 14400, -1247544000LL, 0, "+04\0", "\0"}, + {NULL, 0, 18000, 354913200LL, 0, "+05\0", "\0"}, + {rules_100, 1, 18000, 370720800LL, 6, "+06\0", "\0"}, + {NULL, 0, 21600, 386445600LL, 0, "+06\0", "\0"}, + {rules_RussiaAsia, 5, 18000, 670366800LL, 0, "+05\0", "+06\0"}, + {rules_RussiaAsia, 5, 14400, 695772000LL, 0, "+04\0", "+05\0"}, + {rules_RussiaAsia, 5, 18000, 1099170000LL, 6, "+05\0", "+06\0"}, + {NULL, 0, 18000, 0, 0, "+05\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Ashgabat[] = { + {NULL, 0, 14012, -1441166012LL, 0, "LMT\0", "\0"}, + {NULL, 0, 14400, -1247544000LL, 0, "+04\0", "\0"}, + {rules_RussiaAsia, 5, 18000, 670366800LL, 0, "+05\0", "+06\0"}, + {rules_RussiaAsia, 5, 14400, 695772000LL, 0, "+04\0", "+05\0"}, + {NULL, 0, 18000, 0, 0, "+05\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Atyrau[] = { + {NULL, 0, 12464, -1441164464LL, 0, "LMT\0", "\0"}, + {NULL, 0, 10800, -1247540400LL, 0, "+03\0", "\0"}, + {NULL, 0, 18000, 370724400LL, 0, "+05\0", "\0"}, + {NULL, 0, 21600, 386445600LL, 0, "+06\0", "\0"}, + {rules_RussiaAsia, 5, 18000, 670366800LL, 0, "+05\0", "+06\0"}, + {rules_RussiaAsia, 5, 14400, 695772000LL, 0, "+04\0", "+05\0"}, + {rules_RussiaAsia, 5, 18000, 922568400LL, 0, "+05\0", "+06\0"}, + {rules_RussiaAsia, 5, 14400, 1099173600LL, 6, "+04\0", "+05\0"}, + {NULL, 0, 18000, 0, 0, "+05\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Baghdad[] = { + {NULL, 0, 10660, -2524532260LL, 0, "LMT\0", "\0"}, + {NULL, 0, 10656, -1641005856LL, 0, "BMT\0", "\0"}, + {NULL, 0, 10800, 389048400LL, 0, "+03\0", "\0"}, + {rules_Iraq, 8, 10800, 0, 0, "+03\0", "+04\0"}, +}; +static const struct lc_timezone_era eras_Asia_Baku[] = { + {NULL, 0, 11964, -1441163964LL, 0, "LMT\0", "\0"}, + {NULL, 0, 10800, -405140400LL, 0, "+03\0", "\0"}, + {rules_RussiaAsia, 5, 14400, 670370400LL, 0, "+04\0", "+05\0"}, + {rules_RussiaAsia, 5, 10800, 717548400LL, 6, "+03\0", "+04\0"}, + {NULL, 0, 14400, 820440000LL, 0, "+04\0", "\0"}, + {rules_EUAsia, 3, 14400, 852062400LL, 0, "+04\0", "+05\0"}, + {rules_Azer, 2, 14400, 0, 0, "+04\0", "+05\0"}, +}; +static const struct lc_timezone_era eras_Asia_Bangkok[] = { + {NULL, 0, 24124, -2840164924LL, 0, "LMT\0", "\0"}, + {NULL, 0, 24124, -1570084924LL, 0, "BMT\0", "\0"}, + {NULL, 0, 25200, 0, 0, "+07\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Barnaul[] = { + {NULL, 0, 20100, -1579844100LL, 0, "LMT\0", "\0"}, + {NULL, 0, 21600, -1247551200LL, 0, "+06\0", "\0"}, + {rules_Russia, 16, 25200, 670359600LL, 0, "+07\0", "+08\0"}, + {rules_Russia, 16, 21600, 695764800LL, 0, "+06\0", "+07\0"}, + {rules_Russia, 16, 25200, 801590400LL, 6, "+07\0", "+08\0"}, + {rules_Russia, 16, 21600, 1301169600LL, 0, "+06\0", "+07\0"}, + {NULL, 0, 25200, 1414263600LL, 0, "+07\0", "\0"}, + {NULL, 0, 21600, 1459022400LL, 0, "+06\0", "\0"}, + {NULL, 0, 25200, 0, 0, "+07\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Beirut[] = { + {NULL, 0, 8520, -2840149320LL, 0, "LMT\0", "\0"}, + {rules_Lebanon, 24, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Bishkek[] = { + {NULL, 0, 17904, -1441169904LL, 0, "LMT\0", "\0"}, + {NULL, 0, 18000, -1247547600LL, 0, "+05\0", "\0"}, + {rules_RussiaAsia, 5, 21600, 670363200LL, 0, "+06\0", "+07\0"}, + {rules_RussiaAsia, 5, 18000, 683582400LL, 6, "+05\0", "+06\0"}, + {rules_Kyrgyz, 4, 18000, 1123783200LL, 6, "+05\0", "+06\0"}, + {NULL, 0, 21600, 0, 0, "+06\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Brunei[] = { + {NULL, 0, 27580, -1383464380LL, 0, "LMT\0", "\0"}, + {NULL, 0, 27000, -1167636600LL, 0, "+0730\0", "\0"}, + {NULL, 0, 28800, 0, 0, "+08\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Chita[] = { + {NULL, 0, 27232, -1579419232LL, 0, "LMT\0", "\0"}, + {NULL, 0, 28800, -1247558400LL, 0, "+08\0", "\0"}, + {rules_Russia, 16, 32400, 670352400LL, 0, "+09\0", "+10\0"}, + {rules_Russia, 16, 28800, 695757600LL, 0, "+08\0", "+09\0"}, + {rules_Russia, 16, 32400, 1301158800LL, 0, "+09\0", "+10\0"}, + {NULL, 0, 36000, 1414252800LL, 0, "+10\0", "\0"}, + {NULL, 0, 28800, 1459015200LL, 0, "+08\0", "\0"}, + {NULL, 0, 32400, 0, 0, "+09\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Choibalsan[] = { + {NULL, 0, 27480, -2032933080LL, 0, "LMT\0", "\0"}, + {NULL, 0, 25200, 252435600LL, 0, "+07\0", "\0"}, + {NULL, 0, 28800, 417974400LL, 0, "+08\0", "\0"}, + {rules_Mongol, 9, 32400, 1206889200LL, 0, "+09\0", "+10\0"}, + {rules_Mongol, 9, 28800, 0, 0, "+08\0", "+09\0"}, +}; +static const struct lc_timezone_era eras_Asia_Colombo[] = { + {NULL, 0, 19164, -2840159964LL, 0, "LMT\0", "\0"}, + {NULL, 0, 19172, -2019705572LL, 0, "MMT\0", "\0"}, + {NULL, 0, 19800, -883287000LL, 0, "+0530\0", "\0"}, + {rules_030, 1, 19800, -862639200LL, 3, "+06\0", "\0"}, + {rules_100, 1, 19800, -764051400LL, 6, "+0630\0", "\0"}, + {NULL, 0, 19800, 832962600LL, 0, "+0530\0", "\0"}, + {NULL, 0, 23400, 846266400LL, 0, "+0630\0", "\0"}, + {NULL, 0, 21600, 1145039400LL, 0, "+06\0", "\0"}, + {NULL, 0, 19800, 0, 0, "+0530\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Damascus[] = { + {NULL, 0, 8712, -1577931912LL, 0, "LMT\0", "\0"}, + {rules_Syria, 41, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Dhaka[] = { + {NULL, 0, 21700, -2524543300LL, 0, "LMT\0", "\0"}, + {NULL, 0, 21200, -891582800LL, 0, "HMT\0", "\0"}, + {NULL, 0, 23400, -872058600LL, 0, "+0630\0", "\0"}, + {NULL, 0, 19800, -862637400LL, 0, "+0530\0", "\0"}, + {NULL, 0, 23400, -576138600LL, 0, "+0630\0", "\0"}, + {NULL, 0, 21600, 1230746400LL, 0, "+06\0", "\0"}, + {rules_Dhaka, 2, 21600, 0, 0, "+06\0", "+07\0"}, +}; +static const struct lc_timezone_era eras_Asia_Dili[] = { + {NULL, 0, 30140, -1830414140LL, 0, "LMT\0", "\0"}, + {NULL, 0, 28800, -879152400LL, 0, "+08\0", "\0"}, + {NULL, 0, 32400, 199897200LL, 0, "+09\0", "\0"}, + {NULL, 0, 28800, 969120000LL, 0, "+08\0", "\0"}, + {NULL, 0, 32400, 0, 0, "+09\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Dubai[] = { + {NULL, 0, 13272, -1577936472LL, 0, "LMT\0", "\0"}, + {NULL, 0, 14400, 0, 0, "+04\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Dushanbe[] = { + {NULL, 0, 16512, -1441168512LL, 0, "LMT\0", "\0"}, + {NULL, 0, 18000, -1247547600LL, 0, "+05\0", "\0"}, + {rules_RussiaAsia, 5, 21600, 670363200LL, 0, "+06\0", "+07\0"}, + {rules_100, 1, 18000, 684363600LL, 6, "+05\0", "+06\0"}, + {NULL, 0, 18000, 0, 0, "+05\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Famagusta[] = { + {NULL, 0, 8148, -1518920148LL, 0, "LMT\0", "\0"}, + {rules_Cyprus, 9, 7200, 904597200LL, 6, "EE%sT\0", "\0"}, + {rules_EUAsia, 3, 7200, 1473282000LL, 6, "EE%sT\0", "\0"}, + {NULL, 0, 10800, 0, 0, "+03\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Gaza[] = { + {NULL, 0, 8272, -2185409872LL, 0, "LMT\0", "\0"}, + {rules_Zion, 86, 7200, -682653600LL, 0, "EET\0", "EEST\0"}, + {rules_EgyptAsia, 6, 7200, -81313200LL, 6, "EE%sT\0", "\0"}, + {rules_Zion, 86, 7200, 820447200LL, 0, "I%sT\0", "\0"}, + {rules_Jordan, 31, 7200, 915141600LL, 0, "EE%sT\0", "\0"}, + {rules_Palestine, 23, 7200, 1219957200LL, 6, "EE%sT\0", "\0"}, + {NULL, 0, 7200, 1220220000LL, 0, "EET\0", "\0"}, + {rules_Palestine, 23, 7200, 1262296800LL, 0, "EE%sT\0", "\0"}, + {NULL, 0, 7200, 1269640860LL, 0, "EET\0", "\0"}, + {rules_Palestine, 23, 7200, 1312146000LL, 6, "EE%sT\0", "\0"}, + {NULL, 0, 7200, 1325368800LL, 0, "EET\0", "\0"}, + {rules_Palestine, 23, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Hebron[] = { + {NULL, 0, 8423, -2185410023LL, 0, "LMT\0", "\0"}, + {rules_Zion, 86, 7200, -682653600LL, 0, "EET\0", "EEST\0"}, + {rules_EgyptAsia, 6, 7200, -81313200LL, 6, "EE%sT\0", "\0"}, + {rules_Zion, 86, 7200, 820447200LL, 0, "I%sT\0", "\0"}, + {rules_Jordan, 31, 7200, 915141600LL, 0, "EE%sT\0", "\0"}, + {rules_Palestine, 23, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Ho_Chi_Minh[] = { + {NULL, 0, 25600, -2004073600LL, 0, "LMT\0", "\0"}, + {NULL, 0, 25590, -1851577590LL, 0, "PLMT\0", "\0"}, + {NULL, 0, 25200, -852105600LL, 0, "+07\0", "\0"}, + {NULL, 0, 28800, -782643600LL, 0, "+08\0", "\0"}, + {NULL, 0, 32400, -767869200LL, 0, "+09\0", "\0"}, + {NULL, 0, 25200, -718095600LL, 0, "+07\0", "\0"}, + {NULL, 0, 28800, -457776000LL, 0, "+08\0", "\0"}, + {NULL, 0, 25200, -315648000LL, 0, "+07\0", "\0"}, + {NULL, 0, 28800, 171820800LL, 0, "+08\0", "\0"}, + {NULL, 0, 25200, 0, 0, "+07\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Hong_Kong[] = { + {NULL, 0, 27402, -2056693002LL, 0, "LMT\0", "\0"}, + {rules_HK, 19, 28800, -884246400LL, 0, "HK%sT\0", "\0"}, + {NULL, 0, 32400, -766746000LL, 0, "JST\0", "\0"}, + {rules_HK, 19, 28800, 0, 0, "HK%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Hovd[] = { + {NULL, 0, 21996, -2032927596LL, 0, "LMT\0", "\0"}, + {NULL, 0, 21600, 252439200LL, 0, "+06\0", "\0"}, + {rules_Mongol, 9, 25200, 0, 0, "+07\0", "+08\0"}, +}; +static const struct lc_timezone_era eras_Asia_Irkutsk[] = { + {NULL, 0, 25025, -2840165825LL, 0, "LMT\0", "\0"}, + {NULL, 0, 25025, -1575874625LL, 0, "IMT\0", "\0"}, + {NULL, 0, 25200, -1247554800LL, 0, "+07\0", "\0"}, + {rules_Russia, 16, 28800, 670356000LL, 0, "+08\0", "+09\0"}, + {rules_Russia, 16, 25200, 695761200LL, 0, "+07\0", "+08\0"}, + {rules_Russia, 16, 28800, 1301162400LL, 0, "+08\0", "+09\0"}, + {NULL, 0, 32400, 1414256400LL, 0, "+09\0", "\0"}, + {NULL, 0, 28800, 0, 0, "+08\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Jakarta[] = { + {NULL, 0, 25632, -3231299232LL, 0, "LMT\0", "\0"}, + {NULL, 0, 25632, -1451719200LL, 0, "BMT\0", "\0"}, + {NULL, 0, 26400, -1172906400LL, 0, "+0720\0", "\0"}, + {NULL, 0, 27000, -876641400LL, 0, "+0730\0", "\0"}, + {NULL, 0, 32400, -766054800LL, 0, "+09\0", "\0"}, + {NULL, 0, 27000, -683883000LL, 0, "+0730\0", "\0"}, + {NULL, 0, 28800, -620812800LL, 0, "+08\0", "\0"}, + {NULL, 0, 27000, -189415800LL, 0, "+0730\0", "\0"}, + {NULL, 0, 25200, 0, 0, "WIB\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Jayapura[] = { + {NULL, 0, 33768, -1172913768LL, 0, "LMT\0", "\0"}, + {NULL, 0, 32400, -799491600LL, 0, "+09\0", "\0"}, + {NULL, 0, 34200, -189423000LL, 0, "+0930\0", "\0"}, + {NULL, 0, 32400, 0, 0, "WIT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Jerusalem[] = { + {NULL, 0, 8454, -2840149254LL, 0, "LMT\0", "\0"}, + {NULL, 0, 8440, -1641003640LL, 0, "JMT\0", "\0"}, + {rules_Zion, 86, 7200, 0, 0, "I%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Kabul[] = { + {NULL, 0, 16608, -2524538208LL, 0, "LMT\0", "\0"}, + {NULL, 0, 14400, -788932800LL, 0, "+04\0", "\0"}, + {NULL, 0, 16200, 0, 0, "+0430\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Kamchatka[] = { + {NULL, 0, 38076, -1487759676LL, 0, "LMT\0", "\0"}, + {NULL, 0, 39600, -1247569200LL, 0, "+11\0", "\0"}, + {rules_Russia, 16, 43200, 670341600LL, 0, "+12\0", "+13\0"}, + {rules_Russia, 16, 39600, 695746800LL, 0, "+11\0", "+12\0"}, + {rules_Russia, 16, 43200, 1269698400LL, 0, "+12\0", "+13\0"}, + {rules_Russia, 16, 39600, 1301151600LL, 0, "+11\0", "+12\0"}, + {NULL, 0, 43200, 0, 0, "+12\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Karachi[] = { + {NULL, 0, 16092, -1988166492LL, 0, "LMT\0", "\0"}, + {NULL, 0, 19800, -862637400LL, 0, "+0530\0", "\0"}, + {rules_100, 1, 19800, -764145000LL, 6, "+0630\0", "\0"}, + {NULL, 0, 19800, -576135000LL, 0, "+0530\0", "\0"}, + {NULL, 0, 18000, 38775600LL, 0, "+05\0", "\0"}, + {rules_Pakistan, 5, 18000, 0, 0, "PK%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Kathmandu[] = { + {NULL, 0, 20476, -1577943676LL, 0, "LMT\0", "\0"}, + {NULL, 0, 19800, 504901800LL, 0, "+0530\0", "\0"}, + {NULL, 0, 20700, 0, 0, "+0545\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Khandyga[] = { + {NULL, 0, 32533, -1579424533LL, 0, "LMT\0", "\0"}, + {NULL, 0, 28800, -1247558400LL, 0, "+08\0", "\0"}, + {rules_Russia, 16, 32400, 670352400LL, 0, "+09\0", "+10\0"}, + {rules_Russia, 16, 28800, 695757600LL, 0, "+08\0", "+09\0"}, + {rules_Russia, 16, 32400, 1072882800LL, 0, "+09\0", "+10\0"}, + {rules_Russia, 16, 36000, 1301155200LL, 0, "+10\0", "+11\0"}, + {NULL, 0, 39600, 1315832400LL, 0, "+11\0", "\0"}, + {NULL, 0, 36000, 1414252800LL, 0, "+10\0", "\0"}, + {NULL, 0, 32400, 0, 0, "+09\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Kolkata[] = { + {NULL, 0, 21208, -2840162008LL, 0, "LMT\0", "\0"}, + {NULL, 0, 21200, -891582800LL, 0, "HMT\0", "\0"}, + {NULL, 0, 23400, -872058600LL, 0, "+0630\0", "\0"}, + {NULL, 0, 19800, -862637400LL, 0, "IST\0", "\0"}, + {rules_100, 1, 19800, -764145000LL, 6, "+0630\0", "\0"}, + {NULL, 0, 19800, 0, 0, "IST\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Krasnoyarsk[] = { + {NULL, 0, 22286, -1577513486LL, 0, "LMT\0", "\0"}, + {NULL, 0, 21600, -1247551200LL, 0, "+06\0", "\0"}, + {rules_Russia, 16, 25200, 670359600LL, 0, "+07\0", "+08\0"}, + {rules_Russia, 16, 21600, 695764800LL, 0, "+06\0", "+07\0"}, + {rules_Russia, 16, 25200, 1301166000LL, 0, "+07\0", "+08\0"}, + {NULL, 0, 28800, 1414260000LL, 0, "+08\0", "\0"}, + {NULL, 0, 25200, 0, 0, "+07\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Kuala_Lumpur[] = { + {NULL, 0, 24406, -2177477206LL, 0, "LMT\0", "\0"}, + {NULL, 0, 24925, -2038200925LL, 0, "SMT\0", "\0"}, + {NULL, 0, 25200, -1167634800LL, 0, "+07\0", "\0"}, + {rules_020, 1, 25200, -1073028000LL, 2, "+0720\0", "\0"}, + {NULL, 0, 26400, -894180000LL, 0, "+0720\0", "\0"}, + {NULL, 0, 27000, -879665400LL, 0, "+0730\0", "\0"}, + {NULL, 0, 32400, -767005200LL, 0, "+09\0", "\0"}, + {NULL, 0, 27000, 378664200LL, 0, "+0730\0", "\0"}, + {NULL, 0, 28800, 0, 0, "+08\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Kuching[] = { + {NULL, 0, 26480, -1383463280LL, 0, "LMT\0", "\0"}, + {NULL, 0, 27000, -1167636600LL, 0, "+0730\0", "\0"}, + {rules_NBorneo, 2, 28800, -879667200LL, 0, "+08\0", "+0820\0"}, + {NULL, 0, 32400, -767005200LL, 0, "+09\0", "\0"}, + {NULL, 0, 28800, 0, 0, "+08\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Macau[] = { + {NULL, 0, 27260, -1830411260LL, 0, "LMT\0", "\0"}, + {rules_Macau, 14, 28800, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Magadan[] = { + {NULL, 0, 36192, -1441188192LL, 0, "LMT\0", "\0"}, + {NULL, 0, 36000, -1247565600LL, 0, "+10\0", "\0"}, + {rules_Russia, 16, 39600, 670345200LL, 0, "+11\0", "+12\0"}, + {rules_Russia, 16, 36000, 695750400LL, 0, "+10\0", "+11\0"}, + {rules_Russia, 16, 39600, 1301151600LL, 0, "+11\0", "+12\0"}, + {NULL, 0, 43200, 1414245600LL, 0, "+12\0", "\0"}, + {NULL, 0, 36000, 1461427200LL, 0, "+10\0", "\0"}, + {NULL, 0, 39600, 0, 0, "+11\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Makassar[] = { + {NULL, 0, 28656, -1577951856LL, 0, "LMT\0", "\0"}, + {NULL, 0, 28656, -1172908656LL, 0, "MMT\0", "\0"}, + {NULL, 0, 28800, -880272000LL, 0, "+08\0", "\0"}, + {NULL, 0, 32400, -766054800LL, 0, "+09\0", "\0"}, + {NULL, 0, 28800, 0, 0, "WITA\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Manila[] = { + {NULL, 0, -57360, -3944621040LL, 0, "LMT\0", "\0"}, + {NULL, 0, 29040, -2229321840LL, 0, "LMT\0", "\0"}, + {rules_Phil, 6, 28800, -873273600LL, 0, "+08\0", "+09\0"}, + {NULL, 0, 32400, -794221200LL, 0, "+09\0", "\0"}, + {rules_Phil, 6, 28800, 0, 0, "+08\0", "+09\0"}, +}; +static const struct lc_timezone_era eras_Asia_Nicosia[] = { + {NULL, 0, 8008, -1518920008LL, 0, "LMT\0", "\0"}, + {rules_Cyprus, 9, 7200, 904597200LL, 6, "EE%sT\0", "\0"}, + {rules_EUAsia, 3, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Novokuznetsk[] = { + {NULL, 0, 20928, -1441259328LL, 0, "LMT\0", "\0"}, + {NULL, 0, 21600, -1247551200LL, 0, "+06\0", "\0"}, + {rules_Russia, 16, 25200, 670359600LL, 0, "+07\0", "+08\0"}, + {rules_Russia, 16, 21600, 695764800LL, 0, "+06\0", "+07\0"}, + {rules_Russia, 16, 25200, 1269716400LL, 0, "+07\0", "+08\0"}, + {rules_Russia, 16, 21600, 1301169600LL, 0, "+06\0", "+07\0"}, + {NULL, 0, 25200, 0, 0, "+07\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Novosibirsk[] = { + {NULL, 0, 19900, -1579476700LL, 0, "LMT\0", "\0"}, + {NULL, 0, 21600, -1247551200LL, 0, "+06\0", "\0"}, + {rules_Russia, 16, 25200, 670359600LL, 0, "+07\0", "+08\0"}, + {rules_Russia, 16, 21600, 695764800LL, 0, "+06\0", "+07\0"}, + {rules_Russia, 16, 25200, 738086400LL, 6, "+07\0", "+08\0"}, + {rules_Russia, 16, 21600, 1301169600LL, 0, "+06\0", "+07\0"}, + {NULL, 0, 25200, 1414263600LL, 0, "+07\0", "\0"}, + {NULL, 0, 21600, 1469304000LL, 0, "+06\0", "\0"}, + {NULL, 0, 25200, 0, 0, "+07\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Omsk[] = { + {NULL, 0, 17610, -1582088010LL, 0, "LMT\0", "\0"}, + {NULL, 0, 18000, -1247547600LL, 0, "+05\0", "\0"}, + {rules_Russia, 16, 21600, 670363200LL, 0, "+06\0", "+07\0"}, + {rules_Russia, 16, 18000, 695768400LL, 0, "+05\0", "+06\0"}, + {rules_Russia, 16, 21600, 1301169600LL, 0, "+06\0", "+07\0"}, + {NULL, 0, 25200, 1414263600LL, 0, "+07\0", "\0"}, + {NULL, 0, 21600, 0, 0, "+06\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Oral[] = { + {NULL, 0, 12324, -1441164324LL, 0, "LMT\0", "\0"}, + {NULL, 0, 10800, -1247540400LL, 0, "+03\0", "\0"}, + {NULL, 0, 18000, 354913200LL, 0, "+05\0", "\0"}, + {rules_100, 1, 18000, 370720800LL, 6, "+06\0", "\0"}, + {NULL, 0, 21600, 386445600LL, 0, "+06\0", "\0"}, + {rules_RussiaAsia, 5, 18000, 606862800LL, 0, "+05\0", "+06\0"}, + {rules_RussiaAsia, 5, 14400, 695772000LL, 0, "+04\0", "+05\0"}, + {rules_RussiaAsia, 5, 18000, 701816400LL, 0, "+05\0", "+06\0"}, + {rules_RussiaAsia, 5, 14400, 1099173600LL, 6, "+04\0", "+05\0"}, + {NULL, 0, 18000, 0, 0, "+05\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Pontianak[] = { + {NULL, 0, 26240, -1946186240LL, 0, "LMT\0", "\0"}, + {NULL, 0, 26240, -1172906240LL, 0, "PMT\0", "\0"}, + {NULL, 0, 27000, -881220600LL, 0, "+0730\0", "\0"}, + {NULL, 0, 32400, -766054800LL, 0, "+09\0", "\0"}, + {NULL, 0, 27000, -683883000LL, 0, "+0730\0", "\0"}, + {NULL, 0, 28800, -620812800LL, 0, "+08\0", "\0"}, + {NULL, 0, 27000, -189415800LL, 0, "+0730\0", "\0"}, + {NULL, 0, 28800, 567964800LL, 0, "WITA\0", "\0"}, + {NULL, 0, 25200, 0, 0, "WIB\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Pyongyang[] = { + {NULL, 0, 30180, -1948782180LL, 0, "LMT\0", "\0"}, + {NULL, 0, 30600, -1830414600LL, 0, "KST\0", "\0"}, + {NULL, 0, 32400, -768646800LL, 0, "JST\0", "\0"}, + {NULL, 0, 32400, 1439564400LL, 0, "KST\0", "\0"}, + {NULL, 0, 30600, 0, 0, "KST\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Qatar[] = { + {NULL, 0, 12368, -1577935568LL, 0, "LMT\0", "\0"}, + {NULL, 0, 14400, 76190400LL, 0, "+04\0", "\0"}, + {NULL, 0, 10800, 0, 0, "+03\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Qyzylorda[] = { + {NULL, 0, 15712, -1441167712LL, 0, "LMT\0", "\0"}, + {NULL, 0, 14400, -1247544000LL, 0, "+04\0", "\0"}, + {NULL, 0, 18000, 354913200LL, 0, "+05\0", "\0"}, + {rules_100, 1, 18000, 370720800LL, 6, "+06\0", "\0"}, + {NULL, 0, 21600, 386445600LL, 0, "+06\0", "\0"}, + {rules_RussiaAsia, 5, 18000, 670366800LL, 0, "+05\0", "+06\0"}, + {rules_RussiaAsia, 5, 14400, 686095200LL, 6, "+04\0", "+05\0"}, + {rules_RussiaAsia, 5, 18000, 695768400LL, 0, "+05\0", "+06\0"}, + {rules_RussiaAsia, 5, 21600, 701812800LL, 0, "+06\0", "+07\0"}, + {rules_RussiaAsia, 5, 18000, 1099170000LL, 6, "+05\0", "+06\0"}, + {NULL, 0, 21600, 0, 0, "+06\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Riyadh[] = { + {NULL, 0, 11212, -719636812LL, 0, "LMT\0", "\0"}, + {NULL, 0, 10800, 0, 0, "+03\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Sakhalin[] = { + {NULL, 0, 34248, -2031039048LL, 0, "LMT\0", "\0"}, + {NULL, 0, 32400, -768560400LL, 0, "+09\0", "\0"}, + {rules_Russia, 16, 39600, 670345200LL, 0, "+11\0", "+12\0"}, + {rules_Russia, 16, 36000, 695750400LL, 0, "+10\0", "+11\0"}, + {rules_Russia, 16, 39600, 859647600LL, 0, "+11\0", "+12\0"}, + {rules_Russia, 16, 36000, 1301155200LL, 0, "+10\0", "+11\0"}, + {NULL, 0, 39600, 1414249200LL, 0, "+11\0", "\0"}, + {NULL, 0, 36000, 1459008000LL, 0, "+10\0", "\0"}, + {NULL, 0, 39600, 0, 0, "+11\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Samarkand[] = { + {NULL, 0, 16073, -1441168073LL, 0, "LMT\0", "\0"}, + {NULL, 0, 14400, -1247544000LL, 0, "+04\0", "\0"}, + {NULL, 0, 18000, 354913200LL, 0, "+05\0", "\0"}, + {rules_100, 1, 18000, 370720800LL, 6, "+06\0", "\0"}, + {NULL, 0, 21600, 386445600LL, 0, "+06\0", "\0"}, + {rules_RussiaAsia, 5, 18000, 694206000LL, 0, "+05\0", "+06\0"}, + {NULL, 0, 18000, 0, 0, "+05\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Seoul[] = { + {NULL, 0, 30472, -1948782472LL, 0, "LMT\0", "\0"}, + {NULL, 0, 30600, -1830414600LL, 0, "KST\0", "\0"}, + {NULL, 0, 32400, -767350800LL, 0, "JST\0", "\0"}, + {NULL, 0, 32400, -498128400LL, 0, "KST\0", "\0"}, + {rules_ROK, 14, 30600, -264933000LL, 0, "K%sT\0", "\0"}, + {rules_ROK, 14, 32400, 0, 0, "K%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Shanghai[] = { + {NULL, 0, 29143, -2177481943LL, 0, "LMT\0", "\0"}, + {rules_Shang, 3, 28800, -662716800LL, 0, "C%sT\0", "\0"}, + {rules_PRC, 3, 28800, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Singapore[] = { + {NULL, 0, 24925, -2177477725LL, 0, "LMT\0", "\0"}, + {NULL, 0, 24925, -2038200925LL, 0, "SMT\0", "\0"}, + {NULL, 0, 25200, -1167634800LL, 0, "+07\0", "\0"}, + {rules_020, 1, 25200, -1073028000LL, 2, "+0720\0", "\0"}, + {NULL, 0, 26400, -894180000LL, 0, "+0720\0", "\0"}, + {NULL, 0, 27000, -879665400LL, 0, "+0730\0", "\0"}, + {NULL, 0, 32400, -767005200LL, 0, "+09\0", "\0"}, + {NULL, 0, 27000, 378664200LL, 0, "+0730\0", "\0"}, + {NULL, 0, 28800, 0, 0, "+08\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Srednekolymsk[] = { + {NULL, 0, 36892, -1441188892LL, 0, "LMT\0", "\0"}, + {NULL, 0, 36000, -1247565600LL, 0, "+10\0", "\0"}, + {rules_Russia, 16, 39600, 670345200LL, 0, "+11\0", "+12\0"}, + {rules_Russia, 16, 36000, 695750400LL, 0, "+10\0", "+11\0"}, + {rules_Russia, 16, 39600, 1301151600LL, 0, "+11\0", "+12\0"}, + {NULL, 0, 43200, 1414245600LL, 0, "+12\0", "\0"}, + {NULL, 0, 39600, 0, 0, "+11\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Taipei[] = { + {NULL, 0, 29160, -2335248360LL, 0, "LMT\0", "\0"}, + {NULL, 0, 28800, -1017820800LL, 0, "CST\0", "\0"}, + {NULL, 0, 32400, -766224000LL, 0, "JST\0", "\0"}, + {rules_Taiwan, 15, 28800, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Tashkent[] = { + {NULL, 0, 16631, -1441168631LL, 0, "LMT\0", "\0"}, + {NULL, 0, 18000, -1247547600LL, 0, "+05\0", "\0"}, + {rules_RussiaAsia, 5, 21600, 670363200LL, 0, "+06\0", "+07\0"}, + {rules_RussiaAsia, 5, 18000, 694206000LL, 0, "+05\0", "+06\0"}, + {NULL, 0, 18000, 0, 0, "+05\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Tbilisi[] = { + {NULL, 0, 10751, -2840151551LL, 0, "LMT\0", "\0"}, + {NULL, 0, 10751, -1441162751LL, 0, "TBMT\0", "\0"}, + {NULL, 0, 10800, -405140400LL, 0, "+03\0", "\0"}, + {rules_RussiaAsia, 5, 14400, 670370400LL, 0, "+04\0", "+05\0"}, + {rules_RussiaAsia, 5, 10800, 694213200LL, 0, "+03\0", "+04\0"}, + {rules_E_EurAsia, 3, 10800, 780436800LL, 6, "+03\0", "+04\0"}, + {rules_E_EurAsia, 3, 14400, 846356400LL, 6, "+04\0", "+05\0"}, + {rules_100, 1, 14400, 859662000LL, 6, "+05\0", "\0"}, + {rules_E_EurAsia, 3, 14400, 1088276400LL, 6, "+04\0", "+05\0"}, + {rules_RussiaAsia, 5, 10800, 1111878000LL, 0, "+03\0", "+04\0"}, + {NULL, 0, 14400, 0, 0, "+04\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Tehran[] = { + {NULL, 0, 12344, -1704165944LL, 0, "LMT\0", "\0"}, + {NULL, 0, 12344, -757394744LL, 0, "TMT\0", "\0"}, + {NULL, 0, 12600, 247177800LL, 0, "+0330\0", "\0"}, + {rules_Iran, 49, 14400, 283982400LL, 0, "+04\0", "+05\0"}, + {rules_Iran, 49, 12600, 0, 0, "+0330\0", "+0430\0"}, +}; +static const struct lc_timezone_era eras_Asia_Thimphu[] = { + {NULL, 0, 21516, -706341516LL, 0, "LMT\0", "\0"}, + {NULL, 0, 19800, 560025000LL, 0, "+0530\0", "\0"}, + {NULL, 0, 21600, 0, 0, "+06\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Tokyo[] = { + {NULL, 0, 33539, -2587712400LL, 0, "LMT\0", "\0"}, + {rules_Japan, 4, 32400, 0, 0, "J%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Tomsk[] = { + {NULL, 0, 20391, -1578807591LL, 0, "LMT\0", "\0"}, + {NULL, 0, 21600, -1247551200LL, 0, "+06\0", "\0"}, + {rules_Russia, 16, 25200, 670359600LL, 0, "+07\0", "+08\0"}, + {rules_Russia, 16, 21600, 695764800LL, 0, "+06\0", "+07\0"}, + {rules_Russia, 16, 25200, 1020193200LL, 6, "+07\0", "+08\0"}, + {rules_Russia, 16, 21600, 1301169600LL, 0, "+06\0", "+07\0"}, + {NULL, 0, 25200, 1414263600LL, 0, "+07\0", "\0"}, + {NULL, 0, 21600, 1464465600LL, 0, "+06\0", "\0"}, + {NULL, 0, 25200, 0, 0, "+07\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Ulaanbaatar[] = { + {NULL, 0, 25652, -2032931252LL, 0, "LMT\0", "\0"}, + {NULL, 0, 25200, 252435600LL, 0, "+07\0", "\0"}, + {rules_Mongol, 9, 28800, 0, 0, "+08\0", "+09\0"}, +}; +static const struct lc_timezone_era eras_Asia_Urumqi[] = { + {NULL, 0, 21020, -1325483420LL, 0, "LMT\0", "\0"}, + {NULL, 0, 21600, 0, 0, "+06\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Ust_Nera[] = { + {NULL, 0, 34374, -1579426374LL, 0, "LMT\0", "\0"}, + {NULL, 0, 28800, -1247558400LL, 0, "+08\0", "\0"}, + {rules_Russia, 16, 32400, 354898800LL, 0, "+09\0", "+10\0"}, + {rules_Russia, 16, 39600, 670345200LL, 0, "+11\0", "+12\0"}, + {rules_Russia, 16, 36000, 695750400LL, 0, "+10\0", "+11\0"}, + {rules_Russia, 16, 39600, 1301151600LL, 0, "+11\0", "+12\0"}, + {NULL, 0, 43200, 1315828800LL, 0, "+12\0", "\0"}, + {NULL, 0, 39600, 1414249200LL, 0, "+11\0", "\0"}, + {NULL, 0, 36000, 0, 0, "+10\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Vladivostok[] = { + {NULL, 0, 31651, -1487321251LL, 0, "LMT\0", "\0"}, + {NULL, 0, 32400, -1247562000LL, 0, "+09\0", "\0"}, + {rules_Russia, 16, 36000, 670348800LL, 0, "+10\0", "+11\0"}, + {rules_Russia, 16, 32400, 695754000LL, 0, "+09\0", "+10\0"}, + {rules_Russia, 16, 36000, 1301155200LL, 0, "+10\0", "+11\0"}, + {NULL, 0, 39600, 1414249200LL, 0, "+11\0", "\0"}, + {NULL, 0, 36000, 0, 0, "+10\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Yakutsk[] = { + {NULL, 0, 31138, -1579423138LL, 0, "LMT\0", "\0"}, + {NULL, 0, 28800, -1247558400LL, 0, "+08\0", "\0"}, + {rules_Russia, 16, 32400, 670352400LL, 0, "+09\0", "+10\0"}, + {rules_Russia, 16, 28800, 695757600LL, 0, "+08\0", "+09\0"}, + {rules_Russia, 16, 32400, 1301158800LL, 0, "+09\0", "+10\0"}, + {NULL, 0, 36000, 1414252800LL, 0, "+10\0", "\0"}, + {NULL, 0, 32400, 0, 0, "+09\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Yangon[] = { + {NULL, 0, 23080, -2840163880LL, 0, "LMT\0", "\0"}, + {NULL, 0, 23080, -1577946280LL, 0, "RMT\0", "\0"}, + {NULL, 0, 23400, -873268200LL, 0, "+0630\0", "\0"}, + {NULL, 0, 32400, -778410000LL, 0, "+09\0", "\0"}, + {NULL, 0, 23400, 0, 0, "+0630\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Yekaterinburg[] = { + {NULL, 0, 14553, -1688270553LL, 0, "LMT\0", "\0"}, + {NULL, 0, 13505, -1592610305LL, 0, "PMT\0", "\0"}, + {NULL, 0, 14400, -1247544000LL, 0, "+04\0", "\0"}, + {rules_Russia, 16, 18000, 670366800LL, 0, "+05\0", "+06\0"}, + {rules_Russia, 16, 14400, 695772000LL, 0, "+04\0", "+05\0"}, + {rules_Russia, 16, 18000, 1301173200LL, 0, "+05\0", "+06\0"}, + {NULL, 0, 21600, 1414267200LL, 0, "+06\0", "\0"}, + {NULL, 0, 18000, 0, 0, "+05\0", "\0"}, +}; +static const struct lc_timezone_era eras_Asia_Yerevan[] = { + {NULL, 0, 10680, -1441162680LL, 0, "LMT\0", "\0"}, + {NULL, 0, 10800, -405140400LL, 0, "+03\0", "\0"}, + {rules_RussiaAsia, 5, 14400, 670370400LL, 0, "+04\0", "+05\0"}, + {rules_RussiaAsia, 5, 10800, 811897200LL, 6, "+03\0", "+04\0"}, + {NULL, 0, 14400, 852062400LL, 0, "+04\0", "\0"}, + {rules_RussiaAsia, 5, 14400, 0, 0, "+04\0", "+05\0"}, +}; +static const struct lc_timezone_era eras_Atlantic_Azores[] = { + {NULL, 0, -6160, -2713904240LL, 0, "LMT\0", "\0"}, + {NULL, 0, -6872, -1830377128LL, 0, "HMT\0", "\0"}, + {rules_Port, 50, -7200, -873676800LL, 6, "-02\0", "-01\0"}, + {rules_Port, 50, -7200, -864000000LL, 12, "+00\0", "\0"}, + {rules_Port, 50, -7200, -842832000LL, 6, "-02\0", "-01\0"}, + {rules_Port, 50, -7200, -831340800LL, 12, "+00\0", "\0"}, + {rules_Port, 50, -7200, -810777600LL, 6, "-02\0", "-01\0"}, + {rules_Port, 50, -7200, -799891200LL, 12, "+00\0", "\0"}, + {rules_Port, 50, -7200, -779328000LL, 6, "-02\0", "-01\0"}, + {rules_Port, 50, -7200, -768441600LL, 12, "+00\0", "\0"}, + {rules_Port, 50, -7200, -118267200LL, 0, "-02\0", "-01\0"}, + {rules_Port, 50, -3600, 433303200LL, 6, "-01\0", "+00\0"}, + {rules_W_Eur, 6, -3600, 717559200LL, 6, "-01\0", "+00\0"}, + {rules_EU, 6, 0, 733280400LL, 0, "WE%sT\0", "\0"}, + {rules_EU, 6, -3600, 0, 0, "-01\0", "+00\0"}, +}; +static const struct lc_timezone_era eras_Atlantic_Bermuda[] = { + {NULL, 0, -15558, -1262281242LL, 0, "LMT\0", "\0"}, + {NULL, 0, -14400, 136360800LL, 0, "AST\0", "\0"}, + {rules_Canada, 10, -14400, 189316800LL, 0, "A%sT\0", "\0"}, + {rules_US, 13, -14400, 0, 0, "A%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Atlantic_Canary[] = { + {NULL, 0, -3696, -1509663504LL, 0, "LMT\0", "\0"}, + {NULL, 0, -3600, -733874400LL, 0, "-01\0", "\0"}, + {NULL, 0, 0, 323827200LL, 0, "WET\0", "\0"}, + {rules_100, 1, 0, 338950800LL, 6, "WEST\0", "\0"}, + {rules_EU, 6, 0, 0, 0, "WE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Atlantic_Cape_Verde[] = { + {NULL, 0, -5644, -1988144756LL, 0, "LMT\0", "\0"}, + {NULL, 0, -7200, -862610400LL, 0, "-02\0", "\0"}, + {rules_100, 1, -7200, -764118000LL, 6, "-01\0", "\0"}, + {NULL, 0, -7200, 186120000LL, 0, "-02\0", "\0"}, + {NULL, 0, -3600, 0, 0, "-01\0", "\0"}, +}; +static const struct lc_timezone_era eras_Atlantic_Faroe[] = { + {NULL, 0, -1624, -1955748776LL, 0, "LMT\0", "\0"}, + {NULL, 0, 0, 347155200LL, 0, "WET\0", "\0"}, + {rules_EU, 6, 0, 0, 0, "WE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Atlantic_Madeira[] = { + {NULL, 0, -4056, -2713906344LL, 0, "LMT\0", "\0"}, + {NULL, 0, -4056, -1830379944LL, 0, "FMT\0", "\0"}, + {rules_Port, 50, -3600, -873680400LL, 6, "-01\0", "+00\0"}, + {rules_Port, 50, -3600, -864003600LL, 12, "+01\0", "\0"}, + {rules_Port, 50, -3600, -842835600LL, 6, "-01\0", "+00\0"}, + {rules_Port, 50, -3600, -831344400LL, 12, "+01\0", "\0"}, + {rules_Port, 50, -3600, -810781200LL, 6, "-01\0", "+00\0"}, + {rules_Port, 50, -3600, -799894800LL, 12, "+01\0", "\0"}, + {rules_Port, 50, -3600, -779331600LL, 6, "-01\0", "+00\0"}, + {rules_Port, 50, -3600, -768445200LL, 12, "+01\0", "\0"}, + {rules_Port, 50, -3600, -118270800LL, 0, "-01\0", "+00\0"}, + {rules_Port, 50, 0, 433299600LL, 6, "WE%sT\0", "\0"}, + {rules_EU, 6, 0, 0, 0, "WE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Atlantic_Reykjavik[] = { + {NULL, 0, -5280, -1956609120LL, 0, "LMT\0", "\0"}, + {rules_Iceland, 16, -3600, -54770400LL, 0, "-01\0", "+00\0"}, + {NULL, 0, 0, 0, 0, "GMT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Atlantic_South_Georgia[] = { + {NULL, 0, -8768, -2524512832LL, 0, "LMT\0", "\0"}, + {NULL, 0, -7200, 0, 0, "-02\0", "\0"}, +}; +static const struct lc_timezone_era eras_Atlantic_Stanley[] = { + {NULL, 0, -13884, -2524507716LL, 0, "LMT\0", "\0"}, + {NULL, 0, -13884, -1824235716LL, 0, "SMT\0", "\0"}, + {rules_Falk, 12, -14400, 420609600LL, 0, "-04\0", "-03\0"}, + {rules_Falk, 12, -10800, 495601200LL, 0, "-03\0", "-02\0"}, + {rules_Falk, 12, -14400, 1283666400LL, 0, "-04\0", "-03\0"}, + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_Australia_Adelaide[] = { + {NULL, 0, 33260, -2364110060LL, 0, "LMT\0", "\0"}, + {NULL, 0, 32400, -2230189200LL, 0, "ACST\0", "\0"}, + {rules_Aus, 7, 34200, 31501800LL, 0, "AC%sT\0", "\0"}, + {rules_AS, 15, 34200, 0, 0, "AC%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Australia_Brisbane[] = { + {NULL, 0, 36728, -2366791928LL, 0, "LMT\0", "\0"}, + {rules_Aus, 7, 36000, 31500000LL, 0, "AE%sT\0", "\0"}, + {rules_AQ, 4, 36000, 0, 0, "AE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Australia_Broken_Hill[] = { + {NULL, 0, 33948, -2364110748LL, 0, "LMT\0", "\0"}, + {NULL, 0, 36000, -2314951200LL, 0, "AEST\0", "\0"}, + {NULL, 0, 32400, -2230189200LL, 0, "ACST\0", "\0"}, + {rules_Aus, 7, 34200, 31501800LL, 0, "AC%sT\0", "\0"}, + {rules_AN, 16, 34200, 946647000LL, 6, "AC%sT\0", "\0"}, + {rules_AS, 15, 34200, 0, 0, "AC%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Australia_Currie[] = { + {NULL, 0, 34528, -2345794528LL, 0, "LMT\0", "\0"}, + {NULL, 0, 36000, -1680508800LL, 0, "AEST\0", "\0"}, + {rules_100, 1, 36000, -1669892400LL, 6, "AEDT\0", "\0"}, + {rules_Aus, 7, 36000, 47138400LL, 0, "AE%sT\0", "\0"}, + {rules_AT, 19, 36000, 0, 6, "AE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Australia_Darwin[] = { + {NULL, 0, 31400, -2364108200LL, 0, "LMT\0", "\0"}, + {NULL, 0, 32400, -2230189200LL, 0, "ACST\0", "\0"}, + {rules_Aus, 7, 34200, 0, 0, "AC%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Australia_Eucla[] = { + {NULL, 0, 30928, -2337928528LL, 0, "LMT\0", "\0"}, + {rules_Aus, 7, 31500, -836469900LL, 0, "+0845\0", "+0945\0"}, + {rules_AW, 9, 31500, 0, 0, "+0845\0", "+0945\0"}, +}; +static const struct lc_timezone_era eras_Australia_Hobart[] = { + {NULL, 0, 35356, -2345795356LL, 0, "LMT\0", "\0"}, + {NULL, 0, 36000, -1680508800LL, 0, "AEST\0", "\0"}, + {rules_100, 1, 36000, -1669892400LL, 6, "AEDT\0", "\0"}, + {rules_Aus, 7, 36000, -94730400LL, 0, "AE%sT\0", "\0"}, + {rules_AT, 19, 36000, 0, 6, "AE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Australia_Lindeman[] = { + {NULL, 0, 35756, -2366790956LL, 0, "LMT\0", "\0"}, + {rules_Aus, 7, 36000, 31500000LL, 0, "AE%sT\0", "\0"}, + {rules_AQ, 4, 36000, 709912800LL, 0, "AE%sT\0", "\0"}, + {rules_Holiday, 2, 36000, 0, 0, "AE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Australia_Lord_Howe[] = { + {NULL, 0, 38180, -2364114980LL, 0, "LMT\0", "\0"}, + {NULL, 0, 36000, 352216800LL, 0, "AEST\0", "\0"}, + {rules_LH, 14, 37800, 488986200LL, 0, "+1030\0", "+1130\0"}, + {rules_LH, 14, 37800, 0, 0, "+1030\0", "+11\0"}, +}; +static const struct lc_timezone_era eras_Australia_Melbourne[] = { + {NULL, 0, 34792, -2364111592LL, 0, "LMT\0", "\0"}, + {rules_Aus, 7, 36000, 31500000LL, 0, "AE%sT\0", "\0"}, + {rules_AV, 14, 36000, 0, 0, "AE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Australia_Perth[] = { + {NULL, 0, 27804, -2337925404LL, 0, "LMT\0", "\0"}, + {rules_Aus, 7, 28800, -836467200LL, 0, "AW%sT\0", "\0"}, + {rules_AW, 9, 28800, 0, 0, "AW%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Australia_Sydney[] = { + {NULL, 0, 36292, -2364113092LL, 0, "LMT\0", "\0"}, + {rules_Aus, 7, 36000, 31500000LL, 0, "AE%sT\0", "\0"}, + {rules_AN, 16, 36000, 0, 0, "AE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_CET[] = { + {rules_C_Eur, 17, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_CST6CDT[] = { + {rules_US, 13, -21600, 0, 0, "C%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_EET[] = { + {rules_EU, 6, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_EST[] = { + {NULL, 0, -18000, 0, 0, "EST\0", "\0"}, +}; +static const struct lc_timezone_era eras_EST5EDT[] = { + {rules_US, 13, -18000, 0, 0, "E%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT[] = { + {NULL, 0, 0, 0, 0, "GMT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT1[] = { + {NULL, 0, -3600, 0, 0, "-01\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT10[] = { + {NULL, 0, -36000, 0, 0, "-10\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT11[] = { + {NULL, 0, -39600, 0, 0, "-11\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT12[] = { + {NULL, 0, -43200, 0, 0, "-12\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT2[] = { + {NULL, 0, -7200, 0, 0, "-02\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT3[] = { + {NULL, 0, -10800, 0, 0, "-03\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT4[] = { + {NULL, 0, -14400, 0, 0, "-04\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT5[] = { + {NULL, 0, -18000, 0, 0, "-05\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT6[] = { + {NULL, 0, -21600, 0, 0, "-06\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT7[] = { + {NULL, 0, -25200, 0, 0, "-07\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT8[] = { + {NULL, 0, -28800, 0, 0, "-08\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT9[] = { + {NULL, 0, -32400, 0, 0, "-09\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT_1[] = { + {NULL, 0, 3600, 0, 0, "+01\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT_10[] = { + {NULL, 0, 36000, 0, 0, "+10\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT_11[] = { + {NULL, 0, 39600, 0, 0, "+11\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT_12[] = { + {NULL, 0, 43200, 0, 0, "+12\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT_13[] = { + {NULL, 0, 46800, 0, 0, "+13\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT_14[] = { + {NULL, 0, 50400, 0, 0, "+14\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT_2[] = { + {NULL, 0, 7200, 0, 0, "+02\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT_3[] = { + {NULL, 0, 10800, 0, 0, "+03\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT_4[] = { + {NULL, 0, 14400, 0, 0, "+04\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT_5[] = { + {NULL, 0, 18000, 0, 0, "+05\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT_6[] = { + {NULL, 0, 21600, 0, 0, "+06\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT_7[] = { + {NULL, 0, 25200, 0, 0, "+07\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT_8[] = { + {NULL, 0, 28800, 0, 0, "+08\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_GMT_9[] = { + {NULL, 0, 32400, 0, 0, "+09\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_UCT[] = { + {NULL, 0, 0, 0, 0, "UCT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Etc_UTC[] = { + {NULL, 0, 0, 0, 0, "UTC\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Amsterdam[] = { + {NULL, 0, 1172, -4260212372LL, 0, "LMT\0", "\0"}, + {rules_Neth, 20, 1172, -1025745572LL, 6, "%s\0", "\0"}, + {rules_Neth, 20, 1200, -935022000LL, 0, "+0020\0", "+0120\0"}, + {rules_C_Eur, 17, 3600, -781052400LL, 0, "CE%sT\0", "\0"}, + {rules_Neth, 20, 3600, 220921200LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Andorra[] = { + {NULL, 0, 364, -2177453164LL, 0, "LMT\0", "\0"}, + {NULL, 0, 0, -733881600LL, 0, "WET\0", "\0"}, + {NULL, 0, 3600, 481078800LL, 0, "CET\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Astrakhan[] = { + {NULL, 0, 11532, -1441249932LL, 0, "LMT\0", "\0"}, + {NULL, 0, 10800, -1247540400LL, 0, "+03\0", "\0"}, + {rules_Russia, 16, 14400, 606866400LL, 0, "+04\0", "+05\0"}, + {rules_Russia, 16, 10800, 670374000LL, 0, "+03\0", "+04\0"}, + {NULL, 0, 14400, 701820000LL, 0, "+04\0", "\0"}, + {rules_Russia, 16, 10800, 1301180400LL, 0, "+03\0", "+04\0"}, + {NULL, 0, 14400, 1414274400LL, 0, "+04\0", "\0"}, + {NULL, 0, 10800, 1459033200LL, 0, "+03\0", "\0"}, + {NULL, 0, 14400, 0, 0, "+04\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Athens[] = { + {NULL, 0, 5692, -2344642492LL, 0, "LMT\0", "\0"}, + {NULL, 0, 5692, -1686101632LL, 0, "AMT\0", "\0"}, + {rules_Greece, 19, 7200, -904878000LL, 6, "EE%sT\0", "\0"}, + {rules_Greece, 19, 3600, -812422800LL, 0, "CE%sT\0", "\0"}, + {rules_Greece, 19, 7200, 347148000LL, 0, "EE%sT\0", "\0"}, + {rules_EU, 6, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Belgrade[] = { + {NULL, 0, 4920, -2713915320LL, 0, "LMT\0", "\0"}, + {NULL, 0, 3600, -905824800LL, 0, "CET\0", "\0"}, + {rules_C_Eur, 17, 3600, -788922000LL, 0, "CE%sT\0", "\0"}, + {NULL, 0, 3600, -777942000LL, 0, "CET\0", "\0"}, + {rules_100, 1, 3600, -766623600LL, 6, "CEST\0", "\0"}, + {NULL, 0, 3600, 407199600LL, 0, "CET\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Berlin[] = { + {NULL, 0, 3208, -2422054408LL, 0, "LMT\0", "\0"}, + {rules_C_Eur, 17, 3600, -776563200LL, 6, "CE%sT\0", "\0"}, + {rules_SovietZone, 3, 3600, -757386000LL, 0, "CE%sT\0", "\0"}, + {rules_Germany, 8, 3600, 315529200LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Brussels[] = { + {NULL, 0, 1050, -2840141850LL, 0, "LMT\0", "\0"}, + {NULL, 0, 1050, -2450953050LL, 0, "BMT\0", "\0"}, + {NULL, 0, 0, -1740355200LL, 0, "WET\0", "\0"}, + {NULL, 0, 3600, -1693702800LL, 0, "CET\0", "\0"}, + {rules_C_Eur, 17, 3600, -1613826000LL, 0, "CE%sT\0", "\0"}, + {rules_Belgium, 34, 0, -934668000LL, 6, "WE%sT\0", "\0"}, + {rules_C_Eur, 17, 3600, -799293600LL, 6, "CE%sT\0", "\0"}, + {rules_Belgium, 34, 3600, 220921200LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Bucharest[] = { + {NULL, 0, 6264, -2469404664LL, 0, "LMT\0", "\0"}, + {NULL, 0, 6264, -1213148664LL, 0, "BMT\0", "\0"}, + {rules_Romania, 9, 7200, 354672000LL, 0, "EE%sT\0", "\0"}, + {rules_C_Eur, 17, 7200, 662680800LL, 0, "EE%sT\0", "\0"}, + {rules_Romania, 9, 7200, 757375200LL, 0, "EE%sT\0", "\0"}, + {rules_E_Eur, 6, 7200, 852069600LL, 0, "EE%sT\0", "\0"}, + {rules_EU, 6, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Budapest[] = { + {NULL, 0, 4580, -2500938980LL, 0, "LMT\0", "\0"}, + {rules_C_Eur, 17, 3600, -1640998800LL, 0, "CE%sT\0", "\0"}, + {rules_Hungary, 18, 3600, -906771600LL, 0, "CE%sT\0", "\0"}, + {rules_C_Eur, 17, 3600, -788922000LL, 0, "CE%sT\0", "\0"}, + {rules_Hungary, 18, 3600, 338950800LL, 6, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Chisinau[] = { + {NULL, 0, 6920, -2840147720LL, 0, "LMT\0", "\0"}, + {NULL, 0, 6900, -1637114100LL, 0, "CMT\0", "\0"}, + {NULL, 0, 6264, -1213148664LL, 0, "BMT\0", "\0"}, + {rules_Romania, 9, 7200, -927165600LL, 0, "EE%sT\0", "\0"}, + {rules_100, 1, 7200, -898138800LL, 6, "EEST\0", "\0"}, + {rules_C_Eur, 17, 3600, -800157600LL, 6, "CE%sT\0", "\0"}, + {rules_Russia, 16, 10800, 641944800LL, 6, "MSK\0", "MSD\0"}, + {rules_Russia, 16, 7200, 694216800LL, 0, "EE%sT\0", "\0"}, + {rules_E_Eur, 6, 7200, 852069600LL, 0, "EE%sT\0", "\0"}, + {rules_Moldova, 2, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Copenhagen[] = { + {NULL, 0, 3020, -2524524620LL, 0, "LMT\0", "\0"}, + {NULL, 0, 3020, -2398294220LL, 0, "CMT\0", "\0"}, + {rules_Denmark, 11, 3600, -857257200LL, 6, "CE%sT\0", "\0"}, + {rules_C_Eur, 17, 3600, -781052400LL, 0, "CE%sT\0", "\0"}, + {rules_Denmark, 11, 3600, 315529200LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Dublin[] = { + {NULL, 0, -1500, -2821649700LL, 0, "LMT\0", "\0"}, + {NULL, 0, -1521, -1691962479LL, 0, "DMT\0", "\0"}, + {rules_100, 1, -1521, -1680471279LL, 6, "IST\0", "\0"}, + {rules_GB_Eire, 65, 0, -1517011200LL, 0, "%s\0", "\0"}, + {rules_GB_Eire, 65, 0, -942012000LL, 0, "GMT\0", "IST\0"}, + {rules_100, 1, 0, -733359600LL, 6, "IST\0", "\0"}, + {NULL, 0, 0, -719445600LL, 0, "GMT\0", "\0"}, + {rules_100, 1, 0, -699490800LL, 6, "IST\0", "\0"}, + {NULL, 0, 0, -684972000LL, 0, "GMT\0", "\0"}, + {rules_GB_Eire, 65, 0, -37242000LL, 6, "GMT\0", "IST\0"}, + {NULL, 0, 3600, 57722400LL, 0, "IST\0", "\0"}, + {rules_GB_Eire, 65, 0, 820454400LL, 0, "GMT\0", "IST\0"}, + {rules_EU, 6, 0, 0, 0, "GMT\0", "IST\0"}, +}; +static const struct lc_timezone_era eras_Europe_Gibraltar[] = { + {NULL, 0, -1284, -2821649916LL, 0, "LMT\0", "\0"}, + {rules_GB_Eire, 65, 0, -401320800LL, 0, "%s\0", "\0"}, + {NULL, 0, 3600, 378687600LL, 0, "CET\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Helsinki[] = { + {NULL, 0, 5989, -2890258789LL, 0, "LMT\0", "\0"}, + {NULL, 0, 5989, -1535938789LL, 0, "HMT\0", "\0"}, + {rules_Finland, 4, 7200, 410220000LL, 0, "EE%sT\0", "\0"}, + {rules_EU, 6, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Istanbul[] = { + {NULL, 0, 6952, -2840147752LL, 0, "LMT\0", "\0"}, + {NULL, 0, 7016, -1869875816LL, 0, "IMT\0", "\0"}, + {rules_Turkey, 54, 7200, 277246800LL, 6, "EE%sT\0", "\0"}, + {rules_Turkey, 54, 10800, 482792400LL, 0, "+03\0", "+04\0"}, + {rules_Turkey, 54, 7200, 1167602400LL, 0, "EE%sT\0", "\0"}, + {rules_EU, 6, 7200, 1301187600LL, 0, "EE%sT\0", "\0"}, + {NULL, 0, 7200, 1301274000LL, 0, "EET\0", "\0"}, + {rules_EU, 6, 7200, 1396141200LL, 0, "EE%sT\0", "\0"}, + {NULL, 0, 7200, 1396227600LL, 0, "EET\0", "\0"}, + {rules_EU, 6, 7200, 1445734800LL, 6, "EE%sT\0", "\0"}, + {rules_100, 1, 7200, 1446944400LL, 6, "EEST\0", "\0"}, + {rules_EU, 6, 7200, 1473195600LL, 6, "EE%sT\0", "\0"}, + {NULL, 0, 10800, 0, 0, "+03\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Kaliningrad[] = { + {NULL, 0, 4920, -2422056120LL, 0, "LMT\0", "\0"}, + {rules_C_Eur, 17, 3600, -788922000LL, 0, "CE%sT\0", "\0"}, + {rules_Poland, 20, 7200, -757389600LL, 0, "CE%sT\0", "\0"}, + {rules_Russia, 16, 10800, 606870000LL, 0, "MSK\0", "MSD\0"}, + {rules_Russia, 16, 7200, 1301184000LL, 0, "EE%sT\0", "\0"}, + {NULL, 0, 10800, 1414278000LL, 0, "+03\0", "\0"}, + {NULL, 0, 7200, 0, 0, "EET\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Kiev[] = { + {NULL, 0, 7324, -2840148124LL, 0, "LMT\0", "\0"}, + {NULL, 0, 7324, -1441159324LL, 0, "KMT\0", "\0"}, + {NULL, 0, 7200, -1247536800LL, 0, "EET\0", "\0"}, + {NULL, 0, 10800, -892522800LL, 0, "MSK\0", "\0"}, + {rules_C_Eur, 17, 3600, -825382800LL, 0, "CE%sT\0", "\0"}, + {rules_Russia, 16, 10800, 646783200LL, 6, "MSK\0", "MSD\0"}, + {rules_100, 1, 7200, 686102400LL, 6, "EEST\0", "\0"}, + {rules_E_Eur, 6, 7200, 788911200LL, 0, "EE%sT\0", "\0"}, + {rules_EU, 6, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Kirov[] = { + {NULL, 0, 11928, -1593820800LL, 0, "LMT\0", "\0"}, + {NULL, 0, 10800, -1247540400LL, 0, "+03\0", "\0"}, + {rules_Russia, 16, 14400, 606866400LL, 0, "+04\0", "+05\0"}, + {rules_Russia, 16, 10800, 670374000LL, 0, "+03\0", "+04\0"}, + {NULL, 0, 14400, 701820000LL, 0, "+04\0", "\0"}, + {rules_Russia, 16, 10800, 1301180400LL, 0, "+03\0", "+04\0"}, + {NULL, 0, 14400, 1414274400LL, 0, "+04\0", "\0"}, + {NULL, 0, 10800, 0, 0, "+03\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Lisbon[] = { + {NULL, 0, -2205, -2713908195LL, 0, "LMT\0", "\0"}, + {NULL, 0, -2205, -1830381795LL, 0, "LMT\0", "\0"}, + {rules_Port, 50, 0, -118274400LL, 0, "WE%sT\0", "\0"}, + {NULL, 0, 3600, 212544000LL, 0, "CET\0", "\0"}, + {rules_Port, 50, 0, 433299600LL, 6, "WE%sT\0", "\0"}, + {rules_W_Eur, 6, 0, 717555600LL, 6, "WE%sT\0", "\0"}, + {rules_EU, 6, 3600, 828234000LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 0, 0, 0, "WE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_London[] = { + {NULL, 0, -75, -3852662325LL, 0, "LMT\0", "\0"}, + {rules_GB_Eire, 65, 0, -37242000LL, 6, "%s\0", "\0"}, + {NULL, 0, 3600, 57722400LL, 0, "BST\0", "\0"}, + {rules_GB_Eire, 65, 0, 820454400LL, 0, "%s\0", "\0"}, + {rules_EU, 6, 0, 0, 0, "GMT\0", "BST\0"}, +}; +static const struct lc_timezone_era eras_Europe_Luxembourg[] = { + {NULL, 0, 1476, -2069713476LL, 0, "LMT\0", "\0"}, + {rules_Lux, 23, 3600, -1612659600LL, 0, "CE%sT\0", "\0"}, + {rules_Lux, 23, 0, -1269813600LL, 6, "WE%sT\0", "\0"}, + {rules_Belgium, 34, 0, -935186400LL, 6, "WE%sT\0", "\0"}, + {rules_C_Eur, 17, 3600, -797986800LL, 6, "WE%sT\0", "\0"}, + {rules_Belgium, 34, 3600, 220921200LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Madrid[] = { + {NULL, 0, -884, -2177452800LL, 0, "LMT\0", "\0"}, + {rules_Spain, 30, 0, -940208400LL, 0, "WE%sT\0", "\0"}, + {rules_Spain, 30, 3600, 283993200LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Malta[] = { + {NULL, 0, 3484, -2403478684LL, 0, "LMT\0", "\0"}, + {rules_Italy, 41, 3600, 102380400LL, 0, "CE%sT\0", "\0"}, + {rules_Malta, 7, 3600, 347151600LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Minsk[] = { + {NULL, 0, 6616, -2840147416LL, 0, "LMT\0", "\0"}, + {NULL, 0, 6600, -1441158600LL, 0, "MMT\0", "\0"}, + {NULL, 0, 7200, -1247536800LL, 0, "EET\0", "\0"}, + {NULL, 0, 10800, -899780400LL, 0, "MSK\0", "\0"}, + {rules_C_Eur, 17, 3600, -804650400LL, 6, "CE%sT\0", "\0"}, + {rules_Russia, 16, 10800, 631141200LL, 0, "MSK\0", "MSD\0"}, + {NULL, 0, 10800, 670374000LL, 0, "MSK\0", "\0"}, + {rules_Russia, 16, 7200, 1301184000LL, 0, "EE%sT\0", "\0"}, + {NULL, 0, 10800, 0, 0, "+03\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Monaco[] = { + {NULL, 0, 1772, -2486680172LL, 0, "LMT\0", "\0"}, + {NULL, 0, 561, -1855958961LL, 0, "PMT\0", "\0"}, + {rules_France, 42, 0, -766623600LL, 12, "WE%sT\0", "\0"}, + {rules_France, 42, 3600, 220921200LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Moscow[] = { + {NULL, 0, 9017, -2840149817LL, 0, "LMT\0", "\0"}, + {NULL, 0, 9017, -1688265017LL, 0, "MMT\0", "\0"}, + {rules_Russia, 16, 9079, -1593820800LL, 12, "%s\0", "\0"}, + {rules_Russia, 16, 10800, -1522728000LL, 6, "%s\0", "\0"}, + {rules_Russia, 16, 10800, -1491188400LL, 0, "MSK\0", "MSD\0"}, + {NULL, 0, 7200, -1247536800LL, 0, "EET\0", "\0"}, + {rules_Russia, 16, 10800, 670374000LL, 0, "MSK\0", "MSD\0"}, + {rules_Russia, 16, 7200, 695779200LL, 0, "EE%sT\0", "\0"}, + {rules_Russia, 16, 10800, 1301180400LL, 0, "MSK\0", "MSD\0"}, + {NULL, 0, 14400, 1414274400LL, 0, "MSK\0", "\0"}, + {NULL, 0, 10800, 0, 0, "MSK\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Oslo[] = { + {NULL, 0, 2580, -2366757780LL, 0, "LMT\0", "\0"}, + {rules_Norway, 7, 3600, -927511200LL, 0, "CE%sT\0", "\0"}, + {rules_C_Eur, 17, 3600, -781052400LL, 0, "CE%sT\0", "\0"}, + {rules_Norway, 7, 3600, 315529200LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Paris[] = { + {NULL, 0, 561, -2486678901LL, 0, "LMT\0", "\0"}, + {NULL, 0, 561, -1855958901LL, 0, "PMT\0", "\0"}, + {rules_France, 42, 0, -932436000LL, 6, "WE%sT\0", "\0"}, + {rules_C_Eur, 17, 3600, -800071200LL, 6, "CE%sT\0", "\0"}, + {rules_France, 42, 0, -766623600LL, 12, "WE%sT\0", "\0"}, + {rules_France, 42, 3600, 220921200LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Prague[] = { + {NULL, 0, 3464, -3786829064LL, 0, "LMT\0", "\0"}, + {NULL, 0, 3464, -2469401864LL, 0, "PMT\0", "\0"}, + {rules_C_Eur, 17, 3600, -798073200LL, 6, "CE%sT\0", "\0"}, + {rules_Czech, 7, 3600, 283993200LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Riga[] = { + {NULL, 0, 5794, -2840146594LL, 0, "LMT\0", "\0"}, + {NULL, 0, 5794, -1632008194LL, 0, "RMT\0", "\0"}, + {rules_100, 1, 5794, -1618702594LL, 6, "LST\0", "\0"}, + {NULL, 0, 5794, -1601681794LL, 0, "RMT\0", "\0"}, + {rules_100, 1, 5794, -1597275394LL, 6, "LST\0", "\0"}, + {NULL, 0, 5794, -1377308194LL, 0, "RMT\0", "\0"}, + {NULL, 0, 7200, -928029600LL, 0, "EET\0", "\0"}, + {NULL, 0, 10800, -899521200LL, 0, "MSK\0", "\0"}, + {rules_C_Eur, 17, 3600, -795834000LL, 0, "CE%sT\0", "\0"}, + {rules_Russia, 16, 10800, 606870000LL, 0, "MSK\0", "MSD\0"}, + {rules_100, 1, 7200, 622598400LL, 6, "EEST\0", "\0"}, + {rules_Latvia, 2, 7200, 853797600LL, 0, "EE%sT\0", "\0"}, + {rules_EU, 6, 7200, 951775200LL, 0, "EE%sT\0", "\0"}, + {NULL, 0, 7200, 978386400LL, 0, "EET\0", "\0"}, + {rules_EU, 6, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Rome[] = { + {NULL, 0, 2996, -3259097396LL, 0, "LMT\0", "\0"}, + {NULL, 0, 2996, -2403565200LL, 0, "RMT\0", "\0"}, + {rules_Italy, 41, 3600, -830311200LL, 6, "CE%sT\0", "\0"}, + {rules_C_Eur, 17, 3600, -807156000LL, 6, "CE%sT\0", "\0"}, + {rules_Italy, 41, 3600, 315529200LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Samara[] = { + {NULL, 0, 12020, -1593820800LL, 0, "LMT\0", "\0"}, + {NULL, 0, 10800, -1247540400LL, 0, "+03\0", "\0"}, + {NULL, 0, 14400, -1102305600LL, 0, "+04\0", "\0"}, + {rules_Russia, 16, 14400, 606866400LL, 0, "+04\0", "+05\0"}, + {rules_Russia, 16, 10800, 670374000LL, 0, "+03\0", "+04\0"}, + {rules_Russia, 16, 7200, 686102400LL, 6, "+02\0", "+03\0"}, + {NULL, 0, 10800, 687916800LL, 0, "+03\0", "\0"}, + {rules_Russia, 16, 14400, 1269727200LL, 0, "+04\0", "+05\0"}, + {rules_Russia, 16, 10800, 1301180400LL, 0, "+03\0", "+04\0"}, + {NULL, 0, 14400, 0, 0, "+04\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Saratov[] = { + {NULL, 0, 11058, -1593820800LL, 0, "LMT\0", "\0"}, + {NULL, 0, 10800, -1247540400LL, 0, "+03\0", "\0"}, + {rules_Russia, 16, 14400, 575416800LL, 0, "+04\0", "+05\0"}, + {rules_Russia, 16, 10800, 670374000LL, 0, "+03\0", "+04\0"}, + {NULL, 0, 14400, 701820000LL, 0, "+04\0", "\0"}, + {rules_Russia, 16, 10800, 1301180400LL, 0, "+03\0", "+04\0"}, + {NULL, 0, 14400, 1414274400LL, 0, "+04\0", "\0"}, + {NULL, 0, 10800, 1480806000LL, 0, "+03\0", "\0"}, + {NULL, 0, 14400, 0, 0, "+04\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Simferopol[] = { + {NULL, 0, 8184, -2840148984LL, 0, "LMT\0", "\0"}, + {NULL, 0, 8160, -1441160160LL, 0, "SMT\0", "\0"}, + {NULL, 0, 7200, -1247536800LL, 0, "EET\0", "\0"}, + {NULL, 0, 10800, -888894000LL, 0, "MSK\0", "\0"}, + {rules_C_Eur, 17, 3600, -811648800LL, 6, "CE%sT\0", "\0"}, + {rules_Russia, 16, 10800, 631141200LL, 0, "MSK\0", "MSD\0"}, + {NULL, 0, 10800, 646786800LL, 0, "MSK\0", "\0"}, + {NULL, 0, 7200, 694216800LL, 0, "EET\0", "\0"}, + {rules_E_Eur, 6, 7200, 767739600LL, 6, "EE%sT\0", "\0"}, + {rules_E_Eur, 6, 10800, 828219600LL, 0, "MSK\0", "MSD\0"}, + {rules_100, 1, 10800, 846374400LL, 6, "MSD\0", "\0"}, + {rules_Russia, 16, 10800, 852066000LL, 0, "MSK\0", "MSD\0"}, + {NULL, 0, 10800, 859683600LL, 0, "MSK\0", "\0"}, + {rules_EU, 6, 7200, 1396137600LL, 0, "EE%sT\0", "\0"}, + {NULL, 0, 14400, 1414274400LL, 0, "MSK\0", "\0"}, + {NULL, 0, 10800, 0, 0, "MSK\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Sofia[] = { + {NULL, 0, 5596, -2840146396LL, 0, "LMT\0", "\0"}, + {NULL, 0, 7016, -2369527016LL, 0, "IMT\0", "\0"}, + {NULL, 0, 7200, -857257200LL, 0, "EET\0", "\0"}, + {rules_C_Eur, 17, 3600, -788922000LL, 0, "CE%sT\0", "\0"}, + {NULL, 0, 3600, -781048800LL, 0, "CET\0", "\0"}, + {NULL, 0, 7200, 291762000LL, 0, "EET\0", "\0"}, + {rules_Bulg, 5, 7200, 401846400LL, 6, "EE%sT\0", "\0"}, + {rules_C_Eur, 17, 7200, 662680800LL, 0, "EE%sT\0", "\0"}, + {rules_E_Eur, 6, 7200, 852069600LL, 0, "EE%sT\0", "\0"}, + {rules_EU, 6, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Stockholm[] = { + {NULL, 0, 4332, -2871681132LL, 0, "LMT\0", "\0"}, + {NULL, 0, 3614, -2208992414LL, 0, "SET\0", "\0"}, + {NULL, 0, 3600, -1692496800LL, 0, "CET\0", "\0"}, + {rules_100, 1, 3600, -1680483600LL, 6, "CEST\0", "\0"}, + {NULL, 0, 3600, 315529200LL, 0, "CET\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Tallinn[] = { + {NULL, 0, 5940, -2840146740LL, 0, "LMT\0", "\0"}, + {NULL, 0, 5940, -1638322740LL, 0, "TMT\0", "\0"}, + {rules_C_Eur, 17, 3600, -1593824400LL, 0, "CE%sT\0", "\0"}, + {NULL, 0, 5940, -1535938740LL, 0, "TMT\0", "\0"}, + {NULL, 0, 7200, -927943200LL, 0, "EET\0", "\0"}, + {NULL, 0, 10800, -892954800LL, 0, "MSK\0", "\0"}, + {rules_C_Eur, 17, 3600, -797652000LL, 6, "CE%sT\0", "\0"}, + {rules_Russia, 16, 10800, 606870000LL, 0, "MSK\0", "MSD\0"}, + {rules_100, 1, 7200, 622598400LL, 6, "EEST\0", "\0"}, + {rules_C_Eur, 17, 7200, 906411600LL, 6, "EE%sT\0", "\0"}, + {rules_EU, 6, 7200, 941331600LL, 6, "EE%sT\0", "\0"}, + {NULL, 0, 7200, 1014242400LL, 0, "EET\0", "\0"}, + {rules_EU, 6, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Tirane[] = { + {NULL, 0, 4760, -1767230360LL, 0, "LMT\0", "\0"}, + {NULL, 0, 3600, -932346000LL, 0, "CET\0", "\0"}, + {rules_Albania, 25, 3600, 457480800LL, 6, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Ulyanovsk[] = { + {NULL, 0, 11616, -1593820800LL, 0, "LMT\0", "\0"}, + {NULL, 0, 10800, -1247540400LL, 0, "+03\0", "\0"}, + {rules_Russia, 16, 14400, 606866400LL, 0, "+04\0", "+05\0"}, + {rules_Russia, 16, 10800, 670374000LL, 0, "+03\0", "+04\0"}, + {rules_Russia, 16, 7200, 695779200LL, 0, "+02\0", "+03\0"}, + {rules_Russia, 16, 10800, 1301180400LL, 0, "+03\0", "+04\0"}, + {NULL, 0, 14400, 1414274400LL, 0, "+04\0", "\0"}, + {NULL, 0, 10800, 1459033200LL, 0, "+03\0", "\0"}, + {NULL, 0, 14400, 0, 0, "+04\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Uzhgorod[] = { + {NULL, 0, 5352, -2500939752LL, 0, "LMT\0", "\0"}, + {NULL, 0, 3600, -946774800LL, 0, "CET\0", "\0"}, + {rules_C_Eur, 17, 3600, -796874400LL, 6, "CE%sT\0", "\0"}, + {rules_100, 1, 3600, -794714400LL, 6, "CEST\0", "\0"}, + {NULL, 0, 3600, -773456400LL, 0, "CET\0", "\0"}, + {rules_Russia, 16, 10800, 631141200LL, 0, "MSK\0", "MSD\0"}, + {NULL, 0, 10800, 646786800LL, 0, "MSK\0", "\0"}, + {NULL, 0, 3600, 670384800LL, 0, "CET\0", "\0"}, + {NULL, 0, 7200, 694216800LL, 0, "EET\0", "\0"}, + {rules_E_Eur, 6, 7200, 788911200LL, 0, "EE%sT\0", "\0"}, + {rules_EU, 6, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Vienna[] = { + {NULL, 0, 3921, -2422055121LL, 0, "LMT\0", "\0"}, + {rules_C_Eur, 17, 3600, -1577926800LL, 0, "CE%sT\0", "\0"}, + {rules_Austria, 8, 3600, -938905200LL, 0, "CE%sT\0", "\0"}, + {rules_C_Eur, 17, 3600, -781052400LL, 0, "CE%sT\0", "\0"}, + {rules_100, 1, 3600, -780188400LL, 6, "CEST\0", "\0"}, + {NULL, 0, 3600, -757386000LL, 0, "CET\0", "\0"}, + {rules_Austria, 8, 3600, 347151600LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Vilnius[] = { + {NULL, 0, 6076, -2840146876LL, 0, "LMT\0", "\0"}, + {NULL, 0, 5040, -1672536240LL, 0, "WMT\0", "\0"}, + {NULL, 0, 5736, -1585100136LL, 0, "KMT\0", "\0"}, + {NULL, 0, 3600, -1561251600LL, 0, "CET\0", "\0"}, + {NULL, 0, 7200, -1553565600LL, 0, "EET\0", "\0"}, + {NULL, 0, 3600, -928198800LL, 0, "CET\0", "\0"}, + {NULL, 0, 10800, -900126000LL, 0, "MSK\0", "\0"}, + {rules_C_Eur, 17, 3600, -802144800LL, 6, "CE%sT\0", "\0"}, + {rules_Russia, 16, 10800, 606870000LL, 0, "MSK\0", "MSD\0"}, + {rules_Russia, 16, 7200, 686102400LL, 6, "EE%sT\0", "\0"}, + {rules_C_Eur, 17, 7200, 883605600LL, 0, "EE%sT\0", "\0"}, + {NULL, 0, 7200, 891133200LL, 0, "EET\0", "\0"}, + {rules_EU, 6, 3600, 941331600LL, 6, "CE%sT\0", "\0"}, + {NULL, 0, 7200, 1041372000LL, 0, "EET\0", "\0"}, + {rules_EU, 6, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Volgograd[] = { + {NULL, 0, 10660, -1577761060LL, 0, "LMT\0", "\0"}, + {NULL, 0, 10800, -1247540400LL, 0, "+03\0", "\0"}, + {NULL, 0, 14400, -256881600LL, 0, "+04\0", "\0"}, + {rules_Russia, 16, 14400, 575416800LL, 0, "+04\0", "+05\0"}, + {rules_Russia, 16, 10800, 670374000LL, 0, "+03\0", "+04\0"}, + {NULL, 0, 14400, 701820000LL, 0, "+04\0", "\0"}, + {rules_Russia, 16, 10800, 1301180400LL, 0, "+03\0", "+04\0"}, + {NULL, 0, 14400, 1414274400LL, 0, "+04\0", "\0"}, + {NULL, 0, 10800, 0, 0, "+03\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Warsaw[] = { + {NULL, 0, 5040, -2840145840LL, 0, "LMT\0", "\0"}, + {NULL, 0, 5040, -1717032240LL, 0, "WMT\0", "\0"}, + {rules_C_Eur, 17, 3600, -1618700400LL, 6, "CE%sT\0", "\0"}, + {rules_Poland, 20, 7200, -1501725600LL, 0, "EE%sT\0", "\0"}, + {rules_Poland, 20, 3600, -931734000LL, 0, "CE%sT\0", "\0"}, + {rules_C_Eur, 17, 3600, -796874400LL, 6, "CE%sT\0", "\0"}, + {rules_Poland, 20, 3600, 220921200LL, 0, "CE%sT\0", "\0"}, + {rules_W_Eur, 6, 3600, 567990000LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Zaporozhye[] = { + {NULL, 0, 8440, -2840149240LL, 0, "LMT\0", "\0"}, + {NULL, 0, 8400, -1441160400LL, 0, "+0220\0", "\0"}, + {NULL, 0, 7200, -1247536800LL, 0, "EET\0", "\0"}, + {NULL, 0, 10800, -894769200LL, 0, "MSK\0", "\0"}, + {rules_C_Eur, 17, 3600, -826419600LL, 0, "CE%sT\0", "\0"}, + {rules_Russia, 16, 10800, 670374000LL, 0, "MSK\0", "MSD\0"}, + {rules_E_Eur, 6, 7200, 788911200LL, 0, "EE%sT\0", "\0"}, + {rules_EU, 6, 7200, 0, 0, "EE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Europe_Zurich[] = { + {NULL, 0, 2048, -3675198848LL, 0, "LMT\0", "\0"}, + {NULL, 0, 1786, -2385246586LL, 0, "BMT\0", "\0"}, + {rules_Swiss, 2, 3600, 347151600LL, 0, "CE%sT\0", "\0"}, + {rules_EU, 6, 3600, 0, 0, "CE%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_HST[] = { + {NULL, 0, -36000, 0, 0, "HST\0", "\0"}, +}; +static const struct lc_timezone_era eras_Indian_Chagos[] = { + {NULL, 0, 17380, -1988167780LL, 0, "LMT\0", "\0"}, + {NULL, 0, 18000, 820436400LL, 0, "+05\0", "\0"}, + {NULL, 0, 21600, 0, 0, "+06\0", "\0"}, +}; +static const struct lc_timezone_era eras_Indian_Christmas[] = { + {NULL, 0, 25372, -2364102172LL, 0, "LMT\0", "\0"}, + {NULL, 0, 25200, 0, 0, "+07\0", "\0"}, +}; +static const struct lc_timezone_era eras_Indian_Cocos[] = { + {NULL, 0, 23260, -2209012060LL, 0, "LMT\0", "\0"}, + {NULL, 0, 23400, 0, 0, "+0630\0", "\0"}, +}; +static const struct lc_timezone_era eras_Indian_Kerguelen[] = { + {NULL, 0, 0, -631152000LL, 0, "-00\0", "\0"}, + {NULL, 0, 18000, 0, 0, "+05\0", "\0"}, +}; +static const struct lc_timezone_era eras_Indian_Mahe[] = { + {NULL, 0, 13308, -2006653308LL, 0, "LMT\0", "\0"}, + {NULL, 0, 14400, 0, 0, "+04\0", "\0"}, +}; +static const struct lc_timezone_era eras_Indian_Maldives[] = { + {NULL, 0, 17640, -2840158440LL, 0, "LMT\0", "\0"}, + {NULL, 0, 17640, -315636840LL, 0, "MMT\0", "\0"}, + {NULL, 0, 18000, 0, 0, "+05\0", "\0"}, +}; +static const struct lc_timezone_era eras_Indian_Mauritius[] = { + {NULL, 0, 13800, -1988164200LL, 0, "LMT\0", "\0"}, + {rules_Mauritius, 4, 14400, 0, 0, "+04\0", "+05\0"}, +}; +static const struct lc_timezone_era eras_Indian_Reunion[] = { + {NULL, 0, 13312, -1848886912LL, 0, "LMT\0", "\0"}, + {NULL, 0, 14400, 0, 0, "+04\0", "\0"}, +}; +static const struct lc_timezone_era eras_MET[] = { + {rules_C_Eur, 17, 3600, 0, 0, "ME%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_MST[] = { + {NULL, 0, -25200, 0, 0, "MST\0", "\0"}, +}; +static const struct lc_timezone_era eras_MST7MDT[] = { + {rules_US, 13, -25200, 0, 0, "M%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_PST8PDT[] = { + {rules_US, 13, -28800, 0, 0, "P%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Apia[] = { + {NULL, 0, 45184, -2855737984LL, 0, "LMT\0", "\0"}, + {NULL, 0, -41216, -1861878784LL, 0, "LMT\0", "\0"}, + {NULL, 0, -41400, -631110600LL, 0, "-1130\0", "\0"}, + {rules_WS, 5, -39600, 1325239200LL, 6, "-11\0", "-10\0"}, + {rules_WS, 5, 46800, 0, 0, "+13\0", "+14\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Auckland[] = { + {NULL, 0, 41944, -3192435544LL, 0, "LMT\0", "\0"}, + {rules_NZ, 16, 41400, -757425600LL, 3, "NZ%sT\0", "\0"}, + {rules_NZ, 16, 43200, 0, 0, "NZ%sT\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Bougainville[] = { + {NULL, 0, 37336, -2840178136LL, 0, "LMT\0", "\0"}, + {NULL, 0, 35312, -2366790512LL, 0, "PMMT\0", "\0"}, + {NULL, 0, 36000, -868010400LL, 0, "+10\0", "\0"}, + {NULL, 0, 32400, -768906000LL, 0, "+09\0", "\0"}, + {NULL, 0, 36000, 1419696000LL, 0, "+10\0", "\0"}, + {NULL, 0, 39600, 0, 0, "+11\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Chatham[] = { + {NULL, 0, 44028, -3192437628LL, 0, "LMT\0", "\0"}, + {NULL, 0, 44100, -757426500LL, 0, "+1215\0", "\0"}, + {rules_Chatham, 9, 45900, 0, 0, "+1245\0", "+1345\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Chuuk[] = { + {NULL, 0, 36428, -2177489228LL, 0, "LMT\0", "\0"}, + {NULL, 0, 36000, 0, 0, "+10\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Easter[] = { + {NULL, 0, -26248, -2524495352LL, 0, "LMT\0", "\0"}, + {NULL, 0, -26248, -1178124152LL, 0, "EMT\0", "\0"}, + {rules_Chile, 32, -25200, 384922800LL, 6, "-07\0", "-06\0"}, + {rules_Chile, 32, -21600, 0, 6, "-06\0", "-05\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Efate[] = { + {NULL, 0, 40396, -1829387596LL, 0, "LMT\0", "\0"}, + {rules_Vanuatu, 6, 39600, 0, 0, "+11\0", "+12\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Enderbury[] = { + {NULL, 0, -41060, -2177411740LL, 0, "LMT\0", "\0"}, + {NULL, 0, -43200, 307627200LL, 0, "-12\0", "\0"}, + {NULL, 0, -39600, 788958000LL, 0, "-11\0", "\0"}, + {NULL, 0, 46800, 0, 0, "+13\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Fakaofo[] = { + {NULL, 0, -41096, -2177411704LL, 0, "LMT\0", "\0"}, + {NULL, 0, -39600, 1325242800LL, 0, "-11\0", "\0"}, + {NULL, 0, 46800, 0, 0, "+13\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Fiji[] = { + {NULL, 0, 42944, -1709985344LL, 0, "LMT\0", "\0"}, + {rules_Fiji, 10, 43200, 0, 0, "+12\0", "+13\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Funafuti[] = { + {NULL, 0, 43012, -2177495812LL, 0, "LMT\0", "\0"}, + {NULL, 0, 43200, 0, 0, "+12\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Galapagos[] = { + {NULL, 0, -21504, -1230746496LL, 0, "LMT\0", "\0"}, + {NULL, 0, -18000, 504939600LL, 0, "-05\0", "\0"}, + {rules_Ecuador, 2, -21600, 0, 0, "-06\0", "-05\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Gambier[] = { + {NULL, 0, -32388, -1806678012LL, 0, "LMT\0", "\0"}, + {NULL, 0, -32400, 0, 0, "-09\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Guadalcanal[] = { + {NULL, 0, 38388, -1806748788LL, 0, "LMT\0", "\0"}, + {NULL, 0, 39600, 0, 0, "+11\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Guam[] = { + {NULL, 0, -51660, -3944626740LL, 0, "LMT\0", "\0"}, + {NULL, 0, 34740, -2177487540LL, 0, "LMT\0", "\0"}, + {NULL, 0, 36000, 977493600LL, 0, "GST\0", "\0"}, + {NULL, 0, 36000, 0, 0, "ChST\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Honolulu[] = { + {NULL, 0, -37886, -2334101314LL, 0, "LMT\0", "\0"}, + {NULL, 0, -37800, -1157283000LL, 0, "HST\0", "\0"}, + {rules_100, 1, -37800, -1155436200LL, 6, "HDT\0", "\0"}, + {NULL, 0, -37800, -880198200LL, 0, "HST\0", "\0"}, + {rules_100, 1, -37800, -765376200LL, 6, "HDT\0", "\0"}, + {NULL, 0, -37800, -712150200LL, 0, "HST\0", "\0"}, + {NULL, 0, -36000, 0, 0, "HST\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Kiritimati[] = { + {NULL, 0, -37760, -2177415040LL, 0, "LMT\0", "\0"}, + {NULL, 0, -38400, 307622400LL, 0, "-1040\0", "\0"}, + {NULL, 0, -36000, 788954400LL, 0, "-10\0", "\0"}, + {NULL, 0, 50400, 0, 0, "+14\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Kosrae[] = { + {NULL, 0, 39116, -2177491916LL, 0, "LMT\0", "\0"}, + {NULL, 0, 39600, -7988400LL, 0, "+11\0", "\0"}, + {NULL, 0, 43200, 915105600LL, 0, "+12\0", "\0"}, + {NULL, 0, 39600, 0, 0, "+11\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Kwajalein[] = { + {NULL, 0, 40160, -2177492960LL, 0, "LMT\0", "\0"}, + {NULL, 0, 39600, -7988400LL, 0, "+11\0", "\0"}, + {NULL, 0, -43200, 745848000LL, 0, "-12\0", "\0"}, + {NULL, 0, 43200, 0, 0, "+12\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Majuro[] = { + {NULL, 0, 41088, -2177493888LL, 0, "LMT\0", "\0"}, + {NULL, 0, 39600, -7988400LL, 0, "+11\0", "\0"}, + {NULL, 0, 43200, 0, 0, "+12\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Marquesas[] = { + {NULL, 0, -33480, -1806676920LL, 0, "LMT\0", "\0"}, + {NULL, 0, -34200, 0, 0, "-0930\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Nauru[] = { + {NULL, 0, 40060, -1545131260LL, 0, "LMT\0", "\0"}, + {NULL, 0, 41400, -877347000LL, 0, "+1130\0", "\0"}, + {NULL, 0, 32400, -800960400LL, 0, "+09\0", "\0"}, + {NULL, 0, 41400, 294323400LL, 0, "+1130\0", "\0"}, + {NULL, 0, 43200, 0, 0, "+12\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Niue[] = { + {NULL, 0, -40780, -2177412020LL, 0, "LMT\0", "\0"}, + {NULL, 0, -40800, -599575200LL, 0, "-1120\0", "\0"}, + {NULL, 0, -41400, 276089400LL, 0, "-1130\0", "\0"}, + {NULL, 0, -39600, 0, 0, "-11\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Norfolk[] = { + {NULL, 0, 40312, -2177493112LL, 0, "LMT\0", "\0"}, + {NULL, 0, 40320, -599656320LL, 0, "+1112\0", "\0"}, + {NULL, 0, 41400, 152029800LL, 0, "+1130\0", "\0"}, + {rules_100, 1, 41400, 162912600LL, 6, "+1230\0", "\0"}, + {NULL, 0, 41400, 1443882600LL, 0, "+1130\0", "\0"}, + {NULL, 0, 39600, 0, 0, "+11\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Noumea[] = { + {NULL, 0, 39948, -1829387148LL, 0, "LMT\0", "\0"}, + {rules_NC, 4, 39600, 0, 0, "+11\0", "+12\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Pago_Pago[] = { + {NULL, 0, 45432, -2855738232LL, 0, "LMT\0", "\0"}, + {NULL, 0, -40968, -1861879032LL, 0, "LMT\0", "\0"}, + {NULL, 0, -39600, 0, 0, "SST\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Palau[] = { + {NULL, 0, 32276, -2177485076LL, 0, "LMT\0", "\0"}, + {NULL, 0, 32400, 0, 0, "+09\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Pitcairn[] = { + {NULL, 0, -31220, -2177421580LL, 0, "LMT\0", "\0"}, + {NULL, 0, -30600, 893665800LL, 0, "-0830\0", "\0"}, + {NULL, 0, -28800, 0, 0, "-08\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Pohnpei[] = { + {NULL, 0, 37972, -2177490772LL, 0, "LMT\0", "\0"}, + {NULL, 0, 39600, 0, 0, "+11\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Port_Moresby[] = { + {NULL, 0, 35320, -2840176120LL, 0, "LMT\0", "\0"}, + {NULL, 0, 35312, -2366790512LL, 0, "PMMT\0", "\0"}, + {NULL, 0, 36000, 0, 0, "+10\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Rarotonga[] = { + {NULL, 0, -38344, -2177414456LL, 0, "LMT\0", "\0"}, + {NULL, 0, -37800, 279714600LL, 0, "-1030\0", "\0"}, + {rules_Cook, 3, -36000, 0, 0, "-10\0", "-0930\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Tahiti[] = { + {NULL, 0, -35896, -1806674504LL, 0, "LMT\0", "\0"}, + {NULL, 0, -36000, 0, 0, "-10\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Tarawa[] = { + {NULL, 0, 41524, -2177494324LL, 0, "LMT\0", "\0"}, + {NULL, 0, 43200, 0, 0, "+12\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Tongatapu[] = { + {NULL, 0, 44360, -2177497160LL, 0, "LMT\0", "\0"}, + {NULL, 0, 44400, -915193200LL, 0, "+1220\0", "\0"}, + {NULL, 0, 46800, 915102000LL, 0, "+13\0", "\0"}, + {rules_Tonga, 6, 46800, 0, 0, "+13\0", "+14\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Wake[] = { + {NULL, 0, 39988, -2177492788LL, 0, "LMT\0", "\0"}, + {NULL, 0, 43200, 0, 0, "+12\0", "\0"}, +}; +static const struct lc_timezone_era eras_Pacific_Wallis[] = { + {NULL, 0, 44120, -2177496920LL, 0, "LMT\0", "\0"}, + {NULL, 0, 43200, 0, 0, "+12\0", "\0"}, +}; +static const struct lc_timezone_era eras_WET[] = { + {rules_EU, 6, 0, 0, 0, "WE%sT\0", "\0"}, +}; +static const char timezone_names[] = + "Africa/Abidjan\0" + "Africa/Accra\0" + "Africa/Addis_Ababa\0" + "Africa/Algiers\0" + "Africa/Asmara\0" + "Africa/Asmera\0" + "Africa/Bamako\0" + "Africa/Bangui\0" + "Africa/Banjul\0" + "Africa/Bissau\0" + "Africa/Blantyre\0" + "Africa/Brazzaville\0" + "Africa/Bujumbura\0" + "Africa/Cairo\0" + "Africa/Casablanca\0" + "Africa/Ceuta\0" + "Africa/Conakry\0" + "Africa/Dakar\0" + "Africa/Dar_es_Salaam\0" + "Africa/Djibouti\0" + "Africa/Douala\0" + "Africa/El_Aaiun\0" + "Africa/Freetown\0" + "Africa/Gaborone\0" + "Africa/Harare\0" + "Africa/Johannesburg\0" + "Africa/Juba\0" + "Africa/Kampala\0" + "Africa/Khartoum\0" + "Africa/Kigali\0" + "Africa/Kinshasa\0" + "Africa/Lagos\0" + "Africa/Libreville\0" + "Africa/Lome\0" + "Africa/Luanda\0" + "Africa/Lubumbashi\0" + "Africa/Lusaka\0" + "Africa/Malabo\0" + "Africa/Maputo\0" + "Africa/Maseru\0" + "Africa/Mbabane\0" + "Africa/Mogadishu\0" + "Africa/Monrovia\0" + "Africa/Nairobi\0" + "Africa/Ndjamena\0" + "Africa/Niamey\0" + "Africa/Nouakchott\0" + "Africa/Ouagadougou\0" + "Africa/Porto-Novo\0" + "Africa/Sao_Tome\0" + "Africa/Timbuktu\0" + "Africa/Tripoli\0" + "Africa/Tunis\0" + "Africa/Windhoek\0" + "America/Adak\0" + "America/Anchorage\0" + "America/Anguilla\0" + "America/Antigua\0" + "America/Araguaina\0" + "America/Argentina/Buenos_Aires\0" + "America/Argentina/Catamarca\0" + "America/Argentina/ComodRivadavia\0" + "America/Argentina/Cordoba\0" + "America/Argentina/Jujuy\0" + "America/Argentina/La_Rioja\0" + "America/Argentina/Mendoza\0" + "America/Argentina/Rio_Gallegos\0" + "America/Argentina/Salta\0" + "America/Argentina/San_Juan\0" + "America/Argentina/San_Luis\0" + "America/Argentina/Tucuman\0" + "America/Argentina/Ushuaia\0" + "America/Aruba\0" + "America/Asuncion\0" + "America/Atikokan\0" + "America/Atka\0" + "America/Bahia\0" + "America/Bahia_Banderas\0" + "America/Barbados\0" + "America/Belem\0" + "America/Belize\0" + "America/Blanc-Sablon\0" + "America/Boa_Vista\0" + "America/Bogota\0" + "America/Boise\0" + "America/Buenos_Aires\0" + "America/Cambridge_Bay\0" + "America/Campo_Grande\0" + "America/Cancun\0" + "America/Caracas\0" + "America/Catamarca\0" + "America/Cayenne\0" + "America/Cayman\0" + "America/Chicago\0" + "America/Chihuahua\0" + "America/Coral_Harbour\0" + "America/Cordoba\0" + "America/Costa_Rica\0" + "America/Creston\0" + "America/Cuiaba\0" + "America/Curacao\0" + "America/Danmarkshavn\0" + "America/Dawson\0" + "America/Dawson_Creek\0" + "America/Denver\0" + "America/Detroit\0" + "America/Dominica\0" + "America/Edmonton\0" + "America/Eirunepe\0" + "America/El_Salvador\0" + "America/Ensenada\0" + "America/Fort_Nelson\0" + "America/Fort_Wayne\0" + "America/Fortaleza\0" + "America/Glace_Bay\0" + "America/Godthab\0" + "America/Goose_Bay\0" + "America/Grand_Turk\0" + "America/Grenada\0" + "America/Guadeloupe\0" + "America/Guatemala\0" + "America/Guayaquil\0" + "America/Guyana\0" + "America/Halifax\0" + "America/Havana\0" + "America/Hermosillo\0" + "America/Indiana/Indianapolis\0" + "America/Indiana/Knox\0" + "America/Indiana/Marengo\0" + "America/Indiana/Petersburg\0" + "America/Indiana/Tell_City\0" + "America/Indiana/Vevay\0" + "America/Indiana/Vincennes\0" + "America/Indiana/Winamac\0" + "America/Indianapolis\0" + "America/Inuvik\0" + "America/Iqaluit\0" + "America/Jamaica\0" + "America/Jujuy\0" + "America/Juneau\0" + "America/Kentucky/Louisville\0" + "America/Kentucky/Monticello\0" + "America/Knox_IN\0" + "America/Kralendijk\0" + "America/La_Paz\0" + "America/Lima\0" + "America/Los_Angeles\0" + "America/Louisville\0" + "America/Lower_Princes\0" + "America/Maceio\0" + "America/Managua\0" + "America/Manaus\0" + "America/Marigot\0" + "America/Martinique\0" + "America/Matamoros\0" + "America/Mazatlan\0" + "America/Mendoza\0" + "America/Menominee\0" + "America/Merida\0" + "America/Metlakatla\0" + "America/Mexico_City\0" + "America/Miquelon\0" + "America/Moncton\0" + "America/Monterrey\0" + "America/Montevideo\0" + "America/Montreal\0" + "America/Montserrat\0" + "America/Nassau\0" + "America/New_York\0" + "America/Nipigon\0" + "America/Nome\0" + "America/Noronha\0" + "America/North_Dakota/Beulah\0" + "America/North_Dakota/Center\0" + "America/North_Dakota/New_Salem\0" + "America/Ojinaga\0" + "America/Panama\0" + "America/Pangnirtung\0" + "America/Paramaribo\0" + "America/Phoenix\0" + "America/Port-au-Prince\0" + "America/Port_of_Spain\0" + "America/Porto_Acre\0" + "America/Porto_Velho\0" + "America/Puerto_Rico\0" + "America/Punta_Arenas\0" + "America/Rainy_River\0" + "America/Rankin_Inlet\0" + "America/Recife\0" + "America/Regina\0" + "America/Resolute\0" + "America/Rio_Branco\0" + "America/Rosario\0" + "America/Santa_Isabel\0" + "America/Santarem\0" + "America/Santiago\0" + "America/Santo_Domingo\0" + "America/Sao_Paulo\0" + "America/Scoresbysund\0" + "America/Shiprock\0" + "America/Sitka\0" + "America/St_Barthelemy\0" + "America/St_Johns\0" + "America/St_Kitts\0" + "America/St_Lucia\0" + "America/St_Thomas\0" + "America/St_Vincent\0" + "America/Swift_Current\0" + "America/Tegucigalpa\0" + "America/Thule\0" + "America/Thunder_Bay\0" + "America/Tijuana\0" + "America/Toronto\0" + "America/Tortola\0" + "America/Vancouver\0" + "America/Virgin\0" + "America/Whitehorse\0" + "America/Winnipeg\0" + "America/Yakutat\0" + "America/Yellowknife\0" + "Antarctica/Casey\0" + "Antarctica/Davis\0" + "Antarctica/DumontDUrville\0" + "Antarctica/Macquarie\0" + "Antarctica/Mawson\0" + "Antarctica/McMurdo\0" + "Antarctica/Palmer\0" + "Antarctica/Rothera\0" + "Antarctica/South_Pole\0" + "Antarctica/Syowa\0" + "Antarctica/Troll\0" + "Antarctica/Vostok\0" + "Arctic/Longyearbyen\0" + "Asia/Aden\0" + "Asia/Almaty\0" + "Asia/Amman\0" + "Asia/Anadyr\0" + "Asia/Aqtau\0" + "Asia/Aqtobe\0" + "Asia/Ashgabat\0" + "Asia/Ashkhabad\0" + "Asia/Atyrau\0" + "Asia/Baghdad\0" + "Asia/Bahrain\0" + "Asia/Baku\0" + "Asia/Bangkok\0" + "Asia/Barnaul\0" + "Asia/Beirut\0" + "Asia/Bishkek\0" + "Asia/Brunei\0" + "Asia/Calcutta\0" + "Asia/Chita\0" + "Asia/Choibalsan\0" + "Asia/Chongqing\0" + "Asia/Chungking\0" + "Asia/Colombo\0" + "Asia/Dacca\0" + "Asia/Damascus\0" + "Asia/Dhaka\0" + "Asia/Dili\0" + "Asia/Dubai\0" + "Asia/Dushanbe\0" + "Asia/Famagusta\0" + "Asia/Gaza\0" + "Asia/Harbin\0" + "Asia/Hebron\0" + "Asia/Ho_Chi_Minh\0" + "Asia/Hong_Kong\0" + "Asia/Hovd\0" + "Asia/Irkutsk\0" + "Asia/Istanbul\0" + "Asia/Jakarta\0" + "Asia/Jayapura\0" + "Asia/Jerusalem\0" + "Asia/Kabul\0" + "Asia/Kamchatka\0" + "Asia/Karachi\0" + "Asia/Kashgar\0" + "Asia/Kathmandu\0" + "Asia/Katmandu\0" + "Asia/Khandyga\0" + "Asia/Kolkata\0" + "Asia/Krasnoyarsk\0" + "Asia/Kuala_Lumpur\0" + "Asia/Kuching\0" + "Asia/Kuwait\0" + "Asia/Macao\0" + "Asia/Macau\0" + "Asia/Magadan\0" + "Asia/Makassar\0" + "Asia/Manila\0" + "Asia/Muscat\0" + "Asia/Nicosia\0" + "Asia/Novokuznetsk\0" + "Asia/Novosibirsk\0" + "Asia/Omsk\0" + "Asia/Oral\0" + "Asia/Phnom_Penh\0" + "Asia/Pontianak\0" + "Asia/Pyongyang\0" + "Asia/Qatar\0" + "Asia/Qyzylorda\0" + "Asia/Rangoon\0" + "Asia/Riyadh\0" + "Asia/Saigon\0" + "Asia/Sakhalin\0" + "Asia/Samarkand\0" + "Asia/Seoul\0" + "Asia/Shanghai\0" + "Asia/Singapore\0" + "Asia/Srednekolymsk\0" + "Asia/Taipei\0" + "Asia/Tashkent\0" + "Asia/Tbilisi\0" + "Asia/Tehran\0" + "Asia/Tel_Aviv\0" + "Asia/Thimbu\0" + "Asia/Thimphu\0" + "Asia/Tokyo\0" + "Asia/Tomsk\0" + "Asia/Ujung_Pandang\0" + "Asia/Ulaanbaatar\0" + "Asia/Ulan_Bator\0" + "Asia/Urumqi\0" + "Asia/Ust-Nera\0" + "Asia/Vientiane\0" + "Asia/Vladivostok\0" + "Asia/Yakutsk\0" + "Asia/Yangon\0" + "Asia/Yekaterinburg\0" + "Asia/Yerevan\0" + "Atlantic/Azores\0" + "Atlantic/Bermuda\0" + "Atlantic/Canary\0" + "Atlantic/Cape_Verde\0" + "Atlantic/Faeroe\0" + "Atlantic/Faroe\0" + "Atlantic/Jan_Mayen\0" + "Atlantic/Madeira\0" + "Atlantic/Reykjavik\0" + "Atlantic/South_Georgia\0" + "Atlantic/St_Helena\0" + "Atlantic/Stanley\0" + "Australia/ACT\0" + "Australia/Adelaide\0" + "Australia/Brisbane\0" + "Australia/Broken_Hill\0" + "Australia/Canberra\0" + "Australia/Currie\0" + "Australia/Darwin\0" + "Australia/Eucla\0" + "Australia/Hobart\0" + "Australia/LHI\0" + "Australia/Lindeman\0" + "Australia/Lord_Howe\0" + "Australia/Melbourne\0" + "Australia/NSW\0" + "Australia/North\0" + "Australia/Perth\0" + "Australia/Queensland\0" + "Australia/South\0" + "Australia/Sydney\0" + "Australia/Tasmania\0" + "Australia/Victoria\0" + "Australia/West\0" + "Australia/Yancowinna\0" + "Brazil/Acre\0" + "Brazil/DeNoronha\0" + "Brazil/East\0" + "Brazil/West\0" + "CET\0" + "CST6CDT\0" + "Canada/Atlantic\0" + "Canada/Central\0" + "Canada/East-Saskatchewan\0" + "Canada/Eastern\0" + "Canada/Mountain\0" + "Canada/Newfoundland\0" + "Canada/Pacific\0" + "Canada/Saskatchewan\0" + "Canada/Yukon\0" + "Chile/Continental\0" + "Chile/EasterIsland\0" + "Cuba\0" + "EET\0" + "EST\0" + "EST5EDT\0" + "Egypt\0" + "Eire\0" + "Etc/GMT\0" + "Etc/GMT+0\0" + "Etc/GMT+1\0" + "Etc/GMT+10\0" + "Etc/GMT+11\0" + "Etc/GMT+12\0" + "Etc/GMT+2\0" + "Etc/GMT+3\0" + "Etc/GMT+4\0" + "Etc/GMT+5\0" + "Etc/GMT+6\0" + "Etc/GMT+7\0" + "Etc/GMT+8\0" + "Etc/GMT+9\0" + "Etc/GMT-0\0" + "Etc/GMT-1\0" + "Etc/GMT-10\0" + "Etc/GMT-11\0" + "Etc/GMT-12\0" + "Etc/GMT-13\0" + "Etc/GMT-14\0" + "Etc/GMT-2\0" + "Etc/GMT-3\0" + "Etc/GMT-4\0" + "Etc/GMT-5\0" + "Etc/GMT-6\0" + "Etc/GMT-7\0" + "Etc/GMT-8\0" + "Etc/GMT-9\0" + "Etc/GMT0\0" + "Etc/Greenwich\0" + "Etc/UCT\0" + "Etc/UTC\0" + "Etc/Universal\0" + "Etc/Zulu\0" + "Europe/Amsterdam\0" + "Europe/Andorra\0" + "Europe/Astrakhan\0" + "Europe/Athens\0" + "Europe/Belfast\0" + "Europe/Belgrade\0" + "Europe/Berlin\0" + "Europe/Bratislava\0" + "Europe/Brussels\0" + "Europe/Bucharest\0" + "Europe/Budapest\0" + "Europe/Busingen\0" + "Europe/Chisinau\0" + "Europe/Copenhagen\0" + "Europe/Dublin\0" + "Europe/Gibraltar\0" + "Europe/Guernsey\0" + "Europe/Helsinki\0" + "Europe/Isle_of_Man\0" + "Europe/Istanbul\0" + "Europe/Jersey\0" + "Europe/Kaliningrad\0" + "Europe/Kiev\0" + "Europe/Kirov\0" + "Europe/Lisbon\0" + "Europe/Ljubljana\0" + "Europe/London\0" + "Europe/Luxembourg\0" + "Europe/Madrid\0" + "Europe/Malta\0" + "Europe/Mariehamn\0" + "Europe/Minsk\0" + "Europe/Monaco\0" + "Europe/Moscow\0" + "Europe/Nicosia\0" + "Europe/Oslo\0" + "Europe/Paris\0" + "Europe/Podgorica\0" + "Europe/Prague\0" + "Europe/Riga\0" + "Europe/Rome\0" + "Europe/Samara\0" + "Europe/San_Marino\0" + "Europe/Sarajevo\0" + "Europe/Saratov\0" + "Europe/Simferopol\0" + "Europe/Skopje\0" + "Europe/Sofia\0" + "Europe/Stockholm\0" + "Europe/Tallinn\0" + "Europe/Tirane\0" + "Europe/Tiraspol\0" + "Europe/Ulyanovsk\0" + "Europe/Uzhgorod\0" + "Europe/Vaduz\0" + "Europe/Vatican\0" + "Europe/Vienna\0" + "Europe/Vilnius\0" + "Europe/Volgograd\0" + "Europe/Warsaw\0" + "Europe/Zagreb\0" + "Europe/Zaporozhye\0" + "Europe/Zurich\0" + "GB\0" + "GB-Eire\0" + "GMT\0" + "GMT+0\0" + "GMT-0\0" + "GMT0\0" + "Greenwich\0" + "HST\0" + "Hongkong\0" + "Iceland\0" + "Indian/Antananarivo\0" + "Indian/Chagos\0" + "Indian/Christmas\0" + "Indian/Cocos\0" + "Indian/Comoro\0" + "Indian/Kerguelen\0" + "Indian/Mahe\0" + "Indian/Maldives\0" + "Indian/Mauritius\0" + "Indian/Mayotte\0" + "Indian/Reunion\0" + "Iran\0" + "Israel\0" + "Jamaica\0" + "Japan\0" + "Kwajalein\0" + "Libya\0" + "MET\0" + "MST\0" + "MST7MDT\0" + "Mexico/BajaNorte\0" + "Mexico/BajaSur\0" + "Mexico/General\0" + "NZ\0" + "NZ-CHAT\0" + "Navajo\0" + "PRC\0" + "PST8PDT\0" + "Pacific/Apia\0" + "Pacific/Auckland\0" + "Pacific/Bougainville\0" + "Pacific/Chatham\0" + "Pacific/Chuuk\0" + "Pacific/Easter\0" + "Pacific/Efate\0" + "Pacific/Enderbury\0" + "Pacific/Fakaofo\0" + "Pacific/Fiji\0" + "Pacific/Funafuti\0" + "Pacific/Galapagos\0" + "Pacific/Gambier\0" + "Pacific/Guadalcanal\0" + "Pacific/Guam\0" + "Pacific/Honolulu\0" + "Pacific/Johnston\0" + "Pacific/Kiritimati\0" + "Pacific/Kosrae\0" + "Pacific/Kwajalein\0" + "Pacific/Majuro\0" + "Pacific/Marquesas\0" + "Pacific/Midway\0" + "Pacific/Nauru\0" + "Pacific/Niue\0" + "Pacific/Norfolk\0" + "Pacific/Noumea\0" + "Pacific/Pago_Pago\0" + "Pacific/Palau\0" + "Pacific/Pitcairn\0" + "Pacific/Pohnpei\0" + "Pacific/Ponape\0" + "Pacific/Port_Moresby\0" + "Pacific/Rarotonga\0" + "Pacific/Saipan\0" + "Pacific/Samoa\0" + "Pacific/Tahiti\0" + "Pacific/Tarawa\0" + "Pacific/Tongatapu\0" + "Pacific/Truk\0" + "Pacific/Wake\0" + "Pacific/Wallis\0" + "Pacific/Yap\0" + "Poland\0" + "Portugal\0" + "ROC\0" + "ROK\0" + "Singapore\0" + "Turkey\0" + "UCT\0" + "US/Alaska\0" + "US/Aleutian\0" + "US/Arizona\0" + "US/Central\0" + "US/East-Indiana\0" + "US/Eastern\0" + "US/Hawaii\0" + "US/Indiana-Starke\0" + "US/Michigan\0" + "US/Mountain\0" + "US/Pacific\0" + "US/Pacific-New\0" + "US/Samoa\0" + "UTC\0" + "Universal\0" + "W-SU\0" + "WET\0" + "Zulu\0" +; +static const struct lc_timezone timezones[] = { + {eras_Africa_Abidjan, 2}, + {eras_Africa_Accra, 2}, + {eras_Africa_Nairobi, 5}, + {eras_Africa_Algiers, 10}, + {eras_Africa_Nairobi, 5}, + {eras_Africa_Nairobi, 5}, + {eras_Africa_Abidjan, 2}, + {eras_Africa_Lagos, 2}, + {eras_Africa_Abidjan, 2}, + {eras_Africa_Bissau, 3}, + {eras_Africa_Maputo, 2}, + {eras_Africa_Lagos, 2}, + {eras_Africa_Maputo, 2}, + {eras_Africa_Cairo, 2}, + {eras_Africa_Casablanca, 4}, + {eras_Africa_Ceuta, 8}, + {eras_Africa_Abidjan, 2}, + {eras_Africa_Abidjan, 2}, + {eras_Africa_Nairobi, 5}, + {eras_Africa_Nairobi, 5}, + {eras_Africa_Lagos, 2}, + {eras_Africa_El_Aaiun, 3}, + {eras_Africa_Abidjan, 2}, + {eras_Africa_Maputo, 2}, + {eras_Africa_Maputo, 2}, + {eras_Africa_Johannesburg, 3}, + {eras_Africa_Khartoum, 3}, + {eras_Africa_Nairobi, 5}, + {eras_Africa_Khartoum, 3}, + {eras_Africa_Maputo, 2}, + {eras_Africa_Lagos, 2}, + {eras_Africa_Lagos, 2}, + {eras_Africa_Lagos, 2}, + {eras_Africa_Abidjan, 2}, + {eras_Africa_Lagos, 2}, + {eras_Africa_Maputo, 2}, + {eras_Africa_Maputo, 2}, + {eras_Africa_Lagos, 2}, + {eras_Africa_Maputo, 2}, + {eras_Africa_Johannesburg, 3}, + {eras_Africa_Johannesburg, 3}, + {eras_Africa_Nairobi, 5}, + {eras_Africa_Monrovia, 4}, + {eras_Africa_Nairobi, 5}, + {eras_Africa_Ndjamena, 4}, + {eras_Africa_Lagos, 2}, + {eras_Africa_Abidjan, 2}, + {eras_Africa_Abidjan, 2}, + {eras_Africa_Lagos, 2}, + {eras_Africa_Abidjan, 2}, + {eras_Africa_Abidjan, 2}, + {eras_Africa_Tripoli, 9}, + {eras_Africa_Tunis, 3}, + {eras_Africa_Windhoek, 7}, + {eras_America_Adak, 9}, + {eras_America_Anchorage, 8}, + {eras_America_Port_of_Spain, 2}, + {eras_America_Port_of_Spain, 2}, + {eras_America_Araguaina, 7}, + {eras_America_Argentina_Buenos_Aires, 7}, + {eras_America_Argentina_Catamarca, 12}, + {eras_America_Argentina_Catamarca, 12}, + {eras_America_Argentina_Cordoba, 9}, + {eras_America_Argentina_Jujuy, 13}, + {eras_America_Argentina_La_Rioja, 12}, + {eras_America_Argentina_Mendoza, 16}, + {eras_America_Argentina_Rio_Gallegos, 10}, + {eras_America_Argentina_Salta, 10}, + {eras_America_Argentina_San_Juan, 12}, + {eras_America_Argentina_San_Luis, 16}, + {eras_America_Argentina_Tucuman, 11}, + {eras_America_Argentina_Ushuaia, 10}, + {eras_America_Curacao, 3}, + {eras_America_Asuncion, 5}, + {eras_America_Atikokan, 5}, + {eras_America_Adak, 9}, + {eras_America_Bahia, 5}, + {eras_America_Bahia_Banderas, 11}, + {eras_America_Barbados, 3}, + {eras_America_Belem, 3}, + {eras_America_Belize, 2}, + {eras_America_Blanc_Sablon, 3}, + {eras_America_Boa_Vista, 5}, + {eras_America_Bogota, 3}, + {eras_America_Boise, 5}, + {eras_America_Argentina_Buenos_Aires, 7}, + {eras_America_Cambridge_Bay, 6}, + {eras_America_Campo_Grande, 2}, + {eras_America_Cancun, 5}, + {eras_America_Caracas, 6}, + {eras_America_Argentina_Catamarca, 12}, + {eras_America_Cayenne, 3}, + {eras_America_Panama, 3}, + {eras_America_Chicago, 8}, + {eras_America_Chihuahua, 10}, + {eras_America_Atikokan, 5}, + {eras_America_Argentina_Cordoba, 9}, + {eras_America_Costa_Rica, 3}, + {eras_America_Creston, 4}, + {eras_America_Cuiaba, 4}, + {eras_America_Curacao, 3}, + {eras_America_Danmarkshavn, 4}, + {eras_America_Dawson, 4}, + {eras_America_Dawson_Creek, 4}, + {eras_America_Denver, 6}, + {eras_America_Detroit, 8}, + {eras_America_Port_of_Spain, 2}, + {eras_America_Edmonton, 3}, + {eras_America_Eirunepe, 7}, + {eras_America_El_Salvador, 2}, + {eras_America_Tijuana, 19}, + {eras_America_Fort_Nelson, 6}, + {eras_America_Indiana_Indianapolis, 11}, + {eras_America_Fortaleza, 7}, + {eras_America_Glace_Bay, 6}, + {eras_America_Godthab, 3}, + {eras_America_Goose_Bay, 10}, + {eras_America_Grand_Turk, 5}, + {eras_America_Port_of_Spain, 2}, + {eras_America_Port_of_Spain, 2}, + {eras_America_Guatemala, 2}, + {eras_America_Guayaquil, 3}, + {eras_America_Guyana, 4}, + {eras_America_Halifax, 7}, + {eras_America_Havana, 3}, + {eras_America_Hermosillo, 11}, + {eras_America_Indiana_Indianapolis, 11}, + {eras_America_Indiana_Knox, 7}, + {eras_America_Indiana_Marengo, 9}, + {eras_America_Indiana_Petersburg, 8}, + {eras_America_Indiana_Tell_City, 7}, + {eras_America_Indiana_Vevay, 6}, + {eras_America_Indiana_Vincennes, 8}, + {eras_America_Indiana_Winamac, 8}, + {eras_America_Indiana_Indianapolis, 11}, + {eras_America_Inuvik, 4}, + {eras_America_Iqaluit, 4}, + {eras_America_Jamaica, 5}, + {eras_America_Argentina_Jujuy, 13}, + {eras_America_Juneau, 10}, + {eras_America_Kentucky_Louisville, 9}, + {eras_America_Kentucky_Monticello, 5}, + {eras_America_Indiana_Knox, 7}, + {eras_America_Curacao, 3}, + {eras_America_La_Paz, 4}, + {eras_America_Lima, 3}, + {eras_America_Los_Angeles, 4}, + {eras_America_Kentucky_Louisville, 9}, + {eras_America_Curacao, 3}, + {eras_America_Maceio, 9}, + {eras_America_Managua, 9}, + {eras_America_Manaus, 5}, + {eras_America_Port_of_Spain, 2}, + {eras_America_Martinique, 5}, + {eras_America_Matamoros, 5}, + {eras_America_Mazatlan, 10}, + {eras_America_Argentina_Mendoza, 16}, + {eras_America_Menominee, 5}, + {eras_America_Merida, 4}, + {eras_America_Metlakatla, 8}, + {eras_America_Mexico_City, 9}, + {eras_America_Miquelon, 4}, + {eras_America_Moncton, 9}, + {eras_America_Monterrey, 4}, + {eras_America_Montevideo, 8}, + {eras_America_Toronto, 6}, + {eras_America_Port_of_Spain, 2}, + {eras_America_Nassau, 3}, + {eras_America_New_York, 6}, + {eras_America_Nipigon, 4}, + {eras_America_Nome, 9}, + {eras_America_Noronha, 7}, + {eras_America_North_Dakota_Beulah, 3}, + {eras_America_North_Dakota_Center, 3}, + {eras_America_North_Dakota_New_Salem, 3}, + {eras_America_Ojinaga, 11}, + {eras_America_Panama, 3}, + {eras_America_Pangnirtung, 5}, + {eras_America_Paramaribo, 5}, + {eras_America_Phoenix, 7}, + {eras_America_Port_au_Prince, 3}, + {eras_America_Port_of_Spain, 2}, + {eras_America_Rio_Branco, 5}, + {eras_America_Porto_Velho, 3}, + {eras_America_Puerto_Rico, 4}, + {eras_America_Punta_Arenas, 13}, + {eras_America_Rainy_River, 4}, + {eras_America_Rankin_Inlet, 4}, + {eras_America_Recife, 7}, + {eras_America_Regina, 3}, + {eras_America_Resolute, 6}, + {eras_America_Rio_Branco, 5}, + {eras_America_Argentina_Cordoba, 9}, + {eras_America_Tijuana, 19}, + {eras_America_Santarem, 4}, + {eras_America_Santiago, 14}, + {eras_America_Santo_Domingo, 6}, + {eras_America_Sao_Paulo, 4}, + {eras_America_Scoresbysund, 4}, + {eras_America_Denver, 6}, + {eras_America_Sitka, 8}, + {eras_America_Port_of_Spain, 2}, + {eras_America_St_Johns, 8}, + {eras_America_Port_of_Spain, 2}, + {eras_America_Port_of_Spain, 2}, + {eras_America_Port_of_Spain, 2}, + {eras_America_Port_of_Spain, 2}, + {eras_America_Swift_Current, 5}, + {eras_America_Tegucigalpa, 2}, + {eras_America_Thule, 2}, + {eras_America_Thunder_Bay, 7}, + {eras_America_Tijuana, 19}, + {eras_America_Toronto, 6}, + {eras_America_Port_of_Spain, 2}, + {eras_America_Vancouver, 3}, + {eras_America_Port_of_Spain, 2}, + {eras_America_Whitehorse, 4}, + {eras_America_Winnipeg, 3}, + {eras_America_Yakutat, 7}, + {eras_America_Yellowknife, 3}, + {eras_Antarctica_Casey, 7}, + {eras_Antarctica_Davis, 8}, + {eras_Antarctica_DumontDUrville, 4}, + {eras_Antarctica_Macquarie, 8}, + {eras_Antarctica_Mawson, 3}, + {eras_Pacific_Auckland, 3}, + {eras_Antarctica_Palmer, 5}, + {eras_Antarctica_Rothera, 2}, + {eras_Pacific_Auckland, 3}, + {eras_Antarctica_Syowa, 2}, + {eras_Antarctica_Troll, 2}, + {eras_Antarctica_Vostok, 2}, + {eras_Europe_Oslo, 5}, + {eras_Asia_Riyadh, 2}, + {eras_Asia_Almaty, 6}, + {eras_Asia_Amman, 2}, + {eras_Asia_Anadyr, 8}, + {eras_Asia_Aqtau, 9}, + {eras_Asia_Aqtobe, 9}, + {eras_Asia_Ashgabat, 5}, + {eras_Asia_Ashgabat, 5}, + {eras_Asia_Atyrau, 9}, + {eras_Asia_Baghdad, 4}, + {eras_Asia_Qatar, 3}, + {eras_Asia_Baku, 7}, + {eras_Asia_Bangkok, 3}, + {eras_Asia_Barnaul, 9}, + {eras_Asia_Beirut, 2}, + {eras_Asia_Bishkek, 6}, + {eras_Asia_Brunei, 3}, + {eras_Asia_Kolkata, 6}, + {eras_Asia_Chita, 8}, + {eras_Asia_Choibalsan, 5}, + {eras_Asia_Shanghai, 3}, + {eras_Asia_Shanghai, 3}, + {eras_Asia_Colombo, 9}, + {eras_Asia_Dhaka, 7}, + {eras_Asia_Damascus, 2}, + {eras_Asia_Dhaka, 7}, + {eras_Asia_Dili, 5}, + {eras_Asia_Dubai, 2}, + {eras_Asia_Dushanbe, 5}, + {eras_Asia_Famagusta, 4}, + {eras_Asia_Gaza, 12}, + {eras_Asia_Shanghai, 3}, + {eras_Asia_Hebron, 6}, + {eras_Asia_Ho_Chi_Minh, 10}, + {eras_Asia_Hong_Kong, 4}, + {eras_Asia_Hovd, 3}, + {eras_Asia_Irkutsk, 8}, + {eras_Europe_Istanbul, 13}, + {eras_Asia_Jakarta, 9}, + {eras_Asia_Jayapura, 4}, + {eras_Asia_Jerusalem, 3}, + {eras_Asia_Kabul, 3}, + {eras_Asia_Kamchatka, 7}, + {eras_Asia_Karachi, 6}, + {eras_Asia_Urumqi, 2}, + {eras_Asia_Kathmandu, 3}, + {eras_Asia_Kathmandu, 3}, + {eras_Asia_Khandyga, 9}, + {eras_Asia_Kolkata, 6}, + {eras_Asia_Krasnoyarsk, 7}, + {eras_Asia_Kuala_Lumpur, 9}, + {eras_Asia_Kuching, 5}, + {eras_Asia_Riyadh, 2}, + {eras_Asia_Macau, 2}, + {eras_Asia_Macau, 2}, + {eras_Asia_Magadan, 8}, + {eras_Asia_Makassar, 5}, + {eras_Asia_Manila, 5}, + {eras_Asia_Dubai, 2}, + {eras_Asia_Nicosia, 3}, + {eras_Asia_Novokuznetsk, 7}, + {eras_Asia_Novosibirsk, 9}, + {eras_Asia_Omsk, 7}, + {eras_Asia_Oral, 10}, + {eras_Asia_Bangkok, 3}, + {eras_Asia_Pontianak, 9}, + {eras_Asia_Pyongyang, 5}, + {eras_Asia_Qatar, 3}, + {eras_Asia_Qyzylorda, 11}, + {eras_Asia_Yangon, 5}, + {eras_Asia_Riyadh, 2}, + {eras_Asia_Ho_Chi_Minh, 10}, + {eras_Asia_Sakhalin, 9}, + {eras_Asia_Samarkand, 7}, + {eras_Asia_Seoul, 6}, + {eras_Asia_Shanghai, 3}, + {eras_Asia_Singapore, 9}, + {eras_Asia_Srednekolymsk, 7}, + {eras_Asia_Taipei, 4}, + {eras_Asia_Tashkent, 5}, + {eras_Asia_Tbilisi, 11}, + {eras_Asia_Tehran, 5}, + {eras_Asia_Jerusalem, 3}, + {eras_Asia_Thimphu, 3}, + {eras_Asia_Thimphu, 3}, + {eras_Asia_Tokyo, 2}, + {eras_Asia_Tomsk, 9}, + {eras_Asia_Makassar, 5}, + {eras_Asia_Ulaanbaatar, 3}, + {eras_Asia_Ulaanbaatar, 3}, + {eras_Asia_Urumqi, 2}, + {eras_Asia_Ust_Nera, 9}, + {eras_Asia_Bangkok, 3}, + {eras_Asia_Vladivostok, 7}, + {eras_Asia_Yakutsk, 7}, + {eras_Asia_Yangon, 5}, + {eras_Asia_Yekaterinburg, 8}, + {eras_Asia_Yerevan, 6}, + {eras_Atlantic_Azores, 15}, + {eras_Atlantic_Bermuda, 4}, + {eras_Atlantic_Canary, 5}, + {eras_Atlantic_Cape_Verde, 5}, + {eras_Atlantic_Faroe, 3}, + {eras_Atlantic_Faroe, 3}, + {eras_Europe_Oslo, 5}, + {eras_Atlantic_Madeira, 13}, + {eras_Atlantic_Reykjavik, 3}, + {eras_Atlantic_South_Georgia, 2}, + {eras_Africa_Abidjan, 2}, + {eras_Atlantic_Stanley, 6}, + {eras_Australia_Sydney, 3}, + {eras_Australia_Adelaide, 4}, + {eras_Australia_Brisbane, 3}, + {eras_Australia_Broken_Hill, 6}, + {eras_Australia_Sydney, 3}, + {eras_Australia_Currie, 5}, + {eras_Australia_Darwin, 3}, + {eras_Australia_Eucla, 3}, + {eras_Australia_Hobart, 5}, + {eras_Australia_Lord_Howe, 4}, + {eras_Australia_Lindeman, 4}, + {eras_Australia_Lord_Howe, 4}, + {eras_Australia_Melbourne, 3}, + {eras_Australia_Sydney, 3}, + {eras_Australia_Darwin, 3}, + {eras_Australia_Perth, 3}, + {eras_Australia_Brisbane, 3}, + {eras_Australia_Adelaide, 4}, + {eras_Australia_Sydney, 3}, + {eras_Australia_Hobart, 5}, + {eras_Australia_Melbourne, 3}, + {eras_Australia_Perth, 3}, + {eras_Australia_Broken_Hill, 6}, + {eras_America_Rio_Branco, 5}, + {eras_America_Noronha, 7}, + {eras_America_Sao_Paulo, 4}, + {eras_America_Manaus, 5}, + {eras_CET, 1}, + {eras_CST6CDT, 1}, + {eras_America_Halifax, 7}, + {eras_America_Winnipeg, 3}, + {eras_America_Regina, 3}, + {eras_America_Toronto, 6}, + {eras_America_Edmonton, 3}, + {eras_America_St_Johns, 8}, + {eras_America_Vancouver, 3}, + {eras_America_Regina, 3}, + {eras_America_Whitehorse, 4}, + {eras_America_Santiago, 14}, + {eras_Pacific_Easter, 4}, + {eras_America_Havana, 3}, + {eras_EET, 1}, + {eras_EST, 1}, + {eras_EST5EDT, 1}, + {eras_Africa_Cairo, 2}, + {eras_Europe_Dublin, 13}, + {eras_Etc_GMT, 1}, + {eras_Etc_GMT, 1}, + {eras_Etc_GMT1, 1}, + {eras_Etc_GMT10, 1}, + {eras_Etc_GMT11, 1}, + {eras_Etc_GMT12, 1}, + {eras_Etc_GMT2, 1}, + {eras_Etc_GMT3, 1}, + {eras_Etc_GMT4, 1}, + {eras_Etc_GMT5, 1}, + {eras_Etc_GMT6, 1}, + {eras_Etc_GMT7, 1}, + {eras_Etc_GMT8, 1}, + {eras_Etc_GMT9, 1}, + {eras_Etc_GMT, 1}, + {eras_Etc_GMT_1, 1}, + {eras_Etc_GMT_10, 1}, + {eras_Etc_GMT_11, 1}, + {eras_Etc_GMT_12, 1}, + {eras_Etc_GMT_13, 1}, + {eras_Etc_GMT_14, 1}, + {eras_Etc_GMT_2, 1}, + {eras_Etc_GMT_3, 1}, + {eras_Etc_GMT_4, 1}, + {eras_Etc_GMT_5, 1}, + {eras_Etc_GMT_6, 1}, + {eras_Etc_GMT_7, 1}, + {eras_Etc_GMT_8, 1}, + {eras_Etc_GMT_9, 1}, + {eras_Etc_GMT, 1}, + {eras_Etc_GMT, 1}, + {eras_Etc_UCT, 1}, + {eras_Etc_UTC, 1}, + {eras_Etc_UTC, 1}, + {eras_Etc_UTC, 1}, + {eras_Europe_Amsterdam, 6}, + {eras_Europe_Andorra, 4}, + {eras_Europe_Astrakhan, 9}, + {eras_Europe_Athens, 6}, + {eras_Europe_London, 5}, + {eras_Europe_Belgrade, 7}, + {eras_Europe_Berlin, 5}, + {eras_Europe_Prague, 5}, + {eras_Europe_Brussels, 9}, + {eras_Europe_Bucharest, 7}, + {eras_Europe_Budapest, 6}, + {eras_Europe_Zurich, 4}, + {eras_Europe_Chisinau, 10}, + {eras_Europe_Copenhagen, 6}, + {eras_Europe_Dublin, 13}, + {eras_Europe_Gibraltar, 4}, + {eras_Europe_London, 5}, + {eras_Europe_Helsinki, 4}, + {eras_Europe_London, 5}, + {eras_Europe_Istanbul, 13}, + {eras_Europe_London, 5}, + {eras_Europe_Kaliningrad, 7}, + {eras_Europe_Kiev, 9}, + {eras_Europe_Kirov, 8}, + {eras_Europe_Lisbon, 8}, + {eras_Europe_Belgrade, 7}, + {eras_Europe_London, 5}, + {eras_Europe_Luxembourg, 7}, + {eras_Europe_Madrid, 4}, + {eras_Europe_Malta, 4}, + {eras_Europe_Helsinki, 4}, + {eras_Europe_Minsk, 9}, + {eras_Europe_Monaco, 5}, + {eras_Europe_Moscow, 11}, + {eras_Asia_Nicosia, 3}, + {eras_Europe_Oslo, 5}, + {eras_Europe_Paris, 7}, + {eras_Europe_Belgrade, 7}, + {eras_Europe_Prague, 5}, + {eras_Europe_Riga, 15}, + {eras_Europe_Rome, 6}, + {eras_Europe_Samara, 10}, + {eras_Europe_Rome, 6}, + {eras_Europe_Belgrade, 7}, + {eras_Europe_Saratov, 9}, + {eras_Europe_Simferopol, 16}, + {eras_Europe_Belgrade, 7}, + {eras_Europe_Sofia, 10}, + {eras_Europe_Stockholm, 6}, + {eras_Europe_Tallinn, 13}, + {eras_Europe_Tirane, 4}, + {eras_Europe_Chisinau, 10}, + {eras_Europe_Ulyanovsk, 9}, + {eras_Europe_Uzhgorod, 11}, + {eras_Europe_Zurich, 4}, + {eras_Europe_Rome, 6}, + {eras_Europe_Vienna, 8}, + {eras_Europe_Vilnius, 15}, + {eras_Europe_Volgograd, 9}, + {eras_Europe_Warsaw, 9}, + {eras_Europe_Belgrade, 7}, + {eras_Europe_Zaporozhye, 8}, + {eras_Europe_Zurich, 4}, + {eras_Europe_London, 5}, + {eras_Europe_London, 5}, + {eras_Etc_GMT, 1}, + {eras_Etc_GMT, 1}, + {eras_Etc_GMT, 1}, + {eras_Etc_GMT, 1}, + {eras_Etc_GMT, 1}, + {eras_HST, 1}, + {eras_Asia_Hong_Kong, 4}, + {eras_Atlantic_Reykjavik, 3}, + {eras_Africa_Nairobi, 5}, + {eras_Indian_Chagos, 3}, + {eras_Indian_Christmas, 2}, + {eras_Indian_Cocos, 2}, + {eras_Africa_Nairobi, 5}, + {eras_Indian_Kerguelen, 2}, + {eras_Indian_Mahe, 2}, + {eras_Indian_Maldives, 3}, + {eras_Indian_Mauritius, 2}, + {eras_Africa_Nairobi, 5}, + {eras_Indian_Reunion, 2}, + {eras_Asia_Tehran, 5}, + {eras_Asia_Jerusalem, 3}, + {eras_America_Jamaica, 5}, + {eras_Asia_Tokyo, 2}, + {eras_Pacific_Kwajalein, 4}, + {eras_Africa_Tripoli, 9}, + {eras_MET, 1}, + {eras_MST, 1}, + {eras_MST7MDT, 1}, + {eras_America_Tijuana, 19}, + {eras_America_Mazatlan, 10}, + {eras_America_Mexico_City, 9}, + {eras_Pacific_Auckland, 3}, + {eras_Pacific_Chatham, 3}, + {eras_America_Denver, 6}, + {eras_Asia_Shanghai, 3}, + {eras_PST8PDT, 1}, + {eras_Pacific_Apia, 5}, + {eras_Pacific_Auckland, 3}, + {eras_Pacific_Bougainville, 6}, + {eras_Pacific_Chatham, 3}, + {eras_Pacific_Chuuk, 2}, + {eras_Pacific_Easter, 4}, + {eras_Pacific_Efate, 2}, + {eras_Pacific_Enderbury, 4}, + {eras_Pacific_Fakaofo, 3}, + {eras_Pacific_Fiji, 2}, + {eras_Pacific_Funafuti, 2}, + {eras_Pacific_Galapagos, 3}, + {eras_Pacific_Gambier, 2}, + {eras_Pacific_Guadalcanal, 2}, + {eras_Pacific_Guam, 4}, + {eras_Pacific_Honolulu, 7}, + {eras_Pacific_Honolulu, 7}, + {eras_Pacific_Kiritimati, 4}, + {eras_Pacific_Kosrae, 4}, + {eras_Pacific_Kwajalein, 4}, + {eras_Pacific_Majuro, 3}, + {eras_Pacific_Marquesas, 2}, + {eras_Pacific_Pago_Pago, 3}, + {eras_Pacific_Nauru, 5}, + {eras_Pacific_Niue, 4}, + {eras_Pacific_Norfolk, 6}, + {eras_Pacific_Noumea, 2}, + {eras_Pacific_Pago_Pago, 3}, + {eras_Pacific_Palau, 2}, + {eras_Pacific_Pitcairn, 3}, + {eras_Pacific_Pohnpei, 2}, + {eras_Pacific_Pohnpei, 2}, + {eras_Pacific_Port_Moresby, 3}, + {eras_Pacific_Rarotonga, 3}, + {eras_Pacific_Guam, 4}, + {eras_Pacific_Pago_Pago, 3}, + {eras_Pacific_Tahiti, 2}, + {eras_Pacific_Tarawa, 2}, + {eras_Pacific_Tongatapu, 4}, + {eras_Pacific_Chuuk, 2}, + {eras_Pacific_Wake, 2}, + {eras_Pacific_Wallis, 2}, + {eras_Pacific_Chuuk, 2}, + {eras_Europe_Warsaw, 9}, + {eras_Europe_Lisbon, 8}, + {eras_Asia_Taipei, 4}, + {eras_Asia_Seoul, 6}, + {eras_Asia_Singapore, 9}, + {eras_Europe_Istanbul, 13}, + {eras_Etc_UCT, 1}, + {eras_America_Anchorage, 8}, + {eras_America_Adak, 9}, + {eras_America_Phoenix, 7}, + {eras_America_Chicago, 8}, + {eras_America_Indiana_Indianapolis, 11}, + {eras_America_New_York, 6}, + {eras_Pacific_Honolulu, 7}, + {eras_America_Indiana_Knox, 7}, + {eras_America_Detroit, 8}, + {eras_America_Denver, 6}, + {eras_America_Los_Angeles, 4}, + {eras_America_Los_Angeles, 4}, + {eras_Pacific_Pago_Pago, 3}, + {eras_Etc_UTC, 1}, + {eras_Etc_UTC, 1}, + {eras_Europe_Moscow, 11}, + {eras_WET, 1}, + {eras_Etc_UTC, 1}, +}; diff --git a/lib/ESPiLight/pilight/libs/pilight/core/update.h b/lib/ESPiLight/pilight/libs/pilight/core/update.h new file mode 100644 index 0000000..f594a14 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/update.h @@ -0,0 +1,28 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _UPDATE_H_ +#define _UPDATE_H_ + +int update_gc(void); +char *update_package_version(char *mirror); +int update_available(void); +char *update_latests_version(void); +void *update_poll(void *param); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/core/webserver.c b/lib/ESPiLight/pilight/libs/pilight/core/webserver.c new file mode 100644 index 0000000..eb28382 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/webserver.c @@ -0,0 +1,2034 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +/* + * This webserver contains various code originally written by Sergey Lyubka + * (from Cesenta) for Mongoose (https://github.com/cesanta/mongoose). + * The code was either copied, adapted and/or stripped so it could be integrated + * with the pilight eventpool and mbed TLS SSL library. + * + * The following functions are therefor licensed under GPLv2. + * + * send_websocket_handshake_if_requested + * send_websocket_handshake + * http_parse_request + * _urldecode + * parse_http_headers + * remove_double_dots_and_double_slashes + * is_valid_http_method + * *skip + * websocket_write + * authorize_input + * http_get_header + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#else + #ifdef __mips__ + #define __USE_UNIX98 + #endif + #include + #include + #define __USE_UNIX98 + #include + #include + #include +#endif + +#ifdef PILIGHT_REWRITE + #include "../storage/storage.h" +#else + #include "../config/devices.h" + #include "../config/settings.h" + #include "../config/registry.h" +#endif + +#include "eventpool.h" +#include "sha256cache.h" +#include "pilight.h" +#include "network.h" +#include "gc.h" +#include "log.h" +#include "json.h" +#include "webserver.h" +#include "socket.h" +#include "ssdp.h" +#include "common.h" + +#include + +#ifdef WEBSERVER_HTTPS +#include +#include +#include +#if MBEDTLS_VERSION_MAJOR <= 2 && \ + MBEDTLS_VERSION_MINOR <= 3 + #include +#else + #include +#endif +#include +#include +#include +#include +#include + +#include "ssl.h" + +static int https_port = WEBSERVER_HTTPS_PORT; +#endif + +static uv_poll_t *poll_http_req = NULL; +static uv_poll_t *poll_https_req = NULL; +static uv_async_t *async_req = NULL; + +static int http_port = WEBSERVER_HTTP_PORT; +static int websockets = WEBGUI_WEBSOCKETS; +static int cache = 1; +static char *authentication_username = NULL; +static char *authentication_password = NULL; +static unsigned short loop = 1; +static char *root = NULL; +static unsigned short root_free = 0; + +typedef struct broadcast_list_t { + char *out; + ssize_t len; + int fd; + + struct broadcast_list_t *next; +} broadcast_list_t; + +static struct broadcast_list_t *broadcast_list = NULL; + +enum mg_result { + MG_FALSE, + MG_TRUE, + MG_MORE +}; + +enum { + WEBSOCKET_OPCODE_CONTINUATION = 0x0, + WEBSOCKET_OPCODE_TEXT = 0x1, + WEBSOCKET_OPCODE_BINARY = 0x2, + WEBSOCKET_OPCODE_CONNECTION_CLOSE = 0x8, + WEBSOCKET_OPCODE_PING = 0x9, + WEBSOCKET_OPCODE_PONG = 0xa +}; + +typedef struct webserver_clients_t { + uv_poll_t *req; + int is_websocket; + + struct webserver_clients_t *next; +} webserver_clients_t; + +typedef struct fcache_t { + char *name; + unsigned long size; + unsigned char *bytes; + struct fcache_t *next; +} fcaches_t; + +static struct fcache_t *fcache; + +#ifdef _WIN32 + static uv_mutex_t webserver_lock; +#else + static pthread_mutex_t webserver_lock; + static pthread_mutexattr_t webserver_attr; +#endif +static int lock_init = 0; +static struct webserver_clients_t *webserver_clients = NULL; + +static void poll_close_cb(uv_poll_t *req); + +static void *reason_socket_received_free(void *param) { + struct reason_socket_received_t *data = param; + FREE(data->buffer); + FREE(data); + return NULL; +} + +static void *reason_webserver_connected_free(void *param) { + struct reason_webserver_connected_t *data = param; + FREE(data); + return NULL; +} + +int webserver_gc(void) { + struct webserver_clients_t *node = NULL; + + loop = 0; + + if(root_free == 1) { + FREE(root); + } + +#ifdef _WIN32 + uv_mutex_lock(&webserver_lock); +#else + pthread_mutex_lock(&webserver_lock); +#endif + { + while(webserver_clients) { + node = webserver_clients->next; + poll_close_cb(webserver_clients->req); + webserver_clients = node; + } + } + + { + struct broadcast_list_t *tmp = NULL; + while(broadcast_list) { + tmp = broadcast_list; + broadcast_list = broadcast_list->next; + FREE(tmp); + } + } +#ifdef _WIN32 + uv_mutex_unlock(&webserver_lock); +#else + pthread_mutex_unlock(&webserver_lock); +#endif + + { + struct fcache_t *tmp = fcache; + while(fcache) { + tmp = fcache; + FREE(tmp->name); + FREE(tmp->bytes); + fcache = fcache->next; + FREE(tmp); + } + } + + if(poll_http_req != NULL) { + poll_close_cb(poll_http_req); + } + if(poll_https_req != NULL) { + poll_close_cb(poll_https_req); + } + + authentication_username = NULL; + authentication_password = NULL; + + sha256cache_gc(); + logprintf(LOG_DEBUG, "garbage collected webserver library"); + return 1; +} + +void webserver_create_header(char **p, const char *message, char *mimetype, unsigned long len) { + *p += sprintf((char *)*p, + "HTTP/1.0 %s\r\n" + "Server: pilight\r\n" + "Keep-Alive: timeout=15, max=100\r\n" + "Content-Type: %s\r\n", + message, mimetype); + *p += sprintf((char *)*p, + "Content-Length: %lu\r\n\r\n", + len); +} + +static void create_404_header(const char *in, char **p) { + char mimetype[] = "text/html"; + webserver_create_header(p, "404 Not Found", mimetype, (unsigned long)(202+strlen((const char *)in))); + *p += sprintf((char *)*p, "\x0d\x0a" + "\x0d\x0a" + "404 Not Found\x0d\x0a" + "\x0d\x0a" + "

        Not Found

        \x0d\x0a" + "

        The requested URL %s was not found on this server.

        \x0d\x0a" + "", + (const char *)in); +} + +const char *http_get_header(struct connection_t *conn, const char *s) { + int i = 0; + + for(i = 0; i < conn->num_headers; i++) { + if(strcmp(s, conn->http_headers[i].name) == 0) { + return conn->http_headers[i].value; + } + } + + return NULL; +} + +void send_auth_request(uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct connection_t *conn = custom_poll_data->data; + char *a = "HTTP/1.1 401 Unauthorized\r\n" + "WWW-Authenticate: Basic realm=\"pilight\"\r\n\r\n"; + conn->status_code = 401; + + iobuf_append(&custom_poll_data->send_iobuf, a, strlen(a)); + uv_custom_write(req); +} + +int authorize_input(uv_poll_t *req, char *username, char *password) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct connection_t *conn = custom_poll_data->data; + const char *hdr = NULL; + char **array = NULL, *decoded = NULL; + int n = 0; + + if(conn == NULL) { + return MG_FALSE; + } + + if((hdr = http_get_header(conn, "Authorization")) == NULL || + (strncmp(hdr, "Basic ", 6) != 0 && + strncmp(hdr, "basic ", 6) != 0)) { + return MG_FALSE; + } + + char *user = MALLOC(strlen(hdr)+1); + if(user == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(user, &hdr[6]); + + if((decoded = base64decode(user, strlen(user), NULL)) == NULL) { + FREE(user); + return MG_FALSE; + } + + if((n = explode(decoded, ":", &array)) == 2) { + if(strlen(array[1]) < 64) { + if((array[1] = REALLOC(array[1], 65)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + } + + if(sha256cache_get_hash(array[1]) == NULL) { + sha256cache_add(array[1]); + } + + if(strcmp(sha256cache_get_hash(array[1]), password) == 0 && strcmp(array[0], username) == 0) { + array_free(&array, n); + FREE(user); + FREE(decoded); + return MG_TRUE; + } + } + FREE(user); + FREE(decoded); + array_free(&array, n); + + return MG_FALSE; +} + +static int auth_handler(uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + if(authentication_username != NULL && authentication_password != NULL) { + return authorize_input(req, authentication_username, authentication_password); + } else { + return MG_TRUE; + } +} + +size_t websocket_write(uv_poll_t *req, int opcode, const char *data, unsigned long long data_len) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + unsigned char *copy = NULL; + size_t copy_len = 0; + int index = 2; + + if((copy = REALLOC(copy, data_len + 10)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(copy, '\0', data_len + 10); + + copy[0] = 0x80 + (opcode & 0x0f); + if(data_len <= 125) { + copy[1] = data_len; + } else if(data_len < 65535) { + copy[1] = 126; + copy[2] = (data_len >> 8) & 255; + copy[3] = (data_len) & 255; + index = 4; + } else { + copy[1] = 127; + copy[2] = (data_len >> 56) & 255; + copy[3] = (data_len >> 48) & 255; + copy[4] = (data_len >> 40) & 255; + copy[5] = (data_len >> 32) & 255; + copy[6] = (data_len >> 24) & 255; + copy[7] = (data_len >> 16) & 255; + copy[8] = (data_len >> 8) & 255; + copy[9] = (data_len) & 255; + index = 10; + } + if(data != NULL) { + memcpy(©[index], data, data_len); + } + copy_len = data_len + index; + + if(copy_len > 0) { + iobuf_append(&custom_poll_data->send_iobuf, (char *)copy, copy_len); + uv_custom_write(req); + } + + FREE(copy); + return data_len; +} + +static void *webserver_send(int reason, void *param) { + struct reason_socket_send_t *data = param; + struct connection_t c; + memset(&c, 0, sizeof(struct connection_t)); + + if(strcmp(data->type, "websocket") == 0) { +#ifdef _WIN32 + uv_mutex_lock(&webserver_lock); +#else + pthread_mutex_lock(&webserver_lock); +#endif + struct broadcast_list_t *node = MALLOC(sizeof(struct broadcast_list_t)); + if(node == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(node, 0, sizeof(struct broadcast_list_t)); + node->fd = data->fd; + if((node->out = STRDUP(data->buffer)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + node->len = strlen(data->buffer); + + struct broadcast_list_t *tmp = broadcast_list; + if(tmp != NULL) { + while(tmp->next != NULL) { + tmp = tmp->next; + } + tmp->next = node; + node = tmp; + } else { + node->next = broadcast_list; + broadcast_list = node; + } + +#ifdef _WIN32 + uv_mutex_unlock(&webserver_lock); +#else + pthread_mutex_unlock(&webserver_lock); +#endif + uv_async_send(async_req); + } + + return NULL; +} + +static void write_chunk(uv_poll_t *req, char *buf, int len) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + + char chunk_size[50]; + int n = snprintf(chunk_size, sizeof(chunk_size), "%X\r\n", len); + + iobuf_append(&custom_poll_data->send_iobuf, chunk_size, n); + iobuf_append(&custom_poll_data->send_iobuf, buf, len); + iobuf_append(&custom_poll_data->send_iobuf, "\r\n", 2); +} + +static size_t send_data(uv_poll_t *req, char *mimetype, void *data, unsigned long data_len) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + char header[1024], *p = header; + memset(header, '\0', 1024); + + webserver_create_header(&p, "200 OK", mimetype, data_len); + iobuf_append(&custom_poll_data->send_iobuf, header, (int)(p-header)); + iobuf_append(&custom_poll_data->send_iobuf, data, (int)data_len); + + return 0; +} + +static size_t send_chunked_data(uv_poll_t *req, void *data, unsigned long data_len) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct connection_t *conn = custom_poll_data->data; + + if(conn->flags == 0) { + char a[255], *p = a; + memset(p, '\0', 255); + int i = snprintf(p, 255, + "HTTP/1.1 200 OK\r\nKeep-Alive: timeout=15, max=100\r\n"\ + "Content-Type: %s\r\nTransfer-Encoding: chunked\r\n\r\n", + conn->mimetype + ); + + iobuf_append(&custom_poll_data->send_iobuf, p, i); + conn->flags = 1; + } + write_chunk(req, data, data_len); + + return 0; +} + +static int parse_rest(uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct connection_t *conn = custom_poll_data->data; + + char **array = NULL, **array1 = NULL; + struct JsonNode *jobject = json_mkobject(); + struct JsonNode *jcode = json_mkobject(); + struct JsonNode *jvalues = json_mkobject(); + int a = 0, b = 0, c = 0, has_protocol = 0; + + if(strcmp(conn->request_method, "POST") == 0) { + conn->query_string = conn->content; + } + if(strcmp(conn->request_method, "GET") == 0 && conn->query_string == NULL) { + conn->query_string = conn->content; + } + if(conn->query_string != NULL) { +#ifdef PILIGHT_REWRITE + char *dev = NULL; +#else + struct devices_t *dev = NULL; +#endif + int len = urldecode(conn->query_string, NULL); + if(len == -1) { + char *z = "{\"message\":\"failed\",\"error\":\"cannot decode url\"}"; + send_data(req, "application/json", z, strlen(z)); + return MG_TRUE; + } + + char *decoded = MALLOC(len+1); + if(decoded == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + if(urldecode(conn->query_string, decoded) == -1) { + char *z = "{\"message\":\"failed\",\"error\":\"cannot decode url\"}"; + send_data(req, "application/json", z, strlen(z)); + FREE(decoded); + return MG_TRUE; + } + + char state[16], *p = NULL; + a = explode((char *)decoded, "&", &array), b = 0, c = 0; + memset(state, 0, 16); + + if(a > 1) { + int type = 0; //0 = SEND, 1 = CONTROL, 2 = REGISTRY + json_append_member(jobject, "code", jcode); + + if(strcmp(conn->uri, "/send") == 0) { + type = 0; + json_append_member(jobject, "action", json_mkstring("send")); + } else if(strcmp(conn->uri, "/control") == 0) { + type = 1; + json_append_member(jobject, "action", json_mkstring("control")); + } else if(strcmp(conn->uri, "/registry") == 0) { + type = 2; + json_append_member(jobject, "action", json_mkstring("registry")); + } + + for(b=0;b 0) { + p = state; + } + if(pilight.control(dev, p, json_first_child(jvalues), ORIGIN_WEBSERVER) == 0) { + char *z = "{\"message\":\"success\"}"; + send_data(req, "application/json", z, strlen(z)); + goto clear; + } + } + } + } else if(type == 2) { + struct JsonNode *value = NULL; + char *type = NULL; + char *key = NULL; + char *sval = NULL; + double nval = 0.0; + int dec = 0; + if(json_find_string(jcode, "type", &type) != 0) { + char *z = "{\"message\":\"failed\"}"; + send_data(req, "application/json", z, strlen(z)); + goto clear; + } else { + if(strcmp(type, "set") == 0) { + if(json_find_string(jcode, "key", &key) != 0) { + char *z = "{\"message\":\"failed\"}"; + send_data(req, "application/json", z, strlen(z)); + goto clear; + } else if((value = json_find_member(jcode, "value")) == NULL) { + char *z = "{\"message\":\"failed\"}"; + send_data(req, "application/json", z, strlen(z)); + goto clear; + } else { + if(value->tag == JSON_NUMBER) { + if(registry_set_number(key, value->number_, value->decimals_) == 0) { + char *z = "{\"message\":\"success\"}"; + send_data(req, "application/json", z, strlen(z)); + goto clear; + } + } else if(value->tag == JSON_STRING) { + if(registry_set_string(key, value->string_) == 0) { + char *z = "{\"message\":\"success\"}"; + send_data(req, "application/json", z, strlen(z)); + goto clear; + } + } else { + char *z = "{\"message\":\"failed\"}"; + send_data(req, "application/json", z, strlen(z)); + goto clear; + } + } + } else if(strcmp(type, "remove") == 0) { + if(json_find_string(jcode, "key", &key) != 0) { + char *z = "{\"message\":\"failed\"}"; + send_data(req, "application/json", z, strlen(z)); + goto clear; + } else { + if(registry_remove_value(key) == 0) { + char *z = "{\"message\":\"success\"}"; + send_data(req, "application/json", z, strlen(z)); + goto clear; + } else { + char *z = "{\"message\":\"failed\"}"; + send_data(req, "application/json", z, strlen(z)); + goto clear; + } + } + } else if(strcmp(type, "get") == 0) { + if(json_find_string(jcode, "key", &key) != 0) { + char *z = "{\"message\":\"failed\"}"; + send_data(req, "application/json", z, strlen(z)); + goto clear; + } else { + if(registry_get_number(key, &nval, &dec) == 0) { + struct JsonNode *jsend = json_mkobject(); + json_append_member(jsend, "message", json_mkstring("registry")); + json_append_member(jsend, "value", json_mknumber(nval, dec)); + json_append_member(jsend, "key", json_mkstring(key)); + char *output = json_stringify(jsend, NULL); + send_data(req, "application/json", output, strlen(output)); + json_free(output); + json_delete(jsend); + goto clear; + } else if(registry_get_string(key, &sval) == 0) { + struct JsonNode *jsend = json_mkobject(); + json_append_member(jsend, "message", json_mkstring("registry")); + json_append_member(jsend, "value", json_mkstring(sval)); + json_append_member(jsend, "key", json_mkstring(key)); + char *output = json_stringify(jsend, NULL); + send_data(req, "application/json", output, strlen(output)); + json_free(output); + json_delete(jsend); + goto clear; + } else { + char *z = "{\"message\":\"failed\"}"; + send_data(req, "application/json", z, strlen(z)); + goto clear; + } + } + } + } + } + json_delete(jvalues); + json_delete(jobject); + } + FREE(decoded); + array_free(&array, a); + } + char *z = "{\"message\":\"failed\"}"; + send_data(req, "application/json", z, strlen(z)); + return MG_TRUE; + +clear: + array_free(&array1, c); + array_free(&array, a); + json_delete(jvalues); + json_delete(jobject); + + return MG_TRUE; +} + +static void close_cb(uv_handle_t *handle) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + FREE(handle); +} + +static int file_read_cb(int fd, uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct connection_t *conn = custom_poll_data->data; + struct timeval timeout; + fd_set readset; + char buffer[WEBSERVER_CHUNK_SIZE]; + + memset(&buffer, '\0', WEBSERVER_CHUNK_SIZE); + memset(&readset, 0, sizeof(fd_set)); + + FD_SET(fd, &readset); + + timeout.tv_sec = 0; + timeout.tv_usec = 1000; + + int ret = select(fd+1, &readset, NULL, NULL, &timeout); + if(ret >= 0 && errno == EINTR) { + conn->fd = -1; + close(fd); + return -1; + } else if((ret == -1 && errno == EINTR) || ret == 0) { + return 0; + } + + int bytes = read(fd, buffer, WEBSERVER_CHUNK_SIZE); + + if(bytes > 0) { + send_chunked_data(req, &buffer, bytes); + if(bytes < WEBSERVER_CHUNK_SIZE) { + iobuf_append(&custom_poll_data->send_iobuf, "0\r\n\r\n", 5); + uv_custom_close(req); + } + uv_custom_write(req); + + return 0; + } else if(bytes == 0) { + if(conn->flags == 1) { + iobuf_append(&custom_poll_data->send_iobuf, "0\r\n\r\n", 5); + uv_custom_close(req); + } + return 0; + } else if(bytes < 0) { + logprintf(LOG_ERR, "read: %s", strerror(errno)); + conn->fd = -1; + close(fd); + return -1; + } + return 0; +} + +static int request_handler(uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct connection_t *conn = custom_poll_data->data; + + char *ext = NULL; + char buffer[4096], *p = buffer; + + memset(buffer, '\0', 4096); + + if(conn->is_websocket == 0) { + if(conn->uri != NULL && strlen(conn->uri) > 0) { + if(strcmp(conn->uri, "/send") == 0 || strcmp(conn->uri, "/control") == 0 || strcmp(conn->uri, "/registry") == 0) { + return parse_rest(req); + } else if(strcmp(conn->uri, "/config") == 0) { + char media[15]; + int internal = CONFIG_USER; + strcpy(media, "web"); + if(conn->query_string != NULL) { + sscanf(conn->query_string, "media=%14s%*[ \n\r]", media); + if(strstr(conn->query_string, "internal") != NULL) { + internal = CONFIG_INTERNAL; + } + } + struct JsonNode *jsend = config_print(internal, media); + if(jsend != NULL) { + char *output = json_stringify(jsend, NULL); + send_data(req, "application/json", output, strlen(output)); + json_delete(jsend); + json_free(output); + } + jsend = NULL; + return MG_TRUE; + } else if(strcmp(conn->uri, "/values") == 0) { + char media[15]; + strcpy(media, "web"); + if(conn->query_string != NULL) { + sscanf(conn->query_string, "media=%14s%*[ \n\r]", media); + } +#ifdef PILIGHT_REWRITE + struct JsonNode *jsend = values_print(media); +#else + JsonNode *jsend = devices_values(media); +#endif + if(jsend != NULL) { + char *output = json_stringify(jsend, NULL); + send_data(req, "application/json", output, strlen(output)); + json_delete(jsend); + json_free(output); + } + jsend = NULL; + return MG_TRUE; + } else if(strstr(conn->uri, "/") != NULL && strcmp(&conn->uri[(rstrstr(conn->uri, "/")-conn->uri)], "/") == 0) { + char indexes[2][11] = {"index.html","index.htm"}; + + unsigned q = 0; + /* Check if the root is terminated by a slash. If not, then add it */ + for(q=0;q<(sizeof(indexes)/sizeof(indexes[0]));q++) { + size_t l = strlen(root)+strlen(conn->uri)+strlen(indexes[q])+4; + if((conn->request = REALLOC(conn->request, l)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(conn->request, '\0', l); + if(root[strlen(root)-1] == '/') { +#ifdef __FreeBSD__ + sprintf(conn->request, "%s/%s%s", root, conn->uri, indexes[q]); +#else + sprintf(conn->request, "%s%s%s", root, conn->uri, indexes[q]); +#endif + } else { + sprintf(conn->request, "%s/%s%s", root, conn->uri, indexes[q]); + } + if(access(conn->request, F_OK) == 0) { + break; + } + } + } else if(root != NULL && conn->uri != NULL) { + size_t wlen = strlen(root)+strlen(conn->uri)+2; + if((conn->request = MALLOC(wlen)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(conn->request, '\0', wlen); + /* If a file was requested add it to the webserver path to create the absolute path */ + if(root[strlen(root)-1] == '/') { + if(conn->uri[0] == '/') + sprintf(conn->request, "%s%s", root, conn->uri); + else + sprintf(conn->request, "%s/%s", root, conn->uri); + } else { + if(conn->uri[0] == '/') + sprintf(conn->request, "%s/%s", root, conn->uri); + else + sprintf(conn->request, "%s/%s", root, conn->uri); + } + } + if(conn->request == NULL) { + return MG_FALSE; + } + + char *dot = NULL; + /* Retrieve the extension of the requested file and create a mimetype accordingly */ + dot = strrchr(conn->request, '.'); + if(dot == NULL || dot == conn->request) { + strcpy(conn->mimetype, "text/plain"); + } else { + if((ext = REALLOC(ext, strlen(dot)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(ext, '\0', strlen(dot)+1); + strcpy(ext, dot+1); + + if(strcmp(ext, "html") == 0) { + strcpy(conn->mimetype, "text/html"); + } else if(strcmp(ext, "xml") == 0) { + strcpy(conn->mimetype, "text/xml"); + } else if(strcmp(ext, "png") == 0) { + strcpy(conn->mimetype, "image/png"); + } else if(strcmp(ext, "gif") == 0) { + strcpy(conn->mimetype, "image/gif"); + } else if(strcmp(ext, "ico") == 0) { + strcpy(conn->mimetype, "image/x-icon"); + } else if(strcmp(ext, "jpg") == 0) { + strcpy(conn->mimetype, "image/jpg"); + } else if(strcmp(ext, "css") == 0) { + strcpy(conn->mimetype, "text/css"); + } else if(strcmp(ext, "js") == 0) { + strcpy(conn->mimetype, "text/javascript"); + } else if(strcmp(ext, "php") == 0) { + strcpy(conn->mimetype, "application/x-httpd-php"); + } else { + strcpy(conn->mimetype, "text/plain"); + } + } + FREE(ext); + + memset(buffer, '\0', 4096); + p = buffer; + + if(access(conn->request, F_OK) != 0) { + goto filenotfound; + } + + const char *cl = NULL; + if((cl = http_get_header(conn, "Content-Length"))) { + if(atoi(cl) > MAX_UPLOAD_FILESIZE) { + char line[1024] = {'\0'}; + sprintf(line, "Webserver Warning: POST Content-Length of %d bytes exceeds the limit of %d bytes in Unknown on line 0", MAX_UPLOAD_FILESIZE, atoi(cl)); + webserver_create_header(&p, "200 OK", "text/plain", strlen(line)); + iobuf_append(&custom_poll_data->send_iobuf, buffer, (int)(p-buffer)); + iobuf_append(&custom_poll_data->send_iobuf, line, (int)strlen(line)); + + FREE(conn->request); + conn->request = NULL; + return MG_TRUE; + } + } + + int match = 0; + if(cache == 1) { + struct fcache_t *tmp = fcache; + while(tmp) { + if(strcmp(tmp->name, conn->request) == 0) { + match = 1; + break; + } + tmp = tmp->next; + } + if(match == 1) { + send_chunked_data(req, tmp->bytes, tmp->size); + iobuf_append(&custom_poll_data->send_iobuf, "0\r\n\r\n", 5); + return MG_TRUE; + } + } + if(match == 0) { + if((conn->file_fd = open(conn->request, O_RDONLY)) < 0) { + logprintf(LOG_ERR, "open: %s", strerror(errno)); + goto filenotfound; + } +#ifdef _WIN32 + unsigned long on = 1; + ioctlsocket(conn->file_fd, FIONBIO, &on); +#else + long arg = fcntl(conn->file_fd, F_GETFL, NULL); + fcntl(conn->file_fd, F_SETFL, arg | O_NONBLOCK); +#endif + + if(file_read_cb(conn->file_fd, req) == 0) { + return MG_MORE; + } else { + return MG_TRUE; + } + } + + return MG_MORE; + } + } else if(websockets == WEBGUI_WEBSOCKETS) { + char *input = MALLOC(conn->content_len+1); + if(input == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(input, '\0', conn->content_len+1); + + strncpy(input, conn->content, conn->content_len); + input[conn->content_len] = '\0'; + + if(json_validate(input) == true) { + struct reason_socket_received_t *data = MALLOC(sizeof(struct reason_socket_received_t)); + if(data == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + data->fd = conn->fd; + if((data->buffer = MALLOC(strlen(input)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(data->buffer, input); + strcpy(data->type, "websocket"); + + eventpool_trigger(REASON_SOCKET_RECEIVED, reason_socket_received_free, data); + } + FREE(input); + return MG_TRUE; + } + +filenotfound: + logprintf(LOG_WARNING, "(webserver) could not read %s", conn->request); + create_404_header(conn->uri, &p); + FREE(conn->request); + + iobuf_append(&custom_poll_data->send_iobuf, buffer, (int)(p-buffer)); + + return MG_TRUE; +} + +static void webserver_process(uv_async_t *handle) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + +#ifdef _WIN32 + uv_mutex_lock(&webserver_lock); +#else + pthread_mutex_lock(&webserver_lock); +#endif + + struct webserver_clients_t *clients = webserver_clients; + struct broadcast_list_t *tmp = NULL; + while(broadcast_list) { + tmp = broadcast_list; + + while(clients) { + if(tmp->fd > 0) { + int fd = 0, r = 0; + + if((r = uv_fileno((uv_handle_t *)clients->req, (uv_os_fd_t *)&fd)) != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_fileno: %s", uv_strerror(r)); + continue; + /*LCOV_EXCL_STOP*/ + } + + if(fd == tmp->fd) { + websocket_write(clients->req, WEBSOCKET_OPCODE_TEXT, tmp->out, tmp->len); + } + } else if(clients->is_websocket == 1) { + websocket_write(clients->req, 1, tmp->out, tmp->len); + } + clients = clients->next; + } + if(tmp->len > 0) { + FREE(tmp->out); + } + broadcast_list = broadcast_list->next; + FREE(tmp); + } + if(broadcast_list != NULL) { + uv_async_send(async_req); + } +#ifdef _WIN32 + uv_mutex_unlock(&webserver_lock); +#else + pthread_mutex_unlock(&webserver_lock); +#endif +} + +static void *broadcast(int reason, void *param) { + if(loop == 0) { + return NULL; + } + +#ifdef _WIN32 + uv_mutex_lock(&webserver_lock); +#else + pthread_mutex_lock(&webserver_lock); +#endif + struct broadcast_list_t *node = MALLOC(sizeof(struct broadcast_list_t)); + if(node == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(node, 0, sizeof(struct broadcast_list_t)); + if((node->out = MALLOC(1024)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + int i = 0; + switch(reason) { + case REASON_CONFIG_UPDATE: { + struct reason_config_update_t *data = param; + node->len += snprintf(node->out, 1024, + "{\"origin\":\"update\",\"type\":%d,\"devices\":[", + data->type + ); + for(i=0;inrdev;i++) { + node->len += snprintf(&node->out[node->len], 1024-node->len, "\"%s\",", data->devices[i]); + } + node->len += snprintf(&node->out[node->len-1], 1024-node->len, "],\"values\":{"); + node->len -= 1; + for(i=0;inrval;i++) { + if(data->values[i].type == JSON_NUMBER) { + node->len += snprintf(&node->out[node->len], 1024-node->len, + "\"%s\":%.*f,", + data->values[i].name, data->values[i].decimals, data->values[i].number_ + ); + } else if(data->values[i].type == JSON_STRING) { + node->len += snprintf(&node->out[node->len], 1024-node->len, + "\"%s\":\"%s\",", + data->values[i].name, data->values[i].string_ + ); + } + } + node->len += snprintf(&node->out[node->len-1], 1024-node->len, "}}"); + node->len -= 1; + } break; + case REASON_BROADCAST_CORE: + strncpy(node->out, (char *)param, 1024); + node->len = strlen(node->out); + break; + default: + FREE(node); + return NULL; + } + + struct broadcast_list_t *tmp = broadcast_list; + if(tmp != NULL) { + while(tmp->next != NULL) { + tmp = tmp->next; + } + tmp->next = node; + node = tmp; + } else { + node->next = broadcast_list; + broadcast_list = node; + } + +#ifdef _WIN32 + uv_mutex_unlock(&webserver_lock); +#else + pthread_mutex_unlock(&webserver_lock); +#endif + uv_async_send(async_req); + + return NULL; +} + +static char *skip(char **buf, const char *delimiters) { + char *p, *begin_word, *end_word, *end_delimiters; + + begin_word = *buf; + end_word = begin_word + strcspn(begin_word, delimiters); + end_delimiters = end_word + strspn(end_word, delimiters); + + for(p = end_word; p < end_delimiters; p++) { + *p = '\0'; + } + + *buf = end_delimiters; + + return begin_word; +} + +static int is_valid_http_method(const char *s) { + return !strcmp(s, "GET") || !strcmp(s, "POST") || !strcmp(s, "HEAD") || + !strcmp(s, "CONNECT") || !strcmp(s, "PUT") || !strcmp(s, "DELETE") || + !strcmp(s, "OPTIONS") || !strcmp(s, "PROPFIND") || !strcmp(s, "MKCOL"); +} + +static void remove_double_dots_and_double_slashes(char *s) { + char *p = s; + + while(*s != '\0') { + *p++ = *s++; + if(s[-1] == '/' || s[-1] == '\\') { + // Skip all following slashes, backslashes and double-dots + while(s[0] != '\0') { + if(s[0] == '/' || s[0] == '\\') { + s++; + } else if(s[0] == '.' && s[1] == '.') { + s += 2; + } else { + break; + } + } + } + } + *p = '\0'; +} + +static void parse_http_headers(char **buf, struct connection_t *c) { + size_t i; + c->num_headers = 0; + for(i = 0; i < 1024; i++) { + c->http_headers[i].name = skip(buf, ": "); + c->http_headers[i].value = skip(buf, "\r\n"); + if(c->http_headers[i].name[0] == '\0') + break; + c->num_headers = i + 1; + } +} + +static int _urldecode(const char *src, int src_len, char *dst, int dst_len, int is_form_url_encoded) { + int i, j, a, b; + +#define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W') + + for(i = j = 0; i < src_len && j < dst_len - 1; i++, j++) { + if(src[i] == '%' && i < src_len - 2 && + isxdigit(*(const unsigned char *)(src + i + 1)) && + isxdigit(*(const unsigned char *)(src + i + 2))) { + a = tolower(*(const unsigned char *)(src + i + 1)); + b = tolower(*(const unsigned char *)(src + i + 2)); + dst[j] = (char)((HEXTOI(a) << 4) | HEXTOI(b)); + i += 2; + } else if(is_form_url_encoded && src[i] == '+') { + dst[j] = ' '; + } else { + dst[j] = src[i]; + } + } + + dst[j] = '\0'; // Null-terminate the destination + + return i >= src_len ? j : -1; +} + +int http_parse_request(char *buffer, struct connection_t *c) { + int is_request = 0, n = 0; + + while(*buffer != '\0' && isspace(*(unsigned char *)buffer)) { + buffer++; + } + + c->request_method = skip(&buffer, " "); + c->uri = skip(&buffer, " "); + c->http_version = skip(&buffer, "\r\n"); + + is_request = is_valid_http_method(c->request_method); + if((is_request && memcmp(c->http_version, "HTTP/", 5) != 0) || + (!is_request && memcmp(c->request_method, "HTTP/", 5) != 0)) { + } else { + if(is_request == 1) { + c->http_version += 5; + } else { + c->status_code = atoi(c->uri); + } + parse_http_headers(&buffer, c); + + if((c->query_string = strchr(c->uri, '?')) != NULL) { + *(char *)c->query_string++ = '\0'; + } + n = (int)strlen(c->uri); + _urldecode(c->uri, n, (char *)c->uri, n + 1, 0); + + if(*c->uri == '/' || *c->uri == '.') { + remove_double_dots_and_double_slashes((char *)c->uri); + } + } + + return 0; +} + +static void webserver_client_add(uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + +#ifdef _WIN32 + uv_mutex_lock(&webserver_lock); +#else + pthread_mutex_lock(&webserver_lock); +#endif + struct webserver_clients_t *node = MALLOC(sizeof(struct webserver_clients_t)); + if(node == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + node->req = req; + node->is_websocket = 0; + + node->next = webserver_clients; + webserver_clients = node; +#ifdef _WIN32 + uv_mutex_unlock(&webserver_lock); +#else + pthread_mutex_unlock(&webserver_lock); +#endif +} + +static void webserver_client_remove(uv_poll_t *req) { +#ifdef _WIN32 + uv_mutex_lock(&webserver_lock); +#else + pthread_mutex_lock(&webserver_lock); +#endif + struct webserver_clients_t *currP, *prevP; + + prevP = NULL; + + for(currP = webserver_clients; currP != NULL; prevP = currP, currP = currP->next) { + if(currP->req == req) { + if(prevP == NULL) { + webserver_clients = currP->next; + } else { + prevP->next = currP->next; + } + + FREE(currP); + break; + } + } +#ifdef _WIN32 + uv_mutex_unlock(&webserver_lock); +#else + pthread_mutex_unlock(&webserver_lock); +#endif +} + +static void send_websocket_handshake(uv_poll_t *req, const char *key) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + static const char *magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + unsigned char sha[20]; + char buf[500], *b64_sha = NULL, *p = (char *)sha; + mbedtls_sha1_context ctx; + + memset(&sha, '\0', 20); + + snprintf(buf, sizeof(buf), "%s%s", key, magic); + mbedtls_sha1_init(&ctx); + mbedtls_sha1_starts(&ctx); + mbedtls_sha1_update(&ctx, (unsigned char *)buf, strlen(buf)); + mbedtls_sha1_finish(&ctx, sha); + b64_sha = base64encode(p, 20); + int i = sprintf(buf, + "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" + "Connection: Upgrade\r\n" + "Upgrade: websocket\r\n" + "Sec-WebSocket-Accept: %s\r\n\r\n", b64_sha); + + iobuf_append(&custom_poll_data->send_iobuf, buf, i); + uv_custom_write(req); + mbedtls_sha1_free(&ctx); + FREE(b64_sha); +} + +static void send_websocket_handshake_if_requested(uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct connection_t *conn = custom_poll_data->data; + + const char *ver = http_get_header(conn, "Sec-WebSocket-Version"); + const char *key = http_get_header(conn, "Sec-WebSocket-Key"); + if(ver != NULL && key != NULL) { + conn->is_websocket = 1; + + struct webserver_clients_t *tmp = webserver_clients; + while(tmp) { + if(tmp->req == req) { + tmp->is_websocket = 1; + break; + } + tmp = tmp->next; + } + send_websocket_handshake(req, key); + } +} + +int websocket_read(uv_poll_t *req, unsigned char *buf, ssize_t buf_len) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct connection_t *conn = custom_poll_data->data; + + unsigned int i = 0, j = 0; + unsigned char mask[4]; + unsigned int packet_length = 0; + unsigned int length_code = 0; + int index_first_mask = 0; + int index_first_data_byte = 0; + int opcode = buf[0] & 0xF; + + memset(&mask, '\0', 4); + length_code = ((unsigned char)buf[1]) & 0x7F; + index_first_mask = 2; + if(length_code == 126) { + index_first_mask = 4; + } else if(length_code == 127) { + index_first_mask = 10; + } + memcpy(mask, &buf[index_first_mask], 4); + index_first_data_byte = index_first_mask + 4; + packet_length = buf_len - index_first_data_byte; + for(i = index_first_data_byte, j = 0; i < buf_len; i++, j++) { + buf[j] = buf[i] ^ mask[j % 4]; + } + buf[packet_length] = '\0'; + + switch(opcode) { + case WEBSOCKET_OPCODE_PONG: { + struct timeval tv; + gettimeofday(&tv, NULL); + conn->ping = 1000000 * (unsigned int)tv.tv_sec + (unsigned int)tv.tv_usec; + } break; + case WEBSOCKET_OPCODE_PING: { + websocket_write(req, WEBSOCKET_OPCODE_PONG, NULL, 0); + } break; + case WEBSOCKET_OPCODE_CONNECTION_CLOSE: + websocket_write(req, WEBSOCKET_OPCODE_CONNECTION_CLOSE, NULL, 0); + return -1; + break; + case WEBSOCKET_OPCODE_TEXT: + conn->content_len = packet_length; + conn->content = (char *)buf; + return 0; + break; + } + + return packet_length; +} + +// static void *adhoc_mode(int reason, void *param) { + // if(https_server != NULL) { + // eventpool_fd_remove(https_server); + // logprintf(LOG_INFO, "shut down secure webserver due to adhoc mode"); + // https_server = NULL; + // } + // if(http_server != NULL) { + // eventpool_fd_remove(http_server); + // logprintf(LOG_INFO, "shut down regular webserver due to adhoc mode"); + // http_server = NULL; + // } + + // return NULL; +// } + +// void *webserver_restart(int reason, void *param) { + // if(https_server != NULL) { + // eventpool_fd_remove(https_server); + // https_server = NULL; + // } + // if(http_server != NULL) { + // eventpool_fd_remove(http_server); + // http_server = NULL; + // } + +// #ifdef WEBSERVER_HTTPS + // if(https_port > 0) { + // if(ssl_server_init_status() == 0) { + // https_server = eventpool_socket_add("webserver https", NULL, https_port, AF_INET, SOCK_STREAM, 0, EVENTPOOL_TYPE_SOCKET_SERVER, server_callback, client_send, NULL); + // } else { + // logprintf(LOG_NOTICE, "could not initialize mbedtls library, secure webserver not started"); + // } + // } +// #endif + + // if(http_port > 0) { + // http_server = eventpool_socket_add("webserver http", NULL, http_port, AF_INET, SOCK_STREAM, 0, EVENTPOOL_TYPE_SOCKET_SERVER, server_callback, client_send, NULL); + // } + + // return NULL; +// } + +static void poll_close_cb(uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct connection_t *conn = custom_poll_data->data; + int fd = -1, r = 0; + + if((r = uv_fileno((uv_handle_t *)req, (uv_os_fd_t *)&fd)) != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_fileno: %s", uv_strerror(r)); + /*LCOV_EXCL_STOP*/ + } + + if(conn != NULL && conn->is_websocket == 1) { + websocket_write(req, WEBSOCKET_OPCODE_CONNECTION_CLOSE, NULL, 0); + } + + if(fd > -1) { +#ifdef _WIN32 + shutdown(fd, SD_BOTH); + closesocket(fd); +#else + shutdown(fd, SHUT_RDWR); + close(fd); +#endif + } + + if(conn != NULL) { + if(conn->fd > 0) { +#ifdef _WIN32 + closesocket(conn->fd); +#else + close(conn->fd); +#endif + conn->fd = -1; + } + if(conn->request != NULL) { + FREE(conn->request); + } + } + + webserver_client_remove(req); + + if(!uv_is_closing((uv_handle_t *)req)) { + uv_close((uv_handle_t *)req, close_cb); + } + + if(custom_poll_data->data != NULL) { + FREE(custom_poll_data->data); + } + + if(req->data != NULL) { + uv_custom_poll_free(custom_poll_data); + req->data = NULL; + } + +} + +static void client_write_cb(uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct connection_t *c = (struct connection_t *)custom_poll_data->data; + + if(c->file_fd >= 0) { + if(file_read_cb(c->file_fd, req) != 0) { + uv_custom_close(req); + } + } +} + +static void client_read_cb(uv_poll_t *req, ssize_t *nread, char *buf) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct uv_custom_poll_t *custom_poll_data = req->data; + struct connection_t *c = (struct connection_t *)custom_poll_data->data; + int is_websocket = 0; + + if(c != NULL && c->is_websocket == 1) { + is_websocket = 1; + } + + if(*nread > 0 && is_websocket == 0) { + buf[*nread-1] = '\0'; + } + + if(*nread > 0) { + if(c->is_websocket == 0) { + http_parse_request(buf, c); + send_websocket_handshake_if_requested(req); + + if(auth_handler(req) == MG_FALSE) { + send_auth_request(req); + uv_custom_close(req); + return; + } + } else { + unsigned char *p = (unsigned char *)buf; + if(websocket_read(req, p, *nread) == -1) { + uv_custom_close(req); + return; + } + } + int x = request_handler(req); + if(x == MG_TRUE) { + if(c->is_websocket == 1) { + uv_custom_read(req); + *nread = 0; + return; + } + + uv_custom_close(req); + return; + } + } +} + +static void server_read_cb(uv_poll_t *req, ssize_t *nread, char *buf) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct sockaddr_in servaddr; + struct uv_custom_poll_t *server_poll_data = req->data; + struct uv_custom_poll_t *custom_poll_data = NULL; + socklen_t socklen = sizeof(servaddr); + char buffer[BUFFER_SIZE]; + int client = 0, r = 0, fd = 0; + + memset(buffer, '\0', BUFFER_SIZE); + + if((r = uv_fileno((uv_handle_t *)req, (uv_os_fd_t *)&fd)) != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_fileno: %s", uv_strerror(r)); + return; + /*LCOV_EXCL_STOP*/ + } + + if((client = accept(fd, (struct sockaddr *)&servaddr, (socklen_t *)&socklen)) < 0) { + logprintf(LOG_NOTICE, "accept: %s", strerror(errno)); + return; + } + + memset(&buffer, '\0', INET_ADDRSTRLEN+1); + uv_inet_ntop(AF_INET, (void *)&(servaddr.sin_addr), buffer, INET_ADDRSTRLEN+1); + + if(whitelist_check(buffer) != 0) { + logprintf(LOG_INFO, "rejected client, ip: %s, port: %d", buffer, ntohs(servaddr.sin_port)); +#ifdef _WIN32 + closesocket(client); +#else + close(client); +#endif + return; + } else { + logprintf(LOG_DEBUG, "new client, ip: %s, port: %d", buffer, ntohs(servaddr.sin_port)); + logprintf(LOG_DEBUG, "client fd: %d", client); + } + + struct reason_webserver_connected_t *data = MALLOC(sizeof(struct reason_webserver_connected_t)); + if(data == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + data->fd = client; + + eventpool_trigger(REASON_WEBSERVER_CONNECTED, reason_webserver_connected_free, data); + +#ifdef _WIN32 + unsigned long on = 1; + ioctlsocket(client, FIONBIO, &on); +#else + long arg = fcntl(client, F_GETFL, NULL); + fcntl(client, F_SETFL, arg | O_NONBLOCK); +#endif + + uv_poll_t *poll_req = NULL; + if((poll_req = MALLOC(sizeof(uv_poll_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + uv_custom_poll_init(&custom_poll_data, poll_req, NULL); + custom_poll_data->read_cb = client_read_cb; + custom_poll_data->write_cb = client_write_cb; + custom_poll_data->close_cb = poll_close_cb; + + r = uv_poll_init_socket(uv_default_loop(), poll_req, client); + if(r != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_poll_init_socket: %s", uv_strerror(r)); +#ifdef _WIN32 + closesocket(fd); +#else + close(fd); +#endif + if(custom_poll_data != NULL) { + uv_custom_poll_free(custom_poll_data); + poll_req->data = NULL; + } + FREE(poll_req); + return; + /*LCOV_EXCL_STOP*/ + } + + struct connection_t *c = MALLOC(sizeof(struct connection_t)); + if(c == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(c, 0, sizeof(struct connection_t)); + + custom_poll_data->data = (void *)c; + custom_poll_data->is_server = 0; + c->request = NULL; + c->is_websocket = 0; + c->fd = client; + c->flags = 0; + c->ping = 0; + c->file_fd = -1; +#ifdef WEBSERVER_HTTPS + c->is_ssl = custom_poll_data->is_ssl = server_poll_data->is_ssl; + custom_poll_data->is_server = 1; +#endif + + webserver_client_add(poll_req); + uv_custom_read(req); + uv_custom_read(poll_req); +} + +static void server_write_cb(uv_poll_t *req) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct sockaddr_in servaddr; + socklen_t socklen = sizeof(servaddr); + int r = 0, fd = 0; + + if((r = uv_fileno((uv_handle_t *)req, (uv_os_fd_t *)&fd)) != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_fileno: %s", uv_strerror(r)); + return; + /*LCOV_EXCL_STOP*/ + } + + static struct linger linger = { 0, 0 }; +#ifdef _WIN32 + unsigned int lsize = sizeof(struct linger); +#else + socklen_t lsize = sizeof(struct linger); +#endif + setsockopt(fd, SOL_SOCKET, SO_LINGER, (void *)&linger, lsize); + + if(getsockname(fd, (struct sockaddr *)&servaddr, (socklen_t *)&socklen) == -1) { + logprintf(LOG_ERR, "getsockname"); /*LCOV_EXCL_LINE*/ + } else { +#ifdef WEBSERVER_HTTPS + if(ntohs(servaddr.sin_port) == https_port) { + logprintf(LOG_INFO, "secured webserver started on port: %d (fd %d)", https_port, fd); + } else { +#endif + logprintf(LOG_INFO, "regular webserver started on port: %d (fd %d)", ntohs(servaddr.sin_port), fd); +#ifdef WEBSERVER_HTTPS + } +#endif + } + + uv_custom_read(req); +} + +static int webserver_init(int port, int is_ssl) { + /* + * Make sure we execute in the main thread + */ + const uv_thread_t pth_cur_id = uv_thread_self(); + assert(uv_thread_equal(&pth_main_id, &pth_cur_id)); + + struct sockaddr_in addr; + struct uv_custom_poll_t *custom_poll_data = NULL; + int r = 0, sockfd = 0, socklen = sizeof(addr); + +#ifdef _WIN32 + WSADATA wsa; + + if(WSAStartup(0x202, &wsa) != 0) { + logprintf(LOG_ERR, "WSAStartup"); + exit(EXIT_FAILURE); + } +#endif + + if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "socket: %s", strerror(errno)); + return -1; + /*LCOV_EXCL_STOP*/ + } + + unsigned long on = 1; + + if((r = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(int))) < 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "setsockopt: %s", strerror(errno)); +#ifdef _WIN32 + closesocket(sockfd); +#else + close(sockfd); +#endif + return -1; + /*LCOV_EXCL_STOP*/ + } + + memset((char *)&addr, '\0', sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_port = htons(port); + + if((r = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr))) < 0) { + int x = 0; + if((x = getpeername(sockfd, (struct sockaddr *)&addr, (socklen_t *)&socklen)) == 0) { + logprintf(LOG_ERR, "cannot bind to webserver port %d, address already in use?", ntohs(addr.sin_port)); + } else { + logprintf(LOG_ERR, "cannot bind to webserver port, address already in use?"); + } +#ifdef _WIN32 + closesocket(sockfd); +#else + close(sockfd); +#endif + return -1; + } + + if((listen(sockfd, 0)) < 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "listen: %s", strerror(errno)); +#ifdef _WIN32 + closesocket(sockfd); +#else + close(sockfd); +#endif + return -1; + /*LCOV_EXCL_STOP*/ + } + + uv_poll_t *poll_req = NULL; + + if(is_ssl == 1) { + if((poll_https_req = MALLOC(sizeof(uv_poll_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + poll_req = poll_https_req; + } else { + if((poll_http_req = MALLOC(sizeof(uv_poll_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + poll_req = poll_http_req; + } + uv_custom_poll_init(&custom_poll_data, poll_req, NULL); + custom_poll_data->is_ssl = is_ssl; + custom_poll_data->is_server = 1; + + custom_poll_data->write_cb = server_write_cb; + custom_poll_data->read_cb = server_read_cb; + + r = uv_poll_init_socket(uv_default_loop(), poll_req, sockfd); + if(r != 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "uv_poll_init_socket: %s", uv_strerror(r)); +#ifdef _WIN32 + closesocket(sockfd); +#else + close(sockfd); +#endif + if(custom_poll_data != NULL) { + uv_custom_poll_free(custom_poll_data); + poll_req->data = NULL; + }; + FREE(poll_req); + return -1; + /*LCOV_EXCL_STOP*/ + } + + server_write_cb(poll_req); + + return 0; +} + +int webserver_start(void) { + const uv_thread_t pth_cur_id = uv_thread_self(); + if(uv_thread_equal(&pth_main_id, &pth_cur_id) == 0) { + /*LCOV_EXCL_START*/ + logprintf(LOG_ERR, "webserver_start can only be started from the main thread"); + return -1; + /*LCOV_EXCL_STOP*/ + } + + if((async_req = MALLOC(sizeof(uv_async_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + uv_async_init(uv_default_loop(), async_req, webserver_process); + + // double itmp = 0.0; + // int webserver_enabled = 0; + loop = 1; + + if(lock_init == 0) { + lock_init = 1; +#ifdef _WIN32 + uv_mutex_init(&webserver_lock); +#else + pthread_mutexattr_init(&webserver_attr); + pthread_mutexattr_settype(&webserver_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&webserver_lock, &webserver_attr); +#endif + } + +#ifdef PILIGHT_REWRITE + if(settings_select_number(ORIGIN_WEBSERVER, "webserver-http-port", &itmp) == 0) { http_port = (int)itmp; } + if(settings_select_number(ORIGIN_WEBSERVER, "webgui-websockets", &itmp) == 0) { websockets = (int)itmp; } + if(settings_select_number(ORIGIN_WEBSERVER, "webserver-cache", &itmp) == 0) { cache = (int)itmp; } + if(settings_select_number(ORIGIN_WEBSERVER, "webserver-enable", &itmp) == 0) { webserver_enabled = (int)itmp; } +#ifdef WEBSERVER_HTTPS + if(settings_select_number(ORIGIN_WEBSERVER, "webserver-https-port", &itmp) == 0) { https_port = (int)itmp; } +#endif + + if(settings_select_string(ORIGIN_WEBSERVER, "webserver-root", &root) != 0) { + /*LCOV_EXCL_START*/ + if((root = MALLOC(strlen(WEBSERVER_ROOT)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(root, WEBSERVER_ROOT); + root_free = 1; + /*LCOV_EXCL_STOP*/ + } + + settings_select_string_element(ORIGIN_WEBSERVER, "webserver-authentication", 0, &authentication_username); + settings_select_string_element(ORIGIN_WEBSERVER, "webserver-authentication", 1, &authentication_password); +#else + /* Check on what port the webserver needs to run */ + settings_find_number("webserver-http-port", &http_port); + +#ifdef WEBSERVER_HTTPS + settings_find_number("webserver-https-port", &https_port); +#endif + + if(settings_find_string("webserver-root", &root) != 0) { + /* If no webserver port was set, use the default webserver port */ + if((root = MALLOC(strlen(WEBSERVER_ROOT)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(root, WEBSERVER_ROOT); + root_free = 1; + } + settings_find_number("webgui-websockets", &websockets); + + /* Do we turn on webserver caching. This means that all requested files are + loaded into the memory so they aren't read from the FS anymore */ + settings_find_number("webserver-cache", &cache); + settings_find_string("webserver-authentication-password", &authentication_password); + settings_find_string("webserver-authentication-username", &authentication_username); + +#endif + + eventpool_callback(REASON_CONFIG_UPDATE, broadcast); + eventpool_callback(REASON_BROADCAST_CORE, broadcast); + // eventpool_callback(REASON_ADHOC_CONNECTED, adhoc_mode); + // eventpool_callback(REASON_ADHOC_DISCONNECTED, webserver_restart); + eventpool_callback(REASON_SOCKET_SEND, webserver_send); + +#ifdef WEBSERVER_HTTPS + if(https_port > 0 /*&& webserver_enabled == 1*/) { + if(ssl_server_init_status() == 0) { + webserver_init(https_port, 1); + } else { + logprintf(LOG_NOTICE, "could not initialize mbedtls library, secure webserver not started"); + } + } +#endif + + if(http_port > 0 /*&& webserver_enabled == 1*/) { + webserver_init(http_port, 0); + } + + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/core/webserver.h b/lib/ESPiLight/pilight/libs/pilight/core/webserver.h new file mode 100644 index 0000000..3590642 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/core/webserver.h @@ -0,0 +1,63 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _WEBSERVER_H_ +#define _WEBSERVER_H_ + +#ifdef WEBSERVER_HTTPS +#include +#endif + +#include "../libs/libuv/uv.h" + +typedef struct connection_t { + int fd; + char *request; + const char *request_method; + const char *uri; + const char *http_version; + const char *query_string; + + int num_headers; + struct headers { + const char *name; + const char *value; + } http_headers[30]; + + char *content; + size_t content_len; + char mimetype[255]; + + int is_websocket; + int ping; + int status_code; + void *connection_param; + void *callback_param; + unsigned int flags; + unsigned short timer; + + int file_fd; + + char buffer[WEBSERVER_CHUNK_SIZE]; + +#ifdef WEBSERVER_HTTPS + int is_ssl; + int handshake; + mbedtls_ssl_context ssl; +#endif +} connection_t; + +int webserver_gc(void); +int webserver_start(void); +void *webserver_broadcast(void *); +void webserver_create_header(char **, const char *, char *, unsigned long); +int http_parse_request(char *, struct connection_t *); +const char *http_get_header(struct connection_t *, const char *); +void *webserver_clientize(void *param); + +#endif \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/datatypes/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/datatypes/CMakeLists.txt new file mode 100644 index 0000000..3ca9035 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/datatypes/CMakeLists.txt @@ -0,0 +1,6 @@ +project(pilight_datatypes) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/pilight/datatypes/stack.c b/lib/ESPiLight/pilight/libs/pilight/datatypes/stack.c new file mode 100644 index 0000000..ab6efaa --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/datatypes/stack.c @@ -0,0 +1,87 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include + +#include "../core/mem.h" +#include "stack.h" + +void dt_stack_free(struct stack_dt *stack, void (*func)(void *node)) { + int i = 0; + for(i=0;itop;i++) { + if(func != NULL) { + func(stack->list[i]); + } + } + if(stack->size > 0) { + FREE(stack->list); + } + FREE(stack); +} + +void dt_stack_push(struct stack_dt *stack, size_t size, void *item) { + if(stack->size == 0 || stack->size <= stack->top) { + if((stack->list = REALLOC(stack->list, size*(stack->size+12))) == NULL) { + OUT_OF_MEMORY + } + stack->size += 12; + } + stack->list[stack->top++] = item; +} + +int dt_stack_top(struct stack_dt *stack) { + return stack->top; +} + +void dt_stack_insert(struct stack_dt *stack, size_t size, int pos, void *item) { + int i = stack->top; + while(i >= pos) { + stack->list[i] = stack->list[i-1]; + i--; + } + if(stack->size == 0 || stack->size <= stack->top) { + if((stack->list = REALLOC(stack->list, size*(stack->size+12))) == NULL) { + printf("out of memory\n"); + exit(-1); + } + stack->size += 12; + } + stack->top++; + stack->list[pos] = item; +} + +void *dt_stack_pop(struct stack_dt *stack, int i) { + if(stack->top <= 0) { + return NULL; + } else if(i == -1) { + return stack->list[--stack->top]; + } else if(i < stack->top) { + int x = 0; + char *out = stack->list[i]; + for(x=i;xtop-1;x++) { + stack->list[x] = stack->list[x+1]; + } + stack->top--; + return out; + } + return NULL; +} + +void *dt_stack_peek(struct stack_dt *stack, int i) { + if(stack->top <= 0) { + return NULL; + } else if(i == -1) { + return stack->list[stack->top-1]; + } else if(i < stack->top) { + return stack->list[i]; + } else { + return NULL; + } +} \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/datatypes/stack.h b/lib/ESPiLight/pilight/libs/pilight/datatypes/stack.h new file mode 100644 index 0000000..6518c55 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/datatypes/stack.h @@ -0,0 +1,26 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _DATATYPES_STACK_T_ +#define _DATATYPES_STACK_T_ + +typedef struct stack_dt { + void **list; + int size; + int top; + int type; +} stack_dt; + +void dt_stack_free(struct stack_dt *, void (*)(void *)); +void dt_stack_push(struct stack_dt *, size_t, void *); +int dt_stack_top(struct stack_dt *); +void dt_stack_insert(struct stack_dt *, size_t, int, void *); +void *dt_stack_pop(struct stack_dt *, int); +void *dt_stack_peek(struct stack_dt *, int); + +#endif \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/events/CMakeLists.txt new file mode 100644 index 0000000..eb94090 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/CMakeLists.txt @@ -0,0 +1,14 @@ +project(pilight_events) + +add_subdirectory(actions) +add_subdirectory(functions) +add_subdirectory(operators) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +set(${PROJECT_NAME}_files + ${pilight_event_actions_files} + ${${PROJECT_NAME}_sources} + ${${PROJECT_NAME}_headers} +CACHE INTERNAL "") \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/action.c b/lib/ESPiLight/pilight/libs/pilight/events/action.c new file mode 100644 index 0000000..413edc3 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/action.c @@ -0,0 +1,364 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #include +#endif + +#include "../core/threads.h" +#include "../core/pilight.h" +#include "../core/common.h" +#include "../core/options.h" +#include "../core/dso.h" +#include "../core/log.h" +#include "../config/settings.h" + +#include "action.h" +#include "actions/action_header.h" + +#ifndef _WIN32 +void event_action_remove(char *name) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct event_actions_t *currP, *prevP; + + prevP = NULL; + + for(currP = event_actions; currP != NULL; prevP = currP, currP = currP->next) { + + if(strcmp(currP->name, name) == 0) { + if(prevP == NULL) { + event_actions = currP->next; + } else { + prevP->next = currP->next; + } + + logprintf(LOG_DEBUG, "removed event action %s", currP->name); + FREE(currP->name); + FREE(currP); + + break; + } + } +} +#endif + +void event_action_init(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + #include "actions/action_init.h" + +#ifndef _WIN32 + void *handle = NULL; + void (*init)(void); + void (*compatibility)(struct module_t *module); + char path[PATH_MAX]; + struct module_t module; + char pilight_version[strlen(PILIGHT_VERSION)+1]; + char pilight_commit[3]; + char *action_root = NULL; + int check1 = 0, check2 = 0, valid = 1, action_root_free = 0; + strcpy(pilight_version, PILIGHT_VERSION); + + struct dirent *file = NULL; + DIR *d = NULL; + struct stat s; + + memset(pilight_commit, '\0', 3); + + if(settings_find_string("actions-root", &action_root) != 0) { + /* If no action root was set, use the default action root */ + if((action_root = MALLOC(strlen(ACTION_ROOT)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(action_root, ACTION_ROOT); + action_root_free = 1; + } + size_t len = strlen(action_root); + if(action_root[len-1] != '/') { + strcat(action_root, "/"); + } + + if((d = opendir(action_root))) { + while((file = readdir(d)) != NULL) { + memset(path, '\0', PATH_MAX); + sprintf(path, "%s%s", action_root, file->d_name); + if(stat(path, &s) == 0) { + /* Check if file */ + if(S_ISREG(s.st_mode)) { + if(strstr(file->d_name, ".so") != NULL) { + valid = 1; + + if((handle = dso_load(path)) != NULL) { + init = dso_function(handle, "init"); + compatibility = dso_function(handle, "compatibility"); + if(init && compatibility) { + compatibility(&module); + if(module.name != NULL && module.version != NULL && module.reqversion != NULL) { + char ver[strlen(module.reqversion)+1]; + strcpy(ver, module.reqversion); + + if((check1 = vercmp(ver, pilight_version)) > 0) { + valid = 0; + } + + if(check1 == 0 && module.reqcommit != NULL) { + char com[strlen(module.reqcommit)+1]; + strcpy(com, module.reqcommit); + sscanf(HASH, "v%*[0-9].%*[0-9]-%[0-9]-%*[0-9a-zA-Z\n\r]", pilight_commit); + + if(strlen(pilight_commit) > 0 && (check2 = vercmp(com, pilight_commit)) > 0) { + valid = 0; + } + } + if(valid == 1) { + char tmp[strlen(module.name)+1]; + strcpy(tmp, module.name); + event_action_remove(tmp); + init(); + logprintf(LOG_DEBUG, "loaded event action %s v%s", file->d_name, module.version); + } else { + if(module.reqcommit != NULL) { + logprintf(LOG_ERR, "event action %s requires at least pilight v%s (commit %s)", file->d_name, module.reqversion, module.reqcommit); + } else { + logprintf(LOG_ERR, "event action %s requires at least pilight v%s", file->d_name, module.reqversion); + } + } + } else { + logprintf(LOG_ERR, "invalid module %s", file->d_name); + } + } + } + } + } + } + } + closedir(d); + } + if(action_root_free) { + FREE(action_root); + } +#endif +} + +void event_action_register(struct event_actions_t **act, const char *name) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if((*act = MALLOC(sizeof(struct event_actions_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if(((*act)->name = MALLOC(strlen(name)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy((*act)->name, name); + + (*act)->options = NULL; + (*act)->run = NULL; + (*act)->nrthreads = 0; + (*act)->checkArguments = NULL; + + (*act)->next = event_actions; + event_actions = (*act); +} + +int event_action_gc(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct event_actions_t *tmp_action = NULL; + while(event_actions) { + tmp_action = event_actions; + if(tmp_action->nrthreads > 0) { + logprintf(LOG_DEBUG, "waiting for \"%s\" threads to finish", tmp_action->name); + } + FREE(tmp_action->name); + options_delete(tmp_action->options); + event_actions = event_actions->next; + FREE(tmp_action); + } + if(event_actions != NULL) { + FREE(event_actions); + } + + logprintf(LOG_DEBUG, "garbage collected event action library"); + return 0; +} + +void event_action_thread_init(struct devices_t *dev) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if((dev->action_thread = MALLOC(sizeof(struct event_action_thread_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + pthread_mutexattr_init(&dev->action_thread->attr); + pthread_mutexattr_settype(&dev->action_thread->attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&dev->action_thread->mutex, &dev->action_thread->attr); + pthread_cond_init(&dev->action_thread->cond, NULL); + dev->action_thread->running = 0; + dev->action_thread->obj = NULL; + dev->action_thread->action = NULL; + dev->action_thread->loop = 0; + dev->action_thread->initialized = 0; + memset(&dev->action_thread->pth, '\0', sizeof(pthread_t)); +} + +void event_action_thread_start(struct devices_t *dev, char *name, void *(*func)(void *), struct rules_actions_t *obj) { + struct event_action_thread_t *thread = dev->action_thread; + + if(thread->running == 1) { + logprintf(LOG_DEBUG, "aborting previous \"%s\" action for device \"%s\"", thread->action, dev->id); + } + + thread->loop = 0; + + pthread_mutex_unlock(&thread->mutex); + pthread_cond_signal(&thread->cond); + + while(thread->running > 0) { + usleep(10); + } + + if(thread->initialized == 1) { + pthread_join(thread->pth, NULL); + thread->initialized = 0; + } + + // if(thread->param != NULL) { + // json_delete(thread->param); + // thread->param = NULL; + // } + + // if(param != NULL) { + // char *json = json_stringify(param, NULL); + // thread->param = json_decode(json); + // json_free(json); + // } + + thread->obj = obj; + thread->device = dev; + thread->loop = 1; + thread->action = REALLOC(thread->action, strlen(name)+1); + strcpy(thread->action, name); + + thread->initialized = 1; + threads_create(&thread->pth, NULL, func, (void *)thread); +} + +int event_action_thread_wait(struct devices_t *dev, int interval) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct timeval tp; + struct timespec ts; + + pthread_mutex_unlock(&dev->action_thread->mutex); + + gettimeofday(&tp, NULL); + ts.tv_sec = tp.tv_sec; + ts.tv_nsec = tp.tv_usec * 1000; + ts.tv_sec += interval; + + pthread_mutex_lock(&dev->action_thread->mutex); + + return pthread_cond_timedwait(&dev->action_thread->cond, &dev->action_thread->mutex, &ts); +} + +void event_action_thread_stop(struct devices_t *dev) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct event_action_thread_t *thread = NULL; + + if(dev != NULL) { + thread = dev->action_thread; + if(thread->running == 1) { + logprintf(LOG_DEBUG, "aborting running \"%s\" action for device \"%s\"", thread->action, dev->id); + + thread->loop = 0; + pthread_mutex_unlock(&thread->mutex); + pthread_cond_signal(&thread->cond); + + while(thread->running > 0) { + usleep(10); + } + } + if(thread->initialized == 1) { + pthread_join(thread->pth, NULL); + thread->initialized = 0; + } + } +} + +void event_action_thread_free(struct devices_t *dev) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct event_action_thread_t *thread = NULL; + + if(dev != NULL && dev->action_thread != NULL) { + thread = dev->action_thread; + if(thread->running == 1) { + logprintf(LOG_DEBUG, "aborting running \"%s\" action for device \"%s\"", thread->action, dev->id); + + thread->loop = 0; + pthread_mutex_unlock(&thread->mutex); + pthread_cond_signal(&thread->cond); + while(thread->running > 0) { + usleep(10); + } + } + if(thread->action != NULL) { + FREE(thread->action); + } + // if(thread->param != NULL) { + // json_delete(thread->param); + // thread->param = NULL; + // } + if(thread->initialized == 1) { + pthread_join(thread->pth, NULL); + thread->initialized = 0; + } + FREE(dev->action_thread); + } +} + +void event_action_started(struct event_action_thread_t *thread) { + logprintf(LOG_INFO, "started \"%s\" action for device \"%s\"", thread->action, thread->device->id); + pthread_mutex_lock(&thread->mutex); + thread->running = 1; + pthread_mutex_unlock(&thread->mutex); +} + +void event_action_stopped(struct event_action_thread_t *thread) { + logprintf(LOG_INFO, "stopped \"%s\" action for device \"%s\"", thread->action, thread->device->id); + pthread_mutex_lock(&thread->mutex); + thread->running = 0; + pthread_mutex_unlock(&thread->mutex); +} diff --git a/lib/ESPiLight/pilight/libs/pilight/events/action.h b/lib/ESPiLight/pilight/libs/pilight/events/action.h new file mode 100644 index 0000000..946d933 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/action.h @@ -0,0 +1,67 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _ACTION_H_ +#define _ACTION_H_ + +typedef struct event_action_thread_t event_action_thread_t; +typedef struct event_actions_t event_actions_t; +typedef struct rules_actions_t rules_actions_t; + +#include "../core/json.h" +#include "../core/common.h" +#include "../config/devices.h" +#include "../config/rules.h" + +struct event_actions_t { + char *name; + int nrthreads; + int (*run)(struct rules_actions_t *obj); + int (*checkArguments)(struct rules_actions_t *obj); + struct options_t *options; + + struct event_actions_t *next; +}; + +struct event_action_thread_t { + int running; + int loop; + int initialized; + char *action; + pthread_t pth; + pthread_mutex_t mutex; + pthread_cond_t cond; + pthread_mutexattr_t attr; + struct rules_actions_t *obj; + struct devices_t *device; +}; + +struct event_actions_t *event_actions; + +void event_action_init(void); +void event_action_register(struct event_actions_t **act, const char *name); +int event_action_gc(void); +void event_action_thread_init(struct devices_t *dev); +int event_action_thread_wait(struct devices_t *dev, int interval); +void event_action_thread_start(struct devices_t *dev, char *name, void *(*func)(void *), struct rules_actions_t *obj); +void event_action_thread_stop(struct devices_t *dev); +void event_action_thread_free(struct devices_t *dev); +void event_action_stopped(struct event_action_thread_t *thread); +void event_action_started(struct event_action_thread_t *thread); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/CMakeInclude.txt b/lib/ESPiLight/pilight/libs/pilight/events/actions/CMakeInclude.txt new file mode 100644 index 0000000..cb68b99 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/CMakeInclude.txt @@ -0,0 +1,30 @@ +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/action_init.h") +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/action_header.h") + +set(headers) +foreach(header ${${PROJECT_NAME}_headers}) + string(REPLACE "${PROJECT_SOURCE_DIR}/" " #include \"" header1 ${header}) + string(REPLACE ".h" ".h\"!" header2 ${header1}) + list(APPEND headers ${header2}) +endforeach(header) + +string(REPLACE "!" "\n" header4 ${headers}) +set(ACTION_HEADERS ${header4}) +configure_file(${PROJECT_SOURCE_DIR}/action_header.h.in ${PROJECT_SOURCE_DIR}/action_header.h) + +execute_process( +COMMAND grep -h "void .*Init(void)" ${${PROJECT_NAME}_sources} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE action_result + OUTPUT_VARIABLE action_init) + +set(inits) +foreach(init ${action_init}) + string(REPLACE "void " " " init1 ${init}) + string(REPLACE "(void) {" "()!" init2 ${init1}) + list(APPEND inits ${init2}) +endforeach(init) + +string(REPLACE "!" ";" init4 ${inits}) +set(ACTION_INIT ${init4}) +configure_file(${PROJECT_SOURCE_DIR}/action_init.h.in ${PROJECT_SOURCE_DIR}/action_init.h) diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/events/actions/CMakeLists.txt new file mode 100644 index 0000000..e2d9a0e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/CMakeLists.txt @@ -0,0 +1,24 @@ +project(pilight_event_actions) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +if(${MODULESPACK} MATCHES "OFF" OR WIN32) + include(CMakeInclude.txt) + + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") +else() + foreach(file ${${PROJECT_NAME}_sources}) + get_filename_component(name ${file} NAME_WE) + add_library(${name}_module MODULE ${file}) + target_link_libraries(${name}_module ${CMAKE_THREAD_LIBS_INIT}) + target_link_libraries(${name}_module m) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_link_libraries(${name}_module execinfo) + endif() + target_link_libraries(${name}_module ${CMAKE_DL_LIBS}) + set_target_properties(${name}_module PROPERTIES OUTPUT_NAME ${name}) + string(REPLACE "_" "-" debname ${name}) + install(FILES ${CMAKE_BINARY_DIR}/libs/pilight/events/actions/lib${name}.so DESTINATION lib/pilight/actions RENAME ${name}.so COMPONENT pilight-action-${debname}) + endforeach() +endif() \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/action_header.h.in b/lib/ESPiLight/pilight/libs/pilight/events/actions/action_header.h.in new file mode 100644 index 0000000..cea98b6 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/action_header.h.in @@ -0,0 +1 @@ +@ACTION_HEADERS@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/action_init.h.in b/lib/ESPiLight/pilight/libs/pilight/events/actions/action_init.h.in new file mode 100644 index 0000000..1eea6b2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/action_init.h.in @@ -0,0 +1 @@ +@ACTION_INIT@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/dim.c b/lib/ESPiLight/pilight/libs/pilight/events/actions/dim.c new file mode 100644 index 0000000..865abd4 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/dim.c @@ -0,0 +1,878 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include + +#include "../../core/pilight.h" +#include "../../core/options.h" +#include "../../config/devices.h" +#include "../../core/log.h" +#include "../../core/dso.h" +#include "../action.h" +#include "../events.h" +#include "dim.h" + +#define DECREASING 0 +#define INCREASING 1 + +static struct units_t { + char name[255]; + int id; +} units[] = { + { "MILLISECOND", 1 }, + { "SECOND", 2 }, + { "MINUTE", 3 }, + { "HOUR", 4 }, + { "DAY", 5 } +}; + +static int checkArguments(struct rules_actions_t *obj) { + struct JsonNode *jdevice = NULL; + struct JsonNode *jto = NULL; + struct JsonNode *jfor = NULL; + struct JsonNode *jafter = NULL; + struct JsonNode *jfrom = NULL; + struct JsonNode *jin = NULL; + struct JsonNode *javalues = NULL; + struct JsonNode *jbvalues = NULL; + struct JsonNode *jcvalues = NULL; + struct JsonNode *jdvalues = NULL; + struct JsonNode *jevalues = NULL; + struct JsonNode *jfvalues = NULL; + struct JsonNode *jachild = NULL; + struct JsonNode *jbchild = NULL; + struct JsonNode *jcchild = NULL; + struct JsonNode *jdchild = NULL; + struct JsonNode *jechild = NULL; + struct JsonNode *jfchild = NULL; + char **array = NULL; + double nr1 = 0.0, nr2 = 0.0, nr3 = 0.0, nr4 = 0.0, nr5 = 0.0, nr6 = 0.0; + double dimfrom = 0.0, dimto = 0.0; + int nrvalues = 0, l = 0, i = 0, match = 0; + int nrunits = (sizeof(units)/sizeof(units[0])); + + if(obj == NULL) { + /* Internal error */ + return -1; + } + + if(obj->arguments == NULL) { + /* Internal error */ + return -1; + } + + jdevice = json_find_member(obj->arguments, "DEVICE"); + jto = json_find_member(obj->arguments, "TO"); + jfor = json_find_member(obj->arguments, "FOR"); + jin = json_find_member(obj->arguments, "IN"); + jafter = json_find_member(obj->arguments, "AFTER"); + jfrom = json_find_member(obj->arguments, "FROM"); + + if(jdevice == NULL) { + logprintf(LOG_ERR, "dim action is missing a \"DEVICE ...\" statement"); + return -1; + } + + if(jto == NULL) { + logprintf(LOG_ERR, "dim action is missing a \"TO ...\" statement"); + return -1; + } + + json_find_number(jdevice, "order", &nr1); + json_find_number(jto, "order", &nr2); + if((int)nr1 != 1 || (int)nr2 != 2) { + logprintf(LOG_ERR, "dim actions are formatted as \"dim DEVICE ... TO ...\""); + return -1; + } + + if(jfor != NULL) { + json_find_number(jfor, "order", &nr3); + if(nr3 < nr2) { + logprintf(LOG_ERR, "dim actions are formatted as \"dim DEVICE ... TO ... FOR ...\""); + return -1; + } + } + + if(jafter != NULL) { + json_find_number(jafter, "order", &nr4); + if(nr4 < nr2) { + logprintf(LOG_ERR, "dim actions are formatted as \"dim DEVICE ... TO ... AFTER ...\""); + return -1; + } + } + + if(jin != NULL) { + json_find_number(jin, "order", &nr6); + if(nr6 < nr2) { + logprintf(LOG_ERR, "dim actions are formatted as \"dim DEVICE ... TO ... FROM ... IN ...\""); + return -1; + } + } + + if(jfrom != NULL) { + json_find_number(jfrom, "order", &nr5); + if(nr5 < nr2) { + logprintf(LOG_ERR, "dim actions are formatted as \"dim DEVICE ... TO ... FROM ... IN ...\""); + return -1; + } + if(jin == NULL) { + logprintf(LOG_ERR, "dim actions are formatted as \"dim DEVICE ... TO ... FROM ... IN ...\""); + return -1; + } + } else if(jin != NULL) { + logprintf(LOG_ERR, "dim actions are formatted as \"dim DEVICE ... TO ... FROM ... IN ...\""); + return -1; + } + + if((javalues = json_find_member(jto, "value")) != NULL) { + jachild = json_first_child(javalues); + while(jachild) { + nrvalues++; + jachild = jachild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "dim actions are formatted as \"dim DEVICE ... TO ...\""); + return -1; + } + + nrvalues = 0; + if(jfor != NULL) { + if((jcvalues = json_find_member(jfor, "value")) != NULL) { + jcchild = json_first_child(jcvalues); + while(jcchild) { + nrvalues++; + if(jcchild->tag == JSON_STRING) { + l = explode(jcchild->string_, " ", &array); + if(l == 2) { + match = 0; + for(i=0;i 0) { + array_free(&array, l); + } + return -1; + } + } + jcchild = jcchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "dim action \"FOR\" only takes one argument"); + return -1; + } + } + + nrvalues = 0; + if(jafter != NULL) { + if((jdvalues = json_find_member(jafter, "value")) != NULL) { + jdchild = json_first_child(jdvalues); + while(jdchild) { + nrvalues++; + if(jdchild->tag == JSON_STRING) { + l = explode(jdchild->string_, " ", &array); + if(l == 2) { + match = 0; + for(i=0;i 0) { + array_free(&array, l); + } + return -1; + } + } + jdchild = jdchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "dim action \"AFTER\" only takes one argument"); + return -1; + } + } + + nrvalues = 0; + if(jfrom != NULL) { + if((jevalues = json_find_member(jfrom, "value")) != NULL) { + jechild = json_first_child(jevalues); + while(jechild) { + nrvalues++; + jechild = jechild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "dim action \"FROM\" only takes one argument"); + return -1; + } + } + + nrvalues = 0; + if(jin != NULL) { + if((jfvalues = json_find_member(jin, "value")) != NULL) { + jfchild = json_first_child(jfvalues); + while(jfchild) { + nrvalues++; + if(jfchild->tag == JSON_STRING) { + l = explode(jfchild->string_, " ", &array); + if(l == 2) { + match = 0; + for(i=0;i 0) { + array_free(&array, l); + } + return -1; + } + } + jfchild = jfchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "dim action \"IN\" only takes one argument"); + return -1; + } + } + + if((jbvalues = json_find_member(jdevice, "value")) != NULL) { + jbchild = json_first_child(jbvalues); + while(jbchild) { + if(jbchild->tag == JSON_STRING) { + struct devices_t *dev = NULL; + if(devices_get(jbchild->string_, &dev) == 0) { + if((javalues = json_find_member(jto, "value")) != NULL) { + jachild = json_first_child(javalues); + while(jachild) { + match = 0; + if(jachild->tag == JSON_NUMBER) { + dimto = jachild->number_; + match = 1; + } + if(match == 1) { + struct protocols_t *tmp_protocols = dev->protocols; + if(tmp_protocols->listener->devtype == DIMMER) { + struct devices_settings_t *tmp_settings = dev->settings; + int match1 = 0, match2 = 0; + while(tmp_settings) { + if(strcmp(tmp_settings->name, "dimlevel-maximum") == 0) { + if(tmp_settings->values->type == JSON_NUMBER && + (int)tmp_settings->values->number_ < (int)dimto) { + logprintf(LOG_ERR, "device \"%s\" can't be set to dimlevel \"%d\"", jbchild->string_, (int)dimto); + return -1; + } + match1 = 1; + } + if(strcmp(tmp_settings->name, "dimlevel-minimum") == 0) { + if(tmp_settings->values->type == JSON_NUMBER && + (int)tmp_settings->values->number_ > (int)dimto) { + logprintf(LOG_ERR, "device \"%s\" can't be set to dimlevel \"%d\"", jbchild->string_, (int)dimto); + return -1; + } + match2 = 1; + } + tmp_settings = tmp_settings->next; + } + if(match1 == 0 || match2 == 0) { + while(tmp_protocols) { + struct options_t *opt = tmp_protocols->listener->options; + while(opt) { + if(match1 == 0 && strcmp(opt->name, "dimlevel-maximum") == 0 && + opt->vartype == JSON_NUMBER && (int)(intptr_t)opt->def < (int)dimto) { + logprintf(LOG_ERR, "device \"%s\" can't be set to dimlevel \"%d\"", jbchild->string_, (int)dimto); + return -1; + } + if(match2 == 0 && strcmp(opt->name, "dimlevel-minimum") == 0 && + opt->vartype == JSON_NUMBER && (int)(intptr_t)opt->def > (int)dimto) { + logprintf(LOG_ERR, "device \"%s\" can't be set to dimlevel \"%d\"", jbchild->string_, (int)dimto); + return -1; + } + opt = opt->next; + } + tmp_protocols = tmp_protocols->next; + } + } + } else { + logprintf(LOG_ERR, "device \"%s\" doesn't support dimming", jbchild->string_); + return -1; + } + } else { + logprintf(LOG_ERR, "internal error 1 in dim action", jbchild->string_); + return -1; + } + jachild = jachild->next; + } + } else { + logprintf(LOG_ERR, "internal error 2 in dim action", jbchild->string_); + return -1; + } + + if((jevalues = json_find_member(jfrom, "value")) != NULL) { + jechild = json_first_child(jevalues); + while(jechild) { + match = 0; + if(jechild->tag == JSON_NUMBER) { + dimfrom = jechild->number_; + match = 1; + } + if(match == 1) { + struct protocols_t *tmp_protocols = dev->protocols; + if(tmp_protocols->listener->devtype == DIMMER) { + struct devices_settings_t *tmp_settings = dev->settings; + int match1 = 0, match2 = 0; + while(tmp_settings) { + if(strcmp(tmp_settings->name, "dimlevel-maximum") == 0) { + if(tmp_settings->values->type == JSON_NUMBER && + (int)tmp_settings->values->number_ < (int)dimfrom) { + logprintf(LOG_ERR, "device \"%s\" dimlevel can't be set to \"%d\"", jbchild->string_, (int)dimfrom); + return -1; + } + match1 = 1; + } + if(strcmp(tmp_settings->name, "dimlevel-minimum") == 0) { + if(tmp_settings->values->type == JSON_NUMBER && + (int)tmp_settings->values->number_ > (int)dimfrom) { + logprintf(LOG_ERR, "device \"%s\" dimlevel can't be set to \"%d\"", jbchild->string_, (int)dimfrom); + return -1; + } + match2 = 1; + } + tmp_settings = tmp_settings->next; + } + if(match1 == 0 || match2 == 0) { + while(tmp_protocols) { + struct options_t *opt = tmp_protocols->listener->options; + while(opt) { + if(match1 == 0 && strcmp(opt->name, "dimlevel-maximum") == 0 && + opt->vartype == JSON_NUMBER && (int)(intptr_t)opt->def < (int)dimfrom) { + logprintf(LOG_ERR, "device \"%s\" dimlevel can't be set to \"%d\"", jbchild->string_, (int)dimfrom); + return -1; + } + if(match2 == 0 && strcmp(opt->name, "dimlevel-minimum") == 0 && + opt->vartype == JSON_NUMBER && (int)(intptr_t)opt->def > (int)dimfrom) { + logprintf(LOG_ERR, "device \"%s\" dimlevel can't be set to \"%d\"", jbchild->string_, (int)dimfrom); + return -1; + } + opt = opt->next; + } + tmp_protocols = tmp_protocols->next; + } + } + } else { + logprintf(LOG_ERR, "device \"%s\" doesn't support dimming", jbchild->string_); + return -1; + } + } else { + logprintf(LOG_ERR, "device \"%s\" doesn't exists", jbchild->string_); + return -1; + } + jechild = jechild->next; + } + } + } else { + logprintf(LOG_ERR, "internal error 3 in dim action", jbchild->string_); + return -1; + } + } else { + logprintf(LOG_ERR, "internal error 4 in dim action", jbchild->string_); + return -1; + } + jbchild = jbchild->next; + } + } else { + logprintf(LOG_ERR, "internal error 5 in dim action", jbchild->string_); + return -1; + } + return 0; +} + +static void *thread(void *param) { + struct event_action_thread_t *pth = (struct event_action_thread_t *)param; + struct JsonNode *json = pth->obj->arguments; + struct JsonNode *jedimlevel = NULL; + struct JsonNode *jsdimlevel = NULL; + struct JsonNode *jto = NULL; + struct JsonNode *jafter = NULL; + struct JsonNode *jfor = NULL; + struct JsonNode *jfrom = NULL; + struct JsonNode *jin = NULL; + struct JsonNode *javalues = NULL; + struct JsonNode *jcvalues = NULL; + struct JsonNode *jdvalues = NULL; + struct JsonNode *jevalues = NULL; + struct JsonNode *jfvalues = NULL; + struct JsonNode *jaseconds = NULL; + struct JsonNode *jiseconds = NULL; + struct JsonNode *jvalues = NULL; + char *old_state = NULL, **array = NULL; + double dimlevel = 0.0, old_dimlevel = 0.0, new_dimlevel = 0.0, cur_dimlevel = 0.0; + int seconds_after = 0, seconds_for = 0, seconds_in = 0, has_in = 0, dimdiff = 0; + int type_for = 0, type_after = 0, type_in = 0; + int direction = 0, interval = 0, timer = 0; + int l = 0, i = 0, nrunits = (sizeof(units)/sizeof(units[0])); + char state[3]; + + event_action_started(pth); + + if((jfor = json_find_member(json, "FOR")) != NULL) { + if((jcvalues = json_find_member(jfor, "value")) != NULL) { + jaseconds = json_find_element(jcvalues, 0); + if(jaseconds != NULL) { + if(jaseconds->tag == JSON_STRING) { + l = explode(jaseconds->string_, " ", &array); + if(l == 2) { + for(i=0;i 0) { + array_free(&array, l); + } + } + } + } + } + + if((jafter = json_find_member(json, "AFTER")) != NULL) { + if((jdvalues = json_find_member(jafter, "value")) != NULL) { + jaseconds = json_find_element(jdvalues, 0); + if(jaseconds != NULL) { + if(jaseconds->tag == JSON_STRING) { + l = explode(jaseconds->string_, " ", &array); + if(l == 2) { + for(i=0;i 0) { + array_free(&array, l); + } + } + } + } + } + + if((jin = json_find_member(json, "IN")) != NULL) { + if((jfvalues = json_find_member(jin, "value")) != NULL) { + jiseconds = json_find_element(jfvalues, 0); + if(jiseconds != NULL) { + if(jiseconds->tag == JSON_STRING) { + l = explode(jiseconds->string_, " ", &array); + if(l == 2) { + for(i=0;i 0) { + array_free(&array, l); + } + } + } + } + } + + switch(type_for) { + case 3: + seconds_for *= 60; + break; + case 4: + seconds_for *= (60*60); + break; + case 5: + seconds_for *= (60*60*24); + break; + } + + switch(type_after) { + case 3: + seconds_after *= 60; + break; + case 4: + seconds_after *= (60*60); + break; + case 5: + seconds_after *= (60*60*24); + break; + } + + switch(type_in) { + case 3: + seconds_in *= 60; + break; + case 4: + seconds_in *= (60*60); + break; + case 5: + seconds_in *= (60*60*24); + break; + } + + if(pilight.debuglevel == 1) { + fprintf(stderr, "action dim: for %d:%d, after %d:%d, in: %d:%d\n", seconds_for, type_for, seconds_after, type_after, seconds_in, type_in); + } + /* Store current state and dimlevel */ + struct devices_t *tmp = pth->device; + int match1 = 0, match2 = 0; + while(tmp) { + struct devices_settings_t *opt = tmp->settings; + while(opt) { + if(strcmp(opt->name, "state") == 0) { + if(opt->values->type == JSON_STRING) { + if((old_state = MALLOC(strlen(opt->values->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(old_state, opt->values->string_); + match1 = 1; + } + } + if(strcmp(opt->name, "dimlevel") == 0) { + if(opt->values->type == JSON_NUMBER) { + cur_dimlevel = opt->values->number_; + match2 = 1; + } + } + if(match1 == 1 && match2 == 1) { + break; + } + opt = opt->next; + } + if(match1 == 1 && match2 == 1) { + break; + } + tmp = tmp->next; + } + if(match1 == 0) { + logprintf(LOG_NOTICE, "could not store old state of \"%s\"", pth->device->id); + } + if(match2 == 0) { + logprintf(LOG_NOTICE, "could not store old dimlevel of \"%s\"", pth->device->id); + } + + if((jfrom = json_find_member(json, "FROM")) != NULL) { + if((jevalues = json_find_member(jfrom, "value")) != NULL) { + jsdimlevel = json_find_element(jevalues, 0); + if(jsdimlevel != NULL) { + if(jsdimlevel->tag == JSON_NUMBER) { + old_dimlevel = (int)jsdimlevel->number_; + } + } + } + } + + if((jto = json_find_member(json, "TO")) != NULL) { + if((javalues = json_find_member(jto, "value")) != NULL) { + jedimlevel = json_find_element(javalues, 0); + if(jedimlevel != NULL) { + if(jedimlevel->tag == JSON_NUMBER) { + new_dimlevel = (int)jedimlevel->number_; + dimlevel = (int)jedimlevel->number_; + strcpy(state, "on"); + } + } + } + } + + if(pilight.debuglevel == 1) { + fprintf(stderr, "action dim: old %d, new %d, direction %d\n", (int)old_dimlevel, (int)new_dimlevel, direction); + } + + if(has_in == 1) { + if(old_dimlevel < new_dimlevel) { + direction = INCREASING; + dimdiff = (int)(new_dimlevel - old_dimlevel); + interval = (int)(seconds_in / dimdiff); + } else if(old_dimlevel > new_dimlevel) { + direction = DECREASING; + dimdiff = (int)(old_dimlevel - new_dimlevel); + interval = (int)(seconds_in / dimdiff); + } else { + dimdiff = 0; + interval = 0; + } + } + + /* + * We'll switch from first dimlevel to second dimlevel after X seconds + * and switch back after X seconds. + */ + if(has_in == 0) { + if(old_state == NULL || ((strcmp(old_state, "on") != 0 || (int)cur_dimlevel != (int)new_dimlevel))) { + timer = 0; + while(pth->loop == 1) { + if(timer == seconds_after) { + jvalues = json_mkobject(); + json_append_member(jvalues, "dimlevel", json_mknumber(dimlevel, 0)); + if(pilight.control != NULL) { + pilight.control(pth->device, state, json_first_child(jvalues), ACTION); + } + json_delete(jvalues); + break; + } + timer++; + if(type_after > 1) { + sleep(1); + } else { + usleep(1000); + } + } + + /* + * We only need to restore the state if it was actually changed + */ + if(seconds_for > 0 && old_state != NULL && (strcmp(old_state, "on") != 0 || (int)cur_dimlevel != (int)new_dimlevel)) { + timer = 0; + while(pth->loop == 1) { + if(seconds_for == timer) { + jvalues = json_mkobject(); + json_append_member(jvalues, "dimlevel", json_mknumber(cur_dimlevel, 0)); + if(pilight.control != NULL) { + if(strcmp(old_state, "off") == 0) { + pilight.control(pth->device, state, json_first_child(jvalues), ACTION); + pilight.control(pth->device, old_state, NULL, ACTION); + } else { + pilight.control(pth->device, old_state, json_first_child(jvalues), ACTION); + } + } + json_delete(jvalues); + break; + } + timer++; + if(type_for > 1) { + sleep(1); + } else { + usleep(1000); + } + } + } + } + /* We'll gently start increasing / decreasing the dimlevel after X seconds in X seconds. */ + } else if(interval > 0) { + timer = 0; + while(pth->loop == 1) { + if(timer == seconds_after) { + break; + } + timer++; + if(type_after > 1) { + sleep(1); + } else { + usleep(1000); + } + } + if(direction == INCREASING) { + for(i=(int)old_dimlevel;i<=(int)new_dimlevel;i++) { + timer = 0; + while(pth->loop == 1) { + if(interval == timer || i == (int)old_dimlevel) { + jvalues = json_mkobject(); + json_append_member(jvalues, "dimlevel", json_mknumber(i, 0)); + if(pilight.control != NULL) { + pilight.control(pth->device, state, json_first_child(jvalues), ACTION); + } + json_delete(jvalues); + break; + } + timer++; + if(type_in > 1) { + sleep(1); + } else { + usleep(1000); + } + } + } + } else { + for(i=(int)old_dimlevel;i>=(int)new_dimlevel;i--) { + timer = 0; + while(pth->loop == 1) { + if(interval == timer || i == (int)old_dimlevel) { + jvalues = json_mkobject(); + json_append_member(jvalues, "dimlevel", json_mknumber(i, 0)); + if(pilight.control != NULL) { + pilight.control(pth->device, state, json_first_child(jvalues), ACTION); + } + json_delete(jvalues); + break; + } + timer++; + if(type_in > 1) { + sleep(1); + } else { + usleep(1000); + } + } + } + } + /* + * We only need to restore the state if it was actually changed + */ + if(seconds_for > 0 && old_state != NULL && + (strcmp(old_state, "on") != 0 || (int)cur_dimlevel != (int)new_dimlevel)) { + timer = 0; + while(pth->loop == 1) { + if(timer == seconds_for) { + jvalues = json_mkobject(); + json_append_member(jvalues, "dimlevel", json_mknumber(cur_dimlevel, 0)); + if(pilight.control != NULL) { + if(strcmp(old_state, "off") == 0) { + pilight.control(pth->device, state, json_first_child(jvalues), ACTION); + pilight.control(pth->device, old_state, NULL, ACTION); + } else { + pilight.control(pth->device, old_state, json_first_child(jvalues), ACTION); + } + } + json_delete(jvalues); + break; + } + timer++; + if(type_for > 1) { + sleep(1); + } else { + usleep(1000); + } + } + } + } + + if(old_state != NULL) { + FREE(old_state); + } + + event_action_stopped(pth); + + return (void *)NULL; +} + +static int run(struct rules_actions_t *obj) { + struct JsonNode *jdevice = NULL; + struct JsonNode *jto = NULL; + struct JsonNode *jbvalues = NULL; + struct JsonNode *jbchild = NULL; + + if((jdevice = json_find_member(obj->arguments, "DEVICE")) != NULL && + (jto = json_find_member(obj->arguments, "TO")) != NULL) { + if((jbvalues = json_find_member(jdevice, "value")) != NULL) { + jbchild = json_first_child(jbvalues); + while(jbchild) { + if(jbchild->tag == JSON_STRING) { + struct devices_t *dev = NULL; + if(devices_get(jbchild->string_, &dev) == 0) { + event_action_thread_start(dev, action_dim->name, thread, obj); + } + } + jbchild = jbchild->next; + } + } + } + return 0; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void actionDimInit(void) { + event_action_register(&action_dim, "dim"); + + options_add(&action_dim->options, 'a', "DEVICE", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_dim->options, 'b', "TO", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + options_add(&action_dim->options, 'c', "FROM", OPTION_OPT_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + options_add(&action_dim->options, 'd', "FOR", OPTION_OPT_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_dim->options, 'e', "AFTER", OPTION_OPT_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_dim->options, 'f', "IN", OPTION_OPT_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + + action_dim->run = &run; + action_dim->checkArguments = &checkArguments; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "dim"; + module->version = "3.5"; + module->reqversion = "6.0"; + module->reqcommit = "152"; +} + +void init(void) { + actionDimInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/dim.h b/lib/ESPiLight/pilight/libs/pilight/events/actions/dim.h new file mode 100644 index 0000000..a682c46 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/dim.h @@ -0,0 +1,28 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _EVENT_ACTION_DIM_H_ +#define _EVENT_ACTION_DIM_H_ + +#include "../action.h" + +struct event_actions_t *action_dim; + +void actionDimInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/label.c b/lib/ESPiLight/pilight/libs/pilight/events/actions/label.c new file mode 100644 index 0000000..eb31416 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/label.c @@ -0,0 +1,584 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include + +#include "../action.h" +#include "../events.h" +#include "../../core/options.h" +#include "../../config/devices.h" +#include "../../core/log.h" +#include "../../core/dso.h" +#include "../../core/pilight.h" +#include "label.h" + +static struct units_t { + char name[255]; + int id; +} units[] = { + { "MILLISECOND", 1 }, + { "SECOND", 2 }, + { "MINUTE", 3 }, + { "HOUR", 4 }, + { "DAY", 5 } +}; + +static int checkArguments(struct rules_actions_t *obj) { + struct JsonNode *jdevice = NULL; + struct JsonNode *jto = NULL; + struct JsonNode *jfor = NULL; + struct JsonNode *jafter = NULL; + struct JsonNode *jcolor = NULL; + struct JsonNode *javalues = NULL; + struct JsonNode *jbvalues = NULL; + struct JsonNode *jcvalues = NULL; + struct JsonNode *jdvalues = NULL; + struct JsonNode *jevalues = NULL; + struct JsonNode *jachild = NULL; + struct JsonNode *jbchild = NULL; + struct JsonNode *jcchild = NULL; + struct JsonNode *jdchild = NULL; + struct JsonNode *jechild = NULL; + char **array = NULL; + double nr1 = 0.0, nr2 = 0.0, nr3 = 0.0, nr4 = 0.0, nr5 = 0.0; + int nrvalues = 0, l = 0, i = 0, match = 0; + int nrunits = (sizeof(units)/sizeof(units[0])); + + if(obj == NULL) { + /* Internal error */ + return -1; + } + + if(obj->arguments == NULL) { + /* Internal error */ + return -1; + } + + jdevice = json_find_member(obj->arguments, "DEVICE"); + jto = json_find_member(obj->arguments, "TO"); + jfor = json_find_member(obj->arguments, "FOR"); + jafter = json_find_member(obj->arguments, "AFTER"); + jcolor = json_find_member(obj->arguments, "COLOR"); + + if(jdevice == NULL) { + logprintf(LOG_ERR, "label action is missing a \"DEVICE\""); + return -1; + } + + if(jto == NULL) { + logprintf(LOG_ERR, "label action is missing a \"TO ...\" statement"); + return -1; + } + + json_find_number(jdevice, "order", &nr1); + json_find_number(jto, "order", &nr2); + + if(jcolor != NULL) { + json_find_number(jcolor, "order", &nr5); + } + + if(jfor != NULL) { + json_find_number(jfor, "order", &nr3); + if(nr3 < nr2) { + logprintf(LOG_ERR, "label actions are formatted as \"label DEVICE ... TO ... FOR ...\""); + return -1; + } else if(nr5 > 0 && nr3 < nr5) { + logprintf(LOG_ERR, "label actions are formatted as \"label DEVICE ... TO ... COLOR ... FOR ...\""); + return -1; + } + } + + if(jafter != NULL) { + json_find_number(jafter, "order", &nr4); + if(nr4 < nr2) { + logprintf(LOG_ERR, "label actions are formatted as \"label DEVICE ... TO ... AFTER ...\""); + return -1; + } else if(nr5 > 0 && nr4 < nr5) { + logprintf(LOG_ERR, "label actions are formatted as \"label DEVICE ... TO ... COLOR ... AFTER ...\""); + return -1; + } + } + + if((int)nr1 != 1 || (int)nr2 != 2) { + logprintf(LOG_ERR, "label actions are formatted as \"label DEVICE ... TO ...\""); + return -1; + } + if(nr5 > 0 && nr5 != 3) { + logprintf(LOG_ERR, "label actions are formatted as \"label DEVICE ... TO ... COLOR ...\""); + return -1; + } + + nrvalues = 0; + if((javalues = json_find_member(jto, "value")) != NULL) { + jachild = json_first_child(javalues); + while(jachild) { + nrvalues++; + jachild = jachild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "label action \"TO\" only takes one argument"); + return -1; + } + + nrvalues = 0; + if(jfor != NULL) { + if((jcvalues = json_find_member(jfor, "value")) != NULL) { + jcchild = json_first_child(jcvalues); + while(jcchild) { + nrvalues++; + if(jcchild->tag == JSON_STRING) { + l = explode(jcchild->string_, " ", &array); + if(l == 2) { + match = 0; + for(i=0;i 0) { + array_free(&array, l); + } + return -1; + } + } + jcchild = jcchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "label action \"FOR\" only takes one argument"); + return -1; + } + } + + nrvalues = 0; + if(jafter != NULL) { + if((jdvalues = json_find_member(jafter, "value")) != NULL) { + jdchild = json_first_child(jdvalues); + while(jdchild) { + nrvalues++; + if(jdchild->tag == JSON_STRING) { + l = explode(jdchild->string_, " ", &array); + if(l == 2) { + match = 0; + for(i=0;i 0) { + array_free(&array, l); + } + return -1; + } + } + jdchild = jdchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "label action \"AFTER\" only takes one argument"); + return -1; + } + } + + nrvalues = 0; + if(jcolor != NULL) { + if((jevalues = json_find_member(jcolor, "value")) != NULL) { + jechild = json_first_child(jevalues); + while(jechild) { + nrvalues++; + jechild = jechild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "label action \"COLOR\" only takes one argument"); + return -1; + } + } + + if((jbvalues = json_find_member(jdevice, "value")) != NULL) { + jbchild = json_first_child(jbvalues); + while(jbchild) { + if(jbchild->tag == JSON_STRING) { + struct devices_t *dev = NULL; + if(devices_get(jbchild->string_, &dev) == 0) { + struct protocols_t *protocols = dev->protocols; + int match = 0; + while(protocols) { + if(protocols->listener->devtype == LABEL) { + match = 1; + break; + } + protocols = protocols->next; + } + if(match == 0) { + logprintf(LOG_ERR, "the label action only works with the label devices"); + return -1; + } + } else { + logprintf(LOG_ERR, "device \"%s\" doesn't exists", jbchild->string_); + return -1; + } + } else { + return -1; + } + jbchild = jbchild->next; + } + } + return 0; +} + +static void *thread(void *param) { + struct event_action_thread_t *pth = (struct event_action_thread_t *)param; + struct JsonNode *json = pth->obj->arguments; + struct JsonNode *jto = NULL; + struct JsonNode *jafter = NULL; + struct JsonNode *jfor = NULL; + struct JsonNode *jcolor = NULL; + struct JsonNode *javalues = NULL; + struct JsonNode *jcvalues = NULL; + struct JsonNode *jdvalues = NULL; + struct JsonNode *jevalues = NULL; + struct JsonNode *jlabel = NULL; + struct JsonNode *jaseconds = NULL; + struct JsonNode *jvalues = NULL; + char *new_label = NULL, *old_label = NULL, *label = NULL, **array = NULL; + char *new_color = NULL, *old_color = NULL, *color = NULL; + int seconds_after = 0, type_after = 0, free_label = 0; + int l = 0, i = 0, nrunits = (sizeof(units)/sizeof(units[0])); + int seconds_for = 0, type_for = 0, timer = 0; + + event_action_started(pth); + + if((jcolor = json_find_member(json, "COLOR")) != NULL) { + if((jevalues = json_find_member(jcolor, "value")) != NULL) { + jcolor = json_find_element(jevalues, 0); + if(jcolor != NULL && jcolor->tag == JSON_STRING) { + color = jcolor->string_; + if((new_color = MALLOC(strlen(color)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(new_color, color); + } + } + } + + if((jfor = json_find_member(json, "FOR")) != NULL) { + if((jcvalues = json_find_member(jfor, "value")) != NULL) { + jaseconds = json_find_element(jcvalues, 0); + if(jaseconds != NULL) { + if(jaseconds->tag == JSON_STRING) { + l = explode(jaseconds->string_, " ", &array); + if(l == 2) { + for(i=0;i 0) { + array_free(&array, l); + } + } + } + } + } + + if((jafter = json_find_member(json, "AFTER")) != NULL) { + if((jdvalues = json_find_member(jafter, "value")) != NULL) { + jaseconds = json_find_element(jdvalues, 0); + if(jaseconds != NULL) { + if(jaseconds->tag == JSON_STRING) { + l = explode(jaseconds->string_, " ", &array); + if(l == 2) { + for(i=0;i 0) { + array_free(&array, l); + } + } + } + } + } + + switch(type_for) { + case 3: + seconds_for *= 60; + break; + case 4: + seconds_for *= (60*60); + break; + case 5: + seconds_for *= (60*60*24); + break; + } + + switch(type_after) { + case 3: + seconds_after *= 60; + break; + case 4: + seconds_after *= (60*60); + break; + case 5: + seconds_after *= (60*60*24); + break; + } + + /* Store current label */ + struct devices_t *tmp = pth->device; + int match1 = 0, match2 = 0; + while(tmp) { + struct devices_settings_t *opt = tmp->settings; + while(opt) { + if(strcmp(opt->name, "label") == 0) { + if(opt->values->type == JSON_STRING) { + if((old_label = MALLOC(strlen(opt->values->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(old_label, opt->values->string_); + match1 = 1; + } + } + if(strcmp(opt->name, "color") == 0) { + if(opt->values->type == JSON_STRING) { + if((old_color = MALLOC(strlen(opt->values->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(old_color, opt->values->string_); + match2 = 1; + } + } + opt = opt->next; + } + if(match1 == 1 && match2 == 1) { + break; + } + tmp = tmp->next; + } + if(match1 == 0) { + logprintf(LOG_NOTICE, "could not store old label of \"%s\"", pth->device->id); + } + if(match2 == 0) { + logprintf(LOG_NOTICE, "could not store old color of \"%s\"", pth->device->id); + } + + timer = 0; + while(pth->loop == 1) { + if(timer == seconds_after) { + if((jto = json_find_member(json, "TO")) != NULL) { + if((javalues = json_find_member(jto, "value")) != NULL) { + jlabel = json_find_element(javalues, 0); + if(jlabel != NULL) { + if(jlabel->tag == JSON_STRING) { + label = jlabel->string_; + } else if(jlabel->tag == JSON_NUMBER) { + int l = snprintf(NULL, 0, "%.*f", jlabel->decimals_, jlabel->number_); + if((label = MALLOC(l+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(label, '\0', l); + free_label = 1; + snprintf(label, l + 1, "%.*f", jlabel->decimals_, jlabel->number_); + label[l] = '\0'; + } + if((new_label = MALLOC(strlen(label)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(new_label, label); + /* + * We're not switching when current label or is the same as + * the old label or old color. + */ + if(old_label == NULL || strcmp(old_label, new_label) != 0 || + (old_color != NULL && new_color != NULL && strcmp(old_color, new_color) != 0)) { + if(pilight.control != NULL) { + jvalues = json_mkobject(); + if(color != NULL) { + json_append_member(jvalues, "color", json_mkstring(color)); + } + json_append_member(jvalues, "label", json_mkstring(label)); + pilight.control(pth->device, NULL, json_first_child(jvalues), ACTION); + json_delete(jvalues); + break; + } + } + } + } + } + break; + } + timer++; + if(type_after > 1) { + sleep(1); + } else { + usleep(1000); + } + } + + /* + * We only need to restore the label if it was actually changed + */ + if(seconds_for > 0 && ((old_label != NULL && new_label != NULL && strcmp(old_label, new_label) != 0) || + (old_color != NULL && new_color != NULL && strcmp(old_color, new_color) != 0))) { + timer = 0; + while(pth->loop == 1) { + if(seconds_for == timer) { + if(pilight.control != NULL) { + jvalues = json_mkobject(); + if(old_color != NULL) { + json_append_member(jvalues, "color", json_mkstring(old_color)); + } + json_append_member(jvalues, "label", json_mkstring(old_label)); + pilight.control(pth->device, NULL, json_first_child(jvalues), ACTION); + json_delete(jvalues); + break; + } + break; + } + timer++; + if(type_for > 1) { + sleep(1); + } else { + usleep(1000); + } + } + } + + if(free_label == 1) { + FREE(label); + } + + if(old_label != NULL) { + FREE(old_label); + } + + if(new_label != NULL) { + FREE(new_label); + } + + if(old_color != NULL) { + FREE(old_color); + } + + if(new_color != NULL) { + FREE(new_color); + } + + event_action_stopped(pth); + + return (void *)NULL; +} + +static int run(struct rules_actions_t *obj) { + struct JsonNode *jdevice = NULL; + struct JsonNode *jto = NULL; + struct JsonNode *jbvalues = NULL; + struct JsonNode *jbchild = NULL; + + if((jdevice = json_find_member(obj->arguments, "DEVICE")) != NULL && + (jto = json_find_member(obj->arguments, "TO")) != NULL) { + if((jbvalues = json_find_member(jdevice, "value")) != NULL) { + jbchild = json_first_child(jbvalues); + while(jbchild) { + if(jbchild->tag == JSON_STRING) { + struct devices_t *dev = NULL; + if(devices_get(jbchild->string_, &dev) == 0) { + event_action_thread_start(dev, action_label->name, thread, obj); + } + } + jbchild = jbchild->next; + } + } + } + return 0; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void actionLabelInit(void) { + event_action_register(&action_label, "label"); + + options_add(&action_label->options, 'a', "DEVICE", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_label->options, 'b', "TO", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING | JSON_NUMBER, NULL, NULL); + options_add(&action_label->options, 'c', "AFTER", OPTION_OPT_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_label->options, 'd', "FOR", OPTION_OPT_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_label->options, 'e', "COLOR", OPTION_OPT_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + + action_label->run = &run; + action_label->checkArguments = &checkArguments; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "label"; + module->version = "2.2"; + module->reqversion = "6.0"; + module->reqcommit = "152"; +} + +void init(void) { + actionLabelInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/label.h b/lib/ESPiLight/pilight/libs/pilight/events/actions/label.h new file mode 100644 index 0000000..6b9efd0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/label.h @@ -0,0 +1,28 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _EVENT_ACTION_LABEL_H_ +#define _EVENT_ACTION_LABEL_H_ + +#include "../action.h" + +struct event_actions_t *action_label; + +void actionLabelInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/pushbullet.c b/lib/ESPiLight/pilight/libs/pilight/events/actions/pushbullet.c new file mode 100644 index 0000000..e371083 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/pushbullet.c @@ -0,0 +1,218 @@ +/* + Copyright (C) 2013 - 2015 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include + +#include "../../core/threads.h" +#include "../action.h" +#include "../../core/options.h" +#include "../../config/devices.h" +#include "../../core/log.h" +#include "../../core/dso.h" +#include "../../core/pilight.h" +#include "../../core/http.h" +#include "pushbullet.h" + +static int checkArguments(struct rules_actions_t *obj) { + struct JsonNode *jtitle = NULL; + struct JsonNode *jbody = NULL; + struct JsonNode *jtype = NULL; + struct JsonNode *jtoken = NULL; + struct JsonNode *jvalues = NULL; + struct JsonNode *jchild = NULL; + int nrvalues = 0; + + jtitle = json_find_member(obj->arguments, "TITLE"); + jbody = json_find_member(obj->arguments, "BODY"); + jtoken = json_find_member(obj->arguments, "TOKEN"); + jtype = json_find_member(obj->arguments, "TYPE"); + + if(jtitle == NULL) { + logprintf(LOG_ERR, "pushbullet action is missing a \"TITLE\""); + return -1; + } + if(jbody == NULL) { + logprintf(LOG_ERR, "pushbullet action is missing a \"BODY\""); + return -1; + } + if(jtype == NULL) { + logprintf(LOG_ERR, "pushbullet action is missing a \"TYPE\""); + return -1; + } + if(jtoken == NULL) { + logprintf(LOG_ERR, "pushbullet action is missing a \"TOKEN\""); + return -1; + } + nrvalues = 0; + if((jvalues = json_find_member(jtitle, "value")) != NULL) { + jchild = json_first_child(jvalues); + while(jchild) { + nrvalues++; + jchild = jchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "pushbullet action \"TITLE\" only takes one argument"); + return -1; + } + nrvalues = 0; + if((jvalues = json_find_member(jbody, "value")) != NULL) { + jchild = json_first_child(jvalues); + while(jchild) { + nrvalues++; + jchild = jchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "pushbullet action \"BODY\" only takes one argument"); + return -1; + } + nrvalues = 0; + if((jvalues = json_find_member(jtoken, "value")) != NULL) { + jchild = json_first_child(jvalues); + while(jchild) { + nrvalues++; + jchild = jchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "pushbullet action \"TOKEN\" only takes one argument"); + return -1; + } + nrvalues = 0; + if((jvalues = json_find_member(jtype, "value")) != NULL) { + jchild = json_first_child(jvalues); + while(jchild) { + nrvalues++; + jchild = jchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "pushbullet action \"TYPE\" only takes one argument"); + return -1; + } + return 0; +} + +static void callback(int code, char *data, int size, char *type, void *userdata) { + if(code == 200) { + logprintf(LOG_DEBUG, "pushbullet action succeeded with message: %s", data); + } else { + logprintf(LOG_NOTICE, "pushbullet action failed (%d) with message: %s", code, data); + } +} + +static void *thread(void *param) { + struct rules_actions_t *pth = (struct rules_actions_t *)param; + // struct rules_t *obj = pth->obj; + struct JsonNode *arguments = pth->arguments; + struct JsonNode *jtitle = NULL; + struct JsonNode *jbody = NULL; + struct JsonNode *jtype = NULL; + struct JsonNode *jtoken = NULL; + struct JsonNode *jvalues1 = NULL; + struct JsonNode *jvalues2 = NULL; + struct JsonNode *jvalues3 = NULL; + struct JsonNode *jvalues4 = NULL; + struct JsonNode *jval1 = NULL; + struct JsonNode *jval2 = NULL; + struct JsonNode *jval3 = NULL; + struct JsonNode *jval4 = NULL; + + char url[1024]; + + action_pushbullet->nrthreads++; + + jtitle = json_find_member(arguments, "TITLE"); + jbody = json_find_member(arguments, "BODY"); + jtoken = json_find_member(arguments, "TOKEN"); + jtype = json_find_member(arguments, "TYPE"); + + if(jtitle != NULL && jbody != NULL && jtoken != NULL && jtype != NULL) { + jvalues1 = json_find_member(jtitle, "value"); + jvalues2 = json_find_member(jbody, "value"); + jvalues3 = json_find_member(jtoken, "value"); + jvalues4 = json_find_member(jtype, "value"); + if(jvalues1 != NULL && jvalues2 != NULL && jvalues3 != NULL && jvalues4 != NULL) { + jval1 = json_find_element(jvalues1, 0); + jval2 = json_find_element(jvalues2, 0); + jval3 = json_find_element(jvalues3, 0); + jval4 = json_find_element(jvalues4, 0); + if(jval1 != NULL && jval2 != NULL && jval3 != NULL && jval4 != NULL && + jval1->tag == JSON_STRING && jval2->tag == JSON_STRING && + jval3->tag == JSON_STRING && jval4->tag == JSON_STRING) { + snprintf(url, 1024, "https://%s@api.pushbullet.com/v2/pushes", jval3->string_); + + struct JsonNode *code = json_mkobject(); + json_append_member(code, "type", json_mkstring(jval4->string_)); + json_append_member(code, "title", json_mkstring(jval1->string_)); + json_append_member(code, "body", json_mkstring(jval2->string_)); + + char *content = json_stringify(code, "\t"); + json_delete(code); + + http_post_content(url, "application/json", content, callback, NULL); + + json_free(content); + } + } + } + + + action_pushbullet->nrthreads--; + + return (void *)NULL; +} + +static int run(struct rules_actions_t *obj) { + pthread_t pth; + threads_create(&pth, NULL, thread, (void *)obj); + pthread_detach(pth); + return 0; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void actionPushbulletInit(void) { + event_action_register(&action_pushbullet, "pushbullet"); + + options_add(&action_pushbullet->options, 'a', "TITLE", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_pushbullet->options, 'b', "BODY", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_pushbullet->options, 'c', "TOKEN", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_pushbullet->options, 'd', "TYPE", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + + action_pushbullet->run = &run; + action_pushbullet->checkArguments = &checkArguments; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "pushbullet"; + module->version = "2.2"; + module->reqversion = "5.0"; + module->reqcommit = "87"; +} + +void init(void) { + actionPushbulletInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/pushbullet.h b/lib/ESPiLight/pilight/libs/pilight/events/actions/pushbullet.h new file mode 100644 index 0000000..55c6a2c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/pushbullet.h @@ -0,0 +1,28 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _EVENT_ACTION_PUSHBULLET_H_ +#define _EVENT_ACTION_PUSHBULLET_H_ + +#include "../action.h" + +struct event_actions_t *action_pushbullet; + +void actionPushbulletInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/pushover.c b/lib/ESPiLight/pilight/libs/pilight/events/actions/pushover.c new file mode 100644 index 0000000..a7fff06 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/pushover.c @@ -0,0 +1,223 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include + +#include "../../core/threads.h" +#include "../action.h" +#include "../../core/options.h" +#include "../../config/devices.h" +#include "../../core/log.h" +#include "../../core/dso.h" +#include "../../core/pilight.h" +#include "../../core/http.h" +#include "../../core/common.h" +#include "pushover.h" + +static int checkArguments(struct rules_actions_t *obj) { + struct JsonNode *jtitle = NULL; + struct JsonNode *jmessage = NULL; + struct JsonNode *juser = NULL; + struct JsonNode *jtoken = NULL; + struct JsonNode *jvalues = NULL; + struct JsonNode *jchild = NULL; + int nrvalues = 0; + + jtitle = json_find_member(obj->arguments, "TITLE"); + jmessage = json_find_member(obj->arguments, "MESSAGE"); + jtoken = json_find_member(obj->arguments, "TOKEN"); + juser = json_find_member(obj->arguments, "USER"); + + if(jtitle == NULL) { + logprintf(LOG_ERR, "pushover action is missing a \"TITLE\""); + return -1; + } + if(jmessage == NULL) { + logprintf(LOG_ERR, "pushover action is missing a \"MESSAGE\""); + return -1; + } + if(juser == NULL) { + logprintf(LOG_ERR, "pushover action is missing a \"USER\""); + return -1; + } + if(jtoken == NULL) { + logprintf(LOG_ERR, "pushover action is missing a \"TOKEN\""); + return -1; + } + nrvalues = 0; + if((jvalues = json_find_member(jtitle, "value")) != NULL) { + jchild = json_first_child(jvalues); + while(jchild) { + nrvalues++; + jchild = jchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "pushover action \"TITLE\" only takes one argument"); + return -1; + } + nrvalues = 0; + if((jvalues = json_find_member(jmessage, "value")) != NULL) { + jchild = json_first_child(jvalues); + while(jchild) { + nrvalues++; + jchild = jchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "pushover action \"MESSAGE\" only takes one argument"); + return -1; + } + nrvalues = 0; + if((jvalues = json_find_member(jtoken, "value")) != NULL) { + jchild = json_first_child(jvalues); + while(jchild) { + nrvalues++; + jchild = jchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "pushover action \"TOKEN\" only takes one argument"); + return -1; + } + nrvalues = 0; + if((jvalues = json_find_member(juser, "value")) != NULL) { + jchild = json_first_child(jvalues); + while(jchild) { + nrvalues++; + jchild = jchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "pushover action \"USER\" only takes one argument"); + return -1; + } + return 0; +} + +static void callback(int code, char *data, int size, char *type, void *userdata) { + if(code == 200) { + logprintf(LOG_DEBUG, "pushover action succeeded with message: %s", data); + } else { + logprintf(LOG_NOTICE, "pushover action failed (%d) with message: %s", code, data); + } +} + +static void *thread(void *param) { + struct rules_actions_t *pth = (struct rules_actions_t *)param; + // struct rules_t *obj = pth->obj; + struct JsonNode *arguments = pth->arguments; + struct JsonNode *jtitle = NULL; + struct JsonNode *jmessage = NULL; + struct JsonNode *juser = NULL; + struct JsonNode *jtoken = NULL; + struct JsonNode *jvalues1 = NULL; + struct JsonNode *jvalues2 = NULL; + struct JsonNode *jvalues3 = NULL; + struct JsonNode *jvalues4 = NULL; + struct JsonNode *jval1 = NULL; + struct JsonNode *jval2 = NULL; + struct JsonNode *jval3 = NULL; + struct JsonNode *jval4 = NULL; + + action_pushover->nrthreads++; + + char url[1024]; + + jtitle = json_find_member(arguments, "TITLE"); + jmessage = json_find_member(arguments, "MESSAGE"); + jtoken = json_find_member(arguments, "TOKEN"); + juser = json_find_member(arguments, "USER"); + + if(jtitle != NULL && jmessage != NULL && jtoken != NULL && juser != NULL) { + jvalues1 = json_find_member(jtitle, "value"); + jvalues2 = json_find_member(jmessage, "value"); + jvalues3 = json_find_member(jtoken, "value"); + jvalues4 = json_find_member(juser, "value"); + if(jvalues1 != NULL && jvalues2 != NULL && jvalues3 != NULL && jvalues4 != NULL) { + jval1 = json_find_element(jvalues1, 0); + jval2 = json_find_element(jvalues2, 0); + jval3 = json_find_element(jvalues3, 0); + jval4 = json_find_element(jvalues4, 0); + if(jval1 != NULL && jval2 != NULL && jval3 != NULL && jval4 != NULL && + jval1->tag == JSON_STRING && jval2->tag == JSON_STRING && + jval3->tag == JSON_STRING && jval4->tag == JSON_STRING) { + strcpy(url, "https://api.pushover.net/1/messages.json"); + char *message = urlencode(jval2->string_); + char *token = urlencode(jval3->string_); + char *user = urlencode(jval4->string_); + char *title = urlencode(jval1->string_); + size_t l = strlen(message)+strlen(token); + l += strlen(user)+strlen(title); + l += strlen("token=")+strlen("&user="); + l += strlen("&message=")+strlen("&title="); + char content[l+2]; + sprintf(content, "token=%s&user=%s&title=%s&message=%s", token, user, title, message); + + http_post_content(url, "application/x-www-form-urlencoded", content, callback, NULL); + + FREE(message); + FREE(token); + FREE(user); + FREE(title); + } + } + } + + action_pushover->nrthreads--; + + return (void *)NULL; +} + +static int run(struct rules_actions_t *obj) { + pthread_t pth; + threads_create(&pth, NULL, thread, (void *)obj); + pthread_detach(pth); + return 0; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void actionPushoverInit(void) { + event_action_register(&action_pushover, "pushover"); + + options_add(&action_pushover->options, 'a', "TITLE", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_pushover->options, 'b', "MESSAGE", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_pushover->options, 'c', "TOKEN", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_pushover->options, 'd', "USER", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + + action_pushover->run = &run; + action_pushover->checkArguments = &checkArguments; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "pushover"; + module->version = "2.3"; + module->reqversion = "5.0"; + module->reqcommit = "87"; +} + +void init(void) { + actionPushoverInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/pushover.h b/lib/ESPiLight/pilight/libs/pilight/events/actions/pushover.h new file mode 100644 index 0000000..ecb1f86 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/pushover.h @@ -0,0 +1,28 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _EVENT_ACTION_PUSHOVER_H_ +#define _EVENT_ACTION_PUSHOVER_H_ + +#include "../action.h" + +struct event_actions_t *action_pushover; + +void actionPushoverInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/sendmail.c b/lib/ESPiLight/pilight/libs/pilight/events/actions/sendmail.c new file mode 100644 index 0000000..d7e67aa --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/sendmail.c @@ -0,0 +1,253 @@ +/* + Copyright (C) 2015 CurlyMo & Niek + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include + +#include "../../core/threads.h" +#include "../action.h" +#include "../../core/options.h" +#include "../../config/devices.h" +#include "../../core/dso.h" +#include "../../core/pilight.h" +#include "../../core/http.h" +#include "../../core/common.h" +#include "../../config/settings.h" +#include "../../core/log.h" +#include "../../core/mail.h" +#include "sendmail.h" + +//check arguments and settings +static int checkArguments(struct rules_actions_t *obj) { + struct JsonNode *jsubject = NULL; + struct JsonNode *jmessage = NULL; + struct JsonNode *jto = NULL; + struct JsonNode *jvalues = NULL; + struct JsonNode *jval = NULL; + struct JsonNode *jchild = NULL; + char *stmp = NULL; + int nrvalues = 0, itmp = 0; + jsubject = json_find_member(obj->arguments, "SUBJECT"); + jmessage = json_find_member(obj->arguments, "MESSAGE"); + jto = json_find_member(obj->arguments, "TO"); + + if(jsubject == NULL) { + logprintf(LOG_ERR, "sendmail action is missing a \"SUBJECT\""); + return -1; + } + if(jmessage == NULL) { + logprintf(LOG_ERR, "sendmail action is missing a \"MESSAGE\""); + return -1; + } + if(jto == NULL) { + logprintf(LOG_ERR, "sendmail action is missing a \"TO\""); + return -1; + } + nrvalues = 0; + if((jvalues = json_find_member(jsubject, "value")) != NULL) { + jchild = json_first_child(jvalues); + while(jchild) { + nrvalues++; + jchild = jchild->next; + } + } + if(nrvalues > 1) { + logprintf(LOG_ERR, "sendmail action \"SUBJECT\" only takes one argument"); + return -1; + } + nrvalues = 0; + if((jvalues = json_find_member(jmessage, "value")) != NULL) { + jchild = json_first_child(jvalues); + while(jchild) { + nrvalues++; + jchild = jchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "sendmail action \"MESSAGE\" only takes one argument"); + return -1; + } + jval = json_find_element(jvalues, 0); + if(jval->tag == JSON_STRING && strcmp(jval->string_, ".") == 0) { + logprintf(LOG_ERR, "sendmail action \"MESSAGE\" cannot be a single dot"); + return -1; + } + nrvalues = 0; + if((jvalues = json_find_member(jto, "value")) != NULL) { + jchild = json_first_child(jvalues); + while(jchild) { + nrvalues++; + jchild = jchild->next; + } + } + if(nrvalues > 1) { + logprintf(LOG_ERR, "sendmail action \"TO\" only takes one argument"); + return -1; + } + jval = json_find_element(jvalues, 0); + if(jval->tag != JSON_STRING || jval->string_ == NULL) { + logprintf(LOG_ERR, "sendmail action \"TO\" must contain an e-mail address"); + return -1; + } else if(strlen(jval->string_) > 0 && check_email_addr(jval->string_, 0, 0) < 0) { + logprintf(LOG_ERR, "sendmail action \"TO\" must contain an e-mail address"); + return -1; + } + // Check if mandatory settings are present in config + if(settings_find_string("smtp-host", &stmp) != EXIT_SUCCESS) { + logprintf(LOG_ERR, "Sendmail: setting \"smtp-host\" is missing in config"); + return -1; + } + if(settings_find_number("smtp-port", &itmp) != EXIT_SUCCESS) { + logprintf(LOG_ERR, "Sendmail: setting \"smtp-port\" is missing in config"); + return -1; + } + if(settings_find_string("smtp-user", &stmp) != EXIT_SUCCESS) { + logprintf(LOG_ERR, "Sendmail: setting \"smtp-user\" is missing in config"); + return -1; + } + if(settings_find_string("smtp-password", &stmp) != EXIT_SUCCESS) { + logprintf(LOG_ERR, "Sendmail: setting \"smtp-password\" is missing in config"); + return -1; + } + if(settings_find_string("smtp-sender", &stmp) != EXIT_SUCCESS) { + logprintf(LOG_ERR, "Sendmail: setting \"smtp-sender\" is missing in config"); + return -1; + } + return 0; +} + +static void callback(int status, struct mail_t *mail) { + if(status == 0) { + logprintf(LOG_INFO, "successfully sent sendmail action message with subject \"%s\" to %s", mail->subject, mail->to); + } else { + logprintf(LOG_NOTICE, "failed to send sendmail action message with subject \"%s\" to %s", mail->subject, mail->to); + } + FREE(mail->from); + FREE(mail->to); + FREE(mail->message); + FREE(mail->subject); + FREE(mail); +} + +static void *thread(void *param) { + struct rules_actions_t *pth = (struct rules_actions_t *)param; + struct JsonNode *arguments = pth->arguments; + struct JsonNode *jsubject = NULL; + struct JsonNode *jmessage = NULL; + struct JsonNode *jto = NULL; + struct JsonNode *jvalues1 = NULL; + struct JsonNode *jvalues2 = NULL; + struct JsonNode *jvalues3 = NULL; + struct JsonNode *jval1 = NULL; + struct JsonNode *jval2 = NULL; + struct JsonNode *jval3 = NULL; + + action_sendmail->nrthreads++; + + struct mail_t *mail = MALLOC(sizeof(struct mail_t)); + char *shost = NULL, *suser = NULL; + char *spassword = NULL, *sfrom = NULL; + int sport = 0, ssl = 0; + + if(mail == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + jmessage = json_find_member(arguments, "MESSAGE"); + jsubject = json_find_member(arguments, "SUBJECT"); + jto = json_find_member(arguments, "TO"); + + if(jsubject != NULL && jmessage != NULL && jto != NULL) { + jvalues1 = json_find_member(jsubject, "value"); + jvalues2 = json_find_member(jmessage, "value"); + jvalues3 = json_find_member(jto, "value"); + if(jvalues1 != NULL && jvalues2 != NULL && jvalues3 != NULL) { + jval1 = json_find_element(jvalues1, 0); + jval2 = json_find_element(jvalues2, 0); + jval3 = json_find_element(jvalues3, 0); + if(jval1 != NULL && jval2 != NULL && jval3 != NULL && + jval1->tag == JSON_STRING && jval2->tag == JSON_STRING && jval3->tag == JSON_STRING) { + + //smtp settings + settings_find_string("smtp-sender", &sfrom); + settings_find_string("smtp-host", &shost); + settings_find_number("smtp-port", &sport); + settings_find_string("smtp-user", &suser); + settings_find_string("smtp-password", &spassword); + settings_find_number("smtp-ssl", &ssl); + + if((mail->from = STRDUP(sfrom)) == NULL) { + OUT_OF_MEMORY + } + if((mail->subject = STRDUP(jval1->string_)) == NULL) { + OUT_OF_MEMORY + } + if((mail->message = STRDUP(jval2->string_)) == NULL) { + OUT_OF_MEMORY + } + if((mail->to = STRDUP(jval3->string_)) == NULL) { + OUT_OF_MEMORY + } + + if(sendmail(shost, suser, spassword, sport, ssl, mail, callback) != 0) { + callback(-1, mail); + } + } + } + } + + action_sendmail->nrthreads--; + + return (void *)NULL; +} + +static int run(struct rules_actions_t *obj) { + pthread_t pth; + threads_create(&pth, NULL, thread, (void *)obj); + pthread_detach(pth); + return 0; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void actionSendmailInit(void) { + event_action_register(&action_sendmail, "sendmail"); + + options_add(&action_sendmail->options, 'a', "SUBJECT", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_sendmail->options, 'b', "MESSAGE", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_sendmail->options, 'c', "TO", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + + action_sendmail->run = &run; + action_sendmail->checkArguments = &checkArguments; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "sendmail"; + module->version = "1.1"; + module->reqversion = "6.0"; + module->reqcommit = "152"; +} + +void init(void) { + actionSendmailInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/sendmail.h b/lib/ESPiLight/pilight/libs/pilight/events/actions/sendmail.h new file mode 100644 index 0000000..72241b2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/sendmail.h @@ -0,0 +1,28 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo & Niek + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _EVENT_ACTION_SENDMAIL_H_ +#define _EVENT_ACTION_SENDMAIL_H_ + +#include "../action.h" + +struct event_actions_t *action_sendmail; + +void actionSendmailInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/switch.c b/lib/ESPiLight/pilight/libs/pilight/events/actions/switch.c new file mode 100644 index 0000000..49b9572 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/switch.c @@ -0,0 +1,488 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include + +#include "../action.h" +#include "../events.h" +#include "../../core/options.h" +#include "../../config/devices.h" +#include "../../core/log.h" +#include "../../core/dso.h" +#include "../../core/pilight.h" +#include "switch.h" + +static struct units_t { + char name[255]; + int id; +} units[] = { + { "MILLISECOND", 1 }, + { "SECOND", 2 }, + { "MINUTE", 3 }, + { "HOUR", 4 }, + { "DAY", 5 } +}; + +static int checkArguments(struct rules_actions_t *obj) { + struct JsonNode *jdevice = NULL; + struct JsonNode *jto = NULL; + struct JsonNode *jfor = NULL; + struct JsonNode *jafter = NULL; + struct JsonNode *javalues = NULL; + struct JsonNode *jbvalues = NULL; + struct JsonNode *jcvalues = NULL; + struct JsonNode *jdvalues = NULL; + struct JsonNode *jachild = NULL; + struct JsonNode *jbchild = NULL; + struct JsonNode *jcchild = NULL; + struct JsonNode *jdchild = NULL; + char *state = NULL, **array = NULL; + double nr1 = 0.0, nr2 = 0.0, nr3 = 0.0, nr4 = 0.0; + int nrvalues = 0, l = 0, i = 0, match = 0; + int nrunits = (sizeof(units)/sizeof(units[0])); + + jdevice = json_find_member(obj->arguments, "DEVICE"); + jto = json_find_member(obj->arguments, "TO"); + jfor = json_find_member(obj->arguments, "FOR"); + jafter = json_find_member(obj->arguments, "AFTER"); + + if(jdevice == NULL) { + logprintf(LOG_ERR, "switch action is missing a \"DEVICE\" statement"); + return -1; + } + + if(jto == NULL) { + logprintf(LOG_ERR, "switch action is missing a \"TO ...\" statement"); + return -1; + } + + json_find_number(jdevice, "order", &nr1); + json_find_number(jto, "order", &nr2); + + if(jfor != NULL) { + json_find_number(jfor, "order", &nr3); + if(nr3 < nr2) { + logprintf(LOG_ERR, "switch actions are formatted as \"switch DEVICE ... TO ... FOR ...\""); + return -1; + } + } + + if(jafter != NULL) { + json_find_number(jafter, "order", &nr4); + if(nr4 < nr2) { + logprintf(LOG_ERR, "switch actions are formatted as \"switch DEVICE ... TO ... AFTER ...\""); + return -1; + } + } + + if((int)nr1 != 1 || (int)nr2 != 2) { + logprintf(LOG_ERR, "switch actions are formatted as \"switch DEVICE ... TO ...\""); + return -1; + } + + nrvalues = 0; + if((javalues = json_find_member(jto, "value")) != NULL) { + jachild = json_first_child(javalues); + while(jachild) { + nrvalues++; + jachild = jachild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "switch action \"TO\" only takes one argument"); + return -1; + } + + nrvalues = 0; + if(jfor != NULL) { + if((jcvalues = json_find_member(jfor, "value")) != NULL) { + jcchild = json_first_child(jcvalues); + while(jcchild) { + nrvalues++; + if(jcchild->tag == JSON_STRING) { + l = explode(jcchild->string_, " ", &array); + if(l == 2) { + match = 0; + for(i=0;i 0) { + array_free(&array, l); + } + return -1; + } + } + jcchild = jcchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "switch action \"FOR\" only takes one argument"); + return -1; + } + } + + nrvalues = 0; + if(jafter != NULL) { + if((jdvalues = json_find_member(jafter, "value")) != NULL) { + jdchild = json_first_child(jdvalues); + while(jdchild) { + nrvalues++; + if(jdchild->tag == JSON_STRING) { + l = explode(jdchild->string_, " ", &array); + if(l == 2) { + match = 0; + for(i=0;i 0) { + array_free(&array, l); + } + return -1; + } + array_free(&array, l); + } + jdchild = jdchild->next; + } + } + if(nrvalues != 1) { + logprintf(LOG_ERR, "switch action \"AFTER\" only takes one argument"); + return -1; + } + } + + if((jbvalues = json_find_member(jdevice, "value")) != NULL) { + jbchild = json_first_child(jbvalues); + while(jbchild) { + if(jbchild->tag == JSON_STRING) { + struct devices_t *dev = NULL; + if(devices_get(jbchild->string_, &dev) == 0) { + if((javalues = json_find_member(jto, "value")) != NULL) { + jachild = json_first_child(javalues); + while(jachild) { + if(jachild->tag == JSON_STRING) { + state = jachild->string_; + struct protocols_t *tmp = dev->protocols; + int match1 = 0; + while(tmp) { + struct options_t *opt = tmp->listener->options; + while(opt) { + if(opt->conftype == DEVICES_STATE) { + if(strcmp(opt->name, state) == 0) { + match1 = 1; + break; + } + } + opt = opt->next; + } + tmp = tmp->next; + } + if(match1 == 0) { + logprintf(LOG_ERR, "device \"%s\" can't be set to state \"%s\"", jbchild->string_, state); + return -1; + } + } else { + return -1; + } + jachild = jachild->next; + } + } else { + return -1; + } + } else { + logprintf(LOG_ERR, "device \"%s\" doesn't exists", jbchild->string_); + return -1; + } + } else { + return -1; + } + jbchild = jbchild->next; + } + } + return 0; +} + +static void *thread(void *param) { + struct event_action_thread_t *pth = (struct event_action_thread_t *)param; + struct JsonNode *json = pth->obj->arguments; + struct JsonNode *jto = NULL; + struct JsonNode *jafter = NULL; + struct JsonNode *jfor = NULL; + struct JsonNode *javalues = NULL; + struct JsonNode *jcvalues = NULL; + struct JsonNode *jdvalues = NULL; + struct JsonNode *jstate = NULL; + struct JsonNode *jaseconds = NULL; + char *new_state = NULL, *old_state = NULL, *state = NULL, **array = NULL; + int seconds_after = 0, type_after = 0; + int l = 0, i = 0, nrunits = (sizeof(units)/sizeof(units[0])); + int seconds_for = 0, type_for = 0, timer = 0; + + event_action_started(pth); + + if((jfor = json_find_member(json, "FOR")) != NULL) { + if((jcvalues = json_find_member(jfor, "value")) != NULL) { + jaseconds = json_find_element(jcvalues, 0); + if(jaseconds != NULL) { + if(jaseconds->tag == JSON_STRING) { + l = explode(jaseconds->string_, " ", &array); + if(l == 2) { + for(i=0;i 0) { + array_free(&array, l); + } + } + } + } + } + + if((jafter = json_find_member(json, "AFTER")) != NULL) { + if((jdvalues = json_find_member(jafter, "value")) != NULL) { + jaseconds = json_find_element(jdvalues, 0); + if(jaseconds != NULL) { + if(jaseconds->tag == JSON_STRING) { + l = explode(jaseconds->string_, " ", &array); + if(l == 2) { + for(i=0;i 0) { + array_free(&array, l); + } + } + } + } + } + + switch(type_for) { + case 3: + seconds_for *= 60; + break; + case 4: + seconds_for *= (60*60); + break; + case 5: + seconds_for *= (60*60*24); + break; + } + + switch(type_after) { + case 3: + seconds_after *= 60; + break; + case 4: + seconds_after *= (60*60); + break; + case 5: + seconds_after *= (60*60*24); + break; + } + + /* Store current state */ + struct devices_t *tmp = pth->device; + int match = 0; + while(tmp) { + struct devices_settings_t *opt = tmp->settings; + while(opt) { + if(strcmp(opt->name, "state") == 0) { + if(opt->values->type == JSON_STRING) { + if((old_state = MALLOC(strlen(opt->values->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(old_state, opt->values->string_); + match = 1; + } + break; + } + opt = opt->next; + } + if(match == 1) { + break; + } + tmp = tmp->next; + } + if(match == 0) { + logprintf(LOG_NOTICE, "could not store old state of \"%s\"\n", pth->device->id); + } + + timer = 0; + while(pth->loop == 1) { + if(timer == seconds_after) { + if((jto = json_find_member(json, "TO")) != NULL) { + if((javalues = json_find_member(jto, "value")) != NULL) { + jstate = json_find_element(javalues, 0); + if(jstate != NULL && jstate->tag == JSON_STRING) { + state = jstate->string_; + if((new_state = MALLOC(strlen(state)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(new_state, state); + /* + * We're not switching when current state is the same as + * the old state. + */ + if(old_state == NULL || strcmp(old_state, new_state) != 0) { + if(pilight.control != NULL) { + pilight.control(pth->device, new_state, NULL, ACTION); + } + } + } + } + } + break; + } + timer++; + if(type_after > 1) { + sleep(1); + } else { + usleep(1000); + } + } + + /* + * We only need to restore the state if it was actually changed + */ + if(seconds_for > 0 && old_state != NULL && new_state != NULL && strcmp(old_state, new_state) != 0) { + timer = 0; + while(pth->loop == 1) { + if(seconds_for == timer) { + if(pilight.control != NULL) { + pilight.control(pth->device, old_state, NULL, ACTION); + } + break; + } + timer++; + if(type_for > 1) { + sleep(1); + } else { + usleep(1000); + } + } + } + + if(old_state != NULL) { + FREE(old_state); + } + + if(new_state != NULL) { + FREE(new_state); + } + + event_action_stopped(pth); + + return (void *)NULL; +} + +static int run(struct rules_actions_t *obj) { + struct JsonNode *jdevice = NULL; + struct JsonNode *jto = NULL; + struct JsonNode *jbvalues = NULL; + struct JsonNode *jbchild = NULL; + + if((jdevice = json_find_member(obj->arguments, "DEVICE")) != NULL && + (jto = json_find_member(obj->arguments, "TO")) != NULL) { + if((jbvalues = json_find_member(jdevice, "value")) != NULL) { + jbchild = json_first_child(jbvalues); + while(jbchild) { + if(jbchild->tag == JSON_STRING) { + struct devices_t *dev = NULL; + if(devices_get(jbchild->string_, &dev) == 0) { + event_action_thread_start(dev, action_switch->name, thread, obj); + } + } + jbchild = jbchild->next; + } + } + } + return 0; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void actionSwitchInit(void) { + event_action_register(&action_switch, "switch"); + + options_add(&action_switch->options, 'a', "DEVICE", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_switch->options, 'b', "TO", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_switch->options, 'c', "AFTER", OPTION_OPT_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_switch->options, 'd', "FOR", OPTION_OPT_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + + action_switch->run = &run; + action_switch->checkArguments = &checkArguments; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "switch"; + module->version = "3.2"; + module->reqversion = "6.0"; + module->reqcommit = "152"; +} + +void init(void) { + actionSwitchInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/switch.h b/lib/ESPiLight/pilight/libs/pilight/events/actions/switch.h new file mode 100644 index 0000000..c8017c2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/switch.h @@ -0,0 +1,28 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _EVENT_ACTION_SWITCH_H_ +#define _EVENT_ACTION_SWITCH_H_ + +#include "../action.h" + +struct event_actions_t *action_switch; + +void actionSwitchInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/toggle.c b/lib/ESPiLight/pilight/libs/pilight/events/actions/toggle.c new file mode 100644 index 0000000..7f3d5a2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/toggle.c @@ -0,0 +1,215 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include + +#include "../action.h" +#include "../../core/options.h" +#include "../../config/devices.h" +#include "../../core/log.h" +#include "../../core/dso.h" +#include "../../core/pilight.h" +#include "toggle.h" + +static int checkArguments(struct rules_actions_t *obj) { + struct JsonNode *jdevice = NULL; + struct JsonNode *jbetween = NULL; + struct JsonNode *jsvalues = NULL; + struct JsonNode *jdvalues = NULL; + struct JsonNode *jschild = NULL; + struct JsonNode *jdchild = NULL; + double nr1 = 0.0, nr2 = 0.0; + int nrvalues = 0; + jdevice = json_find_member(obj->arguments, "DEVICE"); + jbetween = json_find_member(obj->arguments, "BETWEEN"); + + if(jdevice == NULL) { + logprintf(LOG_ERR, "toggle action is missing a \"DEVICE\""); + return -1; + } + if(jbetween == NULL && jbetween->tag != JSON_ARRAY) { + logprintf(LOG_ERR, "toggle action is missing a \"BETWEEN ... AND ...\" statement"); + return -1; + } + json_find_number(jdevice, "order", &nr1); + json_find_number(jbetween, "order", &nr2); + if((int)nr1 != 1 || (int)nr2 != 2) { + logprintf(LOG_ERR, "toggle actions are formatted as \"toggle DEVICE ... BETWEEN ... AND ...\""); + return -1; + } + if((jsvalues = json_find_member(jbetween, "value")) != NULL) { + jschild = json_first_child(jsvalues); + while(jschild) { + nrvalues++; + jschild = jschild->next; + } + } + if(nrvalues != 2) { + logprintf(LOG_ERR, "toggle actions are formatted as \"toggle DEVICE ... BETWEEN ... AND ...\""); + return -1; + } + if((jdvalues = json_find_member(jdevice, "value")) != NULL) { + jdchild = json_first_child(jdvalues); + while(jdchild) { + if(jdchild->tag == JSON_STRING) { + struct devices_t *dev = NULL; + if(devices_get(jdchild->string_, &dev) == 0) { + if((jsvalues = json_find_member(jbetween, "value")) != NULL) { + jschild = json_first_child(jsvalues); + while(jschild) { + if(jschild->tag == JSON_STRING) { + struct protocols_t *tmp = dev->protocols; + int match1 = 0; + while(tmp) { + struct options_t *opt = tmp->listener->options; + while(opt) { + if(opt->conftype == DEVICES_STATE) { + if(strcmp(opt->name, jschild->string_) == 0) { + match1 = 1; + break; + } + } + opt = opt->next; + } + tmp = tmp->next; + } + if(match1 == 0) { + logprintf(LOG_ERR, "device \"%s\" can't be set to state \"%s\"", jdchild->string_, jschild->string_); + return -1; + } + } else { + return -1; + } + jschild = jschild->next; + } + } + } else { + logprintf(LOG_ERR, "device \"%s\" doesn't exists", jdchild->string_); + return -1; + } + } else { + return -1; + } + jdchild = jdchild->next; + } + } else { + return -1; + } + return 0; +} + +static void *thread(void *param) { + struct event_action_thread_t *pth = (struct event_action_thread_t *)param; + // struct rules_t *obj = pth->obj; + struct JsonNode *json = pth->obj->arguments; + struct devices_settings_t *tmp_settings = pth->device->settings; + struct JsonNode *jbetween = NULL; + struct JsonNode *jsvalues = NULL; + struct JsonNode *jstate1 = NULL; + struct JsonNode *jstate2 = NULL; + char *cstate = NULL, *state1 = NULL, *state2 = NULL; + + event_action_started(pth); + + while(tmp_settings) { + if(strcmp(tmp_settings->name, "state") == 0) { + if(tmp_settings->values->type == JSON_STRING) { + cstate = tmp_settings->values->string_; + break; + } + } + tmp_settings = tmp_settings->next; + } + + if((jbetween = json_find_member(json, "BETWEEN")) != NULL) { + if((jsvalues = json_find_member(jbetween, "value")) != NULL) { + jstate1 = json_find_element(jsvalues, 0); + jstate2 = json_find_element(jsvalues, 1); + if(jstate1 != NULL && jstate2 != NULL && + jstate1->tag == JSON_STRING && jstate2->tag == JSON_STRING) { + state1 = jstate1->string_; + state2 = jstate2->string_; + + if(pilight.control != NULL) { + if(strcmp(state1, cstate) == 0) { + pilight.control(pth->device, state2, NULL, ACTION); + } else if(strcmp(state2, cstate) == 0) { + pilight.control(pth->device, state1, NULL, ACTION); + } + } + } + } + } + + event_action_stopped(pth); + + return (void *)NULL; +} + +static int run(struct rules_actions_t *obj) { + struct JsonNode *jdevice = NULL; + struct JsonNode *jbetween = NULL; + struct JsonNode *jdvalues = NULL; + struct JsonNode *jdchild = NULL; + + if((jdevice = json_find_member(obj->arguments, "DEVICE")) != NULL && + (jbetween = json_find_member(obj->arguments, "BETWEEN")) != NULL) { + if((jdvalues = json_find_member(jdevice, "value")) != NULL) { + jdchild = json_first_child(jdvalues); + while(jdchild) { + if(jdchild->tag == JSON_STRING) { + struct devices_t *dev = NULL; + if(devices_get(jdchild->string_, &dev) == 0) { + event_action_thread_start(dev, action_toggle->name, thread, obj); + } + } + jdchild = jdchild->next; + } + } + } + return 0; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void actionToggleInit(void) { + event_action_register(&action_toggle, "toggle"); + + options_add(&action_toggle->options, 'a', "DEVICE", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&action_toggle->options, 'b', "BETWEEN", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + + action_toggle->run = &run; + action_toggle->checkArguments = &checkArguments; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "toggle"; + module->version = "2.1"; + module->reqversion = "6.0"; + module->reqcommit = "58"; +} + +void init(void) { + actionToggleInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/actions/toggle.h b/lib/ESPiLight/pilight/libs/pilight/events/actions/toggle.h new file mode 100644 index 0000000..611b35e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/actions/toggle.h @@ -0,0 +1,28 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _EVENT_ACTION_TOGGLE_H_ +#define _EVENT_ACTION_TOGGLE_H_ + +#include "../action.h" + +struct event_actions_t *action_toggle; + +void actionToggleInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/events.c b/lib/ESPiLight/pilight/libs/pilight/events/events.c new file mode 100644 index 0000000..74ba705 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/events.c @@ -0,0 +1,2204 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif +#endif + +#include "../core/pilight.h" +#include "../core/common.h" +#include "../core/config.h" +#include "../core/log.h" +#include "../core/cast.h" +#include "../core/options.h" +#include "../core/json.h" +#include "../core/ssdp.h" +#include "../core/socket.h" +#include "../datatypes/stack.h" + +#include "../lua/lua.h" + +#include "../protocols/protocol.h" + +#include "../config/rules.h" +#include "../config/settings.h" +#include "../config/devices.h" + +#include "events.h" + +#include "operator.h" +#include "function.h" +#include "action.h" + +typedef struct lexer_t { + int pos; + int ppos; + int len; + char *current_char; + struct token_t *current_token; + char *text; +} lexer_t; + +typedef struct token_t { + int type; + int pos; + char *value; +} token_t; + +typedef struct tree_t { + struct token_t *token; + struct tree_t **child; + int nrchildren; +} tree_t; + +// static struct token_string { + // char *name; +// } token_string[] = { + // { "TOPERATOR" }, + // { "TFUNCTION" }, + // { "TSTRING" }, + // { "TINTEGER" }, + // { "TEOF" }, + // { "LPAREN" }, + // { "RPAREN" }, + // { "TCOMMA" }, + // { "TIF" }, + // { "TELSE" }, + // { "TTHEN" }, + // { "TEND" }, + // { "TACTION" } +// }; + +typedef enum { + TOPERATOR = 0, + TFUNCTION = 1, + TSTRING = 2, + TINTEGER = 3, + TEOF = 4, + LPAREN = 5, + RPAREN = 6, + TCOMMA = 7, + TIF = 8, + TELSE = 9, + TTHEN = 10, + TEND = 11, + TACTION = 12 +} token_types; + +#define ORIGIN_RULE RULE +#define ORIGIN_ACTION ACTION + +static unsigned short loop = 1; +static char *dummy = "a"; +static char true_[2]; +static char false_[2]; +static char dot_[2]; + +static char *recvBuff = NULL; +static int sockfd = 0; + +static pthread_mutex_t events_lock; +static pthread_cond_t events_signal; +static pthread_mutexattr_t events_attr; +static unsigned short eventslock_init = 0; + +typedef struct eventsqueue_t { + struct JsonNode *jconfig; + struct eventsqueue_t *next; +} eventsqueue_t; + +static struct eventsqueue_t *eventsqueue; +static struct eventsqueue_t *eventsqueue_head; +static int eventsqueue_number = 0; +static int running = 0; + +static int get_precedence(char *symbol) { + struct plua_module_t *modules = plua_get_modules(); + int len = 0, x = 0; + while(modules) { + if(modules->type == OPERATOR) { + len = strlen(modules->name); + if(strnicmp(symbol, modules->name, len) == 0) { + event_operator_associativity(modules->name, &x); + return x; + } + } + modules = modules->next; + } + return -1; +} + +static int get_associativity(char *symbol) { + struct plua_module_t *modules = plua_get_modules(); + int len = 0, x = 0; + while(modules) { + if(modules->type == OPERATOR) { + len = strlen(modules->name); + if(strnicmp(symbol, modules->name, len) == 0) { + event_operator_precedence(modules->name, &x); + return x; + } + } + modules = modules->next; + } + return -1; +} + +struct event_actions_t *get_action(char *symbol, int size) { + struct event_actions_t *tmp_actions = NULL; + int len = 0; + + tmp_actions = event_actions; + while(tmp_actions) { + len = strlen(tmp_actions->name); + if((size == -1 && strnicmp(symbol, tmp_actions->name, len) == 0) || + (size == len && strnicmp(symbol, tmp_actions->name, len) == 0)) { + return tmp_actions; + } + tmp_actions = tmp_actions->next; + } + return NULL; +} + +static int is_function(char *symbol, int size) { + struct plua_module_t *modules = plua_get_modules(); + int len = 0; + while(modules) { + if(modules->type == FUNCTION) { + len = strlen(modules->name); + if((size == -1 && strnicmp(symbol, modules->name, len) == 0) || + (size == len && strnicmp(symbol, modules->name, len) == 0)) { + return len; + } + } + modules = modules->next; + } + return -1; +} + +static int is_operator(char *symbol, int size) { + struct plua_module_t *modules = plua_get_modules(); + int len = 0; + + while(modules) { + if(modules->type == OPERATOR) { + len = strlen(modules->name); + if((size == -1 && strnicmp(symbol, modules->name, len) == 0) || + (size == len && strnicmp(symbol, modules->name, len) == 0)) { + return len; + } + } + modules = modules->next; + } + return -1; +} + +void events_tree_gc(struct tree_t *tree) { + int i = 0; + if(tree == NULL) { + return; + } + for(i=0;inrchildren;i++) { + events_tree_gc(tree->child[i]); + } + if(tree->token != NULL) { + FREE(tree->token->value); + FREE(tree->token); + } + if(tree->nrchildren > 0) { + FREE(tree->child); + } + FREE(tree); +} + +int events_gc(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + loop = 0; + + if(eventslock_init == 1) { + pthread_mutex_unlock(&events_lock); + pthread_cond_signal(&events_signal); + } + + while(running == 1) { + usleep(10); + } + + event_operator_gc(); + event_action_gc(); + event_function_gc(); + logprintf(LOG_DEBUG, "garbage collected events library"); + return 1; +} + +static int print_error(struct lexer_t *lexer, struct tree_t *p, struct tree_t *node, struct token_t *token, int err, char *expected, int pos, int trunc) { + char *p_elipses = "..."; + char *s_elipses = "..."; + char *s_tmp = ""; + char *p_tmp = ""; + int length = lexer->ppos+25; + + trunc -= 15; + + if(trunc < 0) { + trunc = 0; + } + + if(err == -1) { + while(trunc > 0 && lexer->text[trunc] != ' ') { + trunc--; + } + if(trunc > 0) { + p_tmp = p_elipses; + } + if(length < strlen(&lexer->text[trunc])) { + while(length < strlen(&lexer->text[trunc]) && lexer->text[length+trunc] != ' ') { + length++; + } + s_tmp = s_elipses; + } + if(expected != NULL) { + logprintf(LOG_ERR, + "\n%s%.*s %s\n%*s^ unexpected symbol, expected %s", + p_tmp, length, &lexer->text[trunc], s_tmp, pos+strlen(p_tmp)-trunc, " ", expected); + } else { + logprintf(LOG_ERR, + "\n%s%.*s %s\n%*s^ unexpected symbol", + p_tmp, length, &lexer->text[trunc], s_tmp, pos+strlen(p_tmp)-trunc, " "); + } + err = -2; + } + if(node != NULL) { + events_tree_gc(node); + node = NULL; + } + if(lexer->current_token != NULL) { + FREE(lexer->current_token->value); + FREE(lexer->current_token); + } + if(token != NULL) { + FREE(token->value); + FREE(token); + } + if(p != NULL) { + events_tree_gc(p); + } + + return err; +} + +/* + * TESTME: Check if right devices are cached. + */ +void event_cache_device(struct rules_t *obj, char *device) { + int exists = 0; + int o = 0; + + if(obj != NULL) { + for(o=0;onrdevices;o++) { + if(strcmp(obj->devices[o], device) == 0) { + exists = 1; + break; + } + } + if(exists == 0) { + /* Store all devices that are present in this rule */ + if((obj->devices = REALLOC(obj->devices, sizeof(char *)*(unsigned int)(obj->nrdevices+1))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + if((obj->devices[obj->nrdevices] = MALLOC(strlen(device)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(obj->devices[obj->nrdevices], device); + obj->nrdevices++; + } + } +} + +/* + * This functions checks if the defined event variable + * is part of one of devices in the config. If it is, + * replace the variable with the actual value + * + * Return codes: + * -1: An error was found and abort rule parsing + * 0: Found variable and filled varcont + * 1: Did not find variable and did not fill varcont + */ +int event_lookup_variable(char *var, struct rules_t *obj, struct varcont_t *varcont, unsigned short validate, enum origin_t origin) { + int recvtype = 0; + // int cached = 0; + if(strcmp(true_, "1") != 0) { + strcpy(true_, "1"); + } + if(strcmp(dot_, ".") != 0) { + strcpy(dot_, "."); + } + if(strcmp(false_, "0") != 0) { + strcpy(false_, "0"); + } + if(strcmp(var, "1") == 0 || strcmp(var, "0") == 0 || + strcmp(var, "true") == 0 || + strcmp(var, "false") == 0) { + if(strcmp(var, "true") == 0) { + varcont->number_ = 1; + } else if(strcmp(var, "false") == 0) { + varcont->number_ = 0; + } else { + varcont->number_ = atof(var); + } + varcont->decimals_ = 0; + varcont->type_ = JSON_NUMBER; + + return 0; + } + + int len = (int)strlen(var); + int i = 0; + int nrdots = 0; + for(i=0;istring_ = dot_; + array_free(&array, n); + varcont->type_ = JSON_STRING; + return 0; + } + + char *device = array[0]; + char *name = array[1]; + + recvtype = 0; + struct protocols_t *tmp_protocols = protocols; +#ifdef PILIGHT_REWRITE + if(devices_select(ORIGIN_MASTER, device, NULL) == 0) { + recvtype = 1; + } +#else + struct devices_t *dev = NULL; + if(devices_get(device, &dev) == 0) { + recvtype = 1; + } +#endif + if(recvtype == 0) { + while(tmp_protocols) { + if(strcmp(tmp_protocols->listener->id, device) == 0) { + recvtype = 2; + break; + } + tmp_protocols = tmp_protocols->next; + } + } + + unsigned int match1 = 0, match2 = 0, has_state = 0; + + if(recvtype == 2) { + if(validate == 1) { + if(origin == ORIGIN_RULE) { + event_cache_device(obj, device); + } + if(strcmp(name, "repeats") != 0 && strcmp(name, "uuid") != 0) { + struct options_t *options = tmp_protocols->listener->options; + while(options) { + if(options->conftype == DEVICES_STATE) { + has_state = 1; + } + if(strcmp(options->name, name) == 0) { + match2 = 1; + if(options->vartype == JSON_NUMBER) { + varcont->number_ = 0; + varcont->decimals_ = 0; + varcont->type_ = JSON_NUMBER; + } + if(options->vartype == JSON_STRING) { + varcont->string_ = dummy; + varcont->type_ = JSON_STRING; + } + } + options = options->next; + } + if(match2 == 0 && ((!(strcmp(name, "state") == 0 && has_state == 1)) || (strcmp(name, "state") != 0))) { + logprintf(LOG_ERR, "rule #%d invalid: protocol \"%s\" has no field \"%s\"", obj->nr, device, name); + varcont->string_ = NULL; + varcont->number_ = 0; + varcont->decimals_ = 0; + array_free(&array, n); + return -1; + } + } else if(!(strcmp(name, "repeats") == 0 || strcmp(name, "uuid") == 0)) { + logprintf(LOG_ERR, "rule #%d invalid: protocol \"%s\" has no field \"%s\"", obj->nr, device, name); + varcont->string_ = NULL; + varcont->number_ = 0; + varcont->decimals_ = 0; + array_free(&array, n); + return -1; + } + } + struct JsonNode *jmessage = NULL, *jnode = NULL; + if(obj->jtrigger != NULL) { + if(((jnode = json_find_member(obj->jtrigger, name)) != NULL) || + ((jmessage = json_find_member(obj->jtrigger, "message")) != NULL && + (jnode = json_find_member(jmessage, name)) != NULL)) { + if(jnode->tag == JSON_STRING) { + varcont->string_ = jnode->string_; + varcont->type_ = JSON_STRING; + array_free(&array, n); + return 0; + } else if(jnode->tag == JSON_NUMBER) { + varcont->number_ = jnode->number_; + varcont->decimals_ = jnode->decimals_; + varcont->type_ = JSON_NUMBER; + array_free(&array, n); + return 0; + } + } + } + array_free(&array, n); + return 0; + } else if(recvtype == 1) { + if(validate == 1) { + if(origin == ORIGIN_RULE) { + event_cache_device(obj, device); + } +#ifdef PILIGHT_REWRITE + struct protocol_t *tmp = NULL; + i = 0; + + while(devices_select_protocol(ORIGIN_MASTER, device, i++, &tmp) == 0) { + struct options_t *opt = tmp->options; + while(opt) { + if(opt->conftype == DEVICES_STATE && strcmp("state", name) == 0) { + match1 = 1; + match2 = 1; + break; + } else if(strcmp(opt->name, name) == 0) { + match1 = 1; + if(opt->conftype == DEVICES_VALUE || opt->conftype == DEVICES_STATE || opt->conftype == DEVICES_SETTING) { + match2 = 1; + break; + } + } + opt = opt->next; + } + } +#else + struct protocols_t *tmp = dev->protocols; + while(tmp) { + struct options_t *opt = tmp->listener->options; + while(opt) { + if(opt->conftype == DEVICES_STATE && strcmp("state", name) == 0) { + match1 = 1; + match2 = 1; + break; + } else if(strcmp(opt->name, name) == 0) { + match1 = 1; + if(opt->conftype == DEVICES_VALUE || opt->conftype == DEVICES_STATE || opt->conftype == DEVICES_SETTING) { + match2 = 1; + break; + } + } + opt = opt->next; + } + tmp = tmp->next; + } +#endif + if(match1 == 0) { + logprintf(LOG_ERR, "rule #%d invalid: device \"%s\" has no variable \"%s\"", obj->nr, device, name); + } else if(match2 == 0) { + logprintf(LOG_ERR, "rule #%d invalid: variable \"%s\" of device \"%s\" cannot be used in event rules", obj->nr, name, device); + } + if(match1 == 0 || match2 == 0) { + varcont->string_ = NULL; + varcont->number_ = 0; + varcont->decimals_ = 0; + array_free(&array, n); + return -1; + } + } + struct varcont_t val; + i = 0; + +#ifdef PILIGHT_REWRITE + char *setting = NULL; + while(devices_select_settings(ORIGIN_MASTER, device, i++, &setting, &val) == 0) { + if(strcmp(setting, name) == 0) { + if(val.type_ == JSON_STRING) { + /* Cache values for faster future lookup */ + // if(obj != NULL) { + // event_store_val_ptr(obj, device, name, tmp_settings); + // } + varcont->string_ = val.string_; + varcont->type_ = JSON_STRING; + array_free(&array, n); + return 0; + } else if(val.type_ == JSON_NUMBER) { + /* Cache values for faster future lookup */ + // if(obj != NULL) { + // event_store_val_ptr(obj, device, name, tmp_settings); + // } + varcont->number_ = val.number_; + varcont->decimals_ = val.decimals_; + varcont->type_ = JSON_NUMBER; + array_free(&array, n); + return 0; + } + } + } +#else + struct devices_settings_t *tmp_settings = dev->settings; + while(tmp_settings) { + if(strcmp(tmp_settings->name, name) == 0) { + val.type_ = tmp_settings->values->type; + if(val.type_ == JSON_STRING) { + /* Cache values for faster future lookup */ + // if(obj != NULL) { + // event_store_val_ptr(obj, device, name, tmp_settings); + // } + varcont->string_ = tmp_settings->values->string_; + varcont->type_ = JSON_STRING; + array_free(&array, n); + return 0; + } else if(val.type_ == JSON_NUMBER) { + /* Cache values for faster future lookup */ + // if(obj != NULL) { + // event_store_val_ptr(obj, device, name, tmp_settings); + // } + varcont->number_ = tmp_settings->values->number_; + varcont->decimals_ = tmp_settings->values->decimals; + varcont->type_ = JSON_NUMBER; + array_free(&array, n); + return 0; + } + } + tmp_settings = tmp_settings->next; + } +#endif + logprintf(LOG_ERR, "rule #%d invalid: device \"%s\" has no variable \"%s\"", obj->nr, device, name); + varcont->string_ = NULL; + varcont->number_ = 0; + varcont->decimals_ = 0; + array_free(&array, n); + return -1; + } + /* + * '21.00' comparison should be allowed and not be seen as config device + */ + /*else { + logprintf(LOG_ERR, "rule #%d invalid: device \"%s\" does not exist in the config", obj->nr, device); + varcont->string_ = NULL; + varcont->number_ = 0; + varcont->decimals_ = 0; + array_free(&array, n); + return -1; + }*/ + array_free(&array, n); + } else if(nrdots > 2) { + logprintf(LOG_ERR, "rule #%d invalid: variable \"%s\" is invalid", obj->nr, var); + varcont->string_ = NULL; + varcont->number_ = 0; + varcont->decimals_ = 0; + return -1; + } + + if(isNumeric(var) == 0) { + varcont->number_ = atof(var); + varcont->decimals_ = nrDecimals(var); + varcont->type_ = JSON_NUMBER; + } else { + if((varcont->string_ = STRDUP(var)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + varcont->free_ = 1; + varcont->type_ = JSON_STRING; + } + return 0; +} + + +static int lexer_parse_integer(struct lexer_t *lexer, struct stack_dt *t) { + if(isdigit(lexer->current_char[0])) { + while(lexer->pos <= lexer->len && isdigit(lexer->current_char[0])) { + dt_stack_push(t, sizeof(char *), lexer->current_char); + lexer->current_char = &lexer->text[lexer->pos++]; + } + return 0; + } else { + return -1; + } +} + +static int lexer_parse_quoted_string(struct lexer_t *lexer, struct stack_dt *t) { + int x = lexer->current_char[0]; + if(lexer->pos < lexer->len) { + lexer->current_char = &lexer->text[lexer->pos++]; + + while(lexer->pos < lexer->len) { + if(lexer->pos > 0 && strnicmp(&lexer->text[lexer->pos-1], "\\'", 2) == 0) { + /* + * Skip escape + */ + lexer->current_char = &lexer->text[lexer->pos++]; + dt_stack_push(t, sizeof(char *), lexer->current_char); + lexer->current_char = &lexer->text[lexer->pos++]; + continue; + } + if(lexer->pos > 0 && strnicmp(&lexer->text[lexer->pos-1], "\\\"", 2) == 0) { + /* + * Skip escape + */ + lexer->current_char = &lexer->text[lexer->pos++]; + dt_stack_push(t, sizeof(char *), lexer->current_char); + lexer->current_char = &lexer->text[lexer->pos++]; + continue; + } + if(lexer->current_char[0] == x) { + break; + } + dt_stack_push(t, sizeof(char *), lexer->current_char); + lexer->current_char = &lexer->text[lexer->pos++]; + } + if(lexer->current_char[0] != '"' && lexer->current_char[0] != '\'') { + dt_stack_free(t, NULL); + return print_error(lexer, NULL, NULL, NULL, -1, "a ending quote", lexer->pos, lexer->ppos-1); + } else if(lexer->pos <= lexer->len) { + lexer->current_char = &lexer->text[lexer->pos++]; + return 0; + } else { + return -1; + } + } + return -1; +} + +static int lexer_parse_string(struct lexer_t *lexer, struct stack_dt *t) { + while(lexer->pos <= lexer->len && + lexer->current_char[0] != ' ' && + lexer->current_char[0] != ',' && + lexer->current_char[0] != ')') { + dt_stack_push(t, sizeof(char *), lexer->current_char); + lexer->current_char = &lexer->text[lexer->pos++]; + } + return 0; +} + +static int lexer_parse_space(struct lexer_t *lexer) { + while(lexer->pos <= lexer->len && lexer->current_char[0] == ' ') { + lexer->current_char = &lexer->text[lexer->pos++]; + } + return 0; +} + +static char *stack_to_char(struct stack_dt *stack) { + char *c = NULL; + char *str = MALLOC(dt_stack_top(stack)+1); + int i = 0; + + if(str == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + while((c = dt_stack_pop(stack, 0)) != NULL) { + str[i++] = c[0]; + } + str[i] = '\0'; + dt_stack_free(stack, NULL); + return str; +} + +static char *min(char *numbers[], int n){ + char *m = NULL; + int i = 0; + + for(i=0;i numbers[i]) { + m = numbers[i]; + } + } + + return m; +} + +static int lexer_next_token(struct lexer_t *lexer) { + struct stack_dt *t = MALLOC(sizeof(struct stack_dt)); + int type = TEOF, ret = 0; + + if(t == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + memset(t, 0, sizeof(struct stack_dt)); + + while(lexer->pos <= lexer->len) { + lexer->ppos = lexer->pos; + if(lexer->current_char[0] == ' ') { + if(lexer_parse_space(lexer) == -1) { + return -1; + } + } + + int x = 0; + if(lexer->current_char[0] == '\'' || lexer->current_char[0] == '"') { + ret = lexer_parse_quoted_string(lexer, t); + type = TSTRING; + } else if(isdigit(lexer->current_char[0])) { + ret = lexer_parse_integer(lexer, t); + type = TINTEGER; + } else if(strnicmp(lexer->current_char, "if", 2) == 0) { + dt_stack_push(t, sizeof(char *), &lexer->current_char[0]); + dt_stack_push(t, sizeof(char *), &lexer->current_char[1]); + type = TIF; + lexer->pos += 2; + lexer->current_char = &lexer->text[lexer->pos-1]; + } else if(strnicmp(lexer->current_char, "else", 4) == 0) { + dt_stack_push(t, sizeof(char *), &lexer->current_char[0]); + dt_stack_push(t, sizeof(char *), &lexer->current_char[1]); + dt_stack_push(t, sizeof(char *), &lexer->current_char[2]); + dt_stack_push(t, sizeof(char *), &lexer->current_char[3]); + type = TELSE; + lexer->pos += 4; + lexer->current_char = &lexer->text[lexer->pos-1]; + } else if(strnicmp(lexer->current_char, "then", 4) == 0) { + dt_stack_push(t, sizeof(char *), &lexer->current_char[0]); + dt_stack_push(t, sizeof(char *), &lexer->current_char[1]); + dt_stack_push(t, sizeof(char *), &lexer->current_char[2]); + dt_stack_push(t, sizeof(char *), &lexer->current_char[3]); + type = TTHEN; + lexer->pos += 4; + lexer->current_char = &lexer->text[lexer->pos-1]; + } else if(strnicmp(lexer->current_char, "end", 3) == 0) { + dt_stack_push(t, sizeof(char *), &lexer->current_char[0]); + dt_stack_push(t, sizeof(char *), &lexer->current_char[1]); + dt_stack_push(t, sizeof(char *), &lexer->current_char[2]); + type = TEND; + lexer->pos += 3; + lexer->current_char = &lexer->text[lexer->pos-1]; + } else if(lexer->current_char[0] == ',') { + dt_stack_push(t, sizeof(char *), lexer->current_char); + type = TCOMMA; + lexer->current_char = &lexer->text[lexer->pos++]; + } else if(lexer->current_char[0] == '(') { + dt_stack_push(t, sizeof(char *), lexer->current_char); + type = LPAREN; + lexer->current_char = &lexer->text[lexer->pos++]; + } else if(lexer->current_char[0] == ')') { + dt_stack_push(t, sizeof(char *), lexer->current_char); + type = RPAREN; + lexer->current_char = &lexer->text[lexer->pos++]; + } else { + char *pos[3] = { NULL }, *m = NULL; + int len = lexer->len-(lexer->pos-1), len1 = 0; + pos[0] = strstr(lexer->current_char, " "); + pos[1] = strstr(lexer->current_char, "("); + pos[2] = strstr(lexer->current_char, ","); + if((m = min(pos, 3)) != NULL) { + len = m-lexer->current_char; + } + struct event_actions_t *action = NULL; + if((len1 = is_function(lexer->current_char, len)) > 0) { + for(x=0;xcurrent_char[x]); + } + type = TFUNCTION; + lexer->current_char = &lexer->text[lexer->pos+(len1-1)]; + lexer->pos += len1; + } else if((len1 = is_operator(lexer->current_char, len)) > 0) { + for(x=0;xcurrent_char[x]); + } + type = TOPERATOR; + lexer->current_char = &lexer->text[lexer->pos+(len1-1)]; + lexer->pos += len1; + } else if((action = get_action(lexer->current_char, len)) != NULL) { + len1 = strlen(action->name); + for(x=0;xcurrent_char[x]); + } + type = TACTION; + lexer->current_char = &lexer->text[lexer->pos+(len1-1)]; + lexer->pos += len1; + } + } + if(type == TEOF) { + ret = lexer_parse_string(lexer, t); + type = TSTRING; + } + if(type != TEOF && ret == 0) { + if((lexer->current_token = MALLOC(sizeof(struct token_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + lexer->current_token->value = stack_to_char(t); + lexer->current_token->type = type; + lexer->current_token->pos = lexer->pos; + return 0; + } else { + return ret; + } + } + if(t != NULL) { + FREE(t); + } + + lexer->current_token = NULL; + return 0; +} + +static struct tree_t *ast_parent(struct token_t *token) { + struct tree_t *tree = MALLOC(sizeof(struct tree_t)); + if(tree == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + tree->child = NULL; + tree->nrchildren = 0; + tree->token = token; + return tree; +} + +static struct tree_t *ast_child(struct tree_t *p, struct tree_t *c) { + if((p->child = REALLOC(p->child, sizeof(struct tree_t)*(p->nrchildren+1))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + p->child[p->nrchildren] = c; + p->nrchildren++; + return p; +} + +static int lexer_peek(struct lexer_t *lexer, int skip, int type, char *val) { + int pos = lexer->pos, i = 0, ret = -1; + struct token_t *tmp = lexer->current_token; + char *c = lexer->current_char; + + if(skip > 0) { + for(i=0;icurrent_token != NULL) { + FREE(lexer->current_token->value); + FREE(lexer->current_token); + } + } + } + + if(type == TEOF && lexer->current_token == NULL) { + goto good; + } else if(lexer->current_token != NULL && lexer->current_token->type == type) { + if(val != NULL) { + if(stricmp(lexer->current_token->value, val) == 0) { + goto good; + } else { + ret = -1; + goto bad; + } + } else { + goto good; + } + } else { + ret = -1; + goto bad; + } + +good: + if(skip > 0 && lexer->current_token != NULL) { + FREE(lexer->current_token->value); + FREE(lexer->current_token); + } + lexer->pos = pos; + lexer->current_token = tmp; + lexer->current_char = c; + return 0; +bad: + if(skip > 0 && lexer->current_token != NULL) { + FREE(lexer->current_token->value); + FREE(lexer->current_token); + } + lexer->pos = pos; + lexer->current_token = tmp; + lexer->current_char = c; + + return ret; +} + +static int lexer_eat(struct lexer_t *lexer, int type, struct token_t **token_out) { + struct token_t *token = lexer->current_token; + int ret = -1; + + if((type == TEOF && lexer->current_token == NULL) || + (lexer->current_token != NULL && lexer->current_token->type == type)) { + if((ret = lexer_next_token(lexer)) < 0) { + *token_out = NULL; + return ret; + } + } else { + if(lexer->current_token != NULL) { + FREE(lexer->current_token->value); + FREE(lexer->current_token); + } + *token_out = NULL; + return -1; + } + *token_out = token; + return 0; +} + +static int lexer_expr(struct lexer_t *lexer, struct tree_t *tree, struct tree_t **tree_out); +static int lexer_term(struct lexer_t *lexer, struct tree_t *tree, int precedence, struct tree_t **tree_out); + +static int lexer_factor(struct lexer_t *lexer, struct tree_t *tree_in, struct tree_t **tree_out) { + struct token_t *token = lexer->current_token; + struct token_t *token_ret = NULL; + char *expected = NULL; + int pos = 0, err = -2; + + if(token != NULL) { + switch(token->type) { + case TSTRING: { + if((err = lexer_eat(lexer, TSTRING, &token_ret)) < 0) { + goto error; + } + *tree_out = ast_parent(token); + return 0; + } break; + case TINTEGER: { + if((err = lexer_eat(lexer, TINTEGER, &token_ret)) < 0) { + goto error; + } + *tree_out = ast_parent(token); + return 0; + } break; + case LPAREN: { + if((err = lexer_eat(lexer, LPAREN, &token_ret)) < 0) { + goto error; + } + FREE(token_ret->value); + FREE(token_ret); + if((err = lexer_expr(lexer, tree_in, tree_out)) < 0) { + goto error; + } + pos = (*tree_out)->token->pos+1; + if((err = lexer_eat(lexer, RPAREN, &token_ret)) < 0) { + char *tmp = "a closing parenthesis"; + expected = tmp; + pos += 1; + goto error; + } + FREE(token_ret->value); + FREE(token_ret); + return 0; + } break; + } + } + + *tree_out = NULL; + return -1; + +error: + return print_error(lexer, NULL, *tree_out, token_ret, err, expected, pos, lexer->ppos-1); +} + +static int lexer_parse_function(struct lexer_t *lexer, struct tree_t *tree_in, struct tree_t **tree_out) { + struct tree_t *node = NULL; + struct token_t *token = lexer->current_token, *token_ret = NULL; + struct tree_t *p = ast_parent(token); + char *expected = NULL; + int pos = 0, err = -1; + + if((err = lexer_eat(lexer, TFUNCTION, &token_ret)) < 0) { + *tree_out = NULL; + return err; + } + if((err = lexer_eat(lexer, LPAREN, &token_ret)) < 0) { + *tree_out = NULL; + return err; + } + FREE(token_ret->value); + FREE(token_ret); + + if((err = lexer_term(lexer, tree_in, 0, &node)) == 0) { + ast_child(p, node); + } else { + events_tree_gc(p); + *tree_out = NULL; + return err; + } + pos = node->token->pos+1; + while(1) { + if((err = lexer_eat(lexer, TCOMMA, &token_ret)) < 0) { + char *tmp = "a comma or closing parenthesis"; + pos -= strlen(node->token->value); + lexer->ppos -= 2; + expected = tmp; + events_tree_gc(p); + err = -1; + goto error; + } + FREE(token_ret->value); + FREE(token_ret); + if(lexer_term(lexer, tree_in, 0, &node) == 0) { + ast_child(p, node); + } + if(lexer_peek(lexer, 0, RPAREN, NULL) == 0) { + break; + } + pos = node->token->pos+1; + } + + if(lexer->current_token == NULL) { + char *tmp = "a closing parenthesis"; + expected = tmp; + err = -1; + goto error; + } + + if((err = lexer_eat(lexer, RPAREN, &token_ret)) < 0) { + char *tmp = "a closing parenthesis"; + expected = tmp; + pos = lexer->pos; + err = -1; + goto error; + } + FREE(token_ret->value); + FREE(token_ret); + + *tree_out = p; + return 0; + +error: + return print_error(lexer, NULL, NULL, NULL, err, expected, pos, lexer->ppos-1); +} + +static void print_ast(struct tree_t *tree); + +static int lexer_parse_action(struct lexer_t *lexer, struct tree_t *tree_in, struct tree_t **tree_out) { + struct event_actions_t *action = NULL; + struct options_t *options = NULL; + struct tree_t *node = NULL; + struct tree_t *p = NULL; + struct tree_t *p1 = NULL; + struct tree_t *tree_ret = NULL; + struct token_t *token = lexer->current_token, *token_ret = NULL; + char *expected = NULL; + int len = strlen(token->value), match = 0, pos = 0, err = -1; + + p = ast_parent(token); + + action = get_action(token->value, len); + if(action != NULL) { + if((err = lexer_eat(lexer, TACTION, &token_ret)) < 0) { + *tree_out = NULL; + return -1; + } + /* + * In case we enter a recursive action action, we + * want to be able to free the string leading to + * that situation. E.g.: + * + * ... THEN switch DEVICE switch + * + * We want to be able to free the 'DEVICE' string. + */ + if(lexer_peek(lexer, 0, TSTRING, NULL) < 0) { + if(lexer_peek(lexer, 0, TACTION, NULL) == 0) { + char *tmp = "a string but got an action"; + expected = tmp; + } else { + char *tmp = "an action argument"; + expected = tmp; + } + pos = token->pos; + err = -1; + goto error; + } + while(1) { + pos = lexer->pos; + if(lexer_peek(lexer, 0, TEOF, NULL) == 0 || + lexer_peek(lexer, 0, TELSE, NULL) == 0 || + lexer_peek(lexer, 0, TEND, NULL) == 0) { + break; + } + if(lexer_peek(lexer, 0, TACTION, NULL) == 0) { + if(lexer_term(lexer, tree_in, 0, &tree_ret) == 0) { + ast_child(p, tree_ret); + } + break; + } + if((err = lexer_eat(lexer, TSTRING, &token_ret)) < 0) { + char *tmp = "an action argument"; + if(token_ret != NULL) { + pos -= strlen(token_ret->value)+1; + } + lexer->ppos -= lexer->ppos-pos; + expected = tmp; + goto error; + } else { + match = 0; + options = action->options; + while(options != NULL) { + if(stricmp(token_ret->value, options->name) == 0) { + match = 1; + break; + } + options = options->next; + } + if(match == 0) { + char *tmp = "an action argument"; + pos -= strlen(token_ret->value)+1; + lexer->ppos -= lexer->ppos-pos; + expected = tmp; + FREE(token_ret->value); + FREE(token_ret); + err = -1; + goto error; + } + p1 = ast_parent(token_ret); + ast_child(p, p1); + /* + * In case we a arguments is combined like this + * THEN switch BETWEEN on AND off + */ + if(lexer_peek(lexer, 1, TOPERATOR, "and") == 0) { + while(lexer_peek(lexer, 1, TOPERATOR, "and") == 0) { + if(lexer_peek(lexer, 0, TINTEGER, NULL) == 0) { + if((err = lexer_eat(lexer, TINTEGER, &token_ret)) < 0) { + char *tmp = "a string, number or function"; + expected = tmp; + err = -1; + goto error; + } + ast_child(p1, ast_parent(token_ret)); + } else if(lexer_peek(lexer, 0, TSTRING, NULL) == 0) { + if((err = lexer_eat(lexer, TSTRING, &token_ret)) < 0) { + char *tmp = "a string, number or function"; + expected = tmp; + err = -1; + goto error; + } + ast_child(p1, ast_parent(token_ret)); + } + if((err = lexer_eat(lexer, TOPERATOR, &token_ret)) < 0) { + char *tmp = "an 'and' operator"; + expected = tmp; + err = -1; + goto error; + } + FREE(token_ret->value); + FREE(token_ret); + } + if(lexer_peek(lexer, 0, TINTEGER, NULL) == 0) { + if((err = lexer_eat(lexer, TINTEGER, &token_ret)) < 0) { + char *tmp = "a string, number or function"; + expected = tmp; + goto error; + } + ast_child(p1, ast_parent(token_ret)); + } else if(lexer_peek(lexer, 0, TSTRING, NULL) == 0) { + if((err = lexer_eat(lexer, TSTRING, &token_ret)) < 0) { + char *tmp = "a string, number or function"; + expected = tmp; + err = -1; + goto error; + } + ast_child(p1, ast_parent(token_ret)); + } + } else { + if(lexer_peek(lexer, 0, TACTION, NULL) == 0) { + char *tmp = "a string, number, or function, got an action"; + expected = tmp; + lexer->ppos -= strlen(lexer->current_token->value)+1; + err = -1; + goto error; + } + if((err = lexer_term(lexer, tree_in, 0, &node)) < 0) { + char *tmp = "a string, number or function"; + expected = tmp; + goto error; + } + ast_child(p1, node); + } + } + } + } else { + *tree_out = NULL; + return -1; + } + + *tree_out = p; + return 0; + +error: + return print_error(lexer, p, NULL, NULL, err, expected, pos, lexer->ppos-1); +} + +static int lexer_parse_if(struct lexer_t *lexer, struct tree_t *tree, struct tree_t **tree_out) { + struct tree_t *node = NULL; + struct token_t *token = lexer->current_token, *token_ret = NULL; + struct tree_t *p = ast_parent(token); + char *expected = NULL; + int pos = 0, err = -1; + + if((err = lexer_eat(lexer, TIF, &token_ret)) < 0) { + *tree_out = NULL; + return -1; + } + if((err = lexer_term(lexer, tree, 0, &node)) == 0) { + ast_child(p, node); + } else { + char *tmp = "a condition"; + expected = tmp; + pos = lexer->pos; + goto error; + } + + token = lexer->current_token; + pos = token->pos; + + if((err = lexer_eat(lexer, TTHEN, &token_ret)) < 0) { + char *tmp = "a condition"; + expected = tmp; + err = -1; + goto error; + } + pos = token->pos; + FREE(token->value); + FREE(token); + if(lexer_peek(lexer, 0, TACTION, NULL) < 0 && lexer_peek(lexer, 0, TIF, NULL) < 0) { + if((err = lexer_peek(lexer, 0, TACTION, NULL)) < 0) { + char *tmp = "an action"; + expected = tmp; + err = -1; + goto error; + } + } + if((err = lexer_term(lexer, tree, 0, &node)) == 0) { + ast_child(p, node); + } else { + char *tmp = "an action"; + expected = tmp; + goto error; + } + if(lexer_peek(lexer, 0, TELSE, NULL) == 0) { + token = lexer->current_token; + if((err = lexer_eat(lexer, TELSE, &token_ret)) < 0) { + *tree_out = NULL; + return -1; + } + FREE(token->value); + FREE(token); + if(lexer_term(lexer, tree, 0, &node) == 0) { + ast_child(p, node); + } + if(lexer_peek(lexer, 0, TACTION, NULL) < 0 && lexer_peek(lexer, 0, TIF, NULL) < 0 && + lexer_peek(lexer, 0, TEND, NULL) < 0 && lexer_peek(lexer, 0, TEOF, NULL) < 0) { + if((err = lexer_peek(lexer, 0, TACTION, NULL)) < 0) { + char *tmp = "an action"; + expected = tmp; + err = -1; + goto error; + } + } + } + if(lexer_peek(lexer, 0, TEND, NULL) == 0) { + token = lexer->current_token; + if((err = lexer_eat(lexer, TEND, &token_ret)) < 0) { + *tree_out = NULL; + return -1; + } + FREE(token->value); + FREE(token); + } else if(lexer_peek(lexer, 0, TEOF, NULL) == 0) { + if((err = lexer_eat(lexer, TEOF, &token_ret)) < 0) { + *tree_out = NULL; + return -1; + } + } else { + token = lexer->current_token; + if((err = lexer_eat(lexer, TEND, &token_ret)) < 0) { + *tree_out = NULL; + return -1; + } + FREE(token->value); + FREE(token); + } + + *tree_out = p; + return 0; + +error: + return print_error(lexer, p, NULL, NULL, err, expected, pos, lexer->ppos-1); +} + +/* + * Always annoying when you reinvented an already existing + * algorithm without knowing it :) + * + * An implementation of precedence climbing + */ +static int lexer_term(struct lexer_t *lexer, struct tree_t *tree_in, int precedence, struct tree_t **tree_out) { + struct token_t *token = NULL, *token_ret = NULL; + struct tree_t *node = NULL, *tree_ret = NULL; + struct tree_t *p = NULL; + char *expected = NULL; + int pos = 0, err = -1; + + int match = 0, x = 0; + struct plua_module_t *modules = plua_get_modules(); + while(modules) { + if(modules->type == OPERATOR) { + event_operator_associativity(modules->name, &x); + if(x > precedence) { + match = 1; + break; + } + } + modules = modules->next; + } + + if(match == 0) { + if((err = lexer_factor(lexer, tree_in, &tree_ret)) < 0) { + *tree_out = NULL; + return err; + } else { + *tree_out = tree_ret; + return 0; + } + } + + err = lexer_term(lexer, tree_in, precedence+1, &node); + if(lexer->current_token != NULL) { + switch(lexer->current_token->type) { + case TIF: { + if((err = lexer_parse_if(lexer, tree_in, &tree_ret)) < 0) { + *tree_out = NULL; + char *tmp = "an action"; + expected = tmp; + pos = lexer->pos; + goto error; + } + *tree_out = tree_ret; + return 0; + } break; + case TACTION: { + if(node != NULL) { + if(node->token->value != NULL) { + FREE(node->token->value); + } + if(node->token != NULL) { + FREE(node->token); + } + FREE(node); + node = NULL; + } + if((err = lexer_parse_action(lexer, tree_in, &tree_ret)) < 0) { + *tree_out = NULL; + goto error; + } + *tree_out = tree_ret; + return 0; + } break; + case TFUNCTION: { + if((err = lexer_parse_function(lexer, tree_in, &tree_ret)) < 0) { + *tree_out = NULL; + char *tmp = "an action"; + expected = tmp; + pos = lexer->pos; + goto error; + } + if(lexer_peek(lexer, 0, TFUNCTION, NULL) == 0) { + *tree_out = NULL; + char *tmp = "an operator"; + expected = tmp; + pos = lexer->pos-strlen(lexer->current_token->value)-1; + events_tree_gc(tree_ret); + err = -1; + goto error; + } + if(node != NULL) { + ast_child(node, tree_ret); + *tree_out = node; + } else { + *tree_out = tree_ret; + } + return 0; + } break; + case TOPERATOR: { + int tpos = lexer->ppos; + int z = get_precedence(lexer->current_token->value); + int y = get_associativity(lexer->current_token->value); + if((z == precedence && y == 1) || z > precedence) { + if(lexer->current_token->type == TEOF) { + *tree_out = node; + goto error; + } + token = lexer->current_token; + if((err = lexer_eat(lexer, TOPERATOR, &token_ret)) < 0) { + *tree_out = NULL; + return -1; + } + if(z == -1) { + if((err = lexer_term(lexer, tree_in, precedence, &tree_ret)) < 0) { + char *tmp = "an operand"; + expected = tmp; + lexer->ppos = tpos; + pos = token->pos; + goto error; + } + if(tree_ret->token->type == TACTION) { + char *tmp = "an operand, got an action"; + expected = tmp; + lexer->ppos = tpos; + pos = token->pos; + err = -1; + events_tree_gc(tree_ret); + goto error; + } + p = ast_parent(token); + ast_child(p, node); + ast_child(p, tree_ret); + *tree_out = p; + return 0; + } else { + if((err = lexer_term(lexer, tree_in, precedence+1, &tree_ret)) < 0) { + char *tmp = "an operand"; + expected = tmp; + pos = token->pos; + lexer->ppos = tpos; + goto error; + } + if(tree_ret->token->type == TACTION) { + char *tmp = "an operand, got an action"; + expected = tmp; + pos = token->pos; + lexer->ppos = tpos; + err = -1; + events_tree_gc(tree_ret); + goto error; + } + p = ast_parent(token); + ast_child(p, node); + ast_child(p, tree_ret); + *tree_out = p; + return 0; + } + } + } break; + } + } + + if((*tree_out = node) == NULL) { + return err; + } + return 0; + +error: + return print_error(lexer, p, node, token, err, expected, pos, lexer->ppos-1); +} + +static int lexer_expr(struct lexer_t *lexer, struct tree_t *tree, struct tree_t **out) { + return lexer_term(lexer, tree, 0, out); +} + +static int lexer_parse(struct lexer_t *lexer, struct tree_t **tree_out) { + struct tree_t *tree = MALLOC(sizeof(struct tree_t)); + int err = -1; + + if(tree == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(tree, 0, sizeof(struct tree_t)); + + if((err = lexer_expr(lexer, tree, tree_out)) < 0) { + if(err == -1) { + err = print_error(lexer, tree, NULL, NULL, err, NULL, lexer->pos+1, lexer->ppos-1); + } else { + events_tree_gc(tree); + } + return err; + } else { + if(lexer->current_token != NULL && lexer->current_token->type != TEOF) { + FREE(tree); + return -1; + } + + FREE(tree); + } + return 0; +} + +static void print_ast(struct tree_t *tree) { + int i = 0; + if(tree == NULL) { + return; + } + for(i=0;inrchildren;i++) { + if(tree->child[i]->token != NULL) { + printf("\"%p\" [label=\"%s\"];\n", tree->token->value, tree->token->value); + printf("\"%p\" [label=\"%s\"];\n", tree->child[i]->token->value, tree->child[i]->token->value); + printf("\"%p\" -> ", tree->token->value); + printf("\"%p\";\n", tree->child[i]->token->value); + } + print_ast(tree->child[i]); + } + + if(tree->nrchildren == 0 && tree->token != NULL) { + printf("\"%p\" [label=\"%s\"];\n", tree->token->value, tree->token->value); + printf("\"%p\";\n", tree->token->value); + } +} + +static int interpret(struct tree_t *tree, struct rules_t *obj, unsigned short validate, struct varcont_t *v); + +static void varcont_free(struct varcont_t *v) { + if(v->free_ == 1) { + if(v->type_ == JSON_STRING) { + FREE(v->string_); + } + v->free_ = 0; + } +} + +static int run_function(struct tree_t *tree, struct rules_t *obj, unsigned short validate, struct varcont_t *v) { + struct event_function_args_t *args = NULL; + struct varcont_t v_res, v1; + int i = 0; + + for(i=0;inrchildren;i++) { + memset(&v_res, '\0', sizeof(struct varcont_t)); + memset(&v1, '\0', sizeof(struct varcont_t)); + + if(interpret(tree->child[i], obj, validate, &v_res) == -1) { + v = NULL; + return -1; + } + if(v_res.type_ == JSON_STRING) { + if(event_lookup_variable(v_res.string_, obj, &v1, validate, ORIGIN_RULE) == -1) { + varcont_free(&v1); + varcont_free(&v_res); + return -1; + } else { + args = event_function_add_argument(&v1, args); + varcont_free(&v1); + varcont_free(&v_res); + } + } else { + args = event_function_add_argument(&v_res, args); + } + } + + memset(&v_res, '\0', sizeof(struct varcont_t)); + if(event_function_callback(tree->token->value, args, v) == -1) { + return -1; + } + + return 0; +} + +static int run_action(struct tree_t *tree, struct rules_t *obj, unsigned short validate, struct varcont_t *v_out) { + struct JsonNode *jobject = json_mkobject(); + struct JsonNode *jparam = NULL; + struct JsonNode *jvalues = NULL; + struct varcont_t v_res, v_res1, v1; + struct rules_actions_t *node = NULL; + struct event_actions_t *action = NULL; + char *key = NULL; + int i = 0, x = 0, match = 0; + + action = get_action(tree->token->value, strlen(tree->token->value)); + + for(i=0;inrchildren;i++) { + if(tree->child[i]->token->type == TACTION) { + if(interpret(tree->child[i], obj, validate, &v_res) == -1) { + v_out = NULL; + return -1; + } + continue; + } + memset(&v_res1, '\0', sizeof(struct varcont_t)); + memset(&v_res, '\0', sizeof(struct varcont_t)); + memset(&v1, '\0', sizeof(struct varcont_t)); + + jparam = json_mkobject(); + jvalues = json_mkarray(); + json_append_member(jparam, "order", json_mknumber(i+1, 0)); + json_append_member(jparam, "value", jvalues); + if(interpret(tree->child[i], obj, validate, &v_res) == -1) { + v_out = NULL; + return -1; + } + key = v_res.string_; + + for(x=0;xchild[i]->nrchildren;x++) { + if(interpret(tree->child[i]->child[x], obj, validate, &v_res1) == -1) { + v_out = NULL; + return -1; + } + + switch(v_res1.type_) { + case JSON_STRING: { + if(event_lookup_variable(v_res1.string_, obj, &v1, validate, ORIGIN_RULE) == -1) { + varcont_free(&v1); + varcont_free(&v_res); + varcont_free(&v_res1); + v_out = NULL; + return -1; + } else { + switch(v1.type_) { + case JSON_NUMBER: { + json_append_element(jvalues, json_mknumber(v1.number_, v1.decimals_)); + } break; + case JSON_STRING: { + json_append_element(jvalues, json_mkstring(v1.string_)); + } break; + case JSON_BOOL: { + json_append_element(jvalues, json_mkbool(v1.bool_)); + } break; + } + varcont_free(&v1); + } + } break; + case JSON_NUMBER: { + json_append_element(jvalues, json_mknumber(v_res1.number_, v_res1.decimals_)); + } break; + case JSON_BOOL: { + json_append_element(jvalues, json_mkbool(v_res1.bool_)); + } break; + } + varcont_free(&v_res1); + } + json_append_member(jobject, key, jparam); + varcont_free(&v_res); + } + + node = obj->actions; + while(node) { + if(node->ptr == tree) { + match = 1; + break; + } + node = node->next; + } + if(match == 0) { + if((node = MALLOC(sizeof(struct rules_actions_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + node->ptr = tree; + node->rule = obj; + node->arguments = NULL; + node->next = obj->actions; + obj->actions = node; + } + + if(node->arguments != NULL) { + json_delete(node->arguments); + node->arguments = NULL; + } + + node->arguments = jobject; + if(action != NULL) { + if(validate == 1) { + if(action->checkArguments != NULL) { + if(action->checkArguments(node) == -1) { + return -1; + } + } + } else { + if(action->run != NULL) { + if(action->run(node) == -1) { + return -1; + } + } + } + } + + v_out->bool_ = 1; + v_out->type_ = JSON_BOOL; + return 0; +} + +static int interpret(struct tree_t *tree, struct rules_t *obj, unsigned short validate, struct varcont_t *v_out) { + struct varcont_t v_res; + memset(&v_res, 0, sizeof(struct varcont_t)); + if(tree == NULL) { + return -1; + } + + switch(tree->token->type) { + case TACTION: { + if(run_action(tree, obj, validate, v_out) == -1) { + return -1; + } + return 0; + } break; + case TFUNCTION: { + if(run_function(tree, obj, validate, v_out) == -1) { + return -1; + } + return 0; + } break; + case TSTRING: { + v_out->string_ = tree->token->value; + v_out->type_ = JSON_STRING; + return 0; + } break; + case TINTEGER: { + v_out->number_ = atof(tree->token->value); + v_out->decimals_ = nrDecimals(tree->token->value); + v_out->type_ = JSON_NUMBER; + return 0; + } break; + case TIF: { + if(interpret(tree->child[0], obj, validate, &v_res) == -1) { + varcont_free(&v_res); + return -1; + } else { + if(v_res.type_ != JSON_BOOL) { + logprintf(LOG_ERR, "If condition did not result in a boolean expression"); + return -1; + } + if(v_res.bool_ == 1) { + varcont_free(&v_res); + if(interpret(tree->child[1], obj, validate, &v_res) == -1) { + varcont_free(&v_res); + return -1; + } + memcpy(v_out, &v_res, sizeof(struct varcont_t)); + varcont_free(&v_res); + return 0; + } else if(tree->nrchildren == 3) { + varcont_free(&v_res); + if(interpret(tree->child[2], obj, validate, &v_res) == -1) { + varcont_free(&v_res); + return -1; + } + memcpy(v_out, &v_res, sizeof(struct varcont_t)); + varcont_free(&v_res); + return 0; + } else { + v_out->bool_ = 1; + v_out->type_ = JSON_BOOL; + varcont_free(&v_res); + return 0; + } + } + varcont_free(&v_res); + return -1; + } break; + case TOPERATOR: { + struct varcont_t v1, v2, v3, v4; + + memset(&v1, '\0', sizeof(struct varcont_t)); + memset(&v2, '\0', sizeof(struct varcont_t)); + memset(&v3, '\0', sizeof(struct varcont_t)); + memset(&v4, '\0', sizeof(struct varcont_t)); + + if(event_operator_exists(tree->token->value) == 0) { + if(interpret(tree->child[0], obj, validate, &v1) == -1) { + varcont_free(&v1); + return -1; + } + if(interpret(tree->child[1], obj, validate, &v2) == -1) { + varcont_free(&v2); + return -1; + } + if(v1.type_ == JSON_STRING) { + if(event_lookup_variable(v1.string_, obj, &v3, validate, ORIGIN_RULE) == -1) { + varcont_free(&v1); + return -1; + } else { + varcont_free(&v1); + switch(v3.type_) { + case JSON_STRING: { + if((v1.string_ = STRDUP(v3.string_)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + v1.free_ = 1; + v1.type_ = JSON_STRING; + } break; + case JSON_NUMBER: { + v1.number_ = v3.number_; + v1.decimals_ = v3.decimals_; + v1.type_ = JSON_NUMBER; + } break; + case JSON_BOOL: { + v1.bool_ = v3.bool_; + v1.type_ = JSON_BOOL; + } break; + } + varcont_free(&v3); + } + } + if(v2.type_ == JSON_STRING) { + if(event_lookup_variable(v2.string_, obj, &v4, validate, ORIGIN_RULE) == -1) { + varcont_free(&v2); + return -1; + } else { + varcont_free(&v2); + switch(v4.type_) { + case JSON_STRING: { + if((v2.string_ = STRDUP(v4.string_)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + v2.free_ = 1; + v2.type_ = JSON_STRING; + } break; + case JSON_NUMBER: { + v2.number_ = v4.number_; + v2.decimals_ = v4.decimals_; + v2.type_ = JSON_NUMBER; + } break; + case JSON_BOOL: { + v2.bool_ = v4.bool_; + v2.type_ = JSON_BOOL; + } break; + } + varcont_free(&v4); + } + } + if(event_operator_callback(tree->token->value, &v1, &v2, v_out) != 0) { + logprintf(LOG_ERR, "rule #%d: an unexpected error occurred while parsing", obj->nr); + varcont_free(&v1); + varcont_free(&v2); + return -1; + } + varcont_free(&v1); + varcont_free(&v2); + return 0; + } else { + return -1; + } + } break; + } + + v_out->bool_ = 0; + v_out->type_ = JSON_BOOL; + return 0; +} + +int event_parse_rule(char *rule, struct rules_t *obj, int depth, unsigned short validate) { + struct varcont_t v_res; + + if(validate == 1) { + struct lexer_t *lexer = MALLOC(sizeof(struct lexer_t)); + if(lexer == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(lexer, 0, sizeof(struct lexer_t)); + + if((lexer->text = STRDUP(rule)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + lexer->pos = 0; + lexer->len = strlen(lexer->text); + lexer->current_char = &lexer->text[lexer->pos++]; + + if(lexer_next_token(lexer) == -1) { + FREE(lexer->text); + FREE(lexer); + return -1; + } + if(lexer_parse(lexer, &obj->tree) == -1) { + FREE(lexer->text); + FREE(lexer); + return -1; + } + if(pilight.debuglevel >= 1) { + logprintf(LOG_DEBUG, "%s", lexer->text); + print_ast(obj->tree); + } + FREE(lexer->text); + FREE(lexer); + } + + if(interpret(obj->tree, obj, validate, &v_res) == -1) { + return -1; + } + if(v_res.type_ == JSON_BOOL) { + return v_res.bool_; + } + return -1; +} + +void *events_loop(void *param) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(eventslock_init == 0) { + pthread_mutexattr_init(&events_attr); + pthread_mutexattr_settype(&events_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&events_lock, &events_attr); + pthread_cond_init(&events_signal, NULL); + eventslock_init = 1; + } + + struct devices_t *dev = NULL; + struct JsonNode *jdevices = NULL, *jchilds = NULL; + struct rules_t *tmp_rules = NULL; + char *str = NULL, *origin = NULL, *protocol = NULL; + unsigned short match = 0; + unsigned int i = 0; + + pthread_mutex_lock(&events_lock); + while(loop) { + if(eventsqueue_number > 0) { + pthread_mutex_lock(&events_lock); + + logprintf(LOG_STACK, "%s::unlocked", __FUNCTION__); + + running = 1; + + jdevices = json_find_member(eventsqueue->jconfig, "devices"); + tmp_rules = rules_get(); + while(tmp_rules) { + if(tmp_rules->active == 1) { + if(eventsqueue->jconfig != NULL) { + char *conf = json_stringify(eventsqueue->jconfig, NULL); + tmp_rules->jtrigger = json_decode(conf); + json_free(conf); + } + + match = 0; + if((str = MALLOC(strlen(tmp_rules->rule)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(str, tmp_rules->rule); + if(json_find_string(eventsqueue->jconfig, "origin", &origin) == 0 && + json_find_string(eventsqueue->jconfig, "protocol", &protocol) == 0) { + if(strcmp(origin, "sender") == 0 || strcmp(origin, "receiver") == 0) { + for(i=0;inrdevices;i++) { + if(strcmp(tmp_rules->devices[i], protocol) == 0) { + match = 1; + break; + } + } + } + } + /* Only run those events that affect the updates devices */ + if(jdevices != NULL && match == 0) { + jchilds = json_first_child(jdevices); + while(jchilds) { + for(i=0;inrdevices;i++) { + if(jchilds->tag == JSON_STRING && + strcmp(jchilds->string_, tmp_rules->devices[i]) == 0) { + if(devices_get(jchilds->string_, &dev) == 0) { + if(dev->lastrule == tmp_rules->nr && + tmp_rules->nr == dev->prevrule && + dev->lastrule == dev->prevrule) { + logprintf(LOG_ERR, "skipped rule #%d because of an infinite loop triggered by device %s", tmp_rules->nr, jchilds->string_); + } else { + match = 1; + } + } else { + match = 1; + } + break; + } + } + jchilds = jchilds->next; + } + } + if(match == 1 && tmp_rules->status == 0) { +#ifndef WIN32 + clock_gettime(CLOCK_MONOTONIC, &tmp_rules->timestamp.first); +#endif + if(event_parse_rule(str, tmp_rules, 0, 0) == 0) { + if(tmp_rules->status == 1) { + logprintf(LOG_INFO, "executed rule: %s", tmp_rules->name); + } + } +#ifndef WIN32 + clock_gettime(CLOCK_MONOTONIC, &tmp_rules->timestamp.second); + logprintf(LOG_DEBUG, "rule #%d %s was parsed in %.6f seconds", tmp_rules->nr, tmp_rules->name, + ((double)tmp_rules->timestamp.second.tv_sec + 1.0e-9*tmp_rules->timestamp.second.tv_nsec) - + ((double)tmp_rules->timestamp.first.tv_sec + 1.0e-9*tmp_rules->timestamp.first.tv_nsec)); +#endif + tmp_rules->status = 0; + } + FREE(str); + if(tmp_rules->jtrigger != NULL) { + json_delete(tmp_rules->jtrigger); + tmp_rules->jtrigger = NULL; + } + } + tmp_rules = tmp_rules->next; + } + struct eventsqueue_t *tmp = eventsqueue; + json_delete(tmp->jconfig); + eventsqueue = eventsqueue->next; + FREE(tmp); + eventsqueue_number--; + pthread_mutex_unlock(&events_lock); + } else { + running = 0; + pthread_cond_wait(&events_signal, &events_lock); + } + } + return (void *)NULL; +} + +int events_running(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + return (running == 1) ? 0 : -1; +} +static void events_queue(char *message) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(eventslock_init == 1) { + pthread_mutex_lock(&events_lock); + } + if(eventsqueue_number < 1024) { + struct eventsqueue_t *enode = MALLOC(sizeof(eventsqueue_t)); + if(enode == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + enode->jconfig = json_decode(message); + + if(eventsqueue_number == 0) { + eventsqueue = enode; + eventsqueue_head = enode; + } else { + eventsqueue_head->next = enode; + eventsqueue_head = enode; + } + + eventsqueue_number++; + } else { + logprintf(LOG_ERR, "event queue full"); + } + if(eventslock_init == 1) { + pthread_mutex_unlock(&events_lock); + pthread_cond_signal(&events_signal); + } +} + +void *events_clientize(void *param) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct JsonNode *jclient = NULL; + struct JsonNode *joptions = NULL; + struct ssdp_list_t *ssdp_list = NULL; + char *out = NULL; + int standalone = 0; + int client_loop = 0; + settings_find_number("standalone", &standalone); + + while(loop) { + + if(client_loop == 1) { + sleep(1); + } + client_loop = 1; + + ssdp_list = NULL; + if(ssdp_seek(&ssdp_list) == -1 || standalone == 1) { + logprintf(LOG_NOTICE, "no pilight ssdp connections found"); + char server[16] = "127.0.0.1"; + if((sockfd = socket_connect(server, (unsigned short)socket_get_port())) == -1) { + logprintf(LOG_ERR, "could not connect to pilight-daemon"); + continue; + } + } else { + if((sockfd = socket_connect(ssdp_list->ip, ssdp_list->port)) == -1) { + logprintf(LOG_ERR, "could not connect to pilight-daemon"); + continue; + } + } + + if(ssdp_list != NULL) { + ssdp_free(ssdp_list); + } + + jclient = json_mkobject(); + joptions = json_mkobject(); + json_append_member(jclient, "action", json_mkstring("identify")); + json_append_member(joptions, "config", json_mknumber(1, 0)); + json_append_member(joptions, "receiver", json_mknumber(1, 0)); + json_append_member(jclient, "options", joptions); + json_append_member(jclient, "media", json_mkstring("all")); + out = json_stringify(jclient, NULL); + if(socket_write(sockfd, out) != (strlen(out)+strlen(EOSS))) { + json_free(out); + json_delete(jclient); + continue; + } + json_free(out); + json_delete(jclient); + + if(socket_read(sockfd, &recvBuff, 0) != 0 + || strcmp(recvBuff, "{\"status\":\"success\"}") != 0) { + continue; + } + + while(client_loop) { + if(sockfd <= 0) { + break; + } + if(loop == 0) { + client_loop = 0; + break; + } + + int z = socket_read(sockfd, &recvBuff, 1); + if(z == -1) { + sockfd = 0; + break; + } else if(z == 1) { + continue; + } + + char **array = NULL; + unsigned int n = explode(recvBuff, "\n", &array), i = 0; + for(i=0;i 0) { + socket_close(sockfd); + } + return (void *)NULL; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/events/events.h b/lib/ESPiLight/pilight/libs/pilight/events/events.h new file mode 100644 index 0000000..af14af0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/events.h @@ -0,0 +1,25 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _EVENTS_H_ +#define _EVENTS_H_ + +#include "../config/rules.h" +#include "../core/common.h" + +void events_tree_gc(struct tree_t *tree); +void event_cache_device(struct rules_t *obj, char *device); +int event_lookup_variable(char *var, struct rules_t *obj, struct varcont_t *varcont, unsigned short validate, enum origin_t origin); +int event_parse_rule(char *rule, struct rules_t *obj, int depth, unsigned short validate); +void *events_clientize(void *param); +int events_gc(void); +void event_init(void); +void *events_loop(void *param); +int events_running(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/function.c b/lib/ESPiLight/pilight/libs/pilight/events/function.c new file mode 100644 index 0000000..93abe90 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/function.c @@ -0,0 +1,273 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #include +#endif + +#include "../core/pilight.h" +#include "../core/common.h" +#include "../core/options.h" +#include "../core/dso.h" +#include "../core/log.h" +#include "../lua/lua.h" +#include "../config/settings.h" + +#include "function.h" + +static int init = 0; + +void event_function_init(void) { + if(init == 1) { + return; + } + init = 1; + plua_init(); + + char path[PATH_MAX]; + char *f = STRDUP(__FILE__); + struct dirent *file = NULL; + DIR *d = NULL; + struct stat s; + char *functions_root = FUNCTION_ROOT; + + if(f == NULL) { + OUT_OF_MEMORY + } + +#ifdef PILIGHT_REWRITE + settings_select_string(ORIGIN_MASTER, "functions-root", &functions_root); +#else + settings_find_string("functions-root", &functions_root); +#endif + + if((d = opendir(functions_root))) { + while((file = readdir(d)) != NULL) { + memset(path, '\0', PATH_MAX); + sprintf(path, "%s%s", functions_root, file->d_name); + if(stat(path, &s) == 0) { + /* Check if file */ + if(S_ISREG(s.st_mode)) { + if(strstr(file->d_name, ".lua") != NULL) { + plua_module_load(path, FUNCTION); + } + } + } + } + } + closedir(d); + FREE(f); +} + +static int plua_function_module_run(struct lua_State *L, char *file, struct event_function_args_t *args, struct varcont_t *v) { +#if LUA_VERSION_NUM <= 502 + lua_getfield(L, -1, "run"); + if(strcmp(lua_typename(L, lua_type(L, -1)), "function") != 0) { +#else + if(lua_getfield(L, -1, "run") == 0) { +#endif + logprintf(LOG_ERR, "%s: run function missing", file); + return 0; + } + + int nrargs = 0; + struct event_function_args_t *tmp1 = NULL; + while(args) { + tmp1 = args; + nrargs++; + switch(tmp1->var.type_) { + case JSON_NUMBER: { + char *tmp = NULL; + int len = snprintf(NULL, 0, "%.*f", tmp1->var.decimals_, tmp1->var.number_); + if((tmp = MALLOC(len+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(tmp, 0, len+1); + sprintf(tmp, "%.*f", tmp1->var.decimals_, tmp1->var.number_); + lua_pushstring(L, tmp); + FREE(tmp); + } break; + case JSON_STRING: + lua_pushstring(L, tmp1->var.string_); + FREE(tmp1->var.string_); + break; + case JSON_BOOL: + lua_pushboolean(L, tmp1->var.bool_); + break; + } + args = args->next; + FREE(tmp1); + } + args = NULL; + + if(lua_pcall(L, nrargs, 1, 0) == LUA_ERRRUN) { + if(strcmp(lua_typename(L, lua_type(L, -1)), "nil") == 0) { + logprintf(LOG_ERR, "%s: syntax error", file); + return 0; + } + if(strcmp(lua_typename(L, lua_type(L, -1)), "string") == 0) { + logprintf(LOG_ERR, "%s", lua_tostring(L, -1)); + lua_pop(L, 1); + return 0; + } + } + + if(lua_isstring(L, -1) == 0 && + lua_isnumber(L, -1) == 0 && + lua_isboolean(L, -1) == 0) { + logprintf(LOG_ERR, "%s: the run function returned %s, string, number or boolean expected", file, lua_typename(L, lua_type(L, -1))); + return 0; + } + + if(lua_isnumber(L, -1) == 1) { + char *p = (char *)lua_tostring(L, -1); + v->number_ = atof(p); + v->decimals_ = nrDecimals(p); + v->type_ = JSON_NUMBER; + } else if(lua_isstring(L, -1) == 1) { + int l = strlen(lua_tostring(L, -1)); + if((v->string_ = REALLOC(v->string_, l+1)) == NULL) { + OUT_OF_MEMORY + } + strcpy(v->string_, lua_tostring(L, -1)); + v->type_ = JSON_STRING; + v->free_ = 1; + } else if(lua_isboolean(L, -1) == 1) { + v->bool_ = (int)lua_toboolean(L, -1); + v->type_ = JSON_BOOL; + } + + lua_pop(L, 1); + + return 1; +} + +int event_function_exists(char *module) { + return plua_module_exists(module, FUNCTION); +} + +struct event_function_args_t *event_function_add_argument(struct varcont_t *var, struct event_function_args_t *head) { + struct event_function_args_t *node = MALLOC(sizeof(struct event_function_args_t)); + if(node == NULL) { + OUT_OF_MEMORY + } + memset(node, 0, sizeof(struct event_function_args_t)); + switch(var->type_) { + case JSON_NUMBER: { + node->var.type_ = JSON_NUMBER; + node->var.number_ = var->number_; + node->var.decimals_ = var->decimals_; + } break; + case JSON_STRING: { + node->var.type_ = JSON_STRING; + if((node->var.string_ = STRDUP(var->string_)) == NULL) { + OUT_OF_MEMORY + } + } break; + case JSON_BOOL: { + node->var.type_ = JSON_BOOL; + node->var.bool_ = var->bool_; + } break; + } + if(head != NULL) { + struct event_function_args_t *tmp = head; + while(tmp->next != NULL) { + tmp = tmp->next; + } + tmp->next = node; + node = tmp; + } else { + node->next = head; + head = node; + } + return head; +} + +void event_function_free_argument(struct event_function_args_t *args) { + struct event_function_args_t *tmp1 = NULL; + while(args) { + tmp1 = args; + switch(tmp1->var.type_) { + case JSON_STRING: + FREE(tmp1->var.string_); + break; + } + args = args->next; + FREE(tmp1); + } +} + +int event_function_callback(char *module, struct event_function_args_t *args, struct varcont_t *v) { + struct lua_state_t *state = plua_get_free_state(); + struct lua_State *L = NULL; + + if(state == NULL) { + return -1; + } + if((L = state->L) == NULL) { + uv_mutex_unlock(&state->lock); + return -1; + } + + char name[255], *p = name; + memset(name, '\0', 255); + + sprintf(p, "function.%s", module); + + lua_getglobal(L, name); + if(lua_isnil(L, -1) != 0) { + event_function_free_argument(args); + uv_mutex_unlock(&state->lock); + return -1; + } + if(lua_istable(L, -1) != 0) { + char *file = NULL; + struct plua_module_t *tmp = plua_get_modules(); + while(tmp) { + if(strcmp(module, tmp->name) == 0) { + file = tmp->file; + state->module = tmp; + break; + } + tmp = tmp->next; + } + if(file != NULL) { + if(plua_function_module_run(L, file, args, v) == 0) { + lua_pop(L, -1); + uv_mutex_unlock(&state->lock); + return -1; + } + } else { + event_function_free_argument(args); + uv_mutex_unlock(&state->lock); + return -1; + } + } + lua_pop(L, -1); + + uv_mutex_unlock(&state->lock); + + return 0; +} + +int event_function_gc(void) { + init = 0; + logprintf(LOG_DEBUG, "garbage collected event function library"); + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/events/function.h b/lib/ESPiLight/pilight/libs/pilight/events/function.h new file mode 100644 index 0000000..d4cd32e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/function.h @@ -0,0 +1,28 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _FUNCTION_H_ +#define _FUNCTION_H_ + +#include "../core/common.h" + +#include "events.h" /* rewrite */ + +struct event_function_args_t { + struct varcont_t var; + struct event_function_args_t *next; +} event_function_args_t; + +void event_function_init(void); +int event_function_callback(char *, struct event_function_args_t *, struct varcont_t *v); +struct event_function_args_t *event_function_add_argument(struct varcont_t *, struct event_function_args_t *); +void event_function_free_argument(struct event_function_args_t *); +int event_function_exists(char *); +int event_function_gc(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/functions/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/events/functions/CMakeLists.txt new file mode 100644 index 0000000..83ae99d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/functions/CMakeLists.txt @@ -0,0 +1,6 @@ +file(GLOB functions "${PROJECT_SOURCE_DIR}/functions/*.lua") +if(WIN32) + install(FILES ${functions} DESTINATION functions/ COMPONENT pilight) +else() + install(FILES ${functions} DESTINATION lib/pilight/functions/ COMPONENT pilight) +endif() diff --git a/lib/ESPiLight/pilight/libs/pilight/events/functions/date_add.lua b/lib/ESPiLight/pilight/libs/pilight/events/functions/date_add.lua new file mode 100644 index 0000000..7851ac1 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/functions/date_add.lua @@ -0,0 +1,80 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +local function split(s, delimiter) + result = {}; + for match in (s..delimiter):gmatch("(.-)"..delimiter) do + table.insert(result, match); + end + return result; +end + +local function tablelength(T) + local count = 0 + for _ in pairs(T) do count = count + 1 end + return count +end + +function M.run(a, b, c) + local tm = nil; + local e = nil; + + if c ~= nil then + error("DATE_ADD requires two arguments"); + return nil; + elseif a ~= nil and b ~= nil then + tm = pilight.getdevice(a); + if tm == nil then + tm = pilight.strptime("%Y-%m-%d %H:%M:%S", a); + end + array = split(b, ' '); + if tablelength(array) ~= 2 then + error(string.format("DATE_ADD got an invalid unit \"%s\"", b)); + end + number = array[1]; + unit = array[2]; + else + error("DATE_ADD requires two arguments"); + return nil; + end + + if tonumber(number) == nil then + error(string.format("DATE_ADD unit parameter must be numeric, \"%s\" given", type(number))); + return nil; + end + + if unit == 'YEAR' then + tm['year'] = tm['year'] + number; + elseif unit == 'MONTH' then + tm['month'] = tm['month'] + number; + elseif unit == 'DAY' then + tm['day'] = tm['day'] + number; + elseif unit == 'HOUR' then + tm['hour'] = tm['hour'] + number; + elseif unit == 'MINUTE' then + tm['min'] = tm['min'] + number; + elseif unit == 'SECOND' then + tm['sec'] = tm['sec'] + number; + else + error(string.format("DATE_ADD does not accept \"%s\" as a unit", unit)); + return nil; + end + local t = os.time(tm); + return os.date("%Y-%m-%d %H:%M:%S", t); +end + +function M.info() + return { + name = "DATE_ADD", + version = "2.0", + reqversion = "7.0", + reqcommit = "94" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/functions/date_format.lua b/lib/ESPiLight/pilight/libs/pilight/events/functions/date_format.lua new file mode 100644 index 0000000..9f6f5e9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/functions/date_format.lua @@ -0,0 +1,43 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b, c, d) + local tm = nil; + local e = nil; + + if d ~= nil then + error("DATE_FORMAT requires no more than three arguments"); + return nil; + elseif a ~= nil and b ~= nil and c ~= nil then + e = c; + tm = pilight.strptime(b, a); + elseif a ~= nil and b ~= nil then + e = b; + tm = pilight.getdevice(a); + if tm == nil then + error(string.format("DATE_FORMAT device \"%s\" is not a datetime protocol", a)); + end + else + error("DATE_FORMAT requires at least two arguments"); + return nil; + end + local t = os.time(tm); + return os.date(e, t); +end + + +function M.info() + return { + name = "DATE_FORMAT", + version = "1.0", + reqversion = "6.0", + reqcommit = "94" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/functions/random.lua b/lib/ESPiLight/pilight/libs/pilight/events/functions/random.lua new file mode 100644 index 0000000..69b698f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/functions/random.lua @@ -0,0 +1,33 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b, c) + if (a == nil or b == nil) or c ~= nil then + error("RANDOM requires two arguments"); + end + if tonumber(a) == nil then + error(string.format("RANDOM argument #1 expected number, \"%s\" given", type(a))); + end + if tonumber(b) == nil then + error(string.format("RANDOM argument #2 expected number, \"%s\" given", type(b))); + end + + return pilight.random(a, b); +end + + +function M.info() + return { + name = "RANDOM", + version = "2.1", + reqversion = "7.0", + reqcommit = "94" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operator.c b/lib/ESPiLight/pilight/libs/pilight/events/operator.c new file mode 100644 index 0000000..9c0118b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operator.c @@ -0,0 +1,372 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #include + #include +#endif + +#include "../core/pilight.h" +#include "../core/common.h" +#include "../core/dso.h" +#include "../core/log.h" +#include "../config/settings.h" +#include "../lua/lua.h" + +#include "operator.h" + +static int init = 0; + +void event_operator_init(void) { + if(init == 1) { + return; + } + init = 1; + plua_init(); + + char path[PATH_MAX]; + char *f = STRDUP(__FILE__); + struct dirent *file = NULL; + DIR *d = NULL; + struct stat s; + char *operator_root = OPERATOR_ROOT; + + if(f == NULL) { + OUT_OF_MEMORY + } + +#ifdef PILIGHT_REWRITE + settings_select_string(ORIGIN_MASTER, "operators-root", &operator_root); +#else + settings_find_string("operators-root", &operator_root); +#endif + + if((d = opendir(operator_root))) { + while((file = readdir(d)) != NULL) { + memset(path, '\0', PATH_MAX); + sprintf(path, "%s%s", operator_root, file->d_name); + if(stat(path, &s) == 0) { + /* Check if file */ + if(S_ISREG(s.st_mode)) { + if(strstr(file->d_name, ".lua") != NULL) { + plua_module_load(path, OPERATOR); + } + } + } + } + } + closedir(d); + FREE(f); +} + +static int plua_operator_precedence_run(struct lua_State *L, char *file, int *ret) { +#if LUA_VERSION_NUM <= 502 + lua_getfield(L, -1, "precedence"); + if(strcmp(lua_typename(L, lua_type(L, -1)), "function") != 0) { +#else + if(lua_getfield(L, -1, "precedence") == 0) { +#endif + logprintf(LOG_ERR, "%s: precedence function missing", file); + return 0; + } + + if(lua_pcall(L, 0, 1, 0) == LUA_ERRRUN) { + if(strcmp(lua_typename(L, lua_type(L, -1)), "nil") == 0) { + logprintf(LOG_ERR, "%s: syntax error", file); + return 0; + } + if(strcmp(lua_typename(L, lua_type(L, -1)), "string") == 0) { + logprintf(LOG_ERR, "%s", lua_tostring(L, -1)); + lua_pop(L, 1); + return 0; + } + } + + if(lua_isnumber(L, -1) == 0) { + logprintf(LOG_ERR, "%s: the precedence function returned %s, number expected", file, lua_typename(L, lua_type(L, -1))); + return 0; + } + + *ret = lua_tonumber(L, -1); + + lua_pop(L, 1); + + return 1; +} + +static int plua_operator_associativity_run(struct lua_State *L, char *file, int *ret) { +#if LUA_VERSION_NUM <= 502 + lua_getfield(L, -1, "associativity"); + if(strcmp(lua_typename(L, lua_type(L, -1)), "function") != 0) { +#else + if(lua_getfield(L, -1, "associativity") == 0) { +#endif + logprintf(LOG_ERR, "%s: associativity function missing", file); + return 0; + } + + if(lua_pcall(L, 0, 1, 0) == LUA_ERRRUN) { + if(strcmp(lua_typename(L, lua_type(L, -1)), "nil") == 0) { + logprintf(LOG_ERR, "%s: syntax error", file); + return 0; + } + if(strcmp(lua_typename(L, lua_type(L, -1)), "string") == 0) { + logprintf(LOG_ERR, "%s", lua_tostring(L, -1)); + lua_pop(L, 1); + return 0; + } + } + + if(lua_isnumber(L, -1) == 0) { + logprintf(LOG_ERR, "%s: the associativity function returned %s, number expected", file, lua_typename(L, lua_type(L, -1))); + return 0; + } + + *ret = lua_tonumber(L, -1); + + lua_pop(L, 1); + + return 1; +} + +static int plua_operator_module_run(struct lua_State *L, char *file, struct varcont_t *a, struct varcont_t *b, struct varcont_t *v) { +#if LUA_VERSION_NUM <= 502 + lua_getfield(L, -1, "run"); + if(strcmp(lua_typename(L, lua_type(L, -1)), "function") != 0) { +#else + if(lua_getfield(L, -1, "run") == 0) { +#endif + logprintf(LOG_ERR, "%s: run function missing", file); + return 0; + } + + switch(a->type_) { + case JSON_NUMBER: { + lua_pushnumber(L, a->number_); + } break; + case JSON_STRING: + lua_pushstring(L, a->string_); + break; + case JSON_BOOL: + lua_pushboolean(L, a->bool_); + break; + } + switch(b->type_) { + case JSON_NUMBER: { + lua_pushnumber(L, b->number_); + } break; + case JSON_STRING: + lua_pushstring(L, b->string_); + break; + case JSON_BOOL: + lua_pushboolean(L, b->bool_); + break; + } + + if(lua_pcall(L, 2, 1, 0) == LUA_ERRRUN) { + if(strcmp(lua_typename(L, lua_type(L, -1)), "nil") == 0) { + logprintf(LOG_ERR, "%s: syntax error", file); + return 0; + } + if(strcmp(lua_typename(L, lua_type(L, -1)), "string") == 0) { + logprintf(LOG_ERR, "%s", lua_tostring(L, -1)); + lua_pop(L, 1); + return 0; + } + } + + if(lua_isstring(L, -1) == 0 && + lua_isnumber(L, -1) == 0 && + lua_isboolean(L, -1) == 0) { + logprintf(LOG_ERR, "%s: the run function returned %s, string, number or boolean expected", file, lua_typename(L, lua_type(L, -1))); + return 0; + } + + if(lua_isnumber(L, -1) == 1) { + char *p = (char *)lua_tostring(L, -1); + v->number_ = atof(p); + v->decimals_ = nrDecimals(p); + v->type_ = JSON_NUMBER; + } else if(lua_isstring(L, -1) == 1) { + int l = strlen(lua_tostring(L, -1)); + if((v->string_ = REALLOC(v->string_, l+1)) == NULL) { + OUT_OF_MEMORY + } + strcpy(v->string_, lua_tostring(L, -1)); + v->type_ = JSON_STRING; + v->free_ = 1; + } else if(lua_isboolean(L, -1) == 1) { + v->bool_ = (int)lua_toboolean(L, -1); + v->type_ = JSON_BOOL; + } + + lua_pop(L, 1); + + return 1; +} + +int event_operator_exists(char *module) { + return plua_module_exists(module, OPERATOR); +} + +int event_operator_precedence(char *module, int *ret) { + struct lua_state_t *state = plua_get_free_state(); + struct lua_State *L = NULL; + + if(state == NULL) { + return -1; + } + + if((L = state->L) == NULL) { + uv_mutex_unlock(&state->lock); + return -1; + } + + char name[255], *p = name; + memset(name, '\0', 255); + + sprintf(p, "operator.%s", module); + + lua_getglobal(L, name); + if(lua_isnil(L, -1) != 0) { + uv_mutex_unlock(&state->lock); + return -1; + } + if(lua_istable(L, -1) != 0) { + char *file = NULL; + struct plua_module_t *tmp = plua_get_modules(); + while(tmp) { + if(strcmp(module, tmp->name) == 0) { + file = tmp->file; + state->module = tmp; + break; + } + tmp = tmp->next; + } + if(plua_operator_precedence_run(L, file, ret) == 0) { + lua_pop(L, -1); + uv_mutex_unlock(&state->lock); + return -1; + } + } + lua_pop(L, -1); + + uv_mutex_unlock(&state->lock); + + return 0; +} + +int event_operator_associativity(char *module, int *ret) { + struct lua_state_t *state = plua_get_free_state(); + struct lua_State *L = NULL; + + if(state == NULL) { + return -1; + } + + if((L = state->L) == NULL) { + uv_mutex_unlock(&state->lock); + return -1; + } + + char name[255], *p = name; + memset(name, '\0', 255); + + sprintf(p, "operator.%s", module); + + lua_getglobal(L, name); + if(lua_isnil(L, -1) != 0) { + uv_mutex_unlock(&state->lock); + return -1; + } + if(lua_istable(L, -1) != 0) { + char *file = NULL; + struct plua_module_t *tmp = plua_get_modules(); + while(tmp) { + if(strcmp(module, tmp->name) == 0) { + file = tmp->file; + state->module = tmp; + break; + } + tmp = tmp->next; + } + if(plua_operator_associativity_run(L, file, ret) == 0) { + lua_pop(L, -1); + uv_mutex_unlock(&state->lock); + return -1; + } + } + lua_pop(L, -1); + + uv_mutex_unlock(&state->lock); + + return 0; +} + +int event_operator_callback(char *module, struct varcont_t *a, struct varcont_t *b, struct varcont_t *v) { + struct lua_state_t *state = plua_get_free_state(); + struct lua_State *L = NULL; + + if(state == NULL) { + return -1; + } + + if((L = state->L) == NULL) { + uv_mutex_unlock(&state->lock); + return -1; + } + + char name[255], *p = name; + memset(name, '\0', 255); + + sprintf(p, "operator.%s", module); + + lua_getglobal(L, name); + if(lua_isnil(L, -1) != 0) { + uv_mutex_unlock(&state->lock); + return -1; + } + if(lua_istable(L, -1) != 0) { + char *file = NULL; + struct plua_module_t *tmp = plua_get_modules(); + while(tmp) { + if(strcmp(module, tmp->name) == 0) { + file = tmp->file; + state->module = tmp; + break; + } + tmp = tmp->next; + } + if(plua_operator_module_run(L, file, a, b, v) == 0) { + lua_pop(L, -1); + uv_mutex_unlock(&state->lock); + return -1; + } + } + lua_pop(L, -1); + + uv_mutex_unlock(&state->lock); + + return 0; +} + +int event_operator_gc(void) { + init = 0; + logprintf(LOG_DEBUG, "garbage collected event operator library"); + return 0; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operator.h b/lib/ESPiLight/pilight/libs/pilight/events/operator.h new file mode 100644 index 0000000..20b2f5f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operator.h @@ -0,0 +1,23 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _EVENT_OPERATOR_H_ +#define _EVENT_OPERATOR_H_ + +#include "../core/common.h" + +#include "events.h" /* rewrite */ + +void event_operator_init(void); +int event_operator_callback(char *, struct varcont_t *, struct varcont_t *, struct varcont_t *v); +int event_operator_associativity(char *, int *); +int event_operator_precedence(char *, int *); +int event_operator_exists(char *); +int event_operator_gc(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/events/operators/CMakeLists.txt new file mode 100644 index 0000000..9061200 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/CMakeLists.txt @@ -0,0 +1,6 @@ +file(GLOB operators "${PROJECT_SOURCE_DIR}/operators/*.lua") +if(WIN32) + install(FILES ${operators} DESTINATION operators/ COMPONENT pilight) +else() + install(FILES ${operators} DESTINATION lib/pilight/operators/ COMPONENT pilight) +endif() \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/and.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/and.lua new file mode 100644 index 0000000..b9f8b2d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/and.lua @@ -0,0 +1,34 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + if pilight.toboolean(a) == true and pilight.toboolean(b) == true then + return true; + else + return false; + end +end + +function M.associativity() + return 20; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = "AND", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/concat.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/concat.lua new file mode 100644 index 0000000..b9b9211 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/concat.lua @@ -0,0 +1,30 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + return a .. b; +end + +function M.associativity() + return 40; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = ".", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/divide.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/divide.lua new file mode 100644 index 0000000..27a9754 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/divide.lua @@ -0,0 +1,34 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + if pilight.tonumber(a) == 0 or pilight.tonumber(b) == 0 then + return 0; + else + return (pilight.tonumber(a) / pilight.tonumber(b)); + end +end + +function M.associativity() + return 70; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = "/", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/eq.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/eq.lua new file mode 100644 index 0000000..571370a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/eq.lua @@ -0,0 +1,34 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + if a == b then + return true; + else + return false; + end +end + +function M.associativity() + return 30; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = "==", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/ge.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/ge.lua new file mode 100644 index 0000000..a414062 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/ge.lua @@ -0,0 +1,42 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + if tonumber(a) == nil or tonumber(b) == nil then + if a >= b then + return true; + else + return false; + end + else + if pilight.tonumber(a) >= pilight.tonumber(b) then + return true; + else + return false; + end + end +end + +function M.associativity() + return 30; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = ">=", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/gt.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/gt.lua new file mode 100644 index 0000000..cd9fcea --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/gt.lua @@ -0,0 +1,42 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + if tonumber(a) == nil or tonumber(b) == nil then + if a > b then + return true; + else + return false; + end + else + if pilight.tonumber(a) > pilight.tonumber(b) then + return true; + else + return false; + end + end +end + +function M.associativity() + return 30; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = ">", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/intdivide.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/intdivide.lua new file mode 100644 index 0000000..50c7ad8 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/intdivide.lua @@ -0,0 +1,40 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + if pilight.tonumber(a) == 0 or pilight.tonumber(b) == 0 then + return 0; + else + aa = pilight.tonumber(a); + bb = pilight.tonumber(b); + if aa < 0 then + return -math.floor(-aa / bb); + else + return math.floor(aa / bb); + end + end +end + +function M.associativity() + return 70; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = "\\", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/le.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/le.lua new file mode 100644 index 0000000..36d565c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/le.lua @@ -0,0 +1,42 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + if tonumber(a) == nil or tonumber(b) == nil then + if a <= b then + return true; + else + return false; + end + else + if pilight.tonumber(a) <= pilight.tonumber(b) then + return true; + else + return false; + end + end +end + +function M.associativity() + return 30; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = "<=", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/lt.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/lt.lua new file mode 100644 index 0000000..cb384ba --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/lt.lua @@ -0,0 +1,42 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + if tonumber(a) == nil or tonumber(b) == nil then + if a < b then + return true; + else + return false; + end + else + if pilight.tonumber(a) < pilight.tonumber(b) then + return true; + else + return false; + end + end +end + +function M.associativity() + return 30; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = "<", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/minus.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/minus.lua new file mode 100644 index 0000000..a73c869 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/minus.lua @@ -0,0 +1,30 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + return pilight.tonumber(a) - pilight.tonumber(b); +end + +function M.associativity() + return 60; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = "-", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/modulus.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/modulus.lua new file mode 100644 index 0000000..d89bcea --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/modulus.lua @@ -0,0 +1,37 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + if pilight.tonumber(a) == 0 or pilight.tonumber(b) == 0 then + return 0; + else + aa = pilight.tonumber(a); + bb = pilight.tonumber(b); + + return (aa - bb * math.floor(aa / bb)); + end +end + +function M.associativity() + return 70; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = "%", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/multiply.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/multiply.lua new file mode 100644 index 0000000..4f1f2cc --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/multiply.lua @@ -0,0 +1,30 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + return pilight.tonumber(a) * pilight.tonumber(b); +end + +function M.associativity() + return 70; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = "*", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/ne.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/ne.lua new file mode 100644 index 0000000..da14d51 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/ne.lua @@ -0,0 +1,34 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + if a ~= b then + return true; + else + return false; + end +end + +function M.associativity() + return 30; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = "!=", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/or.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/or.lua new file mode 100644 index 0000000..ca3a458 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/or.lua @@ -0,0 +1,34 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + if pilight.toboolean(a) == true or pilight.toboolean(b) == true then + return true; + else + return false; + end +end + +function M.associativity() + return 10; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = "OR", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/events/operators/plus.lua b/lib/ESPiLight/pilight/libs/pilight/events/operators/plus.lua new file mode 100644 index 0000000..4946353 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/events/operators/plus.lua @@ -0,0 +1,30 @@ +-- Copyright (C) 2013 - 2016 CurlyMo + +-- This Source Code Form is subject to the terms of the Mozilla Public +-- License, v. 2.0. If a copy of the MPL was not distributed with this +-- file, You can obtain one at http://mozilla.org/MPL/2.0/. + +local M = {} + +function M.run(a, b) + return pilight.tonumber(a) + pilight.tonumber(b); +end + +function M.associativity() + return 60; +end + +function M.precedence() + return 1; +end + +function M.info() + return { + name = "+", + version = "1.0", + reqversion = "5.0", + reqcommit = "87" + } +end + +return M; \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/433gpio.c b/lib/ESPiLight/pilight/libs/pilight/hardware/433gpio.c new file mode 100644 index 0000000..f2780c1 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/433gpio.c @@ -0,0 +1,270 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include +#include +#include +#include + +#include "../../libuv/uv.h" +#include "../core/pilight.h" +#include "../core/common.h" +#include "../core/dso.h" +#include "../core/log.h" +#include "../core/json.h" +#include "../core/eventpool.h" +#ifdef PILIGHT_REWRITE +#include "hardware.h" +#else +#include "../config/hardware.h" +#include "../config/settings.h" +#endif +#include "433gpio.h" + +static int gpio_433_in = -1; +static int gpio_433_out = -1; +static int pollpri = UV_PRIORITIZED; + +#if defined(__arm__) || defined(__mips__) || defined(PILIGHT_UNITTEST) +typedef struct timestamp_t { + unsigned long first; + unsigned long second; +} timestamp_t; + +typedef struct data_t { + int rbuffer[1024]; + int rptr; +} data_t; + +static struct data_t data; +static struct timestamp_t timestamp; + +static void *reason_received_pulsetrain_free(void *param) { + struct reason_received_pulsetrain_t *data = param; + FREE(data); + return NULL; +} + +static void *reason_send_code_success_free(void *param) { + struct reason_send_code_success_free *data = param; + FREE(data); + return NULL; +} + +static void poll_cb(uv_poll_t *req, int status, int events) { + int duration = 0; + int fd = req->io_watcher.fd; + + if(events & pollpri) { + uint8_t c = 0; + + (void)read(fd, &c, 1); + lseek(fd, 0, SEEK_SET); + + struct timeval tv; + gettimeofday(&tv, NULL); + timestamp.first = timestamp.second; + timestamp.second = 1000000 * (unsigned int)tv.tv_sec + (unsigned int)tv.tv_usec; + + duration = (int)((int)timestamp.second-(int)timestamp.first); + + if(duration > 0) { + data.rbuffer[data.rptr++] = duration; + if(data.rptr > MAXPULSESTREAMLENGTH-1) { + data.rptr = 0; + } + if(duration > gpio433->mingaplen) { + /* Let's do a little filtering here as well */ + if(data.rptr >= gpio433->minrawlen && data.rptr <= gpio433->maxrawlen) { + struct reason_received_pulsetrain_t *data1 = MALLOC(sizeof(struct reason_received_pulsetrain_t)); + if(data1 == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + data1->length = data.rptr; + memcpy(data1->pulses, data.rbuffer, data.rptr*sizeof(int)); + data1->hardware = gpio433->id; + + eventpool_trigger(REASON_RECEIVED_PULSETRAIN, reason_received_pulsetrain_free, data1); + } + data.rptr = 0; + } + } + }; + if(events & UV_DISCONNECT) { + FREE(req); /*LCOV_EXCL_LINE*/ + } + return; +} + +static void *gpio433Send(int reason, void *param) { + struct reason_send_code_t *data1 = param; + int *code = data1->pulses; + int rawlen = data1->rawlen; + int repeats = data1->txrpt; + + int r = 0, x = 0; + if(gpio_433_out >= 0) { + for(r=0;rmessage, data1->message); + strcpy(data2->uuid, data1->uuid); + eventpool_trigger(REASON_CODE_SEND_SUCCESS, reason_send_code_success_free, data2); + return NULL; +} +#endif + +static unsigned short int gpio433HwInit(void) { +#if defined(__arm__) || defined(__mips__) || defined(PILIGHT_UNITTEST) + + /* Make sure the pilight sender gets + the highest priority available */ +#ifdef _WIN32 + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); +#else + struct sched_param sched; + memset(&sched, 0, sizeof(sched)); + sched.sched_priority = 80; + pthread_setschedparam(pthread_self(), SCHED_FIFO, &sched); +#endif + + uv_poll_t *poll_req = NULL; + char *platform = GPIO_PLATFORM; + +#ifdef PILIGHT_REWRITE + if(settings_select_string(ORIGIN_MASTER, "gpio-platform", &platform) != 0 || strcmp(platform, "none") == 0) { + logprintf(LOG_ERR, "no gpio-platform configured"); + return EXIT_FAILURE; + } + if(wiringXSetup(platform, _logprintf) < 0) { + return EXIT_FAILURE; + } +#else + if(settings_find_string("gpio-platform", &platform) != 0 || strcmp(platform, "none") == 0) { + logprintf(LOG_ERR, "no gpio-platform configured"); + return EXIT_FAILURE; + } + if(wiringXSetup(platform, logprintf1) < 0) { + return EXIT_FAILURE; + } +#endif + if(gpio_433_out >= 0) { + if(wiringXValidGPIO(gpio_433_out) != 0) { + logprintf(LOG_ERR, "invalid sender pin: %d", gpio_433_out); + return EXIT_FAILURE; + } + pinMode(gpio_433_out, PINMODE_OUTPUT); + } + if(gpio_433_in >= 0) { + if(wiringXValidGPIO(gpio_433_in) != 0) { + logprintf(LOG_ERR, "invalid receiver pin: %d", gpio_433_in); + return EXIT_FAILURE; + } + if(wiringXISR(gpio_433_in, ISR_MODE_BOTH) < 0) { + logprintf(LOG_ERR, "unable to register interrupt for pin %d", gpio_433_in); + return EXIT_FAILURE; + } + } + if(gpio_433_in >= 0) { + if((poll_req = MALLOC(sizeof(uv_poll_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + int fd = wiringXSelectableFd(gpio_433_in); + memset(data.rbuffer, '\0', sizeof(data.rbuffer)); + data.rptr = 0; + + uv_poll_init(uv_default_loop(), poll_req, fd); + +#ifdef PILIGHT_UNITTEST + char *dev = getenv("PILIGHT_433GPIO_READ"); + if(dev == NULL) { + pollpri = UV_PRIORITIZED; /*LCOV_EXCL_LINE*/ + } else { + pollpri = UV_READABLE; + } +#endif + uv_poll_start(poll_req, pollpri, poll_cb); + } + + eventpool_callback(REASON_SEND_CODE, gpio433Send); + + return EXIT_SUCCESS; +#else + logprintf(LOG_ERR, "the 433gpio module is not supported on this hardware", gpio_433_in); + return EXIT_FAILURE; +#endif +} + +static unsigned short gpio433Settings(struct JsonNode *json) { + if(strcmp(json->key, "receiver") == 0) { + if(json->tag == JSON_NUMBER) { + gpio_433_in = (int)json->number_; + } else { + return EXIT_FAILURE; + } + } + if(strcmp(json->key, "sender") == 0) { + if(json->tag == JSON_NUMBER) { + gpio_433_out = (int)json->number_; + } else { + return EXIT_FAILURE; + } + } + if(gpio_433_out > -1 && gpio_433_in > -1 && gpio_433_in == gpio_433_out) { + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void gpio433Init(void) { + hardware_register(&gpio433); + hardware_set_id(gpio433, "433gpio"); + + options_add(&gpio433->options, 'r', "receiver", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9-]+$"); + options_add(&gpio433->options, 's', "sender", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9-]+$"); + + gpio433->minrawlen = 1000; + gpio433->maxrawlen = 0; + gpio433->mingaplen = 5100; + gpio433->maxgaplen = 10000; + + gpio433->hwtype=RF433; + gpio433->comtype=COMOOK; + gpio433->init=&gpio433HwInit; + gpio433->settings=&gpio433Settings; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "433gpio"; + module->version = "2.0"; + module->reqversion = "8.0"; + module->reqcommit = NULL; +} + +void init(void) { + gpio433Init(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/433gpio.h b/lib/ESPiLight/pilight/libs/pilight/hardware/433gpio.h new file mode 100644 index 0000000..fb97816 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/433gpio.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _HARDWARE_GPIO_433_H_ +#define _HARDWARE_GPIO_433_H_ + +#include "../config/hardware.h" + +struct hardware_t *gpio433; +void gpio433Init(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/433lirc.c b/lib/ESPiLight/pilight/libs/pilight/hardware/433lirc.c new file mode 100644 index 0000000..bb5661d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/433lirc.c @@ -0,0 +1,228 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../core/pilight.h" +#include "../core/common.h" +#include "../core/dso.h" +#include "../core/log.h" +#include "../core/json.h" +#include "../core/gc.h" +#include "../config/hardware.h" +#include "433lirc.h" + +#define FREQ433 433920 +#define FREQ38 38000 + +static int lirc_433_initialized = 0; +static int lirc_433_setfreq = 0; +static int lirc_433_fd = 0; +static char *lirc_433_socket = NULL; + +static unsigned short lirc433HwInit(void) { + unsigned int freq = 0; + int fd = 0, i = 0, count = 0; + int c = 0; + + if(strcmp(lirc_433_socket, "/var/lirc/lircd") == 0) { + logprintf(LOG_ERR, "refusing to connect to lircd socket"); + return EXIT_FAILURE; + } + + if(lirc_433_initialized == 0) { + if((lirc_433_fd = open(lirc_433_socket, O_RDWR)) < 0) { + logprintf(LOG_ERR, "could not open %s", lirc_433_socket); + return EXIT_FAILURE; + } else { + /* Only set the frequency once */ + if(lirc_433_setfreq == 0) { + freq = FREQ433; + /* Set the lirc_rpi frequency to 433.92Mhz */ + if(ioctl(lirc_433_fd, _IOW('i', 0x00000013, unsigned long), &freq) == -1) { + logprintf(LOG_ERR, "could not set lirc_rpi send frequency"); + exit(EXIT_FAILURE); + } + fd = open(lirc_433_socket, O_RDWR); + ioctl(fd, FIONREAD, &count); + for(i=0; i 0) { + /* Restore the lirc_rpi frequency to its default value */ + if(ioctl(lirc_433_fd, _IOW('i', 0x00000013, unsigned long), &freq) == -1) { + logprintf(LOG_ERR, "could not restore default freq of the lirc_rpi lirc"); + exit(EXIT_FAILURE); + } else { + logprintf(LOG_DEBUG, "default freq of the lirc_rpi lirc set"); + } + + close(lirc_433_fd); + lirc_433_fd = 0; + } + + logprintf(LOG_DEBUG, "deinitialized lirc_rpi lirc"); + lirc_433_initialized = 0; + } + + return EXIT_SUCCESS; +} + +static int lirc433Send(int *code, int rawlen, int repeats) { + /* Create a single code with all repeats included */ + int code_len = (rawlen*repeats)+1; + size_t send_len = (size_t)(code_len * (int)sizeof(int)); + int longCode[code_len], i = 0, x = 0; + size_t y = 0; + ssize_t n = 0; + memset(longCode, 0, send_len); + + for(i=0;i 0) { + (void)read(lirc_433_fd, &data, sizeof(data)); + lseek(lirc_433_fd, 0, SEEK_SET); + return (data & 0x00FFFFFF); + } else { + return -1; + } +} + +static unsigned short lirc433Settings(JsonNode *json) { + if(strcmp(json->key, "socket") == 0) { + if(json->tag == JSON_STRING) { + if((lirc_433_socket = MALLOC(strlen(json->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(lirc_433_socket, json->string_); + } else { + return EXIT_FAILURE; + } + } + return EXIT_SUCCESS; +} + + +static int lirc433gc(void) { + if(lirc_433_socket != NULL) { + FREE(lirc_433_socket); + } + + return 1; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void lirc433Init(void) { + + hardware_register(&lirc433); + hardware_set_id(lirc433, "433lirc"); + + options_add(&lirc433->options, 's', "socket", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, "^/dev/([a-z]+)[0-9]+$"); + + lirc433->minrawlen = 1000; + lirc433->maxrawlen = 0; + lirc433->mingaplen = 5100; + lirc433->maxgaplen = 10000; + + lirc433->hwtype=RF433; + lirc433->comtype=COMOOK; + lirc433->init=&lirc433HwInit; + lirc433->deinit=&lirc433HwDeinit; + lirc433->sendOOK=&lirc433Send; + lirc433->receiveOOK=&lirc433Receive; + lirc433->settings=&lirc433Settings; + lirc433->gc=&lirc433gc; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "433lirc"; + module->version = "1.4"; + module->reqversion = "7.0"; + module->reqcommit = "10"; +} + +void init(void) { + lirc433Init(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/433lirc.h b/lib/ESPiLight/pilight/libs/pilight/hardware/433lirc.h new file mode 100644 index 0000000..935a5b4 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/433lirc.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _HARDWARE_LIRC_433_H_ +#define _HARDWARE_LIRC_433_H_ + +#include "../config/hardware.h" + +struct hardware_t *lirc433; +void lirc433Init(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/433nano.c b/lib/ESPiLight/pilight/libs/pilight/hardware/433nano.c new file mode 100644 index 0000000..00fcf02 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/433nano.c @@ -0,0 +1,475 @@ +/* + Copyright (C) 2013 - 2015 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 + #define STRICT + #define WIN32_LEAN_AND_MEAN + #include +#else + #include +#endif + +#include "../core/pilight.h" +#include "../core/json.h" +#include "../core/log.h" +#include "../core/dso.h" +#include "../core/firmware.h" +#include "../config/registry.h" +#include "../config/hardware.h" +#include "433nano.h" + +typedef struct timestamp_t { + unsigned long first; + unsigned long second; +} timestamp_t; + +timestamp_t timestamp; + +/* What is the minimum rawlenth to consider a pulse stream valid */ +static int minrawlen = 1000; +/* What is the maximum rawlenth to consider a pulse stream valid */ +static int maxrawlen = 0; +/* What is the minimum rawlenth to consider a pulse stream valid */ +static int maxgaplen = 5100; +/* What is the maximum rawlenth to consider a pulse stream valid */ +static int mingaplen = 10000; + +#ifdef _WIN32 +static HANDLE serial_433_fd; +#else +static int serial_433_fd = 0; +static int nano_433_initialized = 0; +#endif + +static char com[255]; +static unsigned short loop = 1; +static unsigned short running = 0; +static unsigned short threads = 0; +static unsigned short sendSync = 0; +static pthread_t pth; + +void *syncFW(void *param) { + + threads++; + +#ifdef _WIN32 + DWORD n; +#else + int n; +#endif + char send[MAXPULSESTREAMLENGTH+1]; + int len = 0; + + memset(&send, '\0', sizeof(send)); + + struct protocols_t *tmp = protocols; + while(tmp) { + if(tmp->listener->hwtype == RF433) { + if(tmp->listener->maxrawlen > maxrawlen) { + maxrawlen = tmp->listener->maxrawlen; + } + if(tmp->listener->minrawlen > 0 && tmp->listener->minrawlen < minrawlen) { + minrawlen = tmp->listener->minrawlen; + } + if(tmp->listener->maxgaplen > maxgaplen) { + maxgaplen = tmp->listener->maxgaplen; + } + if(tmp->listener->mingaplen > 0 && tmp->listener->mingaplen < mingaplen) { + mingaplen = tmp->listener->mingaplen; + } + } + tmp = tmp->next; + } + + /* Let's wait for Nano to accept instructions */ + while(sendSync == 0 && loop == 1) { + usleep(10); + } + + len = sprintf(send, "s:%d,%d,%d,%d@", minrawlen, maxrawlen, mingaplen, maxgaplen); + +#ifdef _WIN32 + WriteFile(serial_433_fd, &send, len, &n, NULL); +#else + n = write(serial_433_fd, send, len); +#endif + + if(n != len) { + logprintf(LOG_NOTICE, "could not sync FW values"); + } + + threads--; + + return NULL; +} + +#ifndef _WIN32 +/* http://stackoverflow.com/a/6947758 */ +static int serial_interface_attribs(int fd, speed_t speed, tcflag_t parity) { + struct termios tty; + + memset(&tty, 0, sizeof tty); + if(tcgetattr(fd, &tty) != 0) { + logprintf(LOG_ERR, "error %d from tcgetattr", errno); + return -1; + } + + cfsetospeed(&tty, speed); + cfsetispeed(&tty, speed); + + tty.c_cflag = (tty.c_cflag & (unsigned int)~CSIZE) | CS8; // 8-bit chars + tty.c_iflag &= (unsigned int)~IGNBRK; + tty.c_lflag = 0; + tty.c_oflag = 0; + tty.c_cc[VMIN] = 0; + tty.c_cc[VTIME] = 5; + tty.c_iflag &= ~((unsigned int)IXON | (unsigned int)IXOFF | (unsigned int)IXANY); + tty.c_cflag |= ((unsigned int)CLOCAL | (unsigned int)CREAD); + tty.c_cflag &= ~((unsigned int)PARENB | (unsigned int)PARODD); + tty.c_cflag |= parity; + tty.c_cflag &= (unsigned int)~CSTOPB; + tty.c_cflag &= (unsigned int)~CRTSCTS; + + if(tcsetattr(fd, TCSANOW, &tty) != 0) { + logprintf(LOG_ERR, "error %d from tcsetattr", errno); + return -1; + } + return 0; +} +#endif + +static unsigned short int nano433HwInit(void) { +#ifdef _WIN32 + COMMTIMEOUTS timeouts; + DCB port; + char tmp[255]; + memset(tmp, '\0', 255); + + snprintf(tmp, 255, "\\\\.\\%s", com); + + if((int)(serial_433_fd = CreateFile(tmp, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)) < 0) { + logprintf(LOG_NOTICE, "cannot open port %s", com); + return EXIT_FAILURE; + } + logprintf(LOG_INFO, "connected to port %s", com); + + memset(&port, '\0', sizeof(port)); + + port.DCBlength = sizeof(port); + if(GetCommState(serial_433_fd, &port) == FALSE) { + logprintf(LOG_ERR, "cannot get comm state for port %s", com); + return EXIT_FAILURE; + } + + if(BuildCommDCB("baud=57600 parity=n data=8 stop=1", &port) == FALSE) { + logprintf(LOG_ERR, "cannot build comm DCB for port %s", com); + return EXIT_FAILURE; + } + + if(SetCommState(serial_433_fd, &port) == FALSE) { + logprintf(LOG_ERR, "cannot set port settings for port %s", com); + return EXIT_FAILURE; + } + + timeouts.ReadIntervalTimeout = 1000; + timeouts.ReadTotalTimeoutMultiplier = 1000; + timeouts.ReadTotalTimeoutConstant = 1000; + timeouts.WriteTotalTimeoutMultiplier = 1000; + timeouts.WriteTotalTimeoutConstant = 1000; + + if(SetCommTimeouts(serial_433_fd, &timeouts) == FALSE) { + logprintf(LOG_ERR, "error setting port %s time-outs.", com); + return EXIT_FAILURE; + } +#else + if((serial_433_fd = open(com, O_RDWR | O_SYNC)) >= 0) { + serial_interface_attribs(serial_433_fd, B57600, 0); + nano_433_initialized = 1; + } else { + logprintf(LOG_NOTICE, "could not open port %s", com); + return EXIT_FAILURE; + } +#endif + + pthread_create(&pth, NULL, &syncFW, (void *)NULL); + pthread_detach(pth); + + return EXIT_SUCCESS; +} + +static unsigned short nano433HwDeinit(void) { + loop = 0; + while(running > 0 && threads > 0) { + usleep(10); + } +#ifdef _WIN32 + CloseHandle(serial_433_fd); +#else + if(nano_433_initialized == 1) { + close(serial_433_fd); + nano_433_initialized = 0; + } +#endif + return EXIT_SUCCESS; +} + +static int nano433Send(int *code, int rawlen, int repeats) { + unsigned int i = 0, x = 0, y = 0, len = 0, nrpulses = 0; + int pulses[10], match = 0; + char c[16], send[MAXPULSESTREAMLENGTH+1]; +#ifdef _WIN32 + DWORD n; +#else + int n = 0; +#endif + + memset(send, 0, MAXPULSESTREAMLENGTH); + strncpy(&send[0], "c:", 2); + len += 2; + + for(i=0;ilength = 0; + memset(r->pulses, 0, MAXPULSESTREAMLENGTH); + + running = 1; + + while(loop) { +#ifdef _WIN32 + if(WriteFile(serial_433_fd, "ping", 0, &n, NULL) == 0) { + logprintf(LOG_INFO, "lost connection to %s", com); + CloseHandle(serial_433_fd); + r->length = -1; + return -1; + } + ReadFile(serial_433_fd, c, 1, &n, NULL); +#else + n = read(serial_433_fd, c, 1); +#endif + if(n > 0) { + if(c[0] == '\n') { + sendSync = 1; + break; + } else { + if(c[0] == 'v') { + startv = 1; + start = 1; + bytes = 0; + } + if(c[0] == 'c') { + start = 1; + bytes = 0; + } + if(c[0] == 'p') { + startp = bytes+2; + buffer[bytes-1] = '\0'; + } + if(c[0] == '@') { + buffer[bytes] = '\0'; + if(startv == 1) { + start = 0; + startv = 0; + char **array = NULL; + int c = explode(&buffer[2], ",", &array); + if(c == 7) { + if(!(minrawlen == atoi(array[0]) && maxrawlen == atoi(array[1]) && + mingaplen == atoi(array[2]) && maxgaplen == atoi(array[3]))) { + logprintf(LOG_WARNING, "could not sync FW values"); + } + firmware.version = atof(array[4]); + firmware.lpf = atof(array[5]); + firmware.hpf = atof(array[6]); + + if(firmware.version > 0 && firmware.lpf > 0 && firmware.hpf > 0) { + registry_set_number("pilight.firmware.version", firmware.version, 0); + registry_set_number("pilight.firmware.lpf", firmware.lpf, 0); + registry_set_number("pilight.firmware.hpf", firmware.hpf, 0); + + struct JsonNode *jmessage = json_mkobject(); + struct JsonNode *jcode = json_mkobject(); + json_append_member(jcode, "version", json_mknumber(firmware.version, 0)); + json_append_member(jcode, "lpf", json_mknumber(firmware.lpf, 0)); + json_append_member(jcode, "hpf", json_mknumber(firmware.hpf, 0)); + json_append_member(jmessage, "values", jcode); + json_append_member(jmessage, "origin", json_mkstring("core")); + json_append_member(jmessage, "type", json_mknumber(FIRMWARE, 0)); + char pname[17]; + strcpy(pname, "pilight-firmware"); + if(pilight.broadcast != NULL) { + pilight.broadcast(pname, jmessage, FW); + } + json_delete(jmessage); + jmessage = NULL; + } + } + array_free(&array, c); + } else { + x = strlen(&buffer[startp]); + s = startp; + nrpulses = 0; + for(y = startp; y < startp + (int)x; y++) { + if(buffer[y] == ',') { + buffer[y] = '\0'; + pulses[nrpulses++] = atoi(&buffer[s]); + s = y+1; + } + } + pulses[nrpulses++] = atoi(&buffer[s]); + x = strlen(&buffer[2]); + for(y = 2; y < 2 + x; y++) { + r->pulses[r->length++] = pulses[0]; + r->pulses[r->length++] = pulses[buffer[y] - '0']; + } + bytes = 0; + return 0; + } + } + if(start == 1) { + buffer[bytes++] = c[0]; + } + } + } + } + + running = 0; + + return -1; +} + +static unsigned short nano433Settings(JsonNode *json) { + if(strcmp(json->key, "comport") == 0) { + if(json->tag == JSON_STRING) { + strcpy(com, json->string_); + return EXIT_SUCCESS; + } + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void nano433Init(void) { + hardware_register(&nano433); + hardware_set_id(nano433, "433nano"); + + options_add(&nano433->options, 'p', "comport", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + + nano433->hwtype=RF433; + nano433->comtype=COMPLSTRAIN; + nano433->init=&nano433HwInit; + nano433->deinit=&nano433HwDeinit; + nano433->sendOOK=&nano433Send; + nano433->receivePulseTrain=&nano433Receive; + nano433->settings=&nano433Settings; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "433nano"; + module->version = "1.2"; + module->reqversion = "7.0"; + module->reqcommit = "10"; +} + +void init(void) { + nano433Init(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/433nano.h b/lib/ESPiLight/pilight/libs/pilight/hardware/433nano.h new file mode 100644 index 0000000..5c3e185 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/433nano.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _HARDWARE_NANO_433_H_ +#define _HARDWARE_NANO_433_H_ + +#include "../config/hardware.h" + +struct hardware_t *nano433; +void nano433Init(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/CMakeExclude.txt b/lib/ESPiLight/pilight/libs/pilight/hardware/CMakeExclude.txt new file mode 100644 index 0000000..b9adc6f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/CMakeExclude.txt @@ -0,0 +1,16 @@ +include(../../../CMakeConfig.txt) + +if(${HARDWARE_433_GPIO} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/433gpio.h") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/433gpio.c") +endif() + +if(${HARDWARE_433_LIRC} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/433module.h") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/433module.c") +endif() + +if(${HARDWARE_433_NANO} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/433nano.h") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/433nano.c") +endif() \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/CMakeInclude.txt b/lib/ESPiLight/pilight/libs/pilight/hardware/CMakeInclude.txt new file mode 100644 index 0000000..674005b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/CMakeInclude.txt @@ -0,0 +1,30 @@ +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/hardware_init.h") +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/hardware_header.h") + +set(headers) +foreach(header ${${PROJECT_NAME}_headers}) + string(REPLACE ${PROJECT_SOURCE_DIR} " #include \"../hardware" header1 ${header}) + string(REPLACE ".h" ".h\"!" header2 ${header1}) + list(APPEND headers ${header2}) +endforeach(header) + +string(REPLACE "!" "\n" header4 ${headers}) +set(HARDWARE_HEADERS ${header4}) +configure_file(${PROJECT_SOURCE_DIR}/hardware_header.h.in ${PROJECT_SOURCE_DIR}/hardware_header.h) + +execute_process( +COMMAND grep -h "void .*Init(void)" ${${PROJECT_NAME}_sources} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE hardware_result + OUTPUT_VARIABLE hardware_init) + +set(inits) +foreach(init ${hardware_init}) + string(REPLACE "void " " " init1 ${init}) + string(REPLACE "(void) {" "()!" init2 ${init1}) + list(APPEND inits ${init2}) +endforeach(init) + +string(REPLACE "!" ";" init4 ${inits}) +set(HARDWARE_INIT ${init4}) +configure_file(${PROJECT_SOURCE_DIR}/hardware_init.h.in ${PROJECT_SOURCE_DIR}/hardware_init.h) diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/hardware/CMakeLists.txt new file mode 100644 index 0000000..a78f0f3 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/CMakeLists.txt @@ -0,0 +1,40 @@ +project(pilight_hardware) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c" "${PROJECT_SOURCE_DIR}/*.cpp") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +if(${MODULESPACK} MATCHES "OFF" OR WIN32) + include(CMakeExclude.txt) + + if(WIN32) + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/433gpio.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/433gpio.h") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/433lirc.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/433lirc.h") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/IRgpio.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/IRgpio.h") + endif() + + if(${ZWAVE} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/zwave.cpp") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/zwave.h") + endif() + + include(CMakeInclude.txt) + + set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") +else() + foreach(file ${${PROJECT_NAME}_sources}) + get_filename_component(name ${file} NAME_WE) + add_library(${name}_module MODULE ${file}) + target_link_libraries(${name}_module ${CMAKE_THREAD_LIBS_INIT}) + target_link_libraries(${name}_module m) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_link_libraries(${name}_module execinfo) + endif() + target_link_libraries(${name}_module ${CMAKE_DL_LIBS}) + set_target_properties(${name}_module PROPERTIES OUTPUT_NAME ${name}) + string(REPLACE "_" "-" debname ${name}) + install(FILES ${CMAKE_BINARY_DIR}/libs/pilight/hardware/lib${name}.so DESTINATION lib/pilight/hardware RENAME ${name}.so COMPONENT pilight-hardware-${debname}) + endforeach() +endif() diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/hardware_header.h.in b/lib/ESPiLight/pilight/libs/pilight/hardware/hardware_header.h.in new file mode 100644 index 0000000..60bf414 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/hardware_header.h.in @@ -0,0 +1 @@ +@HARDWARE_HEADERS@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/hardware_init.h.in b/lib/ESPiLight/pilight/libs/pilight/hardware/hardware_init.h.in new file mode 100644 index 0000000..cbbe9d5 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/hardware_init.h.in @@ -0,0 +1 @@ +@HARDWARE_INIT@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/none.c b/lib/ESPiLight/pilight/libs/pilight/hardware/none.c new file mode 100644 index 0000000..db95eea --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/none.c @@ -0,0 +1,62 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include + +#include "../core/common.h" +#include "../core/dso.h" +#include "../config/hardware.h" +#include "none.h" + +static int noneSend(int *code, int rawlen, int repeats) { + sleep(1); + return EXIT_SUCCESS; +} + +static int noneReceive(void) { + sleep(1); + return EXIT_SUCCESS; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void noneInit(void) { + hardware_register(&none); + hardware_set_id(none, "none"); + none->hwtype=NONE; + none->comtype=COMNONE; + none->receiveOOK=&noneReceive; + none->sendOOK=&noneSend; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "none"; + module->version = "1.0"; + module->reqversion = "5.0"; + module->reqcommit = NULL; +} + +void init(void) { + noneInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/none.h b/lib/ESPiLight/pilight/libs/pilight/hardware/none.h new file mode 100644 index 0000000..5d5d1b0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/none.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _HARDWARE_NONE_H_ +#define _HARDWARE_NONE_H_ + +#include "../config/hardware.h" + +struct hardware_t *none; +void noneInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/zwave.cpp b/lib/ESPiLight/pilight/libs/pilight/hardware/zwave.cpp new file mode 100644 index 0000000..4dece63 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/zwave.cpp @@ -0,0 +1,705 @@ +/* + Copyright (C) 2013 - 2015 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see + + Big thanks to the Domoticz developers for inspiration. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 + #define STRICT + #define WIN32_LEAN_AND_MEAN + #include +#else + #include +#endif + +extern "C" { + +#include "../config/hardware.h" +#include "../core/pilight.h" +#include "../core/json.h" +#include "../core/log.h" +#include "../core/json.h" +#include "../core/dso.h" +#include "../config/settings.h" +#include "zwave.h" + +} + +#include "../../openzwave/Options.h" +#include "../../openzwave/Manager.h" +#include "../../openzwave/Notification.h" +#include "../../openzwave/Node.h" +#include "../../openzwave/Driver.h" +#include "../../openzwave/platform/Log.h" +#include "../../openzwave/value_classes/Value.h" + +static uint32 gHomeId = 0; + +#define DRIVER_STATUS_INIT_SUCCESS 0 +#define DRIVER_STATUS_INIT_FAILED 1 +#define DRIVER_STATUS_NODES_QUERIED 2 +#define DRIVER_STATUS_NODES_QUERIED_SOME_DEAD 3 + +static pthread_mutex_t init_lock; +static pthread_cond_t init_signal; +static pthread_mutexattr_t init_attr; + +static pthread_mutex_t values_lock; +static pthread_mutexattr_t values_attr; + +static unsigned short init_lock_init = 0; +static unsigned short values_lock_init = 0; + +static int pending_command = 0; +static unsigned short driver_status = -1; +static char com[255]; +static int threads = 0; +static int isinit = 0; + +#ifdef _WIN32 +static unsigned short nrports = 16; +static char comports[16][10]={"COM1", "COM2", "COM3", "COM4", + "COM5", "COM6", "COM7", "COM8", + "COM9", "COM10", "COM11", "COM12", + "COM13", "COM14", "COM15", "COM16"}; +#else +static unsigned short nrports = 44; +static char comports[44][16]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2","/dev/ttyS3","/dev/ttyS4","/dev/ttyS5", + "/dev/ttyS6","/dev/ttyS7","/dev/ttyS8","/dev/ttyS9","/dev/ttyS10","/dev/ttyS11", + "/dev/ttyS12","/dev/ttyS13","/dev/ttyS14","/dev/ttyS15","/dev/ttyUSB0", + "/dev/ttyUSB1","/dev/ttyUSB2","/dev/ttyUSB3","/dev/ttyUSB4","/dev/ttyUSB5", + "/dev/ttyAMA0","/dev/ttyAMA1","/dev/ttyACM0","/dev/ttyACM1", + "/dev/rfcomm0","/dev/rfcomm1","/dev/ircomm0","/dev/ircomm1", + "/dev/cuau0","/dev/cuau1","/dev/cuau2","/dev/cuau3", + "/dev/cuaU0","/dev/cuaU1","/dev/cuaU2","/dev/cuaU3", + "/dev/ttymxc0", "/dev/ttymxc1", "/dev/ttymxc2", + "/dev/ttymxc3", "/dev/ttymxc4", "/dev/ttymxc5"}; +#endif + +void UpdateNodeValue(int nodeId, OpenZWave::ValueID const v) { + pthread_mutex_lock(&values_lock); + struct JsonNode *json = json_mkobject(); + struct JsonNode *jcode = json_mkobject(); + struct zwave_values_t *tmp = NULL; + int match = 0; + std::string label = OpenZWave::Manager::Get()->GetValueLabel(v); + + tmp = zwave_values; + while(tmp) { + if(tmp->nodeId == nodeId && tmp->valueId == v.GetIndex()) { + match = 1; + break; + } + tmp = tmp->next; + } + + if(match == 0) { + if((tmp = (struct zwave_values_t *)MALLOC(sizeof(struct zwave_values_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + tmp->nodeId = nodeId; + tmp->cmdId = v.GetCommandClassId(); + tmp->valueId = v.GetIndex(); + tmp->instance = v.GetInstance(); + tmp->genre = v.GetGenre(); + tmp->valueType = v.GetType(); + if((tmp->label = (char *)MALLOC(strlen(label.c_str())+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(tmp->label, label.c_str()); + tmp->next = NULL; + } + + json_append_member(json, "message", jcode); + json_append_member(json, "origin", json_mkstring("receiver")); + json_append_member(jcode, "homeId", json_mknumber(gHomeId, 0)); + json_append_member(jcode, "nodeId", json_mknumber(nodeId, 0)); + json_append_member(jcode, "cmdId", json_mknumber(v.GetCommandClassId(), 0)); + json_append_member(jcode, "label", json_mkstring(label.c_str())); + + std::string str; + OpenZWave::Manager::Get()->GetValueAsString(v, &str); + + switch(v.GetType()) { + case OpenZWave::ValueID::ValueType_Button: + case OpenZWave::ValueID::ValueType_Bool: + if(strcmp(str.c_str(), "False") == 0) { + tmp->number_ = 0; + json_append_member(jcode, "value", json_mknumber(0, 0)); + } else if(strcmp(str.c_str(), "True") == 0) { + tmp->number_ = 1; + json_append_member(jcode, "value", json_mknumber(1, 0)); + } + break; + case OpenZWave::ValueID::ValueType_String: + case OpenZWave::ValueID::ValueType_Raw: + json_append_member(jcode, "value", json_mkstring(str.c_str())); + break; + case OpenZWave::ValueID::ValueType_Byte: + case OpenZWave::ValueID::ValueType_Decimal: + case OpenZWave::ValueID::ValueType_Int: + case OpenZWave::ValueID::ValueType_Short: + json_append_member(jcode, "value", json_mknumber(atoi(str.c_str()), 0)); + break; + case OpenZWave::ValueID::ValueType_List: { + struct JsonNode *jvalues = json_mkarray(); + std::vector values; + OpenZWave::Manager::Get()->GetValueListSelection(v, &str); + OpenZWave::Manager::Get()->GetValueListItems(v, &values); + for(std::vector::iterator it = values.begin(); it != values.end(); ++it) { + std::string t = *it; + json_append_element(jvalues, json_mkstring(t.c_str())); + } + json_append_member(jcode, "value", json_mkstring(str.c_str())); + json_append_member(jcode, "values", jvalues); + } break; + case OpenZWave::ValueID::ValueType_Schedule: + default: + break; + } + + if(pilight.receive != NULL) { + pilight.receive(json, ZWAVE); + } + + if(match == 0) { + tmp->next = zwave_values; + zwave_values = tmp; + } + + OpenZWave::Manager::Get()->SetChangeVerified(v, true); + json_delete(json); + pthread_mutex_unlock(&values_lock); +} + +void DeleteNodeValue(int nodeId, OpenZWave::ValueID const v) { + pthread_mutex_lock(&values_lock); + struct zwave_values_t *currP, *prevP; + + prevP = NULL; + + for(currP = zwave_values; currP != NULL; prevP = currP, currP = currP->next) { + + if(currP->nodeId == nodeId && currP->valueId == v.GetIndex()) { + if(prevP == NULL) { + zwave_values = currP->next; + } else { + prevP->next = currP->next; + } + + FREE(currP); + + break; + } + } + pthread_mutex_unlock(&values_lock); +} + +void OnNotification(OpenZWave::Notification const *_notification, void *_context) { + switch(_notification->GetType()) { + case OpenZWave::Notification::Type_ValueAdded: { + OpenZWave::ValueID v = _notification->GetValueID(); + UpdateNodeValue(_notification->GetNodeId(), v); + if(pilight.debuglevel == 1) { + printf("z-wave value added\n"); + } + } break; + case OpenZWave::Notification::Type_ValueRemoved: { + OpenZWave::ValueID v = _notification->GetValueID(); + DeleteNodeValue(_notification->GetNodeId(), v); + if(pilight.debuglevel == 1) { + printf("z-wave value removed\n"); + } + } break; + case OpenZWave::Notification::Type_ValueChanged: { + OpenZWave::ValueID v = _notification->GetValueID(); + UpdateNodeValue(_notification->GetNodeId(), v); + if(pilight.debuglevel == 1) { + printf("z-wave value changed\n"); + } + } break; + case OpenZWave::Notification::Type_Group: + case OpenZWave::Notification::Type_NodeNew: + break; + case OpenZWave::Notification::Type_NodeAdded: { + /* Add new node to the nodes list */ + if(pilight.debuglevel == 1) { + printf("z-wave node added\n"); + } + } break; + case OpenZWave::Notification::Type_NodeRemoved: { + // Remove a node from our list + if(pilight.debuglevel == 1) { + printf("z-wave node removed\n"); + } + } break; + case OpenZWave::Notification::Type_NodeProtocolInfo: + case OpenZWave::Notification::Type_NodeNaming: + case OpenZWave::Notification::Type_NodeEvent: + case OpenZWave::Notification::Type_PollingDisabled: + case OpenZWave::Notification::Type_PollingEnabled: + case OpenZWave::Notification::Type_SceneEvent: + case OpenZWave::Notification::Type_CreateButton: + case OpenZWave::Notification::Type_DeleteButton: + case OpenZWave::Notification::Type_ButtonOn: + case OpenZWave::Notification::Type_ButtonOff: + break; + case OpenZWave::Notification::Type_DriverReady: + gHomeId = _notification->GetHomeId(); + logprintf(LOG_INFO, "[Z-Wave] homeID is %lu", gHomeId); + if(pilight.debuglevel == 1) { + printf("z-wave driver ready\n"); + } + driver_status = DRIVER_STATUS_INIT_SUCCESS; + pthread_cond_signal(&init_signal); + break; + case OpenZWave::Notification::Type_DriverFailed: + if(pilight.debuglevel == 1) { + printf("z-wave driver failed\n"); + } + driver_status = DRIVER_STATUS_INIT_FAILED; + pthread_cond_signal(&init_signal); + break; + case OpenZWave::Notification::Type_DriverReset: + break; + case OpenZWave::Notification::Type_EssentialNodeQueriesComplete: + case OpenZWave::Notification::Type_NodeQueriesComplete: + case OpenZWave::Notification::Type_AwakeNodesQueried: + break; + case OpenZWave::Notification::Type_AllNodesQueriedSomeDead: + if(pilight.debuglevel == 1) { + printf("z-wave all nodes partially queried\n"); + } + driver_status = DRIVER_STATUS_NODES_QUERIED_SOME_DEAD; + pthread_cond_signal(&init_signal); + break; + case OpenZWave::Notification::Type_AllNodesQueried: + if(pilight.debuglevel == 1) { + printf("z-wave all nodes queried\n"); + } + /* Nodes are ready to take instructions */ + driver_status = DRIVER_STATUS_NODES_QUERIED; + pthread_cond_signal(&init_signal); + break; + case OpenZWave::Notification::Type_Notification: { + if(pilight.debuglevel == 1) { + printf("z-wave all notification\n"); + } + switch(_notification->GetNotification()) { + case OpenZWave::Notification::Code_MsgComplete: + if(pilight.debuglevel == 1) { + printf("- MsgComplete\n"); + } + break; + case OpenZWave::Notification::Code_Timeout: + /* No connection could be made with the z-wave module */ + if(pilight.debuglevel == 1) { + printf("- Timeout\n"); + } + break; + case OpenZWave::Notification::Code_NoOperation: + if(pilight.debuglevel == 1) { + printf("- NoOperation\n"); + } + break; + case OpenZWave::Notification::Code_Awake: + if(pilight.debuglevel == 1) { + printf("- Awake\n"); + } + break; + case OpenZWave::Notification::Code_Sleep: + if(pilight.debuglevel == 1) { + printf("- Sleep\n"); + } + break; + case OpenZWave::Notification::Code_Dead: + if(pilight.debuglevel == 1) { + printf("- Dead\n"); + } + break; + case OpenZWave::Notification::Code_Alive: + if(pilight.debuglevel == 1) { + printf("- Alive\n"); + } + break; + default: + // logprintf(LOG_DEBUG, "- %d\n", _notification->GetNotification()); + break; + } + } break; + case OpenZWave::Notification::Type_DriverRemoved: + if(pilight.debuglevel == 1) { + printf("z-wave driver removed\n"); + } + default: + break; + } +} + +static unsigned short zwaveHwInit(void) { + char *logfile = NULL; + int free_log_file = 0; + if(settings_find_string("log-file", &logfile) != 0) { + if((logfile = (char *)MALLOC(strlen(LOG_FILE)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + free_log_file = 1; + } + + char *logpath = NULL; + atomiclock(); + /* basename isn't thread safe */ + char *filename = basename(logfile); + atomicunlock(); + + pthread_mutexattr_init(&init_attr); + pthread_mutexattr_settype(&init_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&init_lock, &init_attr); + pthread_cond_init(&init_signal, NULL); + init_lock_init = 1; + + pthread_mutexattr_init(&values_attr); + pthread_mutexattr_settype(&values_attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&values_lock, &values_attr); + values_lock_init = 1; + + pthread_mutex_lock(&init_lock); + + size_t i = (strlen(logfile)-strlen(filename)); + if((logpath = (char *)REALLOC(logpath, i+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + memset(logpath, '\0', i+1); + strncpy(logpath, logfile, i); + + OpenZWave::Options::Create(logpath, logpath, "--SaveConfiguration=true"); + OpenZWave::Options::Get()->AddOptionString("UserPath", logpath, false); + OpenZWave::Options::Get()->AddOptionString("logFilename", filename, false); + + FREE(logpath); + if(free_log_file == 1) { + FREE(logfile); + } + + OpenZWave::Options::Get()->AddOptionBool("logging", true); + if(pilight.debuglevel == 1) { + OpenZWave::Options::Get()->AddOptionInt("SaveLogLevel", OpenZWave::LogLevel_Info); + } else { + OpenZWave::Options::Get()->AddOptionInt("SaveLogLevel", OpenZWave::LogLevel_Warning); + } + OpenZWave::Options::Get()->AddOptionInt("PollInterval", 500); + OpenZWave::Options::Get()->AddOptionBool("IntervalBetweenPolls", true); + OpenZWave::Options::Get()->AddOptionBool("AppendLogFile", true); + OpenZWave::Options::Get()->AddOptionBool("ConsoleOutput", true); + OpenZWave::Options::Get()->AddOptionBool("NotifyTransactions", true); + OpenZWave::Options::Get()->Lock(); + OpenZWave::Manager::Create(); + OpenZWave::Manager::Get()->AddWatcher(OnNotification, NULL); + OpenZWave::Manager::Get()->AddDriver(com); + isinit = 1; + + pthread_cond_wait(&init_signal, &init_lock); + + if(driver_status == DRIVER_STATUS_INIT_SUCCESS) { + logprintf(LOG_INFO, "[Z-Wave]: z-wave initialized, querying all nodes"); + return EXIT_SUCCESS; + } + return EXIT_FAILURE; +} + +static unsigned short zwaveHwDeinit(void) { + pthread_mutex_unlock(&init_lock); + pthread_cond_signal(&init_signal); + + logprintf(LOG_NOTICE, "[Z-Wave]: closing and freeing z-wave modules, please wait..."); + if(isinit == 1) { + OpenZWave::Manager::Get()->RemoveWatcher(OnNotification, NULL); + sleep(1); + OpenZWave::Manager::Get()->RemoveDriver(com); + OpenZWave::Manager::Destroy(); + OpenZWave::Options::Destroy(); + } + + struct zwave_values_t *tmp = NULL; + while(zwave_values) { + tmp = zwave_values; + FREE(tmp->label); + zwave_values = zwave_values->next; + FREE(tmp); + } + if(zwave_values != NULL) { + FREE(zwave_values); + } + + while(threads > 0) { + usleep(10); + } + + return EXIT_SUCCESS; +} + +static OpenZWave::ValueID::ValueGenre getGenreFromEnum(int genre) { + switch(genre) { + default: + case OpenZWave::ValueID::ValueGenre_Basic: + return OpenZWave::ValueID::ValueGenre_Basic; + break; + case OpenZWave::ValueID::ValueGenre_User: + return OpenZWave::ValueID::ValueGenre_User; + break; + case OpenZWave::ValueID::ValueGenre_Config: + return OpenZWave::ValueID::ValueGenre_Config; + break; + case OpenZWave::ValueID::ValueGenre_System: + return OpenZWave::ValueID::ValueGenre_System; + break; + case OpenZWave::ValueID::ValueGenre_Count: + return OpenZWave::ValueID::ValueGenre_Count; + break; + } +} + +static OpenZWave::ValueID::ValueType getValueTypeFromEnum(int type) { + switch(type) { + default: + case OpenZWave::ValueID::ValueType_Bool: + return OpenZWave::ValueID::ValueType_Bool; + break; + case OpenZWave::ValueID::ValueType_Byte: + return OpenZWave::ValueID::ValueType_Byte; + break; + case OpenZWave::ValueID::ValueType_Decimal: + return OpenZWave::ValueID::ValueType_Decimal; + break; + case OpenZWave::ValueID::ValueType_Int: + return OpenZWave::ValueID::ValueType_Int; + break; + case OpenZWave::ValueID::ValueType_List: + return OpenZWave::ValueID::ValueType_List; + break; + case OpenZWave::ValueID::ValueType_Schedule: + return OpenZWave::ValueID::ValueType_Schedule; + break; + case OpenZWave::ValueID::ValueType_Short: + return OpenZWave::ValueID::ValueType_Short; + break; + case OpenZWave::ValueID::ValueType_String: + return OpenZWave::ValueID::ValueType_String; + break; + case OpenZWave::ValueID::ValueType_Button: + return OpenZWave::ValueID::ValueType_Button; + break; + case OpenZWave::ValueID::ValueType_Raw: + return OpenZWave::ValueID::ValueType_Raw; + break; + } +} + +void zwaveSetValue(int nodeId, int cmdId, char *label, char *value) { + pthread_mutex_lock(&values_lock); + struct zwave_values_t *tmp = zwave_values; + std::string v = value; + + while(tmp) { + if(tmp->nodeId == nodeId && tmp->cmdId == cmdId && + ((label != NULL && tmp->label != NULL && strcmp(tmp->label, label) == 0) + || label == NULL)) { + OpenZWave::ValueID vID(gHomeId, tmp->nodeId, getGenreFromEnum(tmp->genre), tmp->cmdId, tmp->instance, tmp->valueId, getValueTypeFromEnum(tmp->valueType)); + OpenZWave::Manager::Get()->SetValue(vID, v); + } + tmp = tmp->next; + } + pthread_mutex_unlock(&values_lock); +} + +static int zwaveSend(struct JsonNode *code) { + return EXIT_SUCCESS; +} + +static void OnDeviceStatusUpdate(OpenZWave::Driver::ControllerState cs, OpenZWave::Driver::ControllerError err, void *_context) { + switch(cs) { + case OpenZWave::Driver::ControllerState_Normal: + pending_command = 0; + logprintf(LOG_INFO, "[Z-Wave]: No Command in progress"); + break; + case OpenZWave::Driver::ControllerState_Starting: + logprintf(LOG_INFO, "[Z-Wave]: Starting controller command"); + break; + case OpenZWave::Driver::ControllerState_Cancel: + logprintf(LOG_INFO, "[Z-Wave]: The command was canceled"); + pending_command = 0; + break; + case OpenZWave::Driver::ControllerState_Error: + logprintf(LOG_INFO, "[Z-Wave]: Command invocation had error(s) and was aborted"); + pending_command = 0; + break; + case OpenZWave::Driver::ControllerState_Waiting: + logprintf(LOG_INFO, "[Z-Wave]: Controller is waiting for a user action"); + pending_command = 1; + break; + case OpenZWave::Driver::ControllerState_Sleeping: + logprintf(LOG_INFO, "[Z-Wave]: Controller command is on a sleep queue wait for device"); + break; + case OpenZWave::Driver::ControllerState_InProgress: + logprintf(LOG_INFO, "[Z-Wave]: The controller is communicating with the other device to carry out the command"); + break; + case OpenZWave::Driver::ControllerState_Completed: + logprintf(LOG_INFO, "[Z-Wave]: The command has completed successfully"); + pending_command = 0; + break; + case OpenZWave::Driver::ControllerState_Failed: + logprintf(LOG_INFO, "[Z-Wave]: The command has failed"); + pending_command = 0; + break; + case OpenZWave::Driver::ControllerState_NodeOK: + logprintf(LOG_INFO, "[Z-Wave]: Used only with ControllerCommand_HasNodeFailed to indicate that the controller thinks the node is OK"); + break; + case OpenZWave::Driver::ControllerState_NodeFailed: + logprintf(LOG_INFO, "[Z-Wave]: Used only with ControllerCommand_HasNodeFailed to indicate that the controller thinks the node has failed"); + break; + default: + logprintf(LOG_INFO, "[Z-Wave]: Unknown Device Response!"); + pending_command = 0; + break; + } +} + +void zwaveStartInclusion(void) { + if(pending_command == 0) { + // OpenZWave::Manager::Get()->AddNode(gHomeId); + OpenZWave::Manager::Get()->BeginControllerCommand(gHomeId, OpenZWave::Driver::ControllerCommand_AddDevice, OnDeviceStatusUpdate, NULL, true); + } +} + +void zwaveStartExclusion(void) { + if(pending_command == 0) { + // OpenZWave::Manager::Get()->RemoveNode(gHomeId); + OpenZWave::Manager::Get()->BeginControllerCommand(gHomeId, OpenZWave::Driver::ControllerCommand_RemoveDevice, OnDeviceStatusUpdate, NULL, true); + } +} + +void zwaveStopCommand(void) { + if(pending_command == 1) { + OpenZWave::Manager::Get()->CancelControllerCommand(gHomeId); + } +} + +void zwaveSoftReset(void) { + OpenZWave::Manager::Get()->SoftReset(gHomeId); +} + +void zwaveHardReset(void) { + // OpenZWave::Manager::Get()->ResetController(gHomeId); +} + +void zwaveGetConfigParam(int nodeId, int paramId) { + OpenZWave::Manager::Get()->RequestConfigParam(gHomeId, nodeId, paramId); +} + +void zwaveSetConfigParam(int nodeId, int paramId, int valueId, int len) { + OpenZWave::Manager::Get()->SetConfigParam(gHomeId, nodeId, paramId, valueId, len); +} + +static void *zwaveReceive(void *param) { + threads++; + + while(init_lock_init == 0 && zwave->stop == 0) { + usleep(10); + } + + sleep(1); + + if(zwave->stop == 0) { + pthread_cond_wait(&init_signal, &init_lock); + + if(driver_status == DRIVER_STATUS_NODES_QUERIED) { + logprintf(LOG_INFO, "[Z-Wave]: all nodes queried"); + } else if(driver_status == DRIVER_STATUS_NODES_QUERIED_SOME_DEAD) { + logprintf(LOG_INFO, "[Z-Wave]: nodes partially queried"); + } + + while(zwave->stop == 0) { + sleep(3); + } + } + threads--; + return (void *)NULL; +} + +static unsigned short zwaveSettings(JsonNode *json) { + int i = 0; + if(strcmp(json->key, "comport") == 0) { + if(json->tag == JSON_STRING) { + for(i=0;istring_) == 0) { + strcpy(com, json->string_); + return EXIT_SUCCESS; + } + } + } + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void zwaveInit(void) { + hardware_register(&zwave); + hardware_set_id(zwave, "zwave"); + + options_add(&zwave->options, 'p', "comport", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + + zwave->hwtype=ZWAVE; + zwave->comtype=COMAPI; + zwave->init=&zwaveHwInit; + zwave->deinit=&zwaveHwDeinit; + zwave->sendAPI=&zwaveSend; + zwave->receiveAPI=&zwaveReceive; + zwave->settings=&zwaveSettings; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "zwave"; + module->version = "1.0"; + module->reqversion = "6.0"; + module->reqcommit = "40"; +} + +void init(void) { + zwaveInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/hardware/zwave.h b/lib/ESPiLight/pilight/libs/pilight/hardware/zwave.h new file mode 100644 index 0000000..d1ca1d3 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/hardware/zwave.h @@ -0,0 +1,58 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _HARDWARE_ZWAVE_H_ +#define _HARDWARE_ZWAVE_H_ + +#include "../config/hardware.h" + +#define COMMAND_CLASS_SWITCH_BINARY 0x25 +#define COMMAND_CLASS_SWITCH_MULTILEVEL 0x26 +#define COMMAND_CLASS_SWITCH_ALL 0x27 +#define COMMAND_CLASS_CONFIGURATION 0x70 +#define COMMAND_CLASS_POWERLEVEL 0x73 + +typedef struct zwave_values_t { + int nodeId; + int cmdId; + int valueId; + union { + int number_; + char *string_; + }; + int valueType; + int instance; + int genre; + char *label; + struct zwave_values_t *next; +} zwave_values_t; + +struct zwave_values_t *zwave_values; + +struct hardware_t *zwave; +void zwaveInit(void); +unsigned long long zwaveGetValueId(int nodeId, int cmdId); +void zwaveSetValue(int nodeId, int cmdId, char *label, char *value); +void zwaveStartInclusion(void); +void zwaveStartExclusion(void); +void zwaveStopCommand(void); +void zwaveSoftReset(void); +void zwaveGetConfigParam(int nodeId, int paramId); +void zwaveSetConfigParam(int nodeId, int paramId, int valueId, int len); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/lua/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/lua/CMakeLists.txt new file mode 100644 index 0000000..a680a57 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/lua/CMakeLists.txt @@ -0,0 +1,6 @@ +project(pilight_lua) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/pilight/lua/lua.c b/lib/ESPiLight/pilight/libs/pilight/lua/lua.c new file mode 100644 index 0000000..4b59e3b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/lua/lua.c @@ -0,0 +1,722 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef _WIN32 + #include + #include + #include +#endif + +#include "lua.h" +#include "lualibrary.h" + +#include "../core/log.h" +#include "../core/json.h" +#include "../core/mem.h" +#include "../core/common.h" + +#define NRLUASTATES 5 + +static int init = 0; +struct lua_state_t lua_state[NRLUASTATES]; +struct plua_module_t *modules = NULL; + +/* LCOV_EXCL_START */ +void plua_stack_dump(lua_State *L) { + int i = 0; + int top = lua_gettop(L); + for(i = 1; i <= top; i++) { /* repeat for each level */ + int t = lua_type(L, i); + switch(t) { + case LUA_TSTRING: /* strings */ + printf("%d: '%s'", i, lua_tostring(L, i)); + break; + case LUA_TBOOLEAN: /* booleans */ + printf("%d: %s", i, lua_toboolean(L, i) ? "true" : "false"); + break; + case LUA_TNUMBER: /* numbers */ + printf("%d: %g", i, lua_tonumber(L, i)); + break; + default: /* other values */ + printf("%d: %s", i, lua_typename(L, t)); + break; + } + printf(" "); /* put a separator */ + } + printf("\n"); /* end the listing */ +} +/* LCOV_EXCL_STOP */ + +static void plua_metatable_free(struct plua_metatable_t *table) { + int x = 0; + for(x=0;xnrvar;x++) { + if(table->table[x].val.type_ == LUA_TSTRING) { + FREE(table->table[x].val.string_); + } + if(table->table[x].key.type_ == LUA_TSTRING) { + FREE(table->table[x].key.string_); + } + } + if(table->nrvar > 0) { + FREE(table->table); + } + FREE(table); +} + +void plua_metatable_clone(struct plua_metatable_t **src, struct plua_metatable_t **dst) { + int i = 0; + struct plua_metatable_t *a = *src; + + if((*dst) != NULL) { + plua_metatable_free((*dst)); + } + if(((*dst) = MALLOC(sizeof(struct plua_metatable_t))) == NULL) { + OUT_OF_MEMORY + } + memset((*dst), 0, sizeof(struct plua_metatable_t)); + if(((*dst)->table = MALLOC(sizeof(*a->table)*(a->nrvar))) == NULL) { + OUT_OF_MEMORY + } + memset((*dst)->table, 0, sizeof(*a->table)*(a->nrvar)); + for(i=0;inrvar;i++) { + (*dst)->table[i].key.type_ = a->table[i].key.type_; + (*dst)->table[i].val.type_ = a->table[i].val.type_; + + if(a->table[i].key.type_ == LUA_TSTRING) { + if(((*dst)->table[i].key.string_ = STRDUP(a->table[i].key.string_)) == NULL) { + OUT_OF_MEMORY + } + } + if(a->table[i].key.type_ == LUA_TNUMBER) { + (*dst)->table[i].key.number_ = a->table[i].key.number_; + } + + if(a->table[i].val.type_ == LUA_TSTRING) { + if(((*dst)->table[i].val.string_ = STRDUP(a->table[i].val.string_)) == NULL) { + OUT_OF_MEMORY + } + } + if(a->table[i].val.type_ == LUA_TNUMBER) { + (*dst)->table[i].val.number_ = a->table[i].val.number_; + } + } + (*dst)->nrvar = a->nrvar; +} + +int plua_metatable_pairs(lua_State *L) { + logprintf(LOG_NOTICE, "pilight lua metatables do not support pairs"); + return 0; +} + +int plua_metatable_get(lua_State *L) { + struct plua_metatable_t *node = NULL; + char buf[128] = { '\0' }, *p = buf; + char *error = "string or number expected, got %s"; + int x = 0; + + sprintf(p, error, lua_typename(L, lua_type(L, -1))); + + luaL_argcheck(L, + (lua_isstring(L, -1) || lua_isnumber(L, -1)), + 1, buf); + + struct lua_state_t *state = plua_get_current_state(L); + + node = state->table; + for(x=0;xnrvar;x++) { + if((lua_isnumber(L, -1) == 1 && node->table[x].key.type_ == LUA_TNUMBER && node->table[x].key.number_ == (int)lua_tonumber(L, -1)) || + (lua_isstring(L, -1) == 1 && node->table[x].key.type_ == LUA_TSTRING && strcmp(node->table[x].key.string_, lua_tostring(L, -1)) == 0)) { + if(node->table[x].val.type_ == LUA_TNUMBER) { + lua_pushnumber(L, node->table[x].val.number_); + } + if(node->table[x].val.type_ == LUA_TSTRING) { + lua_pushstring(L, node->table[x].val.string_); + } + return 1; + } + } + + return 0; +} + +int plua_metatable_set(lua_State *L) { + struct plua_metatable_t *node = NULL; + char buf[128] = { '\0' }, *p = buf; + char *error = "string or number expected, got %s"; + int match = 0, x = 0; + + sprintf(p, error, lua_typename(L, lua_type(L, -1))); + + luaL_argcheck(L, + (lua_isstring(L, -1) || lua_isnumber(L, -1)), + 1, buf); + + sprintf(p, error, lua_typename(L, lua_type(L, -1))); + + luaL_argcheck(L, + (lua_isstring(L, -2) || lua_isnumber(L, -2)), + 1, buf); + + struct lua_state_t *state = plua_get_current_state(L); + + node = state->table; + for(x=0;xnrvar;x++) { + if((lua_isnumber(L, -2) == 1 && node->table[x].key.type_ == LUA_TNUMBER && node->table[x].key.number_ == (int)lua_tonumber(L, -1)) || + (lua_isstring(L, -2) == 1 && node->table[x].key.type_ == LUA_TSTRING && strcmp(node->table[x].key.string_, lua_tostring(L, -1)) == 0)) { + match = 1; + if(lua_isnumber(L, -1) == 1) { + node->table[x].val.number_ = lua_tonumber(L, -1); + node->table[x].val.type_ = LUA_TNUMBER; + } + if(lua_isstring(L, -1) == 1) { + node->table[x].val.string_ = STRDUP((char *)lua_tostring(L, -1)); + node->table[x].val.type_ = LUA_TSTRING; + } + break; + } + } + + if(node != NULL) { + if(match == 0) { + int idx = node->nrvar; + if((node->table = REALLOC(node->table, sizeof(*node->table)*(idx+1))) == NULL) { + OUT_OF_MEMORY + } + if(lua_isnumber(L, -1) == 1) { + node->table[idx].val.number_ = lua_tonumber(L, -1); + node->table[idx].val.type_ = LUA_TNUMBER; + } + if(lua_isstring(L, -1) == 1) { + node->table[idx].val.string_ = STRDUP((char *)lua_tostring(L, -1)); + node->table[idx].val.type_ = LUA_TSTRING; + } + if(lua_isnumber(L, -2) == 1) { + node->table[idx].key.number_ = lua_tonumber(L, -2); + node->table[idx].key.type_ = LUA_TNUMBER; + } + if(lua_isstring(L, -2) == 1) { + node->table[idx].key.string_ = STRDUP((char *)lua_tostring(L, -2)); + node->table[idx].key.type_ = LUA_TSTRING; + } + node->nrvar++; + } + } + return 1; +} + +int plua_metatable_gc(lua_State *L){ + return 1; +} + +struct lua_state_t *plua_get_free_state(void) { + int i = 0; + for(i=0;i key -2 => table + */ + lua_pushstring(L, key); + + if(lua_istable(L, -2) == 0) { + /* + * Remove the key from the stack again + * + * stack now contains: -1 => table + */ + lua_pop(L, 1); + return 0; + } + + /* + * Replace the key at -1 with it value in table -2 + * + * stack now contains: -1 => value -2 => table + */ + lua_gettable(L, -2); + + /* + * Check if the first element is a number + */ + if(lua_isstring(L, -1) == 0) { + /* + * Remove the value from the stack again + * + * stack now contains: -1 => table + */ + lua_pop(L, 1); + return 0; + } + + *ret = lua_tostring(L, -1); + + /* + * stack now contains: -1 => table + */ + lua_pop(L, 1); + return 1; +} + +// static int plua_get_table_double_by_key(struct lua_State *L, const char *key, double *ret) { + // /* + // * Push the key we want to retrieve on the stack + // * + // * stack now contains: -1 => key -2 => table + // */ + // lua_pushstring(L, key); + + // /* + // * Replace the key at -1 with it value in table -2 + // * + // * stack now contains: -1 => value -2 => table + // */ + // if(lua_istable(L, -2) == 0) { + // /* + // * Remove the key from the stack again + // * + // * stack now contains: -1 => table + // */ + // lua_pop(L, 1); + // return 0; + // } + // /* + // * Replace the key at -1 with it value in table -2 + // * + // * stack now contains: -1 => value -2 => table + // */ + // lua_gettable(L, -2); + + // /* + // * Check if the first element is a number + // */ + // if(lua_isnumber(L, -1) == 0) { + // /* + // * Remove the value from the stack again + // * + // * stack now contains: -1 => table + // */ + // lua_pop(L, 1); + // return 0; + // } + + // *ret = lua_tonumber(L, -1); + + // /* + // * stack now contains: -1 => table + // */ + // lua_pop(L, 1); + + // return 1; +// } + +static int plua_table_has_keys(lua_State *L, char **keys, int number) { + if(lua_istable(L, -1) == 0) { + return 0; + } + + int i = 0; + /* + * Push another reference to the table on top of the stack (so we know + * where it is), and this function can work for negative, positive and + * pseudo indices. + * + * stack now contains: -1 => table -2 => table + */ + lua_pushvalue(L, -1); + + /* + * stack now contains: -1 => nil -2 => table -3 => table + */ + lua_pushnil(L); + + int match = 0, nrkeys = 0; + while(lua_next(L, -2)) { + nrkeys++; + + /* + * stack now contains: -1 => value -2 => key -3 => table + * + * copy the key so that lua_tostring does not modify the original + * + * stack now contains: -1 => key -2 => value; -3 => key -4 => table -5 => table + */ + lua_pushvalue(L, -2); + + const char *k = lua_tostring(L, -1); // key + + for(i=0;i key -2 => table -3 => table + */ + lua_pop(L, 2); + } + /* + * After the last lua_next call stack now contains: + * -1 => table -2 => table + */ + if(match != number || nrkeys != number) { + return 0; + } + + /* + * Remove duplicated table from stack + * + * stack now contains -1 => table + */ + lua_pop(L, 1); + + return 1; +} + +static int plua_module_init(struct lua_State *L, char *file, struct plua_module_t *mod) { + /* + * Function info is at top of stack + * + * stack now contains -1 => function + */ +#if LUA_VERSION_NUM <= 502 + lua_getfield(L, -1, "info"); + if(strcmp(lua_typename(L, lua_type(L, -1)), "function") != 0) { +#else + if(lua_getfield(L, -1, "info") == 0) { +#endif + logprintf(LOG_ERR, "%s: info function missing", file); + return 0; + } + + char *type = NULL; + switch(mod->type) { + case FUNCTION: { + type = STRDUP("event function"); + } break; + case OPERATOR: { + type = STRDUP("event operator"); + } break; + } + if(type == NULL) { + OUT_OF_MEMORY + } + + /* + * Returned table (first argument) is at top of stack + * + * stack now contains -1 => function + */ + if(lua_pcall(L, 0, 1, 0) == LUA_ERRRUN) { + if(strcmp(lua_typename(L, lua_type(L, -1)), "string") == 0) { + logprintf(LOG_ERR, "%s", lua_tostring(L, -1)); + lua_pop(L, 1); + return 0; + } + } + + if(lua_istable(L, -1) == 0) { + logprintf(LOG_ERR, "%s: the info function returned %s, table expected", file, lua_typename(L, lua_type(L, -1))); + FREE(type); + return 0; + } + + char *keys[12] = {"name", "version", "reqversion", "reqcommit"}; + if(plua_table_has_keys(L, keys, 4) == 0) { + logprintf(LOG_ERR, "%s: the info table has invalid keys", file); + FREE(type); + return 0; + } + + const char *name = NULL, *version = NULL, *reqversion = NULL, *reqcommit = NULL; + if(plua_get_table_string_by_key(L, "name", &name) == 0) { + logprintf(LOG_ERR, "%s: the info table 'name' key is missing or invalid", file); + FREE(type); + return 0; + } + + if(plua_get_table_string_by_key(L, "version", &version) == 0) { + logprintf(LOG_ERR, "%s: the info table 'version' key is missing or invalid", file); + FREE(type); + return 0; + } + + if(plua_get_table_string_by_key(L, "reqversion", &reqversion) == 0) { + logprintf(LOG_ERR, "%s: the info table 'reqversion' key is missing or invalid", file); + FREE(type); + return 0; + } + if(plua_get_table_string_by_key(L, "reqcommit", &reqcommit) == 0) { + logprintf(LOG_ERR, "%s: the info table 'reqcommit' key is missing or invalid", file); + FREE(type); + return 0; + } + + strcpy(mod->name, name); + strcpy(mod->version, version); + strcpy(mod->reqversion, reqversion); + strcpy(mod->reqcommit, reqcommit); + + char pilight_version[strlen(PILIGHT_VERSION)+1]; + char pilight_commit[3], *v = (char *)reqversion, *r = (char *)reqcommit; + int valid = 1, check = 1; + + memset(&pilight_commit, 0, sizeof(pilight_commit)); + + strcpy(pilight_version, PILIGHT_VERSION); + + if((check = vercmp(v, pilight_version)) > 0) { + valid = 0; + } + + if(check == 0 && strlen(mod->reqcommit) > 0) { + sscanf(HASH, "v%*[0-9].%*[0-9]-%[0-9]-%*[0-9a-zA-Z\n\r]", pilight_commit); + + if(strlen(pilight_commit) > 0 && (vercmp(r, pilight_commit)) > 0) { + valid = 0; + } + } + if(valid == 1) { + logprintf(LOG_DEBUG, "loaded %s %s v%s", type, file, version); + } else { + if(strlen(mod->reqcommit) > 0) { + logprintf(LOG_ERR, "%s %s requires at least pilight v%s (commit %s)", type, file, mod->reqversion, mod->reqcommit); + } else { + logprintf(LOG_ERR, "%s %s requires at least pilight v%s", type, file, mod->reqversion); + } + /* + * Pop function from stack + * + * The stack now contains: nothing + */ + lua_pop(L, 1); + FREE(type); + return 0; + } + + /* + * Pop function from stack + * + * The stack now contains: nothing + */ + lua_pop(L, 1); + FREE(type); + return 1; +} + +static int plua_writer(lua_State *L, const void* p, size_t sz, void* ud) { + struct plua_module_t *module = ud; + if((module->bytecode = REALLOC(module->bytecode, module->size+sz)) == NULL) { + OUT_OF_MEMORY + } + memcpy(module->bytecode, p, sz); + module->size += sz; + return 0; +} + +void plua_module_load(char *file, int type) { + struct plua_module_t *module = MALLOC(sizeof(struct plua_module_t)); + lua_State *L = lua_state[0].L; + char name[255] = { '\0' }, *p = name; + int i = 0; + if(module == NULL) { + OUT_OF_MEMORY + } + memset(module, 0, sizeof(struct plua_module_t)); + + if(luaL_loadfile(L, file) != 0) { + logprintf(LOG_ERR, "cannot load lua file: %s", file); + lua_pop(L, 1); + FREE(module); + return; + } + strcpy(module->file, file); + if(lua_dump(L, plua_writer, module) != 0) { + logprintf(LOG_ERR, "cannot dump lua file: %s", file); + lua_pop(L, 1); + FREE(module->bytecode); + FREE(module); + return; + } + + lua_pcall(L, 0, LUA_MULTRET, 0); + + if(lua_istable(L, -1) == 0) { + logprintf(LOG_ERR, "%s: does not return a table", file); + lua_pop(L, 1); + FREE(module->bytecode); + FREE(module); + return; + } + + module->type = type; + strcpy(module->file, file); + if(plua_module_init(L, file, module) != 0) { + memset(p, '\0', sizeof(name)); + switch(module->type) { + case OPERATOR: + sprintf(p, "operator.%s", module->name); + break; + case FUNCTION: + sprintf(p, "function.%s", module->name); + break; + } + + module->next = modules; + modules = module; + } else { + FREE(module->bytecode); + FREE(module); + return; + } + lua_setglobal(L, name); + + for(i=1;ibytecode, module->size, module->name); + } + lua_pcall(L, 0, LUA_MULTRET, 0); + lua_setglobal(L, name); +} + +struct plua_module_t *plua_get_modules(void) { + return modules; +} + +// static void *plua_alloc(void *ud, void *ptr, size_t osize, size_t nsize) { + // if(nsize == 0) { + // if(ptr != NULL) { + // FREE(ptr); + // } + // return 0; + // } else { + // return REALLOC(ptr, nsize); + // } +// } + +void plua_init(void) { + if(init == 1) { + return; + } + init = 1; + + int i = 0; + for(i=0;iL) == NULL) { + uv_mutex_unlock(&state->lock); + return 1; + } + + char name[255], *p = name; + memset(name, '\0', 255); + + switch(type) { + case OPERATOR: { + sprintf(p, "operator.%s", module); + } break; + case FUNCTION: + sprintf(p, "function.%s", module); + break; + } + + lua_getglobal(L, name); + if(lua_isnil(L, -1) != 0) { + lua_pop(L, -1); + return -1; + } + if(lua_istable(L, -1) == 0) { + lua_pop(L, -1); + return -1; + } + lua_pop(L, -1); + + uv_mutex_unlock(&state->lock); + return 0; +} + +int plua_gc(void) { + struct plua_module_t *tmp = NULL; + while(modules) { + tmp = modules; + FREE(tmp->bytecode); + modules = modules->next; + FREE(tmp); + } + int i = 0; + for(i=0;i +#include +#include + +#include "../libs/pilight/core/common.h" + +#define OPERATOR 1 +#define FUNCTION 2 + +typedef struct plua_metatable_t { + struct { + struct varcont_t val; + struct varcont_t key; + } *table; + int nrvar; + int idx; +} plua_metatable_t; + +typedef struct plua_module_t { + char name[255]; + char file[PATH_MAX]; + char version[12]; + char reqversion[12]; + char reqcommit[12]; + void *bytecode; + int size; + int type; + + struct plua_module_t *next; +} plua_module_t; + +typedef struct lua_state_t { + lua_State *L; + uv_mutex_t lock; + struct plua_module_t *module; + struct plua_metatable_t *table; + int idx; +} lua_state_t; + +int plua_metatable_set(lua_State *L); +int plua_metatable_get(lua_State *L); +int plua_metatable_gc(lua_State *L); +int plua_metatable_pairs(lua_State *L); +void plua_stack_dump(lua_State *L); +void plua_module_load(char *, int); +int plua_module_exists(char *, int); +void plua_metatable_clone(struct plua_metatable_t **, struct plua_metatable_t **); +struct lua_state_t *plua_get_free_state(void); +struct lua_state_t *plua_get_current_state(lua_State *L); +struct plua_module_t *plua_get_modules(void); +void plua_init(void); +int plua_gc(void); + +#endif \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/lua/lualibrary.c b/lib/ESPiLight/pilight/libs/pilight/lua/lualibrary.c new file mode 100644 index 0000000..e4d16a4 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/lua/lualibrary.c @@ -0,0 +1,623 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef _WIN32 + #include + #include + #include + #include + #include +#endif + +#include "../core/pilight.h" +#include "../core/common.h" +#include "../core/strptime.h" +#include "../core/datetime.h" +#include "../core/dso.h" +#include "../core/log.h" +#include "../core/cast.h" +#include "../protocols/protocol.h" +#ifdef PILIGHT_REWRITE +#include "../storage/storage.h" +#else +#include "../config/devices.h" +#endif +#include "lua.h" + +typedef struct lua_thread_t { + lua_state_t *state; + char *callback; +} lua_thread_t; + +static int plua_toboolean(struct lua_State *L) { + char buf[128] = { '\0' }, *p = buf; + char *error = "string, number, or boolean expected, got %s"; + sprintf(p, error, lua_typename(L, lua_type(L, 1))); + + luaL_argcheck(L, + (lua_isstring(L, 1) || lua_isnumber(L, 1) || lua_isboolean(L, 1)), + 1, buf); + + switch(lua_type(L, 1)) { + case LUA_TSTRING: { + const char *str = lua_tostring(L, 1); + if(strcmp(str, "0") == 0 || strlen(str) == 0) { + lua_pop(L, -1); + lua_pushboolean(L, 0); + } else { + lua_pop(L, -1); + lua_pushboolean(L, 1); + } + } break; + case LUA_TNUMBER: { + int num = (int)lua_tonumber(L, 1); + lua_pop(L, -1); + lua_pushboolean(L, num); + } break; + case LUA_TBOOLEAN: { + // int b = lua_toboolean(L, 1); + // lua_pop(L, -1); + // lua_pushboolean(L, b); + } break; + } + + return 1; +} + +static int plua_tonumber(struct lua_State *L) { + char buf[128] = { '\0' }, *p = buf; + char *error = "string, number, or boolean expected, got %s"; + sprintf(p, error, lua_typename(L, lua_type(L, 1))); + + luaL_argcheck(L, + (lua_isstring(L, 1) || lua_isnumber(L, 1) || lua_isboolean(L, 1)), + 1, buf); + + switch(lua_type(L, 1)) { + case LUA_TSTRING: { + const char *str = lua_tostring(L, 1); + float num = atof(str); + lua_pop(L, -1); + lua_pushnumber(L, num); + } break; + case LUA_TNUMBER: { + // float num = lua_tonumber(L, 1); + // lua_pop(L, -1); + // lua_pushnumber(L, num); + } break; + case LUA_TBOOLEAN: { + int b = lua_toboolean(L, 1); + lua_pop(L, -1); + if(b == 0) { + lua_pushnumber(L, 0); + } else { + lua_pushnumber(L, 1); + } + } break; + } + + return 1; +} + +static int plua_tostring(struct lua_State *L) { + char buf[128] = { '\0' }, *p = buf; + char *error = "string, number, or boolean expected, got %s"; + sprintf(p, error, lua_typename(L, lua_type(L, 1))); + + luaL_argcheck(L, + (lua_isstring(L, 1) || lua_isnumber(L, 1) || lua_isboolean(L, 1)), + 1, buf); + + switch(lua_type(L, 1)) { + case LUA_TSTRING: { + // const char *str = lua_tostring(L, 1); + // lua_pop(L, -1); + // lua_pushstring(L, str); + } break; + case LUA_TNUMBER: { + float num = lua_tonumber(L, 1); + lua_pop(L, -1); + + char *tmp = NULL; + int len = snprintf(NULL, 0, "%.6f", num); + if((tmp = MALLOC(len+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(tmp, 0, len+1); + sprintf(tmp, "%.6f", num); + lua_pushstring(L, tmp); + FREE(tmp); + } break; + case LUA_TBOOLEAN: { + int b = lua_toboolean(L, 1); + lua_pop(L, -1); + if(b == 0) { + lua_pushstring(L, "0"); + } else { + lua_pushstring(L, "1"); + } + } break; + } + + return 1; +} + +static void datetime2table(struct lua_State *L, char *device) { + struct varcont_t val; + struct tm tm; + memset(&tm, 0, sizeof(struct tm)); +#ifdef PILIGHT_REWRITE + char *setting = NULL; + int i = 0; + while(devices_select_settings(ORIGIN_RULE, device, i++, &setting, &val) == 0) { + if(strcmp(setting, "year") == 0) { + tm.tm_year = val.number_-1900; + } + if(strcmp(setting, "month") == 0) { + tm.tm_mon = val.number_-1; + } + if(strcmp(setting, "day") == 0) { + tm.tm_mday = val.number_; + } + if(strcmp(setting, "hour") == 0) { + tm.tm_hour = val.number_; + } + if(strcmp(setting, "minute") == 0) { + tm.tm_min = val.number_; + } + if(strcmp(setting, "second") == 0) { + tm.tm_sec = val.number_; + } + if(strcmp(setting, "weekday") == 0) { + tm.tm_wday = val.number_-1; + } + if(strcmp(setting, "dst") == 0) { + tm.tm_isdst = val.number_; + } + } +#else + struct devices_t *dev = NULL; + if(devices_get(device, &dev) == 0) { + struct devices_settings_t *tmp_settings = dev->settings; + while(tmp_settings) { + val.type_ = tmp_settings->values->type; + if(val.type_ == JSON_STRING) { + val.string_ = tmp_settings->values->string_; + } else if(val.type_ == JSON_NUMBER) { + val.number_ = tmp_settings->values->number_; + val.decimals_ = tmp_settings->values->decimals; + } + if(strcmp(tmp_settings->name, "year") == 0) { + tm.tm_year = val.number_-1900; + } + if(strcmp(tmp_settings->name, "month") == 0) { + tm.tm_mon = val.number_-1; + } + if(strcmp(tmp_settings->name, "day") == 0) { + tm.tm_mday = val.number_; + } + if(strcmp(tmp_settings->name, "hour") == 0) { + tm.tm_hour = val.number_; + } + if(strcmp(tmp_settings->name, "minute") == 0) { + tm.tm_min = val.number_; + } + if(strcmp(tmp_settings->name, "second") == 0) { + tm.tm_sec = val.number_; + } + if(strcmp(tmp_settings->name, "weekday") == 0) { + tm.tm_wday = val.number_-1; + } + if(strcmp(tmp_settings->name, "dst") == 0) { + tm.tm_isdst = val.number_; + } + tmp_settings = tmp_settings->next; + } + } +#endif +int year = tm.tm_year+1900; + int month = tm.tm_mon+1; + int day = tm.tm_mday; + int hour = tm.tm_hour; + int minute = tm.tm_min; + int second = tm.tm_sec; + int weekday = tm.tm_wday; + + datefix(&year, &month, &day, &hour, &minute, &second, &weekday); + + lua_createtable(L, 0, 2); + + lua_pushstring(L, "type"); + lua_pushnumber(L, DATETIME); + lua_settable(L, -3); + + lua_pushstring(L, "year"); + lua_pushnumber(L, year); + lua_settable(L, -3); + + lua_pushstring(L, "month"); + lua_pushnumber(L, month); + lua_settable(L, -3); + + lua_pushstring(L, "day"); + lua_pushnumber(L, day); + lua_settable(L, -3); + + lua_pushstring(L, "hour"); + lua_pushnumber(L, hour); + lua_settable(L, -3); + + lua_pushstring(L, "min"); + lua_pushnumber(L, minute); + lua_settable(L, -3); + + lua_pushstring(L, "sec"); + lua_pushnumber(L, second); + lua_settable(L, -3); + + lua_pushstring(L, "weekday"); + lua_pushnumber(L, weekday); + lua_settable(L, -3); +} + +static int plua_getdevice(struct lua_State *L) { + if(lua_gettop(L) != 1) { + luaL_error(L, "pilight.plua_getdevice requires 1 arguments, %d given", lua_gettop(L)); + return 0; + } + char buf[128] = { '\0' }, *p = buf; + char *error = "string expected, got %s"; + sprintf(p, error, lua_typename(L, lua_type(L, 1))); + + luaL_argcheck(L, + (lua_isstring(L, 1)), + 1, buf); + + const char *device = NULL; + if(lua_type(L, -1) == LUA_TSTRING) { + device = lua_tostring(L, -1); + lua_pop(L, 1); + } + char *d = (char *)device; + +#ifdef PILIGHT_REWRITE + if(devices_select(ORIGIN_RULE, d, NULL) == 0) { + struct protocol_t *protocol = NULL; + if(devices_select_protocol(ORIGIN_RULE, d, 0, &protocol) == 0) { + if(protocol->devtype == DATETIME) { + datetime2table(L, d); + } + } +#else + struct devices_t *dev = NULL; + if(devices_get(d, &dev) == 0) { + struct protocols_t *tmp = dev->protocols; + while(tmp) { + if(tmp->listener->devtype == DATETIME) { + datetime2table(L, d); + } + tmp = tmp->next; + } +#endif + } else { + // luaL_error(L, "device \"%s\" does not exist", d); + return 0; + } + + return 1; +} + +static int plua_strptime(struct lua_State *L) { + if(lua_gettop(L) != 2) { + luaL_error(L, "pilight.strptime requires 2 arguments, %d given", lua_gettop(L)); + return 0; + } + char buf[128] = { '\0' }, *p = buf; + char *error = "string expected, got %s"; + sprintf(p, error, lua_typename(L, lua_type(L, 1))); + + luaL_argcheck(L, + (lua_isstring(L, 1)), + 1, buf); + + sprintf(p, error, lua_typename(L, lua_type(L, 2))); + luaL_argcheck(L, + (lua_isstring(L, 2)), + 2, buf); + + const char *datetime = NULL; + const char *format = NULL; + if(lua_type(L, -1) == LUA_TSTRING) { + datetime = lua_tostring(L, -1); + lua_pop(L, 1); + } + if(lua_type(L, -1) == LUA_TSTRING) { + format = lua_tostring(L, -1); + lua_pop(L, 1); + } + + struct tm tm; + memset(&tm, 0, sizeof(struct tm)); + if(strptime(datetime, format, &tm) == NULL) { + luaL_error(L, "pilight.strptime is unable to parse \"%s\" as \"%s\" ", datetime, format); + return 0; + } + + int year = tm.tm_year+1900; + int month = tm.tm_mon+1; + int day = tm.tm_mday; + int hour = tm.tm_hour; + int minute = tm.tm_min; + int second = tm.tm_sec; + int weekday = tm.tm_wday; + + datefix(&year, &month, &day, &hour, &minute, &second, &weekday); + + lua_createtable(L, 0, 2); + + lua_pushstring(L, "year"); + lua_pushnumber(L, year); + lua_settable(L, -3); + + lua_pushstring(L, "month"); + lua_pushnumber(L, month); + lua_settable(L, -3); + + lua_pushstring(L, "day"); + lua_pushnumber(L, day); + lua_settable(L, -3); + + lua_pushstring(L, "hour"); + lua_pushnumber(L, hour); + lua_settable(L, -3); + + lua_pushstring(L, "min"); + lua_pushnumber(L, minute); + lua_settable(L, -3); + + lua_pushstring(L, "sec"); + lua_pushnumber(L, second); + lua_settable(L, -3); + + lua_pushstring(L, "weekday"); + lua_pushnumber(L, weekday); + lua_settable(L, -3); + + return 1; +} + +static int plua_random(struct lua_State *L) { + if(lua_gettop(L) != 2) { + luaL_error(L, "pilight.random requires 2 arguments, %d given", lua_gettop(L)); + return 0; + } + char buf[128] = { '\0' }, *p = buf; + char *error = "number expected, got %s"; + sprintf(p, error, lua_typename(L, lua_type(L, 1))); + + luaL_argcheck(L, + (lua_isnumber(L, 1)), + 1, buf); + + sprintf(p, error, lua_typename(L, lua_type(L, 2))); + luaL_argcheck(L, + (lua_isnumber(L, 2)), + 2, buf); + + int min = 0, max = 0; + if(lua_type(L, -1) == LUA_TNUMBER || lua_type(L, -1) == LUA_TSTRING) { + max = (int)lua_tonumber(L, -1); + lua_pop(L, 1); + } + if(lua_type(L, -1) == LUA_TNUMBER || lua_type(L, -1) == LUA_TSTRING) { + min = (int)lua_tonumber(L, -1); + lua_pop(L, 1); + } + + struct timeval t1; + gettimeofday(&t1, NULL); + srand(t1.tv_usec * t1.tv_sec); + + int r = rand() / (RAND_MAX + 1.0) * (max - min + 1) + min; + + lua_pushnumber(L, r); + + return 1; +} + +static void thread_free(uv_work_t *req, int status) { + struct lua_thread_t *thread = req->data; + FREE(thread->callback); + FREE(req->data); + FREE(req); +} + +static void thread_callback(uv_work_t *req) { + struct lua_thread_t *thread = req->data; + struct lua_state_t *state = thread->state; + + char name[255], *p = name; + memset(name, '\0', 255); + + switch(state->module->type) { + case FUNCTION: { + sprintf(p, "function.%s", state->module->name); + } break; + case OPERATOR: { + sprintf(p, "operator.%s", state->module->name); + } break; + } + + lua_getglobal(state->L, name); + if(lua_isnil(state->L, -1) != 0) { + logprintf(LOG_ERR, "cannot find %s lua module", name); + return; + } + +#if LUA_VERSION_NUM <= 502 + lua_getfield(state->L, -1, thread->callback); + if(strcmp(lua_typename(state->L, lua_type(state->L, -1)), "function") != 0) { +#else + if(lua_getfield(state->L, -1, thread->callback) == 0) { +#endif + logprintf(LOG_ERR, "%s: thread callback %s does not exist", state->module->file, thread->callback); + return; + } + + lua_newtable(state->L); + lua_createtable(state->L, 0, 1); + lua_pushcfunction(state->L, plua_metatable_get); + lua_setfield(state->L, -2, "__index"); + lua_pushcfunction(state->L, plua_metatable_set); + lua_setfield(state->L, -2, "__newindex"); + lua_pushcfunction(state->L, plua_metatable_gc); + lua_setfield(state->L, -2, "__gc"); + lua_pushcfunction(state->L, plua_metatable_pairs); + lua_setfield(state->L, -2, "__pairs"); + lua_setmetatable(state->L, -2); + + if(lua_pcall(state->L, 1, 0, 0) == LUA_ERRRUN) { + if(strcmp(lua_typename(state->L, lua_type(state->L, -1)), "string") == 0) { + logprintf(LOG_ERR, "%s", lua_tostring(state->L, -1)); + lua_pop(state->L, 1); + return; + } + } + + uv_mutex_unlock(&state->lock); +} + +static int plua_thread(struct lua_State *L) { + if(lua_gettop(L) != 1) { + luaL_error(L, "pilight.devices_select_string_setting requires at least 1 argument, %d given", lua_gettop(L)); + return 0; + } + + const char *func = NULL; + char buf[128] = { '\0' }, *p = buf; + char *error = "string expected, got %s"; + + sprintf(p, error, lua_typename(L, lua_type(L, 1))); + + luaL_argcheck(L, + (lua_isstring(L, 1)), + 1, buf); + + if(lua_type(L, -1) == LUA_TSTRING) { + func = lua_tostring(L, -1); + lua_pop(L, 1); + } + + char name[255]; + memset(name, '\0', 255); + + p = name; + + struct lua_state_t *state = plua_get_current_state(L); + if(state == NULL) { + return 1; + } + + switch(state->module->type) { + case FUNCTION: { + sprintf(p, "function.%s", state->module->name); + } break; + case OPERATOR: { + sprintf(p, "operator.%s", state->module->name); + } break; + } + + lua_getglobal(L, name); + if(lua_isnil(L, -1) != 0) { + logprintf(LOG_ERR, "cannot find %s lua module"); + return 1; + } + +#if LUA_VERSION_NUM <= 502 + lua_getfield(L, -1, func); + if(strcmp(lua_typename(L, lua_type(L, -1)), "function") != 0) { +#else + if(lua_getfield(L, -1, func) == 0) { +#endif + logprintf(LOG_ERR, "%s: thread callback %s does not exist", state->module->file, func); + return 1; + } + + struct lua_state_t *new_state = plua_get_free_state(); + new_state->module = state->module; + + plua_metatable_clone(&state->table, &new_state->table); + + uv_work_t *tp_work_req = MALLOC(sizeof(uv_work_t)); + if(tp_work_req == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + struct lua_thread_t *lua_thread = MALLOC(sizeof(struct lua_thread_t)); + if(lua_thread == NULL) { + OUT_OF_MEMORY + } + lua_thread->state = new_state; + if((lua_thread->callback = STRDUP((char *)func)) == NULL) { + OUT_OF_MEMORY + } + tp_work_req->data = lua_thread; + char *pthname = "lua thread on state #%d"; + memset(buf, 0, sizeof(buf)); + p = buf; + sprintf(p, pthname, new_state->idx); + + if(uv_queue_work(uv_default_loop(), tp_work_req, buf, thread_callback, thread_free) < 0) { + FREE(lua_thread->callback); + FREE(lua_thread); + FREE(tp_work_req); + + uv_mutex_unlock(&new_state->lock); + } + + return 1; +} + +static struct lua_libs { + char *name; + int (*func)(struct lua_State *); +} pilightlib[] = { + {"toboolean", plua_toboolean}, + {"tonumber", plua_tonumber}, + {"tostring", plua_tostring}, + {"strptime", plua_strptime}, + {"getdevice", plua_getdevice}, + {"random", plua_random}, + {"thread", plua_thread}, + {NULL, NULL} +}; + +void plua_register_library(struct lua_State *L) { + int i = 0; + /* + * Register pilight lua library + */ + lua_newtable(L); + while(pilightlib[i].name != NULL) { + lua_pushcfunction(L, pilightlib[i].func); + lua_setfield(L, -2, pilightlib[i].name); + i++; + } + lua_pushvalue(L, -1); + lua_setglobal(L, "pilight"); +} \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/lua/lualibrary.h b/lib/ESPiLight/pilight/libs/pilight/lua/lualibrary.h new file mode 100644 index 0000000..78f631c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/lua/lualibrary.h @@ -0,0 +1,16 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#ifndef _PLUA_LIBRARY_H_ +#define _PLUA_LIBRARY_H_ + +#include "lua.h" + +void plua_register_library(struct lua_State *); + +#endif \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/CMakeExclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/CMakeExclude.txt new file mode 100644 index 0000000..b6ec939 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/CMakeExclude.txt @@ -0,0 +1,257 @@ +include(../../../../CMakeConfig.txt) + +if(${PROTOCOL_ALECTO_WSD17} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/alecto_wsd17.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/alecto_wsd17.h") +endif() + +if(${PROTOCOL_ALECTO_WX500} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/alecto_wx500.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/alecto_wx500.h") +endif() + +if(${PROTOCOL_COGEX_SWITCH} MATCHES "OFF" + AND ${PROTOCOL_KAKU_SWITCH_OLD} MATCHES "OFF" + AND ${PROTOCOL_BYEBYESTANDBY_SWITCH} MATCHES "OFF" + AND ${PROTOCOL_DUWI_SWITCH} MATCHES "OFF" + AND ${PROTOCOL_PROMAX_SWITCH} MATCHES "OFF" + AND ${PROTOCOL_INTERTECHNO_OLD} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/arctech_switch_old.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/arctech_switch_old.h") +endif() + +if(${PROTOCOL_RSL366} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/rsl366.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/rsl366.h") +endif() + +if(${PROTOCOL_DAYCOM} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/daycom.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/daycom.h") +endif() + +if(${PROTOCOL_KAKU_SCREEN_OLD} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/arctech_screen_old.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/arctech_screen_old.h") +endif() + +if(${PROTOCOL_KAKU_DUSK} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/arctech_dusk.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/arctech_dusk.h") +endif() + +if(${PROTOCOL_KAKU_MOTION} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/arctech_motion.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/arctech_motion.h") +endif() + +if(${PROTOCOL_KAKU_DIMMER} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/arctech_dimmer.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/arctech_dimmer.h") +endif() + +if(${PROTOCOL_KAKU_SCREEN} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/arctech_screen.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/arctech_screen.h") +endif() + +if(${PROTOCOL_KAKU_CONTACT} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/arctech_contact.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/arctech_contact.h") +endif() + +if(${PROTOCOL_COCO_SWITCH} MATCHES "OFF" + AND ${PROTOCOL_DIO_SWITCH} MATCHES "OFF" + AND ${PROTOCOL_NEXA_SWITCH} MATCHES "OFF" + AND ${PROTOCOL_KAKU_SWITCH} MATCHES "OFF" + AND ${PROTOCOL_INTERTECHNO_SWITCH} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/arctech_switch.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/arctech_switch.h") +endif() + +if(${PROTOCOL_ELRO_SWITCH} MATCHES "OFF" AND ${PROTOCOL_BRENNENSTUHL_SWITCH} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/elro_300_switch.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/elro_400_switch.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/elro_800_switch.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/elro_300_switch.h") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/elro_400_switch.h") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/elro_800_switch.h") +endif() + +if(${PROTOCOL_ELRO_CONTACT} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/elro_800_contact.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/elro_800_contact.h") +endif() + +if(${PROTOCOL_EURODOMEST_SWITCH} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/eurodomest_switch.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/eurodomest_switch.h") +endif() + +if(${PROTOCOL_IMPULS} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/impuls.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/impuls.h") +endif() + +if(${PROTOCOL_SELECTREMOTE} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/selectremote.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/selectremote.h") +endif() + +if(${PROTOCOL_EHOME} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/ehome.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/ehome.h") +endif() + +if(${PROTOCOL_RAW} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/raw.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/raw.h") +endif() + +if(${PROTOCOL_REV} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/rev_v1.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/rev_v2.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/rev_v3.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/rev_v1.h") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/rev_v2.h") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/rev_v3.h") +endif() + +if(${PROTOCOL_CLARUS} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/clarus.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/clarus.h") +endif() + +if(${PROTOCOL_CONRAD_RSL_SWITCH} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/conrad_rsl_switch.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/conrad_rsl_switch.h") +endif() + +if(${PROTOCOL_CONRAD_WEATHER} MATCHES "OFF" + AND ${PROTOCOL_TFA} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/tfa.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/tfa30.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/tfa.h") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/tfa30.h") +endif() + +if(${PROTOCOL_CONRAD_RSL_CONTACT} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/conrad_rsl_contact.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/conrad_rsl_contact.h") +endif() + +if(${PROTOCOL_POLLIN_SWITCH} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/pollin.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/pollin.h") +endif() + +if(${PROTOCOL_QUIGG_GT7000} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/quigg_gt7000.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/quigg_gt7000.h") +endif() + +if(${PROTOCOL_MUMBI_SWITCH} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/mumbi.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/mumbi.h") +endif() + +if(${PROTOCOL_SILVERCREST} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/silvercrest.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/silvercrest.h") +endif() + +if(${PROTOCOL_CLEVERWATTS} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/cleverwatts.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/cleverwatts.h") +endif() + +if(${PROTOCOL_ALECTO_WS1700} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/alecto_ws1700.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/alecto_ws1700.h") +endif() + +if(${PROTOCOL_AURIOL} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/auriol.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/auriol.h") +endif() + +if(${PROTOCOL_TEKNIHALL} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/teknihall.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/teknihall.h") +endif() + +if(${PROTOCOL_X10} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/x10.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/x10.h") +endif() + +if(${PROTOCOL_EV1527} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/ev1527.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/ev1527.h") +endif() + +if(${PROTOCOL_BEAMISH_SWITCH} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/beamish_switch.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/beamish_switch.h") +endif() + +if(${PROTOCOL_QUIGG_SCREEN} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/quigg_screen.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/quigg_screen.h") +endif() + +if(${PROTOCOL_NINJABLOCKS_WEATHER} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/ninjablocks_weather.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/ninjablocks_weather.h") +endif() + +if(${PROTOCOL_TECHLICO} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/techlico_switch.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/techlico_switch.h") +endif() + +if(${PROTOCOL_SC2262} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/sc2262.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/sc2262.h") +endif() + +if(${PROTOCOL_RC101} MATCHES "OFF" AND + ${PROTOCOL_RC102} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/rc101.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/rc101.h") +endif() + +if(${PROTOCOL_QUIGG_GT1000} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/quigg_gt1000.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/quigg_gt1000.h") +endif() + +if(${PROTOCOL_LOGILINK_SWITCH} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/logilink_switch.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/logilink_switch.h") +endif() + +if(${PROTOCOL_HEITECH} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/heitech.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/heitech.h") +endif() + +if(${PROTOCOL_HEITECH} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/heitech.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/heitech.h") +endif() + +if(${PROTOCOL_SECUDO_SMOKE} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/secudo_smoke.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/secudo_smoke.h") +endif() + +if(${PROTOCOL_TCM} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/tcm.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/tcm.h") +endif() + +if(${PROTOCOL_LIVOLO_SWITCH} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/livolo_switch.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/livolo_switch.h") +endif() diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/CMakeInclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/CMakeInclude.txt new file mode 100644 index 0000000..496cba9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/CMakeInclude.txt @@ -0,0 +1,30 @@ +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/protocol_init.h") +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/protocol_header.h") + +set(headers) +foreach(header ${${PROJECT_NAME}_headers}) + string(REPLACE "${PROJECT_SOURCE_DIR}/" " #include \"" header1 ${header}) + string(REPLACE ".h" ".h\"!" header2 ${header1}) + list(APPEND headers ${header2}) +endforeach(header) + +string(REPLACE "!" "\n" header4 ${headers}) +set(PROTOCOL_HEADERS ${header4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_header.h.in ${PROJECT_SOURCE_DIR}/protocol_header.h) + +execute_process( +COMMAND grep -h "void .*Init(void)" ${${PROJECT_NAME}_sources} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE protocol_result + OUTPUT_VARIABLE protocol_init) + +set(inits) +foreach(init ${protocol_init}) + string(REPLACE "void " " " init1 ${init}) + string(REPLACE "(void) {" "()!" init2 ${init1}) + list(APPEND inits ${init2}) +endforeach(init) + +string(REPLACE "!" ";" init4 ${inits}) +set(PROTOCOL_INIT ${init4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_init.h.in ${PROJECT_SOURCE_DIR}/protocol_init.h) diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/CMakeLists.txt new file mode 100644 index 0000000..2bebfdc --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/CMakeLists.txt @@ -0,0 +1,9 @@ +project(pilight_protocols_433.92) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +include(CMakeExclude.txt) +include(CMakeInclude.txt) + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/alecto_ws1700.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/alecto_ws1700.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/alecto_ws1700.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/alecto_ws1700.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/alecto_ws1700.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/alecto_ws1700.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/alecto_ws1700.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/alecto_ws1700.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/alecto_wsd17.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/alecto_wsd17.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/alecto_wsd17.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/alecto_wsd17.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/alecto_wsd17.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/alecto_wsd17.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/alecto_wsd17.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/alecto_wsd17.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/alecto_wx500.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/alecto_wx500.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/alecto_wx500.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/alecto_wx500.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/alecto_wx500.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/alecto_wx500.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/alecto_wx500.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/alecto_wx500.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_contact.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_contact.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_contact.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_contact.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_contact.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_contact.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_contact.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_contact.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_dimmer.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_dimmer.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_dimmer.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_dimmer.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_dimmer.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_dimmer.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_dimmer.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_dimmer.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_dusk.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_dusk.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_dusk.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_dusk.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_dusk.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_dusk.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_dusk.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_dusk.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_motion.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_motion.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_motion.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_motion.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_motion.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_motion.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_motion.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_motion.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_screen.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_screen.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_screen.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_screen.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_screen.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_screen.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_screen.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_screen.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_screen_old.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_screen_old.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_screen_old.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_screen_old.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_screen_old.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_screen_old.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_screen_old.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_screen_old.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_switch.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_switch.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_switch.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_switch.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_switch.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_switch.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_switch.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_switch.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_switch_old.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_switch_old.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_switch_old.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_switch_old.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_switch_old.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_switch_old.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/arctech_switch_old.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/arctech_switch_old.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/auriol.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/auriol.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/auriol.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/auriol.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/auriol.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/auriol.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/auriol.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/auriol.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/beamish_switch.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/beamish_switch.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/beamish_switch.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/beamish_switch.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/beamish_switch.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/beamish_switch.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/beamish_switch.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/beamish_switch.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/clarus.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/clarus.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/clarus.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/clarus.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/clarus.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/clarus.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/clarus.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/clarus.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/cleverwatts.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/cleverwatts.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/cleverwatts.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/cleverwatts.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/cleverwatts.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/cleverwatts.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/cleverwatts.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/cleverwatts.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/conrad_rsl_contact.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/conrad_rsl_contact.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/conrad_rsl_contact.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/conrad_rsl_contact.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/conrad_rsl_contact.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/conrad_rsl_contact.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/conrad_rsl_contact.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/conrad_rsl_contact.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/conrad_rsl_switch.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/conrad_rsl_switch.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/conrad_rsl_switch.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/conrad_rsl_switch.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/conrad_rsl_switch.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/conrad_rsl_switch.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/conrad_rsl_switch.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/conrad_rsl_switch.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/daycom.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/daycom.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/daycom.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/daycom.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/daycom.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/daycom.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/daycom.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/daycom.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/ehome.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/ehome.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/ehome.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/ehome.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/ehome.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/ehome.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/ehome.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/ehome.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_300_switch.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_300_switch.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_300_switch.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_300_switch.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_300_switch.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_300_switch.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_300_switch.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_300_switch.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_400_switch.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_400_switch.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_400_switch.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_400_switch.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_400_switch.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_400_switch.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_400_switch.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_400_switch.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_800_contact.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_800_contact.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_800_contact.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_800_contact.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_800_contact.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_800_contact.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_800_contact.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_800_contact.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_800_switch.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_800_switch.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_800_switch.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_800_switch.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_800_switch.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_800_switch.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/elro_800_switch.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/elro_800_switch.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/eurodomest_switch.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/eurodomest_switch.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/eurodomest_switch.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/eurodomest_switch.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/eurodomest_switch.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/eurodomest_switch.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/eurodomest_switch.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/eurodomest_switch.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/ev1527.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/ev1527.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/ev1527.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/ev1527.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/ev1527.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/ev1527.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/ev1527.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/ev1527.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/heitech.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/heitech.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/heitech.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/heitech.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/heitech.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/heitech.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/heitech.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/heitech.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/impuls.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/impuls.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/impuls.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/impuls.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/impuls.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/impuls.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/impuls.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/impuls.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/livolo_switch.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/livolo_switch.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/livolo_switch.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/livolo_switch.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/livolo_switch.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/livolo_switch.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/livolo_switch.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/livolo_switch.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/logilink_switch.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/logilink_switch.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/logilink_switch.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/logilink_switch.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/logilink_switch.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/logilink_switch.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/logilink_switch.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/logilink_switch.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/mumbi.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/mumbi.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/mumbi.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/mumbi.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/mumbi.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/mumbi.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/mumbi.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/mumbi.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/ninjablocks_weather.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/ninjablocks_weather.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/ninjablocks_weather.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/ninjablocks_weather.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/ninjablocks_weather.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/ninjablocks_weather.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/ninjablocks_weather.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/ninjablocks_weather.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/pollin.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/pollin.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/pollin.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/pollin.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/pollin.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/pollin.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/pollin.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/pollin.h diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/protocol_header.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/protocol_header.h.in new file mode 100644 index 0000000..da97564 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/protocol_header.h.in @@ -0,0 +1 @@ +@PROTOCOL_HEADERS@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/protocol_init.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/protocol_init.h.in new file mode 100644 index 0000000..40bdc9d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/protocol_init.h.in @@ -0,0 +1 @@ +@PROTOCOL_INIT@ \ No newline at end of file diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_gt1000.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_gt1000.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_gt1000.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_gt1000.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_gt1000.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_gt1000.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_gt1000.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_gt1000.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_gt7000.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_gt7000.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_gt7000.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_gt7000.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_gt7000.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_gt7000.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_gt7000.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_gt7000.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_gt9000.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_gt9000.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_gt9000.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_gt9000.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_gt9000.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_gt9000.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_gt9000.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_gt9000.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_screen.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_screen.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_screen.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_screen.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_screen.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_screen.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/quigg_screen.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/quigg_screen.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rc101.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rc101.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rc101.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rc101.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rc101.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rc101.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rc101.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rc101.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rev_v1.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rev_v1.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rev_v1.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rev_v1.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rev_v1.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rev_v1.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rev_v1.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rev_v1.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rev_v2.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rev_v2.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rev_v2.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rev_v2.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rev_v2.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rev_v2.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rev_v2.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rev_v2.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rev_v3.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rev_v3.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rev_v3.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rev_v3.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rev_v3.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rev_v3.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rev_v3.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rev_v3.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rsl366.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rsl366.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rsl366.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rsl366.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rsl366.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rsl366.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/rsl366.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/rsl366.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/sc2262.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/sc2262.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/sc2262.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/sc2262.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/sc2262.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/sc2262.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/sc2262.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/sc2262.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/secudo_smoke.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/secudo_smoke.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/secudo_smoke.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/secudo_smoke.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/secudo_smoke.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/secudo_smoke.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/secudo_smoke.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/secudo_smoke.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/selectremote.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/selectremote.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/selectremote.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/selectremote.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/selectremote.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/selectremote.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/selectremote.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/selectremote.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/silvercrest.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/silvercrest.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/silvercrest.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/silvercrest.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/silvercrest.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/silvercrest.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/silvercrest.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/silvercrest.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/tcm.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/tcm.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/tcm.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/tcm.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/tcm.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/tcm.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/tcm.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/tcm.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/techlico_switch.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/techlico_switch.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/techlico_switch.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/techlico_switch.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/techlico_switch.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/techlico_switch.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/techlico_switch.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/techlico_switch.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/teknihall.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/teknihall.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/teknihall.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/teknihall.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/teknihall.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/teknihall.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/teknihall.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/teknihall.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/tfa.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/tfa.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/tfa.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/tfa.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/tfa.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/tfa.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/tfa.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/tfa.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/tfa30.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/tfa30.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/tfa30.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/tfa30.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/tfa30.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/tfa30.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/tfa30.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/tfa30.h diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/x10.c b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/x10.c old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/x10.c rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/x10.c diff --git a/lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/x10.h b/lib/ESPiLight/pilight/libs/pilight/protocols/433.92/x10.h old mode 100755 new mode 100644 similarity index 100% rename from lib/ESPiLight/src/pilight/libs/pilight/protocols/433.92/x10.h rename to lib/ESPiLight/pilight/libs/pilight/protocols/433.92/x10.h diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/CMakeExclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/API/CMakeExclude.txt new file mode 100644 index 0000000..23336f5 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/CMakeExclude.txt @@ -0,0 +1,41 @@ +include(../../../../CMakeConfig.txt) + +if(${PROTOCOL_CPU_TEMP} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/cpu_temp.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/cpu_temp.h") +endif() + +if(${PROTOCOL_WUNDERGROUND} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/wunderground.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/wunderground.h") +endif() + +if(${PROTOCOL_OPENWEATHERMAP} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/openweathermap.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/openweathermap.h") +endif() + +if(${PROTOCOL_SUNRISESET} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/sunriseset.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/sunriseset.h") +endif() + +if(${PROTOCOL_PROGRAM} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/program.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/program.h") +endif() + +if(${PROTOCOL_DATETIME} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/datetime.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/datetime.h") +endif() + +if(${PROTOCOL_XBMC} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/xbmc.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/xbmc.h") +endif() + +if(${PROTOCOL_LIRC} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/lirc.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/lirc.h") +endif() diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/CMakeInclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/API/CMakeInclude.txt new file mode 100644 index 0000000..496cba9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/CMakeInclude.txt @@ -0,0 +1,30 @@ +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/protocol_init.h") +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/protocol_header.h") + +set(headers) +foreach(header ${${PROJECT_NAME}_headers}) + string(REPLACE "${PROJECT_SOURCE_DIR}/" " #include \"" header1 ${header}) + string(REPLACE ".h" ".h\"!" header2 ${header1}) + list(APPEND headers ${header2}) +endforeach(header) + +string(REPLACE "!" "\n" header4 ${headers}) +set(PROTOCOL_HEADERS ${header4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_header.h.in ${PROJECT_SOURCE_DIR}/protocol_header.h) + +execute_process( +COMMAND grep -h "void .*Init(void)" ${${PROJECT_NAME}_sources} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE protocol_result + OUTPUT_VARIABLE protocol_init) + +set(inits) +foreach(init ${protocol_init}) + string(REPLACE "void " " " init1 ${init}) + string(REPLACE "(void) {" "()!" init2 ${init1}) + list(APPEND inits ${init2}) +endforeach(init) + +string(REPLACE "!" ";" init4 ${inits}) +set(PROTOCOL_INIT ${init4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_init.h.in ${PROJECT_SOURCE_DIR}/protocol_init.h) diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/API/CMakeLists.txt new file mode 100644 index 0000000..590aae9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/CMakeLists.txt @@ -0,0 +1,9 @@ +project(pilight_protocols_api) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +include(CMakeExclude.txt) +include(CMakeInclude.txt) + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/cpu_temp.c b/lib/ESPiLight/pilight/libs/pilight/protocols/API/cpu_temp.c new file mode 100644 index 0000000..11adc49 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/cpu_temp.c @@ -0,0 +1,398 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif +#endif +#include + +#include "../../core/threads.h" +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/json.h" +#include "../../core/gc.h" +#include "cpu_temp.h" + +#ifndef _WIN32 +#ifdef PILIGHT_DEVELOPMENT +static unsigned short loop = 1; +static unsigned short threads = 0; +static char cpu_path[] = "/sys/class/thermal/thermal_zone0/temp"; + +static pthread_mutex_t lock; +static pthread_mutexattr_t attr; + +static void *thread(void *param) { + struct protocol_threads_t *node = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)node->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct stat st; + + FILE *fp = NULL; + double itmp = 0; + int *id = MALLOC(sizeof(int)); + char *content = NULL; + int nrloops = 0, nrid = 0, y = 0, interval = 0; + double temp_offset = 0.0; + size_t bytes = 0; + + threads++; + + if(id == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + if(json_find_number(jchild, "id", &itmp) == 0) { + id = REALLOC(id, (sizeof(int)*(size_t)(nrid+1))); + id[nrid] = (int)round(itmp); + nrid++; + } + jchild = jchild->next; + } + } + + if(json_find_number(json, "poll-interval", &itmp) == 0) + interval = (int)round(itmp); + json_find_number(json, "temperature-offset", &temp_offset); + + while(loop) { + if(protocol_thread_wait(node, interval, &nrloops) == ETIMEDOUT) { + pthread_mutex_lock(&lock); + for(y=0;ymessage = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "id", json_mknumber(id[y], 0)); + json_append_member(code, "temperature", json_mknumber((temp/1000), 3)); + + json_append_member(cpuTemp->message, "message", code); + json_append_member(cpuTemp->message, "origin", json_mkstring("receiver")); + json_append_member(cpuTemp->message, "protocol", json_mkstring(cpuTemp->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(cpuTemp->id, cpuTemp->message, PROTOCOL); + } + json_delete(cpuTemp->message); + cpuTemp->message = NULL; + } + } else { + logprintf(LOG_NOTICE, "CPU sysfs \"%s\" does not exist", cpu_path); + } + } + pthread_mutex_unlock(&lock); + } + } + pthread_mutex_unlock(&lock); + + FREE(id); + threads--; + return (void *)NULL; +} +#else + +static char cpu_path[PATH_MAX] = "/sys/class/thermal/thermal_zone0/temp"; + +typedef struct data_t { + char *name; + int id; + int interval; + uv_timer_t *timer_req; + double temp_offset; + struct data_t *next; +} data_t; + +static struct data_t *data = NULL; + +#ifdef PILIGHT_REWRITE +static void *reason_code_received_free(void *param) { + struct reason_code_received_t *data = param; + FREE(data); + return NULL; +} +#endif + +static void *thread(void *param) { + uv_timer_t *timer_req = param; + struct data_t *settings = timer_req->data; + FILE *fp = NULL; + struct stat st; + char *content = NULL; + size_t bytes = 0; + + if((fp = fopen(cpu_path, "rb"))) { + fstat(fileno(fp), &st); + bytes = (size_t)st.st_size; + if((content = REALLOC(content, bytes+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(content, '\0', bytes+1); + + if(fread(content, sizeof(char), bytes, fp) == -1) { + logprintf(LOG_NOTICE, "cannot read file: %s", cpu_path); + fclose(fp); + return NULL; + } else { + fclose(fp); + double temp = atof(content)+settings->temp_offset; + FREE(content); + +#ifdef PILIGHT_DEVELOPMENT + struct reason_code_received_t *data = MALLOC(sizeof(struct reason_code_received_t)); + if(data == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + snprintf(data->message, 1024, "{\"id\":%d,\"temperature\":%.3f}", settings->id, (temp/1000)); + strcpy(data->origin, "receiver"); + data->protocol = cpuTemp->id; + if(strlen(pilight_uuid) > 0) { + data->uuid = pilight_uuid; + } else { + data->uuid = NULL; + } + data->repeat = 1; + eventpool_trigger(REASON_CODE_RECEIVED, reason_code_received_free, data); +#else + char message[1024]; + snprintf(message, 1024, + "{\"origin\":\"receiver\",\"protocol\":\"%s\",\"message\":"\ + "{\"id\":%d,\"temperature\":%.3f}"\ + "}", + cpuTemp->id, settings->id, (temp/1000) + ); + + cpuTemp->message = json_decode(message); + + if(pilight.broadcast != NULL) { + pilight.broadcast(cpuTemp->id, cpuTemp->message, PROTOCOL); + } + json_delete(cpuTemp->message); + cpuTemp->message = NULL; +#endif + } + } else { + logprintf(LOG_NOTICE, "CPU sysfs \"%s\" does not exists", cpu_path); + } + + return (void *)NULL; +} +#endif + +static struct threadqueue_t *initDev(struct JsonNode *jdevice) { +#ifdef PILIGHT_DEVELOPMENT + loop = 1; + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(cpuTemp, json); + return threads_register("cpu_temp", &thread, (void *)node, 0); +#else +#ifdef PILIGHT_REWRITE + struct JsonNode *jdevice = NULL; +#endif + struct JsonNode *jprotocols = NULL; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct data_t *node = NULL; + FILE *fp = NULL; + double itmp = 0; + int match = 0; + +#ifdef PILIGHT_REWRITE + if(param == NULL) { + return NULL; + } + + if((jdevice = json_first_child(param)) == NULL) { + return NULL; + } +#endif + if((jprotocols = json_find_member(jdevice, "protocol")) != NULL) { + jchild = json_first_child(jprotocols); + while(jchild) { + if(strcmp(cpuTemp->id, jchild->string_) == 0) { + match = 1; + break; + } + jchild = jchild->next; + } + } + + if(match == 0) { + return NULL; + } + + if(!(fp = fopen(cpu_path, "rb"))) { + logprintf(LOG_NOTICE, "CPU sysfs \"%s\" does not exists", cpu_path); + return NULL; + } else { + fclose(fp); + } + + if((node = MALLOC(sizeof(struct data_t)))== NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(node, '\0', sizeof(struct data_t)); + node->interval = 10; + node->temp_offset = 0; + + if((jid = json_find_member(jdevice, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + if(json_find_number(jchild, "id", &itmp) == 0) { + node->id = (int)round(itmp); + } + jchild = jchild->next; + } + } + + if(json_find_number(jdevice, "poll-interval", &itmp) == 0) + node->interval = (int)round(itmp); + json_find_number(jdevice, "temperature-offset", &node->temp_offset); + + if((node->name = MALLOC(strlen(jdevice->key)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(node->name, jdevice->key); + node->timer_req = NULL; + node->next = data; + data = node; + + if((node->timer_req = MALLOC(sizeof(uv_timer_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + node->timer_req->data = node; + uv_timer_init(uv_default_loop(), node->timer_req); + assert(node->interval > 0); + uv_timer_start(node->timer_req, (void (*)(uv_timer_t *))thread, node->interval*1000, node->interval*1000); + + return NULL; +#endif +} + +static void threadGC(void) { +#ifdef PILIGHT_DEVELOPMENT + loop = 0; + protocol_thread_stop(cpuTemp); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(cpuTemp); +#else + struct data_t *tmp = NULL; + while(data) { + tmp = data; +#ifndef PILIGHT_REWRITE + uv_timer_stop(data->timer_req); +#endif + FREE(tmp->name); + data = data->next; + FREE(tmp); + } + if(data != NULL) { + FREE(data); + } +#endif +} +#endif + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void cpuTempInit(void) { +#ifndef _WIN32 + #ifdef PILIGHT_DEVELOPMENT + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&lock, &attr); + #endif +#endif + + protocol_register(&cpuTemp); + protocol_set_id(cpuTemp, "cpu_temp"); + protocol_device_add(cpuTemp, "cpu_temp", "CPU temperature sensor"); + cpuTemp->devtype = WEATHER; + cpuTemp->hwtype = SENSOR; + + options_add(&cpuTemp->options, 't', "temperature", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{1,5}$"); + options_add(&cpuTemp->options, 'i', "id", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "[0-9]"); + + // options_add(&cpuTemp->options, 0, "decimals", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)3, "[0-9]"); + options_add(&cpuTemp->options, 0, "temperature-offset", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)0, "[0-9]"); + options_add(&cpuTemp->options, 0, "temperature-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)3, "[0-9]"); + options_add(&cpuTemp->options, 0, "show-temperature", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&cpuTemp->options, 0, "poll-interval", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)10, "[0-9]"); + +#ifndef _WIN32 + cpuTemp->initDev=&initDev; + cpuTemp->threadGC=&threadGC; +#endif +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "cpu_temp"; + module->version = "1.6"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + cpuTempInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/cpu_temp.h b/lib/ESPiLight/pilight/libs/pilight/protocols/API/cpu_temp.h new file mode 100644 index 0000000..9e92bd4 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/cpu_temp.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_CPU_TEMP_H_ +#define _PROTOCOL_CPU_TEMP_H_ + +#include "../protocol.h" + +struct protocol_t *cpuTemp; +void cpuTempInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/datetime.c b/lib/ESPiLight/pilight/libs/pilight/protocols/API/datetime.c new file mode 100644 index 0000000..d4d2f9e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/datetime.c @@ -0,0 +1,474 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #include + #include + #define MSG_NOSIGNAL 0 +#else + #ifdef __mips__ + #define __USE_UNIX98 + #endif + #include + #include + #include + #include + #include + #include +#endif +#include +#include +#include + +#include "../../core/threads.h" +#include "../../core/pilight.h" +#include "../../core/socket.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/ntp.h" +#include "../../core/json.h" +#include "../../core/gc.h" +#include "../../core/datetime.h" +#include "datetime.h" + +#ifdef PILIGHT_DEVELOPMENT +static unsigned short loop = 1; +static unsigned short threads = 0; +static char *format = NULL; + +static pthread_mutex_t lock; + +static void *thread(void *param) { + char UTC[] = "UTC"; + struct protocol_threads_t *thread = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)thread->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct JsonNode *jchild1 = NULL; + struct tm tm; + char *tz = NULL; + time_t t; + int counter = 0; + double longitude = 0.0, latitude = 0.0; + + threads++; + + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + jchild1 = json_first_child(jchild); + while(jchild1) { + if(strcmp(jchild1->key, "longitude") == 0) { + longitude = jchild1->number_; + } + if(strcmp(jchild1->key, "latitude") == 0) { + latitude = jchild1->number_; + } + jchild1 = jchild1->next; + } + jchild = jchild->next; + } + } + + if((tz = coord2tz(longitude, latitude)) == NULL) { + logprintf(LOG_INFO, "datetime #%d, could not determine timezone", threads); + tz = UTC; + } else { + logprintf(LOG_INFO, "datetime #%d %.6f:%.6f seems to be in timezone: %s", threads, longitude, latitude, tz); + } + + t = time(NULL); + if(isntpsynced() == 0) { + t -= getntpdiff(); + } + + while(loop) { + pthread_mutex_lock(&lock); + t = time(NULL); + t -= getntpdiff(); + + /* Get UTC time */ + if(localtime_l(t, &tm, tz) == 0) { + int year = tm.tm_year+1900; + int month = tm.tm_mon+1; + int day = tm.tm_mday; + int hour = tm.tm_hour; + int minute = tm.tm_min; + int second = tm.tm_sec; + int weekday = tm.tm_wday+1; + int dst = tm.tm_isdst; + + datetime->message = json_mkobject(); + + JsonNode *code = json_mkobject(); + json_append_member(code, "longitude", json_mknumber(longitude, 6)); + json_append_member(code, "latitude", json_mknumber(latitude, 6)); + json_append_member(code, "year", json_mknumber(year, 0)); + json_append_member(code, "month", json_mknumber(month, 0)); + json_append_member(code, "day", json_mknumber(day, 0)); + json_append_member(code, "weekday", json_mknumber(weekday, 0)); + json_append_member(code, "hour", json_mknumber(hour, 0)); + json_append_member(code, "minute", json_mknumber(minute, 0)); + json_append_member(code, "second", json_mknumber(second, 0)); + json_append_member(code, "dst", json_mknumber(dst, 0)); + + json_append_member(datetime->message, "message", code); + json_append_member(datetime->message, "origin", json_mkstring("receiver")); + json_append_member(datetime->message, "protocol", json_mkstring(datetime->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(datetime->id, datetime->message, PROTOCOL); + } + + json_delete(datetime->message); + datetime->message = NULL; + counter++; + } + pthread_mutex_unlock(&lock); + sleep(1); + } + pthread_mutex_unlock(&lock); + + threads--; + return (void *)NULL; +} +#else + +static char UTC[] = "UTC"; +static char *format = NULL; +static int time_override = -1; + +typedef struct data_t { + char *name; + int id; + int interval; + uv_timer_t *timer_req; + + double longitude; + double latitude; + + char *tz; + + struct data_t *next; +} data_t; + +static struct data_t *data = NULL; + +#ifdef PILIGHT_REWRITE +static void *reason_code_received_free(void *param) { + struct reason_code_received_t *data = param; + FREE(data); + return NULL; +} + +static void *adaptDevice(int reason, void *param) { + struct JsonNode *jdevice = NULL; + struct JsonNode *jtime = NULL; + + if(param == NULL) { + return NULL; + } + + if((jdevice = json_first_child(param)) == NULL) { + return NULL; + } + + if(strcmp(jdevice->key, "datetime") != 0) { + return NULL; + } + + if((jtime = json_find_member(jdevice, "time-override")) != NULL) { + if(jtime->tag == JSON_NUMBER) { + time_override = jtime->number_; + } + } + + return NULL; +} +#endif + +static void *thread(void *param) { + uv_timer_t *timer_req = param; + struct data_t *settings = timer_req->data; + struct tm tm; + time_t t; + + if(time_override > -1) { + t = time_override; + } else { + t = time(NULL); + if(isntpsynced() == 0) { + t -= getntpdiff(); + } + } + + /* Get UTC time */ + if(localtime_l(t, &tm, settings->tz) == 0) { + int year = tm.tm_year+1900; + int month = tm.tm_mon+1; + int day = tm.tm_mday; + int hour = tm.tm_hour; + int minute = tm.tm_min; + int second = tm.tm_sec; + int weekday = tm.tm_wday+1; + int dst = tm.tm_isdst; + +#ifdef PILIGHT_REWRITE + struct reason_code_received_t *data = MALLOC(sizeof(struct reason_code_received_t)); + if(data == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + snprintf(data->message, 1024, + "{\"longitude\":%.6f,\"latitude\":%.6f,\"year\":%d,\"month\":%d,\"day\":%d,\"weekday\":%d,\"hour\":%d,\"minute\":%d,\"second\":%d,\"dst\":%d}", + settings->longitude, settings->latitude, year, month, day, weekday, hour, minute, second, dst + ); + strncpy(data->origin, "receiver", 255); + data->protocol = datetime->id; + if(strlen(pilight_uuid) > 0) { + data->uuid = pilight_uuid; + } else { + data->uuid = NULL; + } + data->repeat = 1; + eventpool_trigger(REASON_CODE_RECEIVED, reason_code_received_free, data); +#else + char message[1024]; + snprintf(message, 1024, + "{\"origin\":\"receiver\",\"protocol\":\"%s\",\"message\":"\ + "{\"longitude\":%.6f,\"latitude\":%.6f,\"year\":%d,\"month\":%d,\"day\":%d,\"weekday\":%d,\"hour\":%d,\"minute\":%d,\"second\":%d,\"dst\":%d}"\ + "}", + datetime->id, settings->longitude, settings->latitude, year, month, day, weekday, hour, minute, second, dst + ); + + datetime->message = json_decode(message); + + if(pilight.broadcast != NULL) { + pilight.broadcast(datetime->id, datetime->message, PROTOCOL); + } + json_delete(datetime->message); + datetime->message = NULL; +#endif + } + + return (void *)NULL; +} +#endif +static struct threadqueue_t *initDev(JsonNode *jdevice) { +#ifdef PILIGHT_DEVELOPMENT + loop = 1; + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(datetime, json); + return threads_register("datetime", &thread, (void *)node, 0); +#else +#ifdef PILIGHT_REWRITE + struct JsonNode *jdevice = NULL; +#endif + struct JsonNode *jprotocols = NULL; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct JsonNode *jchild1 = NULL; + struct data_t *node = NULL; + int match = 0; + +#ifdef PILIGHT_REWRITE + if(param == NULL) { + return NULL; + } +#endif + + if(!(datetime->masterOnly == 0 || pilight.runmode == STANDALONE)) { + return NULL; + } + +#ifdef PILIGHT_REWRITE + if((jdevice = json_first_child(param)) == NULL) { + return NULL; + } +#endif + if((jprotocols = json_find_member(jdevice, "protocol")) != NULL) { + jchild = json_first_child(jprotocols); + while(jchild) { + if(strcmp(datetime->id, jchild->string_) == 0) { + match = 1; + break; + } + jchild = jchild->next; + } + } + + if(match == 0) { + return NULL; + } + + if((node = MALLOC(sizeof(struct data_t)))== NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(node, '\0', sizeof(struct data_t)); + node->interval = 1; + + if((jid = json_find_member(jdevice, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + jchild1 = json_first_child(jchild); + while(jchild1) { + if(strcmp(jchild1->key, "longitude") == 0) { + node->longitude = jchild1->number_; + } + if(strcmp(jchild1->key, "latitude") == 0) { + node->latitude = jchild1->number_; + } + jchild1 = jchild1->next; + } + jchild = jchild->next; + } + } + + if((node->tz = coord2tz(node->longitude, node->latitude)) == NULL) { + logprintf(LOG_INFO, "datetime %s, could not determine timezone, defaulting to UTC", jdevice->key); + node->tz = UTC; + } else { + logprintf(LOG_INFO, "datetime %s %.6f:%.6f seems to be in timezone: %s", jdevice->key, node->longitude, node->latitude, node->tz); + } + + if((node->name = MALLOC(strlen(jdevice->key)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(node->name, jdevice->key); + + node->next = data; + node->timer_req = NULL; + data = node; + + if((node->timer_req = MALLOC(sizeof(uv_timer_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + node->timer_req->data = node; + uv_timer_init(uv_default_loop(), node->timer_req); + + assert(node->interval > 0); + uv_timer_start(node->timer_req, (void (*)(uv_timer_t *))thread, node->interval*1000, node->interval*1000); +#endif + return NULL; +} + +static void threadGC(void) { +#ifdef PILIGHT_DEVELOPMENT + loop = 0; + + protocol_thread_stop(datetime); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(datetime); +#else + struct data_t *tmp = data; + while(tmp) { +#ifndef PILIGHT_REWRITE + uv_timer_stop(tmp->timer_req); +#endif + tmp = tmp->next; + } +#endif +} + +static void gc(void) { +#ifndef PILIGHT_DEVELOPMENT + struct data_t *tmp = NULL; + while(data) { + tmp = data; +#ifndef PILIGHT_REWRITE + uv_timer_stop(tmp->timer_req); +#endif + FREE(tmp->name); + data = data->next; + FREE(tmp); + } + if(data != NULL) { + FREE(data); + } +#endif + FREE(format); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void datetimeInit(void) { + + if((format = MALLOC(20)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(format, 0, 20); + strncpy(format, "HH:mm:ss YYYY-MM-DD", 19); + + protocol_register(&datetime); + protocol_set_id(datetime, "datetime"); + protocol_device_add(datetime, "datetime", "Date and Time protocol"); + datetime->devtype = DATETIME; + datetime->hwtype = API; + datetime->multipleId = 0; + datetime->masterOnly = 1; + + options_add(&datetime->options, 'o', "longitude", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, NULL); + options_add(&datetime->options, 'a', "latitude", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, NULL); + options_add(&datetime->options, 'y', "year", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{3,4}$"); + options_add(&datetime->options, 'm', "month", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{3,4}$"); + options_add(&datetime->options, 'd', "day", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + options_add(&datetime->options, 'w', "weekday", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + options_add(&datetime->options, 'h', "hour", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + options_add(&datetime->options, 'i', "minute", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + options_add(&datetime->options, 's', "second", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + options_add(&datetime->options, 'z', "dst", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + + options_add(&datetime->options, 0, "show-datetime", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)0, "^[10]{1}$"); + options_add(&datetime->options, 0, "format", OPTION_HAS_VALUE, GUI_SETTING, JSON_STRING, (void *)format, NULL); + + datetime->initDev=&initDev; + datetime->threadGC=&threadGC; + datetime->gc=&gc; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "datetime"; + module->version = "2.6"; + module->reqversion = "6.0"; + module->reqcommit = "115"; +} + +void init(void) { + datetimeInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/datetime.h b/lib/ESPiLight/pilight/libs/pilight/protocols/API/datetime.h new file mode 100644 index 0000000..1c6f1f6 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/datetime.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_DATETIME_H_ +#define _PROTOCOL_DATETIME_H_ + +#include "../protocol.h" + +struct protocol_t *datetime; +void datetimeInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/lirc.c b/lib/ESPiLight/pilight/libs/pilight/protocols/API/lirc.c new file mode 100644 index 0000000..30b0bb9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/lirc.c @@ -0,0 +1,279 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #include + #include + #define MSG_NOSIGNAL 0 +#else + #include + #include + #include + #include + #include + #include + #include +#endif +#include +#include + +#include "../../core/threads.h" +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/socket.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/json.h" +#include "../../core/gc.h" +#include "lirc.h" + +#ifndef _WIN32 +static char socket_path[BUFFER_SIZE]; +static int sockfd = -1; + +static unsigned short loop = 1; +static unsigned short threads = 0; +static unsigned short initialized = 0; + + +// Windows +// #define UNIX_PATH_MAX 108 + +// struct sockaddr_un { + // uint16_t sun_family; + // char sun_path[UNIX_PATH_MAX]; +// }; + +static void *thread(void *param) { + struct protocol_threads_t *node = (struct protocol_threads_t *)param; + struct sockaddr_un addr; + struct timeval timeout; + + int nrloops = 0, n = -1, bytes = 0, retry = 0; + char recvBuff[BUFFER_SIZE]; + fd_set fdsread; + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + /* Clear the server address */ + memset(&addr, '\0', sizeof(addr)); + memset(&recvBuff, '\0', BUFFER_SIZE); + + threads++; + + while(loop) { + if(sockfd > -1) { + close(sockfd); + sockfd = -1; + } + + if(path_exists(socket_path) == EXIT_SUCCESS) { + /* Try to open a new socket */ + if((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { + logprintf(LOG_NOTICE, "could not create Lirc socket"); + break; + } + + addr.sun_family=AF_UNIX; + strcpy(addr.sun_path, socket_path); + + retry = 0; + /* Connect to the server */ + switch(socket_timeout_connect(sockfd, (struct sockaddr *)&addr, 3)) { + case -1: + logprintf(LOG_NOTICE, "could not connect to Lirc socket @%s", socket_path); + protocol_thread_wait(node, 3, &nrloops); + retry = 1; + break; + case -2: + logprintf(LOG_NOTICE, "Lirc socket timeout @%s", socket_path); + protocol_thread_wait(node, 3, &nrloops); + retry = 1; + break; + case -3: + logprintf(LOG_NOTICE, "Error in Lirc socket connection @%s", socket_path); + protocol_thread_wait(node, 3, &nrloops); + retry = 1; + break; + default: + break; + } + if(retry == 1) { + continue; + } + + while(loop) { + FD_ZERO(&fdsread); + FD_SET((unsigned long)sockfd, &fdsread); + + do { + n = select(sockfd+1, &fdsread, NULL, NULL, &timeout); + } while(n == -1 && errno == EINTR && loop); + + if(loop == 0) { + break; + } + + if(path_exists(socket_path) == EXIT_FAILURE) { + break; + } + + if(n == -1) { + break; + } else if(n == 0) { + usleep(100000); + } else if(n > 0) { + if(FD_ISSET((unsigned long)sockfd, &fdsread)) { + bytes = (int)recv(sockfd, recvBuff, BUFFER_SIZE, 0); + if(bytes <= 0) { + break; + } else { + char **nlarray = NULL; + unsigned int e = explode(recvBuff, "\n", &nlarray), t = 0; + for(t=0;t= 3) { + char **array = NULL; + unsigned int q = explode(nlarray[t], " ", &array); + if(q == 4) { + char *code1 = array[0]; + char *rep = array[1]; + char *btn = array[2]; + char *remote = array[3]; + char *y = NULL; + if((y = strstr(remote, "\n")) != NULL) { + size_t pos = (size_t)(y-remote); + remote[pos] = '\0'; + } + int r = strtol(rep, NULL, 16); + lirc->message = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "code", json_mkstring(code1)); + json_append_member(code, "repeat", json_mknumber(r, 0)); + json_append_member(code, "button", json_mkstring(btn)); + json_append_member(code, "remote", json_mkstring(remote)); + + json_append_member(lirc->message, "message", code); + json_append_member(lirc->message, "origin", json_mkstring("receiver")); + json_append_member(lirc->message, "protocol", json_mkstring(lirc->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(lirc->id, lirc->message, PROTOCOL); + } + json_delete(lirc->message); + lirc->message = NULL; + } + array_free(&array, q); + } + } + array_free(&nlarray, t); + memset(recvBuff, '\0', BUFFER_SIZE); + } + } + } + } + } else { + sleep(1); + } + } + + if(sockfd > -1) { + close(sockfd); + sockfd = -1; + } + + threads--; + return (void *)NULL; +} + +struct threadqueue_t *initDev(JsonNode *jdevice) { + loop = 1; + + if(initialized == 0) { + initialized = 1; + struct protocol_threads_t *node = protocol_thread_init(lirc, NULL); + return threads_register("lirc", &thread, (void *)node, 0); + } else { + return NULL; + } +} + +static void threadGC(void) { + loop = 0; + protocol_thread_stop(lirc); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(lirc); + initialized = 0; +} +#endif + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void lircInit(void) { + protocol_register(&lirc); + protocol_set_id(lirc, "lirc"); + protocol_device_add(lirc, "lirc", "Lirc API"); + lirc->devtype = LIRC; + lirc->hwtype = API; + + options_add(&lirc->options, 'c', "code", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&lirc->options, 'a', "repeat", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "[0-9]"); + options_add(&lirc->options, 'b', "button", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&lirc->options, 'r', "remote", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, NULL); + +#ifndef _WIN32 + lirc->initDev=&initDev; + lirc->threadGC=&threadGC; + + memset(socket_path, '\0', BUFFER_SIZE); + strcpy(socket_path, "/dev/lircd"); +#endif +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "lirc"; + module->version = "1.10"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + lircInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/lirc.h b/lib/ESPiLight/pilight/libs/pilight/protocols/API/lirc.h new file mode 100644 index 0000000..c55288d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/lirc.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_LIRC_H_ +#define _PROTOCOL_LIRC_H_ + +#include "../protocol.h" + +struct protocol_t *lirc; +void lircInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/openweathermap.c b/lib/ESPiLight/pilight/libs/pilight/protocols/API/openweathermap.c new file mode 100644 index 0000000..48e6009 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/openweathermap.c @@ -0,0 +1,946 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif +#endif +#include + +#ifndef PILIGHT_DEVELOPMENT +#include +#endif + +#include "../../core/threads.h" +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/datetime.h" // Full path because we also have a datetime protocol +#include "../../core/log.h" +#include "../../core/http.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/json.h" +#include "../../core/gc.h" +#include "openweathermap.h" + +#define INTERVAL 600 + +#ifdef PILIGHT_DEVELOPMENT +typedef struct settings_t { + char *country; + char *location; + protocol_threads_t *thread; + time_t update; + int ointerval; + int interval; + + struct settings_t *next; +} settings_t; + +static pthread_mutex_t lock; +static pthread_mutexattr_t attr; + +static struct settings_t *settings; +static unsigned short loop = 1; +static unsigned short threads = 0; + +static void callback(int code, char *data, int size, char *type, void *userdata) { + struct JsonNode *jdata = NULL; + struct JsonNode *jmain = NULL; + struct JsonNode *jsys = NULL; + struct JsonNode *node = NULL; + double temp = 0, sunrise = 0, sunset = 0, humi = 0; + struct settings_t *wnode = userdata; + + time_t timenow = 0; + struct tm tm; + + if(code == 200) { + if(strstr(type, "application/json") != NULL) { + if(json_validate(data) == true) { + if((jdata = json_decode(data)) != NULL) { + if((jmain = json_find_member(jdata, "main")) != NULL + && (jsys = json_find_member(jdata, "sys")) != NULL) { + if((node = json_find_member(jmain, "temp")) == NULL) { + printf("api.openweathermap.org json has no temp key"); + } else if(json_find_number(jmain, "humidity", &humi) != 0) { + printf("api.openweathermap.org json has no humidity key"); + } else if(json_find_number(jsys, "sunrise", &sunrise) != 0) { + printf("api.openweathermap.org json has no sunrise key"); + } else if(json_find_number(jsys, "sunset", &sunset) != 0) { + printf("api.openweathermap.org json has no sunset key"); + } else { + if(node->tag != JSON_NUMBER) { + printf("api.openweathermap.org json has no temp key"); + } else { + temp = node->number_-273.15; + + timenow = time(NULL); + struct tm current; + memset(¤t, '\0', sizeof(struct tm)); + #ifdef _WIN32 + localtime(&timenow); + #else + localtime_r(&timenow, ¤t); + #endif + + int month = current.tm_mon+1; + int mday = current.tm_mday; + int year = current.tm_year+1900; + + time_t midnight = (datetime2ts(year, month, mday, 23, 59, 59)+1); + + openweathermap->message = json_mkobject(); + + JsonNode *code = json_mkobject(); + + json_append_member(code, "location", json_mkstring(wnode->location)); + json_append_member(code, "country", json_mkstring(wnode->country)); + json_append_member(code, "temperature", json_mknumber(temp, 2)); + json_append_member(code, "humidity", json_mknumber(humi, 2)); + json_append_member(code, "update", json_mknumber(0, 0)); + + time_t a = (time_t)sunrise; + memset(&tm, '\0', sizeof(struct tm)); + #ifdef _WIN32 + localtime(&a); + #else + localtime_r(&a, &tm); + #endif + json_append_member(code, "sunrise", json_mknumber((double)((tm.tm_hour*100)+tm.tm_min)/100, 2)); + + a = (time_t)sunset; + memset(&tm, '\0', sizeof(struct tm)); + #ifdef _WIN32 + localtime(&a); + #else + localtime_r(&a, &tm); + #endif + json_append_member(code, "sunset", json_mknumber((double)((tm.tm_hour*100)+tm.tm_min)/100, 2)); + if(timenow > (int)round(sunrise) && timenow < (int)round(sunset)) { + json_append_member(code, "sun", json_mkstring("rise")); + } else { + json_append_member(code, "sun", json_mkstring("set")); + } + + json_append_member(openweathermap->message, "message", code); + json_append_member(openweathermap->message, "origin", json_mkstring("receiver")); + json_append_member(openweathermap->message, "protocol", json_mkstring(openweathermap->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(openweathermap->id, openweathermap->message, PROTOCOL); + } + json_delete(openweathermap->message); + openweathermap->message = NULL; + + /* Send message when sun rises */ + if((int)round(sunrise) > timenow) { + if(((int)round(sunrise)-timenow) < wnode->ointerval) { + wnode->interval = (int)((int)round(sunrise)-timenow); + } + /* Send message when sun sets */ + } else if((int)round(sunset) > timenow) { + if(((int)round(sunset)-timenow) < wnode->ointerval) { + wnode->interval = (int)((int)round(sunset)-timenow); + } + /* Update all values when a new day arrives */ + } else { + if((midnight-timenow) < wnode->ointerval) { + wnode->interval = (int)(midnight-timenow); + } + } + + wnode->update = time(NULL); + } + } + } else { + logprintf(LOG_NOTICE, "api.openweathermap.org json has no current_observation key"); + } + json_delete(jdata); + } else { + logprintf(LOG_NOTICE, "api.openweathermap.org json could not be parsed"); + } + } else { + logprintf(LOG_NOTICE, "api.openweathermap.org response was not in a valid json format"); + } + } else { + logprintf(LOG_NOTICE, "api.openweathermap.org response was not in a valid json format"); + } + } else { + logprintf(LOG_NOTICE, "could not reach api.openweathermap.org"); + } + // if(data) { + // FREE(data); + // } +} + +static void *openweathermapParse(void *param) { + struct protocol_threads_t *thread = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)thread->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct JsonNode *jchild1 = NULL; + struct settings_t *wnode = MALLOC(sizeof(struct settings_t)); + + wnode->ointerval = 86400; + wnode->interval = 86400; + + int event = 0; + int firstrun = 1, nrloops = 0, timeout = 0; + double itmp = 0.0; + + char url[1024]; + + threads++; + + if(wnode == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + int has_country = 0, has_location = 0; + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + has_country = 0, has_location = 0; + jchild1 = json_first_child(jchild); + + while(jchild1) { + if(strcmp(jchild1->key, "location") == 0) { + has_location = 1; + if((wnode->location = MALLOC(strlen(jchild1->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(wnode->location, jchild1->string_); + } + if(strcmp(jchild1->key, "country") == 0) { + has_country = 1; + if((wnode->country = MALLOC(strlen(jchild1->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(wnode->country, jchild1->string_); + } + jchild1 = jchild1->next; + } + if(has_country == 1 && has_location == 1) { + wnode->thread = thread; + wnode->next = settings; + settings = wnode; + } else { + if(has_country == 1) { + FREE(wnode->country); + } + if(has_location == 1) { + FREE(wnode->location); + } + FREE(wnode); + wnode = NULL; + } + jchild = jchild->next; + } + } + + if(wnode == NULL) { + return 0; + } + + if(json_find_number(json, "poll-interval", &itmp) == 0) + wnode->interval = (int)round(itmp); + wnode->ointerval = wnode->interval; + + while(loop) { + event = protocol_thread_wait(thread, INTERVAL, &nrloops); + pthread_mutex_lock(&lock); + if(loop == 0) { + break; + } + timeout += INTERVAL; + if(timeout >= wnode->interval || event != ETIMEDOUT || firstrun == 1) { + timeout = 0; + wnode->interval = wnode->ointerval; + + sprintf(url, "http://api.openweathermap.org/data/2.5/weather?q=%s,%s&APPID=8db24c4ac56251371c7ea87fd3115493", wnode->location, wnode->country); + http_get_content(url, callback, wnode); + } else { + openweathermap->message = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "location", json_mkstring(wnode->location)); + json_append_member(code, "country", json_mkstring(wnode->country)); + json_append_member(code, "update", json_mknumber(1, 0)); + json_append_member(openweathermap->message, "message", code); + json_append_member(openweathermap->message, "origin", json_mkstring("receiver")); + json_append_member(openweathermap->message, "protocol", json_mkstring(openweathermap->id)); + if(pilight.broadcast != NULL) { + pilight.broadcast(openweathermap->id, openweathermap->message, PROTOCOL); + } + json_delete(openweathermap->message); + openweathermap->message = NULL; + } + firstrun = 0; + + pthread_mutex_unlock(&lock); + } + pthread_mutex_unlock(&lock); + + threads--; + return (void *)NULL; +} +#else +static int min_interval = INTERVAL; +static int time_override = -1; +static char url[1024] = "http://api.openweathermap.org/data/2.5/weather?q=%s,%s&APPID=%s"; + +typedef struct data_t { + char *name; + char *country; + char *location; + char *api; + uv_timer_t *enable_timer_req; + uv_timer_t *update_timer_req; + + int interval; + double temp_offset; + + time_t update; + struct data_t *next; +} data_t; + +static struct data_t *data = NULL; + +static void *update(void *param); +static void *enable(void *param); + +#ifdef PILIGHT_REWRITE +static void *reason_code_received_free(void *param) { + struct reason_code_received_t *data = param; + FREE(data); + return NULL; +} +#endif + +static void callback(int code, char *data, int size, char *type, void *userdata) { + struct JsonNode *jdata = NULL; + struct JsonNode *jmain = NULL; + struct JsonNode *jsys = NULL; + struct JsonNode *node = NULL; + struct data_t *settings = userdata; + time_t timenow = 0; + struct tm tm_rise, tm_set; + double sunset = 0.0, sunrise = 0.0, temp = 0.0, humi = 0.0; + + memset(&tm_rise, 0, sizeof(struct tm)); + memset(&tm_set, 0, sizeof(struct tm)); + + if(code == 200) { + if(strstr(type, "application/json") != NULL) { + if(json_validate(data) == true) { + if((jdata = json_decode(data)) != NULL) { + if((jmain = json_find_member(jdata, "main")) != NULL + && (jsys = json_find_member(jdata, "sys")) != NULL) { + if((node = json_find_member(jmain, "temp")) == NULL) { + logprintf(LOG_NOTICE, "api.openweathermap.org json has no temp key"); + } else if(json_find_number(jmain, "humidity", &humi) != 0) { + logprintf(LOG_NOTICE, "api.openweathermap.org json has no humidity key"); + } else if(json_find_number(jsys, "sunrise", &sunrise) != 0) { + logprintf(LOG_NOTICE, "api.openweathermap.org json has no sunrise key"); + } else if(json_find_number(jsys, "sunset", &sunset) != 0) { + logprintf(LOG_NOTICE, "api.openweathermap.org json has no sunset key"); + } else { + if(node->tag != JSON_NUMBER) { + logprintf(LOG_NOTICE, "api.openweathermap.org json has no temp key"); + } else { + temp = node->number_-273.15; + + if(time_override > -1) { + timenow = time_override; + } else { + timenow = time(NULL); + } + + struct tm current; + memset(¤t, '\0', sizeof(struct tm)); +#ifdef _WIN32 + struct tm *tmp = gmtime(&timenow); + memcpy(¤t, tmp, sizeof(struct tm)); +#else + gmtime_r(&timenow, ¤t); +#endif + + int month = current.tm_mon+1; + int mday = current.tm_mday; + int year = current.tm_year+1900; + + time_t midnight = (datetime2ts(year, month, mday, 23, 59, 59)+1); + + char *_sun = NULL; + + time_t a = (time_t)sunrise; + memset(&tm_rise, '\0', sizeof(struct tm)); +#ifdef _WIN32 + tmp = gmtime(&a); + memcpy(&tm_rise, tmp, sizeof(struct tm)); +#else + gmtime_r(&a, &tm_rise); +#endif + a = (time_t)sunset; + memset(&tm_set, '\0', sizeof(struct tm)); +#ifdef _WIN32 + tmp = gmtime(&a); + memcpy(&tm_set, tmp, sizeof(struct tm)); +#else + gmtime_r(&a, &tm_set); +#endif + if(timenow > (int)round(sunrise) && timenow < (int)round(sunset)) { + _sun = "rise"; + } else { + _sun = "set"; + } + +#ifdef PILIGHT_REWRITE + struct reason_code_received_t *data = MALLOC(sizeof(struct reason_code_received_t)); + if(data == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + }; + snprintf(data->message, 1024, + "{\"api\":\"%s\",\"location\":\"%s\",\"country\":\"%s\",\"temperature\":%.2f,\"humidity\":%.2f,\"update\":0,\"sunrise\":%.2f,\"sunset\":%.2f,\"sun\":\"%s\"}", + settings->api, settings->location, settings->country, temp, humi, ((double)((tm_rise.tm_hour*100)+tm_rise.tm_min)/100), ((double)((tm_set.tm_hour*100)+tm_set.tm_min)/100), _sun + ); + strncpy(data->origin, "receiver", 255); + data->protocol = openweathermap->id; + if(strlen(pilight_uuid) > 0) { + data->uuid = pilight_uuid; + } else { + data->uuid = NULL; + } + data->repeat = 1; + + eventpool_trigger(REASON_CODE_RECEIVED, reason_code_received_free, data); +#else + char message[1024]; + snprintf(message, 1024, + "{\"origin\":\"receiver\",\"protocol\":\"%s\",\"message\":"\ + "{\"location\":\"%s\",\"country\":\"%s\",\"temperature\":%.2f,\"humidity\":%.2f,\"update\":0,\"sunrise\":%.2f,\"sunset\":%.2f,\"sun\":\"%s\"}"\ + "}", + openweathermap->id, settings->location, settings->country, temp, humi, ((double)((tm_rise.tm_hour*100)+tm_rise.tm_min)/100), ((double)((tm_set.tm_hour*100)+tm_set.tm_min)/100), _sun + ); + + openweathermap->message = json_decode(message); + + if(pilight.broadcast != NULL) { + pilight.broadcast(openweathermap->id, openweathermap->message, PROTOCOL); + } + json_delete(openweathermap->message); + openweathermap->message = NULL; +#endif + /* Send message when sun rises */ + if((int)round(sunrise) > timenow) { + if(((int)round(sunrise)-timenow) < settings->interval) { + settings->interval = (int)((int)round(sunrise)-timenow); + } + /* Send message when sun sets */ + } else if((int)round(sunset) > timenow) { + if(((int)round(sunset)-timenow) < settings->interval) { + settings->interval = (int)((int)round(sunset)-timenow); + } + /* Update all values when a new day arrives */ + } else { + if((midnight-timenow) < settings->interval) { + settings->interval = (int)(midnight-timenow); + } + } + + if(time_override > -1) { + settings->update = time_override; + } else { + settings->update = time(NULL); + } + + /* + * Update all values on next event as described above + */ + assert(settings->interval > 0); + uv_timer_start(settings->update_timer_req, (void (*)(uv_timer_t *))update, settings->interval*1000, 0); + /* + * Allow updating the values customly after INTERVAL seconds + */ + assert(min_interval > 0); + uv_timer_start(settings->enable_timer_req, (void (*)(uv_timer_t *))enable, min_interval*1000, 0); + } + } + } else { + logprintf(LOG_NOTICE, "api.openweathermap.org json has no current_observation key"); + } + json_delete(jdata); + } else { + logprintf(LOG_NOTICE, "api.openweathermap.org json could not be parsed"); + } + } else { + logprintf(LOG_NOTICE, "api.openweathermap.org response was not in a valid json format"); + } + } else { + logprintf(LOG_NOTICE, "api.openweathermap.org response was not in a valid json format"); + } + } else { + logprintf(LOG_NOTICE, "could not reach api.openweathermap.org"); + } + return; +} + +static void thread_free(uv_work_t *req, int status) { + FREE(req); +} + +static void thread(uv_work_t *req) { + struct data_t *settings = req->data; + char parsed[1024]; + char *enc = urlencode(settings->location); + + memset(parsed, '\0', 1024); + snprintf(parsed, 1024, url, enc, settings->country, settings->api); + FREE(enc); + + http_get_content(parsed, callback, settings); + return; +} + +static void *update(void *param) { + uv_timer_t *timer_req = param; + struct data_t *settings = timer_req->data; + + uv_work_t *work_req = NULL; + if((work_req = MALLOC(sizeof(uv_work_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + work_req->data = settings; + uv_queue_work(uv_default_loop(), work_req, "openweathermap", thread, thread_free); + if(time_override > -1) { + settings->update = time_override; + } else { + settings->update = time(NULL); + } + return NULL; +} + +static void *enable(void *param) { + uv_timer_t *timer_req = param; + struct data_t *settings = timer_req->data; + +#ifdef PILIGHT_REWRITE + struct reason_code_received_t *data = MALLOC(sizeof(struct reason_code_received_t)); + if(data == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + }; + snprintf(data->message, 1024, + "{\"api\":\"%s\",\"location\":\"%s\",\"country\":\"%s\",\"update\":1}", + settings->api, settings->location, settings->country + ); + strncpy(data->origin, "receiver", 255); + data->protocol = openweathermap->id; + if(strlen(pilight_uuid) > 0) { + data->uuid = pilight_uuid; + } else { + data->uuid = NULL; + } + data->repeat = 1; + eventpool_trigger(REASON_CODE_RECEIVED, reason_code_received_free, data); +#else + char message[1024]; + snprintf(message, 1024, + "{\"origin\":\"receiver\",\"protocol\":\"%s\",\"message\":"\ + "{\"location\":\"%s\",\"country\":\"%s\",\"update\":1}"\ + "}", + openweathermap->id, settings->location, settings->country + ); + + openweathermap->message = json_decode(message); + + if(pilight.broadcast != NULL) { + pilight.broadcast(openweathermap->id, openweathermap->message, PROTOCOL); + } + json_delete(openweathermap->message); + openweathermap->message = NULL; +#endif + return NULL; +} +#endif + +static struct threadqueue_t *initDev(struct JsonNode *jdevice) { +#ifdef PILIGHT_DEVELOPMENT + loop = 1; + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(openweathermap, json); + return threads_register("openweathermap", &openweathermapParse, (void *)node, 0); +#else +#ifdef PILIGHT_REWRITE + struct JsonNode *jdevice = NULL; +#endif + struct JsonNode *jprotocols = NULL; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct JsonNode *jchild1 = NULL; + struct data_t *node = NULL; + double itmp = 0; + int match = 0; + +#ifdef PILIGHT_REWRITE + if(param == NULL) { + return NULL; + } +#endif + + if(!(openweathermap->masterOnly == 0 || pilight.runmode == STANDALONE)) { + return NULL; + } + +#ifdef PILIGHT_REWRITE + if((jdevice = json_first_child(param)) == NULL) { + return NULL; + } +#endif + + if((jprotocols = json_find_member(jdevice, "protocol")) != NULL) { + jchild = json_first_child(jprotocols); + while(jchild) { + if(strcmp(openweathermap->id, jchild->string_) == 0) { + match = 1; + break; + } + jchild = jchild->next; + } + } + + if(match == 0) { + return NULL; + } + + if((node = MALLOC(sizeof(struct data_t)))== NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(node, '\0', sizeof(struct data_t)); + + node->interval = min_interval; + node->country = NULL; + node->location = NULL; + node->update = 0; + node->temp_offset = 0; + + int has_country = 0, has_location = 0, has_api = 0; + if((jid = json_find_member(jdevice, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + has_country = 0, has_location = 0, has_api = 0; + jchild1 = json_first_child(jchild); + + while(jchild1) { + if(strcmp(jchild1->key, "api") == 0) { + has_api = 1; + if((node->api = MALLOC(strlen(jchild1->string_)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(node->api, jchild1->string_); + } + if(strcmp(jchild1->key, "location") == 0) { + has_location = 1; + if((node->location = MALLOC(strlen(jchild1->string_)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(node->location, jchild1->string_); + } + if(strcmp(jchild1->key, "country") == 0) { + has_country = 1; + if((node->country = MALLOC(strlen(jchild1->string_)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(node->country, jchild1->string_); + } + jchild1 = jchild1->next; + } + if(has_country == 1 && has_location == 1 && has_api == 1) { + node->next = data; + data = node; + } else { + if(has_country == 1) { + FREE(node->country); + } + if(has_location == 1) { + FREE(node->location); + } + FREE(node); + node = NULL; + } + jchild = jchild->next; + } + } + + if(node == NULL) { + return NULL; + } + if(json_find_number(jdevice, "poll-interval", &itmp) == 0) + node->interval = (int)round(itmp); + json_find_number(jdevice, "temperature-offset", &node->temp_offset); + + if((node->name = MALLOC(strlen(jdevice->key)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(node->name, jdevice->key); + + if((node->enable_timer_req = MALLOC(sizeof(uv_timer_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + if((node->update_timer_req = MALLOC(sizeof(uv_timer_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + node->enable_timer_req->data = node; + node->update_timer_req->data = node; + + uv_timer_init(uv_default_loop(), node->enable_timer_req); + uv_timer_init(uv_default_loop(), node->update_timer_req); + + assert(node->interval > 0); + uv_timer_start(node->enable_timer_req, (void (*)(uv_timer_t *))enable, node->interval*1000, 0); + /* + * Do an update when this device is added after 3 seconds + * to make sure pilight is actually running. + */ + uv_timer_start(node->update_timer_req, (void (*)(uv_timer_t *))update, 3000, 0); + return NULL; +#endif +} + +static int checkValues(JsonNode *code) { + double interval = INTERVAL; + + json_find_number(code, "poll-interval", &interval); + + if((int)round(interval) < INTERVAL) { + logprintf(LOG_ERR, "openweathermap poll-interval cannot be lower than %d", INTERVAL); + return 1; + } + + return 0; +} + +static int createCode(JsonNode *code) { +#ifdef PILIGHT_DEVELOPMENT + struct settings_t *wtmp = settings; + char *country = NULL; + char *location = NULL; + double itmp = 0; + time_t currenttime = 0; + + if(json_find_number(code, "min-interval", &itmp) == 0) { + logprintf(LOG_ERR, "you can't override the min-interval setting"); + return EXIT_FAILURE; + } + + if(json_find_string(code, "country", &country) == 0 && + json_find_string(code, "location", &location) == 0 && + json_find_number(code, "update", &itmp) == 0) { + currenttime = time(NULL); + while(wtmp) { + if(strcmp(wtmp->country, country) == 0 + && strcmp(wtmp->location, location) == 0) { + if((currenttime-wtmp->update) > INTERVAL) { + pthread_mutex_unlock(&wtmp->thread->mutex); + pthread_cond_signal(&wtmp->thread->cond); + wtmp->update = time(NULL); + } + } + wtmp = wtmp->next; + } + } else { + logprintf(LOG_ERR, "openweathermap: insufficient number of arguments"); + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +#else + struct data_t *tmp = data; + char *country = NULL; + char *location = NULL; + char *api = NULL; + double itmp = 0; + + if(json_find_number(code, "min-interval", &itmp) == 0) { + logprintf(LOG_ERR, "you can't override the min-interval setting"); + return EXIT_FAILURE; + } + + if(json_find_string(code, "country", &country) == 0 && + json_find_string(code, "location", &location) == 0 && + json_find_string(code, "api", &api) == 0 && + json_find_number(code, "update", &itmp) == 0) { + + time_t currenttime = time(NULL); + if(time_override > -1) { + currenttime = time_override; + } + + while(tmp) { + if(strcmp(tmp->country, country) == 0 + && strcmp(tmp->location, location) == 0 + && strcmp(tmp->api, api) == 0) { + if((currenttime-tmp->update) > min_interval) { + + uv_work_t *work_req = NULL; + if((work_req = MALLOC(sizeof(uv_work_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + work_req->data = tmp; + uv_queue_work(uv_default_loop(), work_req, "openweathermap", thread, thread_free); + + if(time_override > -1) { + tmp->update = time_override; + } else { + tmp->update = time(NULL); + } + } + } + tmp = tmp->next; + } + } else { + logprintf(LOG_ERR, "openweathermap: insufficient number of arguments"); + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +#endif +} + +static void threadGC(void) { +#ifdef PILIGHT_DEVELOPMENT + loop = 0; + protocol_thread_stop(openweathermap); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(openweathermap); + + + struct settings_t *wtmp = NULL; + while(settings) { + wtmp = settings; + FREE(settings->country); + FREE(settings->location); + settings = settings->next; + FREE(wtmp); + } + if(settings != NULL) { + FREE(settings); + } +#else + struct data_t *tmp = NULL; + while(data) { + tmp = data; +#ifndef PILIGHT_REWRITE + uv_timer_stop(tmp->update_timer_req); + uv_timer_stop(tmp->enable_timer_req); +#endif + FREE(tmp->country); + FREE(tmp->location); + FREE(tmp->name); + FREE(tmp->api); + data = data->next; + FREE(tmp); + } + if(data != NULL) { + FREE(data); + } +#endif +} + +static void printHelp(void) { + printf("\t -c --country=country\t\tupdate an entry with this country\n"); + printf("\t -l --location=location\t\tupdate an entry with this location\n"); + printf("\t -a --api=api\t\t\tupdate an entry with this api code\n"); + printf("\t -u --update\t\t\tupdate the defined weather entry\n"); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void openweathermapInit(void) { +#ifdef PILIGHT_DEVELOPMENT + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&lock, &attr); +#endif + + protocol_register(&openweathermap); + protocol_set_id(openweathermap, "openweathermap"); + protocol_device_add(openweathermap, "openweathermap", "Open Weather Map API"); + openweathermap->devtype = WEATHER; + openweathermap->hwtype = API; + openweathermap->multipleId = 0; + openweathermap->masterOnly = 1; + + options_add(&openweathermap->options, 't', "temperature", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{1,5}$"); + options_add(&openweathermap->options, 'h', "humidity", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{1,5}$"); + options_add(&openweathermap->options, 'l', "location", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "^([a-zA-Z-]|[[:space:]])+$"); + options_add(&openweathermap->options, 'c', "country", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "^[a-zA-Z]+$"); + options_add(&openweathermap->options, 'a', "api", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "^[a-zA-Z0-9]+$"); + options_add(&openweathermap->options, 'x', "sunrise", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{3,4}$"); + options_add(&openweathermap->options, 'y', "sunset", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{3,4}$"); + options_add(&openweathermap->options, 's', "sun", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&openweathermap->options, 'u', "update", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + + // options_add(&openweathermap->options, 0, "decimals", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)2, "[0-9]"); + options_add(&openweathermap->options, 0, "temperature-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)2, "[0-9]"); + options_add(&openweathermap->options, 0, "humidity-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)2, "[0-9]"); + options_add(&openweathermap->options, 0, "sunriseset-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)2, "[0-9]"); + options_add(&openweathermap->options, 0, "show-humidity", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&openweathermap->options, 0, "show-temperature", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&openweathermap->options, 0, "show-sunriseset", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&openweathermap->options, 0, "show-update", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&openweathermap->options, 0, "poll-interval", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)86400, "[0-9]"); + + openweathermap->createCode=&createCode; + openweathermap->initDev=&initDev; + openweathermap->checkValues=&checkValues; + openweathermap->threadGC=&threadGC; + openweathermap->printHelp=&printHelp; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "openweathermap"; + module->version = "1.12"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + openweathermapInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/openweathermap.h b/lib/ESPiLight/pilight/libs/pilight/protocols/API/openweathermap.h new file mode 100644 index 0000000..55c8095 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/openweathermap.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_OPENWEATHERMAP_H_ +#define _PROTOCOL_OPENWEATHERMAP_H_ + +#include "../protocol.h" + +struct protocol_t *openweathermap; +void openweathermapInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/program.c b/lib/ESPiLight/pilight/libs/pilight/protocols/API/program.c new file mode 100644 index 0000000..31e5527 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/program.c @@ -0,0 +1,413 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif + #include +#endif +#include + +#include "../../core/threads.h" +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/json.h" +#include "../../core/gc.h" +#include "program.h" + +#ifndef _WIN32 +static unsigned short loop = 1; +static unsigned short threads = 0; + +static pthread_mutex_t lock; +static pthread_mutexattr_t attr; + +typedef struct settings_t { + char *name; + char *arguments; + char *program; + char *start; + char *stop; + int wait; + int currentstate; + int laststate; + pthread_t pth; + int hasthread; + protocol_threads_t *thread; + struct settings_t *next; +} settings_t; + +static struct settings_t *settings = NULL; + +static void *thread(void *param) { + struct protocol_threads_t *pnode = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)pnode->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct JsonNode *jchild1 = NULL; + char *prog = NULL, *args = NULL, *stopcmd = NULL, *startcmd = NULL; + + int interval = 1, nrloops = 0; + int pid = 0; + double itmp = 0; + + threads++; + + json_find_string(json, "program", &prog); + json_find_string(json, "arguments", &args); + json_find_string(json, "stop-command", &stopcmd); + json_find_string(json, "start-command", &startcmd); + + struct settings_t *lnode = MALLOC(sizeof(struct settings_t)); + lnode->wait = 0; + lnode->hasthread = 0; + memset(&lnode->pth, '\0', sizeof(pthread_t)); + + if(args != NULL && strlen(args) > 0) { + if((lnode->arguments = MALLOC(strlen(args)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(lnode->arguments, args); + } else { + lnode->arguments = NULL; + } + + if(prog != NULL) { + if((lnode->program = MALLOC(strlen(prog)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(lnode->program, prog); + } else { + lnode->program = NULL; + } + + if(stopcmd != NULL) { + if((lnode->stop = MALLOC(strlen(stopcmd)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(lnode->stop, stopcmd); + } else { + lnode->stop = NULL; + } + + if(startcmd != NULL) { + if((lnode->start = MALLOC(strlen(startcmd)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(lnode->start, startcmd); + } else { + lnode->start = NULL; + } + + lnode->name = NULL; + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + jchild1 = json_first_child(jchild); + while(jchild1) { + if(strcmp(jchild1->key, "name") == 0) { + if((lnode->name = MALLOC(strlen(jchild1->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(lnode->name, jchild1->string_); + } + jchild1 = jchild1->next; + } + jchild = jchild->next; + } + } + + lnode->thread = pnode; + lnode->laststate = -1; + + lnode->next = settings; + settings = lnode; + + if(json_find_number(json, "poll-interval", &itmp) == 0) + interval = (int)round(itmp); + + while(loop) { + if(protocol_thread_wait(pnode, interval, &nrloops) == ETIMEDOUT) { + pthread_mutex_lock(&lock); + if(lnode->wait == 0) { + struct JsonNode *message = json_mkobject(); + + JsonNode *code = json_mkobject(); + json_append_member(code, "name", json_mkstring(lnode->name)); + + if((pid = (int)findproc(lnode->program, lnode->arguments, 0)) > 0) { + lnode->currentstate = 1; + json_append_member(code, "state", json_mkstring("running")); + json_append_member(code, "pid", json_mknumber((int)pid, 0)); + } else { + lnode->currentstate = 0; + json_append_member(code, "state", json_mkstring("stopped")); + json_append_member(code, "pid", json_mknumber(0, 0)); + } + json_append_member(message, "message", code); + json_append_member(message, "origin", json_mkstring("receiver")); + json_append_member(message, "protocol", json_mkstring(program->id)); + + if(lnode->currentstate != lnode->laststate) { + lnode->laststate = lnode->currentstate; + if(pilight.broadcast != NULL) { + pilight.broadcast(program->id, message, PROTOCOL); + } + } + json_delete(message); + message = NULL; + } + pthread_mutex_unlock(&lock); + } + } + pthread_mutex_unlock(&lock); + + threads--; + return (void *)NULL; +} + +static struct threadqueue_t *initDev(JsonNode *jdevice) { + loop = 1; + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(program, json); + return threads_register("program", &thread, (void *)node, 0); +} + +static void *execute(void *param) { + struct settings_t *p = (struct settings_t *)param; + int pid = 0; + int result = 0; + + if((pid = (int)findproc(p->program, p->arguments, 0)) > 0) { + result = system(p->stop); + } else { + result = system(p->start); + } + + /* Check of the user wanted to stop pilight */ + if(WIFSIGNALED(result)) { + int ppid = 0; + /* Find the pilight daemon pid */ + if((ppid = (int)findproc(progname, NULL, 0)) > 0) { + /* Send a sigint to ourself */ + kill(ppid, SIGINT); + } + } + + p->wait = 0; + memset(&p->pth, '\0', sizeof(pthread_t)); + p->hasthread = 0; + p->laststate = -1; + + pthread_mutex_unlock(&p->thread->mutex); + pthread_cond_signal(&p->thread->cond); + + return NULL; +} + +static int createCode(JsonNode *code) { + char *name = NULL; + double itmp = -1; + int state = -1; + int pid = 0; + + if(json_find_string(code, "name", &name) == 0) { + if(strstr(progname, "daemon") != NULL) { + struct settings_t *tmp = settings; + while(tmp) { + if(strcmp(tmp->name, name) == 0) { + if(tmp->wait == 0) { + if(tmp->name != NULL && tmp->stop != NULL && tmp->start != NULL) { + + if(json_find_number(code, "running", &itmp) == 0) + state = 1; + else if(json_find_number(code, "stopped", &itmp) == 0) + state = 0; + + if((pid = (int)findproc(tmp->program, tmp->arguments, 0)) > 0 && state == 1) { + logprintf(LOG_INFO, "program \"%s\" already running", tmp->name); + } else if(pid == -1 && state == 0) { + logprintf(LOG_INFO, "program \"%s\" already stopped", tmp->name); + break; + } else { + if(state > -1) { + program->message = json_mkobject(); + JsonNode *code1 = json_mkobject(); + json_append_member(code1, "name", json_mkstring(name)); + + if(state == 1) { + json_append_member(code1, "state", json_mkstring("running")); + } else { + json_append_member(code1, "state", json_mkstring("stopped")); + } + + json_append_member(program->message, "message", code1); + json_append_member(program->message, "origin", json_mkstring("receiver")); + json_append_member(program->message, "protocol", json_mkstring(program->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(program->id, program->message, PROTOCOL); + } + json_delete(program->message); + program->message = NULL; + } + + tmp->wait = 1; + threads_create(&tmp->pth, NULL, execute, (void *)tmp); + tmp->hasthread = 1; + pthread_detach(tmp->pth); + + program->message = json_mkobject(); + json_append_member(program->message, "name", json_mkstring(name)); + json_append_member(program->message, "state", json_mkstring("pending")); + } + } else { + logprintf(LOG_NOTICE, "program \"%s\" cannot be controlled", tmp->name); + } + } else { + logprintf(LOG_NOTICE, "please wait for program \"%s\" to finish it's state change", tmp->name); + } + break; + } + tmp = tmp->next; + } + } else { + program->message = json_mkobject(); + + if(json_find_number(code, "running", &itmp) == 0) + json_append_member(program->message, "state", json_mkstring("running")); + else if(json_find_number(code, "stopped", &itmp) == 0) + json_append_member(program->message, "state", json_mkstring("stopped")); + + json_append_member(program->message, "name", json_mkstring(name)); + json_append_member(program->message, "state", json_mkstring("pending")); + } + } else { + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + +static void threadGC(void) { + loop = 0; + protocol_thread_stop(program); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(program); + + struct settings_t *tmp; + while(settings) { + tmp = settings; + if(tmp->stop) FREE(tmp->stop); + if(tmp->start) FREE(tmp->start); + if(tmp->name) FREE(tmp->name); + if(tmp->arguments) FREE(tmp->arguments); + if(tmp->program) FREE(tmp->program); + if(tmp->hasthread > 0) pthread_cancel(tmp->pth); + settings = settings->next; + FREE(tmp); + } + if(settings != NULL) { + FREE(settings); + } +} + +static void printHelp(void) { + printf("\t -t --running\t\t\tstart the program\n"); + printf("\t -f --stopped\t\t\tstop the program\n"); + printf("\t -n --name=name\t\t\tname of the program\n"); +} +#endif + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void programInit(void) { +#ifndef _WIN32 + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&lock, &attr); +#endif + + protocol_register(&program); + protocol_set_id(program, "program"); + protocol_device_add(program, "program", "Start / Stop / State of a program"); + program->devtype = PENDINGSW; + program->hwtype = API; + program->multipleId = 0; + + options_add(&program->options, 'n', "name", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, NULL); + options_add(&program->options, 'x', "start-command", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&program->options, 'y', "stop-command", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&program->options, 'p', "program", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&program->options, 'i', "pid", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + options_add(&program->options, 'a', "arguments", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&program->options, 't', "running", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&program->options, 'd', "pending", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&program->options, 'f', "stopped", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + + options_add(&program->options, 0, "readonly", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)0, "^[10]{1}$"); + options_add(&program->options, 0, "confirm", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)0, "^[10]{1}$"); + options_add(&program->options, 0, "poll-interval", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)1, "[0-9]"); + +#ifndef _WIN32 + program->createCode=&createCode; + program->printHelp=&printHelp; + program->initDev=&initDev; + program->threadGC=&threadGC; +#endif +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "program"; + module->version = "1.6"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + programInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/program.h b/lib/ESPiLight/pilight/libs/pilight/protocols/API/program.h new file mode 100644 index 0000000..07bc65d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/program.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_PROGRAM_H_ +#define _PROTOCOL_PROGRAM_H_ + +#include "../protocol.h" + +struct protocol_t *program; +void programInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/protocol_header.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/API/protocol_header.h.in new file mode 100644 index 0000000..da97564 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/protocol_header.h.in @@ -0,0 +1 @@ +@PROTOCOL_HEADERS@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/protocol_init.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/API/protocol_init.h.in new file mode 100644 index 0000000..40bdc9d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/protocol_init.h.in @@ -0,0 +1 @@ +@PROTOCOL_INIT@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/sunriseset.c b/lib/ESPiLight/pilight/libs/pilight/protocols/API/sunriseset.c new file mode 100644 index 0000000..10ce26f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/sunriseset.c @@ -0,0 +1,615 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef __USE_XOPEN + #define __USE_XOPEN +#endif +#include +#include + +#include "../../core/threads.h" +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/ntp.h" +#include "../../core/dso.h" +#include "../../core/datetime.h" // Full path because we also have a datetime protocol +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/json.h" +#include "../../core/gc.h" +#include "sunriseset.h" + +#define PI 3.1415926 +#define PIX 57.29578049044297 // 180 / PI +#define ZENITH 90.83333333333333 + +#ifdef PILIGHT_DEVELOPMENT +static unsigned short loop = 1; +static unsigned short threads = 0; + +static double calculate(int year, int month, int day, double lon, double lat, int rising) { + int N = (int)((floor(275 * month / 9)) - ((floor((month + 9) / 12)) * + ((1 + floor((year - 4 * floor(year / 4) + 2) / 3)))) + (int)day - 30); + + double lngHour = lon / 15.0; + double T = 0; + + if(rising) { + T = N + ((6 - lngHour) / 24); + } else { + T = N + ((18 - lngHour) / 24); + } + + double M = (0.9856 * T) - 3.289; + double M1 = M * PI / 180; + double L = fmod((M + (1.916 * sin(M1)) + (0.020 * sin(2 * M1)) + 282.634), 360.0); + double L1 = L * PI / 180; + double L2 = lat * PI / 180; + double SD = 0.39782 * sin(L1); + double CH = (cos(ZENITH * PI / 180)-(SD * sin(L2))) / (cos((PIX * asin((SD))) * PI / 180) * cos(L2)); + + if(CH > 1) { + return -1; + } else if(CH < -1) { + return -1; + } + + double RA = fmod((PIX * atan((0.91764 * tan(L1)))), 360); + double MQ = (RA + (((floor(L / 90)) * 90) - ((floor(RA / 90)) * 90))) / 15; + double A; + double B; + if(rising == 0) { + A = 0.06571; + B = 6.595; + } else { + A = 0.06571; + B = 6.618; + } + + double t = ((rising ? 360 - PIX * acos(CH) : PIX * acos(CH)) / 15) + MQ - (A * T) - B; + double UT = fmod((t - lngHour) + 24.0, 24.0); + double min = (round(60*fmod(UT, 1))/100); + + if(min >= 0.60) { + min -= 0.60; + } + + double hour = UT-min; + + return ((round(hour)+min))*100; +} + +static void *thread(void *param) { + struct protocol_threads_t *thread = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)thread->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct JsonNode *jchild1 = NULL; + double longitude = 0, latitude = 0; + char UTC[] = "UTC", *tz = NULL; + + time_t timenow = 0; + struct tm tm, tm_utc; + int nrloops = 0, risetime = 0, settime = 0, hournow = 0, firstrun = 0; + int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0, offset = 0; + + threads++; + + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + jchild1 = json_first_child(jchild); + while(jchild1) { + if(strcmp(jchild1->key, "longitude") == 0) { + longitude = jchild1->number_; + } + if(strcmp(jchild1->key, "latitude") == 0) { + latitude = jchild1->number_; + } + jchild1 = jchild1->next; + } + jchild = jchild->next; + } + } + + if((tz = coord2tz(longitude, latitude)) == NULL) { + logprintf(LOG_DEBUG, "could not determine timezone"); + tz = UTC; + } else { + logprintf(LOG_DEBUG, "%.6f:%.6f seems to be in timezone: %s", longitude, latitude, tz); + } + + timenow = time(NULL); + if(isntpsynced() == 0) { + timenow -= getntpdiff(); + } + + while(loop) { + protocol_thread_wait(thread, 1, &nrloops); + timenow = time(NULL); + if(isntpsynced() == 0) { + timenow -= getntpdiff(); + } + + + if(localtime_l(timenow, &tm, tz) == 0) { + year = tm.tm_year+1900; + month = tm.tm_mon+1; + day = tm.tm_mday; + hour = tm.tm_hour; + minute = tm.tm_min; + second = tm.tm_sec; + + if(localtime_l(timenow, &tm_utc, UTC) == 0) { + offset = tm.tm_hour-tm_utc.tm_hour; + } + + hournow = (hour*100)+minute; + if(((hournow == 0 || hournow == risetime || hournow == settime) && second == 0) + || (settime == 0 && risetime == 0)) { + + if(settime == 0 && risetime == 0) { + firstrun = 1; + } + + sunriseset->message = json_mkobject(); + JsonNode *code = json_mkobject(); + risetime = (int)calculate(year, month, day, longitude, latitude, 1)+(offset*100); + settime = (int)calculate(year, month, day, longitude, latitude, 0)+(offset*100); + + json_append_member(code, "longitude", json_mknumber(longitude, 6)); + json_append_member(code, "latitude", json_mknumber(latitude, 6)); + + /* Only communicate the sun state change when they actually occur, + and only communicate the new times when the day changes */ + if(hournow != 0 || firstrun == 1) { + if(hournow >= risetime && hournow < settime) { + json_append_member(code, "sun", json_mkstring("rise")); + } else { + json_append_member(code, "sun", json_mkstring("set")); + } + } + if(hournow == 0 || firstrun == 1) { + json_append_member(code, "sunrise", json_mknumber(((double)risetime/100), 2)); + json_append_member(code, "sunset", json_mknumber(((double)settime/100), 2)); + } + + json_append_member(sunriseset->message, "message", code); + json_append_member(sunriseset->message, "origin", json_mkstring("receiver")); + json_append_member(sunriseset->message, "protocol", json_mkstring(sunriseset->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(sunriseset->id, sunriseset->message, PROTOCOL); + } + json_delete(sunriseset->message); + sunriseset->message = NULL; + firstrun = 0; + } + } + } + + threads--; + return (void *)NULL; +} +#else +static int time_override = -1; + +typedef struct data_t { + char *name; + int interval; + int target_offset; + uv_timer_t *timer_req; + + double longitude; + double latitude; + + char *tz; + + struct data_t *next; +} data_t; + +static struct data_t *data = NULL; +static char UTC[] = "UTC"; + +#ifdef PILIGHT_REWRITE +static void *reason_code_received_free(void *param) { + struct reason_code_received_t *data = param; + FREE(data); + return NULL; +} +#endif + +static double calculate(int year, int month, int day, double lon, double lat, int rising) { + int N = (int)((floor(275 * month / 9)) - ((floor((month + 9) / 12)) * + ((1 + floor((year - 4 * floor(year / 4) + 2) / 3)))) + (int)day - 30); + + double lngHour = lon / 15.0; + double T = 0; + + if(rising) { + T = N + ((6 - lngHour) / 24); + } else { + T = N + ((18 - lngHour) / 24); + } + + double M = (0.9856 * T) - 3.289; + double M1 = M * PI / 180; + double L = fmod((M + (1.916 * sin(M1)) + (0.020 * sin(2 * M1)) + 282.634), 360.0); + double L1 = L * PI / 180; + double L2 = lat * PI / 180; + double SD = 0.39782 * sin(L1); + double CH = (cos(ZENITH * PI / 180)-(SD * sin(L2))) / (cos((PIX * asin((SD))) * PI / 180) * cos(L2)); + + if(CH > 1) { + return -1; + } else if(CH < -1) { + return -1; + } + + double RA = fmod((PIX * atan((0.91764 * tan(L1)))), 360); + double MQ = (RA + (((floor(L / 90)) * 90) - ((floor(RA / 90)) * 90))) / 15; + double A; + double B; + if(rising == 0) { + A = 0.06571; + B = 6.595; + } else { + A = 0.06571; + B = 6.618; + } + + double t = ((rising ? 360 - PIX * acos(CH) : PIX * acos(CH)) / 15) + MQ - (A * T) - B; + double UT = fmod((t - lngHour) + 24.0, 24.0); + double min = (round(60*fmod(UT, 1))/100); + + if(min >= 0.60) { + min -= 0.60; + } + + double hour = UT-min; + + return ((round(hour)+min))*100; +} + +#undef min +static unsigned long min(unsigned long a, unsigned long b, unsigned long c) { + unsigned long m = a; + if(m > b) { + m = b; + } + if(m > c) { + return c; + } + return m; +} + +static void *thread(void *param) { + uv_timer_t *task = param; + struct data_t *settings = task->data; + struct tm tm; + struct tm rise; + struct tm set; + struct tm midnight; + time_t t; + int risetime = 0, settime = 0, hournow = 0; + + if(time_override > -1) { + t = time_override; + } else { + t = time(NULL); + if(isntpsynced() == 0) { + t -= getntpdiff(); + } + } + + if(localtime_l(t, &tm, settings->tz) == 0) { + int year = tm.tm_year+1900; + int month = tm.tm_mon+1; + int day = tm.tm_mday; + int hour = tm.tm_hour; + int minute = tm.tm_min; + + risetime = (int)calculate(year, month, day, settings->longitude, settings->latitude, 1); + settime = (int)calculate(year, month, day, settings->longitude, settings->latitude, 0); + + t = datetime2ts(year, month, day, risetime / 100, risetime % 100, 0); + localtime_l(t, &rise, settings->tz); + risetime = ((rise.tm_hour*100)+rise.tm_min); + + t = datetime2ts(year, month, day, settime / 100, settime % 100, 0); + localtime_l(t, &set, settings->tz); + settime = ((set.tm_hour*100)+set.tm_min); + + memcpy(&midnight, &tm, sizeof(struct tm)); + midnight.tm_hour = 23; + midnight.tm_min = 59; + midnight.tm_sec = 59; + + unsigned long tset = mktime(&set); + unsigned long trise = mktime(&rise); + unsigned long tmidnight = mktime(&midnight); + unsigned long tnow = mktime(&tm); + + /* To make sure we are always calculating ahead */ + if(tset < tnow) { + tset += 86400; + } + if(trise < tnow) { + trise += 86400; + } + if(tmidnight < tnow) { + tmidnight += 86400; + } + + unsigned long time2set = tset-tnow; + unsigned long time2rise = trise-tnow; + unsigned long time2midnight = (tmidnight+1)-tnow; + + char *_sun = NULL; + hournow = (hour*100)+minute; + + if(hournow >= risetime && hournow < settime) { + _sun = "rise"; + } else { + _sun = "set"; + } + +#ifdef PILIGHT_REWRITE + struct reason_code_received_t *data = MALLOC(sizeof(struct reason_code_received_t)); + if(data == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + snprintf(data->message, 1024, + "{\"longitude\":%.6f,\"latitude\":%.6f,\"sun\":\"%s\",\"sunrise\":%.2f,\"sunset\":%.2f}", + settings->longitude, settings->latitude, _sun, (rise.tm_hour+(double)rise.tm_min/100), ((set.tm_hour+(double)set.tm_min/100)) + ); + strncpy(data->origin, "receiver", 255); + data->protocol = sunriseset->id; + if(strlen(pilight_uuid) > 0) { + data->uuid = pilight_uuid; + } else { + data->uuid = NULL; + } + data->repeat = 1; + eventpool_trigger(REASON_CODE_RECEIVED, reason_code_received_free, data); +#else + char message[1024]; + snprintf(message, 1024, + "{\"origin\":\"receiver\",\"protocol\":\"%s\",\"message\":"\ + "{\"longitude\":%.6f,\"latitude\":%.6f,\"sun\":\"%s\",\"sunrise\":%.2f,\"sunset\":%.2f}"\ + "}", + sunriseset->id, settings->longitude, settings->latitude, _sun, (rise.tm_hour+(double)rise.tm_min/100), ((set.tm_hour+(double)set.tm_min/100)) + ); + + sunriseset->message = json_decode(message); + + if(pilight.broadcast != NULL) { + pilight.broadcast(sunriseset->id, sunriseset->message, PROTOCOL); + } + json_delete(sunriseset->message); + sunriseset->message = NULL; +#endif + unsigned long next = 0; + if((next = min(time2set, time2rise, time2midnight)) == 0) { + if(time2set == 0) { + next = time2midnight; + } + if(time2rise == 0) { + next = time2set; + } + if(time2midnight == 0) { + next = time2rise; + } + } + assert(next > 0); + uv_timer_start(settings->timer_req, (void (*)(uv_timer_t *))thread, next*1000, 0); + } + + return (void *)NULL; +} +#endif + +static struct threadqueue_t *initDev(JsonNode *jdevice) { +#ifdef PILIGHT_DEVELOPMENT + loop = 1; + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(sunriseset, json); + return threads_register("sunriseset", &thread, (void *)node, 0); +#else +#ifdef PILIGHT_REWRITE + struct JsonNode *jdevice = NULL; +#endif + struct JsonNode *jprotocols = NULL; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct JsonNode *jchild1 = NULL; + struct data_t *node = NULL; + int match = 0; + +#ifdef PILIGHT_REWRITE + if(param == NULL) { + return NULL; + } +#endif + + if(!(sunriseset->masterOnly == 0 || pilight.runmode == STANDALONE)) { + return NULL; + } + +#ifdef PILIGHT_REWRITE + if((jdevice = json_first_child(param)) == NULL) { + return NULL; + } +#endif + + if((jprotocols = json_find_member(jdevice, "protocol")) != NULL) { + jchild = json_first_child(jprotocols); + while(jchild) { + if(strcmp(sunriseset->id, jchild->string_) == 0) { + match = 1; + break; + } + jchild = jchild->next; + } + } + if(match == 0) { + return NULL; + } + + if((node = MALLOC(sizeof(struct data_t)))== NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(node, '\0', sizeof(struct data_t)); + + if((jid = json_find_member(jdevice, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + jchild1 = json_first_child(jchild); + while(jchild1) { + if(strcmp(jchild1->key, "longitude") == 0) { + node->longitude = jchild1->number_; + } + if(strcmp(jchild1->key, "latitude") == 0) { + node->latitude = jchild1->number_; + } + jchild1 = jchild1->next; + } + jchild = jchild->next; + } + } + + if((node->tz = coord2tz(node->longitude, node->latitude)) == NULL) { + logprintf(LOG_INFO, "sunriseset %s, could not determine timezone, defaulting to UTC", jdevice->key); + node->tz = UTC; + } else { + logprintf(LOG_INFO, "sunriseset %s %.6f:%.6f seems to be in timezone: %s", jdevice->key, node->longitude, node->latitude, node->tz); + } + + if((node->name = MALLOC(strlen(jdevice->key)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(node->name, jdevice->key); + + node->next = data; + data = node; + + if((node->timer_req = MALLOC(sizeof(uv_timer_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + node->timer_req->data = node; + + uv_timer_init(uv_default_loop(), node->timer_req); + + uv_timer_start(node->timer_req, (void (*)(uv_timer_t *))thread, 1, 0); + + return NULL; +#endif +} + +static void threadGC(void) { +#ifdef PILIGHT_DEVELOPMENT + loop = 0; + protocol_thread_stop(sunriseset); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(sunriseset); +#else + struct data_t *tmp = NULL; + while(data) { + tmp = data; +#ifndef PILIGHT_REWRITE + uv_timer_stop(tmp->timer_req); +#endif + FREE(tmp->name); + data = data->next; + FREE(tmp); + } + if(data != NULL) { + FREE(data); + } +#endif +} + +static int checkValues(JsonNode *code) { + char *sun = NULL; + + if(json_find_string(code, "sun", &sun) == 0) { + if(strcmp(sun, "rise") != 0 && strcmp(sun, "set") != 0) { + return 1; + } + } + return 0; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void sunRiseSetInit(void) { + + protocol_register(&sunriseset); + protocol_set_id(sunriseset, "sunriseset"); + protocol_device_add(sunriseset, "sunriseset", "Sunrise / Sunset Calculator"); + sunriseset->devtype = WEATHER; + sunriseset->hwtype = API; + sunriseset->multipleId = 0; +#if PILIGHT_V >= 6 + sunriseset->masterOnly = 1; +#endif + + options_add(&sunriseset->options, 'o', "longitude", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, NULL); + options_add(&sunriseset->options, 'a', "latitude", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, NULL); + options_add(&sunriseset->options, 'u', "sunrise", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{3,4}$"); + options_add(&sunriseset->options, 'd', "sunset", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{3,4}$"); + options_add(&sunriseset->options, 's', "sun", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + + // options_add(&sunriseset->options, 0, "decimals", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)2, "[0-9]"); + options_add(&sunriseset->options, 0, "sunriseset-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)2, "[0-9]"); + options_add(&sunriseset->options, 0, "show-sunriseset", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + + sunriseset->initDev=&initDev; + sunriseset->threadGC=&threadGC; + sunriseset->checkValues=&checkValues; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "sunriseset"; + module->version = "2.6"; + module->reqversion = "6.0"; + module->reqcommit = "115"; +} + +void init(void) { + sunRiseSetInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/sunriseset.h b/lib/ESPiLight/pilight/libs/pilight/protocols/API/sunriseset.h new file mode 100644 index 0000000..59bd1df --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/sunriseset.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_SUNRISESET_H_ +#define _PROTOCOL_SUNRISESET_H_ + +#include "../protocol.h" + +struct protocol_t *sunriseset; +void sunRiseSetInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/wunderground.c b/lib/ESPiLight/pilight/libs/pilight/protocols/API/wunderground.c new file mode 100644 index 0000000..93ba12e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/wunderground.c @@ -0,0 +1,1073 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif +#endif +#include + +#include "../../core/threads.h" +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/datetime.h" // Full path because we also have a datetime protocol +#include "../../core/log.h" +#include "../../core/http.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/json.h" +#include "../../core/gc.h" +#include "wunderground.h" + +#define INTERVAL 900 + +#ifdef PILIGHT_DEVELOPMENT +typedef struct settings_t { + char *api; + char *country; + char *location; + + struct JsonNode *node; + + char *stmp; + int interval; + int ointerval; + + time_t update; + protocol_threads_t *thread; + struct settings_t *next; +} settings_t; + +static pthread_mutex_t lock; +static pthread_mutexattr_t attr; + +static struct settings_t *settings; +static unsigned short loop = 1; +static unsigned short threads = 0; + +static void callback1(int code, char *data, int size, char *type, void *userdata) { + struct settings_t *wnode = userdata; + + struct JsonNode *jdata1 = NULL; + struct JsonNode *jsun = NULL; + struct JsonNode *jsunr = NULL; + struct JsonNode *jsuns = NULL; + + char *shour = NULL, *smin = NULL; + char *rhour = NULL, *rmin = NULL; + + int humi = 0, temp = 0; + + if(code == 200) { + if(strcmp(type, "application/json") == 0) { + if(json_validate(data) == true) { + if((jdata1 = json_decode(data)) != NULL) { + if((jsun = json_find_member(jdata1, "sun_phase")) != NULL) { + if((jsunr = json_find_member(jsun, "sunrise")) != NULL + && (jsuns = json_find_member(jsun, "sunset")) != NULL) { + if(json_find_string(jsuns, "hour", &shour) != 0) { + printf("api.wunderground.com json has no sunset hour key"); + } else if(json_find_string(jsuns, "minute", &smin) != 0) { + printf("api.wunderground.com json has no sunset minute key"); + } else if(json_find_string(jsunr, "hour", &rhour) != 0) { + printf("api.wunderground.com json has no sunrise hour key"); + } else if(json_find_string(jsunr, "minute", &rmin) != 0) { + printf("api.wunderground.com json has no sunrise minute key"); + } else { + temp = wnode->node->number_; + sscanf(wnode->stmp, "%d%%", &humi); + + time_t timenow; + timenow = time(NULL); + + struct tm current; + memset(¤t, '\0', sizeof(struct tm)); + /* + * Retrieving the current day is fine with + * the UTC timezone, because we don't do + * anything with the hours, minutes or seconds. + * We just need to know what day, month, and year + * we are in. + */ +#ifdef _WIN32 + struct tm *ptm; + ptm = gmtime(&timenow); + memcpy(¤t, ptm, sizeof(struct tm)); +#else + gmtime_r(&timenow, ¤t); +#endif + int month = current.tm_mon+1; + int mday = current.tm_mday; + int year = current.tm_year+1900; + + time_t midnight = (datetime2ts(year, month, mday, 23, 59, 59)+1); + time_t sunset = 0; + time_t sunrise = 0; + + wunderground->message = json_mkobject(); + + JsonNode *code = json_mkobject(); + + json_append_member(code, "api", json_mkstring(wnode->api)); + json_append_member(code, "location", json_mkstring(wnode->location)); + json_append_member(code, "country", json_mkstring(wnode->country)); + json_append_member(code, "temperature", json_mknumber((double)temp, 2)); + json_append_member(code, "humidity", json_mknumber((double)humi, 0)); + json_append_member(code, "update", json_mknumber(0, 0)); + sunrise = datetime2ts(year, month, mday, atoi(rhour), atoi(rmin), 0); + json_append_member(code, "sunrise", json_mknumber((double)((atoi(rhour)*100)+atoi(rmin))/100, 2)); + sunset = datetime2ts(year, month, mday, atoi(shour), atoi(smin), 0); + json_append_member(code, "sunset", json_mknumber((double)((atoi(shour)*100)+atoi(smin))/100, 2)); + if(timenow > sunrise && timenow < sunset) { + json_append_member(code, "sun", json_mkstring("rise")); + } else { + json_append_member(code, "sun", json_mkstring("set")); + } + + json_append_member(wunderground->message, "message", code); + json_append_member(wunderground->message, "origin", json_mkstring("receiver")); + json_append_member(wunderground->message, "protocol", json_mkstring(wunderground->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(wunderground->id, wunderground->message, PROTOCOL); + } + json_delete(wunderground->message); + wunderground->message = NULL; + /* Send message when sun rises */ + if(sunrise > timenow) { + if((sunrise-timenow) < wnode->ointerval) { + wnode->interval = (int)(sunrise-timenow); + } + /* Send message when sun sets */ + } else if(sunset > timenow) { + if((sunset-timenow) < wnode->ointerval) { + wnode->interval = (int)(sunset-timenow); + } + /* Update all values when a new day arrives */ + } else { + if((midnight-timenow) < wnode->ointerval) { + wnode->interval = (int)(midnight-timenow); + } + } + + wnode->update = time(NULL); + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com json has no sunset and/or sunrise key"); + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com json has no sun_phase key"); + } + json_delete(jdata1); + } else { + logprintf(LOG_NOTICE, "api.wunderground.com json could not be parsed"); + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com response was not in a valid json format"); + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com response was not in a valid json format"); + } + } else { + logprintf(LOG_NOTICE, "could not reach api.wundergrond.com"); + } +} + +static void callback(int code, char *data, int size, char *type, void *userdata) { + struct settings_t *wnode = userdata; + char url[1024]; + + struct JsonNode *jdata = NULL; + struct JsonNode *jobs = NULL; + // double temp = 0; + + if(code == 200) { + if(strstr(type, "application/json") != NULL) { + if(json_validate(data) == true) { + if((jdata = json_decode(data)) != NULL) { + if((jobs = json_find_member(jdata, "current_observation")) != NULL) { + if((wnode->node = json_find_member(jobs, "temp_c")) == NULL) { + printf("api.wunderground.com json has no temp_c key"); + } else if(json_find_string(jobs, "relative_humidity", &wnode->stmp) != 0) { + printf("api.wunderground.com json has no relative_humidity key"); + } else { + if(wnode->node->tag != JSON_NUMBER) { + printf("api.wunderground.com json has no temp_c key"); + } else { + sprintf(url, "http://api.wunderground.com/api/%s/astronomy/q/%s/%s.json", wnode->api, wnode->country, wnode->location); + http_get_content(url, callback1, wnode); + } + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com json has no current_observation key"); + } + json_delete(jdata); + } else { + logprintf(LOG_NOTICE, "api.wunderground.com json could not be parsed"); + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com response was not in a valid json format"); + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com response was not in a valid json format"); + } + } else { + logprintf(LOG_NOTICE, "could not reach api.wundergrond.com"); + } +} + +static void *thread(void *param) { + struct protocol_threads_t *thread = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)thread->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct JsonNode *jchild1 = NULL; + struct settings_t *wnode = MALLOC(sizeof(struct settings_t)); + + wnode->interval = 86400; + wnode->ointerval = 86400; + wnode->stmp = NULL; + + int event = 0; + int firstrun = 1, nrloops = 0, timeout = 0; + + char url[1024]; + double itmp = -1; + + if(wnode == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + threads++; + + int has_country = 0, has_api = 0, has_location = 0; + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + has_country = 0, has_api = 0, has_location = 0; + jchild1 = json_first_child(jchild); + + while(jchild1) { + if(strcmp(jchild1->key, "api") == 0) { + has_api = 1; + if((wnode->api = MALLOC(strlen(jchild1->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(wnode->api, jchild1->string_); + } + if(strcmp(jchild1->key, "location") == 0) { + has_location = 1; + if((wnode->location = MALLOC(strlen(jchild1->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(wnode->location, jchild1->string_); + } + if(strcmp(jchild1->key, "country") == 0) { + has_country = 1; + if((wnode->country = MALLOC(strlen(jchild1->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(wnode->country, jchild1->string_); + } + jchild1 = jchild1->next; + } + if(has_country == 1 && has_api == 1 && has_location == 1) { + wnode->thread = thread; + wnode->next = settings; + settings = wnode; + } else { + if(has_country == 1) { + FREE(wnode->country); + } + if(has_location == 1) { + FREE(wnode->location); + } + if(has_api == 1) { + FREE(wnode->api); + } + FREE(wnode); + wnode = NULL; + } + jchild = jchild->next; + } + } + + if(!wnode) { + return 0; + } + + if(json_find_number(json, "poll-interval", &itmp) == 0) + wnode->interval = (int)round(itmp); + wnode->ointerval = wnode->interval; + + while(loop) { + event = protocol_thread_wait(thread, INTERVAL, &nrloops); + pthread_mutex_lock(&lock); + if(loop == 0) { + break; + } + timeout += INTERVAL; + if(timeout >= wnode->interval || event != ETIMEDOUT || firstrun == 1) { + timeout = 0; + wnode->interval = wnode->ointerval; + + sprintf(url, "http://api.wunderground.com/api/%s/geolookup/conditions/q/%s/%s.json", wnode->api, wnode->country, wnode->location); + http_get_content(url, callback, wnode); + } else { + wunderground->message = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "api", json_mkstring(wnode->api)); + json_append_member(code, "location", json_mkstring(wnode->location)); + json_append_member(code, "country", json_mkstring(wnode->country)); + json_append_member(code, "update", json_mknumber(1, 0)); + json_append_member(wunderground->message, "message", code); + json_append_member(wunderground->message, "origin", json_mkstring("receiver")); + json_append_member(wunderground->message, "protocol", json_mkstring(wunderground->id)); + if(pilight.broadcast != NULL) { + pilight.broadcast(wunderground->id, wunderground->message, PROTOCOL); + } + json_delete(wunderground->message); + wunderground->message = NULL; + } + firstrun = 0; + pthread_mutex_unlock(&lock); + } + pthread_mutex_unlock(&lock); + + threads--; + return (void *)NULL; +} +#else +static int min_interval = INTERVAL; +static int time_override = -1; +static char url[2][1024] = { + "http://api.wunderground.com/api/%s/geolookup/conditions/q/%s/%s.json", + "http://api.wunderground.com/api/%s/astronomy/q/%s/%s.json" +}; + +typedef struct data_t { + char *country; + char *location; + char *key; + char *api; + char tz[128]; + uv_timer_t *enable_timer_req; + uv_timer_t *update_timer_req; + + double temp; + int humi; + + int interval; + double temp_offset; + + unsigned long sunrisesetid; + unsigned long updateid; + unsigned long initid; + + time_t update; + struct data_t *next; +} data_t; + +static struct data_t *data = NULL; + +static void *update(void *param); +static void *enable(void *param); + +#ifdef PILIGHT_REWRITE +static void *reason_code_received_free(void *param) { + struct reason_code_received_t *data = param; + FREE(data); + return NULL; +} +#endif + +static void callback2(int code, char *data, int size, char *type, void *userdata) { + struct data_t *settings = userdata; + struct JsonNode *jdata = NULL; + struct JsonNode *jsun = NULL; + struct JsonNode *jsunr = NULL; + struct JsonNode *jsuns = NULL; + char *shour = NULL, *smin = NULL; + char *rhour = NULL, *rmin = NULL; + struct tm tm; + + memset(&tm, 0, sizeof(struct tm)); + + if(code == 200) { + if(strstr(type, "application/json") != NULL) { + if(json_validate(data) == true) { + if((jdata = json_decode(data)) != NULL) { + if((jsun = json_find_member(jdata, "sun_phase")) != NULL) { + if((jsunr = json_find_member(jsun, "sunrise")) != NULL + && (jsuns = json_find_member(jsun, "sunset")) != NULL) { + if(json_find_string(jsuns, "hour", &shour) != 0) { + logprintf(LOG_NOTICE, "api.wunderground.com json has no sunset hour key"); + } else if(json_find_string(jsuns, "minute", &smin) != 0) { + logprintf(LOG_NOTICE, "api.wunderground.com json has no sunset minute key"); + } else if(json_find_string(jsunr, "hour", &rhour) != 0) { + logprintf(LOG_NOTICE, "api.wunderground.com json has no sunrise hour key"); + } else if(json_find_string(jsunr, "minute", &rmin) != 0) { + logprintf(LOG_NOTICE, "api.wunderground.com json has no sunrise minute key"); + } else { + + time_t timenow; + if(time_override > -1) { + timenow = time_override; + } else { + timenow = time(NULL); + } + + struct tm current; + memset(¤t, '\0', sizeof(struct tm)); + /* + * Retrieving the current day is fine with + * the UTC timezone, because we don't do + * anything with the hours, minutes or seconds. + * We just need to know what day, month, and year + * we are in. + */ +#ifdef _WIN32 + struct tm *ptm; + ptm = gmtime(&timenow); + memcpy(¤t, ptm, sizeof(struct tm)); +#else + gmtime_r(&timenow, ¤t); +#endif + + int month = current.tm_mon+1; + int mday = current.tm_mday; + int year = current.tm_year+1900; + char *_sun = NULL; + + time_t midnight = (datetime2ts(year, month, mday, 23, 59, 59)+1); + time_t sunset = datetime2ts(year, month, mday, atoi(shour), atoi(smin), 0); + time_t sunrise = datetime2ts(year, month, mday, atoi(rhour), atoi(rmin), 0); + + if(timenow > sunrise && timenow < sunset) { + _sun = "rise"; + } else { + _sun = "set"; + } + +#ifdef PILIGHT_REWRITE + struct reason_code_received_t *data = MALLOC(sizeof(struct reason_code_received_t)); + if(data == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + snprintf(data->message, 1024, + "{\"api\":\"%s\",\"location\":\"%s\",\"country\":\"%s\",\"temperature\":%.2f,\"humidity\":%d,\"update\":0,\"sunrise\":%.2f,\"sunset\":%.2f,\"sun\":\"%s\"}", + settings->api, settings->location, settings->country, settings->temp, settings->humi, + ((double)((atoi(rhour)*100)+atoi(rmin))/100), ((double)((atoi(shour)*100)+atoi(smin))/100), _sun + ); + strncpy(data->origin, "receiver", 255); + data->protocol = wunderground->id; + if(strlen(pilight_uuid) > 0) { + data->uuid = pilight_uuid; + } else { + data->uuid = NULL; + } + data->repeat = 1; + eventpool_trigger(REASON_CODE_RECEIVED, reason_code_received_free, data); +#else + char message[1024]; + snprintf(message, 1024, + "{\"origin\":\"receiver\",\"protocol\":\"%s\",\"message\":"\ + "{\"api\":\"%s\",\"location\":\"%s\",\"country\":\"%s\",\"temperature\":%.2f,\"humidity\":%d,\"update\":0,\"sunrise\":%.2f,\"sunset\":%.2f,\"sun\":\"%s\"}"\ + "}", + wunderground->id, settings->api, settings->location, settings->country, settings->temp, settings->humi, + ((double)((atoi(rhour)*100)+atoi(rmin))/100), ((double)((atoi(shour)*100)+atoi(smin))/100), _sun + ); + + wunderground->message = json_decode(message); + + if(pilight.broadcast != NULL) { + pilight.broadcast(wunderground->id, wunderground->message, PROTOCOL); + } + json_delete(wunderground->message); + wunderground->message = NULL; +#endif + /* Send message when sun rises */ + if(sunrise > timenow) { + if((sunrise-timenow) < settings->interval) { + settings->interval = (int)(sunrise-timenow); + } + /* Send message when sun sets */ + } else if(sunset > timenow) { + if((sunset-timenow) < settings->interval) { + settings->interval = (int)(sunset-timenow); + } + /* Update all values when a new day arrives */ + } else { + if((midnight-timenow) < settings->interval) { + settings->interval = (int)(midnight-timenow); + } + } + + if(time_override > -1) { + settings->update = time_override; + } else { + settings->update = time(NULL); + } + + /* + * Update all values on next event as described above + */ + assert(settings->interval > 0); + uv_timer_start(settings->update_timer_req, (void (*)(uv_timer_t *))update, settings->interval*1000, 0); + /* + * Allow updating the values customly after INTERVAL seconds + */ + assert(min_interval > 0); + uv_timer_start(settings->enable_timer_req, (void (*)(uv_timer_t *))enable, min_interval*1000, 0); + + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com json has no sunset and/or sunrise key"); + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com json has no sun_phase key"); + } + json_delete(jdata); + } else { + logprintf(LOG_NOTICE, "api.wunderground.com json could not be parsed"); + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com response was not in a valid json format"); + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com response was not in a valid json format"); + } + } else { + logprintf(LOG_NOTICE, "could not reach api.wunderground.com"); + } + return; +} + +static void callback1(int code, char *data, int size, char *type, void *userdata) { + struct data_t *settings = userdata; + struct JsonNode *jdata = NULL; + struct JsonNode *jobs = NULL; + struct JsonNode *jloc = NULL; + struct JsonNode *node = NULL; + char *stmp = NULL; + + if(code == 200) { + if(strstr(type, "application/json") != NULL) { + if(json_validate(data) == true) { + if((jdata = json_decode(data)) != NULL) { + if((jloc = json_find_member(jdata, "location")) != NULL) { + if((node = json_find_member(jloc, "tz_long")) == NULL) { + logprintf(LOG_NOTICE, "api.wunderground.com json has no tz_long key"); + } else { + if(node->tag != JSON_STRING) { + logprintf(LOG_NOTICE, "api.wunderground.com json has no tz_long key"); + } else { + strcpy(settings->tz, node->string_); + if((jobs = json_find_member(jdata, "current_observation")) != NULL) { + if((node = json_find_member(jobs, "temp_c")) == NULL) { + logprintf(LOG_NOTICE, "api.wunderground.com json has no temp_c key"); + } else if(json_find_string(jobs, "relative_humidity", &stmp) != 0) { + logprintf(LOG_NOTICE, "api.wunderground.com json has no relative_humidity key"); + } else { + if(node->tag != JSON_NUMBER) { + logprintf(LOG_NOTICE, "api.wunderground.com json has no temp_c key"); + } else { + settings->temp = node->number_; + sscanf(stmp, "%d%%", &settings->humi); + + char parsed[1024]; + char *enc = urlencode(settings->location); + memset(parsed, '\0', 1024); + snprintf(parsed, 1024, url[1], settings->api, settings->country, enc); + FREE(enc); + + http_get_content(parsed, callback2, userdata); + } + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com json has no current_observation key"); + } + } + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com json has no location key"); + } + json_delete(jdata); + } else { + logprintf(LOG_NOTICE, "api.wunderground.com json could not be parsed"); + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com response was not in a valid json format"); + } + } else { + logprintf(LOG_NOTICE, "api.wunderground.com response was not in a valid json format"); + } + } else { + logprintf(LOG_NOTICE, "could not reach api.wunderground.com"); + } + return; +} + +static void thread_free(uv_work_t *req, int status) { + FREE(req); +} + +static void thread(uv_work_t *req) { + struct data_t *settings = req->data; + char parsed[1024]; + char *enc = urlencode(settings->location); + + memset(parsed, '\0', 1024); + snprintf(parsed, 1024, url[0], settings->api, settings->country, enc); + FREE(enc); + + http_get_content(parsed, callback1, settings); + + return; +} + +static void *update(void *param) { + uv_timer_t *timer_req = param; + struct data_t *settings = timer_req->data; + + uv_work_t *work_req = NULL; + if((work_req = MALLOC(sizeof(uv_work_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + work_req->data = settings; + uv_queue_work(uv_default_loop(), work_req, "wunderground", thread, thread_free); + if(time_override > -1) { + settings->update = time_override; + } else { + settings->update = time(NULL); + } + return NULL; +} + +static void *enable(void *param) { + uv_timer_t *timer_req = param; + struct data_t *settings = timer_req->data; + +#ifdef PILIGHT_REWRITE + struct reason_code_received_t *data = MALLOC(sizeof(struct reason_code_received_t)); + if(data == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + }; + snprintf(data->message, 1024, + "{\"api\":\"%s\",\"location\":\"%s\",\"country\":\"%s\",\"update\":1}", + settings->api, settings->location, settings->country + ); + strncpy(data->origin, "receiver", 255); + data->protocol = wunderground->id; + if(strlen(pilight_uuid) > 0) { + data->uuid = pilight_uuid; + } else { + data->uuid = NULL; + } + data->repeat = 1; + eventpool_trigger(REASON_CODE_RECEIVED, reason_code_received_free, data); +#else + char message[1024]; + snprintf(message, 1024, + "{\"origin\":\"receiver\",\"protocol\":\"%s\",\"message\":"\ + "{\"api\":\"%s\",\"location\":\"%s\",\"country\":\"%s\",\"update\":1}"\ + "}", + wunderground->id, settings->api, settings->location, settings->country + ); + + wunderground->message = json_decode(message); + + if(pilight.broadcast != NULL) { + pilight.broadcast(wunderground->id, wunderground->message, PROTOCOL); + } + json_delete(wunderground->message); + wunderground->message = NULL; +#endif + return NULL; +} +#endif + +static struct threadqueue_t *initDev(struct JsonNode *jdevice) { +#ifdef PILIGHT_DEVELOPMENT + loop = 1; + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(wunderground, json); + return threads_register("wunderground", &thread, (void *)node, 0); +#else +#ifdef PILIGHT_REWRITE + struct JsonNode *jdevice = NULL; +#endif + struct JsonNode *jprotocols = NULL; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct JsonNode *jchild1 = NULL; + struct data_t *node = NULL; + double itmp = 0; + int match = 0; + +#ifdef PILIGHT_REWRITE + if(param == NULL) { + return NULL; + } +#endif + + if(!(wunderground->masterOnly == 0 || pilight.runmode == STANDALONE)) { + return NULL; + } +#ifdef PILIGHT_REWRITE + if((jdevice = json_first_child(param)) == NULL) { + return NULL; + } +#endif + if((jprotocols = json_find_member(jdevice, "protocol")) != NULL) { + jchild = json_first_child(jprotocols); + while(jchild) { + if(strcmp(wunderground->id, jchild->string_) == 0) { + match = 1; + break; + } + jchild = jchild->next; + } + } + + if(match == 0) { + return NULL; + } + + if((node = MALLOC(sizeof(struct data_t)))== NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + memset(node, '\0', sizeof(struct data_t)); + + node->interval = INTERVAL; + node->country = NULL; + node->location = NULL; + node->update = 0; + node->temp_offset = 0; + + int has_country = 0, has_location = 0, has_api = 0; + if((jid = json_find_member(jdevice, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + has_country = 0, has_location = 0; + jchild1 = json_first_child(jchild); + + while(jchild1) { + if(strcmp(jchild1->key, "api") == 0) { + has_api = 1; + if((node->api = MALLOC(strlen(jchild1->string_)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(node->api, jchild1->string_); + } + if(strcmp(jchild1->key, "location") == 0) { + has_location = 1; + if((node->location = MALLOC(strlen(jchild1->string_)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(node->location, jchild1->string_); + } + if(strcmp(jchild1->key, "country") == 0) { + has_country = 1; + if((node->country = MALLOC(strlen(jchild1->string_)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(node->country, jchild1->string_); + } + jchild1 = jchild1->next; + } + if(has_country == 1 && has_location == 1 && has_api == 1) { + node->next = data; + data = node; + } else { + if(has_country == 1) { + FREE(node->country); + } + if(has_location == 1) { + FREE(node->location); + } + FREE(node); + node = NULL; + } + jchild = jchild->next; + } + } + + if(node == NULL) { + return NULL; + } + if(json_find_number(jdevice, "poll-interval", &itmp) == 0) + node->interval = (int)round(itmp); + json_find_number(jdevice, "temperature-offset", &node->temp_offset); + + if((node->key = MALLOC(strlen(jdevice->key)+1)) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + strcpy(node->key, jdevice->key); + node->temp = 0.0; + node->humi = 0; + + if((node->enable_timer_req = MALLOC(sizeof(uv_timer_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + if((node->update_timer_req = MALLOC(sizeof(uv_timer_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + + node->enable_timer_req->data = node; + node->update_timer_req->data = node; + + uv_timer_init(uv_default_loop(), node->enable_timer_req); + uv_timer_init(uv_default_loop(), node->update_timer_req); + + assert(node->interval > 0); + uv_timer_start(node->enable_timer_req, (void (*)(uv_timer_t *))enable, node->interval*1000, 0); + /* + * Do an update when this device is added after 3 seconds + * to make sure pilight is actually running. + */ + uv_timer_start(node->update_timer_req, (void (*)(uv_timer_t *))update, 3000, 0); +#endif + return NULL; +} + +static int checkValues(JsonNode *code) { + double interval = INTERVAL; + + json_find_number(code, "poll-interval", &interval); + + if((int)round(interval) < INTERVAL) { + logprintf(LOG_ERR, "wunderground poll-interval cannot be lower than %d", INTERVAL); + return 1; + } + + return 0; +} + +static int createCode(JsonNode *code) { +#ifdef PILIGHT_DEVELOPMENT + struct settings_t *wtmp = settings; + char *country = NULL; + char *location = NULL; + char *api = NULL; + double itmp = 0; + time_t currenttime = 0; + + if(json_find_number(code, "min-interval", &itmp) == 0) { + logprintf(LOG_ERR, "you can't override the min-interval setting"); + return EXIT_FAILURE; + } + + if(json_find_string(code, "country", &country) == 0 && + json_find_string(code, "location", &location) == 0 && + json_find_string(code, "api", &api) == 0 && + json_find_number(code, "update", &itmp) == 0) { + + while(wtmp) { + if(strcmp(wtmp->country, country) == 0 + && strcmp(wtmp->location, location) == 0 + && strcmp(wtmp->api, api) == 0) { + if((currenttime-wtmp->update) > INTERVAL) { + pthread_mutex_unlock(&wtmp->thread->mutex); + pthread_cond_signal(&wtmp->thread->cond); + wtmp->update = time(NULL); + } + } + wtmp = wtmp->next; + } + } else { + logprintf(LOG_ERR, "wunderground: insufficient number of arguments"); + return EXIT_FAILURE; + } +#else + struct data_t *tmp = data; + char *country = NULL; + char *location = NULL; + char *api = NULL; + double itmp = 0; + + if(json_find_number(code, "min-interval", &itmp) == 0) { + logprintf(LOG_ERR, "you can't override the min-interval setting"); + return EXIT_FAILURE; + } + + if(json_find_string(code, "country", &country) == 0 && + json_find_string(code, "location", &location) == 0 && + json_find_string(code, "api", &api) == 0 && + json_find_number(code, "update", &itmp) == 0) { + + while(tmp) { + if(strcmp(tmp->country, country) == 0 + && strcmp(tmp->location, location) == 0 + && strcmp(tmp->api, api) == 0) { + + time_t currenttime = time(NULL); + if(time_override > -1) { + currenttime = time_override; + } + + if((currenttime-tmp->update) > INTERVAL) { + uv_work_t *work_req = NULL; + if((work_req = MALLOC(sizeof(uv_work_t))) == NULL) { + OUT_OF_MEMORY /*LCOV_EXCL_LINE*/ + } + work_req->data = tmp; + uv_queue_work(uv_default_loop(), work_req, "wunderground", thread, thread_free); + + if(time_override > -1) { + tmp->update = time_override; + } else { + tmp->update = time(NULL); + } + } + } + tmp = tmp->next; + } + } else { + logprintf(LOG_ERR, "wunderground: insufficient number of arguments"); + return EXIT_FAILURE; + } +#endif + return EXIT_SUCCESS; +} + +static void threadGC(void) { +#ifdef PILIGHT_DEVELOPMENT + loop = 0; + protocol_thread_stop(wunderground); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(wunderground); + + struct settings_t *wtmp = NULL; + while(settings) { + wtmp = settings; + FREE(settings->api); + FREE(settings->country); + FREE(settings->location); + settings = settings->next; + FREE(wtmp); + } + if(settings != NULL) { + FREE(settings); + } +#else + struct data_t *tmp = NULL; + while(data) { + tmp = data; +#ifndef PILIGHT_REWRITE + uv_timer_stop(tmp->enable_timer_req); + uv_timer_stop(tmp->update_timer_req); +#endif + FREE(tmp->api); + FREE(tmp->country); + FREE(tmp->location); + FREE(tmp->key); + data = data->next; + FREE(tmp); + } + if(data != NULL) { + FREE(data); + } +#endif +} + +static void printHelp(void) { + printf("\t -c --country=country\t\tupdate an entry with this country\n"); + printf("\t -l --location=location\t\tupdate an entry with this location\n"); + printf("\t -a --api=api\t\t\tupdate an entry with this api code\n"); + printf("\t -u --update\t\t\tupdate the defined weather entry\n"); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void wundergroundInit(void) { +#ifdef PILIGHT_DEVELOPMENT + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&lock, &attr); +#endif + protocol_register(&wunderground); + protocol_set_id(wunderground, "wunderground"); + protocol_device_add(wunderground, "wunderground", "Weather Underground API"); + wunderground->devtype = WEATHER; + wunderground->hwtype = API; + wunderground->multipleId = 0; + wunderground->masterOnly = 1; + + options_add(&wunderground->options, 't', "temperature", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{1,5}$"); + options_add(&wunderground->options, 'h', "humidity", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{1,5}$"); + options_add(&wunderground->options, 'a', "api", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "^[a-z0-9]+$"); + options_add(&wunderground->options, 'l', "location", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "^[a-z_]+$"); + options_add(&wunderground->options, 'c', "country", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "^[a-z]+$"); + options_add(&wunderground->options, 'x', "sunrise", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{3,4}$"); + options_add(&wunderground->options, 'y', "sunset", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{3,4}$"); + options_add(&wunderground->options, 's', "sun", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&wunderground->options, 'u', "update", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + + // options_add(&wunderground->options, 0, "decimals", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)2, "[0-9]"); + options_add(&wunderground->options, 0, "temperature-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)2, "[0-9]"); + options_add(&wunderground->options, 0, "humidity-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)2, "[0-9]"); + options_add(&wunderground->options, 0, "sunriseset-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)2, "[0-9]"); + options_add(&wunderground->options, 0, "show-humidity", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&wunderground->options, 0, "show-temperature", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&wunderground->options, 0, "show-sunriseset", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&wunderground->options, 0, "show-update", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&wunderground->options, 0, "poll-interval", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)86400, "[0-9]"); + + wunderground->createCode=&createCode; + wunderground->initDev=&initDev; + wunderground->checkValues=&checkValues; + wunderground->threadGC=&threadGC; + wunderground->printHelp=&printHelp; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "wunderground"; + module->version = "1.13"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + wundergroundInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/wunderground.h b/lib/ESPiLight/pilight/libs/pilight/protocols/API/wunderground.h new file mode 100644 index 0000000..a72b078 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/wunderground.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_WUNDERGROUND_H_ +#define _PROTOCOL_WUNDERGROUND_H_ + +#include "../protocol.h" + +struct protocol_t *wunderground; +void wundergroundInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/xbmc.c b/lib/ESPiLight/pilight/libs/pilight/protocols/API/xbmc.c new file mode 100644 index 0000000..d6b7493 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/xbmc.c @@ -0,0 +1,425 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #include + #include + #define MSG_NOSIGNAL 0 +#else + #ifdef __mips__ + #define __USE_UNIX98 + #endif + #include + #include + #include + #include + #include + #include +#endif +#include +#include +#include + +#include "../../core/threads.h" +#include "../../core/pilight.h" +#include "../../core/network.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../../core/socket.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/json.h" +#include "../../core/gc.h" +#include "xbmc.h" + +typedef struct data_t { + char *server; + int port; + int sockfd; + struct data_t *next; +} data_t; + +static pthread_mutex_t xbmclock; +static pthread_mutexattr_t xbmcattr; + +static struct data_t *data; +static unsigned short loop = 1; +static unsigned short threads = 0; + +static void createMessage(char *server, int port, char *action, char *media) { + xbmc->message = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "action", json_mkstring(action)); + json_append_member(code, "media", json_mkstring(media)); + json_append_member(code, "server", json_mkstring(server)); + json_append_member(code, "port", json_mknumber(port, 0)); + + json_append_member(xbmc->message, "message", code); + json_append_member(xbmc->message, "origin", json_mkstring("receiver")); + json_append_member(xbmc->message, "protocol", json_mkstring(xbmc->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(xbmc->id, xbmc->message, PROTOCOL); + } + json_delete(xbmc->message); + xbmc->message = NULL; +} + +static void *thread(void *param) { + struct protocol_threads_t *node = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)node->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct JsonNode *jchild1 = NULL; + struct sockaddr_in serv_addr; + struct data_t *xnode = MALLOC(sizeof(struct data_t)); + + char recvBuff[BUFFER_SIZE], action[10], media[15]; + char *m = NULL, *t = NULL; + char shut[] = "shutdown"; + char home[] = "home"; + char none[] = "none"; + int nrloops = 0, bytes = 0, n = 0, has_server = 0; + int has_port = 0, reset = 1, maxfd = 0, retry = 0; + fd_set fdsread; + struct timeval timeout; + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + if(xnode == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + /* Clear the server address */ + memset(&serv_addr, '\0', sizeof(serv_addr)); + memset(&recvBuff, '\0', BUFFER_SIZE); + memset(&action, '\0', 10); + memset(&media, '\0', 15); + + threads++; + + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + jchild1 = json_first_child(jchild); + + while(jchild1) { + if(strcmp(jchild1->key, "server") == 0) { + if((xnode->server = MALLOC(strlen(jchild1->string_)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(xnode->server, jchild1->string_); + has_server = 1; + } + if(strcmp(jchild1->key, "port") == 0) { + xnode->port = (int)round(jchild1->number_); + has_port = 1; + } + jchild1 = jchild1->next; + } + if(has_server == 1 && has_port == 1) { + xnode->sockfd = -1; + xnode->next = data; + data = xnode; + } else { + if(has_server == 1) { + FREE(xnode->server); + } + FREE(xnode); + xnode = NULL; + } + jchild = jchild->next; + } + } + + if(xnode == NULL) { + return (void *)NULL;; + } + +#ifdef _WIN32 + WSADATA wsa; + + if(WSAStartup(0x202, &wsa) != 0) { + logprintf(LOG_ERR, "could not initialize new socket"); + return (void *)NULL; + } +#endif + + while(loop) { + + if(reset == 1) { + createMessage(xnode->server, xnode->port, shut, none); + reset = 0; + } + + if(xnode->sockfd > -1) { + close(xnode->sockfd); + xnode->sockfd = -1; + } + + /* Try to open a new socket */ + if((xnode->sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + logprintf(LOG_NOTICE, "could not create XBMC/Kodi socket"); + break; + } + + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons((unsigned short)xnode->port); + + inet_pton(AF_INET, xnode->server, &serv_addr.sin_addr); + + retry = 0; + /* Connect to the server */ + switch(socket_timeout_connect(xnode->sockfd, (struct sockaddr *)&serv_addr, 3)) { + case -1: + logprintf(LOG_NOTICE, "could not connect to XBMC/Kodi server @%s", xnode->server); + protocol_thread_wait(node, 3, &nrloops); + retry = 1; + break; + case -2: + logprintf(LOG_NOTICE, "XBMC/Kodi connection timeout @%s", xnode->server); + protocol_thread_wait(node, 3, &nrloops); + retry = 1; + break; + case -3: + logprintf(LOG_NOTICE, "Error in XBMC/Kodi socket connection @%s", xnode->server); + protocol_thread_wait(node, 3, &nrloops); + retry = 1; + break; + default: + createMessage(xnode->server, xnode->port, home, none); + reset = 1; + break; + } + if(retry == 1) { + continue; + } + + struct data_t *xtmp = data; + while(xtmp) { + if(xtmp->sockfd > -1) { + if(maxfd < xtmp->sockfd) { + maxfd = xtmp->sockfd; + } + } + xtmp = xtmp->next; + } + + while(loop) { + pthread_mutex_lock(&xbmclock); + FD_ZERO(&fdsread); + FD_SET((unsigned long)xnode->sockfd, &fdsread); + + do { + n = select(maxfd+1, &fdsread, NULL, NULL, &timeout); + } while(n == -1 && errno == EINTR && loop); + + if(loop == 0) { + pthread_mutex_unlock(&xbmclock); + break; + } + + if(n == -1) { + pthread_mutex_unlock(&xbmclock); + break; + } else if(n == 0) { + usleep(100000); + } else if(n > 0) { + if(FD_ISSET((unsigned long)xnode->sockfd, &fdsread)) { + bytes = (int)recv(xnode->sockfd, recvBuff, BUFFER_SIZE, 0); + if(bytes <= 0) { + pthread_mutex_unlock(&xbmclock); + break; + } else { + if(json_validate(recvBuff) == true) { + JsonNode *joutput = json_decode(recvBuff); + JsonNode *params = NULL; + JsonNode *data = NULL; + JsonNode *item = NULL; + + if(json_find_string(joutput, "method", &m) == 0) { + if(strcmp(m, "GUI.OnScreensaverActivated") == 0) { + strcpy(media, "screensaver"); + strcpy(action, "active"); + } else if(strcmp(m, "GUI.OnScreensaverDeactivated") == 0) { + strcpy(media, "screensaver"); + strcpy(action, "inactive"); + } else { + if((params = json_find_member(joutput, "params")) != NULL) { + if((data = json_find_member(params, "data")) != NULL) { + if((item = json_find_member(data, "item")) != NULL) { + if(json_find_string(item, "type", &t) == 0) { + xbmc->message = json_mkobject(); + + strcpy(media, t); + if(strcmp(m, "Player.OnPlay") == 0) { + strcpy(action, "play"); + } else if(strcmp(m, "Player.OnStop") == 0) { + strcpy(action, home); + strcpy(media, none); + } else if(strcmp(m, "Player.OnPause") == 0) { + strcpy(action, "pause"); + } + } + } + } + } + } + if(strlen(media) > 0 && strlen(action) > 0) { + createMessage(xnode->server, xnode->port, action, media); + reset = 1; + } + } + json_delete(joutput); + } + memset(recvBuff, '\0', BUFFER_SIZE); + memset(&action, '\0', 10); + memset(&media, '\0', 15); + } + } + } + pthread_mutex_unlock(&xbmclock); + } + } + pthread_mutex_unlock(&xbmclock); + + threads--; + return (void *)NULL; +} + +static struct threadqueue_t *initDev(JsonNode *jdevice) { + loop = 1; + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(xbmc, json); + return threads_register("xbmc", &thread, (void *)node, 0); +} + +static void threadGC(void) { + loop = 0; + struct data_t *xtmp = NULL; + + while(data) { + xtmp = data; + if(xtmp->sockfd > -1) { + close(xtmp->sockfd); + xtmp->sockfd = -1; + } + FREE(xtmp->server); + data = data->next; + FREE(xtmp); + } + + protocol_thread_stop(xbmc); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(xbmc); +} + +static int checkValues(JsonNode *code) { + char *action = NULL; + char *media = NULL; + + if(json_find_string(code, "action", &action) == 0 && + json_find_string(code, "media", &media) == 0) { + if(strcmp(media, "none") == 0) { + if(!(strcmp(action, "shutdown") == 0 || strcmp(action, "home") == 0)) { + return 1; + } else { + return 0; + } + } else if(strcmp(media, "episode") == 0 + || strcmp(media, "movie") == 0 + || strcmp(media, "movies") == 0 + || strcmp(media, "song") == 0) { + if(!(strcmp(action, "play") == 0 || strcmp(action, "pause") == 0)) { + return 1; + } else { + return 0; + } + } else if(strcmp(media, "screensaver") == 0) { + if(!(strcmp(action, "active") == 0 || strcmp(action, "inactive") == 0)) { + return 1; + } else { + return 0; + } + } else { + return 1; + } + } else { + return 1; + } + return 0; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void xbmcInit(void) { + pthread_mutexattr_init(&xbmcattr); + pthread_mutexattr_settype(&xbmcattr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&xbmclock, &xbmcattr); + + protocol_register(&xbmc); + protocol_set_id(xbmc, "xbmc"); + protocol_device_add(xbmc, "xbmc", "XBMC API"); + protocol_device_add(xbmc, "kodi", "Kodi API"); + xbmc->devtype = XBMC; + xbmc->hwtype = API; + xbmc->multipleId = 0; + + options_add(&xbmc->options, 'a', "action", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&xbmc->options, 'm', "media", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&xbmc->options, 's', "server", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, NULL); + options_add(&xbmc->options, 'p', "port", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, NULL); + + options_add(&xbmc->options, 0, "show-media", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&xbmc->options, 0, "show-action", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + + xbmc->initDev=&initDev; + xbmc->threadGC=&threadGC; + xbmc->checkValues=&checkValues; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "xbmc"; + module->version = "1.8"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + xbmcInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/API/xbmc.h b/lib/ESPiLight/pilight/libs/pilight/protocols/API/xbmc.h new file mode 100644 index 0000000..9f63ccf --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/API/xbmc.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_XBMC_H_ +#define _PROTOCOL_XBMC_H_ + +#include "../protocol.h" + +struct protocol_t *xbmc; +void xbmcInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/CMakeExclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/CMakeExclude.txt new file mode 100644 index 0000000..b06943b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/CMakeExclude.txt @@ -0,0 +1,12 @@ +include(../../../CMakeConfig.txt) + +if(${ZWAVE} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_headers_includes "${PROJECT_SOURCE_DIR}/zwave/protocol_header.h") + list(REMOVE_ITEM ${PROJECT_NAME}_init_includes "${PROJECT_SOURCE_DIR}/zwave/protocol_init.h") +endif() + +if(${IR} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_headers_includes "${PROJECT_SOURCE_DIR}/IR/protocol_header.h") + list(REMOVE_ITEM ${PROJECT_NAME}_init_includes "${PROJECT_SOURCE_DIR}/IR/protocol_init.h") +endif() + \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/CMakeInclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/CMakeInclude.txt new file mode 100644 index 0000000..52bf32a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/CMakeInclude.txt @@ -0,0 +1,21 @@ +set(headers) +foreach(header ${${PROJECT_NAME}_headers_includes}) + string(REPLACE "${PROJECT_SOURCE_DIR}/" " #include \"" header1 ${header}) + string(REPLACE ".h" ".h\"!" header2 ${header1}) + list(APPEND headers ${header2}) +endforeach(header) + +string(REPLACE "!" "\n" header4 ${headers}) +set(PROTOCOL_HEADERS ${header4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_header.h.in ${PROJECT_SOURCE_DIR}/protocol_header.h) + +set(inits) +foreach(init ${${PROJECT_NAME}_init_includes}) + string(REPLACE "${PROJECT_SOURCE_DIR}/" " #include \"" init1 ${init}) + string(REPLACE ".h" ".h\"!" init2 ${init1}) + list(APPEND inits ${init2}) +endforeach(init) + +string(REPLACE "!" "\n" init4 ${inits}) +set(PROTOCOL_INIT ${init4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_init.h.in ${PROJECT_SOURCE_DIR}/protocol_init.h) \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/CMakeLists.txt new file mode 100644 index 0000000..391c18e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/CMakeLists.txt @@ -0,0 +1,71 @@ +project(pilight_protocols) + +add_subdirectory(433.92) +add_subdirectory(API) +add_subdirectory(GPIO) +add_subdirectory(generic) +add_subdirectory(network) +if(${ZWAVE} MATCHES "ON") + add_subdirectory(zwave) +endif() +if(${IR} MATCHES "ON") + add_subdirectory(IR) +endif() +add_subdirectory(core) + +file(REMOVE_RECURSE "protocol_header.h") +file(REMOVE "protocol_header.h") +file(REMOVE_RECURSE "protocol_init.h") +file(REMOVE "protocol_init.h") + +file(GLOB_RECURSE ${PROJECT_NAME}_headers_includes "protocol_header.h") +file(GLOB_RECURSE ${PROJECT_NAME}_init_includes "protocol_init.h") + +include(CMakeExclude.txt) +include(CMakeInclude.txt) + +if(${MODULESPACK} MATCHES "OFF" OR WIN32) + file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") + file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + + set(${PROJECT_NAME}_files + ${pilight_protocols_433.92_files} + ${pilight_protocols_ir_files} + ${pilight_protocols_api_files} + ${pilight_protocols_zwave_files} + ${pilight_protocols_generic_files} + ${pilight_protocols_network_files} + ${pilight_protocols_gpio_files} + ${pilight_protocols_core_files} + ${${PROJECT_NAME}_sources} + ${${PROJECT_NAME}_headers} + CACHE INTERNAL "") +else() + set(${PROJECT_NAME}_files + ${pilight_protocols_433.92_files} + ${pilight_protocols_ir_files} + ${pilight_protocols_api_files} + ${pilight_protocols_zwave_files} + ${pilight_protocols_generic_files} + ${pilight_protocols_network_files} + ${pilight_protocols_gpio_files} + ${pilight_protocols_core_files} + ) + + foreach(file ${${PROJECT_NAME}_files}) + get_filename_component(name ${file} NAME_WE) + get_filename_component(ext ${file} EXT) + if(${ext} MATCHES ".c") + add_library(${name}_module MODULE ${file}) + target_link_libraries(${name}_module ${CMAKE_THREAD_LIBS_INIT}) + target_link_libraries(${name}_module m) + if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + target_link_libraries(${name}_module execinfo) + endif() + target_link_libraries(${name}_module ${CMAKE_DL_LIBS}) + set_target_properties(${name}_module PROPERTIES OUTPUT_NAME ${name}) + string(REPLACE "_" "-" debname ${name}) + install(FILES ${CMAKE_BINARY_DIR}/libs/pilight/protocols/lib${name}.so DESTINATION lib/pilight/protocols RENAME ${name}.so COMPONENT pilight-protocol-${debname}) + endif() + endforeach() +endif() \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/CMakeExclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/CMakeExclude.txt new file mode 100644 index 0000000..d603cce --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/CMakeExclude.txt @@ -0,0 +1,44 @@ +include(../../../../CMakeConfig.txt) + +if(${PROTOCOL_BMP180} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/bmp180.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/bmp180.h") +endif() + +if(${PROTOCOL_DHT11} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/dht11.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/dht11.h") +endif() + +if(${PROTOCOL_DHT22} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/dht22.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/dht22.h") +endif() + +if(${PROTOCOL_DS18B20} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/ds18b20.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/ds18b20.h") +endif() + +if(${PROTOCOL_DS18S20} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/ds18s20.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/ds18s20.h") +endif() + +if(${PROTOCOL_GPIO_SWITCH} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/gpio_switch.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/gpio_switch.h") +endif() + +if(${PROTOCOL_LM75} MATCHES "OFF" + AND ${PROTOCOL_LM76} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/lm75.c") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/lm76.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/lm75.h") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/lm76.h") +endif() + +if(${PROTOCOL_RELAY} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/relay.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/relay.h") +endif() diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/CMakeInclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/CMakeInclude.txt new file mode 100644 index 0000000..496cba9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/CMakeInclude.txt @@ -0,0 +1,30 @@ +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/protocol_init.h") +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/protocol_header.h") + +set(headers) +foreach(header ${${PROJECT_NAME}_headers}) + string(REPLACE "${PROJECT_SOURCE_DIR}/" " #include \"" header1 ${header}) + string(REPLACE ".h" ".h\"!" header2 ${header1}) + list(APPEND headers ${header2}) +endforeach(header) + +string(REPLACE "!" "\n" header4 ${headers}) +set(PROTOCOL_HEADERS ${header4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_header.h.in ${PROJECT_SOURCE_DIR}/protocol_header.h) + +execute_process( +COMMAND grep -h "void .*Init(void)" ${${PROJECT_NAME}_sources} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE protocol_result + OUTPUT_VARIABLE protocol_init) + +set(inits) +foreach(init ${protocol_init}) + string(REPLACE "void " " " init1 ${init}) + string(REPLACE "(void) {" "()!" init2 ${init1}) + list(APPEND inits ${init2}) +endforeach(init) + +string(REPLACE "!" ";" init4 ${inits}) +set(PROTOCOL_INIT ${init4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_init.h.in ${PROJECT_SOURCE_DIR}/protocol_init.h) diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/CMakeLists.txt new file mode 100644 index 0000000..9e2584c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/CMakeLists.txt @@ -0,0 +1,9 @@ +project(pilight_protocols_gpio) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +include(CMakeExclude.txt) +include(CMakeInclude.txt) + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/bmp180.c b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/bmp180.c new file mode 100644 index 0000000..dece272 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/bmp180.c @@ -0,0 +1,448 @@ +/* + Copyright (C) 2014 CurlyMo & hstroh + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif + #include +#endif +#include + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../../core/threads.h" +#include "../../core/binary.h" +#include "../../core/gc.h" +#include "../../core/json.h" +#include "../../config/settings.h" +#include "../protocol.h" +#include "bmp180.h" + +#if !defined(__FreeBSD__) && !defined(_WIN32) + +typedef struct settings_t { + char **id; + int nrid; + char path[PATH_MAX]; + int *fd; + // calibration values (stored in each BMP180/085) + short *ac1; + short *ac2; + short *ac3; + unsigned short *ac4; + unsigned short *ac5; + unsigned short *ac6; + short *b1; + short *b2; + short *mb; + short *mc; + short *md; +} settings_t; + +static unsigned short loop = 1; +static int threads = 0; + +static pthread_mutex_t lock; +static pthread_mutexattr_t attr; + +// helper function with built-in result conversion +static int readReg16(int fd, int reg) { + int res = wiringXI2CReadReg16(fd, reg); + // convert result to 16 bits and swap bytes + return ((res << 8) & 0xFF00) | ((res >> 8) & 0xFF); +} + +static void *thread(void *param) { + struct protocol_threads_t *node = (struct protocol_threads_t *) param; + struct JsonNode *json = (struct JsonNode *) node->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct settings_t *bmp180data = MALLOC(sizeof(struct settings_t)); + int y = 0, interval = 10, nrloops = 0; + char *stmp = NULL; + double itmp = -1, temp_offset = 0, pressure_offset = 0; + unsigned char oversampling = 1; + + if(bmp180data == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + bmp180data->nrid = 0; + bmp180data->id = NULL; + bmp180data->fd = 0; + bmp180data->ac1 = 0; + bmp180data->ac2 = 0; + bmp180data->ac3 = 0; + bmp180data->ac4 = 0; + bmp180data->ac5 = 0; + bmp180data->ac6 = 0; + bmp180data->b1 = 0; + bmp180data->b2 = 0; + bmp180data->mb = 0; + bmp180data->mc = 0; + bmp180data->md = 0; + + threads++; + + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + if(json_find_string(jchild, "id", &stmp) == 0) { + if((bmp180data->id = REALLOC(bmp180data->id, (sizeof(char *) * (size_t)(bmp180data->nrid + 1)))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((bmp180data->id[bmp180data->nrid] = MALLOC(strlen(stmp) + 1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(bmp180data->id[bmp180data->nrid], stmp); + bmp180data->nrid++; + } + if(json_find_string(jchild, "i2c-path", &stmp) == 0) { + strcpy(bmp180data->path, stmp); + } + jchild = jchild->next; + } + } + + if(json_find_number(json, "poll-interval", &itmp) == 0) + interval = (int) round(itmp); + json_find_number(json, "temperature-offset", &temp_offset); + json_find_number(json, "pressure-offset", &pressure_offset); + if(json_find_number(json, "oversampling", &itmp) == 0) { + oversampling = (unsigned char) itmp; + } + + // resize the memory blocks pointed to by the different pointers + size_t sz = (size_t) (bmp180data->nrid + 1); + unsigned long int sizeShort = sizeof(short) * sz; + unsigned long int sizeUShort = sizeof(unsigned short) * sz; + bmp180data->fd = REALLOC(bmp180data->fd, (sizeof(int) * sz)); + bmp180data->ac1 = REALLOC(bmp180data->ac1, sizeShort); + bmp180data->ac2 = REALLOC(bmp180data->ac2, sizeShort); + bmp180data->ac3 = REALLOC(bmp180data->ac3, sizeShort); + bmp180data->ac4 = REALLOC(bmp180data->ac4, sizeUShort); + bmp180data->ac5 = REALLOC(bmp180data->ac5, sizeUShort); + bmp180data->ac6 = REALLOC(bmp180data->ac6, sizeUShort); + bmp180data->b1 = REALLOC(bmp180data->b1, sizeShort); + bmp180data->b2 = REALLOC(bmp180data->b2, sizeShort); + bmp180data->mb = REALLOC(bmp180data->mb, sizeShort); + bmp180data->mc = REALLOC(bmp180data->mc, sizeShort); + bmp180data->md = REALLOC(bmp180data->md, sizeShort); + if(bmp180data->ac1 == NULL || bmp180data->ac2 == NULL || bmp180data->ac3 == NULL || bmp180data->ac4 == NULL || + bmp180data->ac5 == NULL || bmp180data->ac6 == NULL || bmp180data->b1 == NULL || bmp180data->b2 == NULL || + bmp180data->mb == NULL || bmp180data->mc == NULL || bmp180data->md == NULL || bmp180data->fd == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + for(y = 0; y < bmp180data->nrid; y++) { + // setup i2c + bmp180data->fd[y] = wiringXI2CSetup(bmp180data->path, (int)strtol(bmp180data->id[y], NULL, 16)); + if(bmp180data->fd[y] > 0) { + // read 0xD0 to check chip id: must equal 0x55 for BMP085/180 + int id = wiringXI2CReadReg8(bmp180data->fd[y], 0xD0); + if(id != 0x55) { + logprintf(LOG_ERR, "wrong device detected"); + exit(EXIT_FAILURE); + } + + // read 0xD1 to check chip version: must equal 0x01 for BMP085 or 0x02 for BMP180 + int version = wiringXI2CReadReg8(bmp180data->fd[y], 0xD1); + if(version != 0x01 && version != 0x02) { + logprintf(LOG_ERR, "wrong device detected"); + exit(EXIT_FAILURE); + } + + // read calibration coefficients from register addresses + bmp180data->ac1[y] = (short) readReg16(bmp180data->fd[y], 0xAA); + bmp180data->ac2[y] = (short) readReg16(bmp180data->fd[y], 0xAC); + bmp180data->ac3[y] = (short) readReg16(bmp180data->fd[y], 0xAE); + bmp180data->ac4[y] = (unsigned short) readReg16(bmp180data->fd[y], 0xB0); + bmp180data->ac5[y] = (unsigned short) readReg16(bmp180data->fd[y], 0xB2); + bmp180data->ac6[y] = (unsigned short) readReg16(bmp180data->fd[y], 0xB4); + bmp180data->b1[y] = (short) readReg16(bmp180data->fd[y], 0xB6); + bmp180data->b2[y] = (short) readReg16(bmp180data->fd[y], 0xB8); + bmp180data->mb[y] = (short) readReg16(bmp180data->fd[y], 0xBA); + bmp180data->mc[y] = (short) readReg16(bmp180data->fd[y], 0xBC); + bmp180data->md[y] = (short) readReg16(bmp180data->fd[y], 0xBE); + + // check communication: no result must equal 0 or 0xFFFF (=65535) + if (bmp180data->ac1[y] == 0 || bmp180data->ac1[y] == 0xFFFF || + bmp180data->ac2[y] == 0 || bmp180data->ac2[y] == 0xFFFF || + bmp180data->ac3[y] == 0 || bmp180data->ac3[y] == 0xFFFF || + bmp180data->ac4[y] == 0 || bmp180data->ac4[y] == 0xFFFF || + bmp180data->ac5[y] == 0 || bmp180data->ac5[y] == 0xFFFF || + bmp180data->ac6[y] == 0 || bmp180data->ac6[y] == 0xFFFF || + bmp180data->b1[y] == 0 || bmp180data->b1[y] == 0xFFFF || + bmp180data->b2[y] == 0 || bmp180data->b2[y] == 0xFFFF || + bmp180data->mb[y] == 0 || bmp180data->mb[y] == 0xFFFF || + bmp180data->mc[y] == 0 || bmp180data->mc[y] == 0xFFFF || + bmp180data->md[y] == 0 || bmp180data->md[y] == 0xFFFF) { + logprintf(LOG_ERR, "data communication error"); + exit(EXIT_FAILURE); + } + } + } + + while (loop) { + if (protocol_thread_wait(node, interval, &nrloops) == ETIMEDOUT) { + pthread_mutex_lock(&lock); + for (y = 0; y < bmp180data->nrid; y++) { + if (bmp180data->fd[y] > 0) { + // uncompensated temperature value + unsigned short ut = 0; + + // write 0x2E into Register 0xF4 to request a temperature reading. + wiringXI2CWriteReg8(bmp180data->fd[y], 0xF4, 0x2E); + + // wait at least 4.5ms: we suspend execution for 5000 microseconds. + usleep(5000); + + // read the two byte result from address 0xF6. + ut = (unsigned short) readReg16(bmp180data->fd[y], 0xF6); + + // calculate temperature (in units of 0.1 deg C) given uncompensated value + int x1, x2; + x1 = (((int) ut - (int) bmp180data->ac6[y])) * (int) bmp180data->ac5[y] >> 15; + x2 = ((int) bmp180data->mc[y] << 11) / (x1 + bmp180data->md[y]); + int b5 = x1 + x2; + int temp = ((b5 + 8) >> 4); + + // uncompensated pressure value + unsigned int up = 0; + + // write 0x34+(BMP085_OVERSAMPLING_SETTING<<6) into register 0xF4 + // request a pressure reading with specified oversampling setting + wiringXI2CWriteReg8(bmp180data->fd[y], 0xF4, + 0x34 + (oversampling << 6)); + + // wait for conversion, delay time dependent on oversampling setting + unsigned int delay = (unsigned int) ((2 + (3 << oversampling)) * 1000); + usleep(delay); + + // read the three byte result (block data): 0xF6 = MSB, 0xF7 = LSB and 0xF8 = XLSB + int msb = wiringXI2CReadReg8(bmp180data->fd[y], 0xF6); + int lsb = wiringXI2CReadReg8(bmp180data->fd[y], 0xF7); + int xlsb = wiringXI2CReadReg8(bmp180data->fd[y], 0xF8); + up = (((unsigned int) msb << 16) | ((unsigned int) lsb << 8) | (unsigned int) xlsb) + >> (8 - oversampling); + + // calculate pressure (in Pa) given uncompensated value + int x3, b3, b6, pressure; + unsigned int b4, b7; + + // calculate B6 + b6 = b5 - 4000; + + // calculate B3 + x1 = (bmp180data->b2[y] * (b6 * b6) >> 12) >> 11; + x2 = (bmp180data->ac2[y] * b6) >> 11; + x3 = x1 + x2; + b3 = (((bmp180data->ac1[y] * 4 + x3) << oversampling) + 2) >> 2; + + // calculate B4 + x1 = (bmp180data->ac3[y] * b6) >> 13; + x2 = (bmp180data->b1[y] * ((b6 * b6) >> 12)) >> 16; + x3 = ((x1 + x2) + 2) >> 2; + b4 = (bmp180data->ac4[y] * (unsigned int) (x3 + 32768)) >> 15; + + // calculate B7 + b7 = ((up - (unsigned int) b3) * ((unsigned int) 50000 >> oversampling)); + + // calculate pressure in Pa + pressure = b7 < 0x80000000 ? (int) ((b7 << 1) / b4) : (int) ((b7 / b4) << 1); + x1 = (pressure >> 8) * (pressure >> 8); + x1 = (x1 * 3038) >> 16; + x2 = (-7357 * pressure) >> 16; + pressure += (x1 + x2 + 3791) >> 4; + + bmp180->message = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "id", json_mkstring(bmp180data->id[y])); + json_append_member(code, "temperature", json_mknumber(((double) temp / 10) + temp_offset, 1)); // in deg C + json_append_member(code, "pressure", json_mknumber(((double) pressure / 100) + pressure_offset, 1)); // in hPa + + json_append_member(bmp180->message, "message", code); + json_append_member(bmp180->message, "origin", json_mkstring("receiver")); + json_append_member(bmp180->message, "protocol", json_mkstring(bmp180->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(bmp180->id, bmp180->message, PROTOCOL); + } + json_delete(bmp180->message); + bmp180->message = NULL; + } else { + logprintf(LOG_NOTICE, "error connecting to bmp180"); + logprintf(LOG_DEBUG, "(probably i2c bus error from wiringXI2CSetup)"); + logprintf(LOG_DEBUG, "(maybe wrong id? use i2cdetect to find out)"); + protocol_thread_wait(node, 1, &nrloops); + } + } + pthread_mutex_unlock(&lock); + } + } + + if (bmp180data->id) { + for (y = 0; y < bmp180data->nrid; y++) { + FREE(bmp180data->id[y]); + } + FREE(bmp180data->id); + } + if (bmp180data->ac1) { + FREE(bmp180data->ac1); + } + if (bmp180data->ac2) { + FREE(bmp180data->ac2); + } + if (bmp180data->ac3) { + FREE(bmp180data->ac3); + } + if (bmp180data->ac4) { + FREE(bmp180data->ac4); + } + if (bmp180data->ac5) { + FREE(bmp180data->ac5); + } + if (bmp180data->ac6) { + FREE(bmp180data->ac6); + } + if (bmp180data->b1) { + FREE(bmp180data->b1); + } + if (bmp180data->b2) { + FREE(bmp180data->b2); + } + if (bmp180data->mb) { + FREE(bmp180data->mb); + } + if (bmp180data->mc) { + FREE(bmp180data->mc); + } + if (bmp180data->md) { + FREE(bmp180data->md); + } + if (bmp180data->fd) { + for (y = 0; y < bmp180data->nrid; y++) { + if (bmp180data->fd[y] > 0) { + close(bmp180data->fd[y]); + } + } + FREE(bmp180data->fd); + } + FREE(bmp180data); + threads--; + + return (void *) NULL; +} + +static struct threadqueue_t *initDev(JsonNode *jdevice) { + char *platform = GPIO_PLATFORM; + if(settings_find_string("gpio-platform", &platform) != 0 || strcmp(platform, "none") == 0) { + logprintf(LOG_ERR, "gpio_switch: no gpio-platform configured"); + exit(EXIT_FAILURE); + } + if(wiringXSetup(platform, logprintf1) == 0) { + loop = 1; + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(bmp180, json); + return threads_register("bmp180", &thread, (void *) node, 0); + } else { + return NULL; + } +} + +static void threadGC(void) { + loop = 0; + protocol_thread_stop(bmp180); + while (threads > 0) { + usleep(10); + } + protocol_thread_free(bmp180); +} +#endif + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void bmp180Init(void) { +#if !defined(__FreeBSD__) && !defined(_WIN32) + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&lock, &attr); +#endif + + protocol_register(&bmp180); + protocol_set_id(bmp180, "bmp180"); + protocol_device_add(bmp180, "bmp180", "I2C Barometric Pressure and Temperature Sensor"); + protocol_device_add(bmp180, "bmp085", "I2C Barometric Pressure and Temperature Sensor"); + bmp180->devtype = WEATHER; + bmp180->hwtype = SENSOR; + + options_add(&bmp180->options, 'i', "id", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "0x[0-9a-f]{2}"); + options_add(&bmp180->options, 'o', "oversampling", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *) 1, "^[0123]$"); + options_add(&bmp180->options, 'p', "pressure", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, (void *) 0, "^[0-9]{1,3}$"); + options_add(&bmp180->options, 't', "temperature", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, (void *) 0, "^[0-9]{1,3}$"); + options_add(&bmp180->options, 'd', "i2c-path", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "^/dev/i2c-[0-9]{1,2}$"); + + options_add(&bmp180->options, 0, "poll-interval", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *) 10, "[0-9]"); + options_add(&bmp180->options, 0, "pressure-offset", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *) 0, "[0-9]"); + options_add(&bmp180->options, 0, "temperature-offset", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *) 0, "[0-9]"); + options_add(&bmp180->options, 0, "temperature-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *) 1, "[0-9]"); + options_add(&bmp180->options, 0, "humidity-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *) 1, "[0-9]"); + options_add(&bmp180->options, 0, "pressure-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *) 1, "[0-9]"); + options_add(&bmp180->options, 0, "show-pressure", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *) 1, "^[10]{1}$"); + options_add(&bmp180->options, 0, "show-temperature", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *) 1, "^[10]{1}$"); + +#if !defined(__FreeBSD__) && !defined(_WIN32) + bmp180->initDev = &initDev; + bmp180->threadGC = &threadGC; +#endif +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "bmp180"; + module->version = "2.2"; + module->reqversion = "7.0"; + module->reqcommit = "186"; +} + +void init(void) { + bmp180Init(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/bmp180.h b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/bmp180.h new file mode 100644 index 0000000..ae746a4 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/bmp180.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo & hstroh + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_BMP180_H_ +#define _PROTOCOL_BMP180_H_ + +#include "../protocol.h" + +struct protocol_t *bmp180; +void bmp180Init(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht11.c b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht11.c new file mode 100644 index 0000000..8515882 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht11.c @@ -0,0 +1,298 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif + #include +#endif +#include + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../../core/threads.h" +#include "../../core/binary.h" +#include "../../core/gc.h" +#include "../../core/json.h" +#include "../../config/settings.h" +#include "../protocol.h" +#include "dht11.h" + +#define MAXTIMINGS 100 + +#if !defined(__FreeBSD__) && !defined(_WIN32) + +static unsigned short loop = 1; +static unsigned short threads = 0; + +static pthread_mutex_t lock; +static pthread_mutexattr_t attr; + +static uint8_t sizecvt(const int read_value) { + /* digitalRead() and friends from wiringx are defined as returning a value + < 256. However, they are returned as int() types. This is a safety function */ + if(read_value > 255 || read_value < 0) { + logprintf(LOG_NOTICE, "invalid data from wiringX library"); + return -1; + } + + return (uint8_t)read_value; +} + +static void *dht11Parse(void *param) { + struct protocol_threads_t *node = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)node->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + int *id = 0; + int nrid = 0, y = 0, interval = 10, nrloops = 0, x = 0; + double temp_offset = 0.0, humi_offset = 0.0, itmp = 0.0; + + threads++; + + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + if(json_find_number(jchild, "gpio", &itmp) == 0) { + id = REALLOC(id, (sizeof(int)*(size_t)(nrid+1))); + id[nrid] = (int)round(itmp); + nrid++; + } + jchild = jchild->next; + } + } + + if(json_find_number(json, "poll-interval", &itmp) == 0) + interval = (int)round(itmp); + json_find_number(json, "temperature-offset", &temp_offset); + json_find_number(json, "humidity-offset", &humi_offset); + + while(loop) { + if(protocol_thread_wait(node, interval, &nrloops) == ETIMEDOUT) { + pthread_mutex_lock(&lock); + for(y=0;y= 4) && (i%2 == 0)) { + + // shove each bit into the storage bytes + dht11_dat[(int)((double)j/8)] <<= 1; + if(counter > 16) + dht11_dat[(int)((double)j/8)] |= 1; + j++; + } + } + + // check we read 40 bits (8bit x 5 ) + verify checksum in the last byte + // print it out if data is good + if((j >= 40) && (dht11_dat[4] == ((dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF))) { + got_correct_date = 1; + + double h = dht11_dat[0]; + double t = dht11_dat[2]; + t += temp_offset; + h += humi_offset; + + dht11->message = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "gpio", json_mknumber(id[y], 0)); + json_append_member(code, "temperature", json_mknumber(t, 1)); + json_append_member(code, "humidity", json_mknumber(h, 1)); + + json_append_member(dht11->message, "message", code); + json_append_member(dht11->message, "origin", json_mkstring("receiver")); + json_append_member(dht11->message, "protocol", json_mkstring(dht11->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(dht11->id, dht11->message, PROTOCOL); + } + json_delete(dht11->message); + dht11->message = NULL; + } else { + logprintf(LOG_DEBUG, "dht11 data checksum was wrong"); + tries--; + protocol_thread_wait(node, 1, &nrloops); + } + } + } + pthread_mutex_unlock(&lock); + } + } + pthread_mutex_unlock(&lock); + + FREE(id); + threads--; + return (void *)NULL; +} + +static struct threadqueue_t *initDev(JsonNode *jdevice) { + char *platform = GPIO_PLATFORM; + if(settings_find_string("gpio-platform", &platform) != 0 || strcmp(platform, "none") == 0) { + logprintf(LOG_ERR, "gpio_switch: no gpio-platform configured"); + exit(EXIT_FAILURE); + } + if(wiringXSetup(platform, logprintf1) == 0) { + loop = 1; + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(dht11, json); + return threads_register("dht11", &dht11Parse, (void *)node, 0); + } else { + return NULL; + } +} + +static void threadGC(void) { + loop = 0; + protocol_thread_stop(dht11); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(dht11); +} + +static int checkValues(JsonNode *code) { + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + double itmp = -1; + + /* Validate GPIO number */ + if((jid = json_find_member(code, "id")) != NULL) { + if((jchild = json_find_element(jid, 0)) != NULL) { + if(json_find_number(jchild, "gpio", &itmp) == 0) { + char *platform = GPIO_PLATFORM; + if(settings_find_string("gpio-platform", &platform) != 0 || strcmp(platform, "none") == 0) { + logprintf(LOG_ERR, "dht11: no gpio-platform configured"); + exit(EXIT_FAILURE); + } + if(wiringXSetup(platform, logprintf1) == 0) { + int gpio = (int)itmp; + if(wiringXValidGPIO(gpio) != 0) { + logprintf(LOG_ERR, "dht11: invalid gpio range"); + return -1; + } + } + } + } + } + + return 0; +} +#endif + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void dht11Init(void) { +#if !defined(__FreeBSD__) && !defined(_WIN32) + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&lock, &attr); +#endif + + protocol_register(&dht11); + protocol_set_id(dht11, "dht11"); + protocol_device_add(dht11, "dht11", "1-wire Temperature and Humidity Sensor"); + dht11->devtype = WEATHER; + dht11->hwtype = SENSOR; + + options_add(&dht11->options, 't', "temperature", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{1,3}$"); + options_add(&dht11->options, 'h', "humidity", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{1,3}$"); + options_add(&dht11->options, 'g', "gpio", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, NULL); + + // options_add(&dht11->options, 0, "decimals", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)1, "[0-9]"); + options_add(&dht11->options, 0, "temperature-offset", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)0, "[0-9]"); + options_add(&dht11->options, 0, "humidity-offset", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)0, "[0-9]"); + options_add(&dht11->options, 0, "temperature-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "[0-9]"); + options_add(&dht11->options, 0, "humidity-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "[0-9]"); + options_add(&dht11->options, 0, "show-temperature", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&dht11->options, 0, "show-humidity", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&dht11->options, 0, "poll-interval", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)10, "[0-9]"); + +#if !defined(__FreeBSD__) && !defined(_WIN32) + dht11->initDev=&initDev; + dht11->threadGC=&threadGC; + dht11->checkValues=&checkValues; +#endif +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "dht11"; + module->version = "2.5"; + module->reqversion = "7.0"; + module->reqcommit = "186"; +} + +void init(void) { + dht11Init(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht11.h b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht11.h new file mode 100644 index 0000000..43067e7 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht11.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_DHT11_H_ +#define _PROTOCOL_DHT11_H_ + +#include "../protocol.h" + +struct protocol_t *dht11; +void dht11Init(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht22.c b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht22.c new file mode 100644 index 0000000..9921b6f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht22.c @@ -0,0 +1,301 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif + #include +#endif +#include + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../../core/threads.h" +#include "../../core/binary.h" +#include "../../core/gc.h" +#include "../../core/json.h" +#include "../../config/settings.h" +#include "../protocol.h" +#include "dht22.h" + +#define MAXTIMINGS 100 + +#if !defined(__FreeBSD__) && !defined(_WIN32) + +static unsigned short loop = 1; +static unsigned short threads = 0; + +static pthread_mutex_t lock; +static pthread_mutexattr_t attr; + +static uint8_t sizecvt(const int read_value) { + /* digitalRead() and friends from wiringx are defined as returning a value + < 256. However, they are returned as int() types. This is a safety function */ + if(read_value > 255 || read_value < 0) { + logprintf(LOG_NOTICE, "invalid data from wiringX library"); + return -1; + } + + return (uint8_t)read_value; +} + +static void *thread(void *param) { + struct protocol_threads_t *node = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)node->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + int *id = 0; + int nrid = 0, y = 0, interval = 10, nrloops = 0, x = 0; + double temp_offset = 0.0, humi_offset = 0.0, itmp = 0.0; + + threads++; + + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + if(json_find_number(jchild, "gpio", &itmp) == 0) { + id = REALLOC(id, (sizeof(int)*(size_t)(nrid+1))); + id[nrid] = (int)round(itmp); + nrid++; + } + jchild = jchild->next; + } + } + + if(json_find_number(json, "poll-interval", &itmp) == 0) + interval = (int)round(itmp); + json_find_number(json, "temperature-offset", &temp_offset); + json_find_number(json, "humidity-offset", &humi_offset); + + while(loop) { + if(protocol_thread_wait(node, interval, &nrloops) == ETIMEDOUT) { + pthread_mutex_lock(&lock); + for(y=0;y= 4) && (i%2 == 0)) { + // shove each bit into the storage bytes + dht22_dat[(int)((double)j/8)] <<= 1; + if(counter > 16) + dht22_dat[(int)((double)j/8)] |= 1; + j++; + } + } + + // check we read 40 bits (8bit x 5 ) + verify checksum in the last byte + // print it out if data is good + if((j >= 40) && (dht22_dat[4] == ((dht22_dat[0] + dht22_dat[1] + dht22_dat[2] + dht22_dat[3]) & 0xFF))) { + got_correct_date = 1; + + double h = dht22_dat[0] * 256 + dht22_dat[1]; + double t = (dht22_dat[2] & 0x7F)* 256 + dht22_dat[3]; + t += temp_offset; + h += humi_offset; + + if((dht22_dat[2] & 0x80) != 0) + t *= -1; + + dht22->message = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "gpio", json_mknumber(id[y], 0)); + json_append_member(code, "temperature", json_mknumber(t/10, 1)); + json_append_member(code, "humidity", json_mknumber(h/10, 1)); + + json_append_member(dht22->message, "message", code); + json_append_member(dht22->message, "origin", json_mkstring("receiver")); + json_append_member(dht22->message, "protocol", json_mkstring(dht22->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(dht22->id, dht22->message, PROTOCOL); + } + json_delete(dht22->message); + dht22->message = NULL; + } else { + logprintf(LOG_DEBUG, "dht22 data checksum was wrong"); + tries--; + protocol_thread_wait(node, 1, &nrloops); + } + } + } + pthread_mutex_unlock(&lock); + } + } + pthread_mutex_unlock(&lock); + + FREE(id); + threads--; + return (void *)NULL; +} + +static struct threadqueue_t *initDev(JsonNode *jdevice) { + char *platform = GPIO_PLATFORM; + if(settings_find_string("gpio-platform", &platform) != 0 || strcmp(platform, "none") == 0) { + logprintf(LOG_ERR, "dht22: no gpio-platform configured"); + exit(EXIT_FAILURE); + } + if(wiringXSetup(platform, logprintf1) == 0) { + loop = 1; + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(dht22, json); + return threads_register("dht22", &thread, (void *)node, 0); + } else { + return NULL; + } +} + +static void threadGC(void) { + loop = 0; + protocol_thread_stop(dht22); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(dht22); +} + +static int checkValues(JsonNode *code) { + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + double itmp = -1; + + /* Validate GPIO number */ + if((jid = json_find_member(code, "id")) != NULL) { + if((jchild = json_find_element(jid, 0)) != NULL) { + if(json_find_number(jchild, "gpio", &itmp) == 0) { + char *platform = GPIO_PLATFORM; + if(settings_find_string("gpio-platform", &platform) != 0 || strcmp(platform, "none") == 0) { + logprintf(LOG_ERR, "dht22: no gpio-platform configured"); + exit(EXIT_FAILURE); + } + if(wiringXSetup(platform, logprintf1) == 0) { + int gpio = (int)itmp; + if(wiringXValidGPIO(gpio) != 0) { + logprintf(LOG_ERR, "dht22: invalid gpio range"); + return -1; + } + } + } + } + } + + return 0; +} +#endif + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void dht22Init(void) { +#if !defined(__FreeBSD__) && !defined(_WIN32) + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&lock, &attr); +#endif + + protocol_register(&dht22); + protocol_set_id(dht22, "dht22"); + protocol_device_add(dht22, "dht22", "1-wire Temperature and Humidity Sensor"); + protocol_device_add(dht22, "am2302", "1-wire Temperature and Humidity Sensor"); + dht22->devtype = WEATHER; + dht22->hwtype = SENSOR; + + options_add(&dht22->options, 't', "temperature", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{1,3}$"); + options_add(&dht22->options, 'h', "humidity", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{1,3}$"); + options_add(&dht22->options, 'g', "gpio", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, NULL); + + // options_add(&dht22->options, 0, "decimals", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)1, "[0-9]"); + options_add(&dht22->options, 0, "temperature-offset", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)0, "[0-9]"); + options_add(&dht22->options, 0, "humidity-offset", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)0, "[0-9]"); + options_add(&dht22->options, 0, "temperature-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "[0-9]"); + options_add(&dht22->options, 0, "humidity-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "[0-9]"); + options_add(&dht22->options, 0, "show-temperature", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&dht22->options, 0, "show-humidity", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&dht22->options, 0, "poll-interval", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)10, "[0-9]"); + +#if !defined(__FreeBSD__) && !defined(_WIN32) + dht22->initDev=&initDev; + dht22->threadGC=&threadGC; + dht22->checkValues=&checkValues; +#endif +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "dht22"; + module->version = "2.5"; + module->reqversion = "7.0"; + module->reqcommit = "186"; +} + +void init(void) { + dht22Init(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht22.h b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht22.h new file mode 100644 index 0000000..8804ea9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/dht22.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_DHT22_H_ +#define _PROTOCOL_DHT22_H_ + +#include "../protocol.h" + +struct protocol_t *dht22; +void dht22Init(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18b20.c b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18b20.c new file mode 100644 index 0000000..a00e147 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18b20.c @@ -0,0 +1,262 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif +#endif +#include + +#include "../../core/threads.h" +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/json.h" +#include "../../core/gc.h" +#include "ds18b20.h" + +static unsigned short loop = 1; +static unsigned short threads = 0; +static char source_path[21]; + +static pthread_mutex_t lock; +static pthread_mutexattr_t attr; + +static void *ds18b20Parse(void *param) { + struct protocol_threads_t *node = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)node->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + +#ifndef _WIN32 + struct dirent *file = NULL; + struct stat st; + + DIR *d = NULL; + FILE *fp = NULL; + char crcVar[5]; + int w1valid = 0; + double w1temp = 0.0; + size_t bytes = 0; +#endif + char **id = NULL, *stmp = NULL, *content = NULL; + char *ds18b20_sensor = NULL; + int nrid = 0, interval = 10, nrloops = 0, y = 0; + double temp_offset = 0.0, itmp = 0.0; + + threads++; + + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + if(json_find_string(jchild, "id", &stmp) == 0) { + if((id = REALLOC(id, (sizeof(char *)*(size_t)(nrid+1)))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((id[nrid] = MALLOC(strlen(stmp)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(id[nrid], stmp); + nrid++; + } + jchild = jchild->next; + } + } + + if(json_find_number(json, "poll-interval", &itmp) == 0) + interval = (int)round(itmp); + json_find_number(json, "temperature-offset", &temp_offset); + + while(loop) { + if(protocol_thread_wait(node, interval, &nrloops) == ETIMEDOUT) { +#ifndef _WIN32 + pthread_mutex_lock(&lock); + for(y=0;yd_type == DT_REG) { + if(strcmp(file->d_name, "w1_slave") == 0) { + size_t w1slavelen = strlen(ds18b20_sensor)+10; + char ds18b20_w1slave[w1slavelen]; + memset(ds18b20_w1slave, '\0', w1slavelen); + strncpy(ds18b20_w1slave, ds18b20_sensor, strlen(ds18b20_sensor)); + strcat(ds18b20_w1slave, "w1_slave"); + + if(!(fp = fopen(ds18b20_w1slave, "rb"))) { + logprintf(LOG_ERR, "cannot read w1 file: %s", ds18b20_w1slave); + break; + } + + fstat(fileno(fp), &st); + bytes = (size_t)st.st_size; + + if((content = REALLOC(content, bytes+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + fclose(fp); + break; + } + memset(content, '\0', bytes+1); + + if(fread(content, sizeof(char), bytes, fp) == -1) { + logprintf(LOG_ERR, "cannot read config file: %s", ds18b20_w1slave); + fclose(fp); + break; + } + fclose(fp); + w1valid = 0; + + char **array = NULL; + unsigned int n = explode(content, "\n", &array); + if(n > 0) { + sscanf(array[0], "%*x %*x %*x %*x %*x %*x %*x %*x %*x : crc=%*x %s", crcVar); + if(strncmp(crcVar, "YES", 3) == 0 && n > 1) { + w1valid = 1; + sscanf(array[1], "%*x %*x %*x %*x %*x %*x %*x %*x %*x t=%lf", &w1temp); + w1temp = (w1temp/1000)+temp_offset; + } + } + array_free(&array, n); + + if(w1valid) { + ds18b20->message = json_mkobject(); + + JsonNode *code = json_mkobject(); + + json_append_member(code, "id", json_mkstring(id[y])); + json_append_member(code, "temperature", json_mknumber(w1temp, 3)); + + json_append_member(ds18b20->message, "message", code); + json_append_member(ds18b20->message, "origin", json_mkstring("receiver")); + json_append_member(ds18b20->message, "protocol", json_mkstring(ds18b20->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(ds18b20->id, ds18b20->message, PROTOCOL); + } + json_delete(ds18b20->message); + ds18b20->message = NULL; + } + } + } + } + closedir(d); + } else { + logprintf(LOG_ERR, "1-wire device %s does not exist", ds18b20_sensor); + } + } +#endif + pthread_mutex_unlock(&lock); + } + } + pthread_mutex_unlock(&lock); + + if(ds18b20_sensor) { + FREE(ds18b20_sensor); + } + if(content) { + FREE(content); + } + for(y=0;y 0) { + usleep(10); + } + protocol_thread_free(ds18b20); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void ds18b20Init(void) { + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&lock, &attr); + + protocol_register(&ds18b20); + protocol_set_id(ds18b20, "ds18b20"); + protocol_device_add(ds18b20, "ds18b20", "1-wire Temperature Sensor"); + ds18b20->devtype = WEATHER; + ds18b20->hwtype = SENSOR; + + options_add(&ds18b20->options, 't', "temperature", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{1,5}$"); + options_add(&ds18b20->options, 'i', "id", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "^[a-z0-9]{12}$"); + + // options_add(&ds18b20->options, 0, "decimals", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)3, "[0-9]"); + options_add(&ds18b20->options, 0, "temperature-offset", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)0, "[0-9]"); + options_add(&ds18b20->options, 0, "temperature-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)3, "[0-9]"); + options_add(&ds18b20->options, 0, "show-temperature", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&ds18b20->options, 0, "poll-interval", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)10, "[0-9]"); + + memset(source_path, '\0', 21); + strcpy(source_path, "/sys/bus/w1/devices/"); + + ds18b20->initDev=&initDev; + ds18b20->threadGC=&threadGC; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "ds18b20"; + module->version = "2.0"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + ds18b20Init(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18b20.h b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18b20.h new file mode 100644 index 0000000..836e9a9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18b20.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_DS18B20_H_ +#define _PROTOCOL_DS18B20_H_ + +#include "../protocol.h" + +struct protocol_t *ds18b20; +void ds18b20Init(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18s20.c b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18s20.c new file mode 100644 index 0000000..db21171 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18s20.c @@ -0,0 +1,263 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif +#endif + +#include + +#include "../../core/threads.h" +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/json.h" +#include "../../core/gc.h" +#include "ds18s20.h" + +static unsigned short loop = 1; +static unsigned short threads = 0; +static char source_path[21]; + +static pthread_mutex_t lock; +static pthread_mutexattr_t attr; + +static void *thread(void *param) { + struct protocol_threads_t *node = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)node->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + +#ifndef _WIN32 + struct dirent *file = NULL; + struct stat st; + + DIR *d = NULL; + FILE *fp = NULL; + char crcVar[5]; + int w1valid = 0; + double w1temp = 0.0; + size_t bytes = 0; +#endif + char **id = NULL, *stmp = NULL, *content = NULL; + char *ds18s20_sensor = NULL; + int nrid = 0, interval = 10, nrloops = 0, y = 0; + double temp_offset = 0.0, itmp = 0.0; + + threads++; + + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + if(json_find_string(jchild, "id", &stmp) == 0) { + if((id = REALLOC(id, (sizeof(char *)*(size_t)(nrid+1)))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((id[nrid] = MALLOC(strlen(stmp)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(id[nrid], stmp); + nrid++; + } + jchild = jchild->next; + } + } + + if(json_find_number(json, "poll-interval", &itmp) == 0) + interval = (int)round(itmp); + json_find_number(json, "temperature-offset", &temp_offset); + + while(loop) { + if(protocol_thread_wait(node, interval, &nrloops) == ETIMEDOUT) { +#ifndef _WIN32 + pthread_mutex_lock(&lock); + for(y=0;yd_type == DT_REG) { + if(strcmp(file->d_name, "w1_slave") == 0) { + size_t w1slavelen = strlen(ds18s20_sensor)+10; + char ds18s20_w1slave[w1slavelen]; + memset(ds18s20_w1slave, '\0', w1slavelen); + strncpy(ds18s20_w1slave, ds18s20_sensor, strlen(ds18s20_sensor)); + strcat(ds18s20_w1slave, "w1_slave"); + + if(!(fp = fopen(ds18s20_w1slave, "rb"))) { + logprintf(LOG_ERR, "cannot read w1 file: %s", ds18s20_w1slave); + break; + } + + fstat(fileno(fp), &st); + bytes = (size_t)st.st_size; + + if(!(content = REALLOC(content, bytes+1))) { + fprintf(stderr, "out of memory\n"); + fclose(fp); + break; + } + memset(content, '\0', bytes+1); + + if(fread(content, sizeof(char), bytes, fp) == -1) { + logprintf(LOG_ERR, "cannot read config file: %s", ds18s20_w1slave); + fclose(fp); + break; + } + fclose(fp); + w1valid = 0; + + char **array = NULL; + unsigned int n = explode(content, "\n", &array); + if(n > 0) { + sscanf(array[0], "%*x %*x %*x %*x %*x %*x %*x %*x %*x : crc=%*x %s", crcVar); + if(strncmp(crcVar, "YES", 3) == 0 && n > 1) { + w1valid = 1; + sscanf(array[1], "%*x %*x %*x %*x %*x %*x %*x %*x %*x t=%lf", &w1temp); + w1temp = (w1temp/1000)+temp_offset; + } + } + array_free(&array, n); + + if(w1valid) { + ds18s20->message = json_mkobject(); + + JsonNode *code = json_mkobject(); + + json_append_member(code, "id", json_mkstring(id[y])); + json_append_member(code, "temperature", json_mknumber(w1temp, 1)); + + json_append_member(ds18s20->message, "message", code); + json_append_member(ds18s20->message, "origin", json_mkstring("receiver")); + json_append_member(ds18s20->message, "protocol", json_mkstring(ds18s20->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(ds18s20->id, ds18s20->message, PROTOCOL); + } + json_delete(ds18s20->message); + ds18s20->message = NULL; + } + } + } + } + closedir(d); + } else { + logprintf(LOG_ERR, "1-wire device %s does not exist", ds18s20_sensor); + } + } +#endif + pthread_mutex_unlock(&lock); + } + } + pthread_mutex_unlock(&lock); + + if(ds18s20_sensor) { + FREE(ds18s20_sensor); + } + if(content) { + FREE(content); + } + for(y=0;y 0) { + usleep(10); + } + protocol_thread_free(ds18s20); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void ds18s20Init(void) { + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&lock, &attr); + + protocol_register(&ds18s20); + protocol_set_id(ds18s20, "ds18s20"); + protocol_device_add(ds18s20, "ds18s20", "1-wire Temperature Sensor"); + ds18s20->devtype = WEATHER; + ds18s20->hwtype = SENSOR; + + options_add(&ds18s20->options, 't', "temperature", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{1,5}$"); + options_add(&ds18s20->options, 'i', "id", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "^[a-z0-9]{12}$"); + + // options_add(&ds18s20->options, 0, "decimals", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)3, "[0-9]"); + options_add(&ds18s20->options, 0, "temperature-offset", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)0, "[0-9]"); + options_add(&ds18s20->options, 0, "temperature-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)3, "[0-9]"); + options_add(&ds18s20->options, 0, "show-temperature", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&ds18s20->options, 0, "poll-interval", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)10, "[0-9]"); + + memset(source_path, '\0', 21); + strcpy(source_path, "/sys/bus/w1/devices/"); + + ds18s20->initDev=&initDev; + ds18s20->threadGC=&theadGC; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "ds18s20"; + module->version = "2.0"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + ds18s20Init(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18s20.h b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18s20.h new file mode 100644 index 0000000..6a353f2 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/ds18s20.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_DS18S20_H_ +#define _PROTOCOL_DS18S20_H_ + +#include "../protocol.h" + +struct protocol_t *ds18s20; +void ds18s20Init(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/gpio_switch.c b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/gpio_switch.c new file mode 100644 index 0000000..15245c4 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/gpio_switch.c @@ -0,0 +1,207 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 +#include +#endif + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../../core/irq.h" +#include "../../core/gc.h" +#include "../../config/settings.h" +#include "../protocol.h" +#include "gpio_switch.h" + +#if !defined(__FreeBSD__) && !defined(_WIN32) + +static unsigned short loop = 1; +static int threads = 0; + +static void createMessage(int gpio, int state) { + gpio_switch->message = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "gpio", json_mknumber(gpio, 0)); + if(state) { + json_append_member(code, "state", json_mkstring("on")); + } else { + json_append_member(code, "state", json_mkstring("off")); + } + + json_append_member(gpio_switch->message, "message", code); + json_append_member(gpio_switch->message, "origin", json_mkstring("receiver")); + json_append_member(gpio_switch->message, "protocol", json_mkstring(gpio_switch->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(gpio_switch->id, gpio_switch->message, PROTOCOL); + } + json_delete(gpio_switch->message); + gpio_switch->message = NULL; +} + +static void *thread(void *param) { + struct protocol_threads_t *node = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)node->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + int id = 0, state = 0, nstate = 0; + double itmp = 0.0; + + threads++; + + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + if(json_find_number(jchild, "gpio", &itmp) == 0) { + id = (int)round(itmp); + if(wiringXISR(id, ISR_MODE_BOTH) < 0) { + threads--; + return NULL; + } + state = digitalRead(id); + } + } + + createMessage(id, state); + + while(loop) { + irq_read(id); + nstate = digitalRead(id); + if(nstate != state) { + state = nstate; + createMessage(id, state); + usleep(100000); + } + } + + threads--; + return (void *)NULL; +} + +static struct threadqueue_t *initDev(JsonNode *jdevice) { + char *platform = GPIO_PLATFORM; + if(settings_find_string("gpio-platform", &platform) != 0 || strcmp(platform, "none") == 0) { + logprintf(LOG_ERR, "gpio_switch: no gpio-platform configured"); + exit(EXIT_FAILURE); + } + if(wiringXSetup(platform, logprintf1) == 0) { + loop = 1; + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(gpio_switch, json); + return threads_register("gpio_switch", &thread, (void *)node, 0); + } else { + return NULL; + } +} + +static int checkValues(struct JsonNode *jvalues) { + double readonly = 0.0; + + char *platform = GPIO_PLATFORM; + if(settings_find_string("gpio-platform", &platform) != 0 || strcmp(platform, "none") == 0) { + logprintf(LOG_ERR, "gpio_switch: no gpio-platform configured"); + exit(EXIT_FAILURE); + } + if(wiringXSetup(platform, logprintf1) == 0) { + struct JsonNode *jid = NULL; + if((jid = json_find_member(jvalues, "id"))) { + struct JsonNode *jchild = NULL; + struct JsonNode *jchild1 = NULL; + + jchild = json_first_child(jid); + while(jchild) { + jchild1 = json_first_child(jchild); + while(jchild1) { + if(strcmp(jchild1->key, "gpio") == 0) { + if(wiringXValidGPIO((int)round(jchild1->number_)) != 0) { + return -1; + } + } + jchild1 = jchild1->next; + } + jchild = jchild->next; + } + } + } + + if(json_find_number(jvalues, "readonly", &readonly) == 0) { + if((int)readonly != 1) { + return -1; + } + } + + return 0; +} + +static void threadGC(void) { + loop = 0; + protocol_thread_stop(gpio_switch); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(gpio_switch); +} +#endif + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void gpioSwitchInit(void) { + + protocol_register(&gpio_switch); + protocol_set_id(gpio_switch, "gpio_switch"); + protocol_device_add(gpio_switch, "gpio_switch", "GPIO as a switch"); + gpio_switch->devtype = SWITCH; + gpio_switch->hwtype = SENSOR; + + options_add(&gpio_switch->options, 't', "on", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&gpio_switch->options, 'f', "off", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&gpio_switch->options, 'g', "gpio", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "^([0-9]{1}|1[0-9]|20)$"); + + options_add(&gpio_switch->options, 0, "readonly", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&gpio_switch->options, 0, "confirm", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + +#if !defined(__FreeBSD__) && !defined(_WIN32) + gpio_switch->initDev=&initDev; + gpio_switch->threadGC=&threadGC; + gpio_switch->checkValues=&checkValues; +#endif +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "gpio_switch"; + module->version = "2.4"; + module->reqversion = "7.0"; + module->reqcommit = "186"; +} + +void init(void) { + gpioSwitchInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/gpio_switch.h b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/gpio_switch.h new file mode 100644 index 0000000..432f9fa --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/gpio_switch.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_GPIO_SWITCH_H_ +#define _PROTOCOL_GPIO_SWITCH_H_ + +#include "../protocol.h" + +struct protocol_t *gpio_switch; +void gpioSwitchInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm75.c b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm75.c new file mode 100644 index 0000000..5c21623 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm75.c @@ -0,0 +1,243 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif + #include +#endif +#include + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../../core/threads.h" +#include "../../core/binary.h" +#include "../../core/gc.h" +#include "../../core/json.h" +#include "../../config/settings.h" +#include "../protocol.h" +#include "lm75.h" + +#if !defined(__FreeBSD__) && !defined(_WIN32) +typedef struct settings_t { + char **id; + char path[PATH_MAX]; + int nrid; + int *fd; +} settings_t; + +static unsigned short loop = 1; +static int threads = 0; + +static pthread_mutex_t lock; +static pthread_mutexattr_t attr; + +static void *thread(void *param) { + struct protocol_threads_t *node = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)node->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct settings_t *lm75data = MALLOC(sizeof(struct settings_t)); + int y = 0, interval = 10, nrloops = 0; + char *stmp = NULL; + double itmp = -1, temp_offset = 0.0; + + if(lm75data == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + lm75data->nrid = 0; + lm75data->id = NULL; + lm75data->fd = 0; + + threads++; + + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + if(json_find_string(jchild, "id", &stmp) == 0) { + if((lm75data->id = REALLOC(lm75data->id, (sizeof(char *)*(size_t)(lm75data->nrid+1)))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((lm75data->id[lm75data->nrid] = MALLOC(strlen(stmp)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(lm75data->id[lm75data->nrid], stmp); + lm75data->nrid++; + } + if(json_find_string(jchild, "i2c-path", &stmp) == 0) { + strcpy(lm75data->path, stmp); + } + jchild = jchild->next; + } + } + + if(json_find_number(json, "poll-interval", &itmp) == 0) + interval = (int)round(itmp); + json_find_number(json, "temperature-offset", &temp_offset); + + if((lm75data->fd = REALLOC(lm75data->fd, (sizeof(int)*(size_t)(lm75data->nrid+1)))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + for(y=0;ynrid;y++) { + lm75data->fd[y] = wiringXI2CSetup(lm75data->path, (int)strtol(lm75data->id[y], NULL, 16)); + } + + while(loop) { + if(protocol_thread_wait(node, interval, &nrloops) == ETIMEDOUT) { + pthread_mutex_lock(&lock); + for(y=0;ynrid;y++) { + if(lm75data->fd[y] > 0) { + int raw = wiringXI2CReadReg16(lm75data->fd[y], 0x00); + float temp = ((float)((raw&0x00ff)+((raw>>15)?0:0.5))*10); + + lm75->message = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "id", json_mkstring(lm75data->id[y])); + json_append_member(code, "temperature", json_mknumber((temp+temp_offset)/10, 1)); + + json_append_member(lm75->message, "message", code); + json_append_member(lm75->message, "origin", json_mkstring("receiver")); + json_append_member(lm75->message, "protocol", json_mkstring(lm75->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(lm75->id, lm75->message, PROTOCOL); + } + json_delete(lm75->message); + lm75->message = NULL; + } else { + logprintf(LOG_NOTICE, "error connecting to lm75"); + logprintf(LOG_DEBUG, "(probably i2c bus error from wiringXI2CSetup)"); + logprintf(LOG_DEBUG, "(maybe wrong id? use i2cdetect to find out)"); + protocol_thread_wait(node, 1, &nrloops); + } + } + pthread_mutex_unlock(&lock); + } + } + pthread_mutex_unlock(&lock); + + if(lm75data->id) { + for(y=0;ynrid;y++) { + FREE(lm75data->id[y]); + } + FREE(lm75data->id); + } + if(lm75data->fd) { + for(y=0;ynrid;y++) { + if(lm75data->fd[y] > 0) { + close(lm75data->fd[y]); + } + } + FREE(lm75data->fd); + } + FREE(lm75data); + threads--; + + return (void *)NULL; +} + +static struct threadqueue_t *initDev(JsonNode *jdevice) { + char *platform = GPIO_PLATFORM; + if(settings_find_string("gpio-platform", &platform) != 0 || strcmp(platform, "none") == 0) { + logprintf(LOG_ERR, "lm75: no gpio-platform configured"); + exit(EXIT_FAILURE); + } + if(wiringXSetup(platform, logprintf1) == 0) { + loop = 1; + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(lm75, json); + return threads_register("lm75", &thread, (void *)node, 0); + } else { + return NULL; + } +} + +static void threadGC(void) { + loop = 0; + protocol_thread_stop(lm75); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(lm75); +} +#endif + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void lm75Init(void) { +#if !defined(__FreeBSD__) && !defined(_WIN32) + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&lock, &attr); +#endif + + protocol_register(&lm75); + protocol_set_id(lm75, "lm75"); + protocol_device_add(lm75, "lm75", "TI I2C Temperature Sensor"); + lm75->devtype = WEATHER; + lm75->hwtype = SENSOR; + + options_add(&lm75->options, 't', "temperature", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{1,3}$"); + options_add(&lm75->options, 'i', "id", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "0x[0-9a-f]{2}"); + options_add(&lm75->options, 'd', "i2c-path", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "^/dev/i2c-[0-9]{1,2}$"); + + // options_add(&lm75->options, 0, "decimals", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)1, "[0-9]"); + options_add(&lm75->options, 0, "temperature-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "[0-9]"); + options_add(&lm75->options, 0, "show-temperature", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + +#if !defined(__FreeBSD__) && !defined(_WIN32) + lm75->initDev=&initDev; + lm75->threadGC=&threadGC; +#endif +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "lm75"; + module->version = "2.2"; + module->reqversion = "7.0"; + module->reqcommit = "186"; +} + +void init(void) { + lm75Init(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm75.h b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm75.h new file mode 100644 index 0000000..b3be4e4 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm75.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_LM75_H_ +#define _PROTOCOL_LM75_H_ + +#include "../protocol.h" + +struct protocol_t *lm75; +void lm75Init(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm76.c b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm76.c new file mode 100644 index 0000000..bdfa01a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm76.c @@ -0,0 +1,244 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif + #include +#endif +#include + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../../core/threads.h" +#include "../../core/binary.h" +#include "../../core/gc.h" +#include "../../core/json.h" +#include "../../config/settings.h" +#include "../protocol.h" +#include "lm76.h" + +#if !defined(__FreeBSD__) && !defined(_WIN32) +typedef struct settings_t { + char **id; + char path[PATH_MAX]; + int nrid; + int *fd; +} settings_t; + +static unsigned short loop = 1; +static int threads = 0; + +static pthread_mutex_t lock; +static pthread_mutexattr_t attr; + +static void *thread(void *param) { + struct protocol_threads_t *node = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)node->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + struct settings_t *lm76data = MALLOC(sizeof(struct settings_t)); + int y = 0, interval = 10, nrloops = 0; + char *stmp = NULL; + double itmp = -1, temp_offset = 0; + + if(lm76data == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + lm76data->nrid = 0; + lm76data->id = NULL; + lm76data->fd = 0; + + threads++; + + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + if(json_find_string(jchild, "id", &stmp) == 0) { + if((lm76data->id = REALLOC(lm76data->id, (sizeof(char *)*(size_t)(lm76data->nrid+1)))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((lm76data->id[lm76data->nrid] = MALLOC(strlen(stmp)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(lm76data->id[lm76data->nrid], stmp); + lm76data->nrid++; + } + if(json_find_string(jchild, "i2c-path", &stmp) == 0) { + strcpy(lm76data->path, stmp); + } + jchild = jchild->next; + } + } + + if(json_find_number(json, "poll-interval", &itmp) == 0) + interval = (int)round(itmp); + json_find_number(json, "temperature-offset", &temp_offset); + + if((lm76data->fd = REALLOC(lm76data->fd, (sizeof(int)*(size_t)(lm76data->nrid+1)))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + for(y=0;ynrid;y++) { + lm76data->fd[y] = wiringXI2CSetup(lm76data->path, (int)strtol(lm76data->id[y], NULL, 16)); + } + + while(loop) { + if(protocol_thread_wait(node, interval, &nrloops) == ETIMEDOUT) { + pthread_mutex_lock(&lock); + for(y=0;ynrid;y++) { + if(lm76data->fd[y] > 0) { + int raw = wiringXI2CReadReg16(lm76data->fd[y], 0x00); + float temp = ((float)((raw&0x00ff)+((raw>>12)*0.0625))); + + lm76->message = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "id", json_mkstring(lm76data->id[y])); + json_append_member(code, "temperature", json_mknumber(temp+temp_offset, 3)); + + json_append_member(lm76->message, "message", code); + json_append_member(lm76->message, "origin", json_mkstring("receiver")); + json_append_member(lm76->message, "protocol", json_mkstring(lm76->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(lm76->id, lm76->message, PROTOCOL); + } + json_delete(lm76->message); + lm76->message = NULL; + } else { + logprintf(LOG_NOTICE, "error connecting to lm76"); + logprintf(LOG_DEBUG, "(probably i2c bus error from wiringXI2CSetup)"); + logprintf(LOG_DEBUG, "(maybe wrong id? use i2cdetect to find out)"); + protocol_thread_wait(node, 1, &nrloops); + } + } + pthread_mutex_unlock(&lock); + } + } + pthread_mutex_unlock(&lock); + + if(lm76data->id) { + for(y=0;ynrid;y++) { + FREE(lm76data->id[y]); + } + FREE(lm76data->id); + } + if(lm76data->fd) { + for(y=0;ynrid;y++) { + if(lm76data->fd[y] > 0) { + close(lm76data->fd[y]); + } + } + FREE(lm76data->fd); + } + FREE(lm76data); + threads--; + + return (void *)NULL; +} + +static struct threadqueue_t *initDev(JsonNode *jdevice) { + char *platform = GPIO_PLATFORM; + if(settings_find_string("gpio-platform", &platform) != 0 || strcmp(platform, "none") == 0) { + logprintf(LOG_ERR, "lm75: no gpio-platform configured"); + exit(EXIT_FAILURE); + } + if(wiringXSetup(platform, logprintf1) == 0) { + loop = 1; + + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(lm76, json); + return threads_register("lm76", &thread, (void *)node, 0); + } else { + return NULL; + } +} + +static void threadGC(void) { + loop = 0; + protocol_thread_stop(lm76); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(lm76); +} +#endif + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void lm76Init(void) { +#if !defined(__FreeBSD__) && !defined(_WIN32) + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&lock, &attr); +#endif + + protocol_register(&lm76); + protocol_set_id(lm76, "lm76"); + protocol_device_add(lm76, "lm76", "TI I2C Temperature Sensor"); + lm76->devtype = WEATHER; + lm76->hwtype = SENSOR; + + options_add(&lm76->options, 't', "temperature", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[0-9]{1,3}$"); + options_add(&lm76->options, 'i', "id", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "0x[0-9a-f]{2}"); + options_add(&lm76->options, 'd', "i2c-path", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "^/dev/i2c-[0-9]{1,2}$"); + + // options_add(&lm76->options, 0, "decimals", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)3, "[0-9]"); + options_add(&lm76->options, 0, "temperature-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)3, "[0-9]"); + options_add(&lm76->options, 0, "show-temperature", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + +#if !defined(__FreeBSD__) && !defined(_WIN32) + lm76->initDev=&initDev; + lm76->threadGC=&threadGC; +#endif +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "lm76"; + module->version = "2.1"; + module->reqversion = "7.0"; + module->reqcommit = "186"; +} + +void init(void) { + lm76Init(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm76.h b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm76.h new file mode 100644 index 0000000..7b96394 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/lm76.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_LM76_H_ +#define _PROTOCOL_LM76_H_ + +#include "../protocol.h" + +struct protocol_t *lm76; +void lm76Init(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/protocol_header.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/protocol_header.h.in new file mode 100644 index 0000000..da97564 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/protocol_header.h.in @@ -0,0 +1 @@ +@PROTOCOL_HEADERS@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/protocol_init.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/protocol_init.h.in new file mode 100644 index 0000000..40bdc9d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/protocol_init.h.in @@ -0,0 +1 @@ +@PROTOCOL_INIT@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/relay.c b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/relay.c new file mode 100644 index 0000000..541b27c --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/relay.c @@ -0,0 +1,261 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 +#include +#endif + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../../core/gc.h" +#include "../../config/settings.h" +#include "../protocol.h" +#include "relay.h" + +#include "defines.h" + +static char *state = NULL; +#if !defined(__FreeBSD__) && !defined(_WIN32) + +static void createMessage(int gpio, int state) { + relay->message = json_mkobject(); + json_append_member(relay->message, "gpio", json_mknumber(gpio, 0)); + if(state == 1) + json_append_member(relay->message, "state", json_mkstring("on")); + else + json_append_member(relay->message, "state", json_mkstring("off")); +} + +static int createCode(JsonNode *code) { + int free_def = 0; + int gpio = -1; + int state = -1; + double itmp = -1; + char *def = NULL; + int have_error = 0; + + relay->rawlen = 0; + if(json_find_string(code, "default-state", &def) != 0) { + if((def = MALLOC(4)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(def, "off"); + free_def = 1; + } + + if(json_find_number(code, "gpio", &itmp) == 0) + gpio = (int)round(itmp); + if(json_find_number(code, "off", &itmp) == 0) + state=0; + else if(json_find_number(code, "on", &itmp) == 0) + state=1; + + char *platform = GPIO_PLATFORM; + if(settings_find_string("gpio-platform", &platform) != 0) { + logprintf(LOG_ERR, "relay: no gpio-platform configured"); + have_error = 1; + goto clear; + } else if(strcmp(platform, "none") == 0) { + logprintf(LOG_ERR, "relay: no gpio-platform configured"); + have_error = 1; + goto clear; + } + + if(gpio == -1 || state == -1) { + logprintf(LOG_ERR, "relay: insufficient number of arguments"); + have_error = 1; + goto clear; + } else if(wiringXSetup(platform, logprintf1) < 0) { + logprintf(LOG_ERR, "unable to setup wiringX") ; + have_error = 1; + goto clear; + } else { + if(wiringXValidGPIO(gpio) != 0) { + logprintf(LOG_ERR, "relay: invalid gpio range"); + have_error = 1; + goto clear; + } else { + if(strstr(progname, "daemon") != NULL) { + pinMode(gpio, PINMODE_OUTPUT); + if(strcmp(def, "off") == 0) { + if(state == 1) { + digitalWrite(gpio, LOW); + } else if(state == 0) { + digitalWrite(gpio, HIGH); + } + } else { + if(state == 0) { + digitalWrite(gpio, LOW); + } else if(state == 1) { + digitalWrite(gpio, HIGH); + } + } + } else { + wiringXGC(); + } + createMessage(gpio, state); + goto clear; + } + } + +clear: + if(free_def == 1) { + FREE(def); + } + if(have_error) { + return EXIT_FAILURE; + } else { + return EXIT_SUCCESS; + } +} + +static void printHelp(void) { + printf("\t -t --on\t\t\tturn the relay on\n"); + printf("\t -f --off\t\t\tturn the relay off\n"); + printf("\t -g --gpio=gpio\t\t\tthe gpio the relay is connected to\n"); +} + +static int checkValues(JsonNode *code) { + char *def = NULL; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + int free_def = 0; + double itmp = -1; + + if(json_find_string(code, "default-state", &def) != 0) { + if((def = MALLOC(4)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(def, "off"); + free_def = 1; + } + if(strcmp(def, "on") != 0 && strcmp(def, "off") != 0) { + if(free_def == 1) { + FREE(def); + } + return 1; + } + + /* Get current relay state and validate GPIO number */ + if((jid = json_find_member(code, "id")) != NULL) { + if((jchild = json_find_element(jid, 0)) != NULL) { + if(json_find_number(jchild, "gpio", &itmp) == 0) { + int gpio = (int)itmp; + int state = -1; + char *platform = GPIO_PLATFORM; + if(settings_find_string("gpio-platform", &platform) != 0 || strcmp(platform, "none") == 0) { + logprintf(LOG_ERR, "relay: no gpio-platform configured"); + return -1; + } else if(wiringXSetup(platform, logprintf1) < 0) { + logprintf(LOG_ERR, "unable to setup wiringX") ; + return -1; + } else if(wiringXValidGPIO(gpio) != 0) { + logprintf(LOG_ERR, "relay: invalid gpio range"); + return -1; + } else { + pinMode(gpio, PINMODE_INPUT); + state = digitalRead(gpio); + if(strcmp(def, "on") == 0) { + state ^= 1; + } + + relay->message = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "gpio", json_mknumber(gpio, 0)); + if(state == 1) { + json_append_member(code, "state", json_mkstring("on")); + } else { + json_append_member(code, "state", json_mkstring("off")); + } + + json_append_member(relay->message, "message", code); + json_append_member(relay->message, "origin", json_mkstring("sender")); + json_append_member(relay->message, "protocol", json_mkstring(relay->id)); + if(pilight.broadcast != NULL) { + pilight.broadcast(relay->id, relay->message, PROTOCOL); + } + json_delete(relay->message); + relay->message = NULL; + } + } + } + } + + if(free_def == 1) { + FREE(def); + } + return 0; +} + +static void gc(void) { + FREE(state); +} +#endif + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void relayInit(void) { + + protocol_register(&relay); + protocol_set_id(relay, "relay"); + protocol_device_add(relay, "relay", "GPIO Connected Relays"); + relay->devtype = RELAY; + relay->hwtype = HWRELAY; + relay->multipleId = 0; + + options_add(&relay->options, 't', "on", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&relay->options, 'f', "off", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&relay->options, 'g', "gpio", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "[0-9]"); + + state = MALLOC(4); + strcpy(state, "off"); + options_add(&relay->options, 0, "default-state", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_STRING, (void *)state, NULL); + options_add(&relay->options, 0, "readonly", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)0, "^[10]{1}$"); + options_add(&relay->options, 0, "confirm", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)0, "^[10]{1}$"); + +#if !defined(__FreeBSD__) && !defined(_WIN32) + relay->checkValues=&checkValues; + relay->createCode=&createCode; + relay->printHelp=&printHelp; + relay->gc=&gc; +#endif +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "relay"; + module->version = "3.4"; + module->reqversion = "7.0"; + module->reqcommit = "186"; +} + +void init(void) { + relayInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/relay.h b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/relay.h new file mode 100644 index 0000000..1685e1a --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/GPIO/relay.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_RELAY_H_ +#define _PROTOCOL_RELAY_H_ + +#include "../protocol.h" + +struct protocol_t *relay; +void relayInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/core/CMakeInclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/core/CMakeInclude.txt new file mode 100644 index 0000000..496cba9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/core/CMakeInclude.txt @@ -0,0 +1,30 @@ +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/protocol_init.h") +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/protocol_header.h") + +set(headers) +foreach(header ${${PROJECT_NAME}_headers}) + string(REPLACE "${PROJECT_SOURCE_DIR}/" " #include \"" header1 ${header}) + string(REPLACE ".h" ".h\"!" header2 ${header1}) + list(APPEND headers ${header2}) +endforeach(header) + +string(REPLACE "!" "\n" header4 ${headers}) +set(PROTOCOL_HEADERS ${header4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_header.h.in ${PROJECT_SOURCE_DIR}/protocol_header.h) + +execute_process( +COMMAND grep -h "void .*Init(void)" ${${PROJECT_NAME}_sources} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE protocol_result + OUTPUT_VARIABLE protocol_init) + +set(inits) +foreach(init ${protocol_init}) + string(REPLACE "void " " " init1 ${init}) + string(REPLACE "(void) {" "()!" init2 ${init1}) + list(APPEND inits ${init2}) +endforeach(init) + +string(REPLACE "!" ";" init4 ${inits}) +set(PROTOCOL_INIT ${init4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_init.h.in ${PROJECT_SOURCE_DIR}/protocol_init.h) diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/core/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/core/CMakeLists.txt new file mode 100644 index 0000000..d92a1f5 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/core/CMakeLists.txt @@ -0,0 +1,8 @@ +project(pilight_protocols_core) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +include(CMakeInclude.txt) + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v2.c b/lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v2.c new file mode 100644 index 0000000..e28c8c5 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v2.c @@ -0,0 +1,111 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/gc.h" +#include "pilight_firmware_v2.h" + +#define PULSE_MULTIPLIER 4 +#define MIN_PULSE_LENGTH 175 +#define MAX_PULSE_LENGTH 225 +#define AVG_PULSE_LENGTH 183 +#define RAW_LENGTH 196 + +static int validate(void) { + if(pilight_firmware_v2->rawlen == RAW_LENGTH) { + if(pilight_firmware_v2->raw[pilight_firmware_v2->rawlen-1] >= (MIN_PULSE_LENGTH*PULSE_DIV) && + pilight_firmware_v2->raw[pilight_firmware_v2->rawlen-1] <= (MAX_PULSE_LENGTH*PULSE_DIV) && + pilight_firmware_v2->raw[1] > AVG_PULSE_LENGTH*PULSE_MULTIPLIER) { + return 0; + } + } + + return -1; +} + +static void createMessage(int version, int high, int low) { + pilight_firmware_v2->message = json_mkobject(); + json_append_member(pilight_firmware_v2->message, "version", json_mknumber(version, 2)); + json_append_member(pilight_firmware_v2->message, "lpf", json_mknumber(high*10, 0)); + json_append_member(pilight_firmware_v2->message, "hpf", json_mknumber(low*10, 0)); +} + +static void parseCode(void) { + int i = 0, x = 0, binary[RAW_LENGTH/4]; + + for(i=0;irawlen;i+=4) { + if(pilight_firmware_v2->raw[i+3] < 100) { + pilight_firmware_v2->raw[i+3]*=10; + } + if(pilight_firmware_v2->raw[i+3] > AVG_PULSE_LENGTH*(PULSE_MULTIPLIER/2)) { + binary[x++] = 1; + } else { + binary[x++] = 0; + } + } + + int version = binToDec(binary, 0, 15); + int high = binToDec(binary, 16, 31); + int low = binToDec(binary, 32, 47); + createMessage(version, high, low); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void pilightFirmwareV2Init(void) { + + protocol_register(&pilight_firmware_v2); + protocol_set_id(pilight_firmware_v2, "pilight_firmware"); + protocol_device_add(pilight_firmware_v2, "pilight_firmware", "pilight filter firmware"); + pilight_firmware_v2->devtype = FIRMWARE; + pilight_firmware_v2->hwtype = HWINTERNAL; + pilight_firmware_v2->minrawlen = RAW_LENGTH; + pilight_firmware_v2->maxrawlen = RAW_LENGTH; + pilight_firmware_v2->maxgaplen = MAX_PULSE_LENGTH*PULSE_DIV; + pilight_firmware_v2->mingaplen = MIN_PULSE_LENGTH*PULSE_DIV; + + options_add(&pilight_firmware_v2->options, 'v', "version", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "^[0-9]+$"); + options_add(&pilight_firmware_v2->options, 'l', "lpf", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "^[0-9]+$"); + options_add(&pilight_firmware_v2->options, 'h', "hpf", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "^[0-9]+$"); + + pilight_firmware_v2->parseCode=&parseCode; + pilight_firmware_v2->validate=&validate; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "pilight_firmware"; + module->version = "2.0"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + pilightFirmwareV2Init(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v2.h b/lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v2.h new file mode 100644 index 0000000..28f5773 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v2.h @@ -0,0 +1,25 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_PILIGHT_FIRMWARE_V2_H_ +#define _PROTOCOL_PILIGHT_FIRMWARE_V2_H_ + +struct protocol_t *pilight_firmware_v2; +void pilightFirmwareV2Init(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v3.c b/lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v3.c new file mode 100644 index 0000000..53e1a43 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v3.c @@ -0,0 +1,128 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/gc.h" +#include "pilight_firmware_v3.h" + +#define PULSE_MULTIPLIER 4 +#define MIN_PULSE_LENGTH 205 +#define MAX_PULSE_LENGTH 245 +#define AVG_PULSE_LENGTH 225 +#define RAW_LENGTH 212 + +static int validate(void) { + if(pilight_firmware_v3->rawlen == RAW_LENGTH) { + if(pilight_firmware_v3->raw[pilight_firmware_v3->rawlen-1] >= (MIN_PULSE_LENGTH*PULSE_DIV) && + pilight_firmware_v3->raw[pilight_firmware_v3->rawlen-1] <= (MAX_PULSE_LENGTH*PULSE_DIV) && + pilight_firmware_v3->raw[1] > AVG_PULSE_LENGTH*PULSE_MULTIPLIER) { + return 0; + } + } + + return -1; +} + +static void createMessage(int version, int high, int low) { + pilight_firmware_v3->message = json_mkobject(); + json_append_member(pilight_firmware_v3->message, "version", json_mknumber(version, 2)); + json_append_member(pilight_firmware_v3->message, "lpf", json_mknumber(high*10, 0)); + json_append_member(pilight_firmware_v3->message, "hpf", json_mknumber(low*10, 0)); +} + +static void parseCode(void) { + int i = 0, x = 0, binary[RAW_LENGTH/4]; + + for(i=0;irawlen;i+=4) { + if(pilight_firmware_v3->raw[i+3] < 100) { + pilight_firmware_v3->raw[i+3]*=10; + } + if(pilight_firmware_v3->raw[i+3] > AVG_PULSE_LENGTH*(PULSE_MULTIPLIER/2)) { + binary[x++] = 1; + } else { + binary[x++] = 0; + } + } + + int version = binToDec(binary, 0, 15); + int high = binToDec(binary, 16, 31); + int low = binToDec(binary, 32, 47); + int chk = binToDec(binary, 48, 51); + int lpf = low; + int hpf = high; + int ver = version; + + while(hpf > 10) { + hpf /= 10; + } + while(lpf > 10) { + lpf /= 10; + } + while(ver > 10) { + ver /= 10; + } + + if((((ver&0xf)+(lpf&0xf)+(hpf&0xf))&0xf) == chk) { + createMessage(version, high, low); + } +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void pilightFirmwareV3Init(void) { + + protocol_register(&pilight_firmware_v3); + protocol_set_id(pilight_firmware_v3, "pilight_firmware"); + protocol_device_add(pilight_firmware_v3, "pilight_firmware", "pilight filter firmware"); + pilight_firmware_v3->devtype = FIRMWARE; + pilight_firmware_v3->hwtype = HWINTERNAL; + pilight_firmware_v3->minrawlen = RAW_LENGTH; + pilight_firmware_v3->maxrawlen = RAW_LENGTH; + pilight_firmware_v3->maxgaplen = MAX_PULSE_LENGTH*PULSE_DIV; + pilight_firmware_v3->mingaplen = MIN_PULSE_LENGTH*PULSE_DIV; + + options_add(&pilight_firmware_v3->options, 'v', "version", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "^[0-9]+$"); + options_add(&pilight_firmware_v3->options, 'l', "lpf", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "^[0-9]+$"); + options_add(&pilight_firmware_v3->options, 'h', "hpf", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "^[0-9]+$"); + + pilight_firmware_v3->parseCode=&parseCode; + pilight_firmware_v3->validate=&validate; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "pilight_firmware"; + module->version = "2.0"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + pilightFirmwareV3Init(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v3.h b/lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v3.h new file mode 100644 index 0000000..646da97 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/core/pilight_firmware_v3.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_PILIGHT_FIRMWARE_V3_H_ +#define _PROTOCOL_PILIGHT_FIRMWARE_V3_H_ + +#include "../protocol.h" + +struct protocol_t *pilight_firmware_v3; +void pilightFirmwareV3Init(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/core/protocol_header.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/core/protocol_header.h.in new file mode 100644 index 0000000..da97564 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/core/protocol_header.h.in @@ -0,0 +1 @@ +@PROTOCOL_HEADERS@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/core/protocol_init.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/core/protocol_init.h.in new file mode 100644 index 0000000..40bdc9d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/core/protocol_init.h.in @@ -0,0 +1 @@ +@PROTOCOL_INIT@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/core/raw.c b/lib/ESPiLight/pilight/libs/pilight/protocols/core/raw.c new file mode 100644 index 0000000..0320fa3 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/core/raw.c @@ -0,0 +1,91 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/gc.h" +#include "raw.h" + +static int createCode(JsonNode *code) { + char *rcode = NULL; + double repeats = 10; + char **array = NULL; + unsigned int i = 0, n = 0; + + if(json_find_string(code, "code", &rcode) != 0) { + logprintf(LOG_ERR, "raw: insufficient number of arguments"); + return EXIT_FAILURE; + } + + json_find_number(code, "repeats", &repeats); + + n = explode(rcode, " ", &array); + for(i=0;iraw[i]=atoi(array[i]); + } + array_free(&array, n); + + raw->rawlen=(int)i; + raw->txrpt = repeats; + + return EXIT_SUCCESS; +} + +static void printHelp(void) { + printf("\t -c --code=\"raw\"\t\traw code devided by spaces\n\t\t\t\t\t(just like the output of debug)\n"); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void rawInit(void) { + + protocol_register(&raw); + protocol_set_id(raw, "raw"); + protocol_device_add(raw, "raw", "Raw Codes"); + raw->devtype = RAW; + raw->hwtype = RF433; + raw->config = 0; + + options_add(&raw->options, 'c', "code", OPTION_HAS_VALUE, 0, JSON_STRING, NULL, NULL); + options_add(&raw->options, 'r', "repeats", OPTION_OPT_VALUE, 0, JSON_NUMBER, NULL, NULL); + + raw->createCode=&createCode; + raw->printHelp=&printHelp; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "raw"; + module->version = "1.5"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + rawInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/core/raw.h b/lib/ESPiLight/pilight/libs/pilight/protocols/core/raw.h new file mode 100644 index 0000000..3a0a254 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/core/raw.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_RAW_H_ +#define _PROTOCOL_RAW_H_ + +#include "../protocol.h" + +struct protocol_t *raw; +void rawInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/CMakeExclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/CMakeExclude.txt new file mode 100644 index 0000000..c0a2177 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/CMakeExclude.txt @@ -0,0 +1,26 @@ +include(../../../../CMakeConfig.txt) + +if(${PROTOCOL_GENERIC_DIMMER} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/generic_dimmer.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/generic_dimmer.h") +endif() + +if(${PROTOCOL_GENERIC_SWITCH} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/generic_switch.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/generic_switch.h") +endif() + +if(${PROTOCOL_GENERIC_SCREEN} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/generic_screen.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/generic_screen.h") +endif() + +if(${PROTOCOL_GENERIC_WEATHER} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/generic_weather.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/generic_weather.h") +endif() + +if(${PROTOCOL_GENERIC_WEBCAM} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/generic_webcam.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/generic_webcam.h") +endif() diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/CMakeInclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/CMakeInclude.txt new file mode 100644 index 0000000..496cba9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/CMakeInclude.txt @@ -0,0 +1,30 @@ +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/protocol_init.h") +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/protocol_header.h") + +set(headers) +foreach(header ${${PROJECT_NAME}_headers}) + string(REPLACE "${PROJECT_SOURCE_DIR}/" " #include \"" header1 ${header}) + string(REPLACE ".h" ".h\"!" header2 ${header1}) + list(APPEND headers ${header2}) +endforeach(header) + +string(REPLACE "!" "\n" header4 ${headers}) +set(PROTOCOL_HEADERS ${header4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_header.h.in ${PROJECT_SOURCE_DIR}/protocol_header.h) + +execute_process( +COMMAND grep -h "void .*Init(void)" ${${PROJECT_NAME}_sources} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE protocol_result + OUTPUT_VARIABLE protocol_init) + +set(inits) +foreach(init ${protocol_init}) + string(REPLACE "void " " " init1 ${init}) + string(REPLACE "(void) {" "()!" init2 ${init1}) + list(APPEND inits ${init2}) +endforeach(init) + +string(REPLACE "!" ";" init4 ${inits}) +set(PROTOCOL_INIT ${init4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_init.h.in ${PROJECT_SOURCE_DIR}/protocol_init.h) diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/CMakeLists.txt new file mode 100644 index 0000000..f0de2d3 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/CMakeLists.txt @@ -0,0 +1,9 @@ +project(pilight_protocols_generic) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +include(CMakeExclude.txt) +include(CMakeInclude.txt) + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_dimmer.c b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_dimmer.c new file mode 100644 index 0000000..465ceb8 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_dimmer.c @@ -0,0 +1,158 @@ +/* + Copyright (C) 2013 - 2016 CurlyMo + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. +*/ + +#include +#include +#include +#include + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "generic_dimmer.h" + +static void createMessage(int id, int state, int dimlevel) { + generic_dimmer->message = json_mkobject(); + json_append_member(generic_dimmer->message, "id", json_mknumber(id, 0)); + if(dimlevel >= 0) { + state = 1; + json_append_member(generic_dimmer->message, "dimlevel", json_mknumber(dimlevel, 0)); + } + if(state == 1) { + json_append_member(generic_dimmer->message, "state", json_mkstring("on")); + } else { + json_append_member(generic_dimmer->message, "state", json_mkstring("off")); + } +} + +/* +static int checkValues(struct JsonNode *code) { + int dimlevel = -1; + int max = 15; + int min = 0; + double itmp = -1; + + if(json_find_number(code, "dimlevel-maximum", &itmp) == 0) + max = (int)round(itmp); + if(json_find_number(code, "dimlevel-minimum", &itmp) == 0) + min = (int)round(itmp); + if(json_find_number(code, "dimlevel", &itmp) == 0) + dimlevel = (int)round(itmp); + + if(min > max) { + return 1; + } + + if(dimlevel != -1) { + if(dimlevel < min || dimlevel > max) { + return 1; + } else { + return 0; + } + } + return 0; +} +*/ + +static int createCode(struct JsonNode *code) { + int id = -1; + int state = -1; + int dimlevel = -1; + /* + int max = -1; + int min = -1; + */ + double itmp = -1; + + /* + if(json_find_number(code, "dimlevel-maximum", &itmp) == 0) + max = (int)round(itmp); + if(json_find_number(code, "dimlevel-minimum", &itmp) == 0) + min = (int)round(itmp); + */ + + if(json_find_number(code, "id", &itmp) == 0) + id = (int)round(itmp); + if(json_find_number(code, "dimlevel", &itmp) == 0) + dimlevel = (int)round(itmp); + if(json_find_number(code, "off", &itmp) == 0) + state=0; + else if(json_find_number(code, "on", &itmp) == 0) + state=1; + + if(id == -1 || (dimlevel == -1 && state == -1)) { + logprintf(LOG_ERR, "generic_dimmer: insufficient number of arguments"); + return EXIT_FAILURE; + /* + } else if(dimlevel != -1 && ((max != -1 && dimlevel > max) || (min != -1 && dimlevel < min))) { + logprintf(LOG_ERR, "generic_dimmer: invalid dimlevel range"); + return EXIT_FAILURE; + */ + } else if(dimlevel >= 0 && state == 0) { + logprintf(LOG_ERR, "generic_dimmer: dimlevel and state cannot be combined"); + return EXIT_FAILURE; + } else { + if(dimlevel >= 0) { + state = -1; + } + createMessage(id, state, dimlevel); + } + return EXIT_SUCCESS; + +} + +static void printHelp(void) { + printf("\t -t --on\t\t\tsend an on signal\n"); + printf("\t -f --off\t\t\tsend an off signal\n"); + printf("\t -i --id=id\t\t\tcontrol a device with this id\n"); + printf("\t -d --dimlevel=dimlevel\t\tsend a specific dimlevel\n"); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void genericDimmerInit(void) { + + protocol_register(&generic_dimmer); + protocol_set_id(generic_dimmer, "generic_dimmer"); + protocol_device_add(generic_dimmer, "generic_dimmer", "Generic Dimmers"); + generic_dimmer->devtype = DIMMER; + + options_add(&generic_dimmer->options, 'd', "dimlevel", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^([0-9]{1,})$"); + options_add(&generic_dimmer->options, 't', "on", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&generic_dimmer->options, 'f', "off", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&generic_dimmer->options, 'i', "id", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "^([0-9]{1,})$"); + + options_add(&generic_dimmer->options, 0, "dimlevel-minimum", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)0, "^([0-9]{1}|[1][0-5])$"); + options_add(&generic_dimmer->options, 0, "dimlevel-maximum", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)15, "^([0-9]{1}|[1][0-5])$"); + + options_add(&generic_dimmer->options, 0, "readonly", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)0, "^[10]{1}$"); + options_add(&generic_dimmer->options, 0, "confirm", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)0, "^[10]{1}$"); + + generic_dimmer->printHelp=&printHelp; + generic_dimmer->createCode=&createCode; + /* + generic_dimmer->checkValues=&checkValues; + */ +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "generic_dimmer"; + module->version = "2.0"; + module->reqversion = "7.0"; + module->reqcommit = "94"; +} + +void init(void) { + genericDimmerInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_dimmer.h b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_dimmer.h new file mode 100644 index 0000000..6901501 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_dimmer.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_GENERIC_DIMMER_H_ +#define _PROTOCOL_GENERIC_DIMMER_H_ + +#include "../protocol.h" + +struct protocol_t *generic_dimmer; +void genericDimmerInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_label.c b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_label.c new file mode 100644 index 0000000..8ae98e9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_label.c @@ -0,0 +1,109 @@ +/* + Copyright (C) 2015 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/gc.h" +#include "generic_label.h" + +static void createMessage(int id, char *label, char *color) { + generic_label->message = json_mkobject(); + json_append_member(generic_label->message, "id", json_mknumber(id, 0)); + json_append_member(generic_label->message, "label", json_mkstring(label)); + json_append_member(generic_label->message, "color", json_mkstring(color)); +} + +static int createCode(JsonNode *code) { + int id = -1, free_label = 0; + char *label = NULL; + char *color = "black"; + double itmp = 0; + + if(json_find_number(code, "id", &itmp) == 0) + id = (int)round(itmp); + + json_find_string(code, "label", &label); + if(json_find_number(code, "label", &itmp) == 0) { + if((label = MALLOC(BUFFER_SIZE)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + free_label = 1; + snprintf(label, BUFFER_SIZE, "%d", (int)itmp); + } + json_find_string(code, "color", &color); + + if(id == -1 || label == NULL) { + logprintf(LOG_ERR, "generic_label: insufficient number of arguments"); + return EXIT_FAILURE; + } else { + createMessage(id, label, color); + } + if(free_label) { + FREE(label); + } + + return EXIT_SUCCESS; + +} + +static void printHelp(void) { + printf("\t -i --id=id\t\t\tcontrol a device with this id\n"); + printf("\t -l --label=label\t\tset this label\n"); + printf("\t -c --color=color\t\tset label color\n"); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void genericLabelInit(void) { + + protocol_register(&generic_label); + protocol_set_id(generic_label, "generic_label"); + protocol_device_add(generic_label, "generic_label", "Generic Label"); + generic_label->devtype = LABEL; + + options_add(&generic_label->options, 'i', "id", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "^([0-9]{1,})$"); + options_add(&generic_label->options, 'l', "label", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING | JSON_NUMBER, NULL, NULL); + options_add(&generic_label->options, 'c', "color", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + + generic_label->printHelp=&printHelp; + generic_label->createCode=&createCode; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "generic_label"; + module->version = "1.2"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + genericLabelInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_label.h b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_label.h new file mode 100644 index 0000000..7de6f5b --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_label.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_GENERIC_LABEL_H_ +#define _PROTOCOL_GENERIC_LABEL_H_ + +#include "../protocol.h" + +struct protocol_t *generic_label; +void genericLabelInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_screen.c b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_screen.c new file mode 100644 index 0000000..a089cd1 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_screen.c @@ -0,0 +1,103 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/gc.h" +#include "generic_screen.h" + +static void createMessage(int id, int state) { + generic_screen->message = json_mkobject(); + json_append_member(generic_screen->message, "id", json_mknumber(id, 1)); + if(state == 1) { + json_append_member(generic_screen->message, "state", json_mkstring("up")); + } else { + json_append_member(generic_screen->message, "state", json_mkstring("down")); + } +} + +static int createCode(JsonNode *code) { + int id = -1; + int state = -1; + double itmp = 0; + + if(json_find_number(code, "id", &itmp) == 0) + id = (int)round(itmp); + if(json_find_number(code, "down", &itmp) == 0) + state=0; + else if(json_find_number(code, "up", &itmp) == 0) + state=1; + + if(id == -1 || state == -1) { + logprintf(LOG_ERR, "generic_screen: insufficient number of arguments"); + return EXIT_FAILURE; + } else { + createMessage(id, state); + } + + return EXIT_SUCCESS; +} + +static void printHelp(void) { + printf("\t -t --up\t\t\tsend an up signal\n"); + printf("\t -f --down\t\t\tsend an down signal\n"); + printf("\t -i --id=id\t\t\tcontrol a device with this id\n"); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void genericScreenInit(void) { + + protocol_register(&generic_screen); + protocol_set_id(generic_screen, "generic_screen"); + protocol_device_add(generic_screen, "generic_screen", "Generic Screens"); + generic_screen->devtype = SCREEN; + + options_add(&generic_screen->options, 't', "up", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&generic_screen->options, 'f', "down", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&generic_screen->options, 'i', "id", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "^([0-9]{1,})$"); + + options_add(&generic_screen->options, 0, "readonly", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)0, "^[10]{1}$"); + options_add(&generic_screen->options, 0, "confirm", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)0, "^[10]{1}$"); + + generic_screen->printHelp=&printHelp; + generic_screen->createCode=&createCode; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "generic_screen"; + module->version = "1.3"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + genericScreenInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_screen.h b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_screen.h new file mode 100644 index 0000000..1cb309f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_screen.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_GENERIC_SCREEN_H_ +#define _PROTOCOL_GENERIC_SCREEN_H_ + +#include "../protocol.h" + +struct protocol_t *generic_screen; +void genericScreenInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_switch.c b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_switch.c new file mode 100644 index 0000000..02d0ac0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_switch.c @@ -0,0 +1,104 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/gc.h" +#include "generic_switch.h" + +static void createMessage(int id, int state) { + generic_switch->message = json_mkobject(); + json_append_member(generic_switch->message, "id", json_mknumber(id, 0)); + if(state == 1) { + json_append_member(generic_switch->message, "state", json_mkstring("on")); + } else { + json_append_member(generic_switch->message, "state", json_mkstring("off")); + } +} + +static int createCode(JsonNode *code) { + int id = -1; + int state = -1; + double itmp = 0; + + if(json_find_number(code, "id", &itmp) == 0) + id = (int)round(itmp); + if(json_find_number(code, "off", &itmp) == 0) + state=0; + else if(json_find_number(code, "on", &itmp) == 0) + state=1; + + if(id == -1 || state == -1) { + logprintf(LOG_ERR, "generic_switch: insufficient number of arguments"); + return EXIT_FAILURE; + } else { + createMessage(id, state); + } + + return EXIT_SUCCESS; + +} + +static void printHelp(void) { + printf("\t -t --on\t\t\tsend an on signal\n"); + printf("\t -f --off\t\t\tsend an off signal\n"); + printf("\t -i --id=id\t\t\tcontrol a device with this id\n"); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void genericSwitchInit(void) { + + protocol_register(&generic_switch); + protocol_set_id(generic_switch, "generic_switch"); + protocol_device_add(generic_switch, "generic_switch", "Generic Switches"); + generic_switch->devtype = SWITCH; + + options_add(&generic_switch->options, 't', "on", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&generic_switch->options, 'f', "off", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&generic_switch->options, 'i', "id", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "^([0-9]{1,})$"); + + options_add(&generic_switch->options, 0, "readonly", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)0, "^[10]{1}$"); + options_add(&generic_switch->options, 0, "confirm", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)0, "^[10]{1}$"); + + generic_switch->printHelp=&printHelp; + generic_switch->createCode=&createCode; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "generic_switch"; + module->version = "1.3"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + genericSwitchInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_switch.h b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_switch.h new file mode 100644 index 0000000..d713f8e --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_switch.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_GENERIC_SWITCH_H_ +#define _PROTOCOL_GENERIC_SWITCH_H_ + +#include "../protocol.h" + +struct protocol_t *generic_switch; +void genericSwitchInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_weather.c b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_weather.c new file mode 100644 index 0000000..6e73122 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_weather.c @@ -0,0 +1,116 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/gc.h" +#include "generic_weather.h" + +static void createMessage(int id, double temperature, double humidity, int battery) { + generic_weather->message = json_mkobject(); + json_append_member(generic_weather->message, "id", json_mknumber(id, 0)); + if(temperature > -998.0) { + json_append_member(generic_weather->message, "temperature", json_mknumber(temperature, 2)); + } + if(humidity > -1.0) { + json_append_member(generic_weather->message, "humidity", json_mknumber(humidity, 2)); + } + if(battery > -1) { + json_append_member(generic_weather->message, "battery", json_mknumber(battery, 0)); + } +} + +static int createCode(JsonNode *code) { + double itmp = 0; + int id = -999; + double temp = -999.0; + double humi = -1.0; + int batt = -1; + + if(json_find_number(code, "id", &itmp) == 0) + id = (int)round(itmp); + if(json_find_number(code, "temperature", &itmp) == 0) + temp = itmp; + if(json_find_number(code, "humidity", &itmp) == 0) + humi = itmp; + if(json_find_number(code, "battery", &itmp) == 0) + batt = (int)round(itmp); + + if(id == -999 && temp < -998.0 && humi < 0.0 && batt == -1) { + logprintf(LOG_ERR, "generic_weather: insufficient number of arguments"); + return EXIT_FAILURE; + } else { + createMessage(id, temp, humi, batt); + } + return EXIT_SUCCESS; +} + +static void printHelp(void) { + printf("\t -t --temperature=temperature\tset the temperature\n"); + printf("\t -h --humidity=humidity\t\tset the humidity\n"); + printf("\t -b --battery=battery\t\tset the battery level\n"); + printf("\t -i --id=id\t\t\tcontrol a device with this id\n"); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void genericWeatherInit(void) { + + protocol_register(&generic_weather); + protocol_set_id(generic_weather, "generic_weather"); + protocol_device_add(generic_weather, "generic_weather", "Generic Weather Stations"); + generic_weather->devtype = WEATHER; + + options_add(&generic_weather->options, 'h', "humidity", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "[0-9]"); + options_add(&generic_weather->options, 't', "temperature", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "[0-9]"); + options_add(&generic_weather->options, 'b', "battery", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, "^[01]$"); + options_add(&generic_weather->options, 'i', "id", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "[0-9]"); + + // options_add(&generic_weather->options, 0, "decimals", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)2, "[0-9]"); + options_add(&generic_weather->options, 0, "temperature-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)2, "[0-9]"); + options_add(&generic_weather->options, 0, "humidity-decimals", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)2, "[0-9]"); + options_add(&generic_weather->options, 0, "show-humidity", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&generic_weather->options, 0, "show-temperature", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&generic_weather->options, 0, "show-battery", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + + generic_weather->printHelp=&printHelp; + generic_weather->createCode=&createCode; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "generic_weather"; + module->version = "1.22"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + genericWeatherInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_weather.h b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_weather.h new file mode 100644 index 0000000..ecfa872 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_weather.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_GENERIC_WEATHER_H_ +#define _PROTOCOL_GENERIC_WEATHER_H_ + +#include "../protocol.h" + +struct protocol_t *generic_weather; +void genericWeatherInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_webcam.c b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_webcam.c new file mode 100644 index 0000000..4770a60 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_webcam.c @@ -0,0 +1,80 @@ +/* + Copyright (C) 2014 CurlyMo & 1000io + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include + +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/binary.h" +#include "../../core/gc.h" +#include "generic_webcam.h" + +static int checkValues(JsonNode *code) { + int height = 300; + double itmp = -1; + + if(json_find_number(code, "gui-image-height", &itmp) == 0) + height = (int)round(itmp); + + if(height <= 0) { + logprintf(LOG_ERR, "Generic webcam gui-image-height cannot <= 0"); + return 1; + } + return 0; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void genericWebcamInit(void) { + + protocol_register(&generic_webcam); + protocol_set_id(generic_webcam, "generic_webcam"); + protocol_device_add(generic_webcam, "generic_webcam", "Generic webcam"); + generic_webcam->devtype = WEBCAM; + generic_webcam->multipleId = 0; + + options_add(&generic_webcam->options, 'u', "url", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&generic_webcam->options, 'i', "id", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, "^([0-9]{1,})$"); + + options_add(&generic_webcam->options, 0, "image-width", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)0, "[0-9]"); + options_add(&generic_webcam->options, 0, "image-height", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)300, "[0-9]"); + options_add(&generic_webcam->options, 0, "show-webcam", OPTION_HAS_VALUE, GUI_SETTING, JSON_NUMBER, (void *)1, "^[10]{1}$"); + options_add(&generic_webcam->options, 0, "poll-interval", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)10, "^[10]{2}$"); + + generic_webcam->checkValues=checkValues; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "generic_webcam"; + module->version = "1.3"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + genericWebcamInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_webcam.h b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_webcam.h new file mode 100644 index 0000000..23b8e06 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/generic_webcam.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_GENERIC_WEBCAM_H_ +#define _PROTOCOL_GENERIC_WEBCAM_H_ + +#include "../protocol.h" + +struct protocol_t *generic_webcam; +void genericWebcamInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/protocol_header.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/protocol_header.h.in new file mode 100644 index 0000000..da97564 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/protocol_header.h.in @@ -0,0 +1 @@ +@PROTOCOL_HEADERS@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/generic/protocol_init.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/protocol_init.h.in new file mode 100644 index 0000000..40bdc9d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/generic/protocol_init.h.in @@ -0,0 +1 @@ +@PROTOCOL_INIT@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/network/CMakeExclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/network/CMakeExclude.txt new file mode 100644 index 0000000..9d50cfc --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/network/CMakeExclude.txt @@ -0,0 +1,11 @@ +include(../../../../CMakeConfig.txt) + +if(${PROTOCOL_PING} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/ping.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/ping.h") +endif() + +if(${PROTOCOL_ARPING} MATCHES "OFF") + list(REMOVE_ITEM ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/arping.c") + list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/arping.h") +endif() diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/network/CMakeInclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/network/CMakeInclude.txt new file mode 100644 index 0000000..496cba9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/network/CMakeInclude.txt @@ -0,0 +1,30 @@ +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/protocol_init.h") +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/protocol_header.h") + +set(headers) +foreach(header ${${PROJECT_NAME}_headers}) + string(REPLACE "${PROJECT_SOURCE_DIR}/" " #include \"" header1 ${header}) + string(REPLACE ".h" ".h\"!" header2 ${header1}) + list(APPEND headers ${header2}) +endforeach(header) + +string(REPLACE "!" "\n" header4 ${headers}) +set(PROTOCOL_HEADERS ${header4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_header.h.in ${PROJECT_SOURCE_DIR}/protocol_header.h) + +execute_process( +COMMAND grep -h "void .*Init(void)" ${${PROJECT_NAME}_sources} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE protocol_result + OUTPUT_VARIABLE protocol_init) + +set(inits) +foreach(init ${protocol_init}) + string(REPLACE "void " " " init1 ${init}) + string(REPLACE "(void) {" "()!" init2 ${init1}) + list(APPEND inits ${init2}) +endforeach(init) + +string(REPLACE "!" ";" init4 ${inits}) +set(PROTOCOL_INIT ${init4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_init.h.in ${PROJECT_SOURCE_DIR}/protocol_init.h) diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/network/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/network/CMakeLists.txt new file mode 100644 index 0000000..f32902d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/network/CMakeLists.txt @@ -0,0 +1,9 @@ +project(pilight_protocols_network) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +include(CMakeExclude.txt) +include(CMakeInclude.txt) + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/network/arping.c b/lib/ESPiLight/pilight/libs/pilight/protocols/network/arping.c new file mode 100644 index 0000000..5b368ed --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/network/arping.c @@ -0,0 +1,273 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #define WPCAP + #include + #include + #include +#else + #include + #include + #include + #include + #include + #include + #include + #include + #include +#endif +#include + +#include "../../core/threads.h" +#include "../../core/pilight.h" +#include "../../core/arp.h" +#include "../../core/network.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/json.h" +#include "../../core/gc.h" +#include "arping.h" + +static unsigned short loop = 1; +static unsigned short threads = 0; + +static pthread_mutex_t lock; +static pthread_mutexattr_t attr; + +#define CONNECTED 1 +#define DISCONNECTED 0 +#define INTERVAL 5 + +static void *thread(void *param) { + struct protocol_threads_t *node = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)node->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + char *dstmac = NULL, srcmac[ETH_ALEN], *a = srcmac; + char *tmpip[INET_ADDRSTRLEN+1], dstip[INET_ADDRSTRLEN+1]; + char ip[INET_ADDRSTRLEN+1], *p = ip, **devs = NULL; + double itmp = 0.0; + int state = 0, nrloops = 0, interval = INTERVAL, i = 0, srcip[4], nrdevs = 0; + + threads++; + + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + if(json_find_string(jchild, "mac", &dstmac) == 0) { + break; + } + jchild = jchild->next; + } + } + + if(json_find_number(json, "poll-interval", &itmp) == 0) + interval = (int)round(itmp); + + memset(dstip, '\0', INET_ADDRSTRLEN+1); + memset(tmpip, '\0', INET_ADDRSTRLEN+1); + + for(i=0;imessage = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "mac", json_mkstring(dstmac)); + json_append_member(code, "ip", json_mkstring(ip)); + json_append_member(code, "state", json_mkstring("connected")); + + json_append_member(arping->message, "message", code); + json_append_member(arping->message, "origin", json_mkstring("receiver")); + json_append_member(arping->message, "protocol", json_mkstring(arping->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(arping->id, arping->message, PROTOCOL); + } + json_delete(arping->message); + arping->message = NULL; + } + } else if(state == CONNECTED) { + state = DISCONNECTED; + + arping->message = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "mac", json_mkstring(dstmac)); + json_append_member(code, "ip", json_mkstring("0.0.0.0")); + json_append_member(code, "state", json_mkstring("disconnected")); + + json_append_member(arping->message, "message", code); + json_append_member(arping->message, "origin", json_mkstring("receiver")); + json_append_member(arping->message, "protocol", json_mkstring(arping->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(arping->id, arping->message, PROTOCOL); + } + json_delete(arping->message); + arping->message = NULL; + } + pthread_mutex_unlock(&lock); + } + } + pthread_mutex_unlock(&lock); + + array_free(&devs, nrdevs); + + threads--; + + return (void *)NULL; +} + +static struct threadqueue_t *initDev(JsonNode *jdevice) { + loop = 1; + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(arping, json); + return threads_register("arping", &thread, (void *)node, 0); +} + +static void threadGC(void) { + loop = 0; + protocol_thread_stop(arping); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(arping); +} + +static int checkValues(JsonNode *code) { + double interval = INTERVAL; + + json_find_number(code, "poll-interval", &interval); + + if((int)round(interval) < INTERVAL) { + logprintf(LOG_ERR, "arping poll-interval cannot be lower than %d", INTERVAL); + return 1; + } + + return 0; +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void arpingInit(void) { + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&lock, &attr); + + protocol_register(&arping); + protocol_set_id(arping, "arping"); + protocol_device_add(arping, "arping", "Ping network devices"); + arping->devtype = PING; + arping->hwtype = API; + arping->multipleId = 0; + arping->masterOnly = 1; + + options_add(&arping->options, 'c', "connected", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&arping->options, 'd', "disconnected", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&arping->options, 'm', "mac", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "^[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}$"); + options_add(&arping->options, 'i', "ip", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_STRING, NULL, "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"); + + options_add(&arping->options, 0, "poll-interval", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)10, "[0-9]"); + + arping->initDev=&initDev; + arping->threadGC=&threadGC; + arping->checkValues=&checkValues; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "arping"; + module->version = "2.2"; + module->reqversion = "6.0"; + module->reqcommit = "158"; +} + +void init(void) { + arpingInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/network/arping.h b/lib/ESPiLight/pilight/libs/pilight/protocols/network/arping.h new file mode 100644 index 0000000..0eb9228 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/network/arping.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_ARPING_H_ +#define _PROTOCOL_ARPING_H_ + +#include "../protocol.h" + +struct protocol_t *arping; +void arpingInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/network/ping.c b/lib/ESPiLight/pilight/libs/pilight/protocols/network/ping.c new file mode 100644 index 0000000..b07acac --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/network/ping.c @@ -0,0 +1,190 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif +#endif +#include + +#include "../../core/threads.h" +#include "../../core/pilight.h" +#include "../../core/ping.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../protocol.h" +#include "../../core/json.h" +#include "../../core/gc.h" +#include "ping.h" + +static unsigned short loop = 1; +static unsigned short threads = 0; + +static pthread_mutex_t lock; +static pthread_mutexattr_t attr; + +#define CONNECTED 1 +#define DISCONNECTED 0 + +static void *thread(void *param) { + struct protocol_threads_t *node = (struct protocol_threads_t *)param; + struct JsonNode *json = (struct JsonNode *)node->param; + struct JsonNode *jid = NULL; + struct JsonNode *jchild = NULL; + char *ip = NULL; + char *pstate = NULL; + double itmp = 0.0; + int state = 0, nrloops = 0, interval = 1; + + threads++; + + if((jid = json_find_member(json, "id"))) { + jchild = json_first_child(jid); + while(jchild) { + if(json_find_string(jchild, "ip", &ip) == 0) { + break; + } + jchild = jchild->next; + } + } + + if(json_find_number(json, "poll-interval", &itmp) == 0) + interval = (int)round(itmp); + + if(json_find_string(json, "state", &pstate) == 0) { + if(strcmp(pstate,"connected") == 0) state = CONNECTED; + if(strcmp(pstate,"disconnected") == 0) state = DISCONNECTED; + } + + while(loop) { + if(protocol_thread_wait(node, interval, &nrloops) == ETIMEDOUT) { + pthread_mutex_lock(&lock); + if(ping(ip) == 0) { + if(state == DISCONNECTED) { + state = CONNECTED; + pping->message = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "ip", json_mkstring(ip)); + json_append_member(code, "state", json_mkstring("connected")); + + json_append_member(pping->message, "message", code); + json_append_member(pping->message, "origin", json_mkstring("receiver")); + json_append_member(pping->message, "protocol", json_mkstring(pping->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(pping->id, pping->message, PROTOCOL); + } + json_delete(pping->message); + pping->message = NULL; + } + } else if(state == CONNECTED) { + state = DISCONNECTED; + + pping->message = json_mkobject(); + JsonNode *code = json_mkobject(); + json_append_member(code, "ip", json_mkstring(ip)); + json_append_member(code, "state", json_mkstring("disconnected")); + + json_append_member(pping->message, "message", code); + json_append_member(pping->message, "origin", json_mkstring("receiver")); + json_append_member(pping->message, "protocol", json_mkstring(pping->id)); + + if(pilight.broadcast != NULL) { + pilight.broadcast(pping->id, pping->message, PROTOCOL); + } + json_delete(pping->message); + pping->message = NULL; + } + pthread_mutex_unlock(&lock); + } + } + pthread_mutex_unlock(&lock); + + threads--; + return (void *)NULL; +} + +static struct threadqueue_t *initDev(JsonNode *jdevice) { + loop = 1; + char *output = json_stringify(jdevice, NULL); + JsonNode *json = json_decode(output); + json_free(output); + + struct protocol_threads_t *node = protocol_thread_init(pping, json); + return threads_register("ping", &thread, (void *)node, 0); +} + +static void threadGC(void) { + loop = 0; + protocol_thread_stop(pping); + while(threads > 0) { + usleep(10); + } + protocol_thread_free(pping); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void pingInit(void) { + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&lock, &attr); + + protocol_register(&pping); + protocol_set_id(pping, "ping"); + protocol_device_add(pping, "ping", "Ping network devices"); + pping->devtype = PING; + pping->hwtype = API; + pping->multipleId = 0; + pping->masterOnly = 1; + + options_add(&pping->options, 'c', "connected", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&pping->options, 'd', "disconnected", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&pping->options, 'i', "ip", OPTION_HAS_VALUE, DEVICES_ID, JSON_STRING, NULL, "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"); + + options_add(&pping->options, 0, "poll-interval", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)10, "[0-9]"); + + pping->initDev=&initDev; + pping->threadGC=&threadGC; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "ping"; + module->version = "2.0"; + module->reqversion = "6.0"; + module->reqcommit = "84"; +} + +void init(void) { + pingInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/network/ping.h b/lib/ESPiLight/pilight/libs/pilight/protocols/network/ping.h new file mode 100644 index 0000000..7aa4058 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/network/ping.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_PING_H_ +#define _PROTOCOL_PING_H_ + +#include "../protocol.h" + +struct protocol_t *pping; +void pingInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/network/protocol_header.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/network/protocol_header.h.in new file mode 100644 index 0000000..da97564 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/network/protocol_header.h.in @@ -0,0 +1 @@ +@PROTOCOL_HEADERS@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/network/protocol_init.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/network/protocol_init.h.in new file mode 100644 index 0000000..40bdc9d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/network/protocol_init.h.in @@ -0,0 +1 @@ +@PROTOCOL_INIT@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/protocol.c b/lib/ESPiLight/pilight/libs/pilight/protocols/protocol.c new file mode 100644 index 0000000..fdda325 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/protocol.c @@ -0,0 +1,411 @@ +/* + Copyright (C) 2013 - 2014 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 + #ifdef __mips__ + #define __USE_UNIX98 + #endif +#endif +#include + +#include "../core/pilight.h" +#include "../core/common.h" +#include "../core/dso.h" +#include "../core/options.h" +#include "../core/log.h" + +#include "../config/settings.h" + +#include "protocol.h" +#include "protocol_header.h" + +struct protocols_t *protocols; + +#ifndef _WIN32 +void protocol_remove(char *name) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct protocols_t *currP, *prevP; + + prevP = NULL; + + for(currP = protocols; currP != NULL; prevP = currP, currP = currP->next) { + + if(strcmp(currP->listener->id, name) == 0) { + if(prevP == NULL) { + protocols = currP->next; + } else { + prevP->next = currP->next; + } + + struct protocol_devices_t *dtmp; + logprintf(LOG_DEBUG, "removed protocol %s", currP->listener->id); + if(currP->listener->threadGC) { + currP->listener->threadGC(); + logprintf(LOG_DEBUG, "stopped protocol threads"); + } + if(currP->listener->gc) { + currP->listener->gc(); + logprintf(LOG_DEBUG, "ran garbage collector"); + } + FREE(currP->listener->id); + options_delete(currP->listener->options); + if(currP->listener->devices) { + while(currP->listener->devices) { + dtmp = currP->listener->devices; + FREE(dtmp->id); + FREE(dtmp->desc); + currP->listener->devices = currP->listener->devices->next; + FREE(dtmp); + } + } + FREE(currP->listener->devices); + FREE(currP->listener); + FREE(currP); + + break; + } + } +} +#endif + +void protocol_init(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + #include "protocol_init.h" + +#ifndef _WIN32 + void *handle = NULL; + void (*init)(void); + void (*compatibility)(struct module_t *module); + char path[PATH_MAX]; + struct module_t module; + char pilight_version[strlen(PILIGHT_VERSION)+1]; + char pilight_commit[3]; + char *protocol_root = NULL; + int check1 = 0, check2 = 0, valid = 1, protocol_root_free = 0; + strcpy(pilight_version, PILIGHT_VERSION); + + struct dirent *file = NULL; + DIR *d = NULL; + struct stat s; + + memset(pilight_commit, '\0', 3); + + if(settings_find_string("protocol-root", &protocol_root) != 0) { + /* If no protocol root was set, use the default protocol root */ + if((protocol_root = MALLOC(strlen(PROTOCOL_ROOT)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(protocol_root, PROTOCOL_ROOT); + protocol_root_free = 1; + } + size_t len = strlen(protocol_root); + if(protocol_root[len-1] != '/') { + strcat(protocol_root, "/"); + } + + if((d = opendir(protocol_root))) { + while((file = readdir(d)) != NULL) { + memset(path, '\0', PATH_MAX); + sprintf(path, "%s%s", protocol_root, file->d_name); + if(stat(path, &s) == 0) { + /* Check if file */ + if(S_ISREG(s.st_mode)) { + if(strstr(file->d_name, ".so") != NULL) { + valid = 1; + if((handle = dso_load(path)) != NULL) { + + init = dso_function(handle, "init"); + compatibility = dso_function(handle, "compatibility"); + if(init != NULL && compatibility != NULL) { + compatibility(&module); + if(module.name != NULL && module.version != NULL && module.reqversion != NULL) { + char ver[strlen(module.reqversion)+1]; + strcpy(ver, module.reqversion); + + if((check1 = vercmp(ver, pilight_version)) > 0) { + valid = 0; + } + + if(check1 == 0 && module.reqcommit != NULL) { + char com[strlen(module.reqcommit)+1]; + strcpy(com, module.reqcommit); + sscanf(HASH, "v%*[0-9].%*[0-9]-%[0-9]-%*[0-9a-zA-Z\n\r]", pilight_commit); + + if(strlen(pilight_commit) > 0 && (check2 = vercmp(com, pilight_commit)) > 0) { + valid = 0; + } + } + if(valid == 1) { + char tmp[strlen(module.name)+1]; + strcpy(tmp, module.name); + protocol_remove(tmp); + init(); + logprintf(LOG_DEBUG, "loaded protocol %s v%s", file->d_name, module.version); + } else { + if(module.reqcommit != NULL) { + logprintf(LOG_ERR, "protocol %s requires at least pilight v%s (commit %s)", file->d_name, module.reqversion, module.reqcommit); + } else { + logprintf(LOG_ERR, "protocol %s requires at least pilight v%s", file->d_name, module.reqversion); + } + } + } else { + logprintf(LOG_ERR, "invalid module %s", file->d_name); + } + } + } + } + } + } else { + perror("stat"); + } + } + closedir(d); + } + if(protocol_root_free) { + FREE(protocol_root); + } +#endif +} + +void protocol_register(protocol_t **proto) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if((*proto = MALLOC(sizeof(struct protocol_t))) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + (*proto)->options = NULL; + (*proto)->devices = NULL; + + (*proto)->rawlen = 0; + (*proto)->minrawlen = 0; + (*proto)->maxrawlen = 0; + (*proto)->mingaplen = 0; + (*proto)->maxgaplen = 0; + (*proto)->txrpt = 10; + (*proto)->rxrpt = 1; + (*proto)->hwtype = NONE; + (*proto)->multipleId = 1; + (*proto)->config = 1; + (*proto)->masterOnly = 0; + (*proto)->parseCode = NULL; + (*proto)->parseCommand = NULL; + (*proto)->createCode = NULL; + (*proto)->checkValues = NULL; + (*proto)->initDev = NULL; + (*proto)->printHelp = NULL; + (*proto)->threadGC = NULL; + (*proto)->gc = NULL; + (*proto)->message = NULL; + (*proto)->threads = NULL; + + (*proto)->repeats = 0; + (*proto)->first = 0; + (*proto)->second = 0; + + (*proto)->raw = NULL; + + struct protocols_t *pnode = MALLOC(sizeof(struct protocols_t)); + if(pnode == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + pnode->listener = *proto; + pnode->next = protocols; + protocols = pnode; +} + +struct protocol_threads_t *protocol_thread_init(protocol_t *proto, struct JsonNode *param) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct protocol_threads_t *node = MALLOC(sizeof(struct protocol_threads_t)); + if(node == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + + node->param = param; + pthread_mutexattr_init(&node->attr); + pthread_mutexattr_settype(&node->attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&node->mutex, &node->attr); + pthread_cond_init(&node->cond, NULL); + node->next = proto->threads; + proto->threads = node; + + return node; +} + +int protocol_thread_wait(struct protocol_threads_t *node, int interval, int *nrloops) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct timeval tp; + struct timespec ts; + + pthread_mutex_unlock(&node->mutex); + + gettimeofday(&tp, NULL); + ts.tv_sec = tp.tv_sec; + ts.tv_nsec = tp.tv_usec * 1000; + + if(*nrloops == 0) { + ts.tv_sec += 1; + *nrloops = 1; + } else { + ts.tv_sec += interval; + } + + pthread_mutex_lock(&node->mutex); + + return pthread_cond_timedwait(&node->cond, &node->mutex, &ts); +} + +void protocol_thread_stop(protocol_t *proto) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(proto != NULL && proto->threads != NULL ) { + struct protocol_threads_t *tmp = proto->threads; + while(tmp) { + pthread_mutex_unlock(&tmp->mutex); + pthread_cond_signal(&tmp->cond); + tmp = tmp->next; + } + } +} + +void protocol_thread_free(protocol_t *proto) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if(proto != NULL && proto->threads != NULL) { + struct protocol_threads_t *tmp; + while(proto->threads) { + tmp = proto->threads; + if(proto->threads->param != NULL) { + json_delete(proto->threads->param); + } + proto->threads = proto->threads->next; + FREE(tmp); + } + if(proto->threads != NULL) { + FREE(proto->threads); + } + } +} + +void protocol_set_id(protocol_t *proto, const char *id) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + if((proto->id = MALLOC(strlen(id)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(proto->id, id); +} + +void protocol_device_add(protocol_t *proto, const char *id, const char *desc) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct protocol_devices_t *dnode = MALLOC(sizeof(struct protocol_devices_t)); + if(dnode == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + if((dnode->id = MALLOC(strlen(id)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(dnode->id, id); + if((dnode->desc = MALLOC(strlen(desc)+1)) == NULL) { + fprintf(stderr, "out of memory\n"); + exit(EXIT_FAILURE); + } + strcpy(dnode->desc, desc); + dnode->next = proto->devices; + proto->devices = dnode; +} + +int protocol_device_exists(protocol_t *proto, const char *id) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct protocol_devices_t *temp = proto->devices; + + while(temp) { + if(strcmp(temp->id, id) == 0) { + return 0; + } + temp = temp->next; + } + if(temp != NULL) { + FREE(temp); + } + + return 1; +} + +int protocol_gc(void) { + logprintf(LOG_STACK, "%s(...)", __FUNCTION__); + + struct protocols_t *ptmp; + struct protocol_devices_t *dtmp; + + while(protocols) { + ptmp = protocols; + logprintf(LOG_DEBUG, "protocol %s", ptmp->listener->id); + if(ptmp->listener->threadGC != NULL) { + ptmp->listener->threadGC(); + logprintf(LOG_DEBUG, "stopped protocol threads"); + } + if(ptmp->listener->gc) { + ptmp->listener->gc(); + logprintf(LOG_DEBUG, "ran garbage collector"); + } + FREE(ptmp->listener->id); + options_delete(ptmp->listener->options); + if(ptmp->listener->devices) { + while(ptmp->listener->devices) { + dtmp = ptmp->listener->devices; + FREE(dtmp->id); + FREE(dtmp->desc); + ptmp->listener->devices = ptmp->listener->devices->next; + if(dtmp != NULL) { + FREE(dtmp); + } + } + } + if(ptmp->listener->devices != NULL) { + FREE(ptmp->listener->devices); + } + FREE(ptmp->listener); + protocols = protocols->next; + FREE(ptmp); + } + if(protocols != NULL) { + FREE(protocols); + } + + logprintf(LOG_DEBUG, "garbage collected protocol library"); + return EXIT_SUCCESS; +} diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/protocol.h b/lib/ESPiLight/pilight/libs/pilight/protocols/protocol.h new file mode 100644 index 0000000..511bffb --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/protocol.h @@ -0,0 +1,134 @@ +/* + Copyright (C) 2013 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_H_ +#define _PROTOCOL_H_ + +#ifndef _WIN32 + #ifdef __mips__ + #ifndef __USE_UNIX98 + #define __USE_UNIX98 + #endif + #endif +#endif +#include + +#include "defines.h" +#include "../core/options.h" +#include "../core/threads.h" +#include "../core/json.h" + +#include "../config/devices.h" +#include "../config/hardware.h" + +typedef enum { + FIRMWARE = -2, + PROCESS = -1, + RAW = 0, + SWITCH, + DIMMER, + WEATHER, + RELAY, + SCREEN, + CONTACT, + PENDINGSW, + DATETIME, + XBMC, + LIRC, + WEBCAM, + MOTION, + DUSK, + PING, + LABEL, + ALARM +} devtype_t; + +typedef struct protocol_devices_t { + char *id; + char *desc; + struct protocol_devices_t *next; +} protocol_devices_t; + +typedef struct protocol_threads_t { + pthread_mutex_t mutex; + pthread_cond_t cond; + pthread_mutexattr_t attr; + JsonNode *param; + struct protocol_threads_t *next; +} protocol_threads_t; + +typedef struct protocol_t { + char *id; + int rawlen; + int minrawlen; + int maxrawlen; + int mingaplen; + int maxgaplen; + short txrpt; + short rxrpt; + short multipleId; + short config; + short masterOnly; + struct options_t *options; + struct JsonNode *message; + + int repeats; + unsigned long first; + unsigned long second; + + int *raw; + + hwtype_t hwtype; + devtype_t devtype; + struct protocol_devices_t *devices; + struct protocol_threads_t *threads; + + union { + void (*parseCode)(void); + void (*parseCommand)(struct JsonNode *code); + }; + int (*validate)(void); + int (*createCode)(JsonNode *code); + int (*checkValues)(JsonNode *code); + struct threadqueue_t *(*initDev)(JsonNode *device); + void (*printHelp)(void); + void (*gc)(void); + void (*threadGC)(void); +} protocol_t; + +typedef struct protocols_t { + struct protocol_t *listener; + char *name; + struct protocols_t *next; +} protocols_; + +extern struct protocols_t *protocols; + +void protocol_init(void); +struct protocol_threads_t *protocol_thread_init(protocol_t *proto, struct JsonNode *param); +int protocol_thread_wait(struct protocol_threads_t *node, int interval, int *nrloops); +void protocol_thread_free(protocol_t *proto); +void protocol_thread_stop(protocol_t *proto); +void protocol_set_id(protocol_t *proto, const char *id); +void protocol_plslen_add(protocol_t *proto, int plslen); +void protocol_register(protocol_t **proto); +void protocol_device_add(protocol_t *proto, const char *id, const char *desc); +int protocol_device_exists(protocol_t *proto, const char *id); +int protocol_gc(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/protocol_header.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/protocol_header.h.in new file mode 100644 index 0000000..3740f78 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/protocol_header.h.in @@ -0,0 +1,6 @@ +#ifndef PROTOCOL_HEADERS +#define PROTOCOL_HEADERS + +@PROTOCOL_HEADERS@ + +#endif \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/protocol_init.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/protocol_init.h.in new file mode 100644 index 0000000..2c2fa69 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/protocol_init.h.in @@ -0,0 +1,6 @@ +#ifndef PROTOCOL_INIT +#define PROTOCOL_INIT + +@PROTOCOL_INIT@ + +#endif \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/CMakeExclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/CMakeExclude.txt new file mode 100644 index 0000000..e69de29 diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/CMakeInclude.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/CMakeInclude.txt new file mode 100644 index 0000000..496cba9 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/CMakeInclude.txt @@ -0,0 +1,30 @@ +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/protocol_init.h") +list(REMOVE_ITEM ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/protocol_header.h") + +set(headers) +foreach(header ${${PROJECT_NAME}_headers}) + string(REPLACE "${PROJECT_SOURCE_DIR}/" " #include \"" header1 ${header}) + string(REPLACE ".h" ".h\"!" header2 ${header1}) + list(APPEND headers ${header2}) +endforeach(header) + +string(REPLACE "!" "\n" header4 ${headers}) +set(PROTOCOL_HEADERS ${header4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_header.h.in ${PROJECT_SOURCE_DIR}/protocol_header.h) + +execute_process( +COMMAND grep -h "void .*Init(void)" ${${PROJECT_NAME}_sources} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + RESULT_VARIABLE protocol_result + OUTPUT_VARIABLE protocol_init) + +set(inits) +foreach(init ${protocol_init}) + string(REPLACE "void " " " init1 ${init}) + string(REPLACE "(void) {" "()!" init2 ${init1}) + list(APPEND inits ${init2}) +endforeach(init) + +string(REPLACE "!" ";" init4 ${inits}) +set(PROTOCOL_INIT ${init4}) +configure_file(${PROJECT_SOURCE_DIR}/protocol_init.h.in ${PROJECT_SOURCE_DIR}/protocol_init.h) diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/CMakeLists.txt b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/CMakeLists.txt new file mode 100644 index 0000000..9cc403f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/CMakeLists.txt @@ -0,0 +1,9 @@ +project(pilight_protocols_zwave) + +file(GLOB ${PROJECT_NAME}_sources "${PROJECT_SOURCE_DIR}/*.c") +file(GLOB ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/*.h") + +include(CMakeExclude.txt) +include(CMakeInclude.txt) + +set(${PROJECT_NAME}_files ${${PROJECT_NAME}_sources} ${${PROJECT_NAME}_headers} CACHE INTERNAL "") diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/protocol_header.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/protocol_header.h.in new file mode 100644 index 0000000..da97564 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/protocol_header.h.in @@ -0,0 +1 @@ +@PROTOCOL_HEADERS@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/protocol_init.h.in b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/protocol_init.h.in new file mode 100644 index 0000000..40bdc9d --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/protocol_init.h.in @@ -0,0 +1 @@ +@PROTOCOL_INIT@ \ No newline at end of file diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_ctrl.c b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_ctrl.c new file mode 100644 index 0000000..37a23ca --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_ctrl.c @@ -0,0 +1,168 @@ +/* + Copyright (C) 2015 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +# +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../../hardware/zwave.h" +#include "../protocol.h" +#include "zwave_ctrl.h" + +static void createCommandMessage(int state) { + zwave_ctrl->message = json_mkobject(); + if(state == 1) { + json_append_member(zwave_ctrl->message, "command", json_mkstring("inclusion")); + } else if(state == 0) { + json_append_member(zwave_ctrl->message, "command", json_mkstring("exclusion")); + } else if(state == 2) { + json_append_member(zwave_ctrl->message, "command", json_mkstring("stop")); + } else if(state == 3) { + json_append_member(zwave_ctrl->message, "command", json_mkstring("soft-reset")); + } +} + +static void createParameterMessage(int nodeid, int parameter, int value) { + zwave_ctrl->message = json_mkobject(); + json_append_member(zwave_ctrl->message, "nodeid", json_mknumber(nodeid, 0)); + json_append_member(zwave_ctrl->message, "parameter", json_mknumber(parameter, 0)); + if(value >= 0) { + json_append_member(zwave_ctrl->message, "value", json_mknumber(value, 0)); + } +} + +static int createCode(struct JsonNode *code) { + printf("%s\n", json_stringify(code, "\t")); + int state = -1; + int parameter = -1; + int value = -1; + int nodeid = -1; + double itmp = 0.0; + + if(json_find_number(code, "inclusion", &itmp) == 0) + state=1; + else if(json_find_number(code, "exclusion", &itmp) == 0) + state=0; + else if(json_find_number(code, "stop", &itmp) == 0) + state=2; + else if(json_find_number(code, "soft-reset", &itmp) == 0) + state=3; + + if(json_find_number(code, "parameter", &itmp) == 0) + parameter = (int)itmp; + if(json_find_number(code, "nodeid", &itmp) == 0) + nodeid = (int)itmp; + if(json_find_number(code, "value", &itmp) == 0) + value = (int)itmp; + + if(parameter >= 0 && nodeid == -1) { + logprintf(LOG_ERR, "zwave_ctrl: parameter needs a nodeid"); + return EXIT_FAILURE; + } + if(nodeid >= 0 && parameter == -1) { + logprintf(LOG_ERR, "zwave_ctrl: nodeid needs a parameter"); + return EXIT_FAILURE; + } + if(value >= 0 && (parameter == -1 || nodeid == -1)) { + logprintf(LOG_ERR, "zwave_ctrl: value needs a parameter and nodeid"); + return EXIT_FAILURE; + } + if(state > -1 && (parameter > -1 || nodeid > -1)) { + logprintf(LOG_ERR, "zwave_ctrl: state and parameter and node cannot be combined"); + return EXIT_FAILURE; + } + + if(strstr(progname, "daemon") != NULL) { + if(parameter >= 0 && nodeid >= 0) { + if(value >= 0) { + int x = snprintf(NULL, 0, "%d", value); + zwaveSetConfigParam(nodeid, parameter, value, x); + } else { + zwaveGetConfigParam(nodeid, parameter); + } + } + if(state == 1) { + zwaveStartInclusion(); + } else if(state == 0) { + zwaveStartExclusion(); + } else if(state == 2) { + zwaveStopCommand(); + } else if(state == 3) { + zwaveSoftReset(); + } + } + if(parameter >= 0 && nodeid >= 0) { + createParameterMessage(nodeid, parameter, value); + } else if(state > 0) { + createCommandMessage(state); + } + + return EXIT_SUCCESS; +} + +static void printHelp(void) { + printf("\t -i --inclusion\t\t\tsend an inclusion command\n"); + printf("\t -e --exclusion\t\t\tsend an exclusion command\n"); + printf("\t -s --stop\t\t\tstop previous command\n"); + printf("\t -r --soft-reset\t\tsend a soft-reset command\n"); + printf("\t -c --parameter\t\tset or retrieve parameter\n"); + printf("\t -v --value=X\t\tset parameter to this value\n"); + printf("\t -n --nodeid=X\t\tset parameter to this value\n"); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void zwaveCtrlInit(void) { + + protocol_register(&zwave_ctrl); + protocol_set_id(zwave_ctrl, "zwave_ctrl"); + protocol_device_add(zwave_ctrl, "zwave_ctrl", "Z-Wave Controller"); + zwave_ctrl->devtype = SWITCH; + zwave_ctrl->hwtype = ZWAVE; + zwave_ctrl->config = 0; + + options_add(&zwave_ctrl->options, 'i', "inclusion", OPTION_NO_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&zwave_ctrl->options, 'e', "exclusion", OPTION_NO_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&zwave_ctrl->options, 's', "stop", OPTION_NO_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&zwave_ctrl->options, 'r', "soft-reset", OPTION_NO_VALUE, DEVICES_VALUE, JSON_STRING, NULL, NULL); + options_add(&zwave_ctrl->options, 'c', "parameter", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + options_add(&zwave_ctrl->options, 'v', "value", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + options_add(&zwave_ctrl->options, 'n', "nodeid", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + + zwave_ctrl->createCode=&createCode; + zwave_ctrl->printHelp=&printHelp; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "zwave_ctrl"; + module->version = "1.0"; + module->reqversion = "7.0"; + module->reqcommit = "10"; +} + +void init(void) { + zwaveCtrlInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_ctrl.h b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_ctrl.h new file mode 100644 index 0000000..eb58721 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_ctrl.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2015 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_ZWAVE_CTRL_H_ +#define _PROTOCOL_ZWAVE_CTRL_H_ + +#include "../protocol.h" + +struct protocol_t *zwave_ctrl; +void zwaveCtrlInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_dimmer.c b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_dimmer.c new file mode 100644 index 0000000..f2b4010 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_dimmer.c @@ -0,0 +1,175 @@ +/* + Copyright (C) 2015 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +# +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../../hardware/zwave.h" +#include "../protocol.h" +#include "zwave_dimmer.h" + +static void createDimMessage(unsigned int homeId, int nodeId, int dimlevel) { + zwave_dimmer->message = json_mkobject(); + json_append_member(zwave_dimmer->message, "homeId", json_mknumber(homeId, 0)); + json_append_member(zwave_dimmer->message, "nodeId", json_mknumber(nodeId, 0)); + if(dimlevel > 0) { + json_append_member(zwave_dimmer->message, "state", json_mkstring("on")); + } else { + json_append_member(zwave_dimmer->message, "state", json_mkstring("off")); + } + json_append_member(zwave_dimmer->message, "dimlevel", json_mknumber(dimlevel, 0)); +} + +static void createConfigMessage(unsigned int homeId, int nodeId, char *label, int value) { + zwave_dimmer->message = json_mkobject(); + json_append_member(zwave_dimmer->message, "homeId", json_mknumber(homeId, 0)); + json_append_member(zwave_dimmer->message, "nodeId", json_mknumber(nodeId, 0)); + json_append_member(zwave_dimmer->message, "label", json_mkstring(label)); + json_append_member(zwave_dimmer->message, "value", json_mknumber(value, 0)); +} + +static void parseCommand(struct JsonNode *code) { + struct JsonNode *message = NULL; + char *label = NULL; + double itmp = 0.0; + int nodeId = 0, value = 0, cmdId = 0; + unsigned int homeId = 0; + + if((message = json_find_member(code, "message")) != NULL) { + if(json_find_number(message, "nodeId", &itmp) == 0) { + nodeId = (int)round(itmp); + } else { + return; + } + if(json_find_number(message, "homeId", &itmp) == 0) { + homeId = (unsigned int)round(itmp); + } else { + return; + } + if(json_find_number(message, "cmdId", &itmp) == 0) { + cmdId = (int)round(itmp); + } else { + return; + } + if(json_find_number(message, "value", &itmp) == 0) { + value = (int)round(itmp); + } else { + return; + } + json_find_string(message, "label", &label); + } + + if(cmdId == COMMAND_CLASS_SWITCH_MULTILEVEL) { + createDimMessage(homeId, nodeId, value); + } + if(cmdId == COMMAND_CLASS_CONFIGURATION && label != NULL) { + createConfigMessage(homeId, nodeId, label, value); + } +} + +static int createCode(struct JsonNode *code) { + char out[255]; + unsigned int homeId = 0; + int nodeId = 0; + int dimlevel = -1; + char state = 0; + double itmp = 0.0; + + if(json_find_number(code, "homeId", &itmp) == 0) + homeId = (unsigned int)round(itmp); + if(json_find_number(code, "nodeId", &itmp) == 0) + nodeId = (int)round(itmp); + if(json_find_number(code, "dimlevel", &itmp) == 0) + dimlevel = (int)round(itmp); + + if(json_find_number(code, "off", &itmp) == 0) + state=0; + else if(json_find_number(code, "on", &itmp) == 0) + state=1; + + if(dimlevel > -1) { + state = 1; + if(dimlevel > 100) { + dimlevel = 99; + } + } else if(state == 0) { + dimlevel = 0; + } else if(state == 1) { + dimlevel = 255; + } + + if(dimlevel > -1) { + snprintf(out, 255, "%d", dimlevel); + zwaveSetValue(nodeId, COMMAND_CLASS_SWITCH_MULTILEVEL, "Level", out); + createDimMessage(homeId, nodeId, dimlevel); + } + + return EXIT_SUCCESS; +} + +static void printHelp(void) { + printf("\t -t --on\t\t\tsend an on signal\n"); + printf("\t -f --off\t\t\tsend an off signal\n"); + printf("\t -h --homeid=id\t\t\tcontrol a device with this home id\n"); + printf("\t -i --unitid=id\t\t\tcontrol a device with this unit id\n"); + printf("\t -d --dimlevel=dimlevel\t\tsend a specific dimlevel\n"); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void zwaveDimmerInit(void) { + + protocol_register(&zwave_dimmer); + protocol_set_id(zwave_dimmer, "zwave_dimmer"); + protocol_device_add(zwave_dimmer, "zwave_dimmer", "Z-Wave Dimmers"); + zwave_dimmer->devtype = DIMMER; + zwave_dimmer->hwtype = ZWAVE; + + options_add(&zwave_dimmer->options, 'h', "homeId", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, NULL); + options_add(&zwave_dimmer->options, 'i', "nodeId", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, NULL); + options_add(&zwave_dimmer->options, 't', "on", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&zwave_dimmer->options, 'f', "off", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&zwave_dimmer->options, 'd', "dimlevel", OPTION_HAS_VALUE, DEVICES_VALUE, JSON_NUMBER, NULL, NULL); + + options_add(&zwave_dimmer->options, 0, "dimlevel-minimum", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)0, NULL); + options_add(&zwave_dimmer->options, 0, "dimlevel-maximum", OPTION_HAS_VALUE, DEVICES_SETTING, JSON_NUMBER, (void *)99, NULL); + + zwave_dimmer->createCode=&createCode; + zwave_dimmer->parseCommand=&parseCommand; + zwave_dimmer->printHelp=&printHelp; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "zwave_dimmer"; + module->version = "1.0"; + module->reqversion = "7.0"; + module->reqcommit = "10"; +} + +void init(void) { + zwaveDimmerInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_dimmer.h b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_dimmer.h new file mode 100644 index 0000000..455623f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_dimmer.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2015 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_ZWAVE_DIMMER_H_ +#define _PROTOCOL_ZWAVE_DIMMER_H_ + +#include "../protocol.h" + +struct protocol_t *zwave_dimmer; +void zwaveDimmerInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_switch.c b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_switch.c new file mode 100644 index 0000000..726ddb0 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_switch.c @@ -0,0 +1,155 @@ +/* + Copyright (C) 2015 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#include +#include +#include +#include +# +#include "../../core/pilight.h" +#include "../../core/common.h" +#include "../../core/dso.h" +#include "../../core/log.h" +#include "../../hardware/zwave.h" +#include "../protocol.h" +#include "zwave_switch.h" + +static void createStateMessage(unsigned int homeId, int nodeId, int state) { + zwave_switch->message = json_mkobject(); + json_append_member(zwave_switch->message, "homeId", json_mknumber(homeId, 0)); + json_append_member(zwave_switch->message, "nodeId", json_mknumber(nodeId, 0)); + if(state == 1) { + json_append_member(zwave_switch->message, "state", json_mkstring("on")); + } else { + json_append_member(zwave_switch->message, "state", json_mkstring("off")); + } +} + +static void createConfigMessage(unsigned int homeId, int nodeId, char *label, int value) { + zwave_switch->message = json_mkobject(); + json_append_member(zwave_switch->message, "homeId", json_mknumber(homeId, 0)); + json_append_member(zwave_switch->message, "nodeId", json_mknumber(nodeId, 0)); + json_append_member(zwave_switch->message, "label", json_mkstring(label)); + json_append_member(zwave_switch->message, "value", json_mknumber(value, 0)); +} + +static void parseCommand(struct JsonNode *code) { + struct JsonNode *message = NULL; + char *label = NULL; + double itmp = 0.0; + int nodeId = 0, value = 0, cmdId = 0; + unsigned int homeId = 0; + + if((message = json_find_member(code, "message")) != NULL) { + if(json_find_number(message, "nodeId", &itmp) == 0) { + nodeId = (int)round(itmp); + } else { + return; + } + if(json_find_number(message, "homeId", &itmp) == 0) { + homeId = (unsigned int)round(itmp); + } else { + return; + } + if(json_find_number(message, "cmdId", &itmp) == 0) { + cmdId = (int)round(itmp); + } else { + return; + } + if(json_find_number(message, "value", &itmp) == 0) { + value = (int)round(itmp); + } else { + return; + } + json_find_string(message, "label", &label); + } + if(cmdId == COMMAND_CLASS_SWITCH_BINARY) { + createStateMessage(homeId, nodeId, value); + } + if(cmdId == COMMAND_CLASS_CONFIGURATION && label != NULL) { + createConfigMessage(homeId, nodeId, label, value); + } +} + +static int createCode(struct JsonNode *code) { + unsigned int homeId = 0; + int nodeId = 0; + char state = 0; + double itmp = 0.0; + + if(json_find_number(code, "homeId", &itmp) == 0) + homeId = (unsigned int)round(itmp); + if(json_find_number(code, "nodeId", &itmp) == 0) + nodeId = (int)round(itmp); + + if(json_find_number(code, "off", &itmp) == 0) + state=0; + else if(json_find_number(code, "on", &itmp) == 0) + state=1; + + if(state == 0) { + zwaveSetValue(nodeId, COMMAND_CLASS_SWITCH_BINARY, NULL, "false"); + } else { + zwaveSetValue(nodeId, COMMAND_CLASS_SWITCH_BINARY, NULL, "true"); + } + + createStateMessage(homeId, nodeId, state); + + return EXIT_SUCCESS; +} + +static void printHelp(void) { + printf("\t -t --on\t\t\tsend an on signal\n"); + printf("\t -f --off\t\t\tsend an off signal\n"); + printf("\t -h --homeid=id\t\t\tcontrol a device with this home id\n"); + printf("\t -i --unitid=id\t\t\tcontrol a device with this unit id\n"); +} + +#if !defined(MODULE) && !defined(_WIN32) +__attribute__((weak)) +#endif +void zwaveSwitchInit(void) { + + protocol_register(&zwave_switch); + protocol_set_id(zwave_switch, "zwave_switch"); + protocol_device_add(zwave_switch, "zwave_switch", "Z-Wave Switches"); + zwave_switch->devtype = SWITCH; + zwave_switch->hwtype = ZWAVE; + + options_add(&zwave_switch->options, 'h', "homeId", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, NULL); + options_add(&zwave_switch->options, 'i', "nodeId", OPTION_HAS_VALUE, DEVICES_ID, JSON_NUMBER, NULL, NULL); + options_add(&zwave_switch->options, 't', "on", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + options_add(&zwave_switch->options, 'f', "off", OPTION_NO_VALUE, DEVICES_STATE, JSON_STRING, NULL, NULL); + + zwave_switch->createCode=&createCode; + zwave_switch->parseCommand=&parseCommand; + zwave_switch->printHelp=&printHelp; +} + +#if defined(MODULE) && !defined(_WIN32) +void compatibility(struct module_t *module) { + module->name = "zwave_switch"; + module->version = "1.0"; + module->reqversion = "7.0"; + module->reqcommit = "10"; +} + +void init(void) { + zwaveSwitchInit(); +} +#endif diff --git a/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_switch.h b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_switch.h new file mode 100644 index 0000000..9c1ef46 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/pilight/protocols/zwave/zwave_switch.h @@ -0,0 +1,27 @@ +/* + Copyright (C) 2015 CurlyMo + + This file is part of pilight. + + pilight is free software: you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation, either version 3 of the License, or (at your option) any later + version. + + pilight is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pilight. If not, see +*/ + +#ifndef _PROTOCOL_ZWAVE_SWITCH_H_ +#define _PROTOCOL_ZWAVE_SWITCH_H_ + +#include "../protocol.h" + +struct protocol_t *zwave_switch; +void zwaveSwitchInit(void); + +#endif diff --git a/lib/ESPiLight/pilight/libs/webgui/ajax-loader.gif b/lib/ESPiLight/pilight/libs/webgui/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef4243add0be5be3c7ccde4d671bcde18d165f3c GIT binary patch literal 4782 zcma*rdsI_bz6bD~lLyI3LLR(AfHVmqBmp8JiAFrsJjp{$Lr5SZYEVH$RD9G@Yj49z z2nmKXL{R8}<)uZT7O8Eu?RbM=K})C5T5Eed9i`f9AJd`Uu9^0(-kF=;`~Num&%MrB zYoE{WcfR}VV>Fkl*4Ac%Oz>9#KL7j<0N{fU7Oq}>cVM7@|Neck*wtV#aQN^cr_;Hx zaPzg-UVZh|@tK+F)vH(EzJ05%Zs*30Wm8j=Teof*8#`N7RascL3PoFQ-kh(lu72yS zH;x|YAF(^YibuwfS0F zo_YD@)3vqkJ9ln}!<|`KnWLj42M#n}zdrNqvn^-Oj<&b^j~scrzyGBdUU;6v;c&U! z4?q0i`R9+FI1!CR!V-xjH8r)XD>5|n^1JW8GdFiV6gqzC($vz@haZ2uw0Cb)Zf-7( zM#EyU@yD#MukY|+J`B1G^ z+t|3fr{~0}Q#~q`s;OyDPEHP=&)>0QJCR5!tdq;-3FMbN0->a&BtJhtzMlBt{ex^ZI4X1+ zo1sWrh{gOi^>?=JU|sFux}Dr-b{}rw);89*H0`h5Dc!xVem~&-f+NB4tN!o)---wl z{^0?r*VpE6546GJU}wAKiEuDym2X2i&Fk!o0&?M66fWE7K%J0t0I*UE*8}55s|q*~ zWE@Q@R_i%d>uP|Qu5=QpUfDWLf&M9b1?}>ARNC)LNKDBPf)qNzCpAGpiiqWKJ25pg zS2E}S#_%^*FfA*!sFU@#&y|ln+D-g4aa3{CQ`51cu~z{Qp7Dg*UfG(9gz@@a6aPly>MD^tVJ|UT!M(%)r<4b zjNR3T)U08u zop0{dw#JL_PnivdIP-RUIB3*)X|;(o?~}?X%1PaZx_0bfqY^9bG+=E>98m7uDFfTA z_0$QlHE|0oU!%bp%B)+$dX|?`n@V(9im-Lo^IqvoZL1iTCqqemp%2Dqp=Ja!wU=yS zq-=ww?apsZCM3AJnnCPDps78F^)SN-U*a7dR8LdPG(MXd)3#B>1&OAEmx)-~Q9!xh z^3gCJmS*hAmqdqQp1>udhZLWPY-)8?8ty| zj|2X#j|F+*AXDihHTtx;D9YT$L*=`34QN`qt{))j)jiCtEF)M|xQBHflvIr?HeNd^~a!`|p^|5N`fSFypcg~+r%v0dx=744Ay5{U)MZ?71N8Iv6 z)jGQB+T=ach(u&jXro$9*SNodl9vc)ad7N3B5Dw~da-fvzk}y^5M8%3V>m6wl z{pL;8ZvYcn=XbgDbHu0I>6R?b+OJI*;S~r4^J z!>$BCXte*JV(c)rf@7(}d7C)Mdu zC`Tr3Bj}QiEKnsA`mi+;z)m~NUDd9aDU~_M7k<;)ebtO_147a4N`%BXmERasS@_cq zz97x6&<+Ey%INTy@$5DmQ^HKmcMsm|>QL5xJJJ$2V4~WD! zLdT`J717UWH_r=T;*UAq+0pwNQ}gBMbsHw6a zIB_ZnRTdEjP)?;Dz$zXU7}t~_ z90v@lDlT~)8BYT2dP};yT}UC5*+`#XEU7Cj&Nhx4 zupKuTMx-OTw)(g#+1zcOob5YcFys2m5OnKCUI?WRfs9 zUN5t~xGF$;t?P9izO)v*wn;?(K3&KBs+Aclzg{yp~yoc};^9;Rcq`XJqELzKMzTeSWnXfp?v_wNjVa}Rp;_{C>X5$~tQ%y35;X6->wesiDyHOnqlQaK{ zX^Cz4jwiPEPjaE$7h%k<%)v!G2%N|T6tHv;8%s_&#-1p;t3S@g964g6-yflMJISMT zsMYv7SG0|lG>p+68Rl0teJ6Y@H4TYVQ<>qQiQr?C&0e8CiqhCvFOveJ1f6gI#j>e@ zmP0WBu}m2{FLtqE8kr)eRVc|}vssEdT`s-ZRrPkI>;iDY!W%x5+#ogq7NO4zT?7z0 z-*(-Pd}%N^112U;#iN|~QQS%9@h+$iw$^?rpq*isxPDegNfJFfk}*57-GGT|11?Q= zd&Gf8ToWQv0>mzn9_uTgH_TWK^$QPs0)dQ^!Q{ojt%n9qZUOs$dKb0x8+4odMH{{E zN1#G`b=hTiWHBxG*|#Z}<{7e818;31{U>%Bm*GbWV|5;Cf0EelxbIqdQ0Ak1J2KZE zZD>o(awq$~`LE?^V!;k4M)mR6B!K6t?v^aSw{grWbdU8_<)GN-!9@S`f0)tkk%Ho5 zXMo`V?}?O}HOm^qn|pPS-T$P&bu{b<2Wes-fo=ARg;7*0??D~x5Rh}I11QVT6Q}Hf z$z6(9I`P?b4pLYDmPPw2!TRA7e9L#=6y~GLHZ!^9rQIOFtaNv@B7V& z34xpevrDOze@&N9qhV|g7A|6XMQv1mSUa&KA7*rCx{FTI!FB%tqRSYF*thx@c6mB;s8>#DX*Q0U#GWj>1d- zxrH7TgJ2jh5T2657SQ=SxF=@u&F0o3aUoIEmg{3y6@F=&HmyO*z zr508h7KG`EP)kzR<3W<>jNI$`g)p|dwzg4TjZ<$Mz}ZK6TxSrfY?h0>xyX>swhZvLW0 z07CwyCy;cgrrs;{8%iMLX<|mbWEvz))dp@h1IPF6#&*PRb-B#{G~gsasn&llw+1N> zIx(-yO(Bykf#X0|s?hZ@3l>r-5;+Z*Ri%8GFo3Q#`0>bsq@0%rER+1_X<0cVD`{qI z4qXm_l;^|EWik5g?_lhK`w@;aN zY7^267Qk(512X9rSW?-Ly|JK#TI%x2qsu-78!rd~NKH`_B6ea*|VSK9BU$CCF{q024HD{6il?I6Tbv0ZNZQj*0ubky^G4`I~P-`?~e;7cZu6 zv5h8JG|{MDk69^Wb)1y->{O^KBUlr|Y`V(bU9#ar9{l zQEU!QE@#EK*@~W=MD2waP~QDKN{>B8^BRTM-cCKLASxB%_VmKZWMFDFYkE&L}gyjYm|)H6;?UFlIXZ>Lz=3w%|fA2vH)eW**3B7 zEC=X1Ed}a${vAfUJ(+M`oV*!JpByH+qR)`LzEcSk>ojGtDuPr}`wt$n3~C07Y3hXUdlp5l&(HH!+@?-I zk#P_dr@gH;NX^MM4j!-?Q(+B`9)T&9Z5ZLSwZrT0Co?=mqh!h0m_6?Dc#0GEsXL9s zhtW8C6uMY|qF8%#=D-oKDBvN%l2w99dOV_?p&oR$ z^SrX%g%gu#?A?Rfv(KXX^wX$wf`+DJS0zjBp_#bZ92r$Wc;*Zo-5^-qR$I~=*3*1$ zpc$>OtO-X)QQNl<)$Q9++p!bj$rBbV2?xA^d0dQk+jc16)?%>am}pvd<0fR*uSaUt zD$6#zXdJTztIbsspcxs4~orI#` z`-5a+t^?H)gYYfgr9i)hx? zlPB64-+GT(Rw2knA4QScB9~EEgT1>^eRc;|cL#!F$B?Z| zU^qX3hZesH^{#Go`yt-E|3A@pfQ(w6MenNvn%D@!+>OB24qK^Qnn>?F*MDBPlF)hC}sW7kg9_MC!>3h2FEBQu{99ak9N z(Tn;yf~?6b9a&8jQP0v_rq^$PFU;!dOu~jL0=8+$9OJlg*x<~xKnu_w0Vqd+nqupD zY^2LlR7W8qu3C8LAVShT+PMSaiQ~|0RAL@Il)?ejO|ZLj|Vf}BFv_yoT8-MjHR zw}G*D01Ixp7Z@jn^KZks!EX@=V9t@>gMaQ(zSk%Yd;*1@zoOaEYnl3#Oqkf*1uT_{ zqijVdqPTE+Vhn}t6z?4m;;Pqvo@O-xoK)C<_Xd>DEr#FE%j;Deu`6K*wMb;an)If1 za8|EH)VCI@hx5!Cc%}rD$7zOohPYQM<&xJ-F;r(4O{mSOcMwqTRa@kSWoz zqp@vrfS{JRoheImGy>rCNkr~ht_D32GncTIL;9}wA-8sr=JrG2C;=iU#%Uldh_SO4 zPV%*G$Kjv?yL1Lgy3@?ZVvk~1So#tAbMY)-={)jp?1y{nApFA*vJaZMqDIlHVU!|! z;snQ;qPg{0%~1qM<`o{L1K7Kti~Aj<*9{_b(^@#o*1+_=5^C;3xGAPV6BE$%hRrP? z5B+m&v?`#4PaHt>{4PXd??b1pnMusyQhS71imZubz>^c!Lny{BmCai*xb7DG<@P_=Dl($MkJ^kCUq*YTM2#IdPU^LpxpK*2Bw4502fuCt4Z@Rq*iQVYMKjHGZ6MOG9aaAbO#5m4jO8pSAXmWP)ClSzGn{%&8N3Ij(pld zHQSDfObg#Z}qYsM; zL)dcW89X^>Egl`b0kv|3!7d-S-nJa;H!a4v*M*5v1L6rnR8rPQtbTsLyT zb7FG@ubtvP-+G}|AWUEzK`+c`0r|$G@Lk4CYZjn({Z>>WUfIWk^Ej?domEJD(arby8toXMl&cjN%n- z0Vc{blh%kDB@-DeeiH4qhb>{wwEYvA`Yr-jBtTj8RQ?&=)q4oy!8qdMXG)pdQA*#6 z-trd--f@hzy$6%&>)?qlCCvv8y<`0c=&0R~Tw{BDaD>Bl2Qb$80Ss?=Kf2b1SaHKg zfg;75&Jl+sDGjjn4Wn|?d2GHWFyUxTE<}3qf}e1F##`{yTIm9^0eN*wk6oN zd=I-#s5V#<9@iwhor@cdr=6#*R9e4&ttz1Gx7P!Ko^IW`7UfI8em8 z4xUk(ls2fk%?&P-MCE$sHiC`;)MQdigL%A8U1<-WMt|j#$#Dq2uWYHp=Y5yq7-WGnWfPwPI(cXBN_?6LL{Tz}#isrl{^> zhh-6dgS%IaVB=r`FAlZi>h3E3_S)0<$#53WM`^Ou!K0`1Sld}9)%A=3%S>e@7bN>e zUASK)dxstMe}N5>SW5nDaVq;MvWNMX>ckL5-KP`iFMoDMTe{i4v`cq>qU~Nxq+Y{` z(_=E8antXmmOUJ&Pnw~Hu46d!2DC*dX|7+j02$;lo_-@r?rNlI9jT2BJU5<2bo>-U zoSoF5#Y=1ktPc-c5jAEpTa%pw!)%sxDEOG*0EQ-07|4cL&>i6UiL}+EQ&kTQH7%iS zdSz=~dMd0@&10sumDxNV8Ai=)KNIcepTamF1@AUH`)tGjRZ;)+fEDNFmS@v^r-x03 zln>EK?V9AohiN%;2ykthh?BL<0W%HhYmDb7lgPPhugTIIrlJEBd73*@7`0**+^eo8 zYflf+2AMC>wVP(ZmTab1b-cooeTBk`NH&wE%tp6jlneKT4D@*?jAc*!aWie;4CG`h zCw@#>a(hm+!?t0yiRUHmQPiClun9oAiIP3Wm`$H$dyC0P-_Av$Hm&=3MPkEuF!l7I zB;1h=KdkA?@k)uoVu4Pm#=j&Wvdl>yqE@kzipbBQlG7if9y;jH)ER|G7%6%!VeCy4 zb*{8FdS)so$EKS=!Y)IAb#y+Mq1DRBew)GiBg=qBoWe2=Vo=C)fzvNUM(D;q&HGw9XHmeF|xnlZ5!Zlt|rA2qciiI*aDh7Xe36PR?a zMM*8R?Dh5O8GFzIw9)2*T|qs4KIffo?${_JjEuKGM8HFxN13Tg4J+AKr;X~H62Y)8 z{wF4(6Hg;wOA(Lsv2BCccP@)93yat@mc>6F>_dU#Ot*t~t{TG)-9=0U4m(iEo*ZHZ z+V#;>rlgv{sf${qtkS4=2j&D{va`rX&thry9XONvQ}U>e?(h+G2j6OWJ)?BO1T`Zy ziF=(kADC%-m{gl_%Ktd#*FR?a?+m_2CVg*;mX`5xB#xH(HrUpv{adN3-R2N6 zwp-(}*{AC*O1oyl#!apY$&^LR1b!ED8u!?9J^BIkG#;?;YyPzu@!rPnYW(~dyry^2 zw!-E=!jLX<_!FB>VRRye`(Ef_*_*6ommI$8B0EmgY&OIA@#@#GkdvN7iW433?&g%|qc?g0dHtMC zHR@pEo4SKaaSVOI*IVwvu_ol8;A}6*t-Am*=6Q0JyYn{P=ZbB^Z%yDOQo1GoFp zl8)*^>>(N3i1)HA=c>D^X78kG9uGMw4-*vsqkJu)La#LLUV~+gf526Z_ggle^X|kE z|4T7@#B6L^4p~}6{8cf>nz~^Kp(T120Wgs@Cs`~3Dpd1WdyqEASWn0vsr@@ZpWT9y zorOxJTJoCr<(sk$vgIoZVqIeKztD@67Q2~ISiL(rVzViF~7s^-*erU z((4@J=e!wh&5T+v*8fZ&YG!yrGp!xn3fblPAlZ~?uSH@G3Y)u2$S`v2&WGsp0*nRj zB|-W1+zJ=dED(Y@C_C%XW}dNNO^3dsR&$+i!LV~D1%91PHm!)-aQ3o3Z&6lH{P-tF zv$@N?&fmG@B+_Ug<2xQVh3Ureh)^U+w<(gBCiI7}$% zm@SY~uH^DR@FmztVpW_TlLuPr%zM@^%>%FkhTJKw%69-R@x%`Bt3Sr^3yrBH8g%wI z@A=K&i~$jsVTpr=W}lJ1*D-Lv>y5}@aq&FdY>Bc<*vBr{4x zY<7AqXLS5q7Mo`=nNgk+Y&<`esu8KL%mQ>l`HEm8CMI#KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z001{ZNkli`+%PX-XFU`2@=c~*MUy~p9Id`sf1V${A=JtNf4W034{FK z2R;g1zEcRHfM1SZxnv9zECY(bZvr2=-3jp&@G;=QWXuxW0-OSV0r=8V5kfEF&HWDW z#e@tAZXveEI`=zEb-|^u5cdL~2A)X9C&BB8?*KmzoPRxCrgs6K16q^uNN^h<5Bvb| z<=4Yy`pMXLOURJmc0p^blRvf43oMin9|Ha)k$-~Q6n_l-t6N2ge+7IZk$HmK93Ni@ zDdrnP{5a8yVS)sA3f_er zWJqwg!XesV^fS#^h&8~qL}m$A0PX?$8^sX6l*lQ;3c)WmvJlyrG3|-06087>#U4>< z!k3y+^7Ouh3<*{c+GCyn)45!xpGahsV1?nwr@2g?H{mjM5;cTMB{E8|g5VJ~&>I18 zrqqeQEg?gK6^K-<`=6ibGQA^_O@bAQch-s_-k8WG!3xD2r^FB*Kp)ZOiKHccf|ZDn zXcOEGCqC3-e?o=?D;Or`z~5J0rep(9f|ZV)Q)7r7i98alaO?okacj!^6L}<9;n)V? zh*GYIY)<5nV1;87;A)~BM16@o60C5n2G(hWH6%OZ5+pFd8b?HugAfxWh^>Sp$eKhB z2@(LXMgu*G91^9- zL$DIII||ietsn^>60Br82q3COOVnv2L4pL3)g**SkYIuk4oEuMSDpAw308It0g`q^ za70LAhy*J>h7iHgfSZUTK>`3=2gFTWrUVHD5Z4hQmCzwULI)5?Ie?oOhy)2E0EspT zB}kAUh9e?Mi2j!#!OArdf*{HPoWx~HkT3#>)2;~>5+ta)Oduw4nHD*-Ab^_VA64yt zN^pC+Ok%|(F4F>qXe~}hJB>0EL8*-OJd{py7`MC26!msZ$gm)oREo;EbNDxIpwj8t zaxNFzWE(i+(g0WFH z{r)Fuf8!JQW8%P3BzdSlBB|~X{f4U)f&^;iEe9~O$ckzzK;!q z$Rbz&T_P6f)>e#G1Qib{m*Wd3#CToC69~f)M??t15Z7@KNlf~@1?jpdV^GG-CWKNG z|6V18X=%Z6qCM=D8#gGvc9HDPouoS25g@2|*is3lR6>qh8A2#U5Ck|V2!a3;4_box z#bFH*hNw)26regg@W;m)IdX*J^UqUw?t6GwE|cA{gO&r2kUMaI%$_}@J3Fv3IiymK zz1f5u%QcEhX~Hlh2*ap_Wf+F|zDL?k5hj6OlX7e>8KE*6Y@x{Lp+k&(`O6d!AEt8d z9E2gJyBl|PALTP=C>%V9`E(2EZQE#h^igvA_mkbZi&T3%76@a@k+@Y$53Qi$d03HX zm0Br<@A){!K`Dh5NkY6Ok+jBibu;h>zmMPFj~yS!bajzhzaF%Pc=B<2dvW{v5Z|YA z_AJH2hcGRzWFB~c?C#y<4jdr6dk?A3jwx>zHT-U`Wu2T&T2uf>ATN_5J$chF*V?&Y6&L%-USPM!; zne5&@_#w8CPb|kAFxuex9+gT3tuxV!}00 zicB^lg;=@kNq`k_9ZY*W2C#s4@gk)|hbTV(0_9^z@%yi%w8C_Eqgz^{nfG?EqH%y8 zj*Srx52IX{)W!{D_v|IR{{Y#2`*2tFqJY2;BFkY{rsdFD6NCZfas@TTwX92s$c?pV zt;u9ED1Dcb!U{MB(=kbc%Gq<24;`d<=x{`Wt5;E}6sD&Koy$%1E4iIBTUf!4j}Z(F zp|mEoX%m@!`^oL!M|SUC+`hipa)j9N@rcwbpzttmXgtj_O#Qb?r82J0&q0U@OMxPt zN!>j$MGZ?(Id_iI^UqUy@kPony+m;RI?8n?Ey11IxGJ_BHlHUL8Ul#Ov1=FEef!An z-$!cgy2x^bA$Dv$ika>@%c0O(;rjuVN@W%qrW4}A+=Q5nDTH(?h2ut%_?=Vpq+)l- zMzef-I|{H?@Xnm3bm$PJg9jfy${{)_q*U&93nC|Yllzf@VA%e~4qkFMoM2?4dl6~Y6GJE%u z+O#Puc(WEeI*NoArSB}uq2op7isumqA-axRI6;VWO%P%-t`LmYq*89=LfuZTM0GtS zoyN4cMKhi6Q#pN_(xJnYUU(kw)G5NDAyhgYDPAUXYi8xD;)&qia}Vih02uDYe zAh@kJJ5{ZK?+19kj}Wc1HHt4HLY!}&5Ru+l5O7?VRLVgSvGDaG0T8=GZRj{qth{uB z@}WZ%s|q$a7|p&tJ*ZUb*37a*ts1VJ#Ti!>)8&Yr(8FG57#q+qR}wI=1dQ8}}4Ylsmmgi5C;6{+G;IeC)Op@WoP zd@&-y*cdvO!*q4sdKW|lcjHFVyLOR1@CezxdvMo9!E5LT*s-y=RAY*NZY6T@x;oME zY+O103gtrwDIGdY<-`fX>(^14G^YF3xp-145ey9>o`=)dN9N&&$?o4z=D-0`_uoHp zui@wva@^u|D+N&|RHDjl-}kW+>1VUi&w>e2E4DC>!F605ZKAE(OFc+c5@a$H?oe1L zQhDhm%7+h8I(!80WYVhd^oE4I9Yp+C^sHJ~I3ElUlbn zN^e&DD81QC2B*3@?z)(c&gg4^%9&RwA3j9+g%_xtI6*KlfO4G3ax8Z`xN12{CBmU0 ztmonOts?!r5CFmN76)hN^K12D) zVM>P%QaN^yE<~Sl}aR=1t@Mc9uR8@!jK>cuwr2m zM3_nlZ>b3}l^6&ZqcO%{j6tiYDoA8T2dG$)buNc)ZHY)Qp2s_WjPmm@P(E@5|Lm*S zd>-A=f$8i7#{seU%AwUSu(mh=8fNa|PzYGKnp;KQZNatED^rygf})G9I4CoF`=^A0 zj9tO#3eKi`N$=ZBX8(TD5AVcXvl@V)40gOQ&F`M{Y%NMkEK36iD`0d)4mWDP=%2qp z`N-iYjyisv@ak328r{`}Zf%{j)I@2)`kJtijveypvJk6K#^SVib1z9$$x*398@qe2~oE{iOHrBfWhGI-QEj)<;H>idT(<>r7@b3F5dl3A;nG|rC4$h_f6(!2KH zc6TCxEtIf@JVFYz1GPFciA9t_*%AuB_Is8_$}u?%y1fIFj>&Q966GUDDZlsv-m&8Z zmoEYe-Q7K#90C}@WalVlSAv8ZTXbiUrLN_uRItOt*kTdg(Lrk417sd~gv|Z}q_#hZ z$)sbqYBaJOQ(}&)qKn7`0m3kxsIyz@^7aWryn6QBvJqmc6^IxOrnL>Hr#mX8zIl_% z@ne(^9-?yO2>$u=k=gBNM|X6BF>{)GL9uoG0)MvcNBQ78|25?2`0iHt!!Q5e{Meb# z@M_!UN%u)9yulW>{LI(seCuW8`iu^H)}lpIdf-1Z+WPaT{5Vo5PJA|WduSd0BU*?4 zGvb;WIus(L7+U=~g49-YICKkgEiz#_bXyxHlZnW2VXGH@83se z&t6j7cVOCDqseA;6k94qE|v&345RoUjvJOOIFAY8+>&*ImKNNuZqN{1xk~xjX9~APBIdqxk2C(7`Aw zZBb^1SK|Ps5PRhnf_TKkK;HUYG2=i=(gyDJ~Ov|ia1R4fxG1^RZ-5? zj*VkSMx%J5vx}CepQh#MrwRJ6Q#p2&(PxjN-De}~;MKTS2SU#US!ADDnUXb|N{-W~ zsT?|p`mg^Dvvn(}J$rF?@4bi7H?HG8vYX7leWds9CAH%r z=xoPa_v=-#|cMABV*axM((MnNImrwsS8`+ z+E*ZTi|%JCIeL3x)vCyHUpPwA2{fv$4c*lVK}dM{66J4w6aUa5{1Ydz7cT;W?(D+cvv$%Qx|KChgOGdb-L(DE zyIHmStvIc@D9bT4fnO=!M@PZ*Om}OSk{nv2 zyL+IgHzLPt7bqV)M&&O)kG}6d++DkH_wC2ou>-w+BLo&ZG6dyfG;=LM@!`Z7)lKPV zbrrC^9o5l+cpmoRMZB;7BmSX-1Sd~ouUtW_MR#>!Hf&g4OVEt@%tPysJ&johGB}Jk zIvTljO2rOi6K+5amr0s+GlkpxkXNN4WU`fJE%;z^t+@BzNBP)A!ka_rSO@AQJ{C=m zo=&8_k8sQoymFKB3x9?B^Jg)eH{(9M6KCIkoCmj)-nIdBhzyQk<0cF9T?d+2=Als# zVJ#RFk)XW;0-x~w1%j{r1Hqw#1Sd`qUcDBX;I3};x+(6^a#(_D*242K{Z}Zo+>8S1 z;vDa4zeVxnW&H2`1HrLlgy+v8#S*Hc9o=3#HNF^lBNo0p#Me(RT2m@oG@A8sneh{IE7W@OzpD8uu^Jy)+hCH{AmtLC=VKn* zOX`h#u>&^H@uF~V10MG6H}dwUc|F4l4=2+Ju_?Il_tzX64KW~wIZ6p#k` zPjTU+pT+;wvv@mJ=lX)fg*jIz@*q<$Ff9iLN)6ogjrJy1a~G1DkOg#(Obe}v*aZ=50I zs&a;iN)ehh=x|`^Qm!)dkFkl8DcN6<>2IA-ewh~RM?WpT0XML9Z&9?4CdR8Hh>cp{ zIFG#n_sO@A9vC1vb&Bxl5&UCE3158`3I$YaYvfifu*OUoi}elMh|}sb8=Isd^wa1K zo6xOkWO$Iu=RZ&73tvEQ*nqop7iRZvoQHR!*RMw@jU63{$T6e5X3}NS3e^?2b1#($ z&z+5|z|o^oOwiwtO1Y@+ZuEwYlb>FW%uv-5l*`!RVWd()cX#6)IDornFV4=Lm~Goo zt*uBtj~yAL9QXuA)m{szW=}0>EzF!io3W%;zz;wL9#dJTDB1_@5TLU{BT{*fctv#%m!qo`aC z)zJydu~{pgs3*uFg5>jf&pdv4AMz}dYAvuhV-{RVJd)Yupd4dN7k^CRe& zUyiCIGih{JH)hkO$s1jyC73L@oARevxujHtkzw!yR9_#?<8Q#-w-2*(C+6NQ(9(j8 zk70*KVBqHDhMMZszDPMXa~wwGQq~)@Td{&F4Zn9WI@N5(Y+?;m>JY@M5LU^NO5^O_ zhx7OwNsSB>o<2=@^a#P>Ls86e^$KKjQOvO%o4BgvXlX&k2iizJkN3qdM&wwx4zqm+ z&fa~vd-g;+=s))yneHz1R7+5+C5=+Jp^qy;&8kvgIrzp!i6AIKrD^r^^p%In*$RPj z2vrn>IyOKnq13yEk=;*Fc=!OR-Meu%Z-Q(V86U?E55mCpNk31kS;|q3uQF!tZsh`$ zL$!z*QmB`SQ*~y3sRl6%n)fY&!K$|S=Ed>NUgB&tvMoXx*n@#3vDeM&Y z&?2b#{@M|hno^(=pu<9B&8>$@WpH*rjQi-LQN7ZuX9$iSCOC35a;vUhMdh-n&W?y2 z)vDX3iV3Chd#mKgq;D7Zi_+R-l{|4h}t(r0j|9i`OpOTdJUm&ubp3z05`k< z%9$@a0fUH+&l2+qbti#d6+h!e()J~c9YRq=NMltOfxd@|vlVMn7+b`-aV-kUQW^Av z50c)upVasm;h9qeM_-|Mas+$&0&-;-6qEkI{dS9-{x0e z{1|QiI5%>u`HzqO9RGFmKjm!u8Ya2~&(wf3u<=aDKkXgkC%2S&Y;A?XqTxo_;OfTr z)sqf5HeQ~YCEy=TaTM=M?A?JOQT;fT%2jgB6YE+>aX$(^dRq+A4oT zCU_plUY&js71er`&29?r+ZoIJASHJfPB?_)4`K%bkbx-3e&BI(`yOKTz{d$+86`Y< z45<_egBG%@Mx&gBt-WBVb->1devq*2pxv;x^++p*zP*V`e=8>E*R~wlEIOTTzH}pN zE4E(+t-prnY$O$4KvW9C0Do9W_diGX*ss7k;Qsh} zhNzNxU=GjI2dx5Df8R+a+A!8gyVC=OGu`A*ufnwWbqYb}QOgu4L%Wxsv(&mZDDnU8 z|KIpup8Vyga`fhuhp3k}O9R*K2VcIH<1gQKm7QH>PL8H<>v$T0fK~#TDFU3f z%2EwKguu?dhSm%XYGgeLRWAAtQ~TL`v$0|6q>_M=vyEJEly##&McO+OUDIil`ikW% z&{_B+TD>pvYWKJBO<(PMQsA3=fMC|$G%UsyD47QcRGN*W@28{isp$HRv}fv=h)+-c zw`uXd%4?m^P|^313eQEPAV72+H;e(JGlE3jAfM6S;2ugKzCk&SC%~oI4^f8i_Uz(o z8}>#PVde%g)j$hv{Qh1zGwSmAGaGsCpIl-`XNi}`(sNr1ndjubl#FO5Gb8n5RwX`V zcN?wVx7jrO4iuI77aA(S1t+|~{X>rum{s-T_=P-697Aj#{z2NxpIcZlWPG0)|3&T{ zd6Ki8hX_OJ3kT|f7N^XmDQmCvP9_J2N~HKL?ZTTk6nVJKqcasS9vY60rg`>iOGKVFYHqxt9c~O7 zK5%dipMTRO2Fj*p@Y{6SI^J0+wJKJdNi^2`Y@;?yHFNitKzE_6$ELCO0$%;8DV{(A zvjJcCp`}d9o=1hnNtrh}qsm;*(#(cFU4xwQ3@j>*!Xuu&>XX}nj`APVlKDBxW*Zg_ z;!R#}zSFj?m%58wa^+e?%sdDYr(R`r6d4;srPJumo6+xh2WHnEvTxjhd2s_Aj%M*W z&C?j<(!wwAALO5J9Ou4P52xz#CCPC}hSNq}Pq$OOmetbB@A?{Dk- z+Kt@A`A*OQgw8#TAL zQ+D@(@+Z_%l#8*Wr0gqoRk-Xvgy5oP7CR}0(h7V2I{xWF)Bs3JHfql^M+cJV(8bYF zWNZ}DY4qlMQBS=avuh`2$3v*T)nG%!yMYwO!F0?`hCDpcTjo!nxWd-%3O5T5XA4nJ zo(bM5*w#_z@1DBA_kVRGfBjl3bk<;b95DXw*>0X*KYkY-Ss?g&HQC@5x=SCMdnS!% z?Q5;S&yCy%(E^U`N83?EX*{!rqVpibnfKA|J;S>Ezr+bIFK=;e?5Yj4{2$!Rei+~M zq6D;zM@yR0-@^ULhBdt^=cd$t`XE5#2bMhJxK25LxjgpB3G_NX0fv)TBMtDlB^?xgXk?= z(C>K@MT{Q2WocyM$JmrG8RZJMbNt?=a=IbImZvbC+k4bPcg?OC<|4c!*0d9Fp&BdWpY zW$G5v$q2c+HMH>>#>`670AF>my8Iua8OoX4O&VzVHLm79NK0@YEj|)!ml7~kFkA=a zGMsvvV#h%?kAFYe;JbA!g-mHRI*(_Wup%j5YyT`m>F*^-9S)%S@ia&;rspx z&ZW!P6DP38j}aa}hFrcJc}87bkj>(x{`Y@NYR?{IRkYz-Muy?Sg~`g(W~XK!_Vt#* zvAjB%t-FTcD&b1OWoJ)`4{sad!_W6csnZ&PA_e&RK#oUxO7xd!>=KmMb)sM3$685+ zgLHVGom+7&c&P{J&;EOI!L_)hjj8SNijeb9l6QA7oc=Mg{&$zdTXBT}9DXbIz8BMl<-aC6#$*K9@J^D)aoj;ORcv{V(B!m*ysfz)<=F z1WJ*zBT+-Ndf%Z^7y%0-gLsiXjlj)nG zie_WZV`o>H@AYSA6GEa%@N^-?SViM1OE9&=-b7h?gYlWGe7)Ib%)*S4(0P=@i%j`x zvC1VI9IgKm<1%jEf@AYh8=GbpJgWDonz)}@&(d(`V1N@|Cs5tYxe;U9{rHG=8t99P zzrL0%rD>OV{@WAO1UV!hxoN7c4fFPQqIn(9pthpO7~%e$KYKUS6w5Q>8H$0%eZ6jV z$y_sqvXHi?>ISa9-h{6=;n?BkSC!;eJj-2pjIW9tFBgkQe?LyMYbwo~FPT>%u~x!r zH<%um%@~7Xs3=-Ri({vio-fv<+Ii^EV%@E3DYzoQvDfQ<&eK~6R4cBG&U-O_Vb3B< z-atg=!M=KZ8k)baMRgX7uAx+1?b?jFY1SOg$8-rOu{b)cJ1Gg#DK)c9>tao6BUeF9 z)q>fXnWp6t{}iI;$6E3Y()`_sxXtZgn(8vmYkX$9fAeq~n@LGEz3XT$otdXwy4cM{ z@#kOnlk)@>)!Ek(m{wraoq90rOooLGGbe)PHW-=}iFvt9OKDQ8`Vj~W`DX4f5y%-! z##ns&dSsbo!L@y}-6m=3b5Ut_IIju7HhC}AI?Bao%$CN5vovgNwWKa%qt7?*GTA2G zD%-s2Qbes_&KBLeIr*+sNQ()%>6zLtQ=@oqF0(uj*RH0UVdt?CIofQAs1#P^>VCwP zezYwiqGy*Q)Xg$A^S%YTOf0}_0_(Fr&kf}m7&Uck z?Dw>n(AZ@u{$B3l@#*ikSPT_?UtL1D_8Mt>7GL)ub)I`E$7m_Xb}7e3mg&CcdM#a+ zNua|GaZQMCA=RK;LP`k+%l~t+dv13p0MhWL?mR=DiCR@kEq7!QS*FFf88n&UnmTME zl-0uxKhxp=4I}0)q{VN-QrOsQa+}DQ$s!jSn{=7%61YsZneoxlxfR%@ahaBk@eZ6E zi4GUp(o(^*YT|jOzM^_7#rCcupFG#gKVEKumN^En2ya_e;6Qhg>lNoVnBf;Yt7?o4 zkT;KjcIUo`hF<@V$b^?DtF0*fI`6Je$iuNvN_E^@9^J$mEu}sNk=xw@}m%vex@^ z`n-=fuKc}&BCaSaXX;u#ZS$n%Rf>9b&AgQ*g|GVXRWCG=pqPit)W9T3M2fFpZ(;A( zw(-AizRA;T#<;(=!ab>|FkT z#i#jfnOkUbn~+8SHRNdx z4zkMsB;Ed}o7+FUX!ozl=VtMXYMK%Oy|F^rIZ3g;@^A3eMvD4=q8ZjsG)r@2gk1O% znlfd5@7&!_;(J)qbqEA#1K)?=d!?7(JJ-vGwt!8U3XT$P_%0{M(oxrr7HYQ+iMu42 z6#T)%ml+BSzNO}FxusZ#XgUOG;&;t`wpWE2$*A)* zMRfpQb))e~%SCebd0N8n&CAx;l!LG=r5p2g!)9lE@_1@Jf$qbx{d4ZV%h;FLQQXCt zc{_nxi=fbWXc;FhuaOB}BJaMH)0w}+7&{n%yr^qXH}TYHJ4quGZ2neH?wLbQx=KK+O640nJ8bI;DPqIdYu(7`j)>%FG- zM7j&1DNxqi$?G@J8GgQD7x4D*t8;em2pg>ZOn&FgGal-_>W^~NekPof(TH1*kd53a z(oAd(tvT?8$U6MLk6+?P)(vuEEJI4!#ogCTvpk>As~PUmtQQOVZV^M;o~NYl=he(- znww6m4a?MwKQAzwvM@Qqy!54s9fkGfD`-1Tzw_bd+?1)Z(K99tF_Uh8z3*GHj6n!H zJIWY|6}#D)D_(qK7}li%zVPHZetPo&$Hua8LNK>qt=@1MWukL3ZhU+S+pvl>n7&PzWWahgR%p2x6=rTFV zSKNQcW#=~*q%eYs3J&W%iww#m*ZpE*iCBukYk>q-Sznw+intyLd}RZtW~&5=yU@{d|l%iJt}GgS<{Qu=!mT( zz-J9wDzkQpDJq1t;_KBl4|h`%P+?1Kh3bu%&X2nsK z99CSwt9wl)6*B4-uDUv;TH#@NNdZzIj@eo!G&Uqveh%J#3VbTg)dVx_>J1%+Bvf1 z1{J6HW}lf6o$nxZ&TE+d{s2psin-t)<9HKS}5q)Yn3|J6y|Q_ zIQ@ExfQs6HrGt!|ro|qi#U3Li7cq>ZD8=8FBcz2ut)i^9P*xi$>-*#Js=XGWwZ`+j z@g>bNSy5;WzEzygXV3`UnSgh;j*`}bQBh+z&ngO`X3#hES6s9boCO4kj*48SGlg`+ zFlDyOq)=Ew(uitdu2Xunl+l!D?N6w#2ZX9^&Tmx&Xel(MK!St9Co88AT#9-J zQq%9!B`w#0s|2cpA@lv*G(U_YL=j9Vdo&R_5doA%NeNd5Fcj)9^hGYyJd?)FO%4-B zy8CUvoxfTUdq9$fo zH4!+(Ny7L(L}|1X8(ces6%!xKGV@t%6VEc=QEB#?Y98{5w8zLeW};1a)ecRSk<9P} zRDCi`#7Yetwoe+s#+(sEY|VGpJjm(pT3%R|6$@ngGS~F8RAoY;m3Xwtx9fZLY7>?e z(v*vGhsbBvj6K`_HIuWgav<5Kc*ieZRVb>5=&)aJS{)J9otjDz<)4tW%nI6$1a+gQcHqDx2{zUoB*-Qlxr4L*P?m#KFYYhJ&B zG4&{EIlIV)EqCdNM0zU@cWoui?Te6h(p=>M|EDPFt&FKBDXV*_s7(a46Vi#O3>Gsn zJW-aXjHW!B`1f;g@@_k zvrz{U`tVgZ0eu9lB2;NCQOUOv4~OfdxJpLOM+Je+BxnSN^bc`U{~$Rzk&vOW%hX&u zR%z-SvZX(a{%)m&09JLNCsK#ta0AEQ0A6mKTxl}>UC{e^+4&P(dpZ8zgb;J-w+Q0Q zZxdm2zHt&+H!G*PCzhr7ic$S;UN)abQ^4g$yf-@;n|fms7pE-UB@?{P5)%+oTr|JN z3Fq?&0cp8(%Uasp;qV<1yk^`S7h#~{MpdM>kcUCf#Z{8HObs0-69>3s&9DA9!K+Yp zF`(baHT40;^?tJUOkC%bkfBMJ$#X#bX55?s&+tF3zR6m*j7iC?@vxra4L##r_nJA+ zV5Mg=#t3NRg8omm%Qt9~gScFsZZsNoB8>mtXEo#caYof!7*TJhpmtznh*mi`QO}c% zN7F8oubzA1;PF%{^>CwVSI;WeXFWRHuy*mMhGEZerJN$IlL4q76Gv6FMYR=8NLntF z<|s9G53Ax71s6D83~1#uN;7%!x0 zh!^In#dw+`4r8S4*|?lq$7>e}7U(hs4$-#$ru|gaZh_6G^6$pw_sk8JlgAaa+O|qT~pa5;`PE=l}vG zM}$IRAQB{u01*m~R@G#9!iWSbJfc&KIog=f(Aq>E305>hYthDxItVutaU@6pz@P>O z6FDSE0KiQLn(g+KAi-Uaen;SXB8LPC0J!cT^b_rxa}s$ZSjllUa9smefE$TC60CIV z09_Cb6N@E~d8lVC-`i*=uwF4G9`jYK{PRv5k+>poM1>MA}Byfcwef)#{M zP5q1d_H!>x{d-oRA81eHlwbv5Ou-tUG~qJMI9$F2{81vO1SWSHQt zf#QAjbY3$f?>gi4ZQv7$6cgMf_&tR0*3)_QjqiM~nF}2Qb|&&na0lZ!u&dFVnmuLX zJwQ2;X@WZxVKbOcl!R<~47LXxb=+Tv*0Dd}=d4k&%Kg|M{ z3l?*h>z@GchWI?$1PNY$2CVd@?Qx0eJz2{$2-sOu;WqJHC5?&`WqzzYv?Nmy_{HaEtJAtaHDxR2S4s ze1l&Cb^yN$6qE5vuuLcdzY^=(mzMIvdKqq3fZqTf06s?4H#0$kr9c?#)C0grScb#Z z^)lZ4<=B*M13pS}mR*8{<9e(^+hU!%yj)+@Y_)4V_e%{*O7;JZ&;k4a@I%0pKx;D2 z3F;tE)Hv@ifX@M=brpH~e`fq%-Ij!ydW}BdO~5;V{lEc|R{V)O1TPY`rT+)uTMBM8 ztISJ9h}Wx$z>S#opNs##j%dHduGl|(2v{Be-ktUEN}-fWROmK_h#*pPn)Hbd`n(Rj zM3gBy9>1=<-uHdGbk(>Lzn-1)I|FPa>YdX|bSPwxQmQ8m!;UZvGfJt}*!5}w((&`S z@hcVoUE;s1_|Hyajpj9L2UBF{$A1opngsjtD*!4$0mzF;-WXFh#*B){ATUT&etnau h=hwyCHQDn24*-TRi6R7jhc^HK002ovPDHLkV1lXGs2u|NB4Z zIiBaCc~ejd=i55j7qPEUO0D4Qa`ry<`C9AFAPAEDIn5qtci3HatEQ{ywG~>xuA|p- zFR_b23+x%ovT~He1b;rmKEQsIayY_Q>HX{z=W{`=5nXa>b6$rDt!3ZLel7bI(eE8v z*I$qmg5x-ND>acpqa30($-b9;2m90Pk4C@0>ZV?UM*cec@3CJm8i#g!Elo6bEBk%y z|M+S&^3?!&6Z;>tzrBUbV5>AS&p%`T0{dgXDj>Vq|10|^+VXxw+E>{>%Rc^k0(nz( z;`MF$zM<{KNO2xJ8<6K>8sE?UPi+w2l(s&S{rk^$;Mr*8zh?g?yWN)Qo7N;;yFXI8 zZ@(JW`X2uCy*7xmrupo@Nz?j+^8xZ2_J`S1ZTZcrmSw+%efzlp*%QSy7q{g$E8ENL z*RhYCjqH5B4dSeB7e^S)sF9lxri|Kc_BTn1ZmR%UDwS$Ke2{%hTShI>9N0VzgUpwd*77_Bl}kPfTieTP`ivx+CoNl}+n) zZJD%eyRPgbJJ>I8%cEtRVAtVjt)<51lD0frwq44;NHkIkq>^oUv}{WVh7OckJxzg7 zyR}YRV?kqSTMjMXmO6nB7O1u$TD{Ge3W2!+O{-FEI9suaS0r|GoxtH|)2@t(y^cmJ>)sDJwWIxt^97x|2+x zuzw#09)1LNDhXxV@UvMsy>rlg=bb<-h9F;na_mq!3A{mE{eOw1bmjP-N6r(g*xOk@ z?jRseG30jaz=_ZP5n@Z1LM0OLPM(CjawU52csrbU5?(xJa4TbHp4O1dBPbTbkl9k< z!fj!eCwN(wWnLXAP!7V(Yij_B@U|qRQiv^E26xdSsCb;wlZMORopc%~6p`8eBF2C6 zQ)*@ooz&9K%P)u1-3?7`4!9V+Oct7p*lZS9R?8}*w31hXm{t@E1+&Tx1Dd54NY`kj z`I+Waxo+6`vpsh%Yyx`nYhT0UlTXt0?l;;ea~Xf=LAdi5Aa(7v=-PZUlIz#O?db`v zuIIy}Sthy>gHkQQe?%(FY#D==UFhyL>4+uDc%TjaMLX z)h5K|%?TfvBQaSnhd`_p&ug@GmhuJ_!I>u)&=i3>e&S?5kzFVgNs~Aj-xT`Ok?C41n>&Tk(Q}wkp`IzeI>yfA1Bwd z5WnC8q^O~(8*W7U$}8c{seWtj zqBiDXbAkE-GBy<+9Ye4lp0(qf6}eq6qIl#;n6^k$JJTs@shCk^ z*ya>Kg#55;u2P@oR}&B&vGMR)30P#U7A=kdV8+l0s2y1VnpBBP18OUHEqD2H5~TG= zUVXJ8OtHm_QQnL<$I(>Fc+B^IMInt9xsM_jT(Rhx@JarY_dNmf$g$&fK&l8#8Bi?d zBIdXzJkhUpztR90m>}Km?4kyS4;1lFokEVjZt}qgk$-s)ywhi(#mtjcS_~zOa3T$B zDxgSs0m1V}M~v241Uw-o^3HcKG>KvSXFo^&ne7H(Ifun_+w_ITKsGbYWi1mwEwUg` z-te%Ij?*^}v5PN8$CfQfUAYm?lBH3$iR^b`!i-(f{K|rRU0jZmB$Z__$>)oF^~2b) z24Dl^;iJdufUHb}nkWD|6nu>SLsZy=C&4+U^UB17PFaYC>PQ<6H)iw137XC4kfG*f zw?BhGgd|!+;v!*$(JZ+Ex0!$i)JUU5`vNjm6A;rB#@4JsYV&4vY}y2yF=cHSA%0c- zYv!>>QP{iJBoG8BySEpLS}J2Si()$SE1!!7@_J@L@cN1xp1SfXq;I$ZiOV;@S#^Q2 zX2wlTW{l;iXueYCMV5r0i0L%)qAbLm%GWJr)yaQmAS;(7m_cY(9fIj{GUXHLvWC?9 z2Lp6Sl2kHf%$Vg^W>FL=xWd*aFtPJRWM0?>k6;SBl)yfbrr#6BEZ;Xly7*1qpdqda zBLZ3V)DZD$&Z0#~T(JSkjT@1m$%`*pX21yO$by`h$I#^2!g|?N#C(gVPt$xqh5WP6 zk^%38ckHM*A7j2nn@!jfjb(~}W0pBjAbxUk!uZr6>%pd`CNIC7{`4v&>09G8$0Qs^ zMBy=61FB)a%@PoiELGHv+2-}>|F~uXV@k`wHk#ZJ$RkIa0y!m}7p+o>H4UKAV078% z3E**RZdX@G^~G!+KW;QG`{*MmGC=YbSD#K8^wfcm*Q6O#<- zEv_A2qL@y?uC~kb=z%R^_Rh3yd)$gg>edo=kbD& zFo`B}F@%I;2I?1tmP54Hk%gBC^Rhm}kUTXsLw{Y|y&E3=w`jijQ~}m#lM}5E}U1NB**}H@bHmy05Wv^hHi_$qX~le6>1eE1UPgE9?3-h`5h?i*kNeAMM|%@@@@JN z@jy*I!Me+q8@5W2FBac7ZU2yaPIR5eQ;nOm9QN&=3 zr?ew8XrBWmM3k|C$>5l+F9QPAjy^th#~nz${q67>7G<~XLh;#0;95Jlmc4Ln>~1n= z7B{S*D#G%dCC;OHHvU$2UDylamnk><+uwq-aupnEX>9W?h;i=r+#b%O08J|v&`s#T z3Ki$<+gNbQk89TDlE`w_T%<1kq;H`CMUyyqhYzCk?DHr-@(?_Nr@4Y;1J{}}7dBTH zYSUtkEI7Jm+{;&={4H|sl z>Y*lc3_2ePs}`F`pk@4=Fdav`EGjKp#FZ!}Q@SRF_IAGnkG`(RmE`Suf#5MnjweFG zuwq3>2E@)cGQ4OZm{393CQXYPIEsPcf&tGw)w>kF2ETVV9C?&|E=%9SuZ&KHn%GR% z!ra7qdBfpiP*shTN3{i&UGsB+ZKe-o{NXSDB>ns(IYBIAxL4&-`iw%Hc`MQRi4Rde z45JP`Zx(^oN!FVX8PWv_GdEWXC*WRjDXc4Q zM9$g*do4M^3a;o}-ei=7DCt7JB3~WN*U^${A`uZ_1R!0Y=DqR?N>4s%fb;k5qgfj^ zgHn?JWFU=bBieu@KC&@DmoAk1%<0g?NHno@3G(l{7azEM9aifs628!C1+m<#Ik2%) z8Dw*0tg%%U5>(rSm5MvFG{+m1kWbuz7()_M(JAopT!B5G@-2zSJ9}DJO}|-NcdRbE zU}_#suWWl+<&bckFWqF(pZ;CM20sYBhi*o4!CN0kaQFzc#K)ACaY>Tg7ZA$}UNnhp zSc|`i&&7&QK7;tBJpK?r>pXH=;OG&?J+#rWIPLa4SZn5leiC8HL`V=Cq+$FaPdYdN zNP=0&!-55{8CS*0*zC1yk>RB8&JN(;=1x>&DZcb)Eu73)h)L+-N13HME#&(pje?j< zk0gkyaJu6!pgR+lW8^S97-E=m5)1&su{KRPM@p=#bI>*9r6OKgQ> zDGk|(4~kWSd8&i%PBYZ%g|~kX^2eV*{`)^5TVKp;+yHm;O|UK?`(3e;ynwMO`H7SN z=Kn_U5P)616kA&m%`LVtL5MX^xB4WJiv1ndA*-$~~K9q;;5h zp>_m*J``$A)tu%@mHe)znpR~%h!K!9KZ{4Uk?sU}E`UjM1@cZF<5te6%pEbsI=icy zRA6d`OQ6f~Mu+Im2~_VqsP&9-ue=&A-H6_`4gS-Q(kJdgz<63uj6-#HL#O5GD!is= zn=qzUFC?VV0b}XDWdwg7g3)o54)qh*`;q_q`w8S4IGe8JHLe6Mya-P2zWd-vC?R12 zwMcdXii+Bi8$(x4VnAVoK;DTn2BaArKZ-bk+0(NI2fCLMdmnwpNnG~p7hv5@8x{?2Dmd}=oehscz(l!G5< zx5K&XaE)nVP#EllmnYCgnbSfJZ!uzXM`_H+&X1o!@#VjP_k#z3i`G&RmM%51ND!sm zJO?lwcAGf5Vh_CGK#ZUI7;db&`1!cbbx$B3pX-*C&vUb(7 zsfJY_M1F-J`Iw9D?B60$+8zes=6wevseeaMmJp=jh|c;(DtU*i*B`|E+@B+re++K0 zkEf)CKqm_JdW@#;#$fU{(NWrq#iRE`*Vgc@UW_C^X^soilFgP_8aam{mp_2{llLKA z{5j80AT=!pQYfia$R=*aQ1a986AO{LoXq;#>(TQYyO4hIPvGy~&AHh~&KV2;o`4K{ zf|vz)toi7p1lWQd_rfuyH3lDEjqIU5xC=P``SVO-r9?CC)a?t(k7S{pK7|_Z!`3Am zfYC4vIA!(WOILjc|K-|yFrG|@7tKX}f_)Feg*`ig?(fKs}>AYI96Ub<@0m7s>3yQK~Hbd^~YCL0d;H z8iRc%;rf+5Z(~f5PL2llM}SJNQh=qx;pr6V8Zb@!vLbWe1gnx2|?h}P{}IMMSrMUUY1lg|@{yi{5 z?`!`oSb&IM29@|vPoKc3i4pB-lKU`V=Izxqb5CLM_{YOT%R-h!m9?DOdpn6+3UTic zP3kX9bgy)#-ke8tM>kx#w#EE|l>wKm)wBqg(7z=J+!2OY+pE`=T{3SF3o?I-eeT~g zREnA1kB7B{D5{xsTtza2W6T*$O-{lnnn~ zk8Hxz|NZBk^Y9NhA48YxVWMQAsgqIF>_phnbOTxIhU1!r7v>lrp6W3|Uo`OtA#!%L zAa){l7mjv)h30a3MLAR6^H`YqGcxfXO*Q7ay1c>|v&q;PFPut$j%N4+Bv4DDxHH3Z ze#xA-_V4heN{=H|9L9wE4jk(JMaZI+jirVo5b_;(Py>T2NPi%rdpKbe6)HiBS;>S)cc5Hs;5w zcds47iJ=t6ijFav5*BQjm%*1eox%;jScRe&nJ|WUzwA%pl?fLM<35kKW+bB(83i-v z6zf!0H9JPZ(|zbDK1_g~tSTo_x z4l8XU4_|jRoH~ZAy_sWm=;`U7J=xb)h`r|;B;Na8_%9zs@Zv7$9XrT^CI9=O4?~q? zFO5v^%z)XH)tyo+8LtlLlaA3OcK29 z!%4hv@wf>sW+pQA`<`dRaeDL1c$1UwC_GrZ$zj@P{B9bO4r;|KCi@faM3oTN#~3~= zqR{5nome$oOHU1MX-d~)+$D%Kn{F^@ShX>^!3h+sHOO0+a82*1CN6kA9TX_fJT>h| z1SG>h6dDXwiJvn}Qk^{S$;x?kzXf0Fla?=ov+fe8cfJ$q-~m{{;lm_vgJJ5ZT$eLV zWS;XQU#xURjl_}*v2i)1_33<7qasZ>mT@6lES9cOJ2j0;>Y27-YMkJ7CQcFt416su z$%=jTXh`D0xq`vJ*YMyAWrSn}jCFOciI(g7-ryD#GH|?6e%FdpgXIkZNgfoNm>6Y_ z3lj?pQ)q6JDc2n*V~`ROsrZwPi_sCNl`G+BNxVuTI!cRGHjm2!*Nt_*0h)w@`#uOhp zwK7mg0(?kN`b0ln!^!Bc_|+*{|ryp%7H>HJz5E=$T3D6gN5T zF+NF4f+5KK2GgraNcNIK#KQ!7&H03YNHQU)41Ri|HPhJ7g^-;)d9x#*8`Oa9o8IiZ z))Z&nj7&s6=ycA7oh)KSx`3D!)_*QY7O<#0i~qTAE>4a*VYViUJ2%eB;nH*tVtUDEpvQ_eA`^i6(VK+al3@FW3{H^=9#K1rIHosg;7 zq{xcQ^ym`}OfSbqF4K67+3Jw`yat~xiM$RHNhjRl5srgi_MRwvRev6<8PU*S#z?r;_dDOyXi6XijA79w96#s4a{7P1*T*~p8wF8Fa4;Gv-{5T8QshH5l z$?K^Jf#ykrz>o_o7{jP@7sHT_s){Q~r#*)Ya`#X;X=K%U_I1dqwXpqRzW*_F_)k>R zjZ9(yYv$jRTsy2F$!wAnV%JmhLw8_@^EyM zSZRu?NBPJM1II7!>BC1?S2Z2@}IAgQNGSC{vFc(^91^BG*Z1t>AmRm zen~-`ZqAg;*9&GcmCcFVjN{aZ!k{8!+g^I`6&%Y`)x?3yV|D%`==1KUUi1;>F{Hfb zFyU;$k@#2PGWHG4ZZ+LKUA2GR3XvTQ&(yI1Bg)281K}2yi5I)0*IZb~a@UG6{Pk5w zaV+Q1KPto}DXwcckeUi&y-=*CL#3#*L0~q66TxvDk9`gu!4v2#JzUN3@HL@# zV_|W3z1dSUlz&9gUwCc1!Q`vxCZ}e1dpDU2BH~w<1`IIh-i_YUcj_KmA*Q~&^wYWr zAxNUYr~h&rmdUiHRoB{gUy7Z8dsYqMCfPp8qFVSAM1@q;!j4ja&u%!42R0wXglFMY z-bG9{fur+@W@aSknvFoug;jL?nxPtDK<{w14b-S;nBA8k--i>qNQVq`s7^&yPzXtj zcFpIG9^^5D*qit+`_l zSqJZ4G=fXgS=eqEvPfH&DBxtl33Dt2Xw14DCAU{@w1{k)lvK@)z!RMqz=-`W6s#3d z*+yV?5K5*3V3^lb#?HICpFUZE=%#mFk9qT7gmfZT#*?RC83tPCd7C zS6!vKPa#~?k;h*h?8AR}acSuLqNMqsU3L=xY3&K*eVg6Fcque9o%EFg+IY!f7~+`C zSOf|uey=W%nn z;?EdQR8T9cRqVnRRgq&m96@JK$(I&+-P&=A*2eW=V>au?3C~nH2v|~E znkRkAzMj(21~Ee%3eCouhRZASS?DTU3bucWgAe8J)J;Zyw-{=~^**B`0b|U(T4rp7 z2s0iWpa|!g_v89dLp4qZJl$oOW!aC!^uZ=R)SAY(I!(ukDdP<5nPi4ChS0hu2U{5;*8;-RK~vd@i@e`P(%(Y@ zaW#t8eClJjDZ?;ZaU>`%W5-VYG|kfR6nTxSo6&E5l-hXMr2VFe)Mm}3MI&{iMhbBV zf~irs6EGwL~9FPcK(jWY`}mV=3r;%gd^;o zLuz7t#(OzWh4G%Mvet}Lgsa!E9rcDmX_;8dmH=1H09ph79_COBKZaw@ADZ8jc!g6> z%<9>eb<8oj*&1Yo0-VaZxU4&ad)A*p+zqu;%KESEoD`u0!fy(4Sstg7_E)5magwXZ5O;UKG>n*P2%0 zMrRo4uj|U;w!Se$x3Qaw@%};#X9}(fFJ?EC1$wj`2Gl!oTD_kDj`8;)(w#Ar8Ikx- zs@FsVOQ!c4g5)rOPY1iAYWCQx*)o2!Osg+@B*ps8&@c|1q-ovn#iwv4R|PGwNW(%_ z$&5&Glf;8XC0kVs%smxhR2q^12}fK=tT$maHQbO^=gR@#Y?Ty^L~hzmQ(eCo*gAg) zO;QV8La{uuj_AA>mY035y6|rA(tx|BZvkhd+HoWI6w%P8p zq<@9~Y_A2*X>!lvpRnJ?zP7#SXJy;V{-=%GRn2x>r40MG5Z2JO+w5xD2%E9S52mZS zrP}I$!`JWO?2qejw>PFqQ7SP}+naqjQ~C4{X>|qtZ??gl6(If=S?Uj`JK${3+4(m6 z-EA}brkm5dBP^zE=W;{Cci2zT)P9Yx>)LXCL)&he(vS1?v9ld`u6L$9Mv`M!)~Voar4~f8-5kk!>|DS2YMw`bk7VRCwClTM29&*LnWlTzfA`QItrL z)IsX9Wb3|VA+;UH2@t11b2O-f8cCZpL7JpU3&TZP8?94RXbRLR(g02C7Hyg$aGWB& z;wBCxM~;-}v}}vIB}<|yk>VllJ+rejuitw!OVUM@q7Gd|9O-eFvpeto-+z4n|GycE zMx%k|A%vKEZx{wV&&$?owGO`D##7rlmU47+WH}s;B&H8_&cy5;0Y`bp?=D9@J~za1 zh2wA-hDTDV)Mz4+DD(Z)m!*``xNZYd3BQZuagO^HX7w?C@eYMVA=}5Xm*Y^ZjQW`QL zjm7-sopTiAg9@L;fZQ!)C}uG3+&YL)CHYO5+s7u0yxJGCn30&9rd0SW=94a|>!Y~| zlDN7o7I|3&p(^&~rn3ezYw;y5A?LCsGs<0)s+g5?mR^w{NF)@#*~iEU4O4eEdhRfY zJEQ;Kj!ofHmK5P^qg0+jET&__h(QK!+|Zirt7mjRZ!bXYp~4Enh;*VNeRi~L*p}WR z7=P~DnEco8AhUB9x_;{udbgp$b&PZhA;E{PrvXc~?%NP9LQfmQQmvLoJk@BwHOn<; zRqiPqhkyjCr%vJ4x4wmtO+a$Ra(L&@!Miqy+|HdyZ`%&1V?IPCjX)TXt{Vf^Rm!xK zKZiF7&f91NuXof%C`WR0F~DS0la!0;@pLc#Y`rX zOHx3Sf-3X=bkC8Iq1A_+Ku~Z6P60F2`jramV`HctJBHec6L2qF0IC(hNg%9N0V-0e ze5@=@cMfYVLSCb+t^hmBmm{@d15(?z!CANvMmEEx7|))^>jFp$t1Ya+il1!=6&A`n zT`H@@L!3K*p_opmbLwJ;f?Jk}sSr^=lt#582`u5nz><-_Q%Ii{s~tTG_r!73FJ6Q{ zG^7C-sT9m)LJO#3&uni;dh=$09#cJb6alXjDb8bBS_#UfMKTF%(IO<4^&z=&1Jc_G zxU&<;<{~#%fR#(D*D#E+iYY5A8P&;vYx;E`if?MwYDt_ucV1gkMr+W(z)*;lBC`s)rBr^;NocQCn1pqpJW@z7sRek=?xx$t^ozcXmPK zveSSGMAk`O%0ra(c-p5Df<~0C6hBldm6AAf_FOSdklJF}YC^N0o#!ITg`2K8be+~Z zf%=gn@GoD)@OTXs&fR7PXdxicmZ4B7E*`+>q3iA1gT%&-aF%45N|az(G^$aoS=n?{ zaRm|$&gBlAhI{xYs1FPv7@MHS(4*#)fyXKkPMAwp!3v5|B}x}< zjNE`bGORtz%>4sW8#|G`e-mW?I}j{b4Ud2yB(8z?eS|Rl4F})kZCq$N0+4aPGYqU)^BfrZ1Qu z2|v9H!`;tOxN~UO>kxXAdUHDrImCSUW*(9pXYqG4oIqoO%s$p&x(Q&X>u8MTVO^Sl zb>9QX{nDoq(!%v47Z9E~0_)akhF}H7!KJY2qWvFx7P)(##f^Vlf;YbZt4Q9r8QJ$N zhrMzsz_7DQfBZ*CT)T#_RK`TD2-|e9I2$7D>cWrH{b+bT`uf^&&x2br*0&iqJC~6a z9X#k=gDI(9*TktSBpa_ll9HO;8Wh~GCoti>UxPN8?vm~RZD*ry_R$^|Z0{o7w*=3; zi^aeq0(E&Q-I*~RR+wW0S6kmh5B$Y#$aQZ(=An(KkA4u|sn=l~eh%jIL$J~U_S$(s z?*#dS1bFggcvnwAyd+@tFNU|~ZdN?6oJ3o#gcQl+iC_6MytaNLb{#r`AtQ}{S$rQQ z1~&C3@#y*_KHKF|*b<7v6+C*P6=z@X#LiW`ZX+jDX|xiza7GFNCb4MpaoF|CaMRl{ zmV6Ap$igA>F06b3sp=152iH+cY(**a0i@iQ2z?kgvVTj(v_))bJ1~nEvFPOQq1F2) zjCn1nw{F4cLyw{G&{ODp?`M#@_$=%a!;C`{Q>Gr_am{U8@Wzu_7*fh*zFaPRaH%bvHfK9^PI3$ zgk|p94Rg;9m|NDNb6^Q@9Oz#e;Hz7P@ve?>Tq>sUF}DW?PNwjO1D$wJUlmIeJ~~nX zuD03eNCvDA!zsqpwUH(ln{n60;^G=SV}(v-?bT;AKxrj0l;4Z7)UP4gxPtETlUgC6 z*`gK1oDdZvvO#xVgW=qtqLAEzeEk5G^jRwII_ACcG_GWxKwd7#B0PzNaTB0D< ziId|=Eba2>0!m!=i=x~OgLO%2 zO9_eXd*Cw-S|PO-OiYmVYNTgYHq4W?kc?TeG3=ShF@G(f<;)}nuLzXus&10H`kCq- z)7nXdL$r7=KPze%Q(q67AXOI;znUtf$iPAbI`^qL zLYdZzvw}g@5$JPKHkAg}(d{+^lSw4attyNqpJMd|hJ@YGQVXSO#tDxpv)M^KbU^CZeryr)YfMsJN z)$5{a+=XN?iL%&=ONqb7B7d*8Ue-U3g0&kJV>4R)e~%Q!q98yU326@;jKdXV{7}WL zr)8|r8%%40=T|XK$NAkn2AwZrk;qe??;;VLjkjCVQP@yn;^0q?78m4_xh&cB<1a78 ze_U+Ad)E~3+@=e-T1sN9ZlOO{hpOps)L605+$P<+#R`y6xsI+|Y^ZGy6U~P|gwhlz z4+YyaZ39I*6`sw*HTwB279Zg$o@-#l+JWBS@6hjkUfuV`Y3BvnXa&pLN^CtwvyQ`v z>ZGu>3u*?D5kL5%o9l;2hUYmq2}iVYtyb;Ystd828_SW)Mxik28z{O4T1h&RfJXV= z4>WyErHV3v)xxNi({ZH#88JwT5$_v?`kZn_hi)@W3$n@){j};DDj`67;}{k-zM_kO z3N2s5G991MzLOCFRh}j^lWB@kQV2b>GL^x3Z)k<8Yb8rZ1zv#_DkZ5P2=#2CCY~w< zS5L~6149d6rCSyWSXr(~@l8TdF{XRd=?WmC@+M#CH=YI@LJ821-tbRowJ#FnYF^Lo z2L)spLps{bb_^Pik+oU+>0AAcSY3#B^P1~;F-Za8%qx?&$SJ5GHMYm0b{xvH@iL*lnl6uU@L zgOSxDp8h!=@0rTuo;Yyu$AgJfx<`GGAzeA9B(WH%1V$|2Z0yC#I9q0^?K%P8aDNjJbQ;PU-HlN+Bo0ISi86 zj$7;?4$5#28Ef6d?FQ+Qc$**2Q9wLIe+uD7d*!%+>Awp(oJ=N1 iZQCy2?t!cS7GMCHh8@JLKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0004yNklCRun{HxYdb+@;4ZB}kettQ8uetwx_FGL}zAZl9dB|eEc2XZCf^C?G zEp>TFWsTPp3jGLAs#80qmkP*oM%n_kK~l>YR@;>iy}>S1{eY}MhU zBhb-ZlsNHpXCW3jf@aVJc?741vjMCpYJdE-IM!(Mu7@xK=V4Yts03d^bG;?EZue&Zm?_hXqJ^Jd00000 LNkvXXu0mjf9$)6V literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/libs/webgui/battery_red.png b/lib/ESPiLight/pilight/libs/webgui/battery_red.png new file mode 100644 index 0000000000000000000000000000000000000000..304e14d02e9f84985e3d50baa9de9a7c8f7d467b GIT binary patch literal 3165 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 literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/libs/webgui/illuminance.png b/lib/ESPiLight/pilight/libs/webgui/illuminance.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0392d225ca1cde9efaf465209f1a5270901c1e GIT binary patch literal 610 zcmV-o0-gPdP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUz;7LS5R5(w4Q@cw-VI0+-ph3`sme!y&qM&F9*Ju+G3|w8Jp|RCy z%AutuhZ+RmuY6wL5AcnNg%tQdv_yfMofF;gntI^}m+yDZ`8~e#$z>zHPNy^5Znw4F zZui4rFvLgU{?60s^h&v0UJwuJ_4-aCkto@0wzGb6rBc}hZd)Q)tyWhdV2Q`$=3Fkf z#AKtzX5?`R9x|RJZi*))9JJ_d_LcOBof)rX0uvU*Q2}jp*t~| zOcNk(ffPffH;CSWbce3qTrO9XIbtN_VzH>nWHN`zWOB`7u_yq11o;`Ws!(a3fzH&} z#|y>@5JN1+IK(m!WN7IXgfGOU)oN7&6fG1A*R57dDOTcQ5vLH(5fci9t}xaogq~zL zJV6*S`z{g+wC{(&ErjNH6AYaH2p}i?V)h&khY_RcB;$ZINdb;fDwTG`B>#Cv0b<6Q zYTOc0QEH%mrGabQ8oWjd^NM-ZsZ>fe)QL0_0i#-Ejz;?DMA6E$b3d6j?zb{?B>xj& wf+BY!hv7yp)$jM~8RNG84K4?V(&29N9smFU07*qoM6N<$f}6Mo`~Uy| literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/libs/webgui/images/ajax-loader.gif b/lib/ESPiLight/pilight/libs/webgui/images/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..57f5624e7bce9ace2e91c342025a91eae38fbbf2 GIT binary patch literal 6242 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 DX3o&U literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/libs/webgui/images/icons-18-white.png b/lib/ESPiLight/pilight/libs/webgui/images/icons-18-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3419b81f6a8896807e1e6af0f14c8415fbe39da6 GIT binary patch literal 1988 zcmZ8ieK^zWAO6lJFDb?_VcNWA226zx%qL=ea-kb3gazdA|RA*`5cSHYsmWh9GE@ zi!=2g1R(;leUFhWB^y}i9t{sABWz`x!RtQD4-GO3!Jz03g3g*hDRPe;0+Oe01XC-dYHf<%<{QIEVw)!d=M%aB=lht0sRA1 z5}JT!Q3?O7z|93U%wkXvqe=W9$I&FXoX<@!AL7F0FmRT`d@duMHH7At4-sGzfy5&4 z`2^#_dS?iduW+H-ABs9U(|?lLe+2XLBh$FCHTNf13PoM+wEBa69h0^N4K5AK!?6}? zCt4DG{I?$0ZMVg>$DC9z?Bd?CezP_H(}sdV=8hkDnK{eMpy>^Tf3H5y)y;>spTBzb zHAl2dBwJL;C7(Ug#{U*hPZ2o>DUB+fbykiU))93*u6&lc6f$VioLppWv{QI6_|h(X zSNq2Fk_Sfm_uAiIb-)Q}X?%=a5aJKrBlKfCA7R$EcX#4(b*U@DeO?JB17FUW`qdQO z(OC*%YE>;e2|mZTOu9934XeBz)g#r=Li4+CJ(uO3y{!`y?g-m7OEKoI3K1$b?$@9! z)jXBrf<$w-Xvpm@4Px&IQPSHs3gL-ztq;FH!XqJ^!I1|Vo4mTR=}X8YW)_N||0U6mDdCMfB+~kIkNNgaWR^U#@GKq&$*lzRX3) zjw*`AsnBA^D3Y|vBmN>UgB7FI=Qs&wu()n z1tu}#J5IkYsL8okkc?QK)*5SjKnwag8yo&>TF~qmK_gFRj;N(WOMMH!ZoZiv7PiX$ zuKJwo0S$KQhMBtZ^63qwSz<}x*u?4Dh6W$2cLOaYPhEnGw`jzXapt=%ui1B&-u)sz zATKlCY?AZET^z}GIJ4jExFl%7SsIAdfU;CDu&k+Nn-S@$Ash0URQd(~f-GkG2~!d) zBdIxd26d=*qfft^R=rq#&{~v$h$8D%nq&KXD)x4cyzKOge#EFa!64UGT^^ZL_jOLw z&JPSP7h5VQ|0O^y^jKIB^YZ7MY}mxBUABxuuAE)ST;BYu&>pGLuBl};Ip;7&GI(>) z5$pXbqJx-qt7xk9{Gy@T^rCrpf3c2W*UfXT3Kx)us(&X1U!;(BvZ^jNJbw1);2ZI)DRb5U+8&^dy^q4MaJ&mcu9Nezc=); ztS46xsJMW3EwQV}mQ&VCoXB?jI;xyKh+5HFNbF=If{$Xhjk2*374cX4lC+o#+SIP&`G4>#`K z5>aM_j`;ACt;h90F!SP$m?nB{oyWWnUDw*36#DLzprl*+i)489mzN3PG#OI(Rm$mXwG3faivnnySuMkH(KQ7Lo@UYC`)BAC=a<4=`ftG%RgAjxOV5he`dUcj Wp+wY%7)$WSfLt68P^&3{m;MJcl$Lk^ literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/libs/webgui/images/icons-36-white.png b/lib/ESPiLight/pilight/libs/webgui/images/icons-36-white.png new file mode 100644 index 0000000000000000000000000000000000000000..12455c907a4f40205e89e0ff841cde2be105cf50 GIT binary patch literal 3861 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 literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/libs/webgui/index.html b/lib/ESPiLight/pilight/libs/webgui/index.html new file mode 100644 index 0000000..e35892f --- /dev/null +++ b/lib/ESPiLight/pilight/libs/webgui/index.html @@ -0,0 +1,31 @@ + + + + +pilight webgui + + + + + + + + + + + + + + + + + + +
        + +
        +
        +
        +
        + + diff --git a/lib/ESPiLight/pilight/libs/webgui/jquery-2.1.4.min.js b/lib/ESPiLight/pilight/libs/webgui/jquery-2.1.4.min.js new file mode 100644 index 0000000..49990d6 --- /dev/null +++ b/lib/ESPiLight/pilight/libs/webgui/jquery-2.1.4.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="
        ",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){ +return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*\s*$/g,ia={option:[1,""],thead:[1,"","
        "],col:[2,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("

        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 literal 0 HcmV?d00001 diff --git a/lib/ESPiLight/pilight/docs/source/images/soldering/7.jpg b/lib/ESPiLight/pilight/docs/source/images/soldering/7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..51727a9cdc6abbc5825fb4f2bf325245a29658bc GIT binary patch literal 412289 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%0DxVXzvCta2dMtc2veJFE4GWValX3|9 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

  • KO+J`JB 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�dNLN5M6pzeopLceXxKE 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�(2H@ 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 hY62hPGPz? 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