From 73906fbe73922a6f42b8490ac268a5516745eacd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Wed, 23 May 2018 19:29:10 +0200 Subject: [PATCH 01/22] Initial support for JustWifi v2 --- README.md | 6 ++-- code/espurna/config/general.h | 13 +++----- code/espurna/wifi.ino | 61 ++++++++++++++++++++++++++++++++--- code/platformio.ini | 2 +- 4 files changed, 65 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 4732fbda..fa37e576 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ ESPurna ("spark" in Catalan) is a custom firmware for ESP8285/ESP8266 based smar It uses the Arduino Core for ESP8266 framework and a number of 3rd party libraries. [![version](https://img.shields.io/badge/version-1.12.6-brightgreen.svg)](CHANGELOG.md) -[![branch](https://img.shields.io/badge/branch-dev-orange.svg)](https://github.org/xoseperez/espurna/tree/dev/) -[![travis](https://travis-ci.org/xoseperez/espurna.svg?branch=dev)](https://travis-ci.org/xoseperez/espurna) -[![codacy](https://img.shields.io/codacy/grade/c9496e25cf07434cba786b462cb15f49/dev.svg)](https://www.codacy.com/app/xoseperez/espurna/dashboard) +[![branch](https://img.shields.io/badge/branch-justwifi2-orange.svg)](https://github.org/xoseperez/espurna/tree/justwifi2/) +[![travis](https://travis-ci.org/xoseperez/espurna.svg?branch=justwifi2)](https://travis-ci.org/xoseperez/espurna) +[![codacy](https://img.shields.io/codacy/grade/c9496e25cf07434cba786b462cb15f49/justwifi2.svg)](https://www.codacy.com/app/xoseperez/espurna/dashboard) [![license](https://img.shields.io/github/license/xoseperez/espurna.svg)](LICENSE)
[![donate](https://img.shields.io/badge/donate-PayPal-blue.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=xose%2eperez%40gmail%2ecom&lc=US&no_note=0¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHostedGuest) diff --git a/code/espurna/config/general.h b/code/espurna/config/general.h index 245792aa..f8e9a7b9 100644 --- a/code/espurna/config/general.h +++ b/code/espurna/config/general.h @@ -276,9 +276,6 @@ #define WIFI_AP_CAPTIVE 1 // Captive portal enabled when in AP mode #endif -#ifndef WIFI_AP_MODE -#define WIFI_AP_MODE AP_MODE_ALONE -#endif #ifndef WIFI_SLEEP_MODE #define WIFI_SLEEP_MODE WIFI_NONE_SLEEP // WIFI_NONE_SLEEP, WIFI_LIGHT_SLEEP or WIFI_MODEM_SLEEP @@ -1148,13 +1145,13 @@ #if IR_BUTTON_SET == 3 /* +------+------+------+ - | 1 | 2 | 3 | + | 1 | 2 | 3 | +------+------+------+ - | 4 | 5 | 6 | + | 4 | 5 | 6 | +------+------+------+ - | 7 | 8 | 9 | + | 7 | 8 | 9 | +------+------+------+ - | | 0 | | + | | 0 | | +------+------+------+ */ #define IR_BUTTON_COUNT 10 @@ -1164,7 +1161,7 @@ { 0xE0E020DF, IR_BUTTON_MODE_TOGGLE, 0 }, // Toggle Relay #0 { 0xE0E0A05F, IR_BUTTON_MODE_TOGGLE, 1 }, // Toggle Relay #1 { 0xE0E0609F, IR_BUTTON_MODE_TOGGLE, 2 }, // Toggle Relay #2 - + { 0xE0E010EF, IR_BUTTON_MODE_TOGGLE, 3 }, // Toggle Relay #3 { 0xE0E0906F, IR_BUTTON_MODE_TOGGLE, 4 }, // Toggle Relay #4 { 0xE0E050AF, IR_BUTTON_MODE_TOGGLE, 5 }, // Toggle Relay #5 diff --git a/code/espurna/wifi.ino b/code/espurna/wifi.ino index 8fc2e23f..4e8c00af 100644 --- a/code/espurna/wifi.ino +++ b/code/espurna/wifi.ino @@ -25,7 +25,7 @@ void _wifiConfigure() { #endif jw.setConnectTimeout(WIFI_CONNECT_TIMEOUT); wifiReconnectCheck(); - jw.setAPMode(WIFI_AP_MODE); + jw.enableAPFailsafe(true); jw.cleanNetworks(); // If system is flagged unstable we do not init wifi networks @@ -196,6 +196,31 @@ void _wifiInject() { } } +void _wifiWPS(justwifi_messages_t code, char * parameter) { + + if (MESSAGE_WPS_SUCCESS == code) { + + String ssid = WiFi.SSID(); + String pass = WiFi.psk(); + + // Look for the same SSID + uint8_t count = 0; + while (count < WIFI_MAX_NETWORKS) { + if (!hasSetting("ssid", count)) break; + if (getSetting("ssid", count).equals(ssid)) break; + count++; + } + + // If we have reached the max we overwrite the first one + if (WIFI_MAX_NETWORKS == count) count = 0; + + setSetting("ssid", count, ssid); + setSetting("pass", count, pass); + + } + +} + #if WIFI_AP_CAPTIVE #include "DNSServer.h" @@ -223,6 +248,8 @@ void _wifiCaptivePortal(justwifi_messages_t code, char * parameter) { void _wifiDebug(justwifi_messages_t code, char * parameter) { + // ------------------------------------------------------------------------- + if (code == MESSAGE_SCANNING) { DEBUG_MSG_P(PSTR("[WIFI] Scanning\n")); } @@ -243,6 +270,8 @@ void _wifiDebug(justwifi_messages_t code, char * parameter) { DEBUG_MSG_P(PSTR("[WIFI] %s\n"), parameter); } + // ------------------------------------------------------------------------- + if (code == MESSAGE_CONNECTING) { DEBUG_MSG_P(PSTR("[WIFI] Connecting to %s\n"), parameter); } @@ -259,22 +288,38 @@ void _wifiDebug(justwifi_messages_t code, char * parameter) { wifiStatus(); } - if (code == MESSAGE_ACCESSPOINT_CREATED) { - wifiStatus(); - } - if (code == MESSAGE_DISCONNECTED) { DEBUG_MSG_P(PSTR("[WIFI] Disconnected\n")); } + // ------------------------------------------------------------------------- + if (code == MESSAGE_ACCESSPOINT_CREATING) { DEBUG_MSG_P(PSTR("[WIFI] Creating access point\n")); } + if (code == MESSAGE_ACCESSPOINT_CREATED) { + wifiStatus(); + } + if (code == MESSAGE_ACCESSPOINT_FAILED) { DEBUG_MSG_P(PSTR("[WIFI] Could not create access point\n")); } + // ------------------------------------------------------------------------- + + if (code == MESSAGE_WPS_START) { + DEBUG_MSG_P(PSTR("[WIFI] WPS started\n")); + } + + if (code == MESSAGE_WPS_SUCCESS) { + DEBUG_MSG_P(PSTR("[WIFI] WPS succeded!\n")); + } + + if (code == MESSAGE_WPS_ERROR) { + DEBUG_MSG_P(PSTR("[WIFI] WPS failed\n")); + } + } #endif // DEBUG_SUPPORT @@ -298,6 +343,11 @@ void _wifiInitCommands() { DEBUG_MSG_P(PSTR("+OK\n")); }); + settingsRegisterCommand(F("WIFI.WPS"), [](Embedis* e) { + jw.startWPS(); + DEBUG_MSG_P(PSTR("+OK\n")); + }); + settingsRegisterCommand(F("WIFI.SCAN"), [](Embedis* e) { _wifiScan(); DEBUG_MSG_P(PSTR("+OK\n")); @@ -445,6 +495,7 @@ void wifiSetup() { _wifiConfigure(); // Message callbacks + wifiRegister(_wifiWPS); #if WIFI_AP_CAPTIVE wifiRegister(_wifiCaptivePortal); #endif diff --git a/code/platformio.ini b/code/platformio.ini index 384223a2..c9efef0f 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -64,7 +64,7 @@ lib_deps = https://bitbucket.org/xoseperez/fauxmoesp.git#2.4.2 https://github.com/xoseperez/hlw8012.git#1.1.0 https://github.com/markszabo/IRremoteESP8266#v2.2.0 - https://github.com/xoseperez/justwifi.git#1.2.0 + https://github.com/xoseperez/justwifi.git#v2 https://github.com/madpilot/mDNSResolver#4cfcda1 https://github.com/xoseperez/my92xx#3.0.1 https://bitbucket.org/xoseperez/nofuss.git#0.2.5 From e6570fe1bb580a24be23e215857372b1b392c108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Wed, 23 May 2018 22:15:38 +0200 Subject: [PATCH 02/22] Triple click to enter WPS mode, fast LED blinking --- code/espurna/button.ino | 30 ++++++++++-------- code/espurna/config/defaults.h | 25 +++++++++++++++ code/espurna/config/types.h | 11 +++++++ code/espurna/led.ino | 58 ++++++++++++++++++---------------- code/espurna/settings.ino | 2 +- code/espurna/telnet.ino | 2 +- code/espurna/wifi.ino | 37 ++++++++++++++++++---- 7 files changed, 115 insertions(+), 50 deletions(-) diff --git a/code/espurna/button.ino b/code/espurna/button.ino index e85fba43..5e5927ce 100644 --- a/code/espurna/button.ino +++ b/code/espurna/button.ino @@ -60,16 +60,18 @@ unsigned char buttonAction(unsigned char id, unsigned char event) { if (event == BUTTON_EVENT_DBLCLICK) return (actions >> 8) & 0x0F; if (event == BUTTON_EVENT_LNGCLICK) return (actions >> 12) & 0x0F; if (event == BUTTON_EVENT_LNGLNGCLICK) return (actions >> 16) & 0x0F; + if (event == BUTTON_EVENT_TRIPLECLICK) return (actions >> 20) & 0x0F; return BUTTON_MODE_NONE; } -unsigned long buttonStore(unsigned long pressed, unsigned long click, unsigned long dblclick, unsigned long lngclick, unsigned long lnglngclick) { +unsigned long buttonStore(unsigned long pressed, unsigned long click, unsigned long dblclick, unsigned long lngclick, unsigned long lnglngclick, unsigned long tripleclick) { unsigned int value; value = pressed; value += click << 4; value += dblclick << 8; value += lngclick << 12; value += lnglngclick << 16; + value += tripleclick << 20; return value; } @@ -77,12 +79,13 @@ uint8_t mapEvent(uint8_t event, uint8_t count, uint16_t length) { if (event == EVENT_PRESSED) return BUTTON_EVENT_PRESSED; if (event == EVENT_CHANGED) return BUTTON_EVENT_CLICK; if (event == EVENT_RELEASED) { - if (count == 1) { + if (1 == count) { if (length > BUTTON_LNGLNGCLICK_DELAY) return BUTTON_EVENT_LNGLNGCLICK; if (length > BUTTON_LNGCLICK_DELAY) return BUTTON_EVENT_LNGCLICK; return BUTTON_EVENT_CLICK; } - if (count == 2) return BUTTON_EVENT_DBLCLICK; + if (2 == count) return BUTTON_EVENT_DBLCLICK; + if (3 == count) return BUTTON_EVENT_TRIPLECLICK; } return BUTTON_EVENT_NONE; } @@ -113,7 +116,8 @@ void buttonEvent(unsigned int id, unsigned char event) { relayStatus(_buttons[id].relayID - 1, false); } } - if (action == BUTTON_MODE_AP) createAP(); + if (action == BUTTON_MODE_AP) wifiStartAP(); + if (action == BUTTON_MODE_WPS) wifiStartWPS(); if (action == BUTTON_MODE_RESET) { deferredReset(100, CUSTOM_RESET_HARDWARE); } @@ -129,7 +133,7 @@ void buttonSetup() { #ifdef ITEAD_SONOFF_DUAL - unsigned int actions = buttonStore(BUTTON_MODE_NONE, BUTTON_MODE_TOGGLE, BUTTON_MODE_NONE, BUTTON_MODE_NONE, BUTTON_MODE_NONE); + unsigned int actions = buttonStore(BUTTON_MODE_NONE, BUTTON_MODE_TOGGLE, BUTTON_MODE_NONE, BUTTON_MODE_NONE, BUTTON_MODE_NONE, BUTTON_MODE_NONE); _buttons.push_back({new DebounceEvent(0, BUTTON_PUSHBUTTON), actions, 1}); _buttons.push_back({new DebounceEvent(0, BUTTON_PUSHBUTTON), actions, 2}); _buttons.push_back({new DebounceEvent(0, BUTTON_PUSHBUTTON), actions, BUTTON3_RELAY}); @@ -140,49 +144,49 @@ void buttonSetup() { #if BUTTON1_PIN != GPIO_NONE { - unsigned int actions = buttonStore(BUTTON1_PRESS, BUTTON1_CLICK, BUTTON1_DBLCLICK, BUTTON1_LNGCLICK, BUTTON1_LNGLNGCLICK); + unsigned int actions = buttonStore(BUTTON1_PRESS, BUTTON1_CLICK, BUTTON1_DBLCLICK, BUTTON1_LNGCLICK, BUTTON1_LNGLNGCLICK, BUTTON1_TRIPLECLICK); _buttons.push_back({new DebounceEvent(BUTTON1_PIN, BUTTON1_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON1_RELAY}); } #endif #if BUTTON2_PIN != GPIO_NONE { - unsigned int actions = buttonStore(BUTTON2_PRESS, BUTTON2_CLICK, BUTTON2_DBLCLICK, BUTTON2_LNGCLICK, BUTTON2_LNGLNGCLICK); + unsigned int actions = buttonStore(BUTTON2_PRESS, BUTTON2_CLICK, BUTTON2_DBLCLICK, BUTTON2_LNGCLICK, BUTTON2_LNGLNGCLICK, BUTTON2_TRIPLECLICK); _buttons.push_back({new DebounceEvent(BUTTON2_PIN, BUTTON2_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON2_RELAY}); } #endif #if BUTTON3_PIN != GPIO_NONE { - unsigned int actions = buttonStore(BUTTON3_PRESS, BUTTON3_CLICK, BUTTON3_DBLCLICK, BUTTON3_LNGCLICK, BUTTON3_LNGLNGCLICK); + unsigned int actions = buttonStore(BUTTON3_PRESS, BUTTON3_CLICK, BUTTON3_DBLCLICK, BUTTON3_LNGCLICK, BUTTON3_LNGLNGCLICK, BUTTON3_TRIPLECLICK); _buttons.push_back({new DebounceEvent(BUTTON3_PIN, BUTTON3_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON3_RELAY}); } #endif #if BUTTON4_PIN != GPIO_NONE { - unsigned int actions = buttonStore(BUTTON4_PRESS, BUTTON4_CLICK, BUTTON4_DBLCLICK, BUTTON4_LNGCLICK, BUTTON4_LNGLNGCLICK); + unsigned int actions = buttonStore(BUTTON4_PRESS, BUTTON4_CLICK, BUTTON4_DBLCLICK, BUTTON4_LNGCLICK, BUTTON4_LNGLNGCLICK, BUTTON4_TRIPLECLICK); _buttons.push_back({new DebounceEvent(BUTTON4_PIN, BUTTON4_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON4_RELAY}); } #endif #if BUTTON5_PIN != GPIO_NONE { - unsigned int actions = buttonStore(BUTTON5_PRESS, BUTTON5_CLICK, BUTTON5_DBLCLICK, BUTTON5_LNGCLICK, BUTTON5_LNGLNGCLICK); + unsigned int actions = buttonStore(BUTTON5_PRESS, BUTTON5_CLICK, BUTTON5_DBLCLICK, BUTTON5_LNGCLICK, BUTTON5_LNGLNGCLICK, BUTTON5_TRIPLECLICK); _buttons.push_back({new DebounceEvent(BUTTON5_PIN, BUTTON5_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON5_RELAY}); } #endif #if BUTTON6_PIN != GPIO_NONE { - unsigned int actions = buttonStore(BUTTON6_PRESS, BUTTON6_CLICK, BUTTON6_DBLCLICK, BUTTON6_LNGCLICK, BUTTON6_LNGLNGCLICK); + unsigned int actions = buttonStore(BUTTON6_PRESS, BUTTON6_CLICK, BUTTON6_DBLCLICK, BUTTON6_LNGCLICK, BUTTON6_LNGLNGCLICK, BUTTON6_TRIPLECLICK); _buttons.push_back({new DebounceEvent(BUTTON6_PIN, BUTTON6_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON6_RELAY}); } #endif #if BUTTON7_PIN != GPIO_NONE { - unsigned int actions = buttonStore(BUTTON7_PRESS, BUTTON7_CLICK, BUTTON7_DBLCLICK, BUTTON7_LNGCLICK, BUTTON7_LNGLNGCLICK); + unsigned int actions = buttonStore(BUTTON7_PRESS, BUTTON7_CLICK, BUTTON7_DBLCLICK, BUTTON7_LNGCLICK, BUTTON7_LNGLNGCLICK, BUTTON7_TRIPLECLICK); _buttons.push_back({new DebounceEvent(BUTTON7_PIN, BUTTON7_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON7_RELAY}); } #endif #if BUTTON8_PIN != GPIO_NONE { - unsigned int actions = buttonStore(BUTTON8_PRESS, BUTTON8_CLICK, BUTTON8_DBLCLICK, BUTTON8_LNGCLICK, BUTTON8_LNGLNGCLICK); + unsigned int actions = buttonStore(BUTTON8_PRESS, BUTTON8_CLICK, BUTTON8_DBLCLICK, BUTTON8_LNGCLICK, BUTTON8_LNGLNGCLICK, BUTTON8_TRIPLECLICK); _buttons.push_back({new DebounceEvent(BUTTON8_PIN, BUTTON8_MODE, BUTTON_DEBOUNCE_DELAY, btnDelay), actions, BUTTON8_RELAY}); } #endif diff --git a/code/espurna/config/defaults.h b/code/espurna/config/defaults.h index 8a5a37f2..5e4a85be 100644 --- a/code/espurna/config/defaults.h +++ b/code/espurna/config/defaults.h @@ -108,6 +108,31 @@ #define BUTTON8_DBLCLICK BUTTON_MODE_NONE #endif +#ifndef BUTTON1_TRIPLECLICK +#define BUTTON1_TRIPLECLICK BUTTON_MODE_WPS +#endif +#ifndef BUTTON2_TRIPLECLICK +#define BUTTON2_TRIPLECLICK BUTTON_MODE_NONE +#endif +#ifndef BUTTON3_TRIPLECLICK +#define BUTTON3_TRIPLECLICK BUTTON_MODE_NONE +#endif +#ifndef BUTTON4_TRIPLECLICK +#define BUTTON4_TRIPLECLICK BUTTON_MODE_NONE +#endif +#ifndef BUTTON5_TRIPLECLICK +#define BUTTON5_TRIPLECLICK BUTTON_MODE_NONE +#endif +#ifndef BUTTON6_TRIPLECLICK +#define BUTTON6_TRIPLECLICK BUTTON_MODE_NONE +#endif +#ifndef BUTTON7_TRIPLECLICK +#define BUTTON7_TRIPLECLICK BUTTON_MODE_NONE +#endif +#ifndef BUTTON8_TRIPLECLICK +#define BUTTON8_TRIPLECLICK BUTTON_MODE_NONE +#endif + #ifndef BUTTON1_LNGCLICK #define BUTTON1_LNGCLICK BUTTON_MODE_RESET #endif diff --git a/code/espurna/config/types.h b/code/espurna/config/types.h index 9d10c62a..981aa78d 100644 --- a/code/espurna/config/types.h +++ b/code/espurna/config/types.h @@ -3,6 +3,15 @@ // Do not touch this definitions //------------------------------------------------------------------------------ +// ----------------------------------------------------------------------------- +// WIFI +// ----------------------------------------------------------------------------- + +#define WIFI_STATE_AP 1 +#define WIFI_STATE_STA 2 +#define WIFI_STATE_AP_STA 3 +#define WIFI_STATE_WPS 4 + //------------------------------------------------------------------------------ // BUTTONS //------------------------------------------------------------------------------ @@ -14,6 +23,7 @@ #define BUTTON_EVENT_DBLCLICK 3 #define BUTTON_EVENT_LNGCLICK 4 #define BUTTON_EVENT_LNGLNGCLICK 5 +#define BUTTON_EVENT_TRIPLECLICK 6 #define BUTTON_MODE_NONE 0 #define BUTTON_MODE_TOGGLE 1 @@ -23,6 +33,7 @@ #define BUTTON_MODE_RESET 5 #define BUTTON_MODE_PULSE 6 #define BUTTON_MODE_FACTORY 7 +#define BUTTON_MODE_WPS 8 // Needed for ESP8285 boards under Windows using PlatformIO (?) #ifndef BUTTON_PUSHBUTTON diff --git a/code/espurna/led.ino b/code/espurna/led.ino index b93013f8..30b6aaa6 100644 --- a/code/espurna/led.ino +++ b/code/espurna/led.ino @@ -182,16 +182,18 @@ void ledSetup() { void ledLoop() { + uint8_t wifi_state = wifiState(); + for (unsigned char i=0; i<_leds.size(); i++) { if (_ledMode(i) == LED_MODE_WIFI) { - if (wifiConnected()) { - if (WiFi.getMode() == WIFI_AP) { - _ledBlink(i, 900, 100); - } else { - _ledBlink(i, 4900, 100); - } + if (wifi_state & WIFI_STATE_WPS) { + _ledBlink(i, 100, 100); + } else if (wifi_state & WIFI_STATE_STA) { + _ledBlink(i, 4900, 100); + } else if (wifi_state & WIFI_STATE_AP) { + _ledBlink(i, 900, 100); } else { _ledBlink(i, 500, 500); } @@ -200,19 +202,19 @@ void ledLoop() { if (_ledMode(i) == LED_MODE_FINDME_WIFI) { - if (wifiConnected()) { + if (wifi_state & WIFI_STATE_WPS) { + _ledBlink(i, 100, 100); + } else if (wifi_state & WIFI_STATE_STA) { if (relayStatus(_leds[i].relay-1)) { - if (WiFi.getMode() == WIFI_AP) { - _ledBlink(i, 900, 100); - } else { - _ledBlink(i, 4900, 100); - } + _ledBlink(i, 4900, 100); } else { - if (WiFi.getMode() == WIFI_AP) { - _ledBlink(i, 100, 900); - } else { - _ledBlink(i, 100, 4900); - } + _ledBlink(i, 100, 4900); + } + } else if (wifi_state & WIFI_STATE_AP) { + if (relayStatus(_leds[i].relay-1)) { + _ledBlink(i, 900, 100); + } else { + _ledBlink(i, 100, 900); } } else { _ledBlink(i, 500, 500); @@ -222,19 +224,19 @@ void ledLoop() { if (_ledMode(i) == LED_MODE_RELAY_WIFI) { - if (wifiConnected()) { + if (wifi_state & WIFI_STATE_WPS) { + _ledBlink(i, 100, 100); + } else if (wifi_state & WIFI_STATE_STA) { if (relayStatus(_leds[i].relay-1)) { - if (WiFi.getMode() == WIFI_AP) { - _ledBlink(i, 100, 900); - } else { - _ledBlink(i, 100, 4900); - } + _ledBlink(i, 100, 4900); } else { - if (WiFi.getMode() == WIFI_AP) { - _ledBlink(i, 900, 100); - } else { - _ledBlink(i, 4900, 100); - } + _ledBlink(i, 4900, 100); + } + } else if (wifi_state & WIFI_STATE_AP) { + if (relayStatus(_leds[i].relay-1)) { + _ledBlink(i, 100, 900); + } else { + _ledBlink(i, 900, 100); } } else { _ledBlink(i, 500, 500); diff --git a/code/espurna/settings.ino b/code/espurna/settings.ino index ce98370a..72654514 100644 --- a/code/espurna/settings.ino +++ b/code/espurna/settings.ino @@ -257,7 +257,7 @@ void _settingsInitCommands() { settingsRegisterCommand(F("INFO"), [](Embedis* e) { info(); - wifiStatus(); + wifiDebug(); //StreamString s; //WiFi.printDiag(s); //DEBUG_MSG(s.c_str()); diff --git a/code/espurna/telnet.ino b/code/espurna/telnet.ino index 006d5d21..4f858ab4 100644 --- a/code/espurna/telnet.ino +++ b/code/espurna/telnet.ino @@ -138,7 +138,7 @@ void _telnetNewClient(AsyncClient *client) { // If there is no terminal support automatically dump info and crash data #if TERMINAL_SUPPORT == 0 info(); - wifiStatus(); + wifiDebug(); debugDumpCrashInfo(); debugClearCrashInfo(); #endif diff --git a/code/espurna/wifi.ino b/code/espurna/wifi.ino index 4e8c00af..32c7e139 100644 --- a/code/espurna/wifi.ino +++ b/code/espurna/wifi.ino @@ -10,6 +10,7 @@ Copyright (C) 2016-2018 by Xose PĂ©rez #include uint32_t _wifi_scan_client_id = 0; +bool _wifi_wps_running = false; // ----------------------------------------------------------------------------- // PRIVATE @@ -198,6 +199,14 @@ void _wifiInject() { void _wifiWPS(justwifi_messages_t code, char * parameter) { + if (MESSAGE_WPS_START == code) { + _wifi_wps_running = true; + } + + if (MESSAGE_WPS_ERROR == code) { + _wifi_wps_running = false; + } + if (MESSAGE_WPS_SUCCESS == code) { String ssid = WiFi.SSID(); @@ -207,7 +216,7 @@ void _wifiWPS(justwifi_messages_t code, char * parameter) { uint8_t count = 0; while (count < WIFI_MAX_NETWORKS) { if (!hasSetting("ssid", count)) break; - if (getSetting("ssid", count).equals(ssid)) break; + if (ssid.equals(getSetting("ssid", count, ""))) break; count++; } @@ -217,6 +226,8 @@ void _wifiWPS(justwifi_messages_t code, char * parameter) { setSetting("ssid", count, ssid); setSetting("pass", count, pass); + _wifi_wps_running = false; + } } @@ -285,7 +296,7 @@ void _wifiDebug(justwifi_messages_t code, char * parameter) { } if (code == MESSAGE_CONNECTED) { - wifiStatus(); + wifiDebug(); } if (code == MESSAGE_DISCONNECTED) { @@ -299,7 +310,7 @@ void _wifiDebug(justwifi_messages_t code, char * parameter) { } if (code == MESSAGE_ACCESSPOINT_CREATED) { - wifiStatus(); + wifiDebug(); } if (code == MESSAGE_ACCESSPOINT_FAILED) { @@ -339,12 +350,12 @@ void _wifiInitCommands() { }); settingsRegisterCommand(F("WIFI.AP"), [](Embedis* e) { - createAP(); + wifiStartAP(); DEBUG_MSG_P(PSTR("+OK\n")); }); settingsRegisterCommand(F("WIFI.WPS"), [](Embedis* e) { - jw.startWPS(); + wifiStartWPS(); DEBUG_MSG_P(PSTR("+OK\n")); }); @@ -422,12 +433,16 @@ void wifiDisconnect() { jw.disconnect(); } -bool createAP() { +bool wifiStartAP() { jw.disconnect(); jw.resetReconnectTimeout(); return jw.createAP(); } +void wifiStartWPS() { + jw.startWPS(); +} + void wifiReconnectCheck() { bool connected = false; #if WEB_SUPPORT @@ -439,7 +454,15 @@ void wifiReconnectCheck() { jw.setReconnectTimeout(connected ? 0 : WIFI_RECONNECT_INTERVAL); } -void wifiStatus() { +uint8_t wifiState() { + uint8_t state = 0; + if (jw.connected()) state += WIFI_STATE_STA; + if (jw.connectable()) state += WIFI_STATE_AP; + if (_wifi_wps_running) state += WIFI_STATE_WPS; + return state; +} + +void wifiDebug() { if (WiFi.getMode() == WIFI_AP_STA) { DEBUG_MSG_P(PSTR("[WIFI] MODE AP + STA --------------------------------\n")); From aa585ec2cc870af0ab90b3f85c540ffb16e05745 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Thu, 24 May 2018 09:18:44 +0200 Subject: [PATCH 03/22] Link IP in status page --- code/espurna/data/index.html.gz | Bin 64827 -> 64861 bytes code/espurna/static/index.html.gz.h | 5398 ++++++++++++++------------- code/html/custom.js | 7 +- code/html/index.html | 2 +- 4 files changed, 2707 insertions(+), 2700 deletions(-) diff --git a/code/espurna/data/index.html.gz b/code/espurna/data/index.html.gz index c3579344d94934ffe8d6c8a200940de93591442e..a83262da6cf5aa4b6bf7b23cfe89f655c07c810e 100644 GIT binary patch delta 54269 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 GZvy~z^af%8 delta 54264 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

l#bqOxS|gX@9HkH%*V;o)#CK~7 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

IP
-
+
Free heap
From ad88f656c9804c6091737dc748d93c72213fb166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Thu, 24 May 2018 09:18:59 +0200 Subject: [PATCH 04/22] Check if we should destroy AP --- code/espurna/config/types.h | 3 ++ code/espurna/wifi.ino | 71 ++++++++++++++++++++++++++----------- 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/code/espurna/config/types.h b/code/espurna/config/types.h index 981aa78d..dbd0b23f 100644 --- a/code/espurna/config/types.h +++ b/code/espurna/config/types.h @@ -12,6 +12,9 @@ #define WIFI_STATE_AP_STA 3 #define WIFI_STATE_WPS 4 +#define WIFI_AP_ALLWAYS 1 +#define WIFI_AP_FALLBACK 2 + //------------------------------------------------------------------------------ // BUTTONS //------------------------------------------------------------------------------ diff --git a/code/espurna/wifi.ino b/code/espurna/wifi.ino index 32c7e139..abba9596 100644 --- a/code/espurna/wifi.ino +++ b/code/espurna/wifi.ino @@ -11,11 +11,28 @@ Copyright (C) 2016-2018 by Xose PĂ©rez uint32_t _wifi_scan_client_id = 0; bool _wifi_wps_running = false; +uint8_t _wifi_ap_mode = WIFI_AP_FALLBACK; // ----------------------------------------------------------------------------- // PRIVATE // ----------------------------------------------------------------------------- +void _wifiCheckAP() { + + static unsigned long last = 0; + if (millis() - last < 60000) return; + last = millis(); + + if ((WIFI_AP_FALLBACK == _wifi_ap_mode) && + jw.connected() && + jw.connectable() && + (WiFi.softAPgetStationNum() == 0) + ) { + jw.destroyAP(); + } + +} + void _wifiConfigure() { jw.setHostname(getSetting("hostname").c_str()); @@ -26,9 +43,11 @@ void _wifiConfigure() { #endif jw.setConnectTimeout(WIFI_CONNECT_TIMEOUT); wifiReconnectCheck(); - jw.enableAPFailsafe(true); + jw.enableAPFallback(true); jw.cleanNetworks(); + _wifi_ap_mode = getSetting("apmode", WIFI_AP_FALLBACK).toInt(); + // If system is flagged unstable we do not init wifi networks #if SYSTEM_CHECK_ENABLED if (!systemCheck()) return; @@ -197,7 +216,7 @@ void _wifiInject() { } } -void _wifiWPS(justwifi_messages_t code, char * parameter) { +void _wifiCallback(justwifi_messages_t code, char * parameter) { if (MESSAGE_WPS_START == code) { _wifi_wps_running = true; @@ -301,6 +320,7 @@ void _wifiDebug(justwifi_messages_t code, char * parameter) { if (code == MESSAGE_DISCONNECTED) { DEBUG_MSG_P(PSTR("[WIFI] Disconnected\n")); + wifiDebug(); } // ------------------------------------------------------------------------- @@ -317,6 +337,11 @@ void _wifiDebug(justwifi_messages_t code, char * parameter) { DEBUG_MSG_P(PSTR("[WIFI] Could not create access point\n")); } + if (code == MESSAGE_ACCESSPOINT_DESTROYED) { + DEBUG_MSG_P(PSTR("[WIFI] Access point destroyed\n")); + wifiDebug(); + } + // ------------------------------------------------------------------------- if (code == MESSAGE_WPS_START) { @@ -464,26 +489,10 @@ uint8_t wifiState() { void wifiDebug() { - if (WiFi.getMode() == WIFI_AP_STA) { - DEBUG_MSG_P(PSTR("[WIFI] MODE AP + STA --------------------------------\n")); - } else if (WiFi.getMode() == WIFI_AP) { - DEBUG_MSG_P(PSTR("[WIFI] MODE AP --------------------------------------\n")); - } else if (WiFi.getMode() == WIFI_STA) { - DEBUG_MSG_P(PSTR("[WIFI] MODE STA -------------------------------------\n")); - } else { - DEBUG_MSG_P(PSTR("[WIFI] MODE OFF -------------------------------------\n")); - DEBUG_MSG_P(PSTR("[WIFI] No connection\n")); - } + if (WiFi.getMode() & WIFI_STA) { - if ((WiFi.getMode() & WIFI_AP) == WIFI_AP) { - DEBUG_MSG_P(PSTR("[WIFI] SSID %s\n"), jw.getAPSSID().c_str()); - DEBUG_MSG_P(PSTR("[WIFI] PASS %s\n"), getSetting("adminPass", ADMIN_PASS).c_str()); - DEBUG_MSG_P(PSTR("[WIFI] IP %s\n"), WiFi.softAPIP().toString().c_str()); - DEBUG_MSG_P(PSTR("[WIFI] MAC %s\n"), WiFi.softAPmacAddress().c_str()); - } - - if ((WiFi.getMode() & WIFI_STA) == WIFI_STA) { uint8_t * bssid = WiFi.BSSID(); + DEBUG_MSG_P(PSTR("[WIFI] ------------------------------------- MODE STA\n")); DEBUG_MSG_P(PSTR("[WIFI] SSID %s\n"), WiFi.SSID().c_str()); DEBUG_MSG_P(PSTR("[WIFI] IP %s\n"), WiFi.localIP().toString().c_str()); DEBUG_MSG_P(PSTR("[WIFI] MAC %s\n"), WiFi.macAddress().c_str()); @@ -496,6 +505,20 @@ void wifiDebug() { ); DEBUG_MSG_P(PSTR("[WIFI] CH %d\n"), WiFi.channel()); DEBUG_MSG_P(PSTR("[WIFI] RSSI %d\n"), WiFi.RSSI()); + + } + + if (WiFi.getMode() & WIFI_AP) { + DEBUG_MSG_P(PSTR("[WIFI] -------------------------------------- MODE AP\n")); + DEBUG_MSG_P(PSTR("[WIFI] SSID %s\n"), jw.getAPSSID().c_str()); + DEBUG_MSG_P(PSTR("[WIFI] PASS %s\n"), getSetting("adminPass", ADMIN_PASS).c_str()); + DEBUG_MSG_P(PSTR("[WIFI] IP %s\n"), WiFi.softAPIP().toString().c_str()); + DEBUG_MSG_P(PSTR("[WIFI] MAC %s\n"), WiFi.softAPmacAddress().c_str()); + } + + if (WiFi.getMode() == 0) { + DEBUG_MSG_P(PSTR("[WIFI] ------------------------------------- MODE OFF\n")); + DEBUG_MSG_P(PSTR("[WIFI] No connection\n")); } DEBUG_MSG_P(PSTR("[WIFI] ----------------------------------------------\n")); @@ -518,7 +541,7 @@ void wifiSetup() { _wifiConfigure(); // Message callbacks - wifiRegister(_wifiWPS); + wifiRegister(_wifiCallback); #if WIFI_AP_CAPTIVE wifiRegister(_wifiCaptivePortal); #endif @@ -544,17 +567,23 @@ void wifiSetup() { void wifiLoop() { + // Main wifi loop jw.loop(); + // Process captrive portal DNS queries if in AP mode only #if WIFI_AP_CAPTIVE if ((WiFi.getMode() & WIFI_AP) == WIFI_AP) { _wifi_dnsServer.processNextRequest(); } #endif + // Do we have a pending scan? if (_wifi_scan_client_id > 0) { _wifiScan(_wifi_scan_client_id); _wifi_scan_client_id = 0; } + // Check if we should disable AP + _wifiCheckAP(); + } From 1f39e225c90e3ba6f16dea0e187c247cb6947b35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Fri, 25 May 2018 10:16:13 +0200 Subject: [PATCH 05/22] Refactor wifi debug messages --- code/espurna/mdns.ino | 2 +- code/espurna/wifi.ino | 60 +++++++++++++++++++++++++++---------------- 2 files changed, 39 insertions(+), 23 deletions(-) diff --git a/code/espurna/mdns.ino b/code/espurna/mdns.ino index c82f328a..162f6319 100644 --- a/code/espurna/mdns.ino +++ b/code/espurna/mdns.ino @@ -28,7 +28,7 @@ void _mdnsFindMQTT() { #endif void _mdnsServerStart() { - if (MDNS.begin(WiFi.getMode() == WIFI_AP ? APP_NAME : (char *) WiFi.hostname().c_str())) { + if (MDNS.begin((WiFi.getMode() == WIFI_AP) ? APP_NAME : (char *) WiFi.hostname().c_str())) { DEBUG_MSG_P(PSTR("[MDNS] OK\n")); } else { DEBUG_MSG_P(PSTR("[MDNS] FAIL\n")); diff --git a/code/espurna/wifi.ino b/code/espurna/wifi.ino index abba9596..47aa50ba 100644 --- a/code/espurna/wifi.ino +++ b/code/espurna/wifi.ino @@ -19,16 +19,12 @@ uint8_t _wifi_ap_mode = WIFI_AP_FALLBACK; void _wifiCheckAP() { - static unsigned long last = 0; - if (millis() - last < 60000) return; - last = millis(); - if ((WIFI_AP_FALLBACK == _wifi_ap_mode) && - jw.connected() && - jw.connectable() && + (jw.connected()) && + ((WiFi.getMode() & WIFI_AP) > 0) && (WiFi.softAPgetStationNum() == 0) ) { - jw.destroyAP(); + jw.enableAP(false); } } @@ -276,7 +272,7 @@ void _wifiCaptivePortal(justwifi_messages_t code, char * parameter) { #if DEBUG_SUPPORT -void _wifiDebug(justwifi_messages_t code, char * parameter) { +void _wifiDebugCallback(justwifi_messages_t code, char * parameter) { // ------------------------------------------------------------------------- @@ -315,12 +311,11 @@ void _wifiDebug(justwifi_messages_t code, char * parameter) { } if (code == MESSAGE_CONNECTED) { - wifiDebug(); + wifiDebug(WIFI_STA); } if (code == MESSAGE_DISCONNECTED) { DEBUG_MSG_P(PSTR("[WIFI] Disconnected\n")); - wifiDebug(); } // ------------------------------------------------------------------------- @@ -330,7 +325,7 @@ void _wifiDebug(justwifi_messages_t code, char * parameter) { } if (code == MESSAGE_ACCESSPOINT_CREATED) { - wifiDebug(); + wifiDebug(WIFI_AP); } if (code == MESSAGE_ACCESSPOINT_FAILED) { @@ -339,7 +334,6 @@ void _wifiDebug(justwifi_messages_t code, char * parameter) { if (code == MESSAGE_ACCESSPOINT_DESTROYED) { DEBUG_MSG_P(PSTR("[WIFI] Access point destroyed\n")); - wifiDebug(); } // ------------------------------------------------------------------------- @@ -458,10 +452,17 @@ void wifiDisconnect() { jw.disconnect(); } -bool wifiStartAP() { - jw.disconnect(); - jw.resetReconnectTimeout(); - return jw.createAP(); +void wifiStartAP(bool only) { + if (only) { + jw.enableSTA(false); + jw.disconnect(); + jw.resetReconnectTimeout(); + } + jw.enableAP(true); +} + +void wifiStartAP() { + wifiStartAP(true); } void wifiStartWPS() { @@ -487,9 +488,11 @@ uint8_t wifiState() { return state; } -void wifiDebug() { +void wifiDebug(WiFiMode_t modes) { - if (WiFi.getMode() & WIFI_STA) { + bool footer = false; + + if (((modes & WIFI_STA) > 0) && ((WiFi.getMode() & WIFI_STA) > 0)) { uint8_t * bssid = WiFi.BSSID(); DEBUG_MSG_P(PSTR("[WIFI] ------------------------------------- MODE STA\n")); @@ -505,26 +508,35 @@ void wifiDebug() { ); DEBUG_MSG_P(PSTR("[WIFI] CH %d\n"), WiFi.channel()); DEBUG_MSG_P(PSTR("[WIFI] RSSI %d\n"), WiFi.RSSI()); + footer = true; } - if (WiFi.getMode() & WIFI_AP) { + if (((modes & WIFI_AP) > 0) && ((WiFi.getMode() & WIFI_AP) > 0)) { DEBUG_MSG_P(PSTR("[WIFI] -------------------------------------- MODE AP\n")); DEBUG_MSG_P(PSTR("[WIFI] SSID %s\n"), jw.getAPSSID().c_str()); DEBUG_MSG_P(PSTR("[WIFI] PASS %s\n"), getSetting("adminPass", ADMIN_PASS).c_str()); DEBUG_MSG_P(PSTR("[WIFI] IP %s\n"), WiFi.softAPIP().toString().c_str()); DEBUG_MSG_P(PSTR("[WIFI] MAC %s\n"), WiFi.softAPmacAddress().c_str()); + footer = true; } if (WiFi.getMode() == 0) { DEBUG_MSG_P(PSTR("[WIFI] ------------------------------------- MODE OFF\n")); DEBUG_MSG_P(PSTR("[WIFI] No connection\n")); + footer = true; } - DEBUG_MSG_P(PSTR("[WIFI] ----------------------------------------------\n")); + if (footer) { + DEBUG_MSG_P(PSTR("[WIFI] ----------------------------------------------\n")); + } } +void wifiDebug() { + wifiDebug(WIFI_AP_STA); +} + void wifiRegister(wifi_callback_f callback) { jw.subscribe(callback); } @@ -546,7 +558,7 @@ void wifiSetup() { wifiRegister(_wifiCaptivePortal); #endif #if DEBUG_SUPPORT - wifiRegister(_wifiDebug); + wifiRegister(_wifiDebugCallback); #endif #if WEB_SUPPORT @@ -584,6 +596,10 @@ void wifiLoop() { } // Check if we should disable AP - _wifiCheckAP(); + static unsigned long last = 0; + if (millis() - last > 60000) { + last = millis(); + _wifiCheckAP(); + } } From aeb03282c614400977b3cf083cc657963119fa4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Fri, 25 May 2018 17:10:15 +0200 Subject: [PATCH 06/22] Disable WPS by default, saves ~50Kb --- code/espurna/button.ino | 2 + code/espurna/wifi.ino | 114 +++++++++++++++++++++------------------- code/platformio.ini | 2 +- 3 files changed, 64 insertions(+), 54 deletions(-) diff --git a/code/espurna/button.ino b/code/espurna/button.ino index 5e5927ce..5e93ba32 100644 --- a/code/espurna/button.ino +++ b/code/espurna/button.ino @@ -117,7 +117,9 @@ void buttonEvent(unsigned int id, unsigned char event) { } } if (action == BUTTON_MODE_AP) wifiStartAP(); + #if !defined(JUSTWIFI_DISABLE_WPS) if (action == BUTTON_MODE_WPS) wifiStartWPS(); + #endif if (action == BUTTON_MODE_RESET) { deferredReset(100, CUSTOM_RESET_HARDWARE); } diff --git a/code/espurna/wifi.ino b/code/espurna/wifi.ino index 5042f44a..c1d9639d 100644 --- a/code/espurna/wifi.ino +++ b/code/espurna/wifi.ino @@ -373,10 +373,12 @@ void _wifiInitCommands() { DEBUG_MSG_P(PSTR("+OK\n")); }); - settingsRegisterCommand(F("WIFI.WPS"), [](Embedis* e) { - wifiStartWPS(); - DEBUG_MSG_P(PSTR("+OK\n")); - }); + #if !defined(JUSTWIFI_DISABLE_WPS) + settingsRegisterCommand(F("WIFI.WPS"), [](Embedis* e) { + wifiStartWPS(); + DEBUG_MSG_P(PSTR("+OK\n")); + }); + #endif settingsRegisterCommand(F("WIFI.SCAN"), [](Embedis* e) { _wifiScan(); @@ -426,6 +428,59 @@ void _wifiWebSocketOnAction(uint32_t client_id, const char * action, JsonObject& #endif +// ----------------------------------------------------------------------------- +// INFO +// ----------------------------------------------------------------------------- + +void wifiDebug(WiFiMode_t modes) { + + bool footer = false; + + if (((modes & WIFI_STA) > 0) && ((WiFi.getMode() & WIFI_STA) > 0)) { + + uint8_t * bssid = WiFi.BSSID(); + DEBUG_MSG_P(PSTR("[WIFI] ------------------------------------- MODE STA\n")); + DEBUG_MSG_P(PSTR("[WIFI] SSID %s\n"), WiFi.SSID().c_str()); + DEBUG_MSG_P(PSTR("[WIFI] IP %s\n"), WiFi.localIP().toString().c_str()); + DEBUG_MSG_P(PSTR("[WIFI] MAC %s\n"), WiFi.macAddress().c_str()); + DEBUG_MSG_P(PSTR("[WIFI] GW %s\n"), WiFi.gatewayIP().toString().c_str()); + DEBUG_MSG_P(PSTR("[WIFI] DNS %s\n"), WiFi.dnsIP().toString().c_str()); + DEBUG_MSG_P(PSTR("[WIFI] MASK %s\n"), WiFi.subnetMask().toString().c_str()); + DEBUG_MSG_P(PSTR("[WIFI] HOST http://%s.local\n"), WiFi.hostname().c_str()); + DEBUG_MSG_P(PSTR("[WIFI] BSSID %02X:%02X:%02X:%02X:%02X:%02X\n"), + bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5], bssid[6] + ); + DEBUG_MSG_P(PSTR("[WIFI] CH %d\n"), WiFi.channel()); + DEBUG_MSG_P(PSTR("[WIFI] RSSI %d\n"), WiFi.RSSI()); + footer = true; + + } + + if (((modes & WIFI_AP) > 0) && ((WiFi.getMode() & WIFI_AP) > 0)) { + DEBUG_MSG_P(PSTR("[WIFI] -------------------------------------- MODE AP\n")); + DEBUG_MSG_P(PSTR("[WIFI] SSID %s\n"), getSetting("hostname").c_str()); + DEBUG_MSG_P(PSTR("[WIFI] PASS %s\n"), getSetting("adminPass", ADMIN_PASS).c_str()); + DEBUG_MSG_P(PSTR("[WIFI] IP %s\n"), WiFi.softAPIP().toString().c_str()); + DEBUG_MSG_P(PSTR("[WIFI] MAC %s\n"), WiFi.softAPmacAddress().c_str()); + footer = true; + } + + if (WiFi.getMode() == 0) { + DEBUG_MSG_P(PSTR("[WIFI] ------------------------------------- MODE OFF\n")); + DEBUG_MSG_P(PSTR("[WIFI] No connection\n")); + footer = true; + } + + if (footer) { + DEBUG_MSG_P(PSTR("[WIFI] ----------------------------------------------\n")); + } + +} + +void wifiDebug() { + wifiDebug(WIFI_AP_STA); +} + // ----------------------------------------------------------------------------- // API // ----------------------------------------------------------------------------- @@ -465,9 +520,11 @@ void wifiStartAP() { wifiStartAP(true); } +#if !defined(JUSTWIFI_DISABLE_WPS) void wifiStartWPS() { jw.startWPS(); } +#endif void wifiReconnectCheck() { bool connected = false; @@ -488,55 +545,6 @@ uint8_t wifiState() { return state; } -void wifiDebug(WiFiMode_t modes) { - - bool footer = false; - - if (((modes & WIFI_STA) > 0) && ((WiFi.getMode() & WIFI_STA) > 0)) { - - uint8_t * bssid = WiFi.BSSID(); - DEBUG_MSG_P(PSTR("[WIFI] ------------------------------------- MODE STA\n")); - DEBUG_MSG_P(PSTR("[WIFI] SSID %s\n"), WiFi.SSID().c_str()); - DEBUG_MSG_P(PSTR("[WIFI] IP %s\n"), WiFi.localIP().toString().c_str()); - DEBUG_MSG_P(PSTR("[WIFI] MAC %s\n"), WiFi.macAddress().c_str()); - DEBUG_MSG_P(PSTR("[WIFI] GW %s\n"), WiFi.gatewayIP().toString().c_str()); - DEBUG_MSG_P(PSTR("[WIFI] DNS %s\n"), WiFi.dnsIP().toString().c_str()); - DEBUG_MSG_P(PSTR("[WIFI] MASK %s\n"), WiFi.subnetMask().toString().c_str()); - DEBUG_MSG_P(PSTR("[WIFI] HOST http://%s.local\n"), WiFi.hostname().c_str()); - DEBUG_MSG_P(PSTR("[WIFI] BSSID %02X:%02X:%02X:%02X:%02X:%02X\n"), - bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5], bssid[6] - ); - DEBUG_MSG_P(PSTR("[WIFI] CH %d\n"), WiFi.channel()); - DEBUG_MSG_P(PSTR("[WIFI] RSSI %d\n"), WiFi.RSSI()); - footer = true; - - } - - if (((modes & WIFI_AP) > 0) && ((WiFi.getMode() & WIFI_AP) > 0)) { - DEBUG_MSG_P(PSTR("[WIFI] -------------------------------------- MODE AP\n")); - DEBUG_MSG_P(PSTR("[WIFI] SSID %s\n"), jw.getAPSSID().c_str()); - DEBUG_MSG_P(PSTR("[WIFI] PASS %s\n"), getSetting("adminPass", ADMIN_PASS).c_str()); - DEBUG_MSG_P(PSTR("[WIFI] IP %s\n"), WiFi.softAPIP().toString().c_str()); - DEBUG_MSG_P(PSTR("[WIFI] MAC %s\n"), WiFi.softAPmacAddress().c_str()); - footer = true; - } - - if (WiFi.getMode() == 0) { - DEBUG_MSG_P(PSTR("[WIFI] ------------------------------------- MODE OFF\n")); - DEBUG_MSG_P(PSTR("[WIFI] No connection\n")); - footer = true; - } - - if (footer) { - DEBUG_MSG_P(PSTR("[WIFI] ----------------------------------------------\n")); - } - -} - -void wifiDebug() { - wifiDebug(WIFI_AP_STA); -} - void wifiRegister(wifi_callback_f callback) { jw.subscribe(callback); } diff --git a/code/platformio.ini b/code/platformio.ini index c9efef0f..5170c567 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -35,7 +35,7 @@ debug_flags = -DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP # -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY v2 Lower Memory # -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH v2 Higher Bandwidth # ------------------------------------------------------------------------------ -build_flags = -g -DMQTT_MAX_PACKET_SIZE=400 ${env.ESPURNA_FLAGS} -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH +build_flags = -g -DMQTT_MAX_PACKET_SIZE=400 ${env.ESPURNA_FLAGS} -DJUSTWIFI_DISABLE_WPS -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH build_flags_512k = ${common.build_flags} -Wl,-Tesp8266.flash.512k0.ld build_flags_1m = ${common.build_flags} -Wl,-Tesp8266.flash.1m0.ld From 81eb809d4f1271f9869d835d39c4812824e6915c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Sat, 26 May 2018 15:24:16 +0200 Subject: [PATCH 07/22] Support for Smart Config via JustWifi --- code/espurna/button.ino | 9 ++++--- code/espurna/config/defaults.h | 2 +- code/espurna/config/types.h | 14 +++++----- code/espurna/led.ino | 6 ++--- code/espurna/wifi.ino | 47 +++++++++++++++++++++++++++++----- code/platformio.ini | 2 +- 6 files changed, 60 insertions(+), 20 deletions(-) diff --git a/code/espurna/button.ino b/code/espurna/button.ino index 5e93ba32..ea550e1f 100644 --- a/code/espurna/button.ino +++ b/code/espurna/button.ino @@ -117,9 +117,12 @@ void buttonEvent(unsigned int id, unsigned char event) { } } if (action == BUTTON_MODE_AP) wifiStartAP(); - #if !defined(JUSTWIFI_DISABLE_WPS) - if (action == BUTTON_MODE_WPS) wifiStartWPS(); - #endif + #if defined(JUSTWIFI_ENABLE_WPS) + if (action == BUTTON_MODE_WPS) wifiStartWPS(); + #endif // defined(JUSTWIFI_ENABLE_WPS) + #if defined(JUSTWIFI_ENABLE_SMARTCONFIG) + if (action == BUTTON_MODE_SMART_CONFIG) wifiStartSmartConfig(); + #endif // defined(JUSTWIFI_ENABLE_SMARTCONFIG) if (action == BUTTON_MODE_RESET) { deferredReset(100, CUSTOM_RESET_HARDWARE); } diff --git a/code/espurna/config/defaults.h b/code/espurna/config/defaults.h index 5e4a85be..cae794af 100644 --- a/code/espurna/config/defaults.h +++ b/code/espurna/config/defaults.h @@ -109,7 +109,7 @@ #endif #ifndef BUTTON1_TRIPLECLICK -#define BUTTON1_TRIPLECLICK BUTTON_MODE_WPS +#define BUTTON1_TRIPLECLICK BUTTON_MODE_SMART_CONFIG #endif #ifndef BUTTON2_TRIPLECLICK #define BUTTON2_TRIPLECLICK BUTTON_MODE_NONE diff --git a/code/espurna/config/types.h b/code/espurna/config/types.h index dbd0b23f..45d89766 100644 --- a/code/espurna/config/types.h +++ b/code/espurna/config/types.h @@ -7,13 +7,14 @@ // WIFI // ----------------------------------------------------------------------------- -#define WIFI_STATE_AP 1 -#define WIFI_STATE_STA 2 -#define WIFI_STATE_AP_STA 3 -#define WIFI_STATE_WPS 4 +#define WIFI_STATE_AP 1 +#define WIFI_STATE_STA 2 +#define WIFI_STATE_AP_STA 3 +#define WIFI_STATE_WPS 4 +#define WIFI_STATE_SMARTCONFIG 8 -#define WIFI_AP_ALLWAYS 1 -#define WIFI_AP_FALLBACK 2 +#define WIFI_AP_ALLWAYS 1 +#define WIFI_AP_FALLBACK 2 //------------------------------------------------------------------------------ // BUTTONS @@ -37,6 +38,7 @@ #define BUTTON_MODE_PULSE 6 #define BUTTON_MODE_FACTORY 7 #define BUTTON_MODE_WPS 8 +#define BUTTON_MODE_SMART_CONFIG 9 // Needed for ESP8285 boards under Windows using PlatformIO (?) #ifndef BUTTON_PUSHBUTTON diff --git a/code/espurna/led.ino b/code/espurna/led.ino index 30b6aaa6..06fac792 100644 --- a/code/espurna/led.ino +++ b/code/espurna/led.ino @@ -188,7 +188,7 @@ void ledLoop() { if (_ledMode(i) == LED_MODE_WIFI) { - if (wifi_state & WIFI_STATE_WPS) { + if (wifi_state & WIFI_STATE_WPS || wifi_state & WIFI_STATE_SMARTCONFIG) { _ledBlink(i, 100, 100); } else if (wifi_state & WIFI_STATE_STA) { _ledBlink(i, 4900, 100); @@ -202,7 +202,7 @@ void ledLoop() { if (_ledMode(i) == LED_MODE_FINDME_WIFI) { - if (wifi_state & WIFI_STATE_WPS) { + if (wifi_state & WIFI_STATE_WPS || wifi_state & WIFI_STATE_SMARTCONFIG) { _ledBlink(i, 100, 100); } else if (wifi_state & WIFI_STATE_STA) { if (relayStatus(_leds[i].relay-1)) { @@ -224,7 +224,7 @@ void ledLoop() { if (_ledMode(i) == LED_MODE_RELAY_WIFI) { - if (wifi_state & WIFI_STATE_WPS) { + if (wifi_state & WIFI_STATE_WPS || wifi_state & WIFI_STATE_SMARTCONFIG) { _ledBlink(i, 100, 100); } else if (wifi_state & WIFI_STATE_STA) { if (relayStatus(_leds[i].relay-1)) { diff --git a/code/espurna/wifi.ino b/code/espurna/wifi.ino index c1d9639d..cb34ca38 100644 --- a/code/espurna/wifi.ino +++ b/code/espurna/wifi.ino @@ -11,6 +11,7 @@ Copyright (C) 2016-2018 by Xose PĂ©rez uint32_t _wifi_scan_client_id = 0; bool _wifi_wps_running = false; +bool _wifi_smartconfig_running = false; uint8_t _wifi_ap_mode = WIFI_AP_FALLBACK; // ----------------------------------------------------------------------------- @@ -218,11 +219,16 @@ void _wifiCallback(justwifi_messages_t code, char * parameter) { _wifi_wps_running = true; } - if (MESSAGE_WPS_ERROR == code) { + if (MESSAGE_SMARTCONFIG_START == code) { + _wifi_smartconfig_running = true; + } + + if (MESSAGE_WPS_ERROR == code || MESSAGE_SMARTCONFIG_ERROR == code) { _wifi_wps_running = false; + _wifi_smartconfig_running = false; } - if (MESSAGE_WPS_SUCCESS == code) { + if (MESSAGE_WPS_SUCCESS == code || MESSAGE_SMARTCONFIG_SUCCESS == code) { String ssid = WiFi.SSID(); String pass = WiFi.psk(); @@ -242,6 +248,7 @@ void _wifiCallback(justwifi_messages_t code, char * parameter) { setSetting("pass", count, pass); _wifi_wps_running = false; + _wifi_smartconfig_running = false; } @@ -350,6 +357,20 @@ void _wifiDebugCallback(justwifi_messages_t code, char * parameter) { DEBUG_MSG_P(PSTR("[WIFI] WPS failed\n")); } + // ------------------------------------------------------------------------ + + if (code == MESSAGE_SMARTCONFIG_START) { + DEBUG_MSG_P(PSTR("[WIFI] Smart Config started\n")); + } + + if (code == MESSAGE_SMARTCONFIG_SUCCESS) { + DEBUG_MSG_P(PSTR("[WIFI] Smart Config succeded!\n")); + } + + if (code == MESSAGE_SMARTCONFIG_ERROR) { + DEBUG_MSG_P(PSTR("[WIFI] Smart Config failed\n")); + } + } #endif // DEBUG_SUPPORT @@ -373,12 +394,19 @@ void _wifiInitCommands() { DEBUG_MSG_P(PSTR("+OK\n")); }); - #if !defined(JUSTWIFI_DISABLE_WPS) + #if defined(JUSTWIFI_ENABLE_WPS) settingsRegisterCommand(F("WIFI.WPS"), [](Embedis* e) { wifiStartWPS(); DEBUG_MSG_P(PSTR("+OK\n")); }); - #endif + #endif // defined(JUSTWIFI_ENABLE_WPS) + + #if defined(JUSTWIFI_ENABLE_SMARTCONFIG) + settingsRegisterCommand(F("WIFI.SMARTCONFIG"), [](Embedis* e) { + wifiStartSmartConfig(); + DEBUG_MSG_P(PSTR("+OK\n")); + }); + #endif // defined(JUSTWIFI_ENABLE_SMARTCONFIG) settingsRegisterCommand(F("WIFI.SCAN"), [](Embedis* e) { _wifiScan(); @@ -520,11 +548,17 @@ void wifiStartAP() { wifiStartAP(true); } -#if !defined(JUSTWIFI_DISABLE_WPS) +#if defined(JUSTWIFI_ENABLE_WPS) void wifiStartWPS() { jw.startWPS(); } -#endif +#endif // defined(JUSTWIFI_ENABLE_WPS) + +#if defined(JUSTWIFI_ENABLE_SMARTCONFIG) +void wifiStartSmartConfig() { + jw.startSmartConfig(); +} +#endif // defined(JUSTWIFI_ENABLE_SMARTCONFIG) void wifiReconnectCheck() { bool connected = false; @@ -542,6 +576,7 @@ uint8_t wifiState() { if (jw.connected()) state += WIFI_STATE_STA; if (jw.connectable()) state += WIFI_STATE_AP; if (_wifi_wps_running) state += WIFI_STATE_WPS; + if (_wifi_smartconfig_running) state += WIFI_STATE_SMARTCONFIG; return state; } diff --git a/code/platformio.ini b/code/platformio.ini index 5170c567..b1445be6 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -35,7 +35,7 @@ debug_flags = -DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP # -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY v2 Lower Memory # -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH v2 Higher Bandwidth # ------------------------------------------------------------------------------ -build_flags = -g -DMQTT_MAX_PACKET_SIZE=400 ${env.ESPURNA_FLAGS} -DJUSTWIFI_DISABLE_WPS -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH +build_flags = -g -DMQTT_MAX_PACKET_SIZE=400 -DJUSTWIFI_ENABLE_SMARTCONFIG ${env.ESPURNA_FLAGS} -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH build_flags_512k = ${common.build_flags} -Wl,-Tesp8266.flash.512k0.ld build_flags_1m = ${common.build_flags} -Wl,-Tesp8266.flash.1m0.ld From 4548cc724cd005124b170957e9c6b7cf545426c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Sun, 27 May 2018 01:42:32 +0200 Subject: [PATCH 08/22] Using EEPROM_Rotate library --- README.md | 6 ++-- code/espurna/config/general.h | 13 ++++---- code/espurna/config/prototypes.h | 6 ++++ code/espurna/debug.ino | 52 ++++++++++++++++---------------- code/espurna/mqtt.ino | 20 ++++++------ code/espurna/relay.ino | 12 ++++---- code/espurna/settings.ino | 46 +++++++++++----------------- code/espurna/system.ino | 20 +++++++++--- code/espurna/utils.ino | 6 ++-- code/platformio.ini | 3 +- 10 files changed, 96 insertions(+), 88 deletions(-) diff --git a/README.md b/README.md index b5d79f23..34726bc4 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ ESPurna ("spark" in Catalan) is a custom firmware for ESP8285/ESP8266 based smar It uses the Arduino Core for ESP8266 framework and a number of 3rd party libraries. [![version](https://img.shields.io/badge/version-1.12.7a-brightgreen.svg)](CHANGELOG.md) -[![branch](https://img.shields.io/badge/branch-dev-orange.svg)](https://github.org/xoseperez/espurna/tree/dev/) -[![travis](https://travis-ci.org/xoseperez/espurna.svg?branch=dev)](https://travis-ci.org/xoseperez/espurna) -[![codacy](https://img.shields.io/codacy/grade/c9496e25cf07434cba786b462cb15f49/dev.svg)](https://www.codacy.com/app/xoseperez/espurna/dashboard) +[![branch](https://img.shields.io/badge/branch-eeprom_rotate-orange.svg)](https://github.org/xoseperez/espurna/tree/eeprom_rotate/) +[![travis](https://travis-ci.org/xoseperez/espurna.svg?branch=eeprom_rotate)](https://travis-ci.org/xoseperez/espurna) +[![codacy](https://img.shields.io/codacy/grade/c9496e25cf07434cba786b462cb15f49/eeprom_rotate.svg)](https://www.codacy.com/app/xoseperez/espurna/dashboard) [![license](https://img.shields.io/github/license/xoseperez/espurna.svg)](LICENSE)
[![donate](https://img.shields.io/badge/donate-PayPal-blue.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=xose%2eperez%40gmail%2ecom&lc=US&no_note=0¤cy_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_LG%2egif%3aNonHostedGuest) diff --git a/code/espurna/config/general.h b/code/espurna/config/general.h index 2ca143ab..8a8723fc 100644 --- a/code/espurna/config/general.h +++ b/code/espurna/config/general.h @@ -147,7 +147,8 @@ #define EEPROM_CUSTOM_RESET 5 // Address for the reset reason (1 byte) #define EEPROM_CRASH_COUNTER 6 // Address for the crash counter (1 byte) #define EEPROM_MESSAGE_ID 7 // Address for the MQTT message id (4 bytes) -#define EEPROM_DATA_END 11 // End of custom EEPROM data block +#define EEPROM_ROTATE_DATA 11 // Reserved for the EEPROM_ROTATE library (3 bytes) +#define EEPROM_DATA_END 14 // End of custom EEPROM data block //------------------------------------------------------------------------------ // HEARTBEAT @@ -1152,13 +1153,13 @@ #if IR_BUTTON_SET == 3 /* +------+------+------+ - | 1 | 2 | 3 | + | 1 | 2 | 3 | +------+------+------+ - | 4 | 5 | 6 | + | 4 | 5 | 6 | +------+------+------+ - | 7 | 8 | 9 | + | 7 | 8 | 9 | +------+------+------+ - | | 0 | | + | | 0 | | +------+------+------+ */ #define IR_BUTTON_COUNT 10 @@ -1168,7 +1169,7 @@ { 0xE0E020DF, IR_BUTTON_MODE_TOGGLE, 0 }, // Toggle Relay #0 { 0xE0E0A05F, IR_BUTTON_MODE_TOGGLE, 1 }, // Toggle Relay #1 { 0xE0E0609F, IR_BUTTON_MODE_TOGGLE, 2 }, // Toggle Relay #2 - + { 0xE0E010EF, IR_BUTTON_MODE_TOGGLE, 3 }, // Toggle Relay #3 { 0xE0E0906F, IR_BUTTON_MODE_TOGGLE, 4 }, // Toggle Relay #4 { 0xE0E050AF, IR_BUTTON_MODE_TOGGLE, 5 }, // Toggle Relay #5 diff --git a/code/espurna/config/prototypes.h b/code/espurna/config/prototypes.h index 2a581218..317d46f5 100644 --- a/code/espurna/config/prototypes.h +++ b/code/espurna/config/prototypes.h @@ -7,6 +7,12 @@ extern "C" { #include "user_interface.h" } +// ----------------------------------------------------------------------------- +// EEPROM_ROTATE +// ----------------------------------------------------------------------------- +#include +EEPROM_Rotate EEPROMr; + // ----------------------------------------------------------------------------- // WebServer // ----------------------------------------------------------------------------- diff --git a/code/espurna/debug.ino b/code/espurna/debug.ino index e7659693..8045e5d8 100644 --- a/code/espurna/debug.ino +++ b/code/espurna/debug.ino @@ -10,7 +10,7 @@ Copyright (C) 2016-2018 by Xose PĂ©rez #include #include -#include +#include extern "C" { #include "user_interface.h" @@ -204,31 +204,31 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack // write crash time to EEPROM uint32_t crash_time = millis(); - EEPROM.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_CRASH_TIME, crash_time); + EEPROMr.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_CRASH_TIME, crash_time); // write reset info to EEPROM - EEPROM.write(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_RESTART_REASON, rst_info->reason); - EEPROM.write(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EXCEPTION_CAUSE, rst_info->exccause); + EEPROMr.write(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_RESTART_REASON, rst_info->reason); + EEPROMr.write(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EXCEPTION_CAUSE, rst_info->exccause); // write epc1, epc2, epc3, excvaddr and depc to EEPROM - EEPROM.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EPC1, rst_info->epc1); - EEPROM.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EPC2, rst_info->epc2); - EEPROM.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EPC3, rst_info->epc3); - EEPROM.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EXCVADDR, rst_info->excvaddr); - EEPROM.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_DEPC, rst_info->depc); + EEPROMr.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EPC1, rst_info->epc1); + EEPROMr.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EPC2, rst_info->epc2); + EEPROMr.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EPC3, rst_info->epc3); + EEPROMr.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EXCVADDR, rst_info->excvaddr); + EEPROMr.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_DEPC, rst_info->depc); // write stack start and end address to EEPROM - EEPROM.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_STACK_START, stack_start); - EEPROM.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_STACK_END, stack_end); + EEPROMr.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_STACK_START, stack_start); + EEPROMr.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_STACK_END, stack_end); // write stack trace to EEPROM int16_t current_address = SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_STACK_TRACE; for (uint32_t i = stack_start; i < stack_end; i++) { byte* byteValue = (byte*) i; - EEPROM.write(current_address++, *byteValue); + EEPROMr.write(current_address++, *byteValue); } - EEPROM.commit(); + EEPROMr.commit(); } @@ -237,8 +237,8 @@ extern "C" void custom_crash_callback(struct rst_info * rst_info, uint32_t stack */ void debugClearCrashInfo() { uint32_t crash_time = 0xFFFFFFFF; - EEPROM.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_CRASH_TIME, crash_time); - EEPROM.commit(); + EEPROMr.put(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_CRASH_TIME, crash_time); + EEPROMr.commit(); } /** @@ -247,28 +247,28 @@ void debugClearCrashInfo() { void debugDumpCrashInfo() { uint32_t crash_time; - EEPROM.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_CRASH_TIME, crash_time); + EEPROMr.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_CRASH_TIME, crash_time); if ((crash_time == 0) || (crash_time == 0xFFFFFFFF)) { DEBUG_MSG_P(PSTR("[DEBUG] No crash info\n")); return; } DEBUG_MSG_P(PSTR("[DEBUG] Latest crash was at %lu ms after boot\n"), crash_time); - DEBUG_MSG_P(PSTR("[DEBUG] Reason of restart: %u\n"), EEPROM.read(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_RESTART_REASON)); - DEBUG_MSG_P(PSTR("[DEBUG] Exception cause: %u\n"), EEPROM.read(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EXCEPTION_CAUSE)); + DEBUG_MSG_P(PSTR("[DEBUG] Reason of restart: %u\n"), EEPROMr.read(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_RESTART_REASON)); + DEBUG_MSG_P(PSTR("[DEBUG] Exception cause: %u\n"), EEPROMr.read(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EXCEPTION_CAUSE)); uint32_t epc1, epc2, epc3, excvaddr, depc; - EEPROM.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EPC1, epc1); - EEPROM.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EPC2, epc2); - EEPROM.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EPC3, epc3); - EEPROM.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EXCVADDR, excvaddr); - EEPROM.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_DEPC, depc); + EEPROMr.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EPC1, epc1); + EEPROMr.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EPC2, epc2); + EEPROMr.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EPC3, epc3); + EEPROMr.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_EXCVADDR, excvaddr); + EEPROMr.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_DEPC, depc); DEBUG_MSG_P(PSTR("[DEBUG] epc1=0x%08x epc2=0x%08x epc3=0x%08x\n"), epc1, epc2, epc3); DEBUG_MSG_P(PSTR("[DEBUG] excvaddr=0x%08x depc=0x%08x\n"), excvaddr, depc); uint32_t stack_start, stack_end; - EEPROM.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_STACK_START, stack_start); - EEPROM.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_STACK_END, stack_end); + EEPROMr.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_STACK_START, stack_start); + EEPROMr.get(SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_STACK_END, stack_end); DEBUG_MSG_P(PSTR("[DEBUG] >>>stack>>>\n[DEBUG] ")); int16_t current_address = SAVE_CRASH_EEPROM_OFFSET + SAVE_CRASH_STACK_TRACE; int16_t stack_len = stack_end - stack_start; @@ -276,7 +276,7 @@ void debugDumpCrashInfo() { for (int16_t i = 0; i < stack_len; i += 0x10) { DEBUG_MSG_P(PSTR("%08x: "), stack_start + i); for (byte j = 0; j < 4; j++) { - EEPROM.get(current_address, stack_trace); + EEPROMr.get(current_address, stack_trace); DEBUG_MSG_P(PSTR("%08x "), stack_trace); current_address += 4; } diff --git a/code/espurna/mqtt.ino b/code/espurna/mqtt.ino index b74be3f8..603523b3 100644 --- a/code/espurna/mqtt.ino +++ b/code/espurna/mqtt.ino @@ -8,7 +8,7 @@ Copyright (C) 2016-2018 by Xose PĂ©rez #if MQTT_SUPPORT -#include +#include #include #include #include @@ -258,7 +258,7 @@ unsigned long _mqttNextMessageId() { if (id == 0) { // read id from EEPROM and shift it - id = EEPROM.read(EEPROM_MESSAGE_ID); + id = EEPROMr.read(EEPROM_MESSAGE_ID); if (id == 0xFF) { // There was nothing in EEPROM, @@ -267,9 +267,9 @@ unsigned long _mqttNextMessageId() { } else { - id = (id << 8) + EEPROM.read(EEPROM_MESSAGE_ID + 1); - id = (id << 8) + EEPROM.read(EEPROM_MESSAGE_ID + 2); - id = (id << 8) + EEPROM.read(EEPROM_MESSAGE_ID + 3); + id = (id << 8) + EEPROMr.read(EEPROM_MESSAGE_ID + 1); + id = (id << 8) + EEPROMr.read(EEPROM_MESSAGE_ID + 2); + id = (id << 8) + EEPROMr.read(EEPROM_MESSAGE_ID + 3); // Calculate next block and start from there id = MQTT_MESSAGE_ID_SHIFT * (1 + (id / MQTT_MESSAGE_ID_SHIFT)); @@ -280,11 +280,11 @@ unsigned long _mqttNextMessageId() { // Save to EEPROM every MQTT_MESSAGE_ID_SHIFT if (id % MQTT_MESSAGE_ID_SHIFT == 0) { - EEPROM.write(EEPROM_MESSAGE_ID + 0, (id >> 24) & 0xFF); - EEPROM.write(EEPROM_MESSAGE_ID + 1, (id >> 16) & 0xFF); - EEPROM.write(EEPROM_MESSAGE_ID + 2, (id >> 8) & 0xFF); - EEPROM.write(EEPROM_MESSAGE_ID + 3, (id >> 0) & 0xFF); - EEPROM.commit(); + EEPROMr.write(EEPROM_MESSAGE_ID + 0, (id >> 24) & 0xFF); + EEPROMr.write(EEPROM_MESSAGE_ID + 1, (id >> 16) & 0xFF); + EEPROMr.write(EEPROM_MESSAGE_ID + 2, (id >> 8) & 0xFF); + EEPROMr.write(EEPROM_MESSAGE_ID + 3, (id >> 0) & 0xFF); + EEPROMr.commit(); } id++; diff --git a/code/espurna/relay.ino b/code/espurna/relay.ino index 2e7fd5d1..ca3062af 100644 --- a/code/espurna/relay.ino +++ b/code/espurna/relay.ino @@ -6,7 +6,7 @@ Copyright (C) 2016-2018 by Xose PĂ©rez */ -#include +#include #include #include #include @@ -357,9 +357,9 @@ void relaySave() { if (relayStatus(i)) mask += bit; bit += bit; } - EEPROM.write(EEPROM_RELAY_STATUS, mask); + EEPROMr.write(EEPROM_RELAY_STATUS, mask); DEBUG_MSG_P(PSTR("[RELAY] Saving mask: %d\n"), mask); - EEPROM.commit(); + EEPROMr.commit(); } void relayToggle(unsigned char id, bool report, bool group_report) { @@ -437,7 +437,7 @@ void _relayBoot() { bool trigger_save = false; // Get last statuses from EEPROM - unsigned char mask = EEPROM.read(EEPROM_RELAY_STATUS); + unsigned char mask = EEPROMr.read(EEPROM_RELAY_STATUS); DEBUG_MSG_P(PSTR("[RELAY] Retrieving mask: %d\n"), mask); // Walk the relays @@ -474,8 +474,8 @@ void _relayBoot() { // Save if there is any relay in the RELAY_BOOT_TOGGLE mode if (trigger_save) { - EEPROM.write(EEPROM_RELAY_STATUS, mask); - EEPROM.commit(); + EEPROMr.write(EEPROM_RELAY_STATUS, mask); + EEPROMr.commit(); } _relayRecursive = false; diff --git a/code/espurna/settings.ino b/code/espurna/settings.ino index ce98370a..29576a50 100644 --- a/code/espurna/settings.ino +++ b/code/espurna/settings.ino @@ -6,7 +6,7 @@ Copyright (C) 2016-2018 by Xose PĂ©rez */ -#include +#include #include #include "libs/EmbedisWrap.h" #include @@ -30,7 +30,7 @@ bool _settings_save = false; unsigned long settingsSize() { unsigned pos = SPI_FLASH_SEC_SIZE - 1; - while (size_t len = EEPROM.read(pos)) { + while (size_t len = EEPROMr.read(pos)) { pos = pos - len - 2; } return SPI_FLASH_SEC_SIZE - pos; @@ -41,9 +41,9 @@ unsigned long settingsSize() { unsigned int _settingsKeyCount() { unsigned count = 0; unsigned pos = SPI_FLASH_SEC_SIZE - 1; - while (size_t len = EEPROM.read(pos)) { + while (size_t len = EEPROMr.read(pos)) { pos = pos - len - 2; - len = EEPROM.read(pos); + len = EEPROMr.read(pos); pos = pos - len - 2; count ++; } @@ -56,17 +56,17 @@ String _settingsKeyName(unsigned int index) { unsigned count = 0; unsigned pos = SPI_FLASH_SEC_SIZE - 1; - while (size_t len = EEPROM.read(pos)) { + while (size_t len = EEPROMr.read(pos)) { pos = pos - len - 2; if (count == index) { s.reserve(len); for (unsigned char i = 0 ; i < len; i++) { - s += (char) EEPROM.read(pos + i + 1); + s += (char) EEPROMr.read(pos + i + 1); } break; } count++; - len = EEPROM.read(pos); + len = EEPROMr.read(pos); pos = pos - len - 2; } @@ -162,21 +162,13 @@ void _settingsKeysCommand() { void _settingsFactoryResetCommand() { for (unsigned int i = 0; i < SPI_FLASH_SEC_SIZE; i++) { - EEPROM.write(i, 0xFF); + EEPROMr.write(i, 0xFF); } - EEPROM.commit(); + EEPROMr.commit(); } -void _settingsDumpCommand(bool ascii) { - for (unsigned int i = 0; i < SPI_FLASH_SEC_SIZE; i++) { - if (i % 16 == 0) DEBUG_MSG_P(PSTR("\n[%04X] "), i); - byte c = EEPROM.read(i); - if (ascii && 32 <= c && c <= 126) { - DEBUG_MSG_P(PSTR(" %c "), c); - } else { - DEBUG_MSG_P(PSTR("%02X "), c); - } - } +void _settingsDumpCommand() { + EEPROMr.dump(_serial); } void _settingsInitCommands() { @@ -195,9 +187,7 @@ void _settingsInitCommands() { }); settingsRegisterCommand(F("EEPROM.DUMP"), [](Embedis* e) { - bool ascii = false; - if (e->argc == 2) ascii = String(e->argv[1]).toInt() == 1; - _settingsDumpCommand(ascii); + _settingsDumpCommand(); DEBUG_MSG_P(PSTR("\n+OK\n")); }); @@ -275,7 +265,7 @@ void _settingsInitCommands() { }); settingsRegisterCommand(F("RESET.SAFE"), [](Embedis* e) { - EEPROM.write(EEPROM_CRASH_COUNTER, SYSTEM_CHECK_MAX); + EEPROMr.write(EEPROM_CRASH_COUNTER, SYSTEM_CHECK_MAX); DEBUG_MSG_P(PSTR("+OK\n")); deferredReset(100, CUSTOM_RESET_TERMINAL); }); @@ -366,7 +356,7 @@ bool settingsRestoreJson(JsonObject& data) { if (strcmp(app, APP_NAME) != 0) return false; for (unsigned int i = EEPROM_DATA_END; i < SPI_FLASH_SEC_SIZE; i++) { - EEPROM.write(i, 0xFF); + EEPROMr.write(i, 0xFF); } for (auto element : data) { @@ -405,7 +395,7 @@ void settingsRegisterCommand(const String& name, void (*call)(Embedis*)) { void settingsSetup() { - EEPROM.begin(SPI_FLASH_SEC_SIZE); + EEPROMr.begin(SPI_FLASH_SEC_SIZE); _serial.callback([](uint8_t ch) { #if TELNET_SUPPORT @@ -418,8 +408,8 @@ void settingsSetup() { Embedis::dictionary( F("EEPROM"), SPI_FLASH_SEC_SIZE, - [](size_t pos) -> char { return EEPROM.read(pos); }, - [](size_t pos, char value) { EEPROM.write(pos, value); }, + [](size_t pos) -> char { return EEPROMr.read(pos); }, + [](size_t pos, char value) { EEPROMr.write(pos, value); }, #if SETTINGS_AUTOSAVE []() { _settings_save = true; } #else @@ -443,7 +433,7 @@ void settingsSetup() { void settingsLoop() { if (_settings_save) { - EEPROM.commit(); + EEPROMr.commit(); _settings_save = false; } diff --git a/code/espurna/system.ino b/code/espurna/system.ino index fb1d1ed0..4c019254 100644 --- a/code/espurna/system.ino +++ b/code/espurna/system.ino @@ -6,7 +6,7 @@ Copyright (C) 2018 by Xose PĂ©rez */ -#include +#include // ----------------------------------------------------------------------------- @@ -30,7 +30,7 @@ unsigned short int _load_average = 100; bool _systemStable = true; void systemCheck(bool stable) { - unsigned char value = EEPROM.read(EEPROM_CRASH_COUNTER); + unsigned char value = EEPROMr.read(EEPROM_CRASH_COUNTER); if (stable) { value = 0; DEBUG_MSG_P(PSTR("[MAIN] System OK\n")); @@ -41,8 +41,8 @@ void systemCheck(bool stable) { DEBUG_MSG_P(PSTR("[MAIN] System UNSTABLE\n")); } } - EEPROM.write(EEPROM_CRASH_COUNTER, value); - EEPROM.commit(); + EEPROMr.write(EEPROM_CRASH_COUNTER, value); + EEPROMr.commit(); } bool systemCheck() { @@ -148,7 +148,17 @@ void _systemSetupSpecificHardware() { void systemSetup() { - EEPROM.begin(EEPROM_SIZE); + uint8_t sectors = 0; + if (EEPROMr.last() > 1000) { // 4Mb boards + sectors = 4; + } else if (EEPROMr.last() > 250) { // 1Mb boards + sectors = 2; + } else { + sectors = 1; + } + EEPROMr.offset(EEPROM_ROTATE_DATA); + EEPROMr.rotate(sectors); + EEPROMr.begin(EEPROM_SIZE); #if SPIFFS_SUPPORT SPIFFS.begin(); diff --git a/code/espurna/utils.ino b/code/espurna/utils.ino index 7eaee736..5bc955b2 100644 --- a/code/espurna/utils.ino +++ b/code/espurna/utils.ino @@ -508,7 +508,7 @@ bool sslFingerPrintChar(const char * fingerprint, char * destination) { unsigned char resetReason() { static unsigned char status = 255; if (status == 255) { - status = EEPROM.read(EEPROM_CUSTOM_RESET); + status = EEPROMr.read(EEPROM_CUSTOM_RESET); if (status > 0) resetReason(0); if (status > CUSTOM_RESET_MAX) status = 0; } @@ -516,8 +516,8 @@ unsigned char resetReason() { } void resetReason(unsigned char reason) { - EEPROM.write(EEPROM_CUSTOM_RESET, reason); - EEPROM.commit(); + EEPROMr.write(EEPROM_CUSTOM_RESET, reason); + EEPROMr.commit(); } void reset(unsigned char reason) { diff --git a/code/platformio.ini b/code/platformio.ini index 384223a2..eb0dec97 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -35,7 +35,7 @@ debug_flags = -DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP # -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY v2 Lower Memory # -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH v2 Higher Bandwidth # ------------------------------------------------------------------------------ -build_flags = -g -DMQTT_MAX_PACKET_SIZE=400 ${env.ESPURNA_FLAGS} -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH +build_flags = -g -DMQTT_MAX_PACKET_SIZE=400 -DNO_GLOBAL_EEPROM ${env.ESPURNA_FLAGS} -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH build_flags_512k = ${common.build_flags} -Wl,-Tesp8266.flash.512k0.ld build_flags_1m = ${common.build_flags} -Wl,-Tesp8266.flash.1m0.ld @@ -57,6 +57,7 @@ lib_deps = https://github.com/marvinroger/async-mqtt-client#v0.8.1 Brzo I2C https://bitbucket.org/xoseperez/debounceevent.git#2.0.1 + https://github.com/xoseperez/eeprom_rotate Embedis https://github.com/plerup/espsoftwareserial#3.4.1 https://github.com/me-no-dev/ESPAsyncTCP#55cd520 From bc30b9e2f6b3507f7acba75df48e2b8a95d53f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Mon, 28 May 2018 02:02:26 +0200 Subject: [PATCH 09/22] Specific EEPROM module --- code/espurna/config/general.h | 4 +++ code/espurna/config/prototypes.h | 1 + code/espurna/eeprom.ino | 58 ++++++++++++++++++++++++++++++++ code/espurna/espurna.ino | 5 ++- code/espurna/settings.ino | 13 +++---- code/espurna/system.ino | 12 ------- code/espurna/utils.ino | 7 ++-- 7 files changed, 76 insertions(+), 24 deletions(-) create mode 100644 code/espurna/eeprom.ino diff --git a/code/espurna/config/general.h b/code/espurna/config/general.h index 8a8723fc..3f4ef21a 100644 --- a/code/espurna/config/general.h +++ b/code/espurna/config/general.h @@ -142,6 +142,10 @@ //------------------------------------------------------------------------------ #define EEPROM_SIZE 4096 // EEPROM size in bytes +//#define EEPROM_RORATE_SECTORS 2 // Number of sectors to use for EEPROM rotation + // If not defined the firmware will use a number based + // on the number of available sectors + #define EEPROM_RELAY_STATUS 0 // Address for the relay status (1 byte) #define EEPROM_ENERGY_COUNT 1 // Address for the energy counter (4 bytes) #define EEPROM_CUSTOM_RESET 5 // Address for the reset reason (1 byte) diff --git a/code/espurna/config/prototypes.h b/code/espurna/config/prototypes.h index 317d46f5..6db0a23b 100644 --- a/code/espurna/config/prototypes.h +++ b/code/espurna/config/prototypes.h @@ -73,6 +73,7 @@ void settingsGetJson(JsonObject& data); bool settingsRestoreJson(JsonObject& data); void settingsRegisterCommand(const String& name, void (*call)(Embedis*)); void settingsInject(void *data, size_t len); +Stream & settingsSerial(); // ----------------------------------------------------------------------------- // I2C diff --git a/code/espurna/eeprom.ino b/code/espurna/eeprom.ino new file mode 100644 index 00000000..2ba9ab9c --- /dev/null +++ b/code/espurna/eeprom.ino @@ -0,0 +1,58 @@ +/* + +EEPROM MODULE + +*/ + +#include + +// ----------------------------------------------------------------------------- + +String eepromSectors() { + String response; + for (uint32_t i = 0; i < EEPROMr.sectors(); i++) { + if (i > 0) response = response + String(", "); + response = response + String(EEPROMr.base() - i); + } + return response; +} + +#if TERMINAL_SUPPORT + +void _eepromInitCommands() { + + settingsRegisterCommand(F("EEPROM.DUMP"), [](Embedis* e) { + EEPROMr.dump(settingsSerial()); + DEBUG_MSG_P(PSTR("\n+OK\n")); + }); + +} + +#endif + +// ----------------------------------------------------------------------------- + +void eepromSetup() { + + #ifdef EEPROM_ROTATE_SECTORS + EEPROMr.sectors(EEPROM_ROTATE_SECTORS); + #else + uint8_t sectors = 0; + if (EEPROMr.last() > 1000) { // 4Mb boards + sectors = 4; + } else if (EEPROMr.last() > 250) { // 1Mb boards + sectors = 2; + } else { + sectors = 1; + } + EEPROMr.sectors(sectors); + #endif + + EEPROMr.offset(EEPROM_ROTATE_DATA); + EEPROMr.begin(EEPROM_SIZE); + + #if TERMINAL_SUPPORT + _eepromInitCommands(); + #endif + +} diff --git a/code/espurna/espurna.ino b/code/espurna/espurna.ino index ac2f217f..def70f6b 100644 --- a/code/espurna/espurna.ino +++ b/code/espurna/espurna.ino @@ -47,7 +47,10 @@ void setup() { debugSetup(); #endif - // Init EEPROM, Serial, SPIFFS and system check + // Init EEPROM + eepromSetup(); + + // Init Serial, SPIFFS and system check systemSetup(); // Init persistance and terminal features diff --git a/code/espurna/settings.ino b/code/espurna/settings.ino index 29576a50..6107fb59 100644 --- a/code/espurna/settings.ino +++ b/code/espurna/settings.ino @@ -167,10 +167,6 @@ void _settingsFactoryResetCommand() { EEPROMr.commit(); } -void _settingsDumpCommand() { - EEPROMr.dump(_serial); -} - void _settingsInitCommands() { #if DEBUG_SUPPORT @@ -186,11 +182,6 @@ void _settingsInitCommands() { DEBUG_MSG_P(PSTR("+OK\n")); }); - settingsRegisterCommand(F("EEPROM.DUMP"), [](Embedis* e) { - _settingsDumpCommand(); - DEBUG_MSG_P(PSTR("\n+OK\n")); - }); - settingsRegisterCommand(F("ERASE.CONFIG"), [](Embedis* e) { DEBUG_MSG_P(PSTR("+OK\n")); resetReason(CUSTOM_RESET_TERMINAL); @@ -343,6 +334,10 @@ void settingsInject(void *data, size_t len) { _serial.inject((char *) data, len); } +Stream & settingsSerial() { + return (Stream &) _serial; +} + size_t settingsMaxSize() { size_t size = EEPROM_SIZE; if (size > SPI_FLASH_SEC_SIZE) size = SPI_FLASH_SEC_SIZE; diff --git a/code/espurna/system.ino b/code/espurna/system.ino index 4c019254..e437bccc 100644 --- a/code/espurna/system.ino +++ b/code/espurna/system.ino @@ -148,18 +148,6 @@ void _systemSetupSpecificHardware() { void systemSetup() { - uint8_t sectors = 0; - if (EEPROMr.last() > 1000) { // 4Mb boards - sectors = 4; - } else if (EEPROMr.last() > 250) { // 1Mb boards - sectors = 2; - } else { - sectors = 1; - } - EEPROMr.offset(EEPROM_ROTATE_DATA); - EEPROMr.rotate(sectors); - EEPROMr.begin(EEPROM_SIZE); - #if SPIFFS_SUPPORT SPIFFS.begin(); #endif diff --git a/code/espurna/utils.ino b/code/espurna/utils.ino index 5bc955b2..7d849954 100644 --- a/code/espurna/utils.ino +++ b/code/espurna/utils.ino @@ -240,8 +240,11 @@ void info() { DEBUG_MSG_P(PSTR("[INIT] Flash size (SDK): %8u bytes / %4d sectors\n"), ESP.getFlashChipSize(), sectors(ESP.getFlashChipSize())); DEBUG_MSG_P(PSTR("[INIT] Firmware size: %8u bytes / %4d sectors\n"), ESP.getSketchSize(), sectors(ESP.getSketchSize())); DEBUG_MSG_P(PSTR("[INIT] Max OTA size: %8u bytes / %4d sectors\n"), maxSketchSpace(), sectors(maxSketchSpace())); - DEBUG_MSG_P(PSTR("[INIT] EEPROM size: %8u bytes / %4d sectors\n"), settingsMaxSize(), sectors(settingsMaxSize())); - DEBUG_MSG_P(PSTR("[INIT] Empty space: %8u bytes / 4 sectors\n"), 4 * SPI_FLASH_SEC_SIZE); + DEBUG_MSG_P(PSTR("[INIT] EEPROM size: %8u bytes / %4d sectors\n"), EEPROMr.sectors() * SPI_FLASH_SEC_SIZE, EEPROMr.sectors()); + DEBUG_MSG_P(PSTR("[INIT] Reserved space: %8u bytes / 4 sectors\n"), 4 * SPI_FLASH_SEC_SIZE); + DEBUG_MSG_P(PSTR("\n")); + + DEBUG_MSG_P(PSTR("[INIT] EEPROM sectors: %s\n"), (char *) eepromSectors().c_str()); DEBUG_MSG_P(PSTR("\n")); // ------------------------------------------------------------------------- From a83115cb1b69b0f399377fb95f752ecf42715e8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Mon, 28 May 2018 11:08:23 +0200 Subject: [PATCH 10/22] Update API, backup EEPROM to last sector before OTA upgrades --- code/espurna/eeprom.ino | 11 ++++++++--- code/espurna/ota.ino | 10 +++++++++- code/espurna/settings.ino | 1 + code/espurna/utils.ino | 2 +- code/espurna/web.ino | 8 ++++++++ 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/code/espurna/eeprom.ino b/code/espurna/eeprom.ino index 2ba9ab9c..3088f3fa 100644 --- a/code/espurna/eeprom.ino +++ b/code/espurna/eeprom.ino @@ -8,9 +8,14 @@ EEPROM MODULE // ----------------------------------------------------------------------------- +bool eepromBackup() { + DEBUG_MSG_P(PSTR("[EEPROM] Backing up data to last sector\n")); + return EEPROMr.backup(); +} + String eepromSectors() { String response; - for (uint32_t i = 0; i < EEPROMr.sectors(); i++) { + for (uint32_t i = 0; i < EEPROMr.pool(); i++) { if (i > 0) response = response + String(", "); response = response + String(EEPROMr.base() - i); } @@ -35,7 +40,7 @@ void _eepromInitCommands() { void eepromSetup() { #ifdef EEPROM_ROTATE_SECTORS - EEPROMr.sectors(EEPROM_ROTATE_SECTORS); + EEPROMr.pool(EEPROM_ROTATE_SECTORS); #else uint8_t sectors = 0; if (EEPROMr.last() > 1000) { // 4Mb boards @@ -45,7 +50,7 @@ void eepromSetup() { } else { sectors = 1; } - EEPROMr.sectors(sectors); + EEPROMr.pool(sectors); #endif EEPROMr.offset(EEPROM_ROTATE_DATA); diff --git a/code/espurna/ota.ino b/code/espurna/ota.ino index 2d730f43..172becd5 100644 --- a/code/espurna/ota.ino +++ b/code/espurna/ota.ino @@ -133,6 +133,9 @@ void _otaFrom(const char * host, unsigned int port, const char * url) { } #endif + // Backup EEPROM data to last sector + eepromBackup(); + DEBUG_MSG_P(PSTR("[OTA] Downloading %s\n"), _ota_url); char buffer[strlen_P(OTA_REQUEST_TEMPLATE) + strlen(_ota_url) + strlen(_ota_host)]; snprintf_P(buffer, sizeof(buffer), OTA_REQUEST_TEMPLATE, _ota_url, _ota_host); @@ -140,7 +143,6 @@ void _otaFrom(const char * host, unsigned int port, const char * url) { }, NULL); - #if ASYNC_TCP_SSL_ENABLED bool connected = _ota_client->connect(host, port, 443 == port); #else @@ -214,10 +216,16 @@ void otaSetup() { // ------------------------------------------------------------------------- ArduinoOTA.onStart([]() { + + // Backup EEPROM data to last sector + eepromBackup(); + DEBUG_MSG_P(PSTR("[OTA] Start\n")); + #if WEB_SUPPORT wsSend_P(PSTR("{\"message\": 2}")); #endif + }); ArduinoOTA.onEnd([]() { diff --git a/code/espurna/settings.ino b/code/espurna/settings.ino index 6107fb59..2854c322 100644 --- a/code/espurna/settings.ino +++ b/code/espurna/settings.ino @@ -156,6 +156,7 @@ void _settingsKeysCommand() { unsigned long freeEEPROM = SPI_FLASH_SEC_SIZE - settingsSize(); DEBUG_MSG_P(PSTR("Number of keys: %d\n"), keys.size()); + DEBUG_MSG_P(PSTR("Current EEPROM sector: %u\n"), EEPROMr.current()); DEBUG_MSG_P(PSTR("Free EEPROM: %d bytes (%d%%)\n"), freeEEPROM, 100 * freeEEPROM / SPI_FLASH_SEC_SIZE); } diff --git a/code/espurna/utils.ino b/code/espurna/utils.ino index 7d849954..1213ae7d 100644 --- a/code/espurna/utils.ino +++ b/code/espurna/utils.ino @@ -240,7 +240,7 @@ void info() { DEBUG_MSG_P(PSTR("[INIT] Flash size (SDK): %8u bytes / %4d sectors\n"), ESP.getFlashChipSize(), sectors(ESP.getFlashChipSize())); DEBUG_MSG_P(PSTR("[INIT] Firmware size: %8u bytes / %4d sectors\n"), ESP.getSketchSize(), sectors(ESP.getSketchSize())); DEBUG_MSG_P(PSTR("[INIT] Max OTA size: %8u bytes / %4d sectors\n"), maxSketchSpace(), sectors(maxSketchSpace())); - DEBUG_MSG_P(PSTR("[INIT] EEPROM size: %8u bytes / %4d sectors\n"), EEPROMr.sectors() * SPI_FLASH_SEC_SIZE, EEPROMr.sectors()); + DEBUG_MSG_P(PSTR("[INIT] EEPROM size: %8u bytes / %4d sectors*\n"), EEPROMr.pool() * SPI_FLASH_SEC_SIZE, EEPROMr.pool()); DEBUG_MSG_P(PSTR("[INIT] Reserved space: %8u bytes / 4 sectors\n"), 4 * SPI_FLASH_SEC_SIZE); DEBUG_MSG_P(PSTR("\n")); diff --git a/code/espurna/web.ino b/code/espurna/web.ino index 8deb4c4d..d840d604 100644 --- a/code/espurna/web.ino +++ b/code/espurna/web.ino @@ -231,7 +231,12 @@ void _onUpgrade(AsyncWebServerRequest *request) { } void _onUpgradeData(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) { + if (!index) { + + // Backup EEPROM data to last sector + eepromBackup(); + DEBUG_MSG_P(PSTR("[UPGRADE] Start: %s\n"), filename.c_str()); Update.runAsync(true); if (!Update.begin((ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000)) { @@ -239,7 +244,9 @@ void _onUpgradeData(AsyncWebServerRequest *request, String filename, size_t inde Update.printError(DEBUG_PORT); #endif } + } + if (!Update.hasError()) { if (Update.write(data, len) != len) { #ifdef DEBUG_PORT @@ -247,6 +254,7 @@ void _onUpgradeData(AsyncWebServerRequest *request, String filename, size_t inde #endif } } + if (final) { if (Update.end(true)){ DEBUG_MSG_P(PSTR("[UPGRADE] Success: %u bytes\n"), index + len); From cbfcb32e804de62ef457eae1dabeea219e60c935 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Mon, 28 May 2018 11:25:23 +0200 Subject: [PATCH 11/22] Freeze version for EEPROM_Rotate library --- code/platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/platformio.ini b/code/platformio.ini index eb0dec97..55beecfe 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -57,7 +57,7 @@ lib_deps = https://github.com/marvinroger/async-mqtt-client#v0.8.1 Brzo I2C https://bitbucket.org/xoseperez/debounceevent.git#2.0.1 - https://github.com/xoseperez/eeprom_rotate + https://github.com/xoseperez/eeprom_rotate#0.1.0 Embedis https://github.com/plerup/espsoftwareserial#3.4.1 https://github.com/me-no-dev/ESPAsyncTCP#55cd520 From dff81d6795c4b6647463645c2f484be578d10562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Thu, 31 May 2018 00:29:22 +0200 Subject: [PATCH 12/22] Revert WS to ticket-based authentication --- code/espurna/data/index.html.gz | Bin 64897 -> 64939 bytes code/espurna/static/index.html.gz.h | 898 ++++++++++++++-------------- code/espurna/web.ino | 10 +- code/espurna/ws.ino | 70 ++- code/html/custom.js | 29 +- code/platformio.ini | 2 +- 6 files changed, 533 insertions(+), 476 deletions(-) diff --git a/code/espurna/data/index.html.gz b/code/espurna/data/index.html.gz index 88a08a58aa77de554057b06d6d8d681050cc42c2..d0d83fc880005772729898a7d8c1b4c01571bdcd 100644 GIT binary patch delta 9045 zcmV-bBdXki`va@{1F)vre^Rj&-IUI}lOgGv=V)_@0X|%E6NDi9>iBBymxG_#Z7kd; zvEWsqVh4uUlBT}L-95^%NX%D%ftoUU9CF~ZXE`} z7$7;ev0rcNC=)J=5Wv57ma}Yap%&ttn4p1@tgZJ0O_C7kH*@903gZV<41bU28HRr~ ztY<1qVewnq3X4y+e-;juU<4W#@(=ihSB+l4y!`j%9S?nu!1mkdEV)TW4D7-JZTRYP z#)^?ArUI>cN9xz0>|V{1GkTK48&Cg7%@A$Pj8sL>Y_I|7?p+Ptu(IkPTxVVbRNB=9*I?1uBU8qHf3L^yDHmt}nz){-OA&q|v9L)+0$XV1mlhP^!QrZO= z&_W5{0@W4%YcI={roWoSEk_Zpg$_k4cQ=AL2D~%@>9BJ=yA+!^xl2e3n;Jza*#AT$RAYy7i1rTWX=tt6!ls)!tf-tPtCv z4yx{>{hL6$t=1}`SLEC3*sj$vQSlG;nIhjkD_&{^f2?#BqXTf5N&KY z4^W5S%-To>33=>3K4D4UkfTC>-xX$I^emP}m&r7ObwL5z_F#&ZB*9=uo!w&co->2*v5pOcY~@KCe=`YAyPzntvQESz9 zi|9Pc6R46RZ|DxhC65-j5@jwI6hXu$oEUlme{NaiZ25aFE`V~TjhsbwdoFy)B>SiL zS1HD_iSzO+b0HXNk|d-B3MIl zf5Ig9fZpSY1DSZ^!fa2VVQED-mO7IVvLG^UaC`Zn9DC!4R9Gj)bME}430b0dQnb8* zAk)ON>Tr>JWo=l11EZ{+q466@H;LF1d$NgZdym$(c4bFYURYJMP;UQ)8)j1fMhVCc zX%t!2Q`-CUb6NZDr*v&?2cacIe{XxRZDQ`HbZ3hSSAkrPvX+Tfg~TBg2@Q-Y z?GaWFk+A7q@J*Z1{msax&&cyRVW161@&U!0G^PyjK7F*aWdyQW(f_;Fd47K9N>h!d z=_-=)sOMd&V`bF@ao3vHd*=FdZEyPee?%{{ zYWt_dQE`sPTE*rfGiI>0LQkaBXqhq_gUtg^!-2qc)K1a4hTJdpz)@AyZgzG@cV=M8 zm(hF_iyt!jnZ2jkyJDRmA@}fja!C^|b84}2lbBWo=NXvdLor7@fc&=hEXS{(BHBSm z1oOeCI(tJfnkZdOq*W88)X}g-x2Uj+x&$_o1 zAHf=2YX6#`2gwZzYpZ5zi@^YHKfW=hy_xwF>QtNKn7++`&wQR;X;UMS;mYy78h~Rw z$)7Waf!7#5^wg==QXXK-P=vbq_ATj3`7!YU;%)=$XbBst2u}`x7@?Dyf9UzwedPIp z;Gs@4SXy~BrC3_>d<{!ToA$bL4gc#s|aC=6}x@<*~b}OY+8V|v8Av!>5X~Z z>BF8Hn_M(Wmc@;EkTNt!f9jxJaL~~zv>_J@^bzkVt^eW=siL~fu zxM{L6SplIb2B&M?jm{chV?H>hyJ7cl9-cp;`$HsChqo#as#JtzXYGfVvf9PC|eKF{l0!|WM z{j36Prrca64jbt(GRMBXJ?I(BN5sPuO9&%kQ2ioqgted)FfXduv8deT#S&BHjb+x@ zsH+SuytrenIjaI|%=D{RZP-v8p@xpbM#fHAIUw|kLNwz}DT5+bftAPzq6#YHDEG_4 zQOXd^a6p=tcY((de-8OtiAM$g5=z<)u*(HQl3F{)e5&R{U7n^86KkL)gEwk3POBR| zIC1R-2Xk!bq&h=y>*d}1xT1&l_0qh3I!2kc+D7I?^;~0y%!^fZmWbJ>itxk9|~-4e`mNli8d?fo?UGcHGYAy zwokUk~mC6FtaL_X1PaWB{qUyg(Ph z7%)F`hJ+A8B?rj)ISTQW;K6|4PN@7!e&B%OTnSqV1RS6T9GcIVLW3uPeyJPuSYb`eI$vlG~xBzF=88G53Ouh!7FKlMasZEpl+HDWhD!|>A% z1zroU>HISU_QAEe#QL@MBpO+os$b&Qw=Xm6;tj(h^ zoYBd~Mplios$b^*=2oU$k5=>a-ZeAT5J1RS3+TUrx1K?EbVJrmZYW!|qo-mNqnH(x zTi#pJ*Aph&Yp6Yd_6SAWtDNM=Uy`Cke>bM$CDUGC9tGsgZ-&x@)UgJKrN)(@gXoB2 z+s~0|Q>KpX4{;;-ba8T*0S&F`7q2wtSog8cWx-=l0E=eSY^-QE+puXdmP^6K>9#m{?3Z~pe; z^uyk(7pLzJ-n@GA4wc%8vW9QR%EA zQ9IL#gr>nrBlz3$+77Ca*APd4-RWaU_dTnDAG8+O?MUACehB2pRR0*me@Cr?NLCR2 zUN{D1vhKh&`ay5&F4(G%sD?TkMPqI77b+7zT14Z8_46Ttqkg`vqR7wlTWsk`9ztp&&KfQ{ZwEa+G4YXr1{i6Y5(x;xYs`!ed>-dSoM#aL`RH85F>;PMS~@05 zBZfg8!@$nIGs@F@p*+0}<$TnLbR9?P1;z+|qtkj|)?nw?3;A~+pz*zWJ6_$}+;@!9 z?}~18FLW(v3-Vg*8KJfwkq7g#{b{wiOZ@lFc+)lqgZ9UG#;AXkqFJ7It8 zDO@*q!zWu$NBu#()8G1W)bBjqY{ebOg3;N13_0}u7{Af!DS$)X#s(DcJ`tr5CWc=K zEy{PFAb5n}f88epEgIR~=F(7@0JpiJCsolW+*B5}l6I@#N&HRtKlE}l57Mwzv{?;N zrOm@uglSQgCZ15P^FbC&2Wc=K%x{n)!1WzvuZv4JMd*E02;MHDFCq`x`KULDLr7~qZMVu!?r+Wge;=L>N=({rxAIO5DT5q8AGe{u zC4NHLt?(%jEDNq@1Hffa1eb$|(00CQ<*3UoOi>m~SdCJr31tva1&kH^yBzd`9R5w= z-x&U(6oLT@J@z@*!JbN_5(EpfVbY5y%=KPyjo3(ezOU*LGHHP#f7yOdXTidYx4AEFBjwV&% zM>~Y{8oBoI(5LSfzAx-{xocNc#o9I67f(qNJ6KynWsllP+w-A=ojhK|QMqO|rJb+9Qa*TH%N ze=93s@Kc8L?QNsWUim)q;;6lg$EJyl98Q9MwCl=3Oqz4v^E{LmHDp`mg4!@jrw~e;@n-fBydXLm~07c}q6{@L}D6^Wt9J0QmcNgAS!z zdH^sF>%l=hxmOPW{{B6HLbu=#5D&xuRgUqt@6!V+asNJ0v0HjUFc0g;v-v$&G#0pj zFP_~#l@R1%eb}2XX3@PmK_%|r3o3R?Hwflo{rJF&7)?lv>}S~*7n=QQ`yq=&e^_61 z?C9un!@{<*atJM4o$Kd8u-0|avr6VZSzz7@vq-iE>s)02?4Wi@N4kGtM`SXaZT43{ z++LQB`3~x&&r1~Y&Or>d;1tg>qO zJ!-oRpRl!J(Z* zDuY?rQdSFd%4`dOo&I)j)E~@uw;%ULE%@kEfE|(^ZawV{<^)FBb4ut1%TNP^41eb- zR%9ota#n_@RdgIFTOvVu6TL7XAP znSvOSCi$GT-i7+nf)qdY>Hp`b{1GtF0s7m^f+)Zj`x_-K>y{Z!T=MB-&1~ELy>JN- zbjvIh#;gQs7Ex$kPe_cj5(Gt!#4N7{tK>79>_|LETC$zo6#aBHe|<)^suFZEqX~gD z>Cr4I_TU^&#>+AmF;%Y479G^5+t^T=!TE7=va!*^KcQ9_DAH6oke*Gk%!mrE_b?*; zypXA~!u7sih4CX)Np!1}WcBU=y!67JH0p3CN{4&cV6`h$iHnnw@kRIui{h$5LRL;Y zHZN$NNHv*MUFg*Ee*+X$vHh78O=(}cFsdRp>3L(&TyH$j&OUpVz>ZaBg^`??tj*E{ zayAv~z!(hNtt3tgQLxkSrL(s`27pql>f{ZUePfRCUZ?twqB^X&?% z2<1kLxr|#Or$}zc)WxRlFuQdiM8JlU=48U|RFO+0PV(rAe=h??OPQXrgG8B(NaHDf z4ku=Di}(jCKPA9ZqKPa!o-gye6h$~u(jSQTS(j)P<+v`1>+LhdQ3{b115guHCb9>s z7^7M@6!0l&d`n@m6G=`KoYL(yrYR#x%$19xx00Ak5``sJT=H}L^%nUi7bQ4#n;8KH_UB=UC)gi32fe$EQ=QXI=#nfS?{NH?cxN{R`ma-HWNpAsr zwD@4wO|o{^ZPr%0au21oGLGRuGPmDSMPkQT zNFqQ^j^@IR^HAlxC!5M{m{BUfY4RX|d(+0Pz{eQje{mV#a%LGj-5n^YlMMEV_5M(X zp(7at?DB>v8e@1!YUhf?Wo5=Jz{QymXgPEo2=@`f$zzhHaZbh@J5ZZu+p)1BT3Odx zkq~4g0PIq|RnDj9sfWlmq@YEGQqmfLgh`BU)zu}4SR46<#`KN&OqT{Aj<+_lup<5E zD{l~me@--^5nWH(1^0Rxn^1)d>M$xzs7n{r-y*BU+y!-jR{J{C)CEQINE2@CfT%4%kWl!5#_@uX)cZFfn&}z;SdGYla z7VdV`Ug3>(%ZAaTW=?M#fmcQoov?nLkA ze-e%KuIyYjM6h2o%LwyKAO6|BhktfQbY^!TXKUF}=ym%3=9#}GKjrke+m+4W>8s<9 zL(XZM5n?yc>NGEDBA)}=S&Wr36F%;pkni9sp?|_$5*}M_%ivm*iFpJU(qRkqE{MW@ zKzmUl_o5($Bv|+X`s1IWPyP@kMJVU#e-D!`nsKrraW?`mOKbyI9+<54)G02UTI$$` z%HbLd)x+@x4HVr=UXJ^r{d7>hQ1B93-^c5(y|>b=I}i7T0JA1T9G+WZBs2?}lLTo( z|7YW(l%z@LUGlt6;-p^CBXLr2UWu4w+KqCIq8LLW(t3ULr?q}*&qbnRQ%A?Xe|;0? zpO@jZsc*qmcqy)AKf|Rt%3onDFBG~WqCGr4u87^hfj=y>1*A8TpzmXSCUn0Mx`)u0 z8fCBG%cLDTU=Sci+6_k@vZloZmw&BwS$o43o&I%If2aQ%{@U2-&*5Kh>GWr3r+H+#>!LTGotFyHd9iWPiPi?5A!=2TI$vwS=92 z;SW!{xqYmi;t_b-oz~N*m_DwjkNM0y2wyi2_1o~^mZ5&zFuPCD;yJ*-Q}K7qOZIKU zEVs~GI1R6xQ?cp;ZHV5Af3Nxwy{`?CQY8{Y^nTS4?cF{^XK;=U_v%BmheNbiAEG@R zqP_YM?a3i}6~1pAqNDKDEkktFFhqM|i1x$~?a3iJs;_|_t$|k>fse$ON#HxNvW6Vm zdWN{2lWh|95MxQk1H`75_h3^SWED6Ul16r~aF-KW1Ndz0%opm5e*hq~!OyaywY@1H zbzvg;@V`Q8h8Icd%AJRayZ~)&1LvEl%g5ICu+ZET2lIBesln2v!w&=q46heVI_aif zUV!v1siWZwMSA{ehS=EX*# z2X|?O#s?dXslR#ULgS-T^k-o4u@Q^0v#>&9Y$GxDH$S?NfB4lcSiF^;m%O~Qv_j*r zHX4z?`Kyh_eRh0TAOkbTivDid@M?LNmfnz}#C=Z|`}M^(UJ;MsQ~Ai`%V#GI#s;z8 zmV{#}R4HKMR`v{@;ex592}{_0jjW2&x|h4%CnHe@rFi&!5z%wCm3)Pf4N(Am3(@v~ zSeN9JGtcIRe?Es4tya&d`q>)ka8o!NAk36S$Ihs_;lp3uH5R5jbnsF`18+|HcN2<;Fu{ljMHfA&ZEQ?- z_?PmfMgTpoc!rjDDRDGte^=?{&9_p(MDb_-a7JMlW^MHSAI$X+`9A%+xNOaWNf5yq zTiIULf99Df-fx_5Qo9nV+b|{kt%_22m;qWn4;Un)G3LC03P7{@ZXY!chmzh)o8F^k z*c+(a-F~M&9!q_|maqZVVU|1HCv8_r9D+ir2e-X9;6B zg@0pb5%ExH7K*xgzy;lf_|>pp1{*?!MOT^Ee`XP!SJ*&7Gs{(g9!<>xQFkWrau=Z& z)OrzYr3o$ZvRM_P1X8=aS)m~@70Mw^tO1=2D~q$bqOBWj>H)Z%>E^;B6qOXDXU5&I zC(m|1ZViWfditi?TKYY$0;#6!$Y?y~;}s`#QSV>%=BaxKgMQ0SCL>erCV>)z)!b82 ze;WmI0Lc~Bo{M7D05dxXJCHsS@{u-~qZT9tFih}o4F4h>ayHWD7edYeqJV#wHe@t1 zCzZ&)wNHqFLAikJv4MV4ag^TG(Mh{-kf?DZSr_<1*gK|S4*wsAiSYJ}M#mXUjG}rS zmnPucgc^vfI}20jRn{%wZvlTV;qPTLe|uYFgd?$>H176RPMG^`S)*$)y3FCBOw#pD zR!>75qu)Tw8PT#JT3)WArIM%Fw9J8aIgLjO^9e^Jg*o*vr)Ax;-$6^Bz;~u4&0^sE z1zMuualMCXbwXBkjectLJ98pZH{-SOCQmMJn=7d^wBn8a&bqcM?yQS*f zFd(SXqxlX-RUX~_FRF!gQ8kY=S)Eq-zS8t7YDcot9g{p{WkX(^!If=(1hmGx%H63u zOn0(TRgH=(r0T-}VuREkgx##If9uC_GB9xl(8k8W<@KClJ^A28G!h8Bf6xj9PkA+Dj)nZhGC#wU-Gjf3@t(7GQI0 zgDxz!>@1C0t<^AvyaU2F#&FcMtRFG}%JfBB+uy#ml$k(YZ4pA$MB4-|2(B6Uujv${ zT8N0_E)+>e*D1YOg&k_==v-vgx<7=&IjOkF0;8(cn?17vx&039CernpOn$*-KiTp+DM`$YHfcc(Pg}T$;2O%v!~9c7n4-?|88+P(?PLaHKj97*q#QE3=f}e{YP}%|XVsQ(Lx< zk*6)n#L;DJ+>9q6ly}eOSrHedCT*0u?bVRfdIHR3OUbUrw-@h@4zaz5+nZ$%v^Nu1_H5+_?CV>5 zsZKnDGeRIgD z+`rLA5*UEW5K}xWMXt9myw~1op0f2)W=~BRU!QLrZVz0}e?@k$$(gIkS=Pe-38j|b zW3fsvgia!rjzvk4M=4^UdD?33!<8A?y`Psx3BCs#x7#` zz_YE|`4ZzaHm%rQrzvVP$*Z^x%GOF7f&CeOqb@Iis2_L z0mAOKe=F{$IWPM{OeWG1;s;pW@9Aw<`9fTXV4Z`tXk29TWf>3GP^1J*=o*QI@P{zv zz@Kcs0lzf2i9B7EixC)D;a}w0*Ef?^z3s+_v!RN@OO#vQ_*l>(w)lg19^sO!s(iMb zzD&LtcUeR#{(X^(gC4u@KQHOgGe(&Y+*DUZmg>=+`37cQi$i*8QT4WP_U!&Y%{2|^ HTyO&be-hxc delta 9003 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 diff --git a/code/espurna/static/index.html.gz.h b/code/espurna/static/index.html.gz.h index 331f0ef4..f7e3f0d2 100644 --- a/code/espurna/static/index.html.gz.h +++ b/code/espurna/static/index.html.gz.h @@ -1,4 +1,4 @@ -#define index_html_gz_len 64897 +#define index_html_gz_len 64939 const uint8_t index_html_gz[] PROGMEM = { 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xec,0xbd,0xeb,0x7a,0xda,0xca,0xb2,0x28,0xfa,0x2a, 0x0a,0x99,0x33,0x13,0x96,0xb9,0x63,0x6c,0x8c,0x07,0xc9,0x02,0x8c,0x6f,0xf1,0x1d,0x5f,0xe2,0x64,0xe7, @@ -2798,451 +2798,453 @@ const uint8_t index_html_gz[] PROGMEM = { 0xf9,0xf7,0x42,0x79,0x70,0xbb,0x5d,0xe9,0xd4,0xeb,0x56,0x07,0x21,0x01,0x53,0xae,0xd2,0x1e,0x57,0x76, 0x13,0x46,0x26,0xa6,0x04,0xda,0x8d,0xbc,0xca,0xc1,0x94,0xa0,0xb1,0x27,0x01,0xaa,0xa2,0xf7,0x05,0x1a, 0x9d,0xce,0x2a,0x34,0x28,0xb7,0x09,0x0d,0x91,0xe9,0x40,0x43,0xe4,0xdc,0x82,0x06,0x86,0x41,0x35,0x85, -0xf0,0xbf,0xe4,0xba,0x00,0xfe,0xd8,0xbb,0x42,0xc6,0x59,0x59,0x9e,0x79,0x42,0xb1,0xf4,0x64,0x48,0x4a, -0xe6,0x39,0x1a,0x5b,0x62,0x64,0x0f,0x97,0xc0,0x04,0x21,0xc8,0xb0,0x3a,0xbe,0x5a,0xfb,0xe5,0xe0,0x67, -0xf6,0x17,0x0b,0x17,0x49,0x2c,0x78,0x55,0xa8,0xa0,0x81,0x21,0x36,0xa1,0xe9,0xed,0x71,0x3f,0x8f,0x32, -0x2c,0x12,0xf3,0x9d,0x5f,0xe0,0x14,0x08,0xad,0x61,0x38,0x2b,0x85,0xfa,0xf0,0xd9,0x3c,0xa3,0xd8,0x7b, -0xe2,0x9b,0x9a,0xfa,0x18,0x8f,0x0f,0xe1,0x77,0x5c,0xb6,0x64,0x4b,0x14,0xa1,0x51,0xc2,0x74,0xb3,0x54, -0x30,0xf1,0x2b,0xb5,0xbf,0x8d,0x20,0x79,0x5b,0x9f,0xd2,0xad,0x69,0xe0,0x7d,0xc2,0xa0,0xdd,0x5a,0x62, -0xce,0x89,0xb9,0x91,0x58,0x72,0x62,0x89,0xd3,0x19,0x66,0x9f,0x2e,0x0c,0x2b,0x75,0xf9,0xb3,0x66,0x6f, -0x83,0xae,0xd8,0xa2,0xbc,0x2c,0x28,0x6e,0x0e,0xb3,0xc4,0x1e,0x05,0xaa,0xb7,0x93,0x0b,0x4a,0x87,0x15, -0x55,0xf1,0xcd,0x40,0x15,0x83,0x62,0x92,0xd8,0xb1,0x61,0x97,0x2a,0x21,0x84,0xf3,0x20,0x04,0xf0,0xaf, -0x9d,0xe5,0x2c,0xab,0x57,0xa8,0x85,0x78,0x18,0xa6,0x5d,0xa0,0x64,0x5c,0xeb,0xfd,0x40,0xbb,0xd3,0x07, -0xfa,0x1d,0x59,0xb9,0x93,0x42,0x4f,0xfe,0x15,0xeb,0xdd,0xa3,0x81,0xc7,0x40,0xac,0x86,0x1d,0x4b,0x65, -0xb3,0x2b,0x7e,0x4b,0xab,0x5d,0xf1,0xc9,0x76,0xbb,0x81,0x12,0x51,0x40,0xc3,0x42,0x12,0x01,0xbf,0x90, -0xe9,0xef,0x05,0xcc,0x55,0x7f,0x4f,0x7e,0xea,0xd0,0xfb,0x07,0x6c,0x84,0x8d,0x6e,0x8b,0x9b,0xa4,0xb5, -0x70,0x70,0x2f,0xd0,0x9a,0xae,0x2e,0xf1,0xab,0x58,0x6a,0x3a,0xde,0xd1,0xbe,0x76,0xa4,0x7e,0x0d,0xca, -0xee,0xd5,0x2c,0x39,0xa3,0xc7,0x31,0xbc,0x7b,0xf4,0x7f,0xd4,0x4c,0xc2,0xd6,0xcc,0x98,0x51,0xf4,0xe0, -0x05,0x4b,0x51,0x77,0xb4,0x6a,0xf8,0x39,0x0b,0x2c,0x6f,0x38,0x68,0xe3,0xf3,0x06,0x3b,0x44,0x5c,0x6b, -0x55,0xaa,0x72,0x2a,0xc4,0x86,0x23,0xb6,0x4a,0xb3,0x26,0xb6,0xad,0xd4,0x8f,0x85,0xbd,0x53,0x07,0xe1, -0x3a,0xf3,0x1a,0xa0,0xd2,0x73,0x26,0xb8,0x06,0xdb,0xc2,0x1e,0x19,0x15,0xf6,0x7b,0x3d,0x7e,0xb9,0x96, -0x12,0x63,0x36,0x97,0xb5,0xd4,0xbb,0x84,0xb1,0x96,0x03,0xb0,0xa3,0x89,0x3d,0x1d,0x25,0x3e,0xe8,0x22, -0x52,0x25,0x94,0x16,0x26,0x6b,0x66,0x01,0x9e,0x38,0x16,0xa0,0xb2,0x1c,0xb3,0x61,0x45,0x86,0x01,0x8e, -0x72,0xa7,0x0e,0xe9,0xde,0x5b,0xe0,0xa8,0xe0,0x6f,0x40,0xce,0xa2,0xce,0x99,0x94,0x1b,0x19,0x90,0x52, -0x43,0xdf,0x80,0x16,0xea,0xf0,0x16,0xa8,0xae,0x7a,0x5f,0x7b,0xe3,0xad,0x74,0xee,0xd5,0x2c,0x6e,0x39, -0x8a,0x68,0x2d,0x74,0x28,0x6e,0xb8,0xbb,0x11,0xcc,0x31,0xe0,0xa5,0x31,0x46,0x87,0xdd,0xd4,0xd9,0xa5, -0xd8,0xd8,0xc8,0x5d,0x42,0xda,0xba,0xd4,0x28,0x4a,0xc9,0xee,0x32,0xc2,0x74,0xc3,0x2e,0xa3,0xdb,0x98, -0xf0,0xbc,0xd5,0xcc,0x52,0xf4,0xa7,0x44,0xdd,0x4a,0xc9,0x9a,0x43,0x7c,0x12,0xd5,0xe6,0x0e,0x25,0x1b, -0xa0,0xc0,0x2d,0xc1,0x32,0x35,0x21,0x4d,0x7e,0xc9,0x55,0x73,0x87,0x6d,0x67,0xcc,0x62,0x75,0x87,0x8a, -0xd6,0xe8,0x59,0x56,0xf1,0x9a,0x85,0x4d,0x6d,0xa0,0x35,0xd0,0x2e,0x77,0xb7,0xee,0x3b,0xa4,0x32,0xc7, -0x42,0x5d,0x73,0xab,0x02,0xe9,0xf1,0xa3,0xf2,0x15,0xc1,0x9a,0xe0,0xe6,0xaa,0x04,0x76,0xd2,0xad,0xf1, -0x6b,0x5a,0x35,0x0b,0xcd,0x5a,0xfd,0x32,0xa3,0x29,0xd9,0xd6,0x6a,0x64,0xd5,0xd4,0x06,0xc5,0x4c,0x75, -0x33,0xec,0xdf,0x04,0xda,0xbd,0xb1,0x56,0x09,0xbd,0xe7,0xde,0x56,0xc7,0x76,0xad,0x8e,0x89,0x8a,0x44, -0xa8,0xcf,0x14,0xf9,0x02,0x59,0x71,0x35,0x2b,0x60,0xa5,0xd3,0x16,0x1d,0xd8,0x43,0x7a,0x0e,0x90,0x41, -0xb4,0x3d,0x3e,0x48,0x0e,0x65,0x63,0xc3,0x79,0x80,0x3a,0x3c,0x58,0xd6,0x46,0x32,0x48,0xc8,0x77,0xf6, -0xf1,0x09,0xcb,0xdc,0x86,0x1c,0x9f,0xf9,0xfb,0xae,0x30,0xd0,0xa2,0x07,0xaa,0x34,0xba,0x4c,0xa6,0x11, -0xac,0x0b,0x0a,0x95,0xb6,0x07,0x53,0xb4,0x24,0x59,0x02,0xbb,0xcc,0xec,0x2e,0x23,0x0a,0x38,0x5b,0xe3, -0x56,0x12,0x65,0x91,0x13,0x5a,0x61,0xbb,0x83,0x24,0xdc,0x6a,0x9d,0xcd,0xf2,0x0c,0x26,0xc5,0xf1,0xda, -0xa7,0xad,0x93,0xd6,0xf1,0xa7,0xab,0xee,0x49,0xdb,0xdf,0x92,0xb1,0x24,0xbe,0x7d,0xdb,0x42,0x13,0xac, -0xcf,0x49,0xb9,0x02,0x20,0x43,0x5f,0x84,0x7e,0x6b,0x34,0xe8,0x6e,0xca,0xd7,0xb7,0x51,0x33,0xf4,0x45, -0x91,0xc4,0xfe,0x9a,0x23,0x4b,0x8b,0x0f,0x81,0x5e,0x1d,0x80,0xb4,0x24,0xa4,0xdc,0xe9,0x6d,0x6c,0x40, -0xa9,0xec,0x9f,0xc9,0x7c,0x2e,0x5a,0x19,0xad,0xe5,0x97,0x03,0x59,0x83,0x3f,0xd2,0xea,0x00,0x4e,0xe2, -0x5a,0x90,0x6c,0x80,0xa1,0x2e,0x58,0xd6,0xc2,0x48,0x41,0xc2,0x36,0x26,0xf4,0xbc,0x1b,0x54,0x92,0x30, -0xa9,0x86,0xa2,0x04,0x91,0x22,0xca,0x23,0x07,0x92,0x68,0xf4,0x37,0x73,0x8f,0x55,0x16,0xc5,0x00,0x32, -0x33,0xbb,0xa2,0xc5,0x30,0xe9,0xaa,0xe7,0x48,0x0b,0x82,0x89,0x5a,0xab,0xb6,0x5b,0x44,0xe7,0x51,0x9e, -0x40,0x95,0x14,0x03,0x43,0x77,0xe5,0x2d,0x79,0xb4,0xb8,0x95,0x28,0xc3,0xb5,0xa0,0x08,0x22,0x36,0xa6, -0xc4,0x20,0x08,0x70,0xdf,0x21,0xb7,0xc7,0xdf,0x6b,0x1e,0xfa,0x95,0x5b,0x6b,0xe4,0x2c,0xaa,0x7b,0x6c, -0xe1,0x43,0x26,0x59,0x22,0xbd,0xbf,0x4a,0x31,0xaa,0x4c,0x9c,0x97,0x5f,0x99,0x0b,0xc1,0xa0,0x8f,0x24, -0xab,0x2c,0x50,0x6c,0x40,0xce,0xdc,0xd3,0x13,0x14,0x99,0xaa,0x76,0x88,0xe7,0xe5,0xb8,0x8d,0xf8,0xeb, -0x1d,0xc5,0xec,0xa3,0x30,0x96,0x94,0x86,0x81,0x22,0xf7,0xc5,0x6d,0x11,0x59,0xd2,0xe7,0xc9,0x25,0x32, -0x29,0x94,0x07,0x5c,0x02,0x30,0x56,0xec,0x19,0x52,0xa6,0x4d,0x92,0x02,0x9d,0x15,0xa0,0x05,0xe4,0x21, -0x2d,0x3b,0xea,0x30,0xe7,0x39,0xf4,0xaa,0x61,0x3d,0x29,0xb6,0x89,0x16,0x1e,0x85,0xd8,0x76,0x00,0x3a, -0x62,0xf9,0x50,0x9d,0xba,0x66,0xf1,0xc6,0x06,0x3b,0xf3,0x25,0x09,0x04,0xf4,0x1e,0x4f,0x1c,0xc8,0xc4, -0xbb,0x0f,0x66,0x7b,0x02,0x0d,0x4b,0x3f,0xb9,0xb1,0xd4,0x99,0x84,0x90,0x05,0x91,0x71,0x4b,0x22,0xe5, -0x9f,0x1b,0x39,0x31,0x1d,0xeb,0xa4,0x78,0xce,0x9d,0x9f,0x34,0x21,0x4b,0xf4,0x4e,0x8a,0x96,0x37,0x10, -0x64,0x9a,0x78,0x56,0x1d,0x2e,0x72,0xaf,0xac,0x0d,0x0b,0x70,0x88,0x92,0xb5,0x33,0x34,0x43,0x23,0x39, -0x23,0x11,0x5b,0x62,0x4f,0xd6,0x69,0x6d,0xef,0xd1,0xda,0xd6,0xae,0xec,0x88,0xca,0x0b,0xab,0x8a,0x16, -0xca,0x01,0xbf,0x70,0x88,0x4c,0x8a,0xd8,0x28,0x8b,0xd8,0x21,0xdd,0x1e,0xab,0x7a,0x4a,0x7b,0x7f,0x7e, -0x2e,0x6b,0xdf,0xfd,0x94,0xae,0xad,0xed,0xa0,0x3c,0x66,0x57,0x40,0x98,0x1a,0xdd,0x6d,0x0f,0xb6,0x4d, -0xcc,0xfd,0x94,0xee,0x6c,0x51,0xe1,0x2a,0xa4,0xca,0x51,0xd6,0x32,0xd1,0xaa,0x90,0x38,0x84,0x22,0xa1, -0x81,0x51,0xa5,0xc7,0xc1,0x8a,0x1a,0x12,0x36,0xbd,0x0b,0xbe,0x69,0x33,0xba,0xbf,0x19,0xd9,0xf4,0x19, -0xf9,0x20,0x27,0x0c,0xb4,0xe1,0x48,0x3e,0xa0,0xa0,0x91,0xc6,0x94,0x01,0xde,0xa7,0x8f,0x76,0xb6,0x8c, -0x90,0x32,0x2b,0xfa,0x7f,0xd7,0x3a,0xcf,0xcf,0xef,0x5c,0x69,0xaa,0xd1,0x34,0x5d,0x45,0x52,0x5e,0x35, -0x76,0xdb,0x82,0x5c,0x9c,0xa9,0xc8,0x79,0xc7,0xc6,0x45,0x29,0x62,0x75,0x57,0x57,0x4c,0x20,0xb7,0x55, -0xcf,0xb0,0x46,0xdd,0x07,0xc8,0x65,0xac,0xac,0x9a,0x20,0xee,0x5a,0xf3,0x7a,0xcf,0x5c,0x9f,0xae,0xed, -0x4d,0x5f,0x9f,0xe8,0xef,0x55,0x6d,0xff,0x74,0x38,0x2a,0xce,0xf1,0x58,0xab,0xd8,0x5c,0x64,0xc6,0x0c, -0xb6,0x56,0xe8,0x89,0x94,0xdf,0x2c,0x53,0x66,0x63,0xb0,0x79,0xe0,0x69,0x38,0x24,0xb7,0x8e,0xda,0x29, -0xba,0xb9,0x90,0xfb,0xa5,0x1e,0xc2,0xa9,0x8a,0x9f,0xcd,0x6e,0xe7,0xe8,0xce,0x0c,0x2c,0xf9,0x32,0x9a, -0x8f,0x62,0xf1,0x43,0xc6,0x21,0xb3,0xf7,0x34,0x7b,0x57,0xac,0xf3,0x23,0xe4,0xa8,0x1d,0x4f,0x2e,0x69, -0x4c,0x65,0x4e,0x2d,0x56,0x33,0x12,0xd3,0xaa,0xe0,0x3c,0x03,0x53,0x7c,0xb2,0xe5,0xd8,0x03,0x90,0xdf, -0xd6,0x1e,0xc8,0xf8,0x1d,0x52,0xc4,0x1d,0xe8,0x88,0xb0,0x3a,0xf8,0x68,0x66,0x6f,0x08,0x46,0x13,0xa5, -0xab,0x89,0xb4,0x6a,0xa2,0xd4,0x9a,0x48,0xcd,0x26,0x72,0x56,0x38,0xa4,0x36,0xb4,0xcd,0x9f,0x9d,0x1b, -0x25,0x61,0xb1,0x5b,0x8e,0x8a,0x41,0x19,0x24,0x6d,0x57,0x13,0xfa,0xe0,0xca,0xc6,0xf4,0x59,0xf7,0x96, -0x22,0x15,0x58,0x83,0x4b,0xed,0x5f,0x13,0xf4,0x20,0xb9,0x41,0xb1,0x69,0xd5,0x4c,0x6d,0x31,0x18,0xc0, -0xed,0xc7,0x37,0xc6,0xb4,0x37,0x33,0x7f,0x42,0xed,0x66,0x73,0x1c,0xd3,0xb7,0x19,0xf0,0x99,0xcf,0xb3, -0x2b,0x6d,0x6a,0x24,0x32,0x70,0x38,0xbe,0x1c,0x03,0x70,0x8c,0x27,0xf9,0x73,0xe6,0x30,0xf0,0x1a,0xc3, -0x87,0x9e,0x3a,0xd5,0x5a,0xca,0x17,0x6b,0x19,0x8a,0xa0,0x33,0xdf,0xbe,0x25,0x5d,0x29,0xc9,0x25,0x3e, -0x40,0xdc,0x6d,0x60,0x1d,0x2d,0x61,0x43,0x15,0x81,0xc2,0x01,0x10,0x63,0x65,0x32,0x13,0x3d,0xff,0xba, -0x8f,0x3c,0x3f,0x10,0x3c,0xd4,0x69,0x06,0x4b,0x2b,0x8f,0xa6,0x14,0xd5,0x4a,0x9e,0xaf,0x61,0x09,0xa9, -0x9c,0x8d,0x81,0x48,0xd8,0xeb,0xad,0x26,0x98,0xb1,0x7a,0xef,0x55,0x53,0xe4,0xdb,0xb7,0x9e,0xdd,0xfd, -0xe7,0x50,0xfb,0xdb,0xec,0x52,0x9b,0xc0,0x3a,0xe3,0x35,0xe4,0x20,0x9c,0x35,0x0c,0x43,0x1d,0x47,0xd9, -0xfb,0x22,0x6c,0x95,0xed,0x3a,0x66,0x1d,0x47,0x17,0xfc,0x2d,0xe6,0x38,0x70,0x66,0x1d,0x26,0x93,0x38, -0x28,0x90,0x01,0x6e,0x15,0x21,0x4c,0xb1,0x62,0xb7,0x4f,0x3f,0xfb,0x38,0xa3,0x8b,0x4d,0x0b,0xb0,0x36, -0xb6,0x14,0x60,0x26,0xbd,0x31,0x8f,0x3b,0x7d,0xd8,0x53,0x63,0x93,0x8b,0x26,0xc9,0xb2,0xb8,0x31,0x0f, -0x52,0x86,0xe6,0x98,0x19,0xb4,0x0b,0x0e,0x3a,0x5a,0x85,0x36,0x04,0x05,0x7f,0xe9,0xb4,0xfa,0x9d,0xc2, -0xb7,0x90,0xbb,0xa9,0x4d,0x2e,0xa4,0xee,0x0b,0xdd,0xad,0x5d,0x45,0xdc,0x3b,0x91,0x16,0x1d,0xfe,0x36, -0x4d,0x36,0x26,0x2b,0x20,0x34,0xc5,0x30,0x71,0xad,0xbb,0xd1,0x59,0xe3,0x6b,0xcc,0xa7,0xbf,0x74,0x37, -0xec,0x3e,0x51,0x57,0x70,0x5f,0x06,0x74,0x77,0x40,0xae,0x37,0xe5,0xf8,0x55,0x71,0xe7,0xb4,0xe6,0xb0, -0xa9,0x0a,0x6b,0x11,0xb2,0xb9,0x1e,0xd6,0x41,0xd0,0x9d,0xaf,0xa4,0x92,0x0b,0x15,0x9f,0x2d,0xd5,0x78, -0x63,0x57,0x7c,0xc5,0x71,0x4f,0x44,0x19,0x6b,0x58,0xc4,0xab,0x66,0x13,0xfb,0xd8,0x58,0x4e,0x65,0xd4, -0xd4,0xe0,0x8d,0xe8,0xf3,0xfa,0x58,0x8d,0xac,0xe3,0x1e,0xdd,0x9c,0xb1,0x57,0x04,0xfd,0x52,0xc0,0x49, -0xc2,0xbf,0x9e,0x55,0x80,0x0d,0x86,0x9b,0xcb,0xc4,0x61,0x23,0x1d,0x46,0xe6,0xd8,0xb7,0xb7,0x07,0x3d, -0x63,0xf9,0x88,0xc8,0x74,0x62,0x09,0x61,0x6c,0x0a,0xaa,0x5f,0x44,0x70,0xb0,0x16,0x94,0x02,0xe6,0x45, -0x15,0x3b,0x16,0x95,0xbb,0xbc,0x58,0x62,0xaa,0xbc,0xb1,0xcc,0x1a,0x1b,0x75,0x95,0xa1,0x85,0x17,0x77, -0xac,0x35,0x67,0x55,0x60,0x8d,0x99,0x7e,0x15,0xab,0x0d,0x1b,0x8a,0x23,0xd4,0xd0,0x71,0x00,0xc7,0xd8, -0x29,0x2b,0x07,0x84,0x5e,0x51,0xb0,0x64,0xdc,0x29,0x65,0x78,0xc2,0x2a,0xc4,0x11,0x99,0x23,0x54,0xe1, -0x7d,0x1c,0xe5,0x7e,0x59,0x38,0x4a,0x19,0x82,0x19,0x0e,0x0d,0xd3,0xf2,0x2e,0xf0,0x38,0xc2,0x21,0x5f, -0x2b,0xf1,0xa8,0xc0,0x5f,0x42,0x5d,0xba,0x01,0x76,0xb9,0x60,0x48,0x52,0x30,0xc7,0xe8,0x4b,0xd5,0x7c, -0xa8,0xcb,0xd3,0x14,0x62,0x62,0x0d,0xb4,0x64,0x18,0x45,0x6d,0xc6,0x69,0x75,0xa3,0x2f,0x25,0xae,0xbd, -0xe0,0xb0,0x8a,0x0d,0x9d,0x54,0x67,0xe8,0x6d,0xbd,0xbc,0x7b,0x1f,0x57,0xf4,0xd0,0xbe,0x5e,0x9a,0xb7, -0x4f,0xc7,0x28,0xd3,0x56,0xdb,0xc8,0x9c,0xa8,0x9e,0x6b,0xcc,0x90,0x79,0xb1,0xaa,0xce,0x12,0x31,0xfb, -0x54,0x11,0x9e,0xf9,0x9d,0xc7,0x37,0xf6,0xcd,0x44,0x3b,0x9b,0x62,0xca,0x4e,0x42,0x57,0xc9,0x76,0x3f, -0x30,0xd9,0xe2,0x8d,0x8d,0xef,0x6d,0xf9,0xca,0xce,0x4f,0xa8,0x79,0xda,0x09,0x7f,0x94,0xd7,0x74,0x39, -0xf5,0x43,0x81,0xcd,0xed,0x0c,0x57,0x27,0xd1,0x66,0x05,0xdd,0xb3,0xab,0x4d,0xa2,0xc6,0x2f,0x30,0xd6, -0xf6,0xc9,0xd6,0x78,0xbc,0x5a,0x9b,0xcc,0x03,0xce,0x5a,0xbb,0x29,0xb9,0x09,0x3a,0x1a,0xeb,0xdd,0x76, -0x2c,0xd7,0xea,0x0a,0x9a,0x99,0xb5,0xbb,0xef,0xcc,0xf6,0xb1,0x5e,0x6d,0x06,0x6e,0xa6,0xb1,0x7e,0x68, -0xa3,0xa7,0xcb,0xda,0x89,0xa8,0xb4,0xc4,0xeb,0x3c,0xe6,0x03,0x38,0xc9,0xf5,0xea,0x68,0xdd,0xd8,0x20, -0x8f,0xcd,0xd1,0xb8,0x68,0x39,0x98,0x82,0x4e,0xe9,0xef,0x72,0x27,0x21,0xe7,0x68,0x86,0xfb,0x40,0x36, -0x9f,0x50,0xb0,0x22,0x75,0x36,0x63,0xe8,0x3e,0x41,0x68,0xc9,0x21,0x12,0xef,0xe2,0xa6,0xc4,0x2f,0x0b, -0x37,0x1d,0xfe,0xe5,0x7d,0xd6,0x50,0x7c,0x81,0xae,0x1b,0x50,0xff,0x69,0xbd,0xaf,0x0b,0x04,0xc3,0x6b, -0x79,0x34,0x50,0x5c,0xf6,0xbb,0x19,0xd8,0xd7,0xec,0xf2,0x1d,0xa6,0xfb,0xc6,0x0c,0x19,0x78,0x9a,0xe8, -0x41,0x8e,0xba,0x17,0x98,0xb2,0x26,0x03,0x48,0xd5,0xe5,0x05,0xba,0x08,0xc6,0x80,0xf9,0x99,0x33,0x24, -0x84,0x10,0x2a,0x39,0x40,0xce,0xcf,0x51,0x88,0xaf,0x04,0x0f,0x06,0x04,0x77,0x42,0xe5,0x57,0xf2,0x03, -0x07,0x14,0xe7,0x4a,0xd8,0x4a,0x20,0xe0,0x00,0x3d,0xe0,0x20,0x79,0xc6,0x14,0x1a,0x3c,0x09,0xf4,0x4b, -0xdd,0xa0,0x2f,0xbf,0x79,0x27,0x18,0x3c,0x0e,0xac,0xed,0x0f,0x0a,0x48,0xd9,0x2a,0x34,0x51,0x69,0x9e, -0xe1,0x8b,0x97,0xf0,0x9e,0xa0,0xed,0xe6,0x37,0x30,0xae,0x18,0x08,0xfb,0x7b,0x5d,0x49,0x8d,0xb7,0xd5, -0xe4,0xfd,0xa1,0x94,0x0e,0x86,0x71,0x40,0x17,0x79,0x1d,0xc6,0x3a,0x12,0xf0,0x6e,0x0e,0x37,0xf3,0x60, -0x16,0x64,0x41,0x1e,0xcc,0x83,0x49,0x70,0x16,0x2c,0x83,0x85,0x30,0x16,0xec,0xef,0xd4,0xa3,0xa3,0xa5, -0x2c,0x35,0xae,0x02,0x21,0xf7,0xfc,0xc1,0x31,0xfa,0x36,0x62,0xc9,0x41,0x6b,0x22,0x7f,0x9c,0x85,0x09, -0x06,0x0a,0x1d,0x9d,0x29,0xa1,0xb1,0x08,0x21,0xe7,0x8f,0x26,0x83,0x6a,0x56,0x56,0x22,0xe5,0xa5,0x7a, -0xdd,0x2a,0xd1,0x9c,0x62,0xa0,0x34,0x90,0xd0,0x7a,0xa3,0x17,0xcc,0xc3,0xa5,0x54,0x11,0xcb,0x77,0xe6, -0xc3,0xbc,0xdd,0xf6,0xcb,0x70,0x89,0x7e,0x95,0x22,0xb6,0xd5,0x22,0x29,0x75,0x21,0x83,0xcf,0x46,0xa3, -0xd6,0x8c,0x30,0x08,0xb2,0x70,0x7b,0x07,0xd6,0x93,0x89,0x7f,0x12,0xf4,0x09,0x6f,0x81,0xec,0x22,0x8c, -0x8e,0x67,0x27,0xb0,0x37,0x49,0xee,0x24,0x0a,0x32,0xf4,0x09,0x19,0x5f,0xad,0xa1,0x97,0x7d,0xea,0x89, -0xce,0xda,0xde,0x08,0xca,0x6a,0xc4,0x6e,0x7c,0x86,0xe1,0xa7,0x1d,0x0a,0x81,0x16,0x5e,0xd3,0xf9,0x67, -0x08,0xec,0x83,0x6b,0x73,0x89,0xf5,0x6b,0xeb,0x49,0x34,0xb2,0x62,0x31,0x09,0x88,0xe6,0x95,0x24,0x00, -0x1a,0x97,0x91,0x91,0x5f,0x5f,0x43,0x22,0x7b,0xd5,0x02,0x32,0x40,0x56,0xac,0x1e,0x03,0x4e,0x2e,0x9d, -0x6a,0xe6,0x57,0x04,0xf5,0xe4,0x01,0xa7,0xeb,0x61,0x26,0x18,0x77,0xaf,0xd2,0x9e,0xa8,0x3f,0xb4,0xad, -0x9b,0x1e,0x92,0x61,0x8c,0x6c,0x43,0x1d,0x7b,0x09,0xb0,0x84,0x7b,0xe8,0x88,0x20,0xbc,0xdb,0xf3,0x59, -0x97,0x1e,0x5f,0xe9,0x66,0xc9,0x39,0x2c,0x95,0x30,0x91,0xf3,0xa3,0xe2,0xea,0xa2,0x50,0xc6,0x9b,0x57, -0xf7,0xb6,0x62,0x54,0x90,0xd3,0x75,0x72,0xb8,0xde,0x2d,0xb3,0x5f,0x30,0x60,0x0c,0xbf,0xc1,0xb5,0x0b, -0xa1,0x65,0x0f,0xf3,0xaf,0x18,0x92,0xe6,0x1f,0x6b,0xdf,0xcb,0xf8,0x8a,0xe2,0x87,0x34,0x62,0x92,0xed, -0x0c,0x57,0x69,0xab,0x08,0x27,0x63,0x42,0x67,0x85,0x16,0x82,0xf7,0xeb,0x5f,0x3f,0xee,0x7f,0x00,0x96, -0x50,0xc4,0xd8,0x22,0x35,0x14,0x19,0xf5,0x31,0xf9,0xf6,0x8d,0x67,0x65,0x22,0x95,0x59,0x30,0xda,0xb5, -0x1d,0x4f,0xbd,0xc0,0x08,0x0a,0x61,0x81,0x33,0x16,0x17,0x42,0xd9,0xd5,0xcd,0x9d,0xe8,0x8e,0x00,0xb7, -0x94,0x95,0x8d,0x22,0x8f,0xaa,0x35,0x1b,0x16,0xdf,0xbe,0xd5,0x5b,0xf1,0x99,0x0a,0xa4,0xa1,0x5f,0xbb, -0x01,0x27,0xc7,0x85,0x08,0x36,0x3c,0x0f,0xf1,0xb7,0x20,0x3f,0x46,0x08,0xc5,0x0e,0x61,0x88,0x8c,0x44, -0x1e,0xa4,0x79,0x38,0xc7,0x23,0x6f,0x65,0x6d,0x1e,0x05,0xc4,0x8c,0x4e,0x36,0x36,0xb2,0x6a,0x94,0x55, -0xfd,0x32,0xf7,0x37,0xb7,0x32,0xe5,0x7a,0xb4,0x9a,0xa7,0xf7,0xae,0x99,0xa9,0x86,0x00,0x42,0xc6,0x5a, -0x40,0xff,0x0d,0xbc,0xf5,0x0c,0xb2,0x68,0x1b,0xb2,0x8e,0x70,0x43,0xd9,0xaa,0x1d,0x3d,0x15,0xe3,0x09, -0xc5,0xac,0x2a,0xdc,0xf2,0xde,0xc6,0xe5,0x2c,0x9b,0x08,0xe3,0xe9,0x35,0xd4,0x1e,0x40,0xcb,0x80,0xa2, -0xed,0x55,0xee,0xea,0xe3,0x2f,0x49,0x51,0xa2,0x43,0x51,0xf1,0x92,0x69,0xaf,0x2f,0x8f,0x42,0x63,0xe6, -0x37,0x43,0x69,0xcc,0xe9,0x58,0x83,0xc3,0x52,0xe3,0x4a,0xd0,0x55,0x73,0x44,0xd1,0x66,0xbf,0x78,0x01, -0xb2,0x42,0x49,0x7c,0x85,0xdb,0xe0,0x3c,0xb9,0x24,0x8e,0x03,0x1f,0xbf,0xe9,0x2d,0x1f,0x3f,0xa4,0x17, -0x67,0xfc,0x8d,0x01,0xd1,0x59,0xe6,0x2c,0xbf,0x5e,0x72,0x55,0xf0,0x85,0x4a,0x5b,0x71,0x7e,0x19,0x7f, -0xc4,0x96,0x29,0xb0,0x4e,0x00,0x1c,0xb2,0xd8,0x84,0x70,0xff,0x43,0x03,0xcc,0x81,0xb7,0xc8,0x16,0xe8, -0x0b,0x01,0xaf,0xd7,0xcf,0x75,0xe6,0xe8,0x1f,0x4b,0x68,0xa7,0xfc,0x3a,0xe8,0x07,0xd2,0x8d,0x02,0x55, -0x91,0x8b,0x28,0xd5,0x83,0xed,0xe0,0x22,0x1b,0x27,0xcc,0x11,0xf1,0x2f,0x8e,0x91,0x8b,0xa1,0xc2,0xd0, -0xf8,0xec,0x2f,0xf1,0x57,0x72,0x9b,0x8c,0xfd,0x40,0x3d,0xe3,0xf7,0x4c,0x6e,0x04,0x2f,0xd2,0x68,0x41, -0x9e,0xf4,0xe1,0xef,0x51,0x36,0x8f,0x73,0x5c,0x29,0x83,0x6e,0xef,0x09,0xdc,0x57,0xbb,0xcf,0x7e,0x79, -0x75,0x7a,0xf0,0xe2,0xe7,0xbd,0xa3,0x37,0x7f,0x7b,0x71,0xfa,0x61,0xef,0xd5,0x8b,0xd3,0xf7,0x07,0x6f, -0x5e,0xbd,0x79,0x87,0x4a,0x6d,0x65,0x57,0xfc,0xe6,0x6b,0x49,0x2f,0xa0,0x68,0xdb,0x58,0x8a,0xac,0x12, -0x8f,0xb2,0xc3,0x32,0xd7,0x85,0xfa,0xa5,0xdc,0xdf,0x3c,0x6f,0xc8,0xea,0x19,0xa8,0xbb,0x86,0x61,0xab, -0xc8,0x05,0xc9,0x00,0x32,0xbe,0xf3,0x86,0xf4,0x8d,0xa4,0x1f,0xf0,0x26,0xa2,0xc5,0x3a,0xd9,0x7e,0xf2, -0x64,0x33,0xee,0xe6,0xb8,0x81,0xa9,0x50,0x25,0xfe,0xb0,0x1f,0xaa,0xc3,0x14,0x6f,0x63,0x18,0xcd,0xad, -0x9d,0xb0,0x86,0x6e,0x51,0x2f,0x3d,0xad,0x97,0xd6,0x42,0xf9,0x16,0x54,0xba,0xf0,0x85,0x4b,0xe0,0x5a, -0xe9,0x71,0xbd,0x74,0x54,0x95,0x8e,0xa8,0x34,0xba,0x9f,0x69,0x87,0x09,0x4c,0xd2,0x68,0x38,0xce,0xe3, -0xe8,0xf3,0x50,0x76,0x31,0xb2,0xfb,0x18,0xfd,0x07,0x77,0x52,0x9c,0x07,0xb5,0xd2,0x51,0xbd,0x74,0x56, -0x95,0xce,0xa8,0x74,0x56,0x91,0xa8,0x9d,0xe9,0x44,0x42,0x23,0x5d,0xa4,0x11,0xfc,0x6d,0x79,0x6d,0x07, -0x55,0xc8,0x7f,0x87,0xa3,0xbf,0xee,0xf4,0x31,0xa4,0xfb,0x9e,0xd5,0xc0,0x0f,0x5a,0x0b,0xec,0x00,0x24, -0x6f,0x7b,0x3f,0x04,0xf2,0x63,0xaa,0x7f,0x8c,0xe1,0xa3,0x56,0x41,0x24,0x2b,0x88,0x7e,0x2f,0x1c,0x03, -0x32,0x1e,0x77,0xe0,0x1a,0xfd,0xa0,0xb7,0x75,0x17,0x6c,0xd5,0x47,0x54,0x43,0x1d,0xcd,0x93,0xb1,0x36, -0xf8,0x0b,0x95,0x09,0x6f,0x29,0xa2,0xf1,0x42,0xfc,0xbd,0xb4,0x91,0x00,0xe0,0x1f,0xb4,0x52,0x5c,0xf7, -0x4c,0x6f,0xa8,0xd0,0x3f,0x2e,0x5d,0xad,0x46,0xb2,0x82,0x68,0x55,0xbb,0x6e,0x22,0x60,0xa9,0x1f,0xf4, -0xf2,0x77,0xc1,0x60,0x25,0x11,0xc6,0xa2,0x36,0x1c,0xff,0x3b,0x11,0x60,0xfc,0x83,0x56,0xe2,0x21,0x04, -0x18,0x4b,0x02,0xd0,0x28,0xde,0xab,0xf3,0x63,0xd5,0xf9,0xf1,0x03,0x3b,0x2f,0x95,0x55,0x72,0xdc,0x98, -0x81,0x2f,0x3c,0xca,0xe8,0xdc,0xab,0xeb,0x94,0x63,0xe4,0xfa,0xf0,0x3a,0x1a,0xf4,0x6f,0x28,0x06,0x20, -0xdd,0x43,0xe2,0x2e,0x05,0xee,0x6d,0x6d,0xfd,0x9f,0xef,0x8e,0x7b,0x9d,0x3f,0x47,0x9d,0xf3,0x93,0xeb, -0x1f,0x6f,0xbe,0xdf,0x4a,0x48,0x5d,0xaa,0x9e,0xf7,0x98,0xf2,0xe8,0x4d,0x39,0x29,0xde,0x45,0xef,0x5a, -0x49,0x37,0x0f,0xfb,0x3f,0x6d,0x6a,0xfe,0xad,0x39,0x04,0x68,0xab,0x0f,0xf7,0x9d,0x00,0xf6,0x87,0x2d, -0x0c,0x12,0x56,0x39,0x43,0xd7,0x0a,0x4e,0xdd,0x05,0xb7,0x6f,0x2d,0x38,0x76,0x17,0xfc,0xb1,0xb1,0xe0, -0x13,0x74,0x50,0x20,0xb7,0x28,0x59,0x4b,0xe4,0xae,0xe5,0xb1,0xb3,0x16,0xc5,0x23,0xd9,0x64,0xab,0x51, -0xad,0x11,0xe0,0xee,0xa4,0xeb,0x3d,0x94,0x74,0xb7,0xd3,0xbc,0x81,0x74,0xcd,0x34,0x7f,0x7c,0x0f,0xd2, -0xb9,0x07,0xa0,0x91,0x74,0xd5,0xac,0x7a,0xda,0x40,0xbb,0x0a,0xe2,0x4f,0x2e,0xe2,0xb9,0x08,0xb0,0x7d, -0x2b,0xe5,0x5c,0x78,0xdf,0x56,0x6a,0xec,0x28,0xf5,0xa4,0xb1,0xd4,0x9f,0xdd,0x34,0xab,0x57,0xf1,0x93, -0xb3,0x8a,0xdb,0xe7,0x5a,0x13,0xbd,0xee,0x4b,0xae,0xde,0x83,0xc8,0xb5,0xfd,0x20,0x72,0x3d,0x6e,0x2c, -0xf5,0xa7,0xbb,0x92,0xeb,0xe9,0xfd,0xc8,0x85,0x87,0xea,0xa7,0x02,0x23,0xc2,0x16,0x9b,0x2d,0x24,0xcd, -0xa7,0xee,0x49,0xfb,0x87,0x6f,0xc7,0xbd,0xfe,0xc9,0xe8,0x53,0x77,0x84,0x29,0x27,0x9b,0x3e,0x64,0x06, -0xff,0x7a,0x80,0x4f,0xbe,0x7b,0xc4,0x00,0xc7,0x3f,0x08,0x45,0xc6,0x80,0xa6,0x44,0x1e,0x5a,0x68,0x44, -0x90,0x43,0xfe,0xf5,0xab,0xf0,0xcd,0x9a,0xae,0x6c,0xcb,0xf3,0xdb,0xfd,0x40,0x4b,0x08,0xf0,0x9d,0xd7, -0xfb,0x01,0xef,0x9f,0x52,0xe8,0xa0,0x6c,0xfb,0xfb,0xce,0x59,0xf7,0x72,0x9e,0x45,0x00,0xe4,0xa3,0x9b, -0x13,0xc7,0xc8,0x39,0xe6,0x68,0xe9,0x98,0x28,0x8d,0x18,0x06,0x75,0x0c,0x03,0x3b,0xfb,0xce,0x28,0x4f, -0xef,0x85,0xf2,0xf4,0x36,0x94,0xf3,0x51,0x23,0xd2,0x75,0x1c,0xa9,0x17,0x18,0xad,0xf7,0x8d,0x4e,0xeb, -0x81,0x59,0x83,0x9d,0x5f,0x2f,0xe4,0xdf,0x7d,0x80,0xc6,0xf7,0xea,0xed,0x78,0x75,0x6f,0x73,0xdf,0x31, -0x4a,0xbf,0x2b,0xba,0xd1,0xbd,0xd0,0xb5,0xa0,0x2d,0xc8,0x6b,0xb1,0x67,0x84,0xda,0x7a,0x44,0x1e,0xf4, -0xdf,0x6b,0xcf,0xd8,0xd8,0x70,0xe0,0xf8,0x87,0xee,0x19,0x2e,0x0c,0xfe,0xdd,0x76,0x56,0x27,0x8e,0x7f, -0xec,0xce,0x6a,0x2c,0x84,0x3f,0x6e,0x87,0x9d,0xdd,0x6b,0x45,0xd8,0xd0,0x70,0x59,0xfb,0xff,0xb1,0xc7, -0x16,0xf7,0x42,0xba,0x68,0x5a,0xc6,0xff,0x11,0x3b,0xec,0xe5,0xbd,0xfa,0x7a,0xb9,0xaa,0xaf,0xff,0x39, -0xfb,0xab,0x7c,0x69,0xc6,0x3b,0x29,0xec,0x57,0x47,0xd9,0xc1,0x74,0x6c,0x88,0x0a,0x83,0x5c,0x3d,0x22, -0xec,0x84,0xfd,0xad,0xa7,0x70,0xdd,0xdc,0x0d,0x9f,0x6c,0x3d,0x1d,0xf5,0x07,0xf1,0x4e,0x7f,0xeb,0xc7, -0x51,0xbf,0xf3,0x74,0xb3,0x15,0x77,0x20,0x0b,0x46,0x67,0xf7,0x31,0xe4,0xd0,0xf7,0x63,0xfc,0x46,0xf7, -0xa3,0x00,0x0e,0x79,0x1b,0x1b,0x50,0xbc,0xfb,0x44,0x94,0x42,0x98,0x18,0x7e,0x21,0xb4,0x28,0xdf,0x7d, -0x82,0xe0,0x11,0x82,0x77,0x9f,0x10,0xb4,0x68,0x64,0x77,0x9b,0x4b,0x43,0x61,0x02,0xdc,0xe6,0x86,0x9e, -0x54,0x45,0x9f,0x70,0x53,0x59,0xd8,0x4a,0xda,0xad,0x7e,0x27,0xf1,0x37,0xe1,0xff,0xd0,0xcb,0xcd,0x3c, -0x48,0xc3,0x56,0xd1,0x66,0x35,0x44,0x95,0x36,0x0f,0x5b,0x11,0xa6,0x45,0x55,0x9a,0x78,0x42,0xb9,0xce, -0x07,0x59,0x30,0x1d,0xa4,0xc1,0x78,0x30,0xbf,0x41,0x8a,0x00,0xd7,0x77,0x94,0xbd,0x2e,0x2e,0xdd,0x14, -0xa1,0xf7,0x51,0x21,0x78,0xbb,0x88,0xbe,0x88,0x3c,0x68,0x93,0x53,0x12,0x09,0x0d,0x2d,0x66,0x9d,0x54, -0x85,0x8f,0x0a,0x7b,0xeb,0x61,0x36,0x9a,0x6f,0x65,0x80,0x73,0x82,0xee,0x37,0xe6,0xa3,0xde,0x20,0x0e, -0x21,0xad,0xf5,0xb4,0xdd,0x2a,0x3b,0xb9,0xbf,0x35,0xf7,0x7f,0x78,0x3a,0x28,0x31,0x69,0xbb,0xdd,0xca, -0x3b,0x31,0xa4,0x0c,0x72,0xfc,0x7c,0xdc,0x86,0xfe,0x96,0xf8,0x09,0x65,0xb7,0xc2,0xa7,0x40,0xb0,0x2c, -0xb8,0x9e,0x0d,0x00,0x97,0x41,0x11,0x5c,0x0e,0x22,0x42,0xdb,0xf9,0xa6,0x95,0xa3,0x2e,0xb7,0x30,0x45, -0x59,0x2c,0x61,0x35,0x4a,0x9d,0x26,0x94,0x41,0x40,0x15,0x30,0x56,0xf0,0xef,0x72,0xd0,0x0f,0x72,0xf8, -0x37,0x85,0x7f,0x63,0xf8,0x87,0x52,0x08,0x06,0x2c,0xf4,0x28,0xe4,0x5c,0x07,0xfb,0x0c,0x91,0x4a,0x10, -0x2c,0xc8,0x86,0x49,0x2f,0x9e,0x30,0xd7,0x7b,0xc1,0x35,0x62,0x23,0xe5,0xf9,0xbe,0xaa,0x47,0xc8,0xbc, -0xd1,0x46,0x89,0x4f,0x03,0xbd,0x02,0xe1,0x92,0x03,0x9f,0x98,0x5c,0xc9,0xa1,0x77,0x75,0xb9,0xf0,0xda, -0x66,0x1e,0x3f,0x14,0x98,0x61,0xc9,0xc3,0xde,0x08,0xfe,0x0e,0x3c,0xa5,0xeb,0x88,0x3a,0x50,0xa8,0xae, -0x68,0xd0,0xa7,0x7b,0x95,0x4c,0xa6,0x71,0xc9,0x7a,0x96,0x66,0x0e,0x06,0x97,0x9b,0x47,0x5f,0x5d,0x59, -0x58,0x95,0xa5,0xb9,0xdf,0x5f,0x0f,0xeb,0x30,0x68,0x56,0xf5,0x06,0xfe,0x02,0xe1,0x1b,0xf3,0xd0,0x7f, -0x28,0x4b,0xe3,0xe3,0xd6,0x23,0xcd,0xf0,0x80,0x5f,0xcc,0x3a,0x02,0x0b,0x6f,0xad,0xa0,0x57,0x7a,0xe9, -0x5b,0x6b,0xb0,0x86,0x3e,0x2a,0x86,0x9e,0xb0,0x41,0x78,0xe4,0x0f,0x73,0xc3,0x8a,0xbb,0xcb,0xcf,0xa8, -0xaa,0x17,0xa7,0x94,0xe1,0x37,0x74,0x31,0xc7,0x08,0x81,0x18,0xc8,0x32,0x6e,0x79,0xe3,0x6c,0xa2,0x05, -0x4a,0xc8,0x2b,0xaf,0x61,0x7a,0x41,0x00,0xa7,0xf7,0x13,0x74,0x52,0xf0,0x4b,0x3e,0x6f,0x6d,0xc3,0xf6, -0x33,0x44,0x63,0xa9,0x38,0x9a,0x54,0x85,0x1f,0xed,0x10,0xd2,0x6b,0xe4,0x64,0xc7,0x43,0xef,0xba,0x5b, -0xf8,0xbe,0xb0,0xdb,0xe5,0xae,0x5d,0x51,0x15,0x6b,0xd7,0x68,0x5f,0x3c,0x25,0x49,0xec,0x60,0x6d,0x09, -0x95,0x3d,0x6a,0x27,0x6d,0xcf,0x87,0x0e,0x76,0xf2,0x78,0x11,0x47,0xe5,0xda,0x19,0x3d,0x1a,0x8b,0x3f, -0xc3,0x9b,0x9d,0x2d,0xaa,0x16,0x2d,0x92,0xb0,0xc9,0xf2,0x62,0x2e,0x0c,0x42,0x85,0x26,0x5c,0xfd,0xe1, -0x49,0xa3,0x07,0x82,0x9f,0x0a,0x40,0xbb,0xbc,0xd4,0xa0,0x7b,0x70,0x05,0x4a,0x69,0xef,0x8e,0x35,0x20, -0xa8,0x13,0x89,0x07,0xd4,0xc1,0xa6,0xa8,0x5c,0x07,0xeb,0x0d,0xac,0xac,0x80,0xc1,0x4f,0x19,0xd2,0xb7, -0xb7,0x8d,0x2e,0xfb,0xc7,0xfb,0xc8,0x8b,0xa3,0xf6,0x2e,0x1e,0x9b,0x26,0x32,0x72,0x38,0x09,0xfa,0xd1, -0xae,0x2b,0x0b,0x31,0x69,0xce,0x79,0xcf,0xf3,0x50,0x5a,0xd4,0x90,0x6d,0x95,0x0b,0x6e,0x7f,0x99,0x17, -0x59,0x8e,0x60,0x64,0x61,0x25,0xa0,0xeb,0x95,0xbe,0x5e,0xc6,0x6b,0xfc,0x93,0x77,0x8d,0x0e,0x5a,0xba, -0x2d,0x62,0x2c,0x79,0x16,0xa5,0x97,0x51,0x51,0x87,0x3f,0x24,0x40,0xa3,0xd4,0xa3,0x35,0x52,0xa8,0x0b, -0x1f,0xf5,0x1f,0xad,0xb1,0x13,0xbd,0xf0,0xd1,0x93,0xde,0xa3,0x35,0xf6,0x00,0xfb,0x08,0x0a,0x21,0x26, -0x5c,0xa1,0x13,0x67,0x80,0x60,0x8c,0x65,0xb5,0x67,0x77,0xc4,0xff,0x10,0x26,0xfd,0x7d,0xf0,0x07,0xf8, -0xfb,0xe3,0x0f,0x85,0xc4,0xc3,0xe6,0x2d,0xdd,0x00,0xc0,0x87,0x75,0x03,0xce,0x8b,0x7b,0x75,0x03,0xe0, -0xef,0xdf,0x0d,0x3a,0x94,0x6e,0xe9,0x01,0xc0,0x3c,0xac,0x07,0x07,0xf1,0xe4,0x5e,0x3d,0x00,0xf8,0xfb, -0xf7,0x00,0x0a,0xdd,0x82,0x3f,0x40,0x3c,0x0c,0xff,0x57,0x39,0x46,0xbe,0xbe,0x4f,0x0f,0xa8,0xc4,0xfd, -0xfb,0x40,0xc5,0x6e,0xe9,0x05,0xc1,0x3c,0xac,0x1f,0xcf,0xe6,0xf7,0x5c,0xd1,0x58,0xe0,0xfe,0xbd,0x78, -0x76,0xfb,0x54,0x42,0x90,0x87,0xf5,0x61,0x6f,0xbe,0x98,0x45,0xf7,0xea,0x04,0x95,0xb8,0x7f,0x2f,0xa8, -0xd8,0x2d,0xdd,0x20,0x98,0x87,0xf5,0xe3,0x03,0x2b,0x62,0x34,0x21,0x2d,0xb2,0x9f,0x65,0x5f,0x5c,0x68, -0xf6,0xab,0xed,0x87,0x2c,0x12,0x61,0x7d,0xd1,0xb1,0xa3,0xa3,0xcb,0x0d,0x0b,0xdb,0xca,0xca,0x35,0xb3, -0x70,0x3a,0xae,0x9f,0x07,0xc1,0x5a,0xd7,0x45,0xcf,0x2a,0x99,0xfb,0x64,0x81,0x79,0x2b,0xcc,0x22,0xd9, -0x1a,0xac,0x73,0x91,0xfd,0xb3,0x83,0xda,0x25,0x1d,0xe9,0xfe,0x81,0x5d,0x82,0xc9,0x6c,0xb6,0xd9,0x5f, -0x01,0x71,0x7b,0x59,0x3a,0xe6,0x3b,0xa8,0xaf,0x86,0xfe,0xbe,0x25,0x4c,0x20,0xb8,0xb8,0x2c,0x45,0x6e, -0x09,0x3d,0xef,0x38,0x0e,0xf1,0x9a,0xad,0x02,0xf9,0x0c,0xc9,0x2b,0x0e,0x04,0x4d,0x12,0x1c,0xe5,0x4c, -0xda,0x19,0xcc,0x00,0x26,0x9c,0xaa,0xb2,0xb2,0xb2,0xca,0xaa,0xe1,0xf7,0xa8,0xed,0xee,0xa8,0xf1,0xbc, -0xac,0x55,0xc9,0xc9,0xbf,0x09,0xcd,0x7b,0xd6,0x7c,0x17,0x94,0x65,0xa0,0x8b,0xaa,0x4a,0x4e,0x79,0x20, -0x9e,0x77,0xaf,0xee,0x4e,0xc8,0x9d,0xd5,0x3a,0xcc,0xd5,0xfd,0x26,0x5a,0xde,0xab,0x56,0xbe,0x59,0xd8, -0xfc,0xa5,0x75,0x81,0x70,0x38,0x56,0x8b,0xb7,0xb6,0x83,0x3c,0x2c,0xe1,0x8a,0xac,0x5c,0xef,0x33,0x53, -0x2a,0x22,0x99,0x63,0xa8,0x3d,0xdc,0x2f,0x50,0x7f,0xb1,0xcb,0x1b,0x4d,0x1c,0x24,0xc2,0xdb,0x71,0x18, -0xab,0x30,0x59,0xa8,0x99,0x49,0x61,0x6a,0x52,0x0e,0xef,0xb1,0x8d,0x7e,0x08,0x45,0x3c,0x3c,0x0a,0x84, -0x27,0x01,0xd1,0x25,0x58,0x06,0x69,0x99,0x0c,0x81,0x22,0x2e,0xf2,0xc5,0x3f,0xf2,0xb2,0x45,0xbf,0x16, -0xd9,0x55,0x0b,0x2e,0x25,0xe8,0xe1,0x56,0x7d,0x47,0xf4,0xcd,0xb1,0xc4,0x5b,0xe9,0x6e,0xd9,0xde,0xf6, -0xa5,0x6e,0x5f,0x0b,0x81,0x43,0xb8,0x87,0x46,0x3b,0xf9,0xe8,0xcf,0xbd,0xc1,0xf6,0x4f,0xbd,0x01,0xdb, -0x1c,0x94,0x51,0xda,0x82,0x7b,0x7d,0xe4,0x6f,0x21,0x88,0xef,0x6f,0x51,0xf2,0x87,0x37,0x9b,0xfd,0x3f, -0xf5,0xfc,0x76,0x2b,0x03,0x78,0xf8,0x35,0x80,0xdf,0x28,0xf7,0xfb,0x01,0xbd,0xd1,0x4f,0xc2,0x74,0xab, -0x0c,0x66,0x61,0x4b,0x59,0x2d,0xcc,0x29,0xb3,0x2d,0x00,0x76,0xfa,0xdb,0xbd,0x51,0x7f,0x30,0xdf,0xdd, -0x7e,0xdc,0x1b,0xb5,0xe0,0xa3,0x53,0x01,0x76,0x48,0x7a,0xb8,0xf5,0xb4,0x37,0x98,0x13,0x18,0x65,0xcf, -0x29,0xa1,0x17,0x2c,0x43,0x0d,0x10,0x32,0xfc,0x9d,0xa7,0x58,0x91,0x9d,0xa8,0xca,0x59,0x19,0xa2,0x96, -0x33,0xbd,0x16,0x40,0xa1,0x5e,0x0b,0x25,0xba,0x6a,0xc1,0x0c,0x51,0xcb,0xc2,0xd6,0x62,0x6a,0xcd,0x50, -0x52,0x33,0x23,0x49,0xcd,0xc4,0x87,0x9b,0xfc,0x7e,0x0d,0x62,0x89,0x10,0xcb,0x0a,0xe2,0xbc,0x06,0x71, -0x86,0x10,0x67,0x0a,0x62,0x48,0x9a,0xe4,0x73,0xd6,0x7a,0x17,0xea,0x47,0x0b,0x52,0xfc,0xd8,0xa7,0xff, -0x9f,0xa3,0xf2,0x47,0xc0,0x40,0x07,0xe8,0x6f,0x2f,0x0b,0xa2,0x00,0x5f,0xec,0x6f,0x94,0xb4,0xac,0x5b, -0x66,0x34,0x71,0xc9,0xa7,0x8f,0x35,0xb3,0x6d,0xfb,0xf7,0xc2,0x25,0x40,0xd0,0x2d,0xb3,0x50,0x18,0xb3, -0x12,0xa4,0x59,0x44,0xa1,0x79,0x3d,0x21,0x31,0xce,0x4a,0x10,0x14,0x35,0x12,0xb3,0xbc,0x1a,0xac,0x92, -0xcf,0x68,0xb2,0x23,0xf1,0x1c,0x69,0xc9,0x76,0x72,0x53,0xf4,0xd3,0xd5,0xf4,0x19,0xd5,0xaa,0x4a,0xd0, -0xc9,0x8c,0x26,0x04,0xd2,0xa4,0x47,0xb3,0xa8,0xd8,0x83,0x73,0x38,0x19,0x2f,0xcb,0x58,0x44,0x37,0xb9, -0x3a,0x5b,0x74,0x50,0x9f,0x6e,0x63,0x43,0x69,0x06,0xe7,0xc7,0xc9,0xc9,0xc6,0x46,0x0b,0xff,0x84,0x5a, -0x61,0xa0,0x48,0x53,0xe1,0x40,0xfa,0x18,0xc5,0x32,0x23,0x2a,0xb8,0xde,0xc3,0xd8,0xf0,0xf3,0x42,0xa6, -0xca,0x0a,0xd7,0xfb,0x7e,0x15,0x50,0x8f,0x50,0x25,0xd1,0xad,0x52,0x92,0xd5,0xbb,0x07,0xf0,0xd2,0x1f, -0x7a,0xd2,0xa8,0xc3,0x9d,0x28,0x1d,0xee,0x61,0x83,0xd5,0xae,0x50,0x25,0x2e,0x4e,0x46,0xc6,0x17,0xe1, -0x23,0x2c,0x8a,0xab,0x06,0x09,0x59,0x39,0xed,0xd8,0xbc,0xa0,0x79,0x22,0xd5,0x64,0x52,0x75,0xa1,0x53, -0xcb,0x0f,0x50,0x50,0xc5,0xf6,0x67,0x52,0x34,0xa5,0x7d,0xe9,0xc2,0xa8,0x8a,0xd8,0xa4,0xe7,0x8d,0xe1, -0x6b,0xbd,0xf1,0x3c,0x3b,0xfb,0xec,0x59,0x02,0x3b,0x56,0x99,0x15,0x46,0x72,0x62,0xb2,0x36,0x4b,0x13, -0xc8,0xd9,0x54,0xac,0x03,0x63,0x58,0x6e,0xb7,0x92,0x38,0x29,0x90,0x07,0x18,0xd8,0x1a,0xf8,0xa9,0x72, -0xef,0xbc,0x14,0xea,0xe5,0x12,0x2d,0x2f,0x49,0xe7,0x49,0x4a,0x83,0x6a,0x7a,0x9e,0xf7,0x47,0x49,0xdd, -0x15,0x3d,0x82,0x76,0xb8,0x07,0xfe,0xc0,0xce,0xb7,0x2b,0xa8,0x62,0x85,0x1b,0x2d,0xe6,0x32,0x82,0x84, -0x9c,0x22,0xb9,0x1d,0xdd,0x16,0x9b,0xb6,0x03,0xde,0xd6,0x81,0x10,0x01,0x1b,0x4a,0x9a,0x93,0x09,0xbb, -0x53,0x45,0x2e,0x91,0x38,0xc9,0xa3,0x2b,0xbe,0x0c,0x14,0x2d,0x65,0x7a,0xc6,0x0e,0x12,0x65,0x32,0x22, -0x8d,0xa7,0xf8,0x39,0x9c,0x98,0xc5,0x2d,0xe2,0x1f,0xac,0xfc,0x94,0x00,0x4f,0x89,0x26,0xb2,0xec,0x78, -0xbe,0xcc,0xef,0x52,0x14,0xe1,0x44,0x49,0x7f,0x20,0xde,0x67,0x5d,0xa2,0x55,0x94,0xe3,0xba,0x24,0xae, -0xb7,0xcf,0x10,0x47,0x29,0x44,0x52,0x0c,0x40,0x4d,0x54,0x99,0xc8,0x1e,0xac,0x62,0x8c,0x6a,0xdd,0x50, -0xc0,0xa7,0xa4,0xf1,0x2d,0x85,0xc5,0x4e,0x24,0x39,0x51,0x70,0x4a,0xb7,0xd3,0x98,0xa6,0x8c,0x20,0x31, -0x57,0x2e,0x8a,0xde,0x4a,0x62,0x2e,0x49,0x14,0x96,0x58,0x71,0xc9,0xcf,0xf1,0xd7,0x5b,0xe4,0x9b,0x5c, -0x94,0xe0,0xd4,0x6d,0x82,0xac,0xc4,0xee,0x50,0x8a,0x01,0x61,0x59,0xd9,0x96,0x18,0xc6,0x72,0xa7,0xa3, -0x46,0xac,0x76,0x19,0xd9,0xa6,0x55,0x87,0xb0,0xce,0x06,0x3e,0xa0,0x84,0x9d,0xd7,0xa0,0x66,0x17,0x53, -0x87,0x95,0xf2,0x7f,0xf3,0xdd,0xe1,0xce,0x4d,0x98,0x59,0xca,0x52,0x60,0x24,0xbd,0x05,0xec,0xd1,0xe2, -0x83,0x59,0x37,0xc9,0xd2,0x39,0xcc,0xa2,0x81,0x5c,0xa3,0x2a,0x09,0xa3,0x09,0xd5,0xe4,0xa2,0x9a,0xa7, -0x83,0x18,0xfa,0x90,0x7d,0xb5,0x85,0xa3,0xa5,0xbd,0xb7,0x59,0x5b,0xe9,0xca,0x3d,0x94,0xd6,0xca,0x38, -0x86,0x03,0xc9,0xdc,0x7e,0x4b,0x15,0x13,0x1d,0xa3,0x12,0x89,0x50,0x35,0x39,0x9a,0x0b,0x37,0xce,0x43, -0x95,0xef,0x9e,0x6c,0x2a,0xbb,0x61,0x46,0xa9,0xfc,0xa6,0xc9,0x83,0x00,0xee,0x4d,0x1b,0xb7,0x02,0x1f, -0xa3,0x75,0xc7,0x65,0x7c,0xcb,0x99,0x65,0xec,0x74,0x77,0xa0,0xa4,0x4e,0x32,0xd8,0x23,0xd6,0xfb,0x43, -0x19,0x10,0x8e,0x64,0x10,0xb0,0xcb,0x1b,0xa2,0x68,0x8c,0xa6,0x21,0xa9,0x9d,0x2b,0x12,0x97,0x95,0x19, -0xb3,0x00,0x17,0x67,0x42,0xa0,0xe5,0xd0,0x71,0x20,0xdc,0x47,0x08,0x27,0x8f,0x49,0x9a,0xc6,0x39,0x19, -0x73,0xec,0x40,0x6d,0x9a,0x6d,0xc7,0xc6,0x86,0x68,0x65,0x5d,0x6b,0x45,0x42,0x90,0x91,0x00,0xb0,0x4b, -0xf5,0x56,0x39,0x9f,0x9e,0xa7,0x1e,0x22,0xdb,0x90,0x82,0x16,0x15,0xd4,0x48,0x6b,0x00,0x12,0x26,0x31, -0x3a,0x38,0x57,0x97,0x20,0x62,0x6d,0xe4,0x1b,0x1a,0xd3,0x37,0xe2,0x33,0x5d,0x1a,0x80,0x38,0xde,0xda, -0xc8,0xc2,0x8a,0xf4,0x9f,0xaf,0xbc,0x41,0x14,0x3a,0xd1,0x84,0x46,0x74,0x3d,0x69,0x17,0xdc,0xeb,0x65, -0x6c,0x42,0x15,0x2e,0xa8,0xc3,0xa8,0x34,0xa1,0x2e,0x5d,0x50,0x7f,0x8b,0xac,0x16,0x73,0x17,0xd4,0x01, -0x5a,0xed,0xeb,0x50,0x53,0x17,0x14,0xc9,0x23,0x4d,0xb8,0xb1,0x0b,0x0e,0x45,0x7e,0x26,0x58,0xe4,0x02, -0x23,0x91,0x9a,0x09,0xb7,0x70,0xc1,0xa9,0x71,0xbb,0x11,0xf6,0xa8,0x68,0xcb,0x61,0xb9,0x10,0x93,0x53, -0x3e,0x12,0xab,0xdd,0x70,0x71,0xa2,0x86,0x97,0x3d,0x6d,0x67,0xe1,0x93,0xde,0x66,0xde,0x15,0x86,0x49, -0x43,0xab,0x39,0x4b,0xe4,0xc5,0xd7,0x63,0x8c,0xc4,0x2e,0x3c,0xe7,0xff,0xd6,0xb9,0x97,0x66,0x70,0xa7, -0xee,0xaa,0x09,0x87,0xd7,0x84,0x6e,0x65,0x7e,0xb5,0xb1,0xb1,0x9e,0xc8,0xeb,0x70,0x6f,0x98,0xea,0x6e, -0x0a,0x3c,0x2f,0x60,0x64,0xe0,0xd7,0x0d,0x46,0x09,0x34,0x4d,0x17,0x75,0xc5,0x03,0x7c,0x85,0x9c,0xb7, -0x75,0x1d,0x06,0xc1,0xbd,0xb1,0x57,0x03,0xe1,0xdf,0x4b,0x79,0x54,0xf7,0x16,0xc0,0x4c,0xe1,0xbb,0x6f, -0xbb,0xb1,0x84,0x70,0xd7,0xe5,0x28,0x02,0x2c,0x04,0xdc,0x28,0x78,0x9d,0xb3,0xe7,0x0f,0x1d,0xe9,0x79, -0x1b,0x21,0x6f,0x44,0xc4,0x95,0xd2,0xec,0xcf,0x0d,0xd3,0x74,0xd2,0xb4,0x50,0x2c,0x5a,0xc1,0x65,0xde, -0x39,0x56,0xf7,0xa3,0xf6,0x84,0x71,0x10,0xa4,0x2c,0x55,0xb4,0x27,0x42,0x34,0x10,0xee,0x27,0x54,0xea, -0x0d,0xc6,0x4c,0x32,0x6c,0x58,0x97,0x80,0xc4,0x15,0x77,0xb6,0x33,0x31,0xfa,0xde,0xd1,0xa8,0x37,0xb9, -0x13,0xbd,0x9b,0x4b,0x34,0xd2,0xbb,0xb2,0x73,0xd5,0x10,0xc1,0x7e,0xcd,0x2c,0x23,0xcc,0x33,0x7d,0xf8, -0x67,0xf7,0x1e,0xfe,0xd9,0x1d,0xd1,0x99,0xdd,0x81,0x9c,0xad,0x65,0x47,0xa1,0xd7,0xe9,0xfb,0x9b,0x67, -0xfe,0x96,0xfc,0x94,0xd3,0xe3,0x6e,0x57,0x36,0x83,0xa7,0xaf,0x8e,0x3f,0x0e,0xfe,0xa6,0x69,0x46,0x88, -0xdd,0x40,0xab,0xd3,0xbc,0xa4,0x89,0x7c,0x0e,0x2d,0x67,0x31,0x56,0xca,0x4c,0xf8,0xb8,0x77,0x42,0xbe, -0x83,0xab,0x84,0xfe,0x09,0x73,0x49,0x78,0x6c,0xb9,0x2d,0x83,0x6b,0x4d,0x26,0xe6,0x11,0x5c,0x48,0x87, -0x2d,0xd0,0xbb,0x20,0x0a,0xfb,0x01,0xed,0x45,0x89,0xdc,0x8b,0x82,0x14,0x92,0x60,0xe1,0x07,0xe8,0x8f, -0x7f,0x86,0x3e,0xf9,0x43,0x94,0x14,0xa1,0x9c,0xa7,0x3f,0x4c,0xba,0x68,0xc6,0xc9,0x86,0xc4,0xdd,0x08, -0xc0,0x2c,0xb1,0x0d,0x5c,0x79,0x60,0xb2,0xd6,0x53,0xa7,0xb8,0x70,0x6a,0xa9,0x63,0x1f,0x2a,0x87,0x6b, -0x2c,0x54,0x0f,0xc7,0x17,0x34,0x50,0x74,0x2f,0x79,0x39,0xee,0x87,0xf6,0xd3,0x41,0xf5,0x42,0xc1,0x4b, -0x68,0x7d,0x1f,0xaf,0xbf,0xf6,0xde,0x4a,0xb3,0xee,0x3c,0xdc,0x17,0x02,0xcc,0x9a,0x0c,0x71,0x78,0x6e, -0x89,0x91,0xd0,0x2c,0x68,0x4e,0x12,0xa4,0x09,0xfd,0x9f,0x8d,0x8b,0x52,0x92,0x26,0x9d,0x77,0xc9,0xf3, -0x3a,0x89,0x93,0x7a,0x41,0x8f,0xc4,0x49,0xc1,0x79,0x25,0x62,0x92,0x69,0x37,0xca,0x31,0x8a,0x62,0x0c, -0x89,0x48,0xeb,0xf5,0xd1,0x9f,0xd6,0xfa,0xa5,0x3d,0x17,0x89,0x8e,0x4d,0x1d,0x1d,0xfb,0xf6,0x4d,0x98, -0x7f,0x5e,0x86,0xd3,0xa6,0xbe,0x05,0x57,0xe1,0xa5,0xb8,0x92,0xfd,0x0c,0x97,0xe6,0x28,0x7f,0x85,0x51, -0xb5,0x50,0xe8,0x8a,0x88,0xf6,0xf0,0xf4,0xb8,0x22,0x76,0x03,0x07,0xfe,0xb0,0xcc,0x16,0x90,0xde,0x44, -0x82,0xbe,0x8f,0xf5,0x99,0xd0,0xfd,0x46,0xe8,0x1e,0x42,0x5f,0x6a,0x94,0xbd,0x82,0x2f,0x93,0x76,0xe8, -0x80,0x41,0x80,0x18,0x69,0x37,0x1c,0x03,0xc8,0xa6,0x8a,0x7a,0x92,0x15,0x34,0xf9,0xb0,0x8a,0x26,0x1f, -0xc3,0x0f,0x8d,0x34,0x19,0x87,0x1f,0x6f,0xa1,0xc9,0xd8,0x45,0x13,0x9c,0xa0,0x7a,0x17,0xb1,0x83,0x63, -0x17,0x39,0x10,0xde,0x04,0xfb,0xa8,0xd1,0x61,0x2c,0xbe,0xea,0x5d,0xfe,0xb5,0xd6,0x65,0xed,0x0d,0x57, -0x74,0xfa,0xd7,0x55,0x9d,0xfe,0x6b,0xf8,0x6b,0x63,0xa7,0x3f,0x87,0x7f,0xbd,0xa5,0xd3,0x9f,0x9d,0x9d, -0xe6,0x91,0xe5,0xae,0x8b,0xde,0x7c,0x76,0x76,0x9a,0x01,0x7b,0x15,0xd8,0x5f,0xb5,0x4e,0x7f,0x16,0x5f, -0xf5,0x4e,0x7f,0xad,0x75,0xba,0x7a,0xf1,0x15,0x7d,0xfe,0xba,0xaa,0xcf,0x17,0xe1,0xd7,0xc6,0x3e,0x1f, -0x86,0x17,0xb7,0xf4,0xf9,0x70,0x45,0x9f,0x79,0x0c,0x51,0xe5,0x1e,0xab,0x5a,0xd1,0x67,0x06,0xa4,0x09, -0x7f,0xa1,0xf5,0xf9,0x50,0x7c,0xd5,0xfb,0xfc,0xae,0xd6,0xe7,0xd7,0x56,0x97,0xdf,0xad,0xea,0xf2,0x9b, -0xf0,0x5d,0x63,0x97,0xbf,0x84,0x6f,0x6e,0xe9,0xf2,0x97,0x5a,0x97,0xbf,0x3b,0xef,0xf5,0xb0,0xa8,0x99, -0xd1,0xed,0x3f,0xe5,0xff,0x7e,0x42,0x88,0x73,0x17,0xc4,0x8f,0xf2,0x3f,0x80,0xe8,0x39,0x21,0x9e,0x50, -0xce,0xb9,0x23,0xe7,0xa9,0x56,0x7b,0xaf,0xe7,0x82,0xf8,0x93,0x56,0xfb,0xb9,0x0b,0xa2,0xaf,0x50,0x7f, -0xa3,0x91,0xfd,0x8b,0xf8,0xaa,0x93,0xfd,0x75,0x8d,0xec,0x4a,0xdd,0x46,0x90,0xfd,0xf5,0x2a,0xb2,0x9f, -0xba,0x1d,0x1d,0x28,0x6d,0xdb,0xd6,0x12,0x76,0xfe,0x85,0x3f,0x3c,0xed,0xe6,0xf6,0xb1,0x76,0x8a,0x47, -0xe0,0x69,0x77,0x5a,0x4f,0x9f,0x62,0xfa,0xb8,0x9e,0x3e,0xe6,0x33,0xef,0x20,0x7c,0xdd,0x38,0xd4,0x6f, -0xc3,0x83,0x5b,0x86,0xfa,0x6d,0xc3,0xec,0x3e,0x45,0x8b,0xe7,0x00,0xff,0x4e,0xc5,0xdf,0x31,0x2f,0xd9, -0xb7,0x0d,0xb3,0xdc,0x42,0x6f,0xe1,0x34,0xbc,0x6e,0x4e,0xc5,0xaa,0x0f,0xb4,0x21,0x7a,0x2b,0xbe,0xea, -0x43,0xf4,0xbe,0x36,0x44,0x4a,0x95,0x48,0x0c,0xd1,0xfb,0x55,0x43,0xb4,0x77,0xfb,0x10,0x9d,0xc1,0x39, -0x36,0xdc,0xab,0x0f,0xd1,0x1e,0x0e,0xd1,0x5e,0x7d,0x88,0xf6,0x70,0x88,0xf6,0xea,0x43,0xb4,0x27,0x87, -0xe8,0x55,0xf8,0xbe,0x71,0x88,0x8e,0xc2,0x57,0xb7,0x0c,0xd1,0x51,0xc3,0x10,0xed,0x89,0x21,0xda,0x13, -0x43,0xb4,0x27,0x87,0xe8,0xa8,0xbe,0x06,0x7a,0xb4,0x06,0x5e,0x69,0x04,0x3e,0x12,0x5f,0x26,0x81,0xef, -0xc4,0xca,0x1a,0x72,0x68,0xeb,0x19,0xe2,0x76,0x4e,0xb6,0x49,0xd4,0x43,0x8c,0x25,0x19,0x0f,0x10,0x9b, -0x5a,0xde,0x83,0x4d,0x6d,0x90,0x55,0xe0,0x5c,0x48,0x1a,0xd9,0xbd,0xc2,0x5d,0x4e,0x68,0x0d,0xe0,0xb3, -0xb1,0x33,0x5f,0xa8,0x2f,0x02,0x80,0xd0,0x06,0x3f,0xcb,0x8a,0xd6,0xf6,0xa6,0x7c,0xd4,0x85,0x89,0xe4, -0xc3,0xff,0x0a,0xa9,0x19,0x5e,0x24,0xa9,0x2b,0x77,0x1e,0x26,0xf2,0x02,0xb4,0xb5,0x0d,0x9c,0x6f,0xa2, -0x2e,0x1f,0x5b,0xdb,0xc3,0x42,0x73,0x53,0x1c,0xcc,0xdb,0xd9,0xa6,0x06,0x4b,0x97,0x0e,0x3f,0x10,0x20, -0x30,0xbc,0x5e,0x30,0xe9,0xa4,0x9b,0x7a,0x79,0x01,0xd2,0xb7,0xa4,0x8e,0x86,0x2f,0x14,0xe9,0xf9,0xa7, -0x19,0x62,0x63,0xa3,0x67,0x8b,0x2d,0x81,0x3b,0x1d,0x09,0x6f,0xdb,0xd9,0x22,0x3a,0x03,0xa6,0x1f,0x8f, -0xb4,0x81,0x9d,0xd4,0xef,0xb4,0xf2,0xee,0xe5,0x4e,0x77,0x7b,0xd4,0xdd,0x1e,0xc0,0x2f,0x21,0xba,0xa8, -0xdd,0x80,0x6b,0x27,0xda,0xac,0x71,0xac,0x96,0xae,0xb2,0x72,0xa4,0x86,0x4b,0x8d,0x18,0x40,0xe1,0xcd, -0x99,0x79,0x93,0xe3,0xe6,0xcf,0x5c,0x42,0x28,0xa3,0xf9,0xb3,0xc6,0xe6,0x17,0xae,0xb2,0xaa,0xf9,0x85, -0xd6,0x7c,0xab,0xdf,0x81,0xe1,0x85,0x6b,0xa2,0x0b,0x85,0x7d,0x97,0x84,0xcb,0x40,0x61,0xd5,0xe5,0xc4, -0x51,0x56,0xa1,0x70,0x6e,0xa3,0x70,0xe9,0x6f,0xee,0xbb,0x50,0x98,0xba,0xc4,0x67,0xb7,0x5e,0x23,0xe4, -0x1d,0xc2,0x51,0x56,0xa1,0x70,0x69,0xa3,0x90,0xfb,0x9b,0x53,0x17,0x0a,0x57,0x6e,0xd9,0x9c,0x81,0xc4, -0x55,0x23,0x12,0x1f,0xdc,0xa5,0x15,0x1a,0x1f,0x6c,0x34,0xa6,0xfe,0xe6,0x95,0x0b,0x8d,0x8f,0x4e,0xd1, -0x9f,0x81,0xc5,0xc7,0x46,0x2c,0xc6,0xce,0xc2,0x0a,0x89,0xb1,0x8d,0xc4,0xd8,0xdf,0xfc,0xe8,0x42,0xe2, -0x57,0xb7,0x60,0xf1,0x56,0x76,0x5e,0xf2,0xf2,0xce,0xd2,0x0a,0x8d,0xbf,0xda,0x68,0x44,0xfe,0xe6,0xaf, -0x36,0x1a,0xf7,0xd9,0xf1,0x5d,0x81,0x0c,0xcc,0x18,0x2b,0xfa,0xbb,0x65,0xc3,0xab,0xe5,0x5d,0x5a,0x7a, -0x43,0x8a,0x12,0xf7,0x3d,0x59,0xec,0xd7,0x17,0xdb,0x78,0x45,0x3c,0x86,0x4f,0xe5,0x23,0x93,0x2f,0x9f, -0x9d,0x34,0x18,0x1b,0xc4,0x7a,0x5b,0x12,0x8e,0xa9,0x50,0xa5,0x80,0x89,0x5b,0xd9,0x33,0x78,0x86,0x0b, -0xa6,0x96,0x26,0x2c,0x61,0xf7,0x35,0xb2,0x2a,0x4a,0xeb,0x5e,0xee,0x76,0x9f,0x8c,0x44,0x1d,0x94,0xe2, -0xe1,0xf3,0x45,0x44,0xcf,0xd5,0x56,0xf2,0x15,0x46,0x36,0x44,0x01,0xf0,0x2d,0x44,0xdb,0x03,0x62,0x5d, -0x92,0x4f,0xce,0x3c,0x9b,0x1b,0xfa,0x1c,0x52,0xb4,0x5a,0x3d,0xa3,0xea,0x67,0x6b,0xa4,0x97,0xf3,0x58, -0xbd,0xa9,0xb7,0xae,0x3c,0x1f,0xc9,0xd3,0xb2,0x65,0x3d,0x53,0x69,0x64,0xa1,0xc3,0xd2,0x38,0xc3,0xa5, -0x46,0x47,0xce,0x7e,0x49,0xf1,0x89,0xc4,0x74,0x60,0xca,0xe6,0x17,0x95,0x8f,0x3d,0xa2,0x28,0xc1,0x86, -0x0d,0xa0,0x95,0x93,0x53,0x06,0xfc,0xfb,0x6d,0x80,0x7f,0xa7,0x07,0x64,0xb5,0x76,0x4c,0xe6,0x80,0x7b, -0x95,0x41,0x2f,0x57,0xf1,0x00,0x69,0xd8,0x72,0x02,0x54,0x4c,0x80,0xc4,0xba,0x93,0xe0,0x13,0x5a,0x81, -0x0f,0xda,0x5d,0x3c,0xb8,0x3b,0xda,0x99,0xed,0x6f,0xb5,0xf4,0x2f,0xb4,0x11,0xeb,0x88,0x72,0x7f,0xd7, -0xcb,0xc1,0x42,0xed,0xe8,0x07,0x39,0x95,0xd3,0x3e,0x89,0x39,0x6a,0x74,0x0e,0xe6,0xb3,0x8c,0x5f,0x21, -0xd4,0x4a,0x34,0x9e,0xf3,0x99,0x70,0x59,0xb6,0x3f,0x47,0xde,0x92,0x78,0x3e,0x81,0xa7,0xf4,0x27,0x46, -0x5f,0xfe,0x0a,0xb4,0x0d,0xac,0x6f,0xaf,0x1c,0x3b,0xa3,0xea,0x86,0x0f,0x7f,0x75,0xd7,0x58,0x98,0xee, -0xd0,0xc1,0x4b,0x0d,0x0d,0xbc,0x39,0xe9,0xdf,0x4d,0x28,0x22,0xc2,0x04,0x23,0x22,0x14,0x5d,0xf4,0xa0, -0xb6,0xb1,0x31,0xd9,0xe1,0x5f,0xca,0x97,0x1a,0x01,0xa8,0x00,0xf7,0x3d,0x0a,0xa5,0x2b,0xec,0xef,0x2a, -0xbd,0xbc,0xf9,0x56,0x0a,0x98,0x28,0xfe,0xcc,0x1f,0xce,0x28,0xec,0xc2,0xac,0x8d,0xbe,0xff,0x83,0xb9, -0xfe,0x21,0xdf,0xa7,0x5f,0x17,0x97,0xad,0x59,0x30,0x09,0x22,0x38,0x63,0x2b,0xdb,0xcb,0xda,0x3c,0x33, -0xc5,0xfb,0x8d,0xf3,0x4d,0x6a,0x57,0x22,0x75,0x1b,0xa6,0x84,0xbf,0x55,0x51,0xea,0x0e,0x33,0x40,0xab, -0xe7,0x01,0x83,0x64,0x34,0xc6,0x9c,0x17,0x50,0x01,0x68,0x36,0xdf,0xed,0xa3,0xc6,0xe1,0x50,0xd2,0x7b, -0x69,0xd3,0x7b,0xb4,0x0c,0x7b,0x03,0x95,0xbb,0xdb,0xef,0xd4,0xc7,0x63,0xa9,0x0f,0xd8,0x12,0x36,0xc0, -0x3a,0xcc,0x72,0xa7,0xfb,0xa4,0xed,0x2a,0x89,0x43,0x90,0x69,0xe7,0xd9,0x52,0x63,0x79,0x05,0xc3,0xeb, -0x58,0xec,0xf4,0x36,0x28,0x22,0x26,0x00,0x41,0xf1,0x7a,0xd7,0xef,0x2c,0x61,0xec,0xa6,0xf0,0x6f,0xec, -0x2c,0x22,0x1e,0x0a,0xcd,0x42,0x51,0x37,0x0f,0xb8,0xa0,0xbb,0x10,0xbf,0x1a,0xd6,0xcb,0x60,0x43,0xa8, -0xb0,0xe8,0x2a,0xf3,0xda,0x2c,0x82,0xf3,0x0a,0x1b,0x28,0x68,0x66,0xb9,0x0a,0xd0,0xa3,0xa9,0x59,0x20, -0xea,0xce,0x04,0x5e,0xee,0x22,0xf4,0x82,0x5a,0x2f,0x82,0xad,0x34,0xa1,0x25,0x5e,0x36,0xab,0x42,0x94, -0x40,0x6a,0x97,0x37,0x2b,0x34,0x24,0xa6,0x42,0x39,0xa4,0x89,0x35,0xa0,0x93,0x61,0x65,0x71,0x56,0x57, -0xb4,0x75,0x83,0x4d,0x3d,0x00,0x97,0x33,0xdd,0x5c,0x58,0x84,0xa2,0x92,0x82,0xf4,0xcc,0xb8,0x1b,0xf6, -0xe4,0xd9,0xce,0xc7,0xad,0xe1,0x70,0x4f,0x4f,0xdf,0x54,0x5b,0x4b,0xbf,0xa7,0x55,0x20,0xd5,0x74,0x1d, -0x19,0x8d,0xc7,0x7c,0xbc,0xe2,0x84,0x2e,0xea,0xfd,0xab,0xde,0x3c,0x75,0x0f,0x61,0xd0,0x6f,0xd9,0xc9, -0x64,0x64,0xaa,0xdd,0x24,0x50,0x62,0xb0,0x9a,0x7b,0x2a,0x6a,0xa3,0x40,0x0e,0x20,0xb9,0xc2,0xda,0x73, -0x51,0xac,0x1a,0x60,0x66,0x07,0x61,0x07,0xd2,0x47,0x42,0x3e,0xd2,0x26,0x73,0xd4,0x82,0x84,0x00,0x86, -0x09,0xfe,0x8d,0xe1,0x5f,0xa4,0x43,0xce,0x46,0xda,0xfc,0x42,0xc8,0x19,0x40,0x14,0xf0,0xef,0xd2,0x86, -0x8c,0x46,0xe6,0xa4,0x12,0xd9,0xb7,0xf6,0x09,0x31,0x30,0x28,0x17,0x90,0x3d,0x36,0xd0,0x4f,0x2a,0x8e, -0xd2,0xbb,0x3a,0x3a,0x69,0x17,0x0e,0x12,0x35,0x6e,0x24,0xeb,0x02,0x5f,0x08,0x7b,0xc7,0x34,0xcc,0xe1, -0xff,0xe3,0x30,0x11,0xde,0x9e,0xd1,0xe8,0x38,0x83,0x89,0x51,0x54,0xaf,0xe3,0xd2,0x04,0x9c,0x9b,0x50, -0x03,0x91,0x75,0x67,0x61,0x0a,0xbd,0xca,0xba,0x05,0xfc,0x2d,0xe0,0xef,0x25,0xfc,0xbd,0x6c,0x66,0x6f, -0x6b,0x8c,0x70,0x24,0x96,0x93,0xc6,0xdd,0xde,0xca,0x09,0x73,0xbf,0x2d,0x6b,0x74,0x2d,0x46,0x97,0x39, -0x3c,0x94,0x49,0xba,0xbe,0xc9,0xea,0x69,0x88,0x63,0xf4,0x1b,0x68,0x39,0x23,0x5a,0x16,0x44,0xcb,0xcb, -0x55,0xb4,0x54,0xf2,0x34,0x9b,0x96,0x39,0xd0,0x2e,0xa7,0xf1,0x48,0x61,0x3e,0xe1,0x88,0xa4,0x30,0xa7, -0xfe,0xe5,0xb4,0xac,0x5b,0xf6,0x3b,0x68,0xc9,0x13,0xf8,0xce,0xb4,0xa4,0x59,0xec,0x5c,0x6b,0x6b,0x8a, -0x9a,0xa4,0xe7,0x55,0x85,0x0f,0x90,0xdb,0x51,0x7c,0x8f,0x1e,0x97,0x0f,0xe9,0xf1,0x2c,0xbb,0x72,0xfb, -0xb8,0x66,0x06,0x3e,0x60,0x55,0x0b,0xf4,0xd9,0x60,0x69,0xa1,0x98,0x1b,0x2e,0x3e,0x33,0xb3,0x7b,0x5c, -0xf2,0x47,0x2a,0x35,0xd7,0x8a,0x95,0x4a,0xbc,0x40,0x4b,0x14,0x3c,0xae,0xf7,0x50,0xad,0x4e,0xc8,0xaa, -0xae,0xd1,0x4f,0x6d,0x7e,0x67,0x4e,0x44,0xea,0x66,0xbc,0x36,0xde,0xe4,0xc9,0xe5,0x6d,0x73,0x25,0x75, -0x86,0x56,0xbc,0xd1,0xdf,0x59,0xd7,0x76,0xc5,0x9d,0x55,0xd3,0xa9,0xcf,0xf9,0xae,0x88,0x76,0x03,0xd1, -0x04,0x06,0x04,0x55,0x7a,0x34,0xdf,0xc1,0xa8,0xca,0xa3,0xbb,0xff,0x45,0xb5,0xb0,0x2e,0xaa,0xe6,0x91, -0x26,0xab,0xd3,0x2a,0xdf,0x57,0x9a,0x7e,0x45,0xed,0x48,0x56,0xba,0x63,0x92,0x87,0xac,0x6c,0xc8,0x8b, -0x33,0xb8,0xb2,0xcd,0x8f,0x80,0xd6,0x78,0x57,0xb9,0x3b,0x75,0x87,0xe9,0x4e,0x36,0xaa,0xaa,0x51,0x71, -0x85,0x54,0x7d,0x18,0x40,0x6c,0x90,0xda,0x83,0xb0,0x9b,0xb5,0x75,0xfd,0x38,0x4e,0x06,0x26,0xce,0x00, -0xda,0xd8,0x58,0x5d,0xb1,0x5d,0x69,0xa7,0x5e,0x65,0xdb,0xaa,0xf2,0x66,0x95,0x6e,0x26,0x52,0xda,0x65, -0xb5,0x6e,0x68,0x4b,0xe0,0x47,0xd8,0xa8,0xfa,0x40,0x97,0x4f,0x1c,0xca,0xf7,0xcb,0xd2,0x54,0x8e,0x33, -0x87,0xb5,0x71,0xf0,0x58,0x29,0x8f,0x36,0x0b,0xa1,0x65,0x1b,0x5e,0xdf,0xac,0xd2,0x0e,0x36,0x14,0x40, -0x74,0x8c,0x1b,0xfd,0xb6,0x4b,0x5d,0x50,0xe1,0x45,0x43,0x42,0x5b,0x7a,0xac,0xd8,0x95,0x86,0x2c,0x5e, -0x8b,0x71,0x79,0x94,0x5c,0xc4,0x40,0x5d,0xdd,0x71,0x3c,0xec,0x04,0xe2,0x5a,0xdf,0xa0,0x30,0x7b,0x23, -0xe3,0x29,0x38,0x82,0x51,0x4b,0x6f,0x4a,0x7b,0xe9,0x24,0xc7,0x4d,0xaf,0xbb,0xb9,0xf6,0x32,0x81,0xa5, -0x96,0x7d,0xd9,0x02,0x6c,0x6e,0x6d,0xd0,0x85,0xa5,0x96,0x9d,0xa5,0x31,0xab,0xb5,0x1a,0xa6,0x90,0x77, -0x40,0xf8,0xc6,0x18,0x8e,0x9a,0x96,0xf5,0x43,0x06,0x40,0x99,0xbe,0x68,0x6b,0xfb,0xdb,0xb7,0x96,0x32, -0x13,0xc8,0xab,0x2d,0x42,0x88,0x9a,0x68,0x9b,0xc0,0x05,0xc1,0x35,0x03,0xff,0x35,0x9d,0x62,0x54,0x0b, -0x11,0x71,0xdc,0x85,0x22,0xe9,0xe8,0x3a,0xa5,0x37,0xab,0xb0,0x43,0xed,0x1c,0x9d,0x8b,0xac,0x5a,0xf7, -0x87,0x70,0x38,0x27,0x15,0x17,0x59,0x60,0x54,0xb5,0x7a,0xb3,0x67,0x56,0x20,0xb7,0xdf,0xa1,0xdd,0xa4, -0x5a,0x45,0xca,0x29,0x3b,0x4c,0x88,0x91,0x89,0x4c,0x0f,0xad,0x23,0x24,0xa0,0xf4,0xeb,0xbe,0xb1,0xb1, -0x0e,0x58,0x7b,0x9e,0x49,0x46,0xad,0x76,0xb6,0xf3,0x93,0x32,0x3a,0xbd,0x3b,0x75,0x63,0x87,0x7b,0x0f, -0x35,0x9f,0x8d,0x52,0x8a,0x98,0x1b,0x1b,0xbf,0x26,0x2a,0x84,0xdb,0x93,0x18,0x50,0xd1,0xb6,0xd0,0xcf, -0xf6,0x5c,0xf8,0x58,0xa6,0x07,0xbf,0x11,0x27,0x12,0x39,0xac,0xd6,0x08,0x4f,0x56,0x6b,0x84,0x4b,0x93, -0x16,0x69,0x8d,0x43,0xa1,0x87,0x00,0x75,0x5f,0x1a,0x3d,0x99,0xc9,0x74,0x7c,0xd5,0xe3,0x54,0x08,0x67, -0xe6,0xd7,0x98,0x3b,0x38,0x3e,0xb9,0xa9,0x44,0x7f,0xc0,0x13,0x5a,0xc6,0x96,0x52,0xd6,0x47,0x36,0x97, -0x11,0x55,0xd8,0x5d,0x2c,0x8b,0x59,0xab,0x38,0xce,0x4e,0x70,0xb6,0xe8,0x1d,0x2f,0x96,0x05,0xaa,0xc8, -0xc6,0x13,0x8e,0x54,0xe7,0x01,0x83,0xea,0x20,0x6a,0x65,0x96,0xf2,0xfb,0x8d,0xf1,0xba,0x39,0xc8,0xb8, -0x76,0x6a,0xcb,0xd6,0x31,0xf2,0xb4,0x45,0x99,0x38,0xba,0x8c,0x8d,0x9b,0xf1,0x04,0x84,0xf2,0xee,0xd9, -0x3c,0x2b,0xe2,0xa2,0xd4,0xa4,0x8d,0x52,0xb7,0xbd,0x1a,0x92,0x5a,0x4f,0x80,0x99,0x6c,0x29,0x99,0xf7, -0x5d,0x44,0xbc,0x24,0x40,0xe5,0x20,0xde,0x42,0x40,0x84,0x1c,0x8b,0xea,0x25,0x8b,0xae,0x10,0x5b,0x47, -0x87,0xfe,0xfd,0xba,0x72,0x8f,0x1e,0xd8,0xd6,0xd5,0xff,0x2e,0x5d,0x78,0xc8,0x68,0xb8,0x8d,0xb0,0xff, -0x93,0x7b,0xa4,0x3b,0x5b,0xfa,0xfd,0x9f,0x2f,0x92,0x15,0x9d,0x87,0x8b,0x6b,0x53,0xe7,0x91,0xdb,0x8e, -0xb4,0x6d,0x57,0xbb,0x0c,0x99,0xe6,0x3c,0xfe,0x75,0xd4,0xc0,0x20,0x64,0x55,0xd7,0x79,0xb7,0xa6,0x46, -0x4e,0x9f,0xbf,0x7f,0x77,0x74,0x7a,0x04,0x2c,0xf9,0xab,0x17,0x07,0xa7,0x2f,0xfe,0xf6,0xe2,0xdd,0xd1, -0x21,0xb6,0xf7,0x70,0x7b,0xb3,0xec,0x81,0xf6,0x66,0xe2,0xca,0x9e,0xad,0xdc,0x80,0x7d,0x7d,0x6b,0x4f, -0xd5,0xd6,0x3e,0xc7,0xcb,0x3b,0x54,0x85,0x5a,0xbf,0xc3,0xc9,0xce,0x5c,0xee,0xf1,0x13,0xd8,0xe3,0x2b, -0x7c,0xbc,0x76,0xcb,0x03,0x92,0xcd,0x8f,0x27,0x27,0x5d,0x8c,0x26,0x53,0x2c,0xa2,0xb3,0x78,0xe4,0x79, -0x03,0xaf,0xeb,0xb5,0xcd,0x54,0x3f,0xa0,0x6f,0x0e,0x19,0x95,0xfb,0x37,0xda,0x48,0x02,0x03,0x50,0x19, -0x62,0x8a,0x67,0xa5,0xc8,0xf5,0xf6,0x85,0xf7,0xda,0x3b,0xcd,0x53,0xb6,0x5e,0xca,0xec,0xa9,0x09,0xe3, -0xeb,0xf3,0x8d,0xc3,0xed,0x81,0xcb,0xb9,0xc8,0xee,0x35,0x39,0x73,0x35,0x39,0xcb,0x5a,0xd8,0x3f,0xa1, -0xd4,0xf2,0x7b,0x2c,0x56,0xe9,0x85,0xd0,0x49,0xa4,0xd2,0xb1,0x28,0x29,0xf2,0x28,0x45,0x0c,0x34,0x4f, -0x5b,0xcd,0x7d,0x98,0xb3,0xf3,0xd4,0xf5,0x35,0x13,0xcf,0xae,0x61,0x6f,0x05,0x47,0xac,0x2b,0x5c,0x55, -0x79,0x1b,0xd7,0x5d,0xd6,0x6f,0xed,0xf6,0x95,0xfd,0xc6,0xd8,0x45,0x0c,0x1f,0x78,0xb6,0x55,0x3b,0x5f, -0x62,0x9c,0xc6,0xa6,0x15,0xbb,0xeb,0x34,0x45,0x6d,0x26,0x79,0x15,0xb7,0x41,0xd9,0x5a,0x69,0x43,0x50, -0xe8,0x9c,0x45,0x61,0x72,0x16,0x91,0x83,0xb3,0x28,0xc4,0x65,0x02,0x65,0xed,0xb1,0x16,0xfe,0x15,0xaf, -0x36,0x5f,0xcd,0x2b,0x94,0x77,0xcc,0x96,0xf0,0xb8,0xd6,0x49,0xac,0xb4,0x20,0x94,0x4f,0x60,0x0a,0xda, -0xeb,0xbf,0x75,0x6d,0x86,0x1f,0xc2,0xeb,0x91,0x7e,0x9f,0x92,0xeb,0x2a,0x96,0xb1,0x56,0x31,0x3c,0xa7, -0x0a,0xc3,0x9a,0xfd,0x33,0x99,0xcf,0x23,0x8a,0x87,0xe9,0xd2,0x9c,0x53,0x31,0xfc,0x84,0x25,0x40,0xd8, -0xdd,0xf6,0x6f,0xc5,0xdd,0x34,0xe7,0x65,0x5f,0x88,0xc9,0x44,0x3a,0x42,0xfc,0x00,0xab,0xfb,0x3d,0xbd, -0xed,0x2a,0x5f,0x88,0x0b,0x11,0xac,0x73,0xb0,0x16,0x8d,0x8b,0x6c,0xbe,0x2c,0xe3,0xe1,0x1a,0x8a,0x94, -0x80,0x09,0x5d,0x23,0xb1,0x10,0xfe,0x10,0xa6,0x1c,0xf8,0x93,0xcd,0x37,0xe0,0x97,0xe6,0x36,0x91,0xa7, -0xab,0x72,0x31,0x02,0x03,0x2b,0xfc,0x8b,0x3c,0xfb,0xfa,0x66,0xd2,0xaa,0xb7,0xdd,0xf8,0x70,0x36,0x54, -0x51,0x98,0x72,0xcb,0x1b,0x1f,0x0b,0x3a,0xc4,0x16,0x7f,0x10,0xcf,0x23,0x5c,0x72,0x55,0x95,0xcf,0x96, -0xd3,0x97,0xc9,0x17,0xe3,0x2e,0x8b,0x48,0xc5,0xbf,0x2f,0x52,0x71,0xd0,0x63,0xf7,0xfd,0xe7,0x25,0x3d, -0x7a,0xc6,0x28,0xf3,0x81,0x9b,0xea,0xaa,0xc8,0x52,0x3d,0xba,0x33,0xdf,0xc0,0xcc,0x6b,0x71,0x48,0x2f, -0x2d,0xaa,0xde,0x16,0xce,0x9e,0xdd,0xff,0x07,0xc8,0x7b,0x68,0x0d,0xe6,0x6f,0x03,0x00 +0xf0,0xbf,0xe4,0xba,0x00,0xfe,0xd8,0xbb,0x42,0xc6,0x59,0x59,0x9e,0x79,0x52,0xb1,0x14,0xdd,0x94,0xce, +0xbc,0x93,0x21,0xe9,0x9a,0xe7,0x68,0x73,0x89,0x01,0x3e,0x5c,0x72,0x13,0x84,0x20,0xfb,0xea,0xf8,0x6a, +0xed,0x97,0x83,0x9f,0xd9,0x6d,0x2c,0xdc,0x27,0xb1,0xe0,0x55,0xa1,0x62,0x07,0x86,0xd8,0x92,0xa6,0xbe, +0xc7,0xdd,0x3d,0xca,0xb0,0x48,0xcc,0x57,0x7f,0x81,0x9a,0x32,0x7a,0xe3,0xb8,0x89,0x22,0xae,0x92,0xb2, +0x80,0x43,0xc4,0x58,0xed,0x5d,0x05,0x0f,0x19,0x5c,0x5b,0x91,0x53,0x28,0x6e,0xb0,0xc3,0xf3,0xaf,0x50, +0x4b,0x86,0xc3,0x58,0xe8,0x27,0x9f,0xcd,0x33,0x0a,0xee,0x27,0xbe,0xa9,0x13,0x1f,0xe3,0xf1,0x21,0xfc, +0x8e,0xcb,0x96,0xec,0x03,0x85,0x80,0x94,0x30,0xdd,0x2c,0x15,0xb7,0x84,0x95,0xea,0xe5,0x46,0x14,0xbe, +0xad,0x4f,0xe9,0xd6,0x34,0xf0,0x3e,0x61,0x54,0x70,0x2d,0x31,0xe7,0xc4,0xdc,0x48,0x2c,0x39,0xb1,0xc4, +0xf5,0x02,0xd3,0x5b,0x97,0xb6,0x95,0x14,0x52,0x9c,0x82,0x9a,0x69,0x12,0x49,0x5d,0x88,0xaa,0x59,0xf9, +0xa0,0x03,0xb8,0x28,0x2f,0x0b,0x8a,0xd6,0xc3,0x8c,0x38,0x2e,0xb0,0x7a,0x72,0x41,0xe9,0xb0,0x8e,0x2b, +0x6e,0x1d,0x06,0xc1,0x18,0x20,0x39,0xb6,0xb1,0x5f,0x6f,0xeb,0x28,0x13,0x2e,0x8b,0x10,0xc0,0xbf,0x76, +0x96,0xb3,0x6c,0x6d,0xa1,0x16,0xe2,0x9c,0x98,0xa0,0x81,0x92,0xac,0xad,0xf7,0x03,0x4d,0x92,0x10,0xe8, +0x37,0x73,0xe5,0xc4,0x0a,0xe3,0x07,0x54,0x0c,0x7f,0x8f,0xe6,0x19,0x86,0x7f,0x35,0xac,0x67,0x2a,0x4b, +0x61,0xf1,0x5b,0xda,0x0a,0x8b,0x4f,0xb6,0x16,0x0e,0x94,0x60,0x04,0x1a,0x16,0xf2,0x0f,0xf8,0x85,0x57, +0x8d,0x5e,0xc0,0xbc,0xfc,0xf7,0xe4,0x1d,0x0f,0x7d,0x8e,0xc0,0xf6,0xdb,0xe8,0x2c,0xb9,0x49,0x46,0x0c, +0xec,0xc2,0x02,0x6d,0xf8,0xea,0x72,0xc6,0x8a,0x91,0x27,0xa6,0x02,0xad,0x7a,0x47,0xea,0xd7,0xa0,0xec, +0x5e,0xcd,0x92,0x33,0x7a,0x92,0xc3,0x1b,0x4f,0xff,0x47,0xcd,0x10,0x6d,0xcd,0x8c,0x54,0x45,0xcf,0x6c, +0xb0,0x01,0xe8,0xee,0x5d,0x0d,0xef,0x6a,0x81,0xe5,0x83,0x07,0x2d,0x8b,0xde,0x60,0x87,0x88,0x57,0xae, +0x4a,0x55,0xae,0x8c,0xd8,0x5c,0xc5,0x56,0xa4,0xd6,0x84,0xc5,0x95,0xd2,0xb3,0xb0,0xb2,0xea,0x20,0x5c, +0x67,0x5e,0x03,0x54,0xda,0xd5,0x04,0xd7,0x60,0xd1,0xd8,0x23,0x53,0xc6,0x7e,0xaf,0xc7,0xef,0xe5,0x52, +0x4e,0xcd,0x46,0xba,0x96,0x52,0x99,0x30,0x11,0x73,0x00,0x76,0x34,0x61,0xab,0xa3,0xc4,0x07,0x5d,0x30, +0xab,0x44,0xe1,0xc2,0x50,0xce,0x2c,0xc0,0x13,0xc7,0x02,0x54,0xf6,0x6a,0x36,0xac,0xc8,0x30,0xc0,0x51, +0xda,0xd5,0x21,0x8d,0x7f,0x0b,0x1c,0xcd,0x0a,0x0c,0xc8,0x59,0xd4,0x39,0x93,0xd2,0x2a,0x03,0x52,0xda, +0x05,0x18,0xd0,0x42,0x09,0xdf,0x02,0xd5,0x15,0xfe,0x6b,0x2f,0xcb,0x95,0xa6,0xbf,0x9a,0xc5,0x2d,0x47, +0x11,0xad,0x85,0x0e,0x45,0x2b,0x77,0x37,0x82,0x39,0x06,0xbc,0x34,0x01,0xe9,0xb0,0x73,0x3c,0xbb,0x14, +0x9b,0x38,0xb9,0x4b,0x48,0x0b,0x9b,0x1a,0x45,0x29,0xd9,0x5d,0x46,0x18,0x8c,0xd8,0x65,0x74,0xcb,0x16, +0x9e,0xb7,0x9a,0x31,0x8c,0xfe,0x80,0xa9,0xdb,0x46,0x59,0x73,0x88,0xcf,0xbf,0xda,0xdc,0xa1,0x64,0x03, +0x14,0x78,0x34,0x58,0xa6,0x26,0xa4,0xc9,0xa5,0xb9,0x6a,0xee,0xb0,0xc5,0x8e,0x59,0xac,0xee,0xc6,0xd1, +0x1a,0x3d,0xcb,0x16,0x5f,0xb3,0xeb,0xa9,0x0d,0xb4,0x06,0xda,0xe5,0xee,0xd6,0x3d,0x96,0x54,0x46,0x60, +0xa8,0xe1,0x6e,0x55,0x20,0xfd,0x8c,0x54,0x1e,0x2a,0x58,0xff,0xdc,0x5c,0x95,0xc0,0xc4,0xba,0xf5,0x8c, +0x4d,0x5b,0x6a,0xa1,0xcf,0xab,0x5f,0xa1,0x34,0xd5,0xde,0x5a,0x8d,0xac,0x10,0xdb,0xa0,0x0e,0xaa,0xee, +0xa3,0xfd,0x9b,0x40,0xbb,0xad,0xd6,0x2a,0xa1,0x57,0xe4,0xdb,0xea,0xd8,0xae,0xd5,0x31,0x51,0xf1,0x0f, +0xf5,0x99,0x22,0xdf,0x3d,0x2b,0x5e,0x6a,0x05,0xac,0x74,0x15,0xa3,0x03,0x7b,0x48,0xcf,0x01,0xb2,0xa5, +0xb6,0x9f,0x09,0xc9,0x10,0x6d,0x6c,0x38,0x0f,0x50,0x87,0xdf,0xcc,0xda,0x48,0x06,0x09,0x79,0xec,0x3e, +0x3e,0x61,0x49,0xdf,0x90,0xa3,0x42,0x7f,0xdf,0x15,0x66,0x61,0xf4,0x2c,0x96,0x46,0x97,0xc9,0x34,0x82, +0x75,0x41,0x01,0xda,0xf6,0x60,0x8a,0x96,0x24,0xc1,0x60,0x47,0x9d,0xdd,0x65,0x44,0x61,0x6e,0x6b,0x2c, +0x4c,0xa2,0xec,0x80,0x42,0x2b,0x58,0x78,0x90,0x84,0x5b,0xad,0xb3,0x59,0x9e,0xc1,0xa4,0x38,0x5e,0xfb, +0xb4,0x75,0xd2,0x3a,0xfe,0x74,0xd5,0x3d,0x69,0xfb,0x5b,0x32,0x82,0xc5,0xb7,0x6f,0x5b,0x68,0xf8,0xf5, +0x39,0x29,0x57,0x00,0x64,0xe8,0x01,0xd1,0x6f,0x8d,0x06,0xdd,0x4d,0xf9,0xe6,0x37,0x6a,0x86,0xbe,0x28, +0x92,0xd8,0x5f,0x73,0x64,0x69,0x51,0x29,0xd0,0x97,0x04,0x90,0x96,0x44,0xa3,0x3b,0xbd,0x8d,0x0d,0x28, +0x95,0xfd,0x33,0x99,0xcf,0x45,0x2b,0xa3,0xb5,0xfc,0x72,0x20,0x6b,0xf0,0x47,0x5a,0x1d,0xc0,0x49,0x5c, +0x0b,0x92,0x0d,0x30,0xc0,0x06,0x4b,0x78,0x18,0x29,0x48,0xd8,0xc6,0x84,0x9e,0x77,0x83,0xaa,0x19,0x26, +0xd5,0x50,0x80,0x21,0x52,0x44,0x79,0xe4,0x40,0x12,0x8d,0xfe,0x66,0xee,0xb1,0xca,0xa2,0xc8,0x43,0x66, +0x66,0x57,0xb4,0x18,0x26,0x5d,0xf5,0x08,0x6a,0x41,0x30,0x51,0x6b,0xd5,0x76,0x8b,0xe8,0x3c,0xca,0x13, +0xa8,0x92,0x22,0x6f,0xe8,0x0e,0xc4,0x25,0x8f,0x16,0xb7,0x12,0x65,0x2e,0x17,0x14,0x41,0xc4,0x26,0x9c, +0x18,0x7a,0x01,0x6e,0x59,0xe4,0x6c,0xf9,0x7b,0x2d,0x2e,0x80,0x72,0xa6,0x8d,0x9c,0x45,0x75,0x7b,0x2e, +0x7c,0xc8,0x24,0xfb,0xa7,0xf7,0x57,0x29,0xc6,0xb2,0x89,0xf3,0xf2,0x2b,0x73,0x21,0x18,0x6a,0x92,0x24, +0xa4,0x05,0x0a,0x2b,0xc8,0x85,0x7c,0x7a,0x82,0x82,0x5a,0xd5,0x0e,0x31,0xc2,0x1c,0x2d,0x12,0x7f,0xbd, +0xa3,0x48,0x81,0x14,0x3c,0x93,0xd2,0x30,0x3c,0xe5,0xbe,0xb8,0xa3,0x22,0x4b,0xfa,0x3c,0xb9,0x44,0x26, +0x85,0xf2,0x80,0x4b,0x00,0xc6,0x8a,0xfd,0x51,0xca,0xb4,0x49,0x52,0xa0,0x8b,0x04,0xb4,0xbb,0x3c,0xa4, +0x65,0x47,0x1d,0xe6,0x3c,0x87,0x36,0x37,0xac,0x27,0xc5,0x36,0xd1,0xc2,0xa3,0xc0,0xde,0x0e,0x40,0x47, +0x04,0x21,0xaa,0x53,0xd7,0x67,0xde,0xd8,0x60,0x17,0xc2,0x24,0xf7,0x80,0xde,0xe3,0x89,0x03,0x99,0x78, +0xe3,0xc2,0x6c,0x4f,0xa0,0x61,0x69,0x45,0x37,0x96,0x3a,0x93,0x10,0xb2,0x20,0x32,0x6e,0x70,0x7b,0xf9, +0xa0,0x1c,0x7b,0xe3,0x88,0x54,0x58,0x27,0xc5,0x73,0xee,0xfc,0xa4,0x09,0x59,0xa2,0x77,0x52,0xb4,0xbc, +0x81,0x20,0xd3,0xc4,0xb3,0xea,0x70,0x91,0x7b,0x65,0x6d,0x58,0x80,0x03,0xa3,0xac,0x9d,0xa1,0xf1,0x1b, +0x49,0x37,0x89,0xd8,0x12,0x7b,0xb2,0x89,0x6b,0x7b,0x8f,0xd6,0xb6,0x76,0x65,0x47,0x54,0x5e,0x58,0x55, +0xb4,0x50,0x6e,0xff,0x85,0x1b,0x66,0x52,0xff,0x46,0x09,0xc8,0x0e,0x69,0x14,0x59,0xd5,0x53,0xda,0xfb, +0xf3,0x73,0x59,0xfb,0xee,0xa7,0x74,0x6d,0x6d,0x07,0xa5,0x40,0xbb,0x02,0xc2,0xd4,0x23,0x6f,0x7b,0xb0, +0x6d,0x62,0xee,0xa7,0x74,0x67,0x8b,0x0a,0x57,0x81,0x5c,0x8e,0xb2,0x96,0x89,0x56,0x85,0xc4,0x21,0x14, +0x09,0x0d,0x8c,0x2a,0xed,0x11,0x56,0x0f,0x91,0xb0,0xe9,0x5d,0xf0,0x4d,0x9b,0xd1,0xfd,0xcd,0xc8,0xa6, +0xcf,0xc8,0xf3,0x39,0x61,0xa0,0x0d,0x47,0xf2,0x01,0xc5,0x9b,0x34,0xa6,0x0c,0xf0,0x3e,0x7d,0xb4,0xb3, +0x65,0x04,0xb2,0x59,0xd1,0xff,0xbb,0xd6,0x79,0x7e,0x7e,0xe7,0x4a,0x53,0x8d,0xa6,0xe9,0x2a,0x92,0xf2, +0xaa,0xb1,0xdb,0x16,0xe4,0xe2,0x4c,0x45,0xce,0x3b,0x36,0x2e,0x4a,0x11,0xab,0xbb,0xba,0x62,0x02,0xb9, +0xad,0x7a,0x86,0x35,0xea,0x3e,0x40,0x2e,0x63,0x65,0xd5,0x04,0x71,0xd7,0x9a,0xd7,0x7b,0xe6,0xfa,0x74, +0x6d,0x6f,0xfa,0xfa,0x44,0x2f,0xb3,0x6a,0xfb,0xa7,0xc3,0x51,0x71,0x8e,0xc7,0x5a,0xc5,0xe6,0x22,0x33, +0x66,0xb0,0xb5,0x42,0x4f,0xa4,0xd4,0x68,0x99,0x32,0x1b,0x83,0xcd,0x03,0x4f,0xc3,0x81,0xc0,0x75,0xd4, +0x4e,0xd1,0xb9,0x86,0xdc,0x2f,0xf5,0xc0,0x51,0x55,0xd4,0x6e,0x76,0x76,0x47,0x77,0x66,0x60,0xc9,0x97, +0xd1,0x7c,0x14,0x8b,0x1f,0x32,0xfa,0x99,0xbd,0xa7,0xd9,0xbb,0x62,0x9d,0x1f,0x21,0xf7,0xf0,0x78,0x72, +0x49,0x13,0x2e,0x73,0x6a,0xb1,0x72,0x93,0x98,0x56,0x05,0xe7,0x19,0x98,0xe2,0x43,0x31,0x47,0x3c,0x80, +0xfc,0xb6,0xf6,0x2c,0xc7,0xaf,0x9f,0x22,0xda,0x41,0x47,0x04,0xf3,0xc1,0xa7,0x3a,0x7b,0x43,0x30,0x9a, +0x28,0x5d,0x4d,0xa4,0x55,0x13,0xa5,0xd6,0x44,0x6a,0x36,0x91,0xb3,0x9a,0x23,0xb5,0xa1,0x6d,0xfe,0xec, +0x52,0x29,0x09,0x8b,0xdd,0x72,0x54,0x0c,0xca,0x20,0x69,0xbb,0x9a,0xd0,0x07,0x57,0x36,0xa6,0xcf,0xba, +0xb7,0x14,0x1f,0xc1,0x1a,0x5c,0x6a,0xff,0x9a,0xa0,0x07,0xc9,0x0d,0x0a,0x6b,0xab,0x66,0x6a,0x8b,0xc1, +0x00,0x6e,0x3f,0xbe,0x31,0xa6,0xbd,0x99,0xf9,0x13,0xea,0x54,0x9b,0xe3,0x98,0xbe,0xcd,0x80,0xcf,0x7c, +0x9e,0x5d,0x69,0x53,0x23,0x91,0xe1,0xca,0xf1,0xbd,0x1a,0x80,0x63,0x3c,0xc9,0x9f,0x33,0x87,0x81,0xd7, +0x18,0x3e,0xf4,0xd4,0xa9,0xd6,0x52,0x1e,0x60,0xcb,0x50,0x84,0xba,0xf9,0xf6,0x2d,0xe9,0x4a,0xf9,0x31, +0xf1,0x01,0xe2,0x6e,0x03,0xeb,0x68,0x09,0x1b,0xaa,0x08,0x4f,0x0e,0x80,0x18,0xa1,0x93,0x99,0xe8,0xf9, +0xd7,0x7d,0xe4,0xf9,0x81,0xe0,0xa1,0x4e,0x33,0x58,0x5a,0x79,0x34,0xa5,0x58,0x5a,0xf2,0x7c,0x0d,0x4b, +0x48,0xe5,0x6c,0x0c,0x7f,0xc2,0xbe,0x76,0x35,0xc1,0x8c,0xd5,0x7b,0xaf,0x9a,0x22,0xdf,0xbe,0xf5,0xec, +0xee,0x3f,0x87,0xda,0xdf,0x66,0x97,0xda,0x04,0xd6,0x19,0xaf,0x21,0x87,0xfe,0xac,0x61,0x18,0xea,0x38, +0xca,0xde,0x17,0x61,0xab,0x6c,0xd7,0x31,0xeb,0x38,0xba,0xe0,0x6f,0x31,0xc7,0x81,0x33,0xeb,0x30,0x99, +0xc4,0x41,0x81,0x0c,0x70,0xab,0x08,0x61,0x8a,0x15,0xbb,0x7d,0xfa,0xd9,0xc7,0x19,0x5d,0x6c,0x5a,0x80, +0xb5,0xb1,0xa5,0xb0,0x36,0xe9,0x8d,0x79,0xdc,0xe9,0xc3,0x9e,0x1a,0x9b,0x5c,0x34,0x49,0x96,0xc5,0x8d, +0x79,0x90,0x32,0x34,0x47,0xea,0xa0,0x5d,0x70,0xd0,0xd1,0x2a,0xb4,0x21,0x28,0xe4,0x4c,0xa7,0xd5,0xef, +0x14,0xbe,0x85,0xdc,0x4d,0x6d,0x72,0x21,0x75,0x5f,0xe8,0xce,0xf4,0x2a,0xe2,0xde,0x89,0xb4,0xe8,0x66, +0xb8,0x69,0xb2,0x31,0x59,0x01,0xa1,0x29,0x06,0xa7,0x6b,0xdd,0x8d,0xce,0x1a,0x5f,0x63,0x3e,0x38,0xa6, +0xbb,0x61,0xf7,0x89,0xba,0x82,0xfb,0x32,0x8c,0xbc,0x03,0x72,0xbd,0x29,0xc7,0xaf,0x8a,0x3b,0xa7,0x35, +0x07,0x6b,0x55,0x58,0x8b,0x40,0xd1,0xf5,0x60,0x12,0x82,0xee,0x7c,0x25,0x95,0x5c,0xa8,0xf8,0x6c,0xa9, +0xc6,0x1b,0xbb,0xe2,0x2b,0x8e,0x7b,0x22,0xca,0x58,0xc3,0x22,0xde,0x52,0x9b,0xd8,0xc7,0xc6,0x72,0x2a, +0xa3,0xa6,0x7c,0x6f,0xc4,0xbc,0xd7,0xc7,0x6a,0x64,0x1d,0xf7,0xe8,0x5c,0x8d,0x7d,0x31,0xe8,0x97,0x02, +0x4e,0x12,0x5e,0xfd,0xac,0x02,0x6c,0xa6,0xdc,0x5c,0x26,0x0e,0x1b,0xe9,0x30,0x32,0xc7,0xbe,0xbd,0x3d, +0xe8,0x19,0xcb,0x47,0xc4,0xc3,0x13,0x4b,0x08,0x23,0x62,0x50,0xfd,0x22,0x6e,0x84,0xb5,0xa0,0x14,0x30, +0x2f,0xaa,0xd8,0xb1,0xa8,0xdc,0xe5,0xc5,0x12,0x53,0xe5,0x8d,0x65,0xd6,0xd8,0xa8,0xab,0x0c,0x2d,0xbc, +0xb8,0x63,0xad,0x39,0xab,0x02,0x6b,0xcc,0xf4,0xab,0x58,0x6d,0xd8,0x50,0x1c,0xa1,0x86,0x8e,0xc3,0x46, +0xc6,0x4e,0x59,0x39,0x20,0xf4,0x8a,0x42,0x34,0xe3,0x4e,0x29,0x83,0x22,0x56,0x81,0x95,0xc8,0x08,0xa2, +0x0a,0x2a,0xe4,0x28,0xf7,0xcb,0xc2,0x51,0xca,0x10,0xcc,0x70,0x40,0x9a,0x96,0x77,0x81,0xc7,0x11,0x0e, +0xf9,0x5a,0x89,0x47,0x05,0xfe,0x12,0x4a,0xda,0x0d,0xb0,0xcb,0x05,0x43,0x92,0x5a,0x3b,0xc6,0x7c,0xaa, +0xe6,0x43,0x5d,0x9e,0xa6,0x10,0x13,0x6b,0xa0,0x25,0x83,0x37,0x6a,0x33,0x4e,0xab,0x1b,0x3d,0x38,0x71, +0xed,0x05,0x07,0x73,0x6c,0xe8,0xa4,0x3a,0x43,0x6f,0xeb,0xe5,0xdd,0xfb,0xb8,0xa2,0x87,0xf6,0xf5,0xd2, +0xbc,0x7d,0x3a,0x46,0x99,0xb6,0xda,0x46,0xe6,0x44,0xf5,0x5c,0x63,0x86,0xcc,0x8b,0x55,0x75,0x96,0x88, +0xd9,0xa7,0x8a,0xf0,0xcc,0xef,0x3c,0xbe,0xb1,0x6f,0x26,0xda,0xd9,0x14,0x53,0x76,0x12,0xba,0x4a,0xb6, +0xfb,0x81,0xc9,0x16,0x6f,0x6c,0x7c,0x6f,0xcb,0x57,0x76,0x7e,0x42,0x7d,0xd7,0x4e,0xf8,0xa3,0xbc,0xa6, +0xcb,0xa9,0x1f,0x0a,0x6c,0x6e,0x67,0xb8,0x3a,0x89,0x36,0x2b,0xe8,0x9e,0x5d,0x6d,0x12,0x35,0x7e,0x81, +0xb1,0xb6,0x4f,0xb6,0xc6,0xe3,0xd5,0xda,0x64,0x1e,0x70,0xd6,0xda,0x4d,0xc9,0x4d,0xd0,0xd1,0x58,0xef, +0xb6,0x63,0xb9,0x56,0x57,0xd0,0xcc,0xac,0xdd,0x7d,0x67,0xb6,0x8f,0xf5,0x6a,0x33,0x70,0x33,0x8d,0xf5, +0x43,0x1b,0xfd,0x6b,0xd6,0x4e,0x44,0xa5,0x9b,0x5e,0xe7,0x31,0x1f,0xc0,0x49,0xae,0x57,0x47,0xeb,0xc6, +0x06,0xf9,0x89,0x8e,0xc6,0x45,0xcb,0xc1,0x14,0x74,0x4a,0x7f,0x97,0x3b,0x09,0x39,0x47,0x33,0xdc,0x07, +0xb2,0xf9,0x84,0x42,0x24,0xa9,0xb3,0x19,0x03,0x06,0x0a,0x42,0x4b,0x0e,0x91,0x78,0x17,0x37,0x25,0x7e, +0x59,0xb8,0xe9,0xf0,0x2f,0xef,0xb3,0x86,0xe2,0x0b,0x74,0x18,0x81,0x5a,0x57,0xeb,0x7d,0x5d,0x20,0x18, +0x5e,0xcb,0xa3,0x81,0xa2,0xc1,0xdf,0xcd,0xac,0xbf,0xe6,0x0d,0xc0,0xe1,0x30,0xc0,0x98,0x21,0x03,0x4f, +0x13,0x3d,0xc8,0x51,0xf7,0x02,0x53,0xd6,0x64,0x00,0xa9,0xba,0xbc,0x40,0x17,0xc1,0x18,0x30,0x3f,0x73, +0x86,0x84,0x10,0x42,0x25,0x07,0xc8,0xf9,0x39,0x0a,0xf1,0x95,0xe0,0xc1,0x80,0xe0,0x4e,0xa8,0xfc,0x4a, +0x7e,0xe0,0x80,0xe2,0x5c,0x09,0x5b,0x09,0x04,0x1c,0xa0,0x07,0x1c,0x9a,0xcf,0x98,0x42,0x83,0x27,0x81, +0x7e,0xa9,0x1b,0xf4,0xe5,0x37,0xef,0x04,0x83,0xc7,0x81,0xb5,0xfd,0x41,0x01,0x29,0x5b,0x85,0x26,0x2a, +0x7d,0x37,0x7c,0xf1,0x12,0x3e,0x1b,0x74,0x7d,0x01,0x18,0x57,0x0c,0xbf,0xfd,0xbd,0xae,0x1a,0xc7,0xdb, +0x6a,0xf2,0xfe,0x50,0x4a,0x07,0xc3,0x38,0xa0,0x8b,0xbc,0x0e,0x63,0x1d,0x09,0x78,0x37,0x87,0x9b,0x79, +0x30,0x0b,0xb2,0x20,0x0f,0xe6,0xc1,0x24,0x38,0x0b,0x96,0xc1,0x42,0x98,0x28,0xf6,0x77,0xea,0x31,0xd9, +0x52,0x96,0x1a,0x57,0xe1,0x97,0x7b,0xfe,0xe0,0x18,0x3d,0x2a,0xb1,0xe4,0xa0,0x35,0x91,0x3f,0xce,0xc2, +0x04,0xc3,0x93,0x8e,0xce,0x94,0xd0,0x58,0x04,0xae,0xf3,0x47,0x93,0x41,0x35,0x2b,0x2b,0x91,0xf2,0x52, +0xbd,0x6e,0x95,0x68,0xc4,0x31,0x50,0x7a,0x4f,0x68,0x33,0xd2,0x0b,0xe6,0xe1,0x52,0x2a,0xa6,0xe5,0x3b, +0xf3,0x61,0xde,0x6e,0xfb,0x65,0xb8,0x44,0x6f,0x4e,0x11,0x5b,0x88,0x91,0x94,0xba,0x90,0x21,0x6f,0xa3, +0x51,0x6b,0x46,0x18,0x04,0x59,0xb8,0xbd,0x03,0xeb,0xc9,0xc4,0x3f,0x09,0xfa,0x84,0xb7,0x40,0x76,0x11, +0x46,0xc7,0xb3,0x13,0xd8,0x9b,0x24,0x77,0x12,0x05,0x19,0x7a,0xa2,0x8c,0xaf,0xd6,0xd0,0xb7,0x3f,0xf5, +0x44,0x67,0x6d,0x6f,0x04,0x65,0x35,0x62,0x37,0x3e,0xc3,0xf0,0xd3,0x0e,0x05,0x5e,0x0b,0xaf,0xe9,0xfc, +0x33,0x04,0xf6,0xc1,0xb5,0xb9,0xc4,0xfa,0xb5,0xf5,0x24,0x1a,0x59,0xb1,0x98,0x04,0x44,0xf3,0x4a,0x12, +0x00,0x8d,0xcb,0xc8,0xc8,0xaf,0xaf,0x21,0x91,0xbd,0x6a,0x01,0x19,0x20,0x2b,0x56,0x8f,0x01,0x27,0x97, +0x4e,0x35,0xf3,0x2b,0x82,0x7a,0xf2,0x80,0xd3,0xb5,0x3f,0x13,0x52,0x9f,0x51,0xda,0x13,0xf5,0x87,0xb6, +0x75,0xd3,0x2f,0x33,0x8c,0x91,0x6d,0x1e,0x64,0x2f,0x01,0x96,0x70,0x0f,0x1d,0x71,0x8b,0x77,0x7b,0x3e, +0x6b,0xf0,0xe3,0x2b,0xdd,0x2c,0x39,0x87,0xa5,0x12,0x26,0x72,0x7e,0x54,0x5c,0x5d,0x14,0xca,0x28,0xf7, +0xea,0xde,0x56,0x8c,0x0a,0x72,0xf5,0x4e,0x6e,0xde,0xbb,0x65,0xf6,0x0b,0x86,0xa9,0xe1,0x37,0xb8,0x76, +0x21,0x74,0xfb,0x61,0xfe,0x15,0x43,0xd2,0x37,0x64,0x9d,0x7f,0x19,0xd5,0x51,0xfc,0x90,0xa6,0x53,0xb2, +0x9d,0xe1,0x2a,0x6d,0x15,0xe1,0xda,0x4c,0xe8,0xac,0xd0,0x42,0xf0,0x7e,0xfd,0xeb,0xc7,0xfd,0x0f,0xc0, +0x12,0x8a,0xc8,0x5e,0xa4,0x86,0x22,0x63,0x4d,0x26,0xdf,0xbe,0xf1,0xac,0x4c,0xa4,0x32,0x0b,0xc6,0xd8, +0xb6,0xa3,0xb8,0x17,0x18,0xb7,0x21,0x2c,0x70,0xc6,0xe2,0x42,0x28,0xbb,0xba,0x91,0x15,0xdd,0x11,0xe0, +0x96,0xb2,0xb2,0x51,0xe4,0x51,0xb5,0x66,0xc3,0xe2,0xdb,0xb7,0x7a,0x2b,0x3e,0x53,0x81,0xec,0x02,0x6a, +0x37,0xe0,0xe4,0xb8,0x10,0x21,0x8e,0xe7,0x21,0xfe,0x16,0xe4,0xc7,0xb8,0xa4,0xd8,0x21,0x0c,0xcc,0x91, +0xc8,0x83,0x34,0x0f,0xe7,0x78,0xe4,0xad,0xac,0xcd,0xa3,0x30,0x9c,0xd1,0xc9,0xc6,0x46,0x56,0x8d,0xb2, +0xaa,0x5f,0xe6,0xfe,0xe6,0x56,0xa6,0x5c,0x8f,0x56,0xf3,0xf4,0xde,0x35,0x33,0xd5,0x10,0x40,0xc8,0x58, +0x0b,0xe8,0xbf,0x81,0xb7,0x9e,0x41,0x76,0x74,0x43,0xd6,0x4c,0x6e,0x28,0x5b,0xb5,0xa3,0xa7,0x62,0x14, +0xa3,0x98,0x15,0x94,0x5b,0xde,0x5b,0xd2,0xd7,0x13,0x26,0xdb,0x6b,0xa8,0x3d,0x80,0xf6,0x08,0x45,0xdb, +0xab,0x9c,0xe4,0xc7,0x5f,0x92,0xa2,0x44,0x37,0xa6,0xe2,0x25,0xd3,0x5e,0x5f,0x1e,0x05,0xe4,0xcc,0x6f, +0x86,0xd2,0x84,0xd4,0xb1,0x06,0x87,0xa5,0xc6,0x95,0xa0,0x83,0xe8,0x88,0x62,0xdc,0x7e,0xf1,0x02,0x64, +0x85,0x92,0xf8,0x0a,0xb7,0xc1,0x79,0x72,0x49,0x1c,0x07,0x3e,0x7e,0xd3,0x5b,0x3e,0x7e,0x48,0xdf,0xd1, +0xf8,0x1b,0xc3,0xb0,0xb3,0xcc,0x59,0x7e,0xbd,0xe4,0xaa,0xe0,0x0b,0x95,0xb6,0xe2,0xfc,0x32,0xfe,0x88, +0x2d,0x53,0x38,0x9f,0x00,0x38,0x64,0xb1,0x09,0xe1,0xfe,0x87,0x66,0x9f,0x03,0x6f,0x91,0x2d,0xd0,0x03, +0x03,0x5e,0xaf,0x9f,0xeb,0xcc,0xd1,0x3f,0x96,0xd0,0x4e,0xf9,0x75,0xd0,0x0f,0xa4,0xf3,0x06,0xaa,0x22, +0x17,0xb1,0xb1,0x07,0xdb,0xc1,0x45,0x36,0x4e,0x98,0x23,0xe2,0x5f,0x1c,0x99,0x17,0x03,0x94,0xa1,0xc9, +0xdb,0x5f,0xe2,0xaf,0xe4,0xac,0x19,0xfb,0x81,0xda,0xcd,0xef,0x99,0xdc,0x08,0x5e,0xa4,0xd1,0x82,0xfc, +0xf7,0xc3,0xdf,0xa3,0x6c,0x1e,0xe7,0xb8,0x52,0x06,0xdd,0xde,0x13,0xb8,0xaf,0x76,0x9f,0xfd,0xf2,0xea, +0xf4,0xe0,0xc5,0xcf,0x7b,0x47,0x6f,0xfe,0xf6,0xe2,0xf4,0xc3,0xde,0xab,0x17,0xa7,0xef,0x0f,0xde,0xbc, +0x7a,0xf3,0x0e,0x95,0xda,0xca,0xae,0xf8,0xcd,0xd7,0x92,0x5e,0x40,0x31,0xbe,0xb1,0x14,0xd9,0x42,0x1e, +0x65,0x87,0x65,0xae,0x0b,0xf5,0x4b,0xb9,0xbf,0x79,0xde,0x90,0xd5,0x33,0x50,0x77,0x0d,0x83,0x65,0x91, +0xe3,0x93,0x01,0x64,0x7c,0xe7,0x0d,0xe9,0x1b,0x49,0x3f,0xe0,0x4d,0x44,0x8b,0xb0,0xb2,0xfd,0xe4,0xc9, +0x66,0xdc,0xcd,0x71,0x03,0x53,0x01,0x52,0xfc,0x61,0x3f,0x54,0x87,0x29,0xde,0xc6,0x30,0x86,0x5c,0x3b, +0x61,0xbd,0xe0,0xa2,0x5e,0x7a,0x5a,0x2f,0xad,0x05,0x10,0x2e,0xa8,0x74,0xe1,0x0b,0x47,0xc4,0xb5,0xd2, +0xe3,0x7a,0xe9,0xa8,0x2a,0x1d,0x51,0x69,0x74,0x7a,0xd3,0x0e,0x13,0x98,0xa4,0xd1,0x70,0x9c,0xc7,0xd1, +0xe7,0xa1,0xec,0x62,0x64,0xf7,0x31,0xfa,0x0f,0xee,0xa4,0x38,0x0f,0x6a,0xa5,0xa3,0x7a,0xe9,0xac,0x2a, +0x9d,0x51,0xe9,0xac,0x22,0x51,0x3b,0xd3,0x89,0x84,0xa6,0xc1,0x48,0x23,0xf8,0xdb,0xf2,0xda,0x0e,0xaa, +0x90,0xd7,0x10,0x47,0x7f,0xdd,0xe9,0x63,0x48,0xf7,0x3d,0xab,0x81,0x1f,0xb4,0x16,0xd8,0xed,0x48,0xde, +0xf6,0x7e,0x08,0xe4,0xc7,0x54,0xff,0x18,0xc3,0x47,0xad,0x82,0x48,0x56,0x10,0xfd,0x5e,0x38,0x06,0x64, +0xb2,0xee,0xc0,0x35,0xfa,0x41,0x6f,0xeb,0x2e,0xd8,0xaa,0x8f,0xa8,0x86,0x3a,0x1a,0x45,0x63,0x6d,0xf0, +0x17,0x2a,0x13,0x3e,0x5a,0x44,0xe3,0x85,0xf8,0x7b,0x69,0x23,0x01,0xc0,0x3f,0x68,0xa5,0xb8,0xee,0x99, +0xde,0x50,0xa1,0x7f,0x5c,0xba,0x5a,0x8d,0x64,0x05,0xd1,0xaa,0x76,0xdd,0x44,0xc0,0x52,0x3f,0xe8,0xe5, +0xef,0x82,0xc1,0x4a,0x22,0x8c,0x45,0x6d,0x38,0xfe,0x77,0x22,0xc0,0xf8,0x07,0xad,0xc4,0x43,0x08,0x30, +0x96,0x04,0xa0,0x51,0xbc,0x57,0xe7,0xc7,0xaa,0xf3,0xe3,0x07,0x76,0x5e,0x2a,0xab,0xe4,0xb8,0x31,0x03, +0x5f,0x78,0x94,0xd1,0xb9,0x57,0x57,0x34,0x87,0xfb,0x56,0x12,0x5e,0x47,0x83,0xfe,0x0d,0x45,0x1e,0xa4, +0x7b,0x48,0xdc,0xa5,0x70,0xc1,0xad,0xad,0xff,0xf3,0xdd,0x71,0xaf,0xf3,0xe7,0xa8,0x73,0x7e,0x72,0xfd, +0xe3,0xcd,0xf7,0x5b,0x09,0xa9,0x4b,0xd5,0xf3,0x1e,0x53,0x1e,0xbd,0x29,0x27,0xc5,0xbb,0xe8,0x5d,0x2b, +0xe9,0xe6,0x61,0xff,0xa7,0x4d,0xcd,0xab,0x36,0x07,0x1e,0x6d,0xf5,0xe1,0xbe,0x13,0xc0,0xfe,0xb0,0x85, +0xa1,0xc9,0x2a,0x17,0xec,0x5a,0xc1,0xa9,0xbb,0xe0,0xf6,0xad,0x05,0xc7,0xee,0x82,0x3f,0x36,0x16,0x7c, +0x82,0x6e,0x11,0xe4,0x16,0x25,0x6b,0x89,0xdc,0xb5,0x3c,0x76,0xd6,0xa2,0x78,0x24,0x9b,0x6c,0x35,0xaa, +0x35,0x02,0xdc,0x9d,0x74,0xbd,0x87,0x92,0xee,0x76,0x9a,0x37,0x90,0xae,0x99,0xe6,0x8f,0xef,0x41,0x3a, +0xf7,0x00,0x34,0x92,0xae,0x9a,0x55,0x4f,0x1b,0x68,0x57,0x41,0xfc,0xc9,0x45,0x3c,0x17,0x01,0xb6,0x6f, +0xa5,0x9c,0x0b,0xef,0xdb,0x4a,0x8d,0x1d,0xa5,0x9e,0x34,0x96,0xfa,0xb3,0x9b,0x66,0xf5,0x2a,0x7e,0x72, +0x56,0x71,0xfb,0x5c,0x6b,0xa2,0xd7,0x7d,0xc9,0xd5,0x7b,0x10,0xb9,0xb6,0x1f,0x44,0xae,0xc7,0x8d,0xa5, +0xfe,0x74,0x57,0x72,0x3d,0xbd,0x1f,0xb9,0xf0,0x50,0xfd,0x54,0x60,0x1c,0xda,0x62,0xb3,0x85,0xa4,0xf9, +0xd4,0x3d,0x69,0xff,0xf0,0xed,0xb8,0xd7,0x3f,0x19,0x7d,0xea,0x8e,0x30,0xe5,0x64,0xd3,0x87,0xcc,0xe0, +0x5f,0x0f,0xf0,0xc9,0x77,0x8f,0x18,0xe0,0xf8,0x07,0xa1,0xc8,0x18,0xd0,0x94,0xc8,0x43,0x0b,0x8d,0x08, +0x72,0xc8,0xab,0x7f,0x15,0x34,0x5a,0xd3,0x95,0x6d,0x79,0x7e,0xbb,0x1f,0x68,0x09,0x01,0xbe,0xf3,0x7a, +0x3f,0xe0,0xfd,0x53,0x0a,0x1d,0x94,0x47,0x81,0xbe,0x73,0xd6,0xbd,0x9c,0x67,0x11,0x00,0xf9,0xe8,0x5c, +0xc5,0x31,0x72,0x8e,0x39,0x5a,0x3a,0x26,0x4a,0x23,0x86,0x41,0x1d,0xc3,0xc0,0xce,0xbe,0x33,0xca,0xd3, +0x7b,0xa1,0x3c,0xbd,0x0d,0xe5,0x7c,0xd4,0x88,0x74,0x1d,0x47,0xea,0x05,0xc6,0x08,0x7e,0xa3,0xd3,0x7a, +0x60,0xd6,0x60,0xe7,0xd7,0x0b,0xf9,0x77,0x1f,0xa0,0xf1,0xbd,0x7a,0x3b,0x5e,0xdd,0xdb,0xdc,0x77,0x8c, +0xd2,0xef,0x8a,0x6e,0x74,0x2f,0x74,0x2d,0x68,0x0b,0xf2,0x5a,0xec,0x19,0xa1,0xb6,0x1e,0x91,0x07,0xfd, +0xf7,0xda,0x33,0x36,0x36,0x1c,0x38,0xfe,0xa1,0x7b,0x86,0x0b,0x83,0x7f,0xb7,0x9d,0xd5,0x89,0xe3,0x1f, +0xbb,0xb3,0x1a,0x0b,0xe1,0x8f,0xdb,0x61,0x67,0xf7,0x5a,0x11,0x36,0x34,0x5c,0xd6,0xfe,0x7f,0xec,0xb1, +0xc5,0xbd,0x90,0x2e,0x9a,0x96,0xf1,0x7f,0xc4,0x0e,0x7b,0x79,0xaf,0xbe,0x5e,0xae,0xea,0xeb,0x7f,0xce, +0xfe,0x2a,0x5f,0x9a,0xf1,0x4e,0x0a,0xfb,0xd5,0x51,0x76,0x30,0x1d,0x1b,0xa2,0xc2,0x20,0x57,0x8f,0x08, +0x3b,0x61,0x7f,0xeb,0x29,0x5c,0x37,0x77,0xc3,0x27,0x5b,0x4f,0x47,0xfd,0x41,0xbc,0xd3,0xdf,0xfa,0x71, +0xd4,0xef,0x3c,0xdd,0x6c,0xc5,0x1d,0xc8,0x82,0xd1,0xd9,0x7d,0x0c,0x39,0xf4,0xfd,0x18,0xbf,0xd1,0xe9, +0x29,0x80,0x43,0xde,0xc6,0x06,0x14,0xef,0x3e,0x11,0xa5,0x10,0x26,0x86,0x5f,0x08,0x2d,0xca,0x77,0x9f, +0x20,0x78,0x84,0xe0,0xdd,0x27,0x04,0x2d,0x1a,0xd9,0xdd,0xe6,0xd2,0x50,0x98,0x00,0xb7,0xb9,0xa1,0x27, +0x55,0xd1,0x27,0xdc,0x54,0x16,0xb6,0x92,0x76,0xab,0xdf,0x49,0xfc,0x4d,0xf8,0x3f,0xf4,0x72,0x33,0x0f, +0xd2,0xb0,0x55,0xb4,0x59,0x0d,0x51,0xa5,0xcd,0xc3,0x56,0x84,0x69,0x51,0x95,0x26,0x9e,0x50,0xae,0xf3, +0x41,0x16,0x4c,0x07,0x69,0x30,0x1e,0xcc,0x6f,0x90,0x22,0xc0,0xf5,0x1d,0x65,0xaf,0x8b,0x4b,0x37,0x45, +0xe8,0x7d,0x54,0x08,0xde,0x2e,0xa2,0x2f,0x22,0x0f,0xda,0xe4,0x94,0x44,0x42,0x43,0x8b,0x59,0x27,0x55, +0x41,0xab,0xc2,0xde,0x7a,0x98,0x8d,0xe6,0x5b,0x19,0xe0,0x9c,0xa0,0xd3,0x8f,0xf9,0xa8,0x37,0x88,0x43, +0x48,0x6b,0x3d,0x6d,0xb7,0xca,0x4e,0xee,0x6f,0xcd,0xfd,0x1f,0x9e,0x0e,0x4a,0x4c,0xda,0x6e,0xb7,0xf2, +0x4e,0x0c,0x29,0x83,0x1c,0x3f,0x1f,0xb7,0xa1,0xbf,0x25,0x7e,0x42,0xd9,0xad,0xf0,0x29,0x10,0x2c,0x0b, +0xae,0x67,0x03,0xc0,0x65,0x50,0x04,0x97,0x83,0x88,0xd0,0x76,0xbe,0x69,0xe5,0xa8,0xcb,0x2d,0x4c,0x51, +0x16,0x4b,0x58,0x8d,0x52,0xa7,0x09,0x65,0x10,0x50,0x05,0x8c,0x15,0xfc,0xbb,0x1c,0xf4,0x83,0x1c,0xfe, +0x4d,0xe1,0xdf,0x18,0xfe,0xa1,0x14,0x82,0x01,0x0b,0x3d,0xf6,0x39,0xd7,0xc1,0x9e,0x4a,0xa4,0x12,0x04, +0x0b,0xb2,0x61,0xd2,0x8b,0x27,0xcc,0xf5,0x5e,0x70,0x8d,0xd8,0x48,0x79,0xbe,0xaf,0xea,0x11,0x32,0x6f, +0xb4,0x51,0xe2,0xd3,0x40,0xaf,0x40,0x38,0x02,0xc1,0x27,0x26,0x57,0x72,0xe8,0x5d,0x5d,0x2e,0xbc,0xb6, +0x99,0xc7,0x0f,0x05,0x66,0x30,0xf4,0xb0,0x37,0x82,0xbf,0x03,0x4f,0xe9,0x3a,0xa2,0x0e,0x14,0xaa,0x2b, +0x1a,0xf4,0xe9,0x5e,0x25,0x93,0x69,0x5c,0xb2,0x9e,0xa5,0x99,0x83,0x21,0xed,0xe6,0xd1,0x57,0x57,0x16, +0x56,0x65,0x69,0xee,0xf7,0xd7,0xc3,0x3a,0x0c,0x9a,0x55,0xbd,0x81,0xbf,0x40,0xf8,0xc6,0x3c,0xf4,0x5a, +0xca,0xd2,0xf8,0xb8,0xf5,0x48,0x33,0x3c,0xe0,0x17,0xb3,0x8e,0xc0,0xc2,0x5b,0x2b,0xe8,0x95,0x5e,0x7a, +0xf4,0x1a,0xac,0xa1,0x67,0x8c,0xa1,0x27,0x6c,0x10,0x1e,0xf9,0xc3,0xdc,0xb0,0xe2,0xee,0xf2,0x33,0xaa, +0xea,0xc5,0x29,0x65,0xf8,0x0d,0x5d,0xcc,0x31,0x2e,0x21,0x86,0xcf,0x8c,0x5b,0xde,0x38,0x9b,0x68,0xe1, +0x19,0xf2,0xca,0x57,0x99,0x5e,0x10,0xc0,0xe9,0xfd,0x04,0x3d,0x17,0xfc,0x92,0xcf,0x5b,0xdb,0xb0,0xfd, +0x0c,0xd1,0x58,0x2a,0x8e,0x26,0x55,0xe1,0x47,0x3b,0x84,0xf4,0x1a,0xb9,0xf6,0xf1,0xd0,0xa7,0xef,0x16, +0xbe,0x2f,0xec,0x76,0xb9,0x6b,0x57,0x54,0xc5,0xda,0x35,0xda,0x17,0x4f,0x49,0x12,0x3b,0x58,0x5b,0x42, +0x65,0x8f,0xda,0x49,0xdb,0xf3,0xa1,0x83,0x9d,0x3c,0x5e,0xc4,0x51,0xb9,0x76,0x46,0x8f,0xc6,0xe2,0xcf, +0xf0,0x66,0x67,0x8b,0xaa,0x45,0x8b,0x24,0x6c,0xb2,0xbc,0x98,0x0b,0x83,0x50,0xa1,0x09,0x57,0x7f,0x78, +0xd2,0xe8,0x81,0xe0,0xa7,0x02,0xd0,0x2e,0x2f,0x35,0xe8,0x1e,0x5c,0x81,0x52,0xda,0xbb,0x63,0x0d,0x08, +0xea,0x44,0xe2,0x01,0x75,0xb0,0x29,0x2a,0xd7,0xc1,0x7a,0x03,0x2b,0x2b,0x60,0xf0,0x53,0x86,0xf4,0xed, +0x6d,0xa3,0xcb,0x5e,0xf9,0x3e,0xf2,0xe2,0xa8,0xbd,0x8b,0xc7,0xa6,0x89,0x8c,0x1c,0x4e,0x82,0x7e,0xb4, +0xeb,0xca,0x42,0x4c,0x9a,0x73,0xde,0xf3,0x3c,0x94,0x16,0x35,0x64,0x5b,0xe5,0x82,0xdb,0x5f,0xe6,0x45, +0x96,0x23,0x18,0x59,0x58,0x09,0xe8,0x7a,0xa5,0xaf,0x97,0xf1,0x1a,0xff,0xe4,0x5d,0xa3,0x83,0x96,0x6e, +0x8b,0x18,0x4b,0x9e,0x45,0xe9,0x65,0x54,0xd4,0xe1,0x0f,0x09,0xd0,0x28,0xf5,0x68,0x8d,0x14,0xea,0xc2, +0x47,0xfd,0x47,0x6b,0xec,0xba,0x2f,0x7c,0xf4,0xa4,0xf7,0x68,0x8d,0xfd,0xce,0x3e,0x82,0x42,0x88,0x09, +0x57,0xe8,0xc4,0x19,0x20,0x18,0x63,0x59,0xed,0xd9,0x1d,0xf1,0x3f,0x84,0x49,0x7f,0x1f,0xfc,0x01,0xfe, +0xfe,0xf8,0x43,0x21,0xf1,0xb0,0x79,0x4b,0x37,0x00,0xf0,0x61,0xdd,0x80,0xf3,0xe2,0x5e,0xdd,0x00,0xf8, +0xfb,0x77,0x83,0x0e,0xa5,0x5b,0x7a,0x00,0x30,0x0f,0xeb,0xc1,0x41,0x3c,0xb9,0x57,0x0f,0x00,0xfe,0xfe, +0x3d,0x80,0x42,0xb7,0xe0,0x0f,0x10,0x0f,0xc3,0xff,0x55,0x8e,0xf1,0xb6,0xef,0xd3,0x03,0x2a,0x71,0xff, +0x3e,0x50,0xb1,0x5b,0x7a,0x41,0x30,0x0f,0xeb,0xc7,0xb3,0xf9,0x3d,0x57,0x34,0x16,0xb8,0x7f,0x2f,0x9e, +0xdd,0x3e,0x95,0x10,0xe4,0x61,0x7d,0xd8,0x9b,0x2f,0x66,0xd1,0xbd,0x3a,0x41,0x25,0xee,0xdf,0x0b,0x2a, +0x76,0x4b,0x37,0x08,0xe6,0x61,0xfd,0xf8,0xc0,0x8a,0x18,0x4d,0x48,0x8b,0xec,0x67,0xd9,0x17,0x17,0x9a, +0xfd,0x6a,0xfb,0x21,0x8b,0x44,0x58,0x5f,0x74,0xec,0xe8,0xe8,0x72,0xc3,0xc2,0xb6,0xb2,0x72,0x08,0x2d, +0x5c,0x9d,0xeb,0xe7,0x41,0xb0,0xd6,0x75,0xd1,0xb3,0x4a,0xe6,0x3e,0x59,0x60,0xde,0x0a,0xb3,0x48,0xb6, +0x06,0xeb,0x5c,0x64,0xff,0xec,0xa0,0x76,0x49,0x47,0xba,0x7f,0x60,0x47,0x64,0x32,0x9b,0x6d,0xf6,0x57, +0x40,0xdc,0x5e,0x96,0x8e,0xf9,0x0e,0xea,0xab,0xa1,0x97,0x71,0x09,0x13,0x08,0x2e,0x2e,0x4b,0x91,0x5b, +0x42,0xcf,0x3b,0x8e,0x43,0xbc,0x66,0xab,0x40,0x3e,0x43,0xf2,0x8a,0x03,0x41,0x93,0x04,0x47,0x39,0x93, +0x76,0x06,0x33,0x80,0x09,0xa7,0xaa,0xac,0xac,0xac,0xb2,0x6a,0xf8,0x3d,0x6a,0xbb,0x3b,0x6a,0x3c,0x2f, +0x6b,0x55,0x72,0xf2,0x6f,0x42,0xf3,0x9e,0x35,0xdf,0x05,0x65,0x19,0x5e,0xa3,0xaa,0x92,0x53,0x1e,0x88, +0xe7,0xdd,0xab,0xbb,0x13,0x72,0x67,0xb5,0x0e,0x73,0x75,0xbf,0x89,0x96,0xf7,0xaa,0x95,0x6f,0x16,0x36, +0x7f,0x69,0x5d,0x20,0x1c,0xde,0xd6,0xe2,0xad,0xed,0x20,0x0f,0x4b,0xb8,0x22,0x2b,0x87,0xff,0xcc,0x94, +0x8a,0xf8,0xe9,0x18,0xe0,0x0f,0xf7,0x0b,0xd4,0x5f,0xec,0xf2,0x46,0x13,0x07,0x89,0xf0,0xb1,0x1c,0xc6, +0x2a,0x38,0x17,0x6a,0x66,0x52,0x70,0x9c,0x94,0x83,0x8a,0x6c,0xa3,0xf7,0x43,0x11,0x85,0x8f,0xc2,0xef, +0x49,0x40,0x74,0x09,0x96,0x41,0x5a,0x26,0x03,0xaf,0x88,0x8b,0x7c,0xf1,0x8f,0xbc,0x6c,0xd1,0xaf,0x45, +0x76,0xd5,0x82,0x4b,0x09,0xfa,0xd5,0x55,0xdf,0x11,0x7d,0x73,0x04,0xf3,0x56,0xba,0x5b,0xb6,0xb7,0x7d, +0xa9,0xdb,0xd7,0x42,0xe0,0x10,0xee,0xa1,0xd1,0x4e,0x3e,0xfa,0x73,0x6f,0xb0,0xfd,0x53,0x6f,0xc0,0x36, +0x07,0x65,0x94,0xb6,0xe0,0x5e,0x1f,0xf9,0x5b,0x08,0xe2,0xfb,0x5b,0x94,0xfc,0xe1,0xcd,0x66,0xff,0x4f, +0x3d,0xbf,0xdd,0xca,0x00,0x1e,0x7e,0x0d,0xe0,0x37,0xca,0xfd,0x7e,0x40,0x1f,0xf8,0x93,0x30,0xdd,0x2a, +0x83,0x59,0xd8,0x52,0x56,0x0b,0x73,0xca,0x6c,0x0b,0x80,0x9d,0xfe,0x76,0x6f,0xd4,0x1f,0xcc,0x77,0xb7, +0x1f,0xf7,0x46,0x2d,0xf8,0xe8,0x54,0x80,0x1d,0x92,0x1e,0x6e,0x3d,0xed,0x0d,0xe6,0x04,0x46,0xd9,0x73, +0x4a,0xe8,0x05,0xcb,0x50,0x03,0x84,0x0c,0x7f,0xe7,0x29,0x56,0x64,0x27,0xaa,0x72,0x56,0x86,0xa8,0xe5, +0x4c,0xaf,0x05,0x50,0xa8,0xd7,0x42,0x89,0xae,0x5a,0x30,0x43,0xd4,0xb2,0xb0,0xb5,0x98,0x5a,0x33,0x94, +0xd4,0xcc,0x48,0x52,0x33,0xf1,0xe1,0x26,0xbf,0x5f,0x83,0x58,0x22,0xc4,0xb2,0x82,0x38,0xaf,0x41,0x9c, +0x21,0xc4,0x99,0x82,0x18,0x92,0x26,0xf9,0x9c,0xb5,0xde,0x85,0xfa,0xd1,0x82,0x14,0x3f,0xf6,0xe9,0xff, +0xe7,0xa8,0xfc,0x11,0x30,0xd0,0x01,0xfa,0xdb,0xcb,0x82,0x28,0xc0,0x17,0xfb,0x1b,0x25,0x2d,0xeb,0x96, +0x19,0x4d,0x5c,0xf2,0xe9,0x63,0xcd,0x6c,0xdb,0xfe,0xbd,0x70,0x09,0x10,0x74,0xcb,0x2c,0x14,0xc6,0xac, +0x04,0x69,0x16,0x51,0x68,0x5e,0x4f,0x48,0x8c,0xb3,0x12,0x04,0x45,0x8d,0xc4,0x2c,0xaf,0x06,0xab,0xe4, +0x33,0x9a,0xec,0x48,0x3c,0x47,0x5a,0xb2,0x9d,0xdc,0x14,0xfd,0x74,0x35,0x7d,0x46,0xb5,0xaa,0x12,0x74, +0x32,0xa3,0x09,0x81,0x34,0xe9,0xd1,0x2c,0x2a,0xf6,0xe0,0x1c,0x4e,0xc6,0xcb,0x32,0x16,0x31,0x55,0xae, +0xce,0x16,0x1d,0xd4,0xa7,0xdb,0xd8,0x50,0x9a,0xc1,0xf9,0x71,0x72,0xb2,0xb1,0xd1,0xc2,0x3f,0xa1,0x56, +0x18,0x28,0xd2,0x54,0x38,0x90,0x9e,0x4d,0xb1,0xcc,0x88,0x0a,0xae,0xf7,0x30,0x22,0xfd,0xbc,0x90,0xa9, +0xb2,0xc2,0xf5,0xbe,0x5f,0x85,0xf1,0x23,0x54,0x49,0x74,0xab,0x94,0x64,0xf5,0xee,0x01,0xbc,0xf4,0xc2, +0x9e,0x34,0xea,0x70,0x27,0x4a,0x87,0x7b,0xd8,0x60,0xb5,0x2b,0x54,0x89,0x8b,0x93,0x91,0xf1,0x45,0xf8, +0x08,0x8b,0xe2,0xaa,0x41,0x42,0x56,0x4e,0x3b,0x36,0x2f,0x68,0x9e,0x48,0x35,0x99,0x54,0x5d,0xe8,0xd4, +0xf2,0x03,0x14,0x54,0xb1,0xfd,0x99,0x14,0x4d,0x69,0x5f,0xba,0x30,0xaa,0x22,0x36,0xe9,0x79,0x63,0xd0, +0x5c,0x6f,0x3c,0xcf,0xce,0x3e,0x7b,0x96,0xc0,0x8e,0x55,0x66,0x85,0x91,0x9c,0x98,0xac,0xcd,0xd2,0x04, +0x72,0x36,0x15,0xeb,0xc0,0x18,0x0c,0xdc,0xad,0x24,0x4e,0x0a,0xe4,0x01,0x86,0xd3,0x06,0x7e,0xaa,0xdc, +0x3b,0x2f,0x85,0x7a,0xb9,0x44,0xcb,0x4b,0xd2,0x79,0x92,0xd2,0xa0,0x9a,0xfe,0xee,0xfd,0x51,0x52,0x77, +0x80,0x8f,0xa0,0x1d,0xee,0x81,0x3f,0xb0,0xf3,0xed,0x0a,0xaa,0x08,0xe5,0x46,0x8b,0xb9,0x8c,0x5b,0x21, +0xa7,0x48,0x6e,0xc7,0xd4,0xc5,0xa6,0xed,0x30,0xbb,0x75,0x20,0x44,0xc0,0x86,0x92,0xe6,0x64,0xc2,0xee, +0x54,0x91,0x4b,0x24,0x4e,0xf2,0xe8,0x8a,0x2f,0x03,0x45,0x4b,0x99,0x9e,0xb1,0x83,0x44,0x99,0x8c,0x48, +0xe3,0x29,0x7e,0x0e,0x27,0x66,0x71,0x8b,0xf8,0x07,0x2b,0x3f,0x25,0xc0,0x53,0xa2,0x89,0x2c,0x3b,0x9e, +0x2f,0xf3,0xbb,0x14,0x45,0x38,0x51,0xd2,0x1f,0x88,0xf7,0x59,0x97,0x68,0x15,0xe5,0xb8,0x2e,0x89,0xeb, +0xed,0x33,0xc4,0x51,0x0a,0x91,0x14,0x03,0x50,0x13,0x55,0x26,0xb2,0x07,0xab,0x18,0xa3,0x5a,0x37,0x14, +0xf0,0x29,0x69,0x7c,0x4b,0x61,0xb1,0x13,0x49,0x4e,0x14,0x9c,0xd2,0xed,0x34,0xa6,0x29,0x23,0x48,0xcc, +0x95,0x8b,0xa2,0xb7,0x92,0x98,0x4b,0x12,0x85,0x25,0x56,0x5c,0xf2,0x73,0xfc,0xf5,0x16,0xf9,0x26,0x17, +0x25,0x38,0x75,0x9b,0x20,0x2b,0xb1,0x3b,0x94,0x62,0x40,0x58,0x56,0xb6,0x25,0x86,0xb1,0xdc,0xe9,0xa8, +0x11,0xab,0x5d,0xc6,0xd3,0x69,0xd5,0x21,0xac,0xb3,0x81,0x0f,0x28,0x61,0xe7,0x35,0xa8,0xd9,0xc5,0xd4, +0x61,0xa5,0xfc,0xdf,0x7c,0x77,0xb8,0x73,0x13,0x66,0x96,0xb2,0x14,0x18,0x49,0x6f,0x01,0x7b,0xb4,0xf8, +0x60,0xd6,0x4d,0xb2,0x74,0x0e,0xb3,0x68,0x20,0xd7,0xa8,0x4a,0xc2,0x18,0x46,0x35,0xb9,0xa8,0xe6,0xe9, +0x20,0x86,0x3e,0x64,0x5f,0x6d,0xe1,0x68,0x69,0xef,0x6d,0xd6,0x56,0xba,0x72,0x0f,0xa5,0xb5,0x32,0x8e, +0xe1,0x40,0x32,0xb7,0xdf,0x52,0x45,0x62,0xc7,0x58,0x48,0x22,0x40,0x4e,0x8e,0xe6,0xc2,0x8d,0xf3,0x50, +0xe5,0xbb,0x27,0x9b,0xca,0x6e,0x98,0x51,0x2a,0xbf,0x69,0xf2,0x20,0x80,0x7b,0xd3,0xc6,0xad,0xc0,0xc7, +0x18,0xe1,0x71,0x19,0xdf,0x72,0x66,0x19,0x3b,0xdd,0x1d,0x28,0xa9,0x93,0x0c,0xf6,0x88,0xf5,0xfe,0x50, +0x86,0xa1,0x23,0x19,0x04,0xec,0xf2,0x86,0x28,0x1a,0x63,0x78,0x48,0x6a,0xe7,0x8a,0xc4,0x65,0x65,0xc6, +0x2c,0xc0,0xc5,0x99,0x10,0x68,0x39,0x74,0x1c,0x08,0xf7,0x11,0xc2,0xc9,0x63,0x92,0xa6,0x71,0x4e,0xc6, +0x1c,0x3b,0x50,0x9b,0x66,0xdb,0xb1,0xb1,0x21,0x5a,0x59,0xd7,0x5a,0x91,0x10,0x64,0x24,0x00,0xec,0x52, +0xbd,0x55,0xce,0xa7,0xe7,0xa9,0x87,0xc8,0x36,0xa4,0xa0,0x45,0x85,0x52,0xd2,0x1a,0x80,0x84,0x49,0x8c, +0x6e,0xd5,0xd5,0x25,0x88,0x58,0x1b,0xf9,0x86,0xc6,0xf4,0x8d,0xf8,0x4c,0x97,0x06,0x20,0x8e,0xb7,0x36, +0xb2,0xb0,0x22,0xfd,0xe7,0x2b,0x6f,0x10,0x85,0x4e,0x34,0xa1,0x11,0x5d,0x4f,0xda,0x05,0xf7,0x7a,0x19, +0x9b,0x50,0x85,0x0b,0xea,0x30,0x2a,0x4d,0xa8,0x4b,0x17,0xd4,0xdf,0x22,0xab,0xc5,0xdc,0x05,0x75,0x80, +0x56,0xfb,0x3a,0xd4,0xd4,0x05,0x45,0xf2,0x48,0x13,0x6e,0xec,0x82,0x43,0x91,0x9f,0x09,0x16,0xb9,0xc0, +0x48,0xa4,0x66,0xc2,0x2d,0x5c,0x70,0x6a,0xdc,0x6e,0x84,0x3d,0x2a,0xda,0x72,0x58,0x2e,0xc4,0xe4,0x94, +0x8f,0xc4,0x6a,0x37,0x5c,0x9c,0xa8,0xe1,0x65,0x4f,0xdb,0x59,0xf8,0xa4,0xb7,0x99,0x77,0x85,0x61,0xd2, +0xd0,0x6a,0xce,0x12,0x79,0xf1,0xf5,0x18,0xe3,0xbf,0x0b,0x7f,0xfd,0xbf,0x75,0xee,0xa5,0x19,0xdc,0xa9, +0xbb,0x6a,0xc2,0xe1,0x35,0xa1,0x5b,0x99,0x5f,0x6d,0x6c,0xac,0x27,0xf2,0x3a,0xdc,0x1b,0xa6,0xba,0x9b, +0x02,0xcf,0x0b,0x18,0x19,0xf8,0x75,0x83,0xb1,0x09,0x4d,0xd3,0x45,0x5d,0xf1,0x00,0x5f,0x21,0xe7,0x6d, +0x5d,0x87,0x41,0x70,0x6f,0xec,0xd5,0x40,0xf8,0xf7,0x52,0x6e,0xd6,0xbd,0x05,0x30,0x53,0xf8,0xee,0xdb, +0x6e,0x2c,0x21,0xdc,0x75,0x39,0x8a,0x00,0x0b,0x01,0x37,0x0a,0x5e,0xe7,0xec,0xf9,0x43,0x47,0x7a,0xde, +0x46,0xc8,0x1b,0x11,0xe7,0xa5,0x34,0xfb,0x73,0xc3,0x34,0x9d,0x34,0x2d,0x14,0x8b,0x56,0x70,0x99,0x77, +0x8e,0xd5,0xfd,0xa8,0x3d,0x61,0x1c,0x04,0x29,0x4b,0x15,0x63,0x8a,0x10,0x0d,0x84,0xfb,0x09,0x95,0x7a, +0x83,0x91,0x9a,0x0c,0x1b,0xd6,0x25,0x20,0x71,0xc5,0x9d,0xed,0x4c,0x8c,0xbe,0x77,0x34,0xea,0x4d,0xee, +0x44,0xef,0xe6,0x12,0x8d,0xf4,0xae,0xec,0x5c,0x35,0x44,0xb0,0x5f,0x33,0xcb,0x08,0xf3,0x4c,0x1f,0xfe, +0xd9,0xbd,0x87,0x7f,0x76,0x47,0x74,0x66,0x77,0x20,0x67,0x6b,0xd9,0x51,0xe8,0x75,0xfa,0xfe,0xe6,0x99, +0xbf,0x25,0x3f,0xe5,0xf4,0xb8,0xdb,0x95,0xcd,0xe0,0xe9,0xab,0xe3,0x8f,0x43,0xce,0x69,0x9a,0x11,0x62, +0x37,0xd0,0xea,0x34,0x2f,0x69,0x22,0x9f,0x03,0xda,0x59,0x8c,0x95,0x32,0x13,0x3e,0xee,0x9d,0x90,0xef, +0xe0,0x2a,0xa1,0x7f,0xc2,0x5c,0x12,0x1e,0x5b,0x6e,0xcb,0xe0,0x5a,0x93,0x89,0x79,0x04,0x17,0xd2,0x61, +0x0b,0xf4,0x2e,0x88,0xc2,0x7e,0x40,0x7b,0x51,0x22,0xf7,0xa2,0x20,0x85,0x24,0x58,0xf8,0x01,0xfa,0xe3, +0x9f,0xa1,0x4f,0xfe,0x10,0x25,0x45,0x28,0xe7,0xe9,0x0f,0x93,0x2e,0x9a,0x71,0xb2,0x21,0x71,0x37,0x02, +0x30,0x4b,0x6c,0x03,0x57,0x1e,0x98,0xac,0xf5,0xd4,0x29,0x2e,0x9c,0x5a,0xea,0xd8,0x87,0xca,0xe1,0x1a, +0x0b,0xd5,0xc3,0xf1,0x05,0x0d,0x14,0xdd,0x4b,0x5e,0x8e,0xfb,0xa1,0xfd,0x74,0x50,0xbd,0x50,0xf0,0x12, +0x5a,0xdf,0xc7,0xeb,0xaf,0xbd,0xb7,0xd2,0xac,0x3b,0x0f,0xf7,0x85,0x00,0xb3,0x26,0x43,0x1c,0x9e,0x5b, +0x62,0x24,0x34,0x0b,0x9a,0x93,0x04,0x69,0x42,0xff,0x67,0xe3,0xa2,0x94,0xa4,0x49,0xe7,0x5d,0xf2,0xbc, +0x4e,0xe2,0xa4,0x5e,0xd0,0x23,0x71,0x52,0x70,0x5e,0x89,0x98,0x64,0xda,0x8d,0x72,0x8c,0xa2,0x18,0x43, +0x22,0xd2,0x7a,0x7d,0xf4,0xa7,0xb5,0x7e,0x69,0xcf,0x45,0xa2,0x63,0x53,0x47,0xc7,0xbe,0x7d,0x13,0xe6, +0x9f,0x97,0xe1,0xb4,0xa9,0x6f,0xc1,0x55,0x78,0x29,0xae,0x64,0x3f,0xc3,0xa5,0x39,0xca,0x5f,0x61,0x2c, +0x2f,0x14,0xba,0x22,0xa2,0x3d,0x3c,0x3d,0xae,0x88,0xdd,0xc0,0x81,0x3f,0x2c,0xb3,0x05,0xa4,0x37,0x91, +0xa0,0xef,0x63,0x7d,0x26,0x74,0xbf,0x11,0xba,0x87,0xd0,0x97,0x1a,0x65,0xaf,0xe0,0xcb,0xa4,0x1d,0x3a, +0x60,0x10,0x20,0x46,0xda,0x0d,0x47,0x1e,0xb2,0xa9,0xa2,0x9e,0x64,0x05,0x4d,0x3e,0xac,0xa2,0xc9,0xc7, +0xf0,0x43,0x23,0x4d,0xc6,0xe1,0xc7,0x5b,0x68,0x32,0x76,0xd1,0x04,0x27,0xa8,0xde,0x45,0xec,0xe0,0xd8, +0x45,0x0e,0x84,0x37,0xc1,0x3e,0x6a,0x74,0x18,0x8b,0xaf,0x7a,0x97,0x7f,0xad,0x75,0x59,0x7b,0xc3,0x15, +0x9d,0xfe,0x75,0x55,0xa7,0xff,0x1a,0xfe,0xda,0xd8,0xe9,0xcf,0xe1,0x5f,0x6f,0xe9,0xf4,0x67,0x67,0xa7, +0x79,0x64,0xb9,0xeb,0xa2,0x37,0x9f,0x9d,0x9d,0x66,0xc0,0x5e,0x05,0xf6,0x57,0xad,0xd3,0x9f,0xc5,0x57, +0xbd,0xd3,0x5f,0x6b,0x9d,0xae,0x5e,0x7c,0x45,0x9f,0xbf,0xae,0xea,0xf3,0x45,0xf8,0xb5,0xb1,0xcf,0x87, +0xe1,0xc5,0x2d,0x7d,0x3e,0x5c,0xd1,0x67,0x1e,0x43,0x54,0xb9,0xc7,0xaa,0x56,0xf4,0x99,0x01,0x69,0xc2, +0x5f,0x68,0x7d,0x3e,0x14,0x5f,0xf5,0x3e,0xbf,0xab,0xf5,0xf9,0xb5,0xd5,0xe5,0x77,0xab,0xba,0xfc,0x26, +0x7c,0xd7,0xd8,0xe5,0x2f,0xe1,0x9b,0x5b,0xba,0xfc,0xa5,0xd6,0xe5,0xef,0xce,0x7b,0x3d,0x2c,0x6a,0x66, +0x74,0xfb,0x4f,0xf9,0xbf,0x9f,0x10,0xe2,0xdc,0x05,0xf1,0xa3,0xfc,0x0f,0x20,0x7a,0x4e,0x88,0x27,0x94, +0x73,0xee,0xc8,0x79,0xaa,0xd5,0xde,0xeb,0xb9,0x20,0xfe,0xa4,0xd5,0x7e,0xee,0x82,0xe8,0x2b,0xd4,0xdf, +0x68,0x64,0xff,0x22,0xbe,0xea,0x64,0x7f,0x5d,0x23,0xbb,0x52,0xb7,0x11,0x64,0x7f,0xbd,0x8a,0xec,0xa7, +0x6e,0x47,0x07,0x4a,0xdb,0xb6,0xb5,0x84,0x9d,0x7f,0xe1,0x0f,0x4f,0xbb,0xb9,0x7d,0xac,0x9d,0xe2,0x11, +0x78,0xda,0x9d,0xd6,0xd3,0xa7,0x98,0x3e,0xae,0xa7,0x8f,0xf9,0xcc,0x3b,0x08,0x5f,0x37,0x0e,0xf5,0xdb, +0xf0,0xe0,0x96,0xa1,0x7e,0xdb,0x30,0xbb,0x4f,0xd1,0xe2,0x39,0xc0,0xbf,0x53,0xf1,0x77,0xcc,0x4b,0xf6, +0x6d,0xc3,0x2c,0xb7,0xd0,0x5b,0x38,0x0d,0xaf,0x9b,0x53,0xb1,0xea,0x03,0x6d,0x88,0xde,0x8a,0xaf,0xfa, +0x10,0xbd,0xaf,0x0d,0x91,0x52,0x25,0x12,0x43,0xf4,0x7e,0xd5,0x10,0xed,0xdd,0x3e,0x44,0x67,0x70,0x8e, +0x0d,0xf7,0xea,0x43,0xb4,0x87,0x43,0xb4,0x57,0x1f,0xa2,0x3d,0x1c,0xa2,0xbd,0xfa,0x10,0xed,0xc9,0x21, +0x7a,0x15,0xbe,0x6f,0x1c,0xa2,0xa3,0xf0,0xd5,0x2d,0x43,0x74,0xd4,0x30,0x44,0x7b,0x62,0x88,0xf6,0xc4, +0x10,0xed,0xc9,0x21,0x3a,0xaa,0xaf,0x81,0x1e,0xad,0x81,0x57,0x1a,0x81,0x8f,0xc4,0x97,0x49,0xe0,0x3b, +0xb1,0xb2,0x86,0x1c,0xda,0x7a,0x86,0xb8,0x9d,0x93,0x6d,0x12,0xf5,0x10,0x63,0x49,0xc6,0x03,0xc4,0xa6, +0x96,0xf7,0x60,0x53,0x1b,0x64,0x15,0x38,0x17,0x92,0x46,0x76,0xaf,0x70,0x97,0x13,0x5a,0x03,0xf8,0x6c, +0xec,0xcc,0x17,0xea,0x8b,0x00,0x20,0xb4,0xc1,0xcf,0xb2,0xa2,0xb5,0xbd,0x29,0x1f,0x75,0x61,0x22,0xf9, +0xf0,0xbf,0x42,0x6a,0x86,0x17,0x49,0xea,0xca,0x9d,0x87,0x89,0xbc,0x00,0x6d,0x6d,0x03,0xe7,0x9b,0xa8, +0xcb,0xc7,0xd6,0xf6,0xb0,0xd0,0xdc,0x14,0x07,0xf3,0x76,0xb6,0xa9,0xc1,0xd2,0xa5,0xc3,0x0f,0x04,0x08, +0x0c,0xaf,0x17,0x4c,0x3a,0xe9,0xa6,0x5e,0x5e,0x80,0xf4,0x2d,0xa9,0xa3,0xe1,0x0b,0x45,0x7a,0xfe,0x69, +0x86,0xd8,0xd8,0xe8,0xd9,0x62,0x4b,0xe0,0x4e,0x47,0xc2,0xdb,0x76,0xb6,0x88,0xce,0x80,0xe9,0xc7,0x23, +0x6d,0x60,0x27,0xf5,0x3b,0xad,0xbc,0x7b,0xb9,0xd3,0xdd,0x1e,0x75,0xb7,0x07,0xf0,0x4b,0x88,0x2e,0x6a, +0x37,0xe0,0xda,0x89,0x36,0x6b,0x1c,0xab,0xa5,0xab,0xac,0x1c,0xa9,0xe1,0x52,0x23,0x06,0x50,0x78,0x73, +0x66,0xde,0xe4,0xb8,0xf9,0x33,0x97,0x10,0xca,0x68,0xfe,0xac,0xb1,0xf9,0x85,0xab,0xac,0x6a,0x7e,0xa1, +0x35,0xdf,0xea,0x77,0x60,0x78,0xe1,0x9a,0xe8,0x42,0x61,0xdf,0x25,0xe1,0x32,0x50,0x58,0x75,0x39,0x71, +0x94,0x55,0x28,0x9c,0xdb,0x28,0x5c,0xfa,0x9b,0xfb,0x2e,0x14,0xa6,0x2e,0xf1,0xd9,0xad,0xd7,0x08,0x79, +0x87,0x70,0x94,0x55,0x28,0x5c,0xda,0x28,0xe4,0xfe,0xe6,0xd4,0x85,0xc2,0x95,0x5b,0x36,0x67,0x20,0x71, +0xd5,0x88,0xc4,0x07,0x77,0x69,0x85,0xc6,0x07,0x1b,0x8d,0xa9,0xbf,0x79,0xe5,0x42,0xe3,0xa3,0x53,0xf4, +0x67,0x60,0xf1,0xb1,0x11,0x8b,0xb1,0xb3,0xb0,0x42,0x62,0x6c,0x23,0x31,0xf6,0x37,0x3f,0xba,0x90,0xf8, +0xd5,0x2d,0x58,0xbc,0x95,0x9d,0x97,0xbc,0xbc,0xb3,0xb4,0x42,0xe3,0xaf,0x36,0x1a,0x91,0xbf,0xf9,0xab, +0x8d,0xc6,0x7d,0x76,0x7c,0x57,0x20,0x03,0x33,0xc6,0x8a,0xfe,0x6e,0xd9,0xf0,0x6a,0x79,0x97,0x96,0xde, +0x90,0xa2,0xc4,0x7d,0x4f,0x16,0xfb,0xf5,0xc5,0x36,0x5e,0x11,0x8f,0xe1,0x53,0xf9,0xc8,0xe4,0xcb,0x67, +0x27,0x0d,0xc6,0x06,0xb1,0xde,0x96,0x84,0x63,0x2a,0x54,0x29,0x60,0xe2,0x56,0xf6,0x0c,0x9e,0xe1,0x82, +0xa9,0xa5,0x09,0x4b,0xd8,0x7d,0x8d,0xac,0x8a,0xd2,0xba,0x97,0xbb,0xdd,0x27,0x23,0x51,0x07,0xa5,0x78, +0xf8,0x7c,0x11,0xd1,0x73,0xb5,0x95,0x7c,0x85,0x91,0x0d,0x51,0x00,0x7c,0x0b,0xd1,0xf6,0x80,0x58,0x97, +0xe4,0x93,0x33,0xcf,0xe6,0x86,0x3e,0x87,0x14,0xad,0x56,0xcf,0xa8,0xfa,0xd9,0x1a,0xe9,0xe5,0x3c,0x56, +0x6f,0xea,0xad,0x2b,0xcf,0x47,0xf2,0xb4,0x6c,0x59,0xcf,0x54,0x1a,0x59,0xe8,0xb0,0x34,0xce,0x70,0xa9, +0xd1,0x91,0xb3,0x5f,0x52,0x7c,0x22,0x31,0x1d,0x98,0xb2,0xf9,0x45,0xe5,0x63,0x8f,0x28,0x4a,0xb0,0x61, +0x03,0x68,0xe5,0xe4,0x94,0x01,0xff,0x7e,0x1b,0xe0,0xdf,0xe9,0x01,0x59,0xad,0x1d,0x93,0x39,0xe0,0x5e, +0x65,0xd0,0xcb,0x55,0x3c,0x40,0x1a,0xb6,0x9c,0x00,0x15,0x13,0x20,0xb1,0xee,0x24,0xf8,0x84,0x56,0xe0, +0x83,0x76,0x17,0x0f,0xee,0x8e,0x76,0x66,0xfb,0x5b,0x2d,0xfd,0x0b,0x6d,0xc4,0x3a,0xa2,0xdc,0xdf,0xf5, +0x72,0xb0,0x50,0x3b,0xfa,0x41,0x4e,0xe5,0xb4,0x4f,0x62,0x8e,0x1a,0x9d,0x83,0xf9,0x2c,0xe3,0x57,0x08, +0xb5,0x12,0x8d,0xe7,0x7c,0x26,0x5c,0x96,0xed,0xcf,0x91,0xb7,0x24,0x9e,0x4f,0xe0,0x29,0xfd,0x89,0xd1, +0x97,0xbf,0x02,0x6d,0x03,0xeb,0xdb,0x2b,0xc7,0xce,0xa8,0xba,0xe1,0xc3,0x5f,0xdd,0x35,0x16,0xa6,0x3b, +0x74,0xf0,0x52,0x43,0x03,0x6f,0x4e,0xfa,0x77,0x13,0x8a,0x88,0x30,0xc1,0x88,0x08,0x45,0x17,0x3d,0xa8, +0x6d,0x6c,0x4c,0x76,0xf8,0x97,0xf2,0xa5,0x46,0x00,0x3d,0xae,0x78,0x86,0x96,0x77,0x29,0x71,0x34,0x68, +0x7f,0x57,0xe9,0xe5,0xcd,0xb7,0x52,0xc0,0x44,0xf1,0x67,0xfe,0x70,0x46,0x61,0x17,0x66,0x6d,0xf4,0xfd, +0x1f,0xcc,0xf5,0x0f,0xf9,0x3e,0xfd,0xba,0xb8,0x6c,0xcd,0x82,0x49,0x10,0xc1,0x19,0x5b,0xd9,0x5e,0xd6, +0xe6,0x99,0x29,0xde,0x6f,0x9c,0x6f,0x52,0xbb,0x12,0xa9,0xdb,0x30,0x25,0xfc,0xad,0x8a,0x52,0x77,0x98, +0x01,0x5a,0x3d,0x0f,0x18,0x24,0xa3,0x31,0xe6,0xbc,0x80,0x0a,0x40,0xb3,0xf9,0x6e,0x1f,0x35,0x0e,0x87, +0x92,0xde,0x4b,0x9b,0xde,0xa3,0x65,0xd8,0x1b,0xa8,0xdc,0xdd,0x7e,0xa7,0x3e,0x1e,0x4b,0x7d,0xc0,0x96, +0xb0,0x01,0xd6,0x61,0x96,0x3b,0xdd,0x27,0x6d,0x57,0x49,0x1c,0x82,0x4c,0x3b,0xcf,0x96,0x1a,0xcb,0x2b, +0x18,0x5e,0xc7,0x62,0xa7,0xb7,0x41,0x11,0x31,0x01,0x08,0x8a,0xd7,0xbb,0x7e,0x67,0x09,0x63,0x37,0x85, +0x7f,0x63,0x67,0x11,0xf1,0x50,0x68,0x16,0x8a,0xba,0x79,0xc0,0x05,0xdd,0x85,0xf8,0xd5,0xb0,0x5e,0x06, +0x1b,0x42,0x85,0x45,0x57,0x99,0xd7,0x66,0x11,0x9c,0x57,0xd8,0x40,0x41,0x33,0xcb,0x55,0x80,0x1e,0x4d, +0xcd,0x02,0x51,0x77,0x26,0xf0,0x72,0x17,0xa1,0x17,0xd4,0x7a,0x11,0x6c,0xa5,0x09,0x2d,0xf1,0xb2,0x59, +0x15,0xa2,0x04,0x52,0xbb,0xbc,0x59,0xa1,0x21,0x31,0x15,0xca,0x21,0x4d,0xac,0x01,0x9d,0x0c,0x2b,0x8b, +0xb3,0xba,0xa2,0xad,0x1b,0x6c,0xea,0x01,0xb8,0x9c,0xe9,0xe6,0xc2,0x22,0x14,0x95,0x14,0xa4,0x67,0xc6, +0xdd,0xb0,0x27,0xcf,0x76,0x3e,0x6e,0x0d,0x87,0x7b,0x7a,0xfa,0xa6,0xda,0x5a,0xfa,0x3d,0xad,0x02,0xa9, +0xa6,0xeb,0xc8,0x68,0x3c,0xe6,0xe3,0x15,0x27,0x74,0x51,0xef,0x5f,0xf5,0xe6,0xa9,0x7b,0x08,0x83,0x7e, +0xcb,0x4e,0x26,0x23,0x53,0xed,0x26,0x81,0x12,0x83,0xd5,0xdc,0x53,0x51,0x1b,0x05,0x72,0x00,0xc9,0x15, +0xd6,0x9e,0x8b,0x62,0xd5,0x00,0x33,0x3b,0x08,0x3b,0x90,0x3e,0x12,0xf2,0x91,0x36,0x99,0xa3,0x16,0x24, +0x04,0x30,0x4c,0xf0,0x6f,0x0c,0xff,0x22,0x1d,0x72,0x36,0xd2,0xe6,0x17,0x42,0xce,0x00,0xa2,0x80,0x7f, +0x97,0x36,0x64,0x34,0x32,0x27,0x95,0xc8,0xbe,0xb5,0x4f,0x88,0x81,0x41,0xb9,0x80,0xec,0xb1,0x81,0x7e, +0x52,0x71,0x94,0xde,0xd5,0xd1,0x49,0xbb,0x70,0x90,0xa8,0x71,0x23,0x59,0x17,0xf8,0x42,0xd8,0x3b,0xa6, +0x61,0x0e,0xff,0x1f,0x87,0x89,0xf0,0xf6,0x8c,0x46,0xc7,0x19,0x4c,0x8c,0xa2,0x7a,0x1d,0x97,0x26,0xe0, +0xdc,0x84,0x1a,0x88,0xac,0x3b,0x0b,0x53,0xe8,0x55,0xd6,0x2d,0xe0,0x6f,0x01,0x7f,0x2f,0xe1,0xef,0x65, +0x33,0x7b,0x5b,0x63,0x84,0x23,0xb1,0x9c,0x34,0xee,0xf6,0x56,0x4e,0x98,0xfb,0x6d,0x59,0xa3,0x6b,0x31, +0xba,0xcc,0xe1,0xa1,0x4c,0xd2,0xf5,0x4d,0x56,0x4f,0x43,0x1c,0xa3,0xdf,0x40,0xcb,0x19,0xd1,0xb2,0x20, +0x5a,0x5e,0xae,0xa2,0xa5,0x92,0xa7,0xd9,0xb4,0xcc,0x81,0x76,0x39,0x8d,0x47,0x0a,0xf3,0x09,0x47,0x24, +0x85,0x39,0xf5,0x2f,0xa7,0x65,0xdd,0xb2,0xdf,0x41,0x4b,0x9e,0xc0,0x77,0xa6,0x25,0xcd,0x62,0xe7,0x5a, +0x5b,0x53,0xd4,0x24,0x3d,0xaf,0x2a,0x7c,0x80,0xdc,0x8e,0xe2,0x7b,0xf4,0xb8,0x7c,0x48,0x8f,0x67,0xd9, +0x95,0xdb,0xc7,0x35,0x33,0xf0,0x01,0xab,0x5a,0xa0,0xcf,0x06,0x4b,0x0b,0xc5,0xdc,0x70,0xf1,0x99,0x99, +0xdd,0xe3,0x92,0x3f,0x52,0xa9,0xb9,0x56,0xac,0x54,0xe2,0x05,0x5a,0xa2,0xe0,0x71,0xbd,0x87,0x6a,0x75, +0x42,0x56,0x75,0x8d,0x7e,0x6a,0xf3,0x3b,0x73,0x22,0x52,0x37,0xe3,0xb5,0xf1,0x26,0x4f,0x2e,0x6f,0x9b, +0x2b,0xa9,0x33,0xb4,0xe2,0x8d,0xfe,0xce,0xba,0xb6,0x2b,0xee,0xac,0x9a,0x4e,0x7d,0xce,0x77,0x45,0xb4, +0x1b,0x88,0x26,0x30,0x20,0xa8,0xd2,0xa3,0xf9,0x0e,0x46,0x55,0x1e,0xdd,0xfd,0x2f,0xaa,0x85,0x75,0x51, +0x35,0x8f,0x34,0x59,0x9d,0x56,0xf9,0xbe,0xd2,0xf4,0x2b,0x6a,0x47,0xb2,0xd2,0x1d,0x93,0x3c,0x64,0x65, +0x43,0x5e,0x9c,0xc1,0x95,0x6d,0x7e,0x04,0xb4,0xc6,0xbb,0xca,0xdd,0xa9,0x3b,0x4c,0x77,0xb2,0x51,0x55, +0x8d,0x8a,0x2b,0xa4,0xea,0xc3,0x00,0x62,0x83,0xd4,0x1e,0x84,0xdd,0xac,0xad,0xeb,0xc7,0x71,0x32,0x30, +0x71,0x06,0xd0,0xc6,0xc6,0xea,0x8a,0xed,0x4a,0x3b,0xf5,0x2a,0xdb,0x56,0x95,0x37,0xab,0x74,0x33,0x91, +0xd2,0x2e,0xab,0x75,0x43,0x5b,0x02,0x3f,0xc2,0x46,0xd5,0x07,0xba,0x7c,0xe2,0x50,0xbe,0x5f,0x96,0xa6, +0x72,0x9c,0x39,0xac,0x8d,0x83,0xc7,0x4a,0x79,0xb4,0x59,0x08,0x2d,0xdb,0xf0,0xfa,0x66,0x95,0x76,0xb0, +0xa1,0x00,0xa2,0x63,0xdc,0xe8,0xb7,0x5d,0xea,0x82,0x0a,0x2f,0x1a,0x12,0xda,0xd2,0x63,0xc5,0xae,0x34, +0x64,0xf1,0x5a,0x8c,0xcb,0xa3,0xe4,0x22,0x06,0xea,0xea,0x8e,0xe3,0x61,0x27,0x10,0xd7,0xfa,0x06,0x85, +0xd9,0x1b,0x19,0x4f,0xc1,0x11,0x8c,0x5a,0x7a,0x53,0xda,0x4b,0x27,0x39,0x6e,0x7a,0xdd,0xcd,0xb5,0x97, +0x09,0x2c,0xb5,0xec,0xcb,0x16,0x60,0x73,0x6b,0x83,0x2e,0x2c,0xb5,0xec,0x2c,0x8d,0x59,0xad,0xd5,0x30, +0x85,0xbc,0x03,0xc2,0x37,0xc6,0x70,0xd4,0xb4,0xac,0x1f,0x32,0x00,0xca,0xf4,0x45,0x5b,0xdb,0xdf,0xbe, +0xb5,0x94,0x99,0x40,0x5e,0x6d,0x11,0x42,0xd4,0x44,0xdb,0x04,0x2e,0x08,0xae,0x19,0xf8,0xaf,0xe9,0x14, +0xa3,0x5a,0x88,0x88,0xe3,0x2e,0x14,0x49,0x47,0xd7,0x29,0xbd,0x59,0x85,0x1d,0x6a,0xe7,0xe8,0x5c,0x64, +0xd5,0xba,0x3f,0x84,0xc3,0x39,0xa9,0xb8,0xc8,0x02,0xa3,0xaa,0xd5,0x9b,0x3d,0xb3,0x02,0xb9,0xfd,0x0e, +0xed,0x26,0xd5,0x2a,0x52,0x4e,0xd9,0x61,0x42,0x8c,0x4c,0x64,0x7a,0x68,0x1d,0x21,0x01,0xa5,0x5f,0xf7, +0x8d,0x8d,0x75,0xc0,0xda,0xf3,0x4c,0x32,0x6a,0xb5,0xb3,0x9d,0x9f,0x94,0xd1,0xe9,0xdd,0xa9,0x1b,0x3b, +0xdc,0x7b,0xa8,0xf9,0x6c,0x94,0x52,0xc4,0xdc,0xd8,0xf8,0x35,0x51,0x21,0xdc,0x9e,0xc4,0x80,0x8a,0xb6, +0x85,0x7e,0xb6,0xe7,0xc2,0xc7,0x32,0x3d,0xf8,0x8d,0x38,0x91,0xc8,0x61,0xb5,0x46,0x78,0xb2,0x5a,0x23, +0x5c,0x9a,0xb4,0x48,0x6b,0x1c,0x0a,0x3d,0x04,0xa8,0xfb,0xd2,0xe8,0xc9,0x4c,0xa6,0xe3,0xab,0x1e,0xa7, +0x42,0x38,0x33,0xbf,0xc6,0xdc,0xc1,0xf1,0xc9,0x4d,0x25,0xfa,0x03,0x9e,0xd0,0x32,0xb6,0x94,0xb2,0x3e, +0xb2,0xb9,0x8c,0xa8,0xc2,0xee,0x62,0x59,0xcc,0x5a,0xc5,0x71,0x76,0x82,0xb3,0x45,0xef,0x78,0xb1,0x2c, +0x50,0x45,0x36,0x9e,0x70,0xa4,0x3a,0x0f,0x18,0x54,0x07,0x51,0x2b,0xb3,0x94,0xdf,0x6f,0x8c,0xd7,0xcd, +0x41,0xc6,0xb5,0x53,0x5b,0xb6,0x8e,0x91,0xa7,0x2d,0xca,0xc4,0xd1,0x65,0x6c,0xdc,0x8c,0x27,0x20,0x94, +0x77,0xcf,0xe6,0x59,0x11,0x17,0xa5,0x26,0x6d,0x94,0xba,0xed,0xd5,0x90,0xd4,0x7a,0x02,0xcc,0x64,0x4b, +0xc9,0xbc,0xef,0x22,0xe2,0x25,0x01,0x2a,0x07,0xf1,0x16,0x02,0x22,0xe4,0x58,0x54,0x2f,0x59,0x74,0x85, +0xd8,0x3a,0x3a,0xf4,0xef,0xd7,0x95,0x7b,0xf4,0xc0,0xb6,0xae,0xfe,0x77,0xe9,0xc2,0x43,0x46,0xc3,0x6d, +0x84,0xfd,0x9f,0xdc,0x23,0xdd,0xd9,0xd2,0xef,0xff,0x7c,0x91,0xac,0xe8,0x3c,0x5c,0x5c,0x9b,0x3a,0x8f, +0xdc,0x76,0xa4,0x6d,0xbb,0xda,0x65,0xc8,0x34,0xe7,0xf1,0xaf,0xa3,0x06,0x06,0x21,0xab,0xba,0xce,0xbb, +0x35,0x35,0x72,0xfa,0xfc,0xfd,0xbb,0xa3,0xd3,0x23,0x60,0xc9,0x5f,0xbd,0x38,0x38,0x7d,0xf1,0xb7,0x17, +0xef,0x8e,0x0e,0xb1,0xbd,0x87,0xdb,0x9b,0x65,0x0f,0xb4,0x37,0x13,0x57,0xf6,0x6c,0xe5,0x06,0xec,0xeb, +0x5b,0x7b,0xaa,0xb6,0xf6,0x39,0x5e,0xde,0xa1,0x2a,0xd4,0xfa,0x1d,0x4e,0x76,0xe6,0x72,0x8f,0x9f,0xc0, +0x1e,0x5f,0xe1,0xe3,0xb5,0x5b,0x1e,0x90,0x6c,0x7e,0x3c,0x39,0xe9,0x62,0x34,0x99,0x62,0x11,0x9d,0xc5, +0x23,0xcf,0x1b,0x78,0x5d,0xaf,0x6d,0xa6,0xfa,0x01,0x7d,0x73,0xc8,0xa8,0xdc,0xbf,0xd1,0x46,0x12,0x18, +0x80,0xca,0x10,0x53,0x3c,0x2b,0x45,0xae,0xb7,0x2f,0xbc,0xd7,0xde,0x69,0x9e,0xb2,0xf5,0x52,0x66,0x4f, +0x4d,0x18,0x5f,0x9f,0x6f,0x1c,0x6e,0x0f,0x5c,0xce,0x45,0x76,0xaf,0xc9,0x99,0xab,0xc9,0x59,0xd6,0xc2, +0xfe,0x09,0xa5,0x96,0xdf,0x63,0xb1,0x4a,0x2f,0x84,0x4e,0x22,0x95,0x8e,0x45,0x49,0x91,0x47,0x29,0x62, +0xa0,0x79,0xda,0x6a,0xee,0xc3,0x9c,0x9d,0xa7,0xae,0xaf,0x99,0x78,0x76,0x0d,0x7b,0x2b,0x38,0x62,0x5d, +0xe1,0xaa,0xca,0xdb,0xb8,0xee,0xb2,0x7e,0x6b,0xb7,0xaf,0xec,0x37,0xc6,0x2e,0x62,0xf8,0xc0,0xb3,0xad, +0xda,0xf9,0x12,0xe3,0x34,0x36,0xad,0xd8,0x5d,0xa7,0x29,0x6a,0x33,0xc9,0xab,0xb8,0x0d,0xca,0xd6,0x4a, +0x1b,0x82,0x42,0xe7,0x2c,0x0a,0x93,0xb3,0x88,0x1c,0x9c,0x45,0x21,0x2e,0x13,0x28,0x6b,0x8f,0xb5,0xf0, +0xaf,0x78,0xb5,0xf9,0x6a,0x5e,0xa1,0xbc,0x63,0xb6,0x84,0xc7,0xb5,0x4e,0x62,0xa5,0x05,0xa1,0x7c,0x02, +0x53,0xd0,0x5e,0xff,0xad,0x6b,0x33,0xfc,0x10,0x5e,0x8f,0xf4,0xfb,0x94,0x5c,0x57,0xb1,0x8c,0xb5,0x8a, +0xe1,0x39,0x55,0x18,0xd6,0xec,0x9f,0xc9,0x7c,0x1e,0x51,0x3c,0x4c,0x97,0xe6,0x9c,0x8a,0xe1,0x27,0x2c, +0x01,0xc2,0xee,0xb6,0x7f,0x2b,0xee,0xa6,0x39,0x2f,0xfb,0x42,0x4c,0x26,0xd2,0x11,0xe2,0x07,0x58,0xdd, +0xef,0xe9,0x6d,0x57,0xf9,0x42,0x5c,0x88,0x60,0x9d,0x83,0xb5,0x68,0x5c,0x64,0xf3,0x65,0x19,0x0f,0xd7, +0x50,0xa4,0x04,0x4c,0xe8,0x1a,0x89,0x85,0xf0,0x87,0x30,0xe5,0xc0,0x9f,0x6c,0xbe,0x01,0xbf,0x34,0xb7, +0x89,0x3c,0x5d,0x95,0x8b,0x11,0x18,0x58,0xe1,0x5f,0xe4,0xd9,0xd7,0x37,0x93,0x56,0xbd,0xed,0xc6,0x87, +0xb3,0xa1,0x8a,0xc2,0x94,0x5b,0xde,0xf8,0x58,0xd0,0x21,0xb6,0xf8,0x83,0x78,0x1e,0xe1,0x92,0xab,0xaa, +0x7c,0xb6,0x9c,0xbe,0x4c,0xbe,0x18,0x77,0x59,0x44,0x2a,0xfe,0x7d,0x91,0x8a,0x83,0x1e,0xbb,0xef,0x3f, +0x2f,0xe9,0xd1,0x33,0x46,0x99,0x0f,0xdc,0x54,0x57,0x45,0x96,0xea,0xd1,0x9d,0xf9,0x06,0x66,0x5e,0x8b, +0x43,0x7a,0x69,0x51,0xf5,0xb6,0x70,0xf6,0xec,0xfe,0x3f,0xcd,0x35,0x0d,0xe8,0x5c,0x70,0x03,0x00 }; \ No newline at end of file diff --git a/code/espurna/web.ino b/code/espurna/web.ino index 8deb4c4d..6323d40b 100644 --- a/code/espurna/web.ino +++ b/code/espurna/web.ino @@ -43,7 +43,7 @@ void _onReset(AsyncWebServerRequest *request) { void _onGetConfig(AsyncWebServerRequest *request) { webLog(request); - if (!_authenticate(request)) return request->requestAuthentication(getSetting("hostname").c_str()); + if (!webAuthenticate(request)) return request->requestAuthentication(getSetting("hostname").c_str()); AsyncResponseStream *response = request->beginResponseStream("text/json"); @@ -64,7 +64,7 @@ void _onGetConfig(AsyncWebServerRequest *request) { void _onPostConfig(AsyncWebServerRequest *request) { webLog(request); - if (!_authenticate(request)) return request->requestAuthentication(getSetting("hostname").c_str()); + if (!webAuthenticate(request)) return request->requestAuthentication(getSetting("hostname").c_str()); request->send(_webConfigSuccess ? 200 : 400); } @@ -112,7 +112,7 @@ void _onPostConfigData(AsyncWebServerRequest *request, String filename, size_t i void _onHome(AsyncWebServerRequest *request) { webLog(request); - if (!_authenticate(request)) return request->requestAuthentication(getSetting("hostname").c_str()); + if (!webAuthenticate(request)) return request->requestAuthentication(getSetting("hostname").c_str()); if (request->header("If-Modified-Since").equals(_last_modified)) { @@ -212,7 +212,7 @@ int _onCertificate(void * arg, const char *filename, uint8_t **buf) { void _onUpgrade(AsyncWebServerRequest *request) { webLog(request); - if (!_authenticate(request)) return request->requestAuthentication(getSetting("hostname").c_str()); + if (!webAuthenticate(request)) return request->requestAuthentication(getSetting("hostname").c_str()); char buffer[10]; if (!Update.hasError()) { @@ -262,7 +262,7 @@ void _onUpgradeData(AsyncWebServerRequest *request, String filename, size_t inde // ----------------------------------------------------------------------------- -bool _authenticate(AsyncWebServerRequest *request) { +bool webAuthenticate(AsyncWebServerRequest *request) { #if USE_PASSWORD String password = getSetting("adminPass", ADMIN_PASS); char httpPassword[password.length() + 1]; diff --git a/code/espurna/ws.ino b/code/espurna/ws.ino index 68a18ba2..caf5ce98 100644 --- a/code/espurna/ws.ino +++ b/code/espurna/ws.ino @@ -27,6 +27,57 @@ std::vector _ws_on_receive_callbacks; // Private methods // ----------------------------------------------------------------------------- +typedef struct { + IPAddress ip; + unsigned long timestamp = 0; +} ws_ticket_t; +ws_ticket_t _ticket[WS_BUFFER_SIZE]; + +void _onAuth(AsyncWebServerRequest *request) { + + webLog(request); + if (!webAuthenticate(request)) return request->requestAuthentication(); + + IPAddress ip = request->client()->remoteIP(); + unsigned long now = millis(); + unsigned short index; + for (index = 0; index < WS_BUFFER_SIZE; index++) { + if (_ticket[index].ip == ip) break; + if (_ticket[index].timestamp == 0) break; + if (now - _ticket[index].timestamp > WS_TIMEOUT) break; + } + if (index == WS_BUFFER_SIZE) { + request->send(429); + } else { + _ticket[index].ip = ip; + _ticket[index].timestamp = now; + request->send(200, "text/plain", "OK"); + } + +} + +bool _wsAuth(AsyncWebSocketClient * client) { + + IPAddress ip = client->remoteIP(); + unsigned long now = millis(); + unsigned short index = 0; + + for (index = 0; index < WS_BUFFER_SIZE; index++) { + if ((_ticket[index].ip == ip) && (now - _ticket[index].timestamp < WS_TIMEOUT)) break; + } + + if (index == WS_BUFFER_SIZE) { + DEBUG_MSG_P(PSTR("[WEBSOCKET] Validation check failed\n")); + wsSend_P(client->id(), PSTR("{\"message\": 10}")); + return false; + } + + return true; + +} + +// ----------------------------------------------------------------------------- + #if MQTT_SUPPORT void _wsMQTTCallback(unsigned int type, const char * topic, const char * payload) { if (type == MQTT_CONNECT_EVENT) wsSend_P(PSTR("{\"mqttStatus\": true}")); @@ -315,6 +366,11 @@ void _wsStart(uint32_t client_id) { void _wsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){ if (type == WS_EVT_CONNECT) { + + #ifndef NOWSAUTH + if (!_wsAuth(client)) return; + #endif + IPAddress ip = client->remoteIP(); DEBUG_MSG_P(PSTR("[WEBSOCKET] #%u connected, ip: %d.%d.%d.%d, url: %s\n"), client->id(), ip[0], ip[1], ip[2], ip[3], server->url()); _wsStart(client->id()); @@ -421,17 +477,6 @@ void wsSend_P(uint32_t client_id, PGM_P payload) { _ws.text(client_id, buffer); } -void wsConfigure() { - #if USE_PASSWORD - bool auth = getSetting("wsAuth", WS_AUTHENTICATION).toInt() == 1; - if (auth) { - _ws.setAuthentication(WEB_USERNAME, (const char *) getSetting("adminPass", ADMIN_PASS).c_str()); - } else { - _ws.setAuthentication("", ""); - } - #endif -} - // This method being public makes // _ws_on_after_parse_callbacks strange here, // it should belong somewhere else. @@ -443,14 +488,13 @@ void wsReload() { void wsSetup() { _ws.onEvent(_wsEvent); - wsConfigure(); webServer()->addHandler(&_ws); + webServer()->on("/auth", HTTP_GET, _onAuth); #if MQTT_SUPPORT mqttRegister(_wsMQTTCallback); #endif wsOnSendRegister(_wsOnStart); wsOnReceiveRegister(_wsOnReceive); - wsOnAfterParseRegister(wsConfigure); espurnaRegisterLoop(_wsLoop); } diff --git a/code/html/custom.js b/code/html/custom.js index 2efd3644..e7134182 100644 --- a/code/html/custom.js +++ b/code/html/custom.js @@ -1351,7 +1351,7 @@ function hasChanged() { function initUrls(root) { - var paths = ["ws", "upgrade", "config"]; + var paths = ["ws", "upgrade", "config", "auth"]; urls["root"] = root; paths.forEach(function(path) { @@ -1363,15 +1363,26 @@ function initUrls(root) { } function connectToURL(url) { + initUrls(url); - if (websock) { websock.close(); } - websock = new WebSocket(urls.ws.href); - websock.onmessage = function(evt) { - var data = getJson(evt.data.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t")); - if (data) { - processData(data); - } - }; + + $.ajax({ + 'method': 'GET', + 'url': urls.auth.href, + 'xhrFields': { 'withCredentials': true } + }).done(function(data) { + if (websock) { websock.close(); } + websock = new WebSocket(urls.ws.href); + websock.onmessage = function(evt) { + var data = getJson(evt.data.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t")); + if (data) { + processData(data); + } + }; + }).fail(function() { + // Nothing to do, reload page and retry + }); + } function connect(host) { diff --git a/code/platformio.ini b/code/platformio.ini index 9fe2e893..c2dffd53 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -60,7 +60,7 @@ lib_deps = Embedis https://github.com/plerup/espsoftwareserial#3.4.1 https://github.com/me-no-dev/ESPAsyncTCP#55cd520 - https://github.com/me-no-dev/ESPAsyncWebServer#232b87a + https://github.com/me-no-dev/ESPAsyncWebServer#05306e4 https://bitbucket.org/xoseperez/fauxmoesp.git#2.4.2 https://github.com/xoseperez/hlw8012.git#1.1.0 https://github.com/markszabo/IRremoteESP8266#v2.2.0 From 33780edc5b7fa2d76504ac792e8e46dc8db40de2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Sat, 2 Jun 2018 23:23:56 +0200 Subject: [PATCH 13/22] Better memory layout info, multi-sector memory layouts --- ...266.flash.1m0.ld => eagle.flash.1m0m1s.ld} | 8 +- code/eagle.flash.1m0m2s.ld | 19 + code/eagle.flash.4m1m4s.ld | 21 + code/eagle.flash.4m3m4e.ld | 20 + code/eagle.flash.512k0m1s.ld | 18 + code/espurna/eeprom.ino | 39 +- code/espurna/relay.ino | 1 + code/espurna/utils.ino | 50 +- code/platformio.ini | 678 +++++++++--------- 9 files changed, 494 insertions(+), 360 deletions(-) rename code/{esp8266.flash.1m0.ld => eagle.flash.1m0m1s.ld} (75%) create mode 100644 code/eagle.flash.1m0m2s.ld create mode 100644 code/eagle.flash.4m1m4s.ld create mode 100644 code/eagle.flash.4m3m4e.ld create mode 100644 code/eagle.flash.512k0m1s.ld diff --git a/code/esp8266.flash.1m0.ld b/code/eagle.flash.1m0m1s.ld similarity index 75% rename from code/esp8266.flash.1m0.ld rename to code/eagle.flash.1m0m1s.ld index dbb44e94..36477dc8 100644 --- a/code/esp8266.flash.1m0.ld +++ b/code/eagle.flash.1m0m1s.ld @@ -1,4 +1,4 @@ -/* Flash Split for 1M chips, no SPIFFS */ +/* Flash Split for 1M chips */ /* sketch 999KB */ /* eeprom 20KB */ @@ -12,7 +12,7 @@ MEMORY PROVIDE ( _SPIFFS_start = 0x402FB000 ); PROVIDE ( _SPIFFS_end = 0x402FB000 ); -PROVIDE ( _SPIFFS_page = 0 ); -PROVIDE ( _SPIFFS_block = 0 ); +PROVIDE ( _SPIFFS_page = 0x0 ); +PROVIDE ( _SPIFFS_block = 0x0 ); -INCLUDE "esp8266.flash.common.ld" +INCLUDE "../ld/eagle.app.v6.common.ld" diff --git a/code/eagle.flash.1m0m2s.ld b/code/eagle.flash.1m0m2s.ld new file mode 100644 index 00000000..bf07dccd --- /dev/null +++ b/code/eagle.flash.1m0m2s.ld @@ -0,0 +1,19 @@ +/* Flash Split for 1M chips, no SPIFFS */ +/* sketch 995KB */ +/* eeprom 8KB */ +/* reserved 16KB */ + +MEMORY +{ + dport0_0_seg : org = 0x3FF00000, len = 0x10 + dram0_0_seg : org = 0x3FFE8000, len = 0x14000 + iram1_0_seg : org = 0x40100000, len = 0x8000 + irom0_0_seg : org = 0x40201010, len = 0xf8ff0 +} + +PROVIDE ( _SPIFFS_start = 0x402FA000 ); +PROVIDE ( _SPIFFS_end = 0x402FA000 ); +PROVIDE ( _SPIFFS_page = 0 ); +PROVIDE ( _SPIFFS_block = 0 ); + +INCLUDE "../ld/eagle.app.v6.common.ld" diff --git a/code/eagle.flash.4m1m4s.ld b/code/eagle.flash.4m1m4s.ld new file mode 100644 index 00000000..696adcdc --- /dev/null +++ b/code/eagle.flash.4m1m4s.ld @@ -0,0 +1,21 @@ +/* Flash Split for 4M chips */ +/* sketch 1019KB */ +/* empty/ota? 2048KB */ +/* spiffs 992KB */ +/* eeprom 16KB */ +/* reserved 16KB */ + +MEMORY +{ + dport0_0_seg : org = 0x3FF00000, len = 0x10 + dram0_0_seg : org = 0x3FFE8000, len = 0x14000 + iram1_0_seg : org = 0x40100000, len = 0x8000 + irom0_0_seg : org = 0x40201010, len = 0xfeff0 +} + +PROVIDE ( _SPIFFS_start = 0x40500000 ); +PROVIDE ( _SPIFFS_end = 0x405F8000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x2000 ); + +INCLUDE "../ld/eagle.app.v6.common.ld" diff --git a/code/eagle.flash.4m3m4e.ld b/code/eagle.flash.4m3m4e.ld new file mode 100644 index 00000000..6470d827 --- /dev/null +++ b/code/eagle.flash.4m3m4e.ld @@ -0,0 +1,20 @@ +/* Flash Split for 4M chips */ +/* sketch 1019KB */ +/* spiffs 3040KB */ +/* eeprom 16KB */ +/* reserved 16KB */ + +MEMORY +{ + dport0_0_seg : org = 0x3FF00000, len = 0x10 + dram0_0_seg : org = 0x3FFE8000, len = 0x14000 + iram1_0_seg : org = 0x40100000, len = 0x8000 + irom0_0_seg : org = 0x40201010, len = 0xfeff0 +} + +PROVIDE ( _SPIFFS_start = 0x40300000 ); +PROVIDE ( _SPIFFS_end = 0x405F8000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x2000 ); + +INCLUDE "../ld/eagle.app.v6.common.ld" diff --git a/code/eagle.flash.512k0m1s.ld b/code/eagle.flash.512k0m1s.ld new file mode 100644 index 00000000..e28fc9f1 --- /dev/null +++ b/code/eagle.flash.512k0m1s.ld @@ -0,0 +1,18 @@ +/* Flash Split for 512K chips */ +/* sketch 487KB */ +/* eeprom 20KB */ + +MEMORY +{ + dport0_0_seg : org = 0x3FF00000, len = 0x10 + dram0_0_seg : org = 0x3FFE8000, len = 0x14000 + iram1_0_seg : org = 0x40100000, len = 0x8000 + irom0_0_seg : org = 0x40201010, len = 0x79ff0 +} + +PROVIDE ( _SPIFFS_start = 0x4027B000 ); +PROVIDE ( _SPIFFS_end = 0x4027B000 ); +PROVIDE ( _SPIFFS_page = 0x0 ); +PROVIDE ( _SPIFFS_block = 0x0 ); + +INCLUDE "../ld/eagle.app.v6.common.ld" diff --git a/code/espurna/eeprom.ino b/code/espurna/eeprom.ino index 3088f3fa..d2ad1c27 100644 --- a/code/espurna/eeprom.ino +++ b/code/espurna/eeprom.ino @@ -9,8 +9,12 @@ EEPROM MODULE // ----------------------------------------------------------------------------- bool eepromBackup() { - DEBUG_MSG_P(PSTR("[EEPROM] Backing up data to last sector\n")); - return EEPROMr.backup(); + // Backup data to last sector if we are using more sectors than the + // reserved by the memory layout + if (EEPROMr.pool() > EEPROMr.reserved()) { + DEBUG_MSG_P(PSTR("[EEPROM] Backing up data to last sector\n")); + return EEPROMr.backup(); + } } String eepromSectors() { @@ -31,6 +35,21 @@ void _eepromInitCommands() { DEBUG_MSG_P(PSTR("\n+OK\n")); }); + settingsRegisterCommand(F("FLASH.DUMP"), [](Embedis* e) { + if (e->argc < 2) { + DEBUG_MSG_P(PSTR("-ERROR: Wrong arguments\n")); + return; + } + uint32_t sector = String(e->argv[1]).toInt(); + uint32_t max = ESP.getFlashChipSize() / SPI_FLASH_SEC_SIZE; + if (sector >= max) { + DEBUG_MSG_P(PSTR("-ERROR: Sector out of range\n")); + return; + } + EEPROMr.dump(settingsSerial(), sector); + DEBUG_MSG_P(PSTR("\n+OK\n")); + }); + } #endif @@ -42,15 +61,15 @@ void eepromSetup() { #ifdef EEPROM_ROTATE_SECTORS EEPROMr.pool(EEPROM_ROTATE_SECTORS); #else - uint8_t sectors = 0; - if (EEPROMr.last() > 1000) { // 4Mb boards - sectors = 4; - } else if (EEPROMr.last() > 250) { // 1Mb boards - sectors = 2; - } else { - sectors = 1; + // If the memory layout has more than one sector reserved use those, + // otherwise calculate pool size based on memory size. + if (EEPROMr.pool() == 1) { + if (EEPROMr.last() > 1000) { // 4Mb boards + EEPROMr.pool(4); + } else if (EEPROMr.last() > 250) { // 1Mb boards + EEPROMr.pool(2); + } } - EEPROMr.pool(sectors); #endif EEPROMr.offset(EEPROM_ROTATE_DATA); diff --git a/code/espurna/relay.ino b/code/espurna/relay.ino index ca3062af..826015cd 100644 --- a/code/espurna/relay.ino +++ b/code/espurna/relay.ino @@ -798,6 +798,7 @@ void _relayInitCommands() { settingsRegisterCommand(F("RELAY"), [](Embedis* e) { if (e->argc < 2) { DEBUG_MSG_P(PSTR("-ERROR: Wrong arguments\n")); + return; } int id = String(e->argv[1]).toInt(); if (e->argc > 2) { diff --git a/code/espurna/utils.ino b/code/espurna/utils.ino index 1213ae7d..6679e1e2 100644 --- a/code/espurna/utils.ino +++ b/code/espurna/utils.ino @@ -211,10 +211,42 @@ void heartbeat() { #endif /// HEARTBEAT_ENABLED -unsigned int sectors(size_t size) { +// ----------------------------------------------------------------------------- +// INFO +// ----------------------------------------------------------------------------- + +extern "C" uint32_t _SPIFFS_start; +extern "C" uint32_t _SPIFFS_end; + +unsigned int info_bytes2sectors(size_t size) { return (int) (size + SPI_FLASH_SEC_SIZE - 1) / SPI_FLASH_SEC_SIZE; } +unsigned long info_ota_space() { + return (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; +} + +unsigned long info_filesystem_space() { + return ((uint32_t)&_SPIFFS_end - (uint32_t)&_SPIFFS_start); +} + +unsigned long info_eeprom_space() { + return EEPROMr.reserved() * SPI_FLASH_SEC_SIZE; +} + +void _info_print_memory_layout_line(const char * name, unsigned long bytes, bool reset) { + static unsigned long index = 0; + if (reset) index = 0; + if (0 == bytes) return; + unsigned int _sectors = info_bytes2sectors(bytes); + DEBUG_MSG_P(PSTR("[INIT] %-20s: %8lu bytes / %4d sectors (%4d to %4d)\n"), name, bytes, _sectors, index, index + _sectors - 1); + index += _sectors; +} + +void _info_print_memory_layout_line(const char * name, unsigned long bytes) { + _info_print_memory_layout_line(name, bytes, false); +} + void info() { DEBUG_MSG_P(PSTR("\n\n")); @@ -235,13 +267,15 @@ void info() { DEBUG_MSG_P(PSTR("[INIT] Flash speed: %u Hz\n"), ESP.getFlashChipSpeed()); DEBUG_MSG_P(PSTR("[INIT] Flash mode: %s\n"), mode == FM_QIO ? "QIO" : mode == FM_QOUT ? "QOUT" : mode == FM_DIO ? "DIO" : mode == FM_DOUT ? "DOUT" : "UNKNOWN"); DEBUG_MSG_P(PSTR("\n")); - DEBUG_MSG_P(PSTR("[INIT] Flash sector size: %8u bytes\n"), SPI_FLASH_SEC_SIZE); - DEBUG_MSG_P(PSTR("[INIT] Flash size (CHIP): %8u bytes\n"), ESP.getFlashChipRealSize()); - DEBUG_MSG_P(PSTR("[INIT] Flash size (SDK): %8u bytes / %4d sectors\n"), ESP.getFlashChipSize(), sectors(ESP.getFlashChipSize())); - DEBUG_MSG_P(PSTR("[INIT] Firmware size: %8u bytes / %4d sectors\n"), ESP.getSketchSize(), sectors(ESP.getSketchSize())); - DEBUG_MSG_P(PSTR("[INIT] Max OTA size: %8u bytes / %4d sectors\n"), maxSketchSpace(), sectors(maxSketchSpace())); - DEBUG_MSG_P(PSTR("[INIT] EEPROM size: %8u bytes / %4d sectors*\n"), EEPROMr.pool() * SPI_FLASH_SEC_SIZE, EEPROMr.pool()); - DEBUG_MSG_P(PSTR("[INIT] Reserved space: %8u bytes / 4 sectors\n"), 4 * SPI_FLASH_SEC_SIZE); + + _info_print_memory_layout_line("Flash size (CHIP)", ESP.getFlashChipRealSize(), true); + _info_print_memory_layout_line("Flash size (SDK)", ESP.getFlashChipSize(), true); + _info_print_memory_layout_line("Reserved", 1 * SPI_FLASH_SEC_SIZE, true); + _info_print_memory_layout_line("Firmware size", ESP.getSketchSize()); + _info_print_memory_layout_line("Max OTA size", info_ota_space()); + _info_print_memory_layout_line("SPIFFS size", info_filesystem_space()); + _info_print_memory_layout_line("EEPROM size", info_eeprom_space()); + _info_print_memory_layout_line("Reserved", 4 * SPI_FLASH_SEC_SIZE); DEBUG_MSG_P(PSTR("\n")); DEBUG_MSG_P(PSTR("[INIT] EEPROM sectors: %s\n"), (char *) eepromSectors().c_str()); diff --git a/code/platformio.ini b/code/platformio.ini index 55beecfe..b2a4b6de 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -36,8 +36,10 @@ debug_flags = -DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP # -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH v2 Higher Bandwidth # ------------------------------------------------------------------------------ build_flags = -g -DMQTT_MAX_PACKET_SIZE=400 -DNO_GLOBAL_EEPROM ${env.ESPURNA_FLAGS} -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH -build_flags_512k = ${common.build_flags} -Wl,-Tesp8266.flash.512k0.ld -build_flags_1m = ${common.build_flags} -Wl,-Tesp8266.flash.1m0.ld +build_flags_512k = ${common.build_flags} -Wl,-Teagle.flash.512k0m1s.ld +build_flags_1m = ${common.build_flags} -Wl,-Teagle.flash.1m0m1s.ld +build_flags_4m1m = ${common.build_flags} -Wl,-Teagle.flash.4m1m4s.ld +build_flags_4m3m = ${common.build_flags} -Wl,-Teagle.flash.4m3m4s.ld # ------------------------------------------------------------------------------ # GLOBALS: @@ -57,7 +59,7 @@ lib_deps = https://github.com/marvinroger/async-mqtt-client#v0.8.1 Brzo I2C https://bitbucket.org/xoseperez/debounceevent.git#2.0.1 - https://github.com/xoseperez/eeprom_rotate#0.1.0 + https://github.com/xoseperez/eeprom_rotate#0.1.1 Embedis https://github.com/plerup/espsoftwareserial#3.4.1 https://github.com/me-no-dev/ESPAsyncTCP#55cd520 @@ -86,22 +88,22 @@ extra_scripts = extra_scripts.py platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DESPURNA_CORE -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:espurna-core-4MB] platform = ${common.platform} framework = arduino board = d1_mini -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DESPURNA_CORE -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DESPURNA_CORE +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} # ------------------------------------------------------------------------------ @@ -112,7 +114,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -D${env.ESPURNA_BOARD} @@ -125,10 +127,10 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -D${env.ESPURNA_BOARD} +build_flags = ${common.build_flags_4m1m} -D${env.ESPURNA_BOARD} upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -143,8 +145,8 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DTRAVIS01 -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DTRAVIS01 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:travis02] @@ -153,8 +155,8 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DTRAVIS02 -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DTRAVIS02 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:travis03] @@ -163,8 +165,8 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DTRAVIS03 -DNOWSAUTH -DASYNC_TCP_SSL_ENABLED=1 -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DTRAVIS03 -DNOWSAUTH -DASYNC_TCP_SSL_ENABLED=1 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} # ------------------------------------------------------------------------------ @@ -177,9 +179,9 @@ framework = arduino board = d1_mini lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DWEMOS_D1_MINI_RELAYSHIELD -DDEBUG_FAUXMO=Serial -DNOWSAUTH +build_flags = ${common.build_flags_4m1m} -DWEMOS_D1_MINI_RELAYSHIELD -DDEBUG_FAUXMO=Serial -DNOWSAUTH upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wemos-d1mini-relayshield-ssl] @@ -188,9 +190,9 @@ framework = arduino board = d1_mini lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DWEMOS_D1_MINI_RELAYSHIELD -DDEBUG_FAUXMO=Serial -DNOWSAUTH -DASYNC_TCP_SSL_ENABLED=1 +build_flags = ${common.build_flags_4m1m} -DWEMOS_D1_MINI_RELAYSHIELD -DDEBUG_FAUXMO=Serial -DNOWSAUTH -DASYNC_TCP_SSL_ENABLED=1 upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wemos-d1mini-relayshield-ota] @@ -199,7 +201,7 @@ framework = arduino board = d1_mini lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DWEMOS_D1_MINI_RELAYSHIELD -DDEBUG_FAUXMO=Serial -DNOWSAUTH +build_flags = ${common.build_flags_4m1m} -DWEMOS_D1_MINI_RELAYSHIELD -DDEBUG_FAUXMO=Serial -DNOWSAUTH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -211,9 +213,9 @@ framework = arduino board = nodemcuv2 lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DNODEMCU_LOLIN -DDEBUG_FAUXMO=Serial -DNOWSAUTH +build_flags = ${common.build_flags_4m1m} -DNODEMCU_LOLIN -DDEBUG_FAUXMO=Serial -DNOWSAUTH upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:nodemcu-lolin-ssl] @@ -222,9 +224,9 @@ framework = arduino board = nodemcuv2 lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DNODEMCU_LOLIN -DDEBUG_FAUXMO=Serial -DNOWSAUTH -DASYNC_TCP_SSL_ENABLED=1 +build_flags = ${common.build_flags_4m1m} -DNODEMCU_LOLIN -DDEBUG_FAUXMO=Serial -DNOWSAUTH -DASYNC_TCP_SSL_ENABLED=1 upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:nodemcu-lolin-ota] @@ -233,11 +235,11 @@ framework = arduino board = nodemcuv2 lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DNODEMCU_LOLIN -DDEBUG_FAUXMO=Serial -DNOWSAUTH +build_flags = ${common.build_flags_4m1m} -DNODEMCU_LOLIN -DDEBUG_FAUXMO=Serial -DNOWSAUTH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} # ------------------------------------------------------------------------------ @@ -250,8 +252,8 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DTINKERMAN_ESPURNA_H06 -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DTINKERMAN_ESPURNA_H06 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:tinkerman-espurna-h06-ota] @@ -260,11 +262,11 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DTINKERMAN_ESPURNA_H06 +build_flags = ${common.build_flags_4m1m} -DTINKERMAN_ESPURNA_H06 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:tinkerman-espurna-h08] @@ -273,8 +275,8 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DTINKERMAN_ESPURNA_H08 -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DTINKERMAN_ESPURNA_H08 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:tinkerman-espurna-h08-ota] @@ -283,11 +285,11 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DTINKERMAN_ESPURNA_H08 +build_flags = ${common.build_flags_4m1m} -DTINKERMAN_ESPURNA_H08 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:tinkerman-espurna-switch] @@ -296,8 +298,8 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DTINKERMAN_ESPURNA_SWITCH -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DTINKERMAN_ESPURNA_SWITCH +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wemos-d1-tarpunashield] @@ -306,8 +308,8 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DWEMOS_D1_TARPUNA_SHIELD -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DWEMOS_D1_TARPUNA_SHIELD +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} # ------------------------------------------------------------------------------ @@ -316,168 +318,168 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-basic-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-basic-dht] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC -DDHT_SUPPORT=1 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-basic-dht-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC -DDHT_SUPPORT=1 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-basic-dallas] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC -DDALLAS_SUPPORT=1 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-rf] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RF -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-rf-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RF upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-th] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_TH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-th-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_TH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-pow] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_POW -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-pow-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_POW upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-pow-r2] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_POW_R2 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-pow-r2-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_POW_R2 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-dual] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_DUAL @@ -487,7 +489,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_DUAL @@ -500,7 +502,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_DUAL_R2 @@ -510,7 +512,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_DUAL_R2 @@ -523,250 +525,250 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_4CH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-4ch-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_4CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-4ch-pro] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_4CH_PRO -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-4ch-pro-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_4CH_PRO upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-touch] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_TOUCH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-touch-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_TOUCH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-b1] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_B1 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-b1-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_B1 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-t1-1ch] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_1CH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-t1-1ch-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_1CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-t1-2ch] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_2CH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-t1-2ch-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_2CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-t1-3ch] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_3CH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-t1-3ch-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_3CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-led] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_LED -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-led-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_LED upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-rfbridge] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RFBRIDGE -monitor_baud = 19200 +monitor_speed = 19200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-rfbridge-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RFBRIDGE upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 19200 +monitor_speed = 19200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-rfbridge-direct] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RFBRIDGE -DRFB_DIRECT -monitor_baud = 19200 +monitor_speed = 19200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-rfbridge-direct-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RFBRIDGE -DRFB_DIRECT upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 -monitor_baud = 19200 +monitor_speed = 19200 extra_scripts = ${common.extra_scripts} # ------------------------------------------------------------------------------ @@ -775,148 +777,148 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SLAMPHER -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-slampher-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SLAMPHER upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-s20] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_S20 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-s20-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_S20 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-1ch-inching] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_1CH_INCHING -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-1ch-inching-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_1CH_INCHING upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-motor] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_MOTOR -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-motor-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_MOTOR upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-sv] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_SV -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-sv-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_SV upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-s31] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_S31 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-s31-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_S31 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} # ------------------------------------------------------------------------------ @@ -927,8 +929,8 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DELECTRODRAGON_WIFI_IOT -DDHT_SUPPORT=1 -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DELECTRODRAGON_WIFI_IOT -DDHT_SUPPORT=1 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:electrodragon-wifi-iot-ota] @@ -937,36 +939,36 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DELECTRODRAGON_WIFI_IOT -DDHT_SUPPORT=1 +build_flags = ${common.build_flags_4m1m} -DELECTRODRAGON_WIFI_IOT -DDHT_SUPPORT=1 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:workchoice-ecoplug] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DWORKCHOICE_ECOPLUG -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:workchoice-ecoplug-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DWORKCHOICE_ECOPLUG upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:jangoe-wifi-relay-nc] @@ -975,8 +977,8 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DJANGOE_WIFI_RELAY_NC -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DJANGOE_WIFI_RELAY_NC +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:jangoe-wifi-relay-nc-ota] @@ -985,11 +987,11 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DJANGOE_WIFI_RELAY_NC +build_flags = ${common.build_flags_4m1m} -DJANGOE_WIFI_RELAY_NC upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:jangoe-wifi-relay-no] @@ -998,8 +1000,8 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DJANGOE_WIFI_RELAY_NO -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DJANGOE_WIFI_RELAY_NO +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:jangoe-wifi-relay-no-ota] @@ -1008,11 +1010,11 @@ framework = arduino board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DJANGOE_WIFI_RELAY_NO +build_flags = ${common.build_flags_4m1m} -DJANGOE_WIFI_RELAY_NO upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:openenergymonitor-mqtt-relay] @@ -1021,8 +1023,8 @@ framework = arduino board = esp_wroom_02 lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DOPENENERGYMONITOR_MQTT_RELAY -DDALLAS_SUPPORT=1 -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DOPENENERGYMONITOR_MQTT_RELAY -DDALLAS_SUPPORT=1 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:openenergymonitor-mqtt-relay-ota] @@ -1031,11 +1033,11 @@ framework = arduino board = esp_wroom_02 lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DOPENENERGYMONITOR_MQTT_RELAY -DDALLAS_SUPPORT=1 +build_flags = ${common.build_flags_4m1m} -DOPENENERGYMONITOR_MQTT_RELAY -DDALLAS_SUPPORT=1 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:jorgegarcia-wifi-relays] @@ -1045,7 +1047,7 @@ board = esp01_1m lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DJORGEGARCIA_WIFI_RELAYS -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:jorgegarcia-wifi-relays-ota] @@ -1058,331 +1060,331 @@ build_flags = ${common.build_flags_1m} -DJORGEGARCIA_WIFI_RELAYS upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:aithinker-ai-light] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DAITHINKER_AI_LIGHT -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:aithinker-ai-light-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DAITHINKER_AI_LIGHT upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:magichome-led-controller] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DMAGICHOME_LED_CONTROLLER -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:magichome-led-controller-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DMAGICHOME_LED_CONTROLLER upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:magichome-led-controller-20] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DMAGICHOME_LED_CONTROLLER_20 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:magichome-led-controller-20-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DMAGICHOME_LED_CONTROLLER_20 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:huacanxing-h801] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DHUACANXING_H801 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:huacanxing-h801-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DHUACANXING_H801 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:huacanxing-h802] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DHUACANXING_H802 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:huacanxing-h802-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DHUACANXING_H802 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc01] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC01 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc01-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC01 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc02] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC02 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc02-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC02 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc06] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC06 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc06-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC06 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc11] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC11 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc11-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC11 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-e27] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_E27 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-e27-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_E27 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-bnsz01] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_BNSZ01 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-bnsz01-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_BNSZ01 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wion-50055] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DWION_50055 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wion-50055-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DWION_50055 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:exs-wifi-relay-v31] platform = ${common.platform} framework = arduino board = esp07 -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DEXS_WIFI_RELAY_V31 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:exs-wifi-relay-v31-ota] platform = ${common.platform} framework = arduino board = esp07 -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DEXS_WIFI_RELAY_V31 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wemos-v9261f] @@ -1391,9 +1393,9 @@ framework = arduino board = d1_mini lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DGENERIC_V9261F +build_flags = ${common.build_flags_4m1m} -DGENERIC_V9261F upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wemos-v9261f-ota] @@ -1402,36 +1404,36 @@ framework = arduino board = d1_mini lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DGENERIC_V9261F +build_flags = ${common.build_flags_4m1m} -DGENERIC_V9261F upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:esp01-v9261f] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_V9261F -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:esp01-v9261f-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_V9261F upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wemos-ech1560] @@ -1440,9 +1442,9 @@ framework = arduino board = d1_mini lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DGENERIC_ECH1560 +build_flags = ${common.build_flags_4m1m} -DGENERIC_ECH1560 upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wemos-ech1560-ota] @@ -1451,36 +1453,36 @@ framework = arduino board = d1_mini lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DGENERIC_ECH1560 +build_flags = ${common.build_flags_4m1m} -DGENERIC_ECH1560 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:esp01-ech1560] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ECH1560 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:esp01-ech1560-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ECH1560 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:mancavemade-esplive] @@ -1489,9 +1491,9 @@ framework = arduino board = d1_mini lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DMANCAVEMADE_ESPLIVE +build_flags = ${common.build_flags_4m1m} -DMANCAVEMADE_ESPLIVE upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:mancavemade-esplive-ota] @@ -1500,136 +1502,136 @@ framework = arduino board = d1_mini lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DMANCAVEMADE_ESPLIVE +build_flags = ${common.build_flags_4m1m} -DMANCAVEMADE_ESPLIVE upload_speed = 460800 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:intermittech-quinled] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DINTERMITTECH_QUINLED -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:intermittech-quinled-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DINTERMITTECH_QUINLED upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:xenon-sm-pw702u] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DXENON_SM_PW702U -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:xenon-sm-pw702u-ota] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DXENON_SM_PW702U upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:authometion-lyt8266] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DAUTHOMETION_LYT8266 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:authometion-lyt8266-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DAUTHOMETION_LYT8266 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:kmc-70011] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DKMC_70011 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:kmc-70011-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DKMC_70011 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:yjzk-switch-2ch] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DYJZK_SWITCH_2CH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:yjzk-switch-2ch-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DYJZK_SWITCH_2CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:generic-8ch] @@ -1638,30 +1640,30 @@ framework = arduino board = d1_mini lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DGENERIC_8CH +build_flags = ${common.build_flags_4m1m} -DGENERIC_8CH upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:gizwits-witty-cloud] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DGIZWITS_WITTY_CLOUD -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DGIZWITS_WITTY_CLOUD +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:gizwits-witty-cloud-ota] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DGIZWITS_WITTY_CLOUD +build_flags = ${common.build_flags_4m1m} -DGIZWITS_WITTY_CLOUD upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -1671,21 +1673,21 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DEUROMATE_WIFI_STECKER_SCHUKO -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DEUROMATE_WIFI_STECKER_SCHUKO +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:euromate-wifi-stecker-shuko-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DEUROMATE_WIFI_STECKER_SCHUKO +build_flags = ${common.build_flags_4m1m} -DEUROMATE_WIFI_STECKER_SCHUKO upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -1695,21 +1697,21 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DTONBUX_POWERSTRIP02 -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DTONBUX_POWERSTRIP02 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:tonbux-powerstrip02-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DTONBUX_POWERSTRIP02 +build_flags = ${common.build_flags_4m1m} -DTONBUX_POWERSTRIP02 upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -1719,21 +1721,21 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DLINGAN_SWA1 -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DLINGAN_SWA1 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:lingan-swa1-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DLINGAN_SWA1 +build_flags = ${common.build_flags_4m1m} -DLINGAN_SWA1 upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -1743,43 +1745,43 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DSTM_RELAY -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:stm-relay-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DSTM_RELAY upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:heygo-hy02] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DHEYGO_HY02 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:heygo-hy02-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DHEYGO_HY02 @@ -1792,18 +1794,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DMAXCIO_WUS002S -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:maxcio-wus002s-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DMAXCIO_WUS002S @@ -1816,18 +1818,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DYIDIAN_XSSSA05 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:yidian-xsssa05-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DYIDIAN_XSSSA05 @@ -1840,18 +1842,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DTONBUX_XSSSA06 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:tonbux-xsssa06-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DTONBUX_XSSSA06 @@ -1864,21 +1866,21 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DGREEN_ESP8266RELAY -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DGREEN_ESP8266RELAY +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:green-esp8266relay-ota] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DGREEN_ESP8266RELAY +build_flags = ${common.build_flags_4m1m} -DGREEN_ESP8266RELAY upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -1888,21 +1890,21 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DIKE_ESPIKE -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DIKE_ESPIKE +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:ike-espike-ota] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DIKE_ESPIKE +build_flags = ${common.build_flags_4m1m} -DIKE_ESPIKE upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -1912,18 +1914,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DARNIEX_SWIFITCH extra_scripts = ${common.extra_scripts} -monitor_baud = 115200 +monitor_speed = 115200 [env:arniex-swifitch-ota] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DARNIEX_SWIFITCH @@ -1936,71 +1938,71 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DZHILDE_EU44_W -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:zhilde-eu44-w-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DZHILDE_EU44_W upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:luani-hvio] platform = ${common.platform} framework = arduino board = esp07 -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DLUANI_HVIO -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:luani-hvio-ota] platform = ${common.platform} framework = arduino board = esp07 -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DZLUANI_HVIO upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:neo-coolcam-power-plug-wifi] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DNEO_COOLCAM_POWER_PLUG_WIFI -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DNEO_COOLCAM_POWER_PLUG_WIFI +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:neo-coolcam-power-plug-wifi-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DNEO_COOLCAM_POWER_PLUG_WIFI +build_flags = ${common.build_flags_4m1m} -DNEO_COOLCAM_POWER_PLUG_WIFI upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -2010,21 +2012,21 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DESTINK_WIFI_POWER_STRIP -monitor_baud = 115200 +build_flags = ${common.build_flags_4m1m} -DESTINK_WIFI_POWER_STRIP +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:estink-wifi-power-strip-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags} -DESTINK_WIFI_POWER_STRIP +build_flags = ${common.build_flags_4m1m} -DESTINK_WIFI_POWER_STRIP upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -2038,18 +2040,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_RELAY_V40 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:generic-esp01s-relay-40-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_RELAY_V40 @@ -2062,18 +2064,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_RGBLED_V10 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:generic-esp01s-rgbled-10-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_RGBLED_V10 @@ -2086,18 +2088,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_DHT11_V10 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:generic-esp01s-dht11-10-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_DHT11_V10 @@ -2110,18 +2112,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_DS18B20_V10 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:generic-esp01s-ds18b20-10-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_DS18B20_V10 @@ -2134,18 +2136,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DHELTEC_TOUCHRELAY -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:heltec-touch-relay-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DHELTEC_TOUCHRELAY @@ -2158,18 +2160,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DALLNET_4DUINO_IOT_WLAN_RELAIS -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:allnet-4duino-iot-wlan-relais-ota] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DALLNET_4DUINO_IOT_WLAN_RELAIS @@ -2182,18 +2184,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DTONBUX_MOSQUITO_KILLER -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:tonbux-mosquito-killer-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DTONBUX_MOSQUITO_KILLER From 87d961b1869284b6eb4d6aa4b09def7e0b531aa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Sun, 3 Jun 2018 23:10:02 +0200 Subject: [PATCH 14/22] Update to latest version of EEPROM_Rotate --- code/espurna/eeprom.ino | 12 +-- code/platformio.ini | 226 ++++++++++++++++++++-------------------- 2 files changed, 119 insertions(+), 119 deletions(-) diff --git a/code/espurna/eeprom.ino b/code/espurna/eeprom.ino index d2ad1c27..237009dd 100644 --- a/code/espurna/eeprom.ino +++ b/code/espurna/eeprom.ino @@ -11,7 +11,7 @@ EEPROM MODULE bool eepromBackup() { // Backup data to last sector if we are using more sectors than the // reserved by the memory layout - if (EEPROMr.pool() > EEPROMr.reserved()) { + if (EEPROMr.size() > EEPROMr.reserved()) { DEBUG_MSG_P(PSTR("[EEPROM] Backing up data to last sector\n")); return EEPROMr.backup(); } @@ -19,7 +19,7 @@ bool eepromBackup() { String eepromSectors() { String response; - for (uint32_t i = 0; i < EEPROMr.pool(); i++) { + for (uint32_t i = 0; i < EEPROMr.size(); i++) { if (i > 0) response = response + String(", "); response = response + String(EEPROMr.base() - i); } @@ -59,15 +59,15 @@ void _eepromInitCommands() { void eepromSetup() { #ifdef EEPROM_ROTATE_SECTORS - EEPROMr.pool(EEPROM_ROTATE_SECTORS); + EEPROMr.size(EEPROM_ROTATE_SECTORS); #else // If the memory layout has more than one sector reserved use those, // otherwise calculate pool size based on memory size. - if (EEPROMr.pool() == 1) { + if (EEPROMr.size() == 1) { if (EEPROMr.last() > 1000) { // 4Mb boards - EEPROMr.pool(4); + EEPROMr.size(4); } else if (EEPROMr.last() > 250) { // 1Mb boards - EEPROMr.pool(2); + EEPROMr.size(2); } } #endif diff --git a/code/platformio.ini b/code/platformio.ini index b2a4b6de..49601c99 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -37,7 +37,7 @@ debug_flags = -DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP # ------------------------------------------------------------------------------ build_flags = -g -DMQTT_MAX_PACKET_SIZE=400 -DNO_GLOBAL_EEPROM ${env.ESPURNA_FLAGS} -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH build_flags_512k = ${common.build_flags} -Wl,-Teagle.flash.512k0m1s.ld -build_flags_1m = ${common.build_flags} -Wl,-Teagle.flash.1m0m1s.ld +build_flags_1m0m = ${common.build_flags} -Wl,-Teagle.flash.1m0m1s.ld build_flags_4m1m = ${common.build_flags} -Wl,-Teagle.flash.4m1m4s.ld build_flags_4m3m = ${common.build_flags} -Wl,-Teagle.flash.4m3m4s.ld @@ -59,7 +59,7 @@ lib_deps = https://github.com/marvinroger/async-mqtt-client#v0.8.1 Brzo I2C https://bitbucket.org/xoseperez/debounceevent.git#2.0.1 - https://github.com/xoseperez/eeprom_rotate#0.1.1 + https://github.com/xoseperez/eeprom_rotate Embedis https://github.com/plerup/espsoftwareserial#3.4.1 https://github.com/me-no-dev/ESPAsyncTCP#55cd520 @@ -91,7 +91,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DESPURNA_CORE +build_flags = ${common.build_flags_1m0m} -DESPURNA_CORE monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -117,7 +117,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -D${env.ESPURNA_BOARD} +build_flags = ${common.build_flags_1m0m} -D${env.ESPURNA_BOARD} upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -321,7 +321,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_BASIC monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -332,7 +332,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_BASIC upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -346,7 +346,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC -DDHT_SUPPORT=1 +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_BASIC -DDHT_SUPPORT=1 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -357,7 +357,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC -DDHT_SUPPORT=1 +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_BASIC -DDHT_SUPPORT=1 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -371,7 +371,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC -DDALLAS_SUPPORT=1 +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_BASIC -DDALLAS_SUPPORT=1 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -382,7 +382,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RF +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_RF monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -393,7 +393,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RF +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_RF upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -407,7 +407,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_TH +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_TH monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -418,7 +418,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_TH +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_TH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -432,7 +432,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_POW +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_POW monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -443,7 +443,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_POW +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_POW upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -457,7 +457,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_POW_R2 +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_POW_R2 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -468,7 +468,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_POW_R2 +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_POW_R2 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -482,7 +482,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_DUAL +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_DUAL extra_scripts = ${common.extra_scripts} [env:itead-sonoff-dual-ota] @@ -492,7 +492,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_DUAL +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_DUAL upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -505,7 +505,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_DUAL_R2 +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_DUAL_R2 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-dual-ota-r2] @@ -515,7 +515,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_DUAL_R2 +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_DUAL_R2 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -528,7 +528,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_4CH +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_4CH monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -539,7 +539,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_4CH +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_4CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -553,7 +553,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_4CH_PRO +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_4CH_PRO monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -564,7 +564,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_4CH_PRO +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_4CH_PRO upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -578,7 +578,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_TOUCH +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_TOUCH monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -589,7 +589,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_TOUCH +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_TOUCH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -603,7 +603,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_B1 +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_B1 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -614,7 +614,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_B1 +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_B1 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -628,7 +628,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_1CH +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_T1_1CH monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -639,7 +639,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_1CH +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_T1_1CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -653,7 +653,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_2CH +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_T1_2CH monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -664,7 +664,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_2CH +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_T1_2CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -678,7 +678,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_3CH +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_T1_3CH monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -689,7 +689,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_3CH +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_T1_3CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -703,7 +703,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_LED +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_LED monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -714,7 +714,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_LED +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_LED upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -728,7 +728,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RFBRIDGE +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_RFBRIDGE monitor_speed = 19200 extra_scripts = ${common.extra_scripts} @@ -739,7 +739,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RFBRIDGE +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_RFBRIDGE upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -753,7 +753,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RFBRIDGE -DRFB_DIRECT +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_RFBRIDGE -DRFB_DIRECT monitor_speed = 19200 extra_scripts = ${common.extra_scripts} @@ -764,7 +764,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RFBRIDGE -DRFB_DIRECT +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_RFBRIDGE -DRFB_DIRECT upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -780,7 +780,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SLAMPHER +build_flags = ${common.build_flags_1m0m} -DITEAD_SLAMPHER monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -791,7 +791,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SLAMPHER +build_flags = ${common.build_flags_1m0m} -DITEAD_SLAMPHER upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -805,7 +805,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_S20 +build_flags = ${common.build_flags_1m0m} -DITEAD_S20 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -816,7 +816,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_S20 +build_flags = ${common.build_flags_1m0m} -DITEAD_S20 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -830,7 +830,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_1CH_INCHING +build_flags = ${common.build_flags_1m0m} -DITEAD_1CH_INCHING monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -841,7 +841,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_1CH_INCHING +build_flags = ${common.build_flags_1m0m} -DITEAD_1CH_INCHING upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -855,7 +855,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_MOTOR +build_flags = ${common.build_flags_1m0m} -DITEAD_MOTOR monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -866,7 +866,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_MOTOR +build_flags = ${common.build_flags_1m0m} -DITEAD_MOTOR upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -880,7 +880,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_SV +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_SV monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -891,7 +891,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_SV +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_SV upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} monitor_speed = 115200 @@ -904,7 +904,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_S31 +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_S31 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -915,7 +915,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_S31 +build_flags = ${common.build_flags_1m0m} -DITEAD_SONOFF_S31 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 monitor_speed = 115200 @@ -953,7 +953,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DWORKCHOICE_ECOPLUG +build_flags = ${common.build_flags_1m0m} -DWORKCHOICE_ECOPLUG monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -964,7 +964,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DWORKCHOICE_ECOPLUG +build_flags = ${common.build_flags_1m0m} -DWORKCHOICE_ECOPLUG upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1046,7 +1046,7 @@ framework = arduino board = esp01_1m lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DJORGEGARCIA_WIFI_RELAYS +build_flags = ${common.build_flags_1m0m} -DJORGEGARCIA_WIFI_RELAYS monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1056,7 +1056,7 @@ framework = arduino board = esp01_1m lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DJORGEGARCIA_WIFI_RELAYS +build_flags = ${common.build_flags_1m0m} -DJORGEGARCIA_WIFI_RELAYS upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1070,7 +1070,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DAITHINKER_AI_LIGHT +build_flags = ${common.build_flags_1m0m} -DAITHINKER_AI_LIGHT monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1081,7 +1081,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DAITHINKER_AI_LIGHT +build_flags = ${common.build_flags_1m0m} -DAITHINKER_AI_LIGHT upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1095,7 +1095,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DMAGICHOME_LED_CONTROLLER +build_flags = ${common.build_flags_1m0m} -DMAGICHOME_LED_CONTROLLER monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1106,7 +1106,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DMAGICHOME_LED_CONTROLLER +build_flags = ${common.build_flags_1m0m} -DMAGICHOME_LED_CONTROLLER upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1120,7 +1120,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DMAGICHOME_LED_CONTROLLER_20 +build_flags = ${common.build_flags_1m0m} -DMAGICHOME_LED_CONTROLLER_20 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1131,7 +1131,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DMAGICHOME_LED_CONTROLLER_20 +build_flags = ${common.build_flags_1m0m} -DMAGICHOME_LED_CONTROLLER_20 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} monitor_speed = 115200 @@ -1319,7 +1319,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_BNSZ01 +build_flags = ${common.build_flags_1m0m} -DITEAD_BNSZ01 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1330,7 +1330,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DITEAD_BNSZ01 +build_flags = ${common.build_flags_1m0m} -DITEAD_BNSZ01 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1344,7 +1344,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DWION_50055 +build_flags = ${common.build_flags_1m0m} -DWION_50055 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1355,7 +1355,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DWION_50055 +build_flags = ${common.build_flags_1m0m} -DWION_50055 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1369,7 +1369,7 @@ board = esp07 board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DEXS_WIFI_RELAY_V31 +build_flags = ${common.build_flags_1m0m} -DEXS_WIFI_RELAY_V31 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1380,7 +1380,7 @@ board = esp07 board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DEXS_WIFI_RELAY_V31 +build_flags = ${common.build_flags_1m0m} -DEXS_WIFI_RELAY_V31 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1418,7 +1418,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DGENERIC_V9261F +build_flags = ${common.build_flags_1m0m} -DGENERIC_V9261F monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1429,7 +1429,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DGENERIC_V9261F +build_flags = ${common.build_flags_1m0m} -DGENERIC_V9261F upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1467,7 +1467,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DGENERIC_ECH1560 +build_flags = ${common.build_flags_1m0m} -DGENERIC_ECH1560 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1478,7 +1478,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DGENERIC_ECH1560 +build_flags = ${common.build_flags_1m0m} -DGENERIC_ECH1560 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1516,7 +1516,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DINTERMITTECH_QUINLED +build_flags = ${common.build_flags_1m0m} -DINTERMITTECH_QUINLED monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1527,7 +1527,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DINTERMITTECH_QUINLED +build_flags = ${common.build_flags_1m0m} -DINTERMITTECH_QUINLED upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1541,7 +1541,7 @@ board = esp12e board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DXENON_SM_PW702U +build_flags = ${common.build_flags_1m0m} -DXENON_SM_PW702U monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1552,7 +1552,7 @@ board = esp12e board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DXENON_SM_PW702U +build_flags = ${common.build_flags_1m0m} -DXENON_SM_PW702U upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1566,7 +1566,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DAUTHOMETION_LYT8266 +build_flags = ${common.build_flags_1m0m} -DAUTHOMETION_LYT8266 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1577,7 +1577,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DAUTHOMETION_LYT8266 +build_flags = ${common.build_flags_1m0m} -DAUTHOMETION_LYT8266 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1591,7 +1591,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DKMC_70011 +build_flags = ${common.build_flags_1m0m} -DKMC_70011 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1602,7 +1602,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DKMC_70011 +build_flags = ${common.build_flags_1m0m} -DKMC_70011 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1616,7 +1616,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DYJZK_SWITCH_2CH +build_flags = ${common.build_flags_1m0m} -DYJZK_SWITCH_2CH monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1627,7 +1627,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DYJZK_SWITCH_2CH +build_flags = ${common.build_flags_1m0m} -DYJZK_SWITCH_2CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1748,7 +1748,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DSTM_RELAY +build_flags = ${common.build_flags_1m0m} -DSTM_RELAY monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1759,7 +1759,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DSTM_RELAY +build_flags = ${common.build_flags_1m0m} -DSTM_RELAY upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} @@ -1773,7 +1773,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DHEYGO_HY02 +build_flags = ${common.build_flags_1m0m} -DHEYGO_HY02 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1784,7 +1784,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DHEYGO_HY02 +build_flags = ${common.build_flags_1m0m} -DHEYGO_HY02 upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -1797,7 +1797,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DMAXCIO_WUS002S +build_flags = ${common.build_flags_1m0m} -DMAXCIO_WUS002S monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1808,7 +1808,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DMAXCIO_WUS002S +build_flags = ${common.build_flags_1m0m} -DMAXCIO_WUS002S upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -1821,7 +1821,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DYIDIAN_XSSSA05 +build_flags = ${common.build_flags_1m0m} -DYIDIAN_XSSSA05 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1832,7 +1832,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DYIDIAN_XSSSA05 +build_flags = ${common.build_flags_1m0m} -DYIDIAN_XSSSA05 upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -1845,7 +1845,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DTONBUX_XSSSA06 +build_flags = ${common.build_flags_1m0m} -DTONBUX_XSSSA06 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1856,7 +1856,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DTONBUX_XSSSA06 +build_flags = ${common.build_flags_1m0m} -DTONBUX_XSSSA06 upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -1917,7 +1917,7 @@ board = esp12e board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DARNIEX_SWIFITCH +build_flags = ${common.build_flags_1m0m} -DARNIEX_SWIFITCH extra_scripts = ${common.extra_scripts} monitor_speed = 115200 @@ -1928,7 +1928,7 @@ board = esp12e board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DARNIEX_SWIFITCH +build_flags = ${common.build_flags_1m0m} -DARNIEX_SWIFITCH upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -1941,7 +1941,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DZHILDE_EU44_W +build_flags = ${common.build_flags_1m0m} -DZHILDE_EU44_W monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1952,7 +1952,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DZHILDE_EU44_W +build_flags = ${common.build_flags_1m0m} -DZHILDE_EU44_W upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -1966,7 +1966,7 @@ board = esp07 board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DLUANI_HVIO +build_flags = ${common.build_flags_1m0m} -DLUANI_HVIO monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -1977,7 +1977,7 @@ board = esp07 board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DZLUANI_HVIO +build_flags = ${common.build_flags_1m0m} -DZLUANI_HVIO upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -2043,7 +2043,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_RELAY_V40 +build_flags = ${common.build_flags_1m0m} -DGENERIC_ESP01S_RELAY_V40 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -2054,7 +2054,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_RELAY_V40 +build_flags = ${common.build_flags_1m0m} -DGENERIC_ESP01S_RELAY_V40 upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -2067,7 +2067,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_RGBLED_V10 +build_flags = ${common.build_flags_1m0m} -DGENERIC_ESP01S_RGBLED_V10 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -2078,7 +2078,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_RGBLED_V10 +build_flags = ${common.build_flags_1m0m} -DGENERIC_ESP01S_RGBLED_V10 upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -2091,7 +2091,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_DHT11_V10 +build_flags = ${common.build_flags_1m0m} -DGENERIC_ESP01S_DHT11_V10 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -2102,7 +2102,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_DHT11_V10 +build_flags = ${common.build_flags_1m0m} -DGENERIC_ESP01S_DHT11_V10 upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -2115,7 +2115,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_DS18B20_V10 +build_flags = ${common.build_flags_1m0m} -DGENERIC_ESP01S_DS18B20_V10 monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -2126,7 +2126,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_DS18B20_V10 +build_flags = ${common.build_flags_1m0m} -DGENERIC_ESP01S_DS18B20_V10 upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -2139,7 +2139,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DHELTEC_TOUCHRELAY +build_flags = ${common.build_flags_1m0m} -DHELTEC_TOUCHRELAY monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -2150,7 +2150,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DHELTEC_TOUCHRELAY +build_flags = ${common.build_flags_1m0m} -DHELTEC_TOUCHRELAY upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -2163,7 +2163,7 @@ board = esp12e board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DALLNET_4DUINO_IOT_WLAN_RELAIS +build_flags = ${common.build_flags_1m0m} -DALLNET_4DUINO_IOT_WLAN_RELAIS monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -2174,7 +2174,7 @@ board = esp12e board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DALLNET_4DUINO_IOT_WLAN_RELAIS +build_flags = ${common.build_flags_1m0m} -DALLNET_4DUINO_IOT_WLAN_RELAIS upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 @@ -2187,7 +2187,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DTONBUX_MOSQUITO_KILLER +build_flags = ${common.build_flags_1m0m} -DTONBUX_MOSQUITO_KILLER monitor_speed = 115200 extra_scripts = ${common.extra_scripts} @@ -2198,7 +2198,7 @@ board = esp01_1m board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} -build_flags = ${common.build_flags_1m} -DTONBUX_MOSQUITO_KILLER +build_flags = ${common.build_flags_1m0m} -DTONBUX_MOSQUITO_KILLER upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 From ce952cffb3c08787b00d44913860e475218e103f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Tue, 5 Jun 2018 01:19:06 +0200 Subject: [PATCH 15/22] Update enableScan entry point --- code/espurna/wifi.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/espurna/wifi.ino b/code/espurna/wifi.ino index cb34ca38..37f55464 100644 --- a/code/espurna/wifi.ino +++ b/code/espurna/wifi.ino @@ -73,7 +73,7 @@ void _wifiConfigure() { } } - jw.scanNetworks(getSetting("wifiScan", WIFI_SCAN_NETWORKS).toInt() == 1); + jw.enableScan(getSetting("wifiScan", WIFI_SCAN_NETWORKS).toInt() == 1); } From b4a05f92693c7a408d2943b13268269a762f3947 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Mon, 11 Jun 2018 21:23:16 +0200 Subject: [PATCH 16/22] Fix build when WEB_SUPPORT==0 (#923) --- code/espurna/homeassistant.ino | 8 ++++++-- code/espurna/settings.ino | 12 +++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/code/espurna/homeassistant.ino b/code/espurna/homeassistant.ino index 070fc1ea..5d3b59e0 100644 --- a/code/espurna/homeassistant.ino +++ b/code/espurna/homeassistant.ino @@ -255,13 +255,17 @@ void _haInitCommands() { settingsRegisterCommand(F("HA.SEND"), [](Embedis* e) { setSetting("haEnabled", "1"); _haConfigure(); - wsSend(_haWebSocketOnSend); + #if WEB_SUPPORT + wsSend(_haWebSocketOnSend); + #endif DEBUG_MSG_P(PSTR("+OK\n")); }); settingsRegisterCommand(F("HA.CLEAR"), [](Embedis* e) { setSetting("haEnabled", "0"); _haConfigure(); - wsSend(_haWebSocketOnSend); + #if WEB_SUPPORT + wsSend(_haWebSocketOnSend); + #endif DEBUG_MSG_P(PSTR("+OK\n")); }); } diff --git a/code/espurna/settings.ino b/code/espurna/settings.ino index 9d5767b3..64886b30 100644 --- a/code/espurna/settings.ino +++ b/code/espurna/settings.ino @@ -269,11 +269,13 @@ void _settingsInitCommands() { DEBUG_MSG_P(PSTR("+OK\n")); }); - settingsRegisterCommand(F("RELOAD"), [](Embedis* e) { - wsReload(); - DEBUG_MSG_P(PSTR("+OK\n")); - }); - + #if WEB_SUPPORT + settingsRegisterCommand(F("RELOAD"), [](Embedis* e) { + wsReload(); + DEBUG_MSG_P(PSTR("+OK\n")); + }); + #endif + settingsRegisterCommand(F("RESET"), [](Embedis* e) { DEBUG_MSG_P(PSTR("+OK\n")); deferredReset(100, CUSTOM_RESET_TERMINAL); From f1c2aa1b819fc159de530cf9194dc067c478be22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Mon, 11 Jun 2018 21:23:57 +0200 Subject: [PATCH 17/22] Update platformio.ini file to use Core 3.5.3, supress warnings --- code/platformio.ini | 582 ++++++++++++++++++++++---------------------- 1 file changed, 291 insertions(+), 291 deletions(-) diff --git a/code/platformio.ini b/code/platformio.ini index c2dffd53..b34f7b28 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -35,7 +35,7 @@ debug_flags = -DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP # -DPIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY v2 Lower Memory # -DPIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH v2 Higher Bandwidth # ------------------------------------------------------------------------------ -build_flags = -g -DMQTT_MAX_PACKET_SIZE=400 ${env.ESPURNA_FLAGS} -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH +build_flags = -g -w -DMQTT_MAX_PACKET_SIZE=400 ${env.ESPURNA_FLAGS} -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH build_flags_512k = ${common.build_flags} -Wl,-Tesp8266.flash.512k0.ld build_flags_1m = ${common.build_flags} -Wl,-Tesp8266.flash.1m0.ld @@ -85,22 +85,22 @@ extra_scripts = extra_scripts.py platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DESPURNA_CORE -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:espurna-core-4MB] platform = ${common.platform} framework = arduino board = d1_mini -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DESPURNA_CORE -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} # ------------------------------------------------------------------------------ @@ -111,7 +111,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -D${env.ESPURNA_BOARD} @@ -124,7 +124,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -D${env.ESPURNA_BOARD} @@ -143,7 +143,7 @@ board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DTRAVIS01 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:travis02] @@ -153,7 +153,7 @@ board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DTRAVIS02 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:travis03] @@ -163,7 +163,7 @@ board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DTRAVIS03 -DNOWSAUTH -DASYNC_TCP_SSL_ENABLED=1 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} # ------------------------------------------------------------------------------ @@ -178,7 +178,7 @@ lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DWEMOS_D1_MINI_RELAYSHIELD -DDEBUG_FAUXMO=Serial -DNOWSAUTH upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wemos-d1mini-relayshield-ssl] @@ -189,7 +189,7 @@ lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DWEMOS_D1_MINI_RELAYSHIELD -DDEBUG_FAUXMO=Serial -DNOWSAUTH -DASYNC_TCP_SSL_ENABLED=1 upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wemos-d1mini-relayshield-ota] @@ -212,7 +212,7 @@ lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DNODEMCU_LOLIN -DDEBUG_FAUXMO=Serial -DNOWSAUTH upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:nodemcu-lolin-ssl] @@ -223,7 +223,7 @@ lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DNODEMCU_LOLIN -DDEBUG_FAUXMO=Serial -DNOWSAUTH -DASYNC_TCP_SSL_ENABLED=1 upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:nodemcu-lolin-ota] @@ -236,7 +236,7 @@ build_flags = ${common.build_flags} -DNODEMCU_LOLIN -DDEBUG_FAUXMO=Serial -DNOWS upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} # ------------------------------------------------------------------------------ @@ -250,7 +250,7 @@ board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DTINKERMAN_ESPURNA_H06 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:tinkerman-espurna-h06-ota] @@ -263,7 +263,7 @@ build_flags = ${common.build_flags} -DTINKERMAN_ESPURNA_H06 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:tinkerman-espurna-h08] @@ -273,7 +273,7 @@ board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DTINKERMAN_ESPURNA_H08 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:tinkerman-espurna-h08-ota] @@ -286,7 +286,7 @@ build_flags = ${common.build_flags} -DTINKERMAN_ESPURNA_H08 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:tinkerman-espurna-switch] @@ -296,7 +296,7 @@ board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DTINKERMAN_ESPURNA_SWITCH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wemos-d1-tarpunashield] @@ -306,7 +306,7 @@ board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DWEMOS_D1_TARPUNA_SHIELD -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} # ------------------------------------------------------------------------------ @@ -315,168 +315,168 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-basic-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-basic-dht] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC -DDHT_SUPPORT=1 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-basic-dht-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC -DDHT_SUPPORT=1 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-basic-dallas] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_BASIC -DDALLAS_SUPPORT=1 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-rf] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RF -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-rf-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RF upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-th] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_TH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-th-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_TH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-pow] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_POW -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-pow-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_POW upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-pow-r2] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_POW_R2 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-pow-r2-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_POW_R2 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-dual] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_DUAL @@ -486,7 +486,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_DUAL @@ -499,7 +499,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_DUAL_R2 @@ -509,7 +509,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_DUAL_R2 @@ -522,250 +522,250 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_4CH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-4ch-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_4CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-4ch-pro] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_4CH_PRO -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-4ch-pro-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_4CH_PRO upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-touch] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_TOUCH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-touch-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_TOUCH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-b1] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_B1 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-b1-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_B1 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-t1-1ch] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_1CH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-t1-1ch-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_1CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-t1-2ch] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_2CH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-t1-2ch-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_2CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-t1-3ch] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_3CH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-t1-3ch-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_T1_3CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-led] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_LED -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-led-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_LED upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-rfbridge] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RFBRIDGE -monitor_baud = 19200 +monitor_speed = 19200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-rfbridge-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RFBRIDGE upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 19200 +monitor_speed = 19200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-rfbridge-direct] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RFBRIDGE -DRFB_DIRECT -monitor_baud = 19200 +monitor_speed = 19200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-rfbridge-direct-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_RFBRIDGE -DRFB_DIRECT upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 -monitor_baud = 19200 +monitor_speed = 19200 extra_scripts = ${common.extra_scripts} # ------------------------------------------------------------------------------ @@ -774,148 +774,148 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SLAMPHER -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-slampher-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SLAMPHER upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-s20] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_S20 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-s20-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_S20 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-1ch-inching] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_1CH_INCHING -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-1ch-inching-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_1CH_INCHING upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-motor] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_MOTOR -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-motor-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_MOTOR upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-sv] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_SV -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-sv-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_SV upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-s31] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_S31 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-sonoff-s31-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_SONOFF_S31 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} # ------------------------------------------------------------------------------ @@ -927,7 +927,7 @@ board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DELECTRODRAGON_WIFI_IOT -DDHT_SUPPORT=1 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:electrodragon-wifi-iot-ota] @@ -940,32 +940,32 @@ build_flags = ${common.build_flags} -DELECTRODRAGON_WIFI_IOT -DDHT_SUPPORT=1 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:workchoice-ecoplug] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DWORKCHOICE_ECOPLUG -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:workchoice-ecoplug-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DWORKCHOICE_ECOPLUG upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:jangoe-wifi-relay-nc] @@ -975,7 +975,7 @@ board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DJANGOE_WIFI_RELAY_NC -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:jangoe-wifi-relay-nc-ota] @@ -988,7 +988,7 @@ build_flags = ${common.build_flags} -DJANGOE_WIFI_RELAY_NC upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:jangoe-wifi-relay-no] @@ -998,7 +998,7 @@ board = esp12e lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DJANGOE_WIFI_RELAY_NO -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:jangoe-wifi-relay-no-ota] @@ -1011,7 +1011,7 @@ build_flags = ${common.build_flags} -DJANGOE_WIFI_RELAY_NO upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:openenergymonitor-mqtt-relay] @@ -1021,7 +1021,7 @@ board = esp_wroom_02 lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DOPENENERGYMONITOR_MQTT_RELAY -DDALLAS_SUPPORT=1 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:openenergymonitor-mqtt-relay-ota] @@ -1034,7 +1034,7 @@ build_flags = ${common.build_flags} -DOPENENERGYMONITOR_MQTT_RELAY -DDALLAS_SUPP upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:jorgegarcia-wifi-relays] @@ -1044,7 +1044,7 @@ board = esp01_1m lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DJORGEGARCIA_WIFI_RELAYS -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:jorgegarcia-wifi-relays-ota] @@ -1057,331 +1057,331 @@ build_flags = ${common.build_flags_1m} -DJORGEGARCIA_WIFI_RELAYS upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:aithinker-ai-light] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DAITHINKER_AI_LIGHT -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:aithinker-ai-light-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DAITHINKER_AI_LIGHT upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:magichome-led-controller] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DMAGICHOME_LED_CONTROLLER -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:magichome-led-controller-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DMAGICHOME_LED_CONTROLLER upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:magichome-led-controller-20] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DMAGICHOME_LED_CONTROLLER_20 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:magichome-led-controller-20-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DMAGICHOME_LED_CONTROLLER_20 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:huacanxing-h801] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DHUACANXING_H801 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:huacanxing-h801-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DHUACANXING_H801 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:huacanxing-h802] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DHUACANXING_H802 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:huacanxing-h802-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DHUACANXING_H802 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc01] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC01 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc01-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC01 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc02] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC02 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc02-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC02 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc06] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC06 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc06-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC06 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc11] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC11 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-al-lc11-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_AL_LC11 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-e27] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_E27 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:arilux-e27-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = -g -Wl,-Tesp8266.flash.1m0.ld -DARILUX_E27 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-bnsz01] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_BNSZ01 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:itead-bnsz01-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DITEAD_BNSZ01 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wion-50055] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DWION_50055 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wion-50055-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DWION_50055 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:exs-wifi-relay-v31] platform = ${common.platform} framework = arduino board = esp07 -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DEXS_WIFI_RELAY_V31 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:exs-wifi-relay-v31-ota] platform = ${common.platform} framework = arduino board = esp07 -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DEXS_WIFI_RELAY_V31 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wemos-v9261f] @@ -1392,7 +1392,7 @@ lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DGENERIC_V9261F upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wemos-v9261f-ota] @@ -1405,32 +1405,32 @@ build_flags = ${common.build_flags} -DGENERIC_V9261F upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:esp01-v9261f] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_V9261F -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:esp01-v9261f-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_V9261F upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wemos-ech1560] @@ -1441,7 +1441,7 @@ lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DGENERIC_ECH1560 upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:wemos-ech1560-ota] @@ -1454,32 +1454,32 @@ build_flags = ${common.build_flags} -DGENERIC_ECH1560 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:esp01-ech1560] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ECH1560 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:esp01-ech1560-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ECH1560 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:mancavemade-esplive] @@ -1490,7 +1490,7 @@ lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DMANCAVEMADE_ESPLIVE upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:mancavemade-esplive-ota] @@ -1503,132 +1503,132 @@ build_flags = ${common.build_flags} -DMANCAVEMADE_ESPLIVE upload_speed = 460800 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:intermittech-quinled] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DINTERMITTECH_QUINLED -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:intermittech-quinled-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DINTERMITTECH_QUINLED upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:xenon-sm-pw702u] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DXENON_SM_PW702U -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:xenon-sm-pw702u-ota] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DXENON_SM_PW702U upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:authometion-lyt8266] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DAUTHOMETION_LYT8266 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:authometion-lyt8266-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DAUTHOMETION_LYT8266 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:kmc-70011] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DKMC_70011 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:kmc-70011-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DKMC_70011 upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:yjzk-switch-2ch] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DYJZK_SWITCH_2CH -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:yjzk-switch-2ch-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DYJZK_SWITCH_2CH upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:generic-8ch] @@ -1639,25 +1639,25 @@ lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DGENERIC_8CH upload_speed = 460800 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:gizwits-witty-cloud] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DGIZWITS_WITTY_CLOUD -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:gizwits-witty-cloud-ota] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DGIZWITS_WITTY_CLOUD @@ -1670,18 +1670,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DEUROMATE_WIFI_STECKER_SCHUKO -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:euromate-wifi-stecker-shuko-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DEUROMATE_WIFI_STECKER_SCHUKO @@ -1694,18 +1694,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DTONBUX_POWERSTRIP02 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:tonbux-powerstrip02-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DTONBUX_POWERSTRIP02 @@ -1718,18 +1718,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DLINGAN_SWA1 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:lingan-swa1-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DLINGAN_SWA1 @@ -1742,43 +1742,43 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DSTM_RELAY -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:stm-relay-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DSTM_RELAY upload_speed = 115200 upload_port = ${common.upload_port} upload_flags = ${common.upload_flags} -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:heygo-hy02] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DHEYGO_HY02 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:heygo-hy02-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DHEYGO_HY02 @@ -1791,18 +1791,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DMAXCIO_WUS002S -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:maxcio-wus002s-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DMAXCIO_WUS002S @@ -1815,18 +1815,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DYIDIAN_XSSSA05 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:yidian-xsssa05-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DYIDIAN_XSSSA05 @@ -1839,18 +1839,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DTONBUX_XSSSA06 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:tonbux-xsssa06-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DTONBUX_XSSSA06 @@ -1863,18 +1863,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DGREEN_ESP8266RELAY -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:green-esp8266relay-ota] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DGREEN_ESP8266RELAY @@ -1887,18 +1887,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DIKE_ESPIKE -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:ike-espike-ota] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DIKE_ESPIKE @@ -1911,18 +1911,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DARNIEX_SWIFITCH extra_scripts = ${common.extra_scripts} -monitor_baud = 115200 +monitor_speed = 115200 [env:arniex-swifitch-ota] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DARNIEX_SWIFITCH @@ -1935,68 +1935,68 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DZHILDE_EU44_W -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:zhilde-eu44-w-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DZHILDE_EU44_W upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:luani-hvio] platform = ${common.platform} framework = arduino board = esp07 -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DLUANI_HVIO -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:luani-hvio-ota] platform = ${common.platform} framework = arduino board = esp07 -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DZLUANI_HVIO upload_speed = 115200 upload_port = "${env.ESPURNA_IP}" upload_flags = --auth=${env.ESPURNA_AUTH} --port 8266 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:neo-coolcam-power-plug-wifi] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DNEO_COOLCAM_POWER_PLUG_WIFI -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:neo-coolcam-power-plug-wifi-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DNEO_COOLCAM_POWER_PLUG_WIFI @@ -2009,18 +2009,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DESTINK_WIFI_POWER_STRIP -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:estink-wifi-power-strip-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags} -DESTINK_WIFI_POWER_STRIP @@ -2037,18 +2037,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_RELAY_V40 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:generic-esp01s-relay-40-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_RELAY_V40 @@ -2061,18 +2061,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_RGBLED_V10 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:generic-esp01s-rgbled-10-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_RGBLED_V10 @@ -2085,18 +2085,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_DHT11_V10 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:generic-esp01s-dht11-10-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_DHT11_V10 @@ -2109,18 +2109,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_DS18B20_V10 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:generic-esp01s-ds18b20-10-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DGENERIC_ESP01S_DS18B20_V10 @@ -2133,18 +2133,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DHELTEC_TOUCHRELAY -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:heltec-touch-relay-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DHELTEC_TOUCHRELAY @@ -2157,18 +2157,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DALLNET_4DUINO_IOT_WLAN_RELAIS -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:allnet-4duino-iot-wlan-relais-ota] platform = ${common.platform} framework = arduino board = esp12e -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DALLNET_4DUINO_IOT_WLAN_RELAIS @@ -2181,18 +2181,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DTONBUX_MOSQUITO_KILLER -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:tonbux-mosquito-killer-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DTONBUX_MOSQUITO_KILLER @@ -2205,18 +2205,18 @@ extra_scripts = ${common.extra_scripts} platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DPILOTAK_ESP_DIN_V1 -monitor_baud = 115200 +monitor_speed = 115200 extra_scripts = ${common.extra_scripts} [env:pilotak-esp-din-v1-ota] platform = ${common.platform} framework = arduino board = esp01_1m -board_flash_mode = dout +board_build.flash_mode = dout lib_deps = ${common.lib_deps} lib_ignore = ${common.lib_ignore} build_flags = ${common.build_flags_1m} -DPILOTAK_ESP_DIN_V1 From 296adcc41643327f6b8faa842f0924fcdcc899c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Mon, 11 Jun 2018 21:53:23 +0200 Subject: [PATCH 18/22] Freeze EEPROM_Rotate library to 0.9.0 --- code/platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/platformio.ini b/code/platformio.ini index f718c7bb..9f1af9c0 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -59,7 +59,7 @@ lib_deps = https://github.com/marvinroger/async-mqtt-client#v0.8.1 Brzo I2C https://bitbucket.org/xoseperez/debounceevent.git#2.0.1 - https://github.com/xoseperez/eeprom_rotate + https://github.com/xoseperez/eeprom_rotate#0.9.0 Embedis https://github.com/plerup/espsoftwareserial#3.4.1 https://github.com/me-no-dev/ESPAsyncTCP#55cd520 From ffe40ab3dbf8064713fcbc89880170165eccba8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Mon, 11 Jun 2018 22:46:56 +0200 Subject: [PATCH 19/22] Freeze JustWifi library to 2.0.0 --- code/platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/platformio.ini b/code/platformio.ini index 944dc719..6128b918 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -64,7 +64,7 @@ lib_deps = https://bitbucket.org/xoseperez/fauxmoesp.git#2.4.2 https://github.com/xoseperez/hlw8012.git#1.1.0 https://github.com/markszabo/IRremoteESP8266#v2.2.0 - https://github.com/xoseperez/justwifi.git#v2 + https://github.com/xoseperez/justwifi.git#2.0.0 https://github.com/madpilot/mDNSResolver#4cfcda1 https://github.com/xoseperez/my92xx#3.0.1 https://bitbucket.org/xoseperez/nofuss.git#0.2.5 From 9288f411f97da2b9d4a8b246bf577e07be59bde0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Mon, 11 Jun 2018 23:57:37 +0200 Subject: [PATCH 20/22] Do not write to EEPROM (rotating) after OTA to prevent image corruption --- README.md | 2 +- code/espurna/ota.ino | 20 ++++++++++++++++++-- code/espurna/web.ino | 10 +++++++++- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b5d79f23..34df84ac 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ESPurna ("spark" in Catalan) is a custom firmware for ESP8285/ESP8266 based smart switches, lights and sensors. It uses the Arduino Core for ESP8266 framework and a number of 3rd party libraries. -[![version](https://img.shields.io/badge/version-1.12.7a-brightgreen.svg)](CHANGELOG.md) +[![version](https://img.shields.io/badge/version-1.13.0b-brightgreen.svg)](CHANGELOG.md) [![branch](https://img.shields.io/badge/branch-dev-orange.svg)](https://github.org/xoseperez/espurna/tree/dev/) [![travis](https://travis-ci.org/xoseperez/espurna.svg?branch=dev)](https://travis-ci.org/xoseperez/espurna) [![codacy](https://img.shields.io/codacy/grade/c9496e25cf07434cba786b462cb15f49/dev.svg)](https://www.codacy.com/app/xoseperez/espurna/dashboard) diff --git a/code/espurna/ota.ino b/code/espurna/ota.ino index 172becd5..23559aaf 100644 --- a/code/espurna/ota.ino +++ b/code/espurna/ota.ino @@ -65,7 +65,8 @@ void _otaFrom(const char * host, unsigned int port, const char * url) { if (Update.end(true)){ DEBUG_MSG_P(PSTR("[OTA] Success: %u bytes\n"), _ota_size); - deferredReset(100, CUSTOM_RESET_OTA); + nice_delay(100); + ESP.restart(); } else { #ifdef DEBUG_PORT Update.printError(DEBUG_PORT); @@ -133,6 +134,13 @@ void _otaFrom(const char * host, unsigned int port, const char * url) { } #endif + // Cache current reset reason + resetReason(); + + // Set reset reason beforehand, + // to prevent writing to EEPROM after the upgrade + resetReason(CUSTOM_RESET_OTA); + // Backup EEPROM data to last sector eepromBackup(); @@ -217,6 +225,13 @@ void otaSetup() { ArduinoOTA.onStart([]() { + // Cache current reset reason + resetReason(); + + // Set reset reason beforehand, + // to prevent writing to EEPROM after the upgrade + resetReason(CUSTOM_RESET_OTA); + // Backup EEPROM data to last sector eepromBackup(); @@ -234,7 +249,8 @@ void otaSetup() { #if WEB_SUPPORT wsSend_P(PSTR("{\"action\": \"reload\"}")); #endif - deferredReset(100, CUSTOM_RESET_OTA); + nice_delay(100); + ESP.restart(); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { diff --git a/code/espurna/web.ino b/code/espurna/web.ino index 301bd792..09255f54 100644 --- a/code/espurna/web.ino +++ b/code/espurna/web.ino @@ -224,7 +224,8 @@ void _onUpgrade(AsyncWebServerRequest *request) { AsyncWebServerResponse *response = request->beginResponse(200, "text/plain", buffer); response->addHeader("Connection", "close"); if (!Update.hasError()) { - deferredReset(100, CUSTOM_RESET_UPGRADE); + nice_delay(100); + ESP.restart(); } request->send(response); @@ -234,6 +235,13 @@ void _onUpgradeData(AsyncWebServerRequest *request, String filename, size_t inde if (!index) { + // Cache current reset reason + resetReason(); + + // Set reset reason beforehand, + // to prevent writing to EEPROM after the upgrade + resetReason(CUSTOM_RESET_UPGRADE); + // Backup EEPROM data to last sector eepromBackup(); From 914488f3c0c23143aa30c0728a32a630b7fbc023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Mon, 11 Jun 2018 23:57:52 +0200 Subject: [PATCH 21/22] Version 1.13.0b --- code/espurna/config/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/espurna/config/version.h b/code/espurna/config/version.h index 13b490d2..ed599180 100644 --- a/code/espurna/config/version.h +++ b/code/espurna/config/version.h @@ -1,5 +1,5 @@ #define APP_NAME "ESPURNA" -#define APP_VERSION "1.12.7a" +#define APP_VERSION "1.13.0b" #define APP_REVISION "db84006" #define APP_AUTHOR "xose.perez@gmail.com" #define APP_WEBSITE "http://tinkerman.cat" From 0ef74d0dc04787f7c614d6558a38bc7f2755ff43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xose=20P=C3=A9rez?= Date: Tue, 12 Jun 2018 13:06:55 +0200 Subject: [PATCH 22/22] Update EEPROM_Rotate to 0.9.1 and use rotate(false) before OTA --- README.md | 2 +- code/espurna/config/version.h | 2 +- code/espurna/eeprom.ino | 12 ++++++++---- code/espurna/ota.ino | 30 ++++++++---------------------- code/espurna/web.ino | 18 ++++++------------ code/platformio.ini | 2 +- 6 files changed, 25 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 34df84ac..f2526e8b 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ESPurna ("spark" in Catalan) is a custom firmware for ESP8285/ESP8266 based smart switches, lights and sensors. It uses the Arduino Core for ESP8266 framework and a number of 3rd party libraries. -[![version](https://img.shields.io/badge/version-1.13.0b-brightgreen.svg)](CHANGELOG.md) +[![version](https://img.shields.io/badge/version-1.13.0c-brightgreen.svg)](CHANGELOG.md) [![branch](https://img.shields.io/badge/branch-dev-orange.svg)](https://github.org/xoseperez/espurna/tree/dev/) [![travis](https://travis-ci.org/xoseperez/espurna.svg?branch=dev)](https://travis-ci.org/xoseperez/espurna) [![codacy](https://img.shields.io/codacy/grade/c9496e25cf07434cba786b462cb15f49/dev.svg)](https://www.codacy.com/app/xoseperez/espurna/dashboard) diff --git a/code/espurna/config/version.h b/code/espurna/config/version.h index ed599180..6f2333e7 100644 --- a/code/espurna/config/version.h +++ b/code/espurna/config/version.h @@ -1,5 +1,5 @@ #define APP_NAME "ESPURNA" -#define APP_VERSION "1.13.0b" +#define APP_VERSION "1.13.0c" #define APP_REVISION "db84006" #define APP_AUTHOR "xose.perez@gmail.com" #define APP_WEBSITE "http://tinkerman.cat" diff --git a/code/espurna/eeprom.ino b/code/espurna/eeprom.ino index 237009dd..2e79fcbb 100644 --- a/code/espurna/eeprom.ino +++ b/code/espurna/eeprom.ino @@ -8,12 +8,16 @@ EEPROM MODULE // ----------------------------------------------------------------------------- -bool eepromBackup() { - // Backup data to last sector if we are using more sectors than the +bool eepromRotate(bool value) { + // Enable/disable EEPROM rotation only if we are using more sectors than the // reserved by the memory layout if (EEPROMr.size() > EEPROMr.reserved()) { - DEBUG_MSG_P(PSTR("[EEPROM] Backing up data to last sector\n")); - return EEPROMr.backup(); + if (value) { + DEBUG_MSG_P(PSTR("[EEPROM] Reenabling EEPROM rotation\n")); + } else { + DEBUG_MSG_P(PSTR("[EEPROM] Disabling EEPROM rotation\n")); + } + EEPROMr.rotate(value); } } diff --git a/code/espurna/ota.ino b/code/espurna/ota.ino index 23559aaf..4443431a 100644 --- a/code/espurna/ota.ino +++ b/code/espurna/ota.ino @@ -65,12 +65,12 @@ void _otaFrom(const char * host, unsigned int port, const char * url) { if (Update.end(true)){ DEBUG_MSG_P(PSTR("[OTA] Success: %u bytes\n"), _ota_size); - nice_delay(100); - ESP.restart(); + deferredReset(100, CUSTOM_RESET_OTA); } else { #ifdef DEBUG_PORT Update.printError(DEBUG_PORT); #endif + eepromRotate(true); } DEBUG_MSG_P(PSTR("[OTA] Disconnected\n")); @@ -134,15 +134,8 @@ void _otaFrom(const char * host, unsigned int port, const char * url) { } #endif - // Cache current reset reason - resetReason(); - - // Set reset reason beforehand, - // to prevent writing to EEPROM after the upgrade - resetReason(CUSTOM_RESET_OTA); - - // Backup EEPROM data to last sector - eepromBackup(); + // Disabling EEPROM rotation to prevent writing to EEPROM after the upgrade + eepromRotate(false); DEBUG_MSG_P(PSTR("[OTA] Downloading %s\n"), _ota_url); char buffer[strlen_P(OTA_REQUEST_TEMPLATE) + strlen(_ota_url) + strlen(_ota_host)]; @@ -225,15 +218,8 @@ void otaSetup() { ArduinoOTA.onStart([]() { - // Cache current reset reason - resetReason(); - - // Set reset reason beforehand, - // to prevent writing to EEPROM after the upgrade - resetReason(CUSTOM_RESET_OTA); - - // Backup EEPROM data to last sector - eepromBackup(); + // Disabling EEPROM rotation to prevent writing to EEPROM after the upgrade + eepromRotate(false); DEBUG_MSG_P(PSTR("[OTA] Start\n")); @@ -249,8 +235,7 @@ void otaSetup() { #if WEB_SUPPORT wsSend_P(PSTR("{\"action\": \"reload\"}")); #endif - nice_delay(100); - ESP.restart(); + deferredReset(100, CUSTOM_RESET_OTA); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { @@ -266,6 +251,7 @@ void otaSetup() { else if (error == OTA_RECEIVE_ERROR) DEBUG_MSG_P(PSTR("Receive Failed\n")); else if (error == OTA_END_ERROR) DEBUG_MSG_P(PSTR("End Failed\n")); #endif + eepromRotate(true); }); ArduinoOTA.begin(); diff --git a/code/espurna/web.ino b/code/espurna/web.ino index 09255f54..3e8447fb 100644 --- a/code/espurna/web.ino +++ b/code/espurna/web.ino @@ -223,9 +223,10 @@ void _onUpgrade(AsyncWebServerRequest *request) { AsyncWebServerResponse *response = request->beginResponse(200, "text/plain", buffer); response->addHeader("Connection", "close"); - if (!Update.hasError()) { - nice_delay(100); - ESP.restart(); + if (Update.hasError()) { + eepromRotate(true); + } else { + deferredReset(100, CUSTOM_RESET_UPGRADE); } request->send(response); @@ -235,15 +236,8 @@ void _onUpgradeData(AsyncWebServerRequest *request, String filename, size_t inde if (!index) { - // Cache current reset reason - resetReason(); - - // Set reset reason beforehand, - // to prevent writing to EEPROM after the upgrade - resetReason(CUSTOM_RESET_UPGRADE); - - // Backup EEPROM data to last sector - eepromBackup(); + // Disabling EEPROM rotation to prevent writing to EEPROM after the upgrade + eepromRotate(false); DEBUG_MSG_P(PSTR("[UPGRADE] Start: %s\n"), filename.c_str()); Update.runAsync(true); diff --git a/code/platformio.ini b/code/platformio.ini index 22342eed..d0e38f68 100644 --- a/code/platformio.ini +++ b/code/platformio.ini @@ -59,7 +59,7 @@ lib_deps = https://github.com/marvinroger/async-mqtt-client#v0.8.1 Brzo I2C https://bitbucket.org/xoseperez/debounceevent.git#2.0.1 - https://github.com/xoseperez/eeprom_rotate#0.9.0 + https://github.com/xoseperez/eeprom_rotate#0.9.1 Embedis https://github.com/plerup/espsoftwareserial#3.4.1 https://github.com/me-no-dev/ESPAsyncTCP#55cd520