Merge remote-tracking branch 'origin/main' into mdev

This commit is contained in:
Ewoud
2022-11-08 18:12:43 +01:00
20 changed files with 7753 additions and 4661 deletions

2949
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "wled", "name": "wled",
"version": "0.14.0.1.1_MM", "version": "0.14.0.2.0_MM",
"description": "Tools for WLED project", "description": "Tools for WLED project",
"main": "tools/cdata.js", "main": "tools/cdata.js",
"directories": { "directories": {

View File

@@ -41,15 +41,16 @@
; MoonModules entries ; MoonModules entries
; =================== ; ===================
; default_envs = esp32_4MB_min, esp32_4MB_max, esp32_16MB_max, esp8266_4MB_min, esp32_4MB_PSRAM_max, esp32S3_8MB_max, wemos_shield_esp32_4MB_max, wemos_shield_esp32_16MB_max ; default_envs = esp32_4MB_min, esp32_4MB_max, esp32_16MB_max, esp8266_4MB_min, esp32_4MB_PSRAM_max, esp32S3_8MB_max, wemos_shield_esp32_4MB_max, wemos_shield_esp32_16MB_max, esp32_pico_4MB_max
; default_envs = esp32_4MB_min ; default_envs = esp32_4MB_min
default_envs = esp32_4MB_max ; recommended default_envs = esp32_4MB_max ; recommended default
; default_envs = esp32_16MB_max ; default_envs = esp32_16MB_max
; default_envs = esp8266_4MB_min ; default_envs = esp8266_4MB_min
; default_envs = esp32_4MB_PSRAM_max ; default_envs = esp32_4MB_PSRAM_max
; default_envs = esp32S3_8MB_max ; default_envs = esp32S3_8MB_max
; default_envs = wemos_shield_esp32_4MB_max ; default_envs = wemos_shield_esp32_4MB_max
; default_envs = wemos_shield_esp32_16MB_max ; default_envs = wemos_shield_esp32_16MB_max
; default_envs = esp32_pico_4MB_max
src_dir = ./wled00 src_dir = ./wled00

View File

@@ -65,7 +65,7 @@ class Animated_Staircase : public Usermod {
// The maximum number of configured segments. // The maximum number of configured segments.
// Dynamically updated based on user configuration. // Dynamically updated based on user configuration.
byte maxSegmentId = 1; byte maxSegmentId = 1;
byte mainSegmentId = 0; byte minSegmentId = 0;
// These values are used by the API to read the // These values are used by the API to read the
// last sensor state, or trigger a sensor // last sensor state, or trigger a sensor
@@ -91,8 +91,7 @@ class Animated_Staircase : public Usermod {
static const char _topEchoCm[]; static const char _topEchoCm[];
static const char _bottomEchoCm[]; static const char _bottomEchoCm[];
void publishMqtt(bool bottom, const char* state) void publishMqtt(bool bottom, const char* state) {
{
//Check if MQTT Connected, otherwise it will crash the 8266 //Check if MQTT Connected, otherwise it will crash the 8266
if (WLED_MQTT_CONNECTED){ if (WLED_MQTT_CONNECTED){
char subuf[64]; char subuf[64];
@@ -102,16 +101,11 @@ class Animated_Staircase : public Usermod {
} }
void updateSegments() { void updateSegments() {
mainSegmentId = strip.getMainSegmentId(); for (int i = minSegmentId; i < maxSegmentId; i++) {
for (int i = 0; i < strip.getSegmentsNum(); i++) {
Segment &seg = strip.getSegment(i); Segment &seg = strip.getSegment(i);
if (!seg.isActive()) { if (!seg.isActive()) continue; // skip gaps
maxSegmentId = i - 1;
break;
}
if (i >= onIndex && i < offIndex) { if (i >= onIndex && i < offIndex) {
seg.setOption(SEG_OPTION_ON, true); seg.setOption(SEG_OPTION_ON, true);
// We may need to copy mode and colors from segment 0 to make sure // We may need to copy mode and colors from segment 0 to make sure
// changes are propagated even when the config is changed during a wipe // changes are propagated even when the config is changed during a wipe
// seg.setMode(mainsegment.mode); // seg.setMode(mainsegment.mode);
@@ -120,8 +114,10 @@ class Animated_Staircase : public Usermod {
seg.setOption(SEG_OPTION_ON, false); seg.setOption(SEG_OPTION_ON, false);
} }
// Always mark segments as "transitional", we are animating the staircase // Always mark segments as "transitional", we are animating the staircase
seg.setOption(SEG_OPTION_TRANSITIONAL, true); //seg.setOption(SEG_OPTION_TRANSITIONAL, true); // not needed anymore as setOption() does it
} }
strip.trigger(); // force strip refresh
stateChanged = true; // inform external devices/UI of change
colorUpdated(CALL_MODE_DIRECT_CHANGE); colorUpdated(CALL_MODE_DIRECT_CHANGE);
} }
@@ -207,9 +203,9 @@ class Animated_Staircase : public Usermod {
if (onIndex == offIndex) { if (onIndex == offIndex) {
// Position the indices for a correct on-swipe // Position the indices for a correct on-swipe
if (swipe == SWIPE_UP) { if (swipe == SWIPE_UP) {
onIndex = mainSegmentId; onIndex = minSegmentId;
} else { } else {
onIndex = maxSegmentId+1; onIndex = maxSegmentId;
} }
offIndex = onIndex; offIndex = onIndex;
} }
@@ -221,7 +217,7 @@ class Animated_Staircase : public Usermod {
} }
void autoPowerOff() { void autoPowerOff() {
if (on && ((millis() - lastSwitchTime) > on_time_ms)) { if ((millis() - lastSwitchTime) > on_time_ms) {
// if sensors are still on, do nothing // if sensors are still on, do nothing
if (bottomSensorState || topSensorState) return; if (bottomSensorState || topSensorState) return;
@@ -238,10 +234,12 @@ class Animated_Staircase : public Usermod {
if ((millis() - lastTime) > segment_delay_ms) { if ((millis() - lastTime) > segment_delay_ms) {
lastTime = millis(); lastTime = millis();
byte oldOn = onIndex;
byte oldOff = offIndex;
if (on) { if (on) {
// Turn on all segments // Turn on all segments
onIndex = MAX(mainSegmentId, onIndex - 1); onIndex = MAX(minSegmentId, onIndex - 1);
offIndex = MIN(maxSegmentId + 1, offIndex + 1); offIndex = MIN(maxSegmentId, offIndex + 1);
} else { } else {
if (swipe == SWIPE_UP) { if (swipe == SWIPE_UP) {
onIndex = MIN(offIndex, onIndex + 1); onIndex = MIN(offIndex, onIndex + 1);
@@ -249,7 +247,7 @@ class Animated_Staircase : public Usermod {
offIndex = MAX(onIndex, offIndex - 1); offIndex = MAX(onIndex, offIndex - 1);
} }
} }
updateSegments(); if (oldOn != onIndex || oldOff != offIndex) updateSegments(); // reduce the number of updates to necessary ones
} }
} }
@@ -287,16 +285,22 @@ class Animated_Staircase : public Usermod {
pinMode(topPIRorTriggerPin, OUTPUT); pinMode(topPIRorTriggerPin, OUTPUT);
pinMode(topEchoPin, INPUT); pinMode(topEchoPin, INPUT);
} }
onIndex = minSegmentId = strip.getMainSegmentId(); // it may not be the best idea to start with main segment as it may not be the first one
offIndex = maxSegmentId = strip.getLastActiveSegmentId() + 1;
// shorten the strip transition time to be equal or shorter than segment delay
transitionDelayTemp = transitionDelay = segment_delay_ms;
strip.setTransition(segment_delay_ms/100);
strip.trigger();
} else { } else {
// Restore segment options // Restore segment options
for (int i = 0; i < strip.getSegmentsNum(); i++) { for (int i = 0; i <= strip.getLastActiveSegmentId(); i++) {
Segment &seg = strip.getSegment(i); Segment &seg = strip.getSegment(i);
if (!seg.isActive()) { if (!seg.isActive()) continue; // skip vector gaps
maxSegmentId = i - 1;
break;
}
seg.setOption(SEG_OPTION_ON, true); seg.setOption(SEG_OPTION_ON, true);
} }
strip.trigger(); // force strip update
stateChanged = true; // inform external dvices/UI of change
colorUpdated(CALL_MODE_DIRECT_CHANGE); colorUpdated(CALL_MODE_DIRECT_CHANGE);
DEBUG_PRINTLN(F("Animated Staircase disabled.")); DEBUG_PRINTLN(F("Animated Staircase disabled."));
} }
@@ -332,8 +336,10 @@ class Animated_Staircase : public Usermod {
void loop() { void loop() {
if (!enabled || strip.isUpdating()) return; if (!enabled || strip.isUpdating()) return;
minSegmentId = strip.getMainSegmentId(); // it may not be the best idea to start with main segment as it may not be the first one
maxSegmentId = strip.getLastActiveSegmentId() + 1;
checkSensors(); checkSensors();
autoPowerOff(); if (on) autoPowerOff();
updateSwipe(); updateSwipe();
} }
@@ -392,14 +398,16 @@ class Animated_Staircase : public Usermod {
*/ */
void readFromJsonState(JsonObject& root) { void readFromJsonState(JsonObject& root) {
if (!initDone) return; // prevent crash on boot applyPreset() if (!initDone) return; // prevent crash on boot applyPreset()
bool en = enabled;
JsonObject staircase = root[FPSTR(_name)]; JsonObject staircase = root[FPSTR(_name)];
if (!staircase.isNull()) { if (!staircase.isNull()) {
if (staircase[FPSTR(_enabled)].is<bool>()) { if (staircase[FPSTR(_enabled)].is<bool>()) {
enabled = staircase[FPSTR(_enabled)].as<bool>(); en = staircase[FPSTR(_enabled)].as<bool>();
} else { } else {
String str = staircase[FPSTR(_enabled)]; // checkbox -> off or on String str = staircase[FPSTR(_enabled)]; // checkbox -> off or on
enabled = (bool)(str!="off"); // off is guaranteed to be present en = (bool)(str!="off"); // off is guaranteed to be present
} }
if (en != enabled) enable(en);
readSensorsFromJson(staircase); readSensorsFromJson(staircase);
DEBUG_PRINTLN(F("Staircase sensor state read from API.")); DEBUG_PRINTLN(F("Staircase sensor state read from API."));
} }

View File

@@ -23,44 +23,7 @@ You can also use usermod's off timer instead of sensor's. In such case rotate th
## Usermod installation ## Usermod installation
1. Copy the file `usermod_PIR_sensor_switch.h` to the `wled00` directory. **NOTE:** Usermod has been included in master branch of WLED so it can be compiled in directly just by defining `-D USERMOD_PIRSWITCH` and optionaly `-D PIR_SENSOR_PIN=16` to override default pin. You can also change the default off tim by adding `-D PIR_SENSOR_OFF_SEC=30`.
2. Register the usermod by adding `#include "usermod_PIR_sensor_switch.h"` in the top and `registerUsermod(new PIRsensorSwitch());` in the bottom of `usermods_list.cpp`.
Example **usermods_list.cpp**:
```cpp
#include "wled.h"
/*
* Register your v2 usermods here!
* (for v1 usermods using just usermod.cpp, you can ignore this file)
*/
/*
* Add/uncomment your usermod filename here (and once more below)
* || || ||
* \/ \/ \/
*/
//#include "usermod_v2_example.h"
//#include "usermod_temperature.h"
//#include "usermod_v2_empty.h"
#include "usermod_PIR_sensor_switch.h"
void registerUsermods()
{
/*
* Add your usermod class name here
* || || ||
* \/ \/ \/
*/
//usermods.add(new MyExampleUsermod());
//usermods.add(new UsermodTemperature());
//usermods.add(new UsermodRenameMe());
usermods.add(new PIRsensorSwitch());
}
```
**NOTE:** Usermod has been included in master branch of WLED so it can be compiled in directly just by defining `-D USERMOD_PIRSWITCH` and optionaly `-D PIR_SENSOR_PIN=16` to override default pin.
## API to enable/disable the PIR sensor from outside. For example from another usermod. ## API to enable/disable the PIR sensor from outside. For example from another usermod.
@@ -122,3 +85,8 @@ Have fun - @gegu & @blazoncek
2021-11 2021-11
* Added information about dynamic configuration options * Added information about dynamic configuration options
* Added option to temporary enable/disble usermod from WLED UI (Info dialog) * Added option to temporary enable/disble usermod from WLED UI (Info dialog)
2022-11
* Added compile time option for off timer.
* Added Home Assistant autodiscovery MQTT broadcast.
* Updated info on compiling.

View File

@@ -11,6 +11,11 @@
#endif #endif
#endif #endif
#ifndef PIR_SENSOR_OFF_SEC
#define PIR_SENSOR_OFF_SEC 600
#endif
/* /*
* This usermod handles PIR sensor states. * This usermod handles PIR sensor states.
* The strip will be switched on and the off timer will be resetted when the sensor goes HIGH. * The strip will be switched on and the off timer will be resetted when the sensor goes HIGH.
@@ -53,7 +58,7 @@ private:
// configurable parameters // configurable parameters
bool enabled = true; // PIR sensor enabled bool enabled = true; // PIR sensor enabled
int8_t PIRsensorPin = PIR_SENSOR_PIN; // PIR sensor pin int8_t PIRsensorPin = PIR_SENSOR_PIN; // PIR sensor pin
uint32_t m_switchOffDelay = 600000; // delay before switch off after the sensor state goes LOW (10min) uint32_t m_switchOffDelay = PIR_SENSOR_OFF_SEC*1000; // delay before switch off after the sensor state goes LOW (10min)
uint8_t m_onPreset = 0; // on preset uint8_t m_onPreset = 0; // on preset
uint8_t m_offPreset = 0; // off preset uint8_t m_offPreset = 0; // off preset
bool m_nightTimeOnly = false; // flag to indicate that PIR sensor should activate WLED during nighttime only bool m_nightTimeOnly = false; // flag to indicate that PIR sensor should activate WLED during nighttime only

View File

@@ -11,6 +11,9 @@
#define NODE_TYPE_ID_UNDEFINED 0 #define NODE_TYPE_ID_UNDEFINED 0
#define NODE_TYPE_ID_ESP8266 82 #define NODE_TYPE_ID_ESP8266 82
#define NODE_TYPE_ID_ESP32 32 #define NODE_TYPE_ID_ESP32 32
#define NODE_TYPE_ID_ESP32S2 33
#define NODE_TYPE_ID_ESP32S3 34
#define NODE_TYPE_ID_ESP32C3 35
/*********************************************************************************************\ /*********************************************************************************************\
* NodeStruct * NodeStruct

View File

@@ -15,13 +15,19 @@ uint32_t colorBalanceFromKelvin(uint16_t kelvin, uint32_t rgb);
void colorRGBtoRGBW(byte* rgb); void colorRGBtoRGBW(byte* rgb);
// enable additional debug output // enable additional debug output
#if defined(WLED_DEBUG_HOST)
#define DEBUGOUT NetDebug
#else
#define DEBUGOUT Serial
#endif
#ifdef WLED_DEBUG #ifdef WLED_DEBUG
#ifndef ESP8266 #ifndef ESP8266
#include <rom/rtc.h> #include <rom/rtc.h>
#endif #endif
#define DEBUG_PRINT(x) Serial.print(x) #define DEBUG_PRINT(x) DEBUGOUT.print(x)
#define DEBUG_PRINTLN(x) Serial.println(x) #define DEBUG_PRINTLN(x) DEBUGOUT.println(x)
#define DEBUG_PRINTF(x...) Serial.printf(x) #define DEBUG_PRINTF(x...) DEBUGOUT.printf(x)
#else #else
#define DEBUG_PRINT(x) #define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x) #define DEBUG_PRINTLN(x)

View File

@@ -262,7 +262,7 @@ function onLoad()
d.addEventListener("visibilitychange", handleVisibilityChange, false); d.addEventListener("visibilitychange", handleVisibilityChange, false);
size(); size();
gId("cv").style.opacity=0; gId("cv").style.opacity=0;
if (localStorage.getItem('pcm') == "true") togglePcMode(true); if (localStorage.getItem('pcm') == "true" || (!/Mobi/.test(navigator.userAgent) && localStorage.getItem('pcm') == null)) togglePcMode(true);
var sls = d.querySelectorAll('input[type="range"]'); var sls = d.querySelectorAll('input[type="range"]');
for (var sl of sls) { for (var sl of sls) {
sl.addEventListener('touchstart', toggleBubble); sl.addEventListener('touchstart', toggleBubble);
@@ -979,6 +979,9 @@ function btype(b)
{ {
switch (b) { switch (b) {
case 32: return "ESP32"; case 32: return "ESP32";
case 33: return "ESP32-S2";
case 34: return "ESP32-S3";
case 35: return "ESP32-C3";
case 82: return "ESP8266"; case 82: return "ESP8266";
} }
return "?"; return "?";

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@
// Autogenerated from wled00/data/style.css, do not edit!! // Autogenerated from wled00/data/style.css, do not edit!!
const uint16_t PAGE_settingsCss_length = 824; const uint16_t PAGE_settingsCss_length = 824;
const uint8_t PAGE_settingsCss[] PROGMEM = { const uint8_t PAGE_settingsCss[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x55, 0x5d, 0x8b, 0x9c, 0x30, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x55, 0x5d, 0x8b, 0x9c, 0x30,
0x14, 0xfd, 0x2b, 0x96, 0x61, 0x61, 0x0b, 0xa3, 0xa8, 0xa3, 0xb3, 0xd3, 0x48, 0xa1, 0xf4, 0xbd, 0x14, 0xfd, 0x2b, 0x96, 0x61, 0x61, 0x0b, 0xa3, 0xa8, 0xa3, 0xb3, 0xd3, 0x48, 0xa1, 0xf4, 0xbd,
0x6f, 0xa5, 0x14, 0xca, 0x3e, 0x44, 0x73, 0x1d, 0xc3, 0xe4, 0x43, 0x92, 0xd8, 0x75, 0x2a, 0xfe, 0x6f, 0xa5, 0x14, 0xca, 0x3e, 0x44, 0x73, 0x1d, 0xc3, 0xe4, 0x43, 0x92, 0xd8, 0x75, 0x2a, 0xfe,
0xf7, 0x26, 0x7e, 0xac, 0xce, 0xac, 0x6c, 0x5f, 0xca, 0xe0, 0xa0, 0xde, 0x98, 0x7b, 0xee, 0xb9, 0xf7, 0x26, 0x7e, 0xac, 0xce, 0xac, 0x6c, 0x5f, 0xca, 0xe0, 0xa0, 0xde, 0x98, 0x7b, 0xee, 0xb9,
@@ -66,7 +66,7 @@ const uint8_t PAGE_settingsCss[] PROGMEM = {
// Autogenerated from wled00/data/settings.htm, do not edit!! // Autogenerated from wled00/data/settings.htm, do not edit!!
const uint16_t PAGE_settings_length = 1231; const uint16_t PAGE_settings_length = 1231;
const uint8_t PAGE_settings[] PROGMEM = { const uint8_t PAGE_settings[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x56, 0xef, 0x6f, 0xdb, 0x36, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x56, 0xef, 0x6f, 0xdb, 0x36,
0x10, 0xfd, 0xee, 0xbf, 0x82, 0x61, 0xb7, 0x44, 0x42, 0x65, 0xd9, 0x49, 0x87, 0x61, 0x93, 0x2d, 0x10, 0xfd, 0xee, 0xbf, 0x82, 0x61, 0xb7, 0x44, 0x42, 0x65, 0xd9, 0x49, 0x87, 0x61, 0x93, 0x2d,
0x17, 0x6d, 0x92, 0xae, 0x19, 0x12, 0x24, 0x40, 0x92, 0x76, 0xc3, 0x36, 0xa0, 0xb4, 0x78, 0xb2, 0x17, 0x6d, 0x92, 0xae, 0x19, 0x12, 0x24, 0x40, 0x92, 0x76, 0xc3, 0x36, 0xa0, 0xb4, 0x78, 0xb2,
0xd9, 0x48, 0xa4, 0x40, 0x9e, 0x9c, 0x78, 0xae, 0xff, 0xf7, 0x1d, 0x69, 0x27, 0x71, 0xda, 0xa0, 0xd9, 0x48, 0xa4, 0x40, 0x9e, 0x9c, 0x78, 0xae, 0xff, 0xf7, 0x1d, 0x69, 0x27, 0x71, 0xda, 0xa0,
@@ -149,7 +149,7 @@ const uint8_t PAGE_settings[] PROGMEM = {
// Autogenerated from wled00/data/settings_wifi.htm, do not edit!! // Autogenerated from wled00/data/settings_wifi.htm, do not edit!!
const uint16_t PAGE_settings_wifi_length = 1563; const uint16_t PAGE_settings_wifi_length = 1563;
const uint8_t PAGE_settings_wifi[] PROGMEM = { const uint8_t PAGE_settings_wifi[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xb5, 0x57, 0xe1, 0x6e, 0xdb, 0x36, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xb5, 0x57, 0xe1, 0x6e, 0xdb, 0x36,
0x10, 0xfe, 0xef, 0xa7, 0x60, 0x38, 0xa0, 0xb0, 0x50, 0x59, 0x8e, 0xed, 0xa5, 0x2b, 0x52, 0xc9, 0x10, 0xfe, 0xef, 0xa7, 0x60, 0x38, 0xa0, 0xb0, 0x50, 0x59, 0x8e, 0xed, 0xa5, 0x2b, 0x52, 0xc9,
0x5d, 0x62, 0xbb, 0x4d, 0xb6, 0x34, 0xf5, 0xa0, 0xa0, 0xc1, 0x80, 0x01, 0x05, 0x2d, 0x9d, 0x6d, 0x5d, 0x62, 0xbb, 0x4d, 0xb6, 0x34, 0xf5, 0xa0, 0xa0, 0xc1, 0x80, 0x01, 0x05, 0x2d, 0x9d, 0x6d,
0x2e, 0x14, 0xa9, 0x89, 0x94, 0x9d, 0x20, 0xcd, 0xbb, 0xef, 0x48, 0xc9, 0x8e, 0x9d, 0xc4, 0x6d, 0x2e, 0x14, 0xa9, 0x89, 0x94, 0x9d, 0x20, 0xcd, 0xbb, 0xef, 0x48, 0xc9, 0x8e, 0x9d, 0xc4, 0x6d,
@@ -253,7 +253,7 @@ const uint8_t PAGE_settings_wifi[] PROGMEM = {
// Autogenerated from wled00/data/settings_leds.htm, do not edit!! // Autogenerated from wled00/data/settings_leds.htm, do not edit!!
const uint16_t PAGE_settings_leds_length = 7492; const uint16_t PAGE_settings_leds_length = 7492;
const uint8_t PAGE_settings_leds[] PROGMEM = { const uint8_t PAGE_settings_leds[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x3c, 0xdb, 0x76, 0xe3, 0x36, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x3c, 0xdb, 0x76, 0xe3, 0x36,
0x92, 0xef, 0xfa, 0x0a, 0x18, 0x49, 0x1c, 0x72, 0x44, 0x4b, 0xa4, 0x2e, 0x8e, 0x5b, 0x12, 0xe5, 0x92, 0xef, 0xfa, 0x0a, 0x18, 0x49, 0x1c, 0x72, 0x44, 0x4b, 0xa4, 0x2e, 0x8e, 0x5b, 0x12, 0xe5,
0xb5, 0xdc, 0x97, 0x78, 0xc6, 0x8e, 0x7d, 0x2c, 0x27, 0x3d, 0x73, 0x3a, 0x7d, 0xba, 0x29, 0x12, 0xb5, 0xdc, 0x97, 0x78, 0xc6, 0x8e, 0x7d, 0x2c, 0x27, 0x3d, 0x73, 0x3a, 0x7d, 0xba, 0x29, 0x12,
0x92, 0xd8, 0xa6, 0x48, 0x85, 0xa4, 0x6c, 0x6b, 0x6d, 0xef, 0x37, 0xed, 0x37, 0xec, 0x97, 0x6d, 0x92, 0xd8, 0xa6, 0x48, 0x85, 0xa4, 0x6c, 0x6b, 0x6d, 0xef, 0x37, 0xed, 0x37, 0xec, 0x97, 0x6d,
@@ -728,7 +728,7 @@ const uint8_t PAGE_settings_leds[] PROGMEM = {
// Autogenerated from wled00/data/settings_dmx.htm, do not edit!! // Autogenerated from wled00/data/settings_dmx.htm, do not edit!!
const uint16_t PAGE_settings_dmx_length = 1612; const uint16_t PAGE_settings_dmx_length = 1612;
const uint8_t PAGE_settings_dmx[] PROGMEM = { const uint8_t PAGE_settings_dmx[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x95, 0x57, 0xdb, 0x72, 0xdb, 0x36, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x57, 0xdb, 0x72, 0xdb, 0x36,
0x10, 0x7d, 0xd7, 0x57, 0x20, 0x78, 0x88, 0xc9, 0x31, 0x43, 0x4a, 0x4e, 0x95, 0x36, 0x32, 0x49, 0x10, 0x7d, 0xd7, 0x57, 0x20, 0x78, 0x88, 0xc9, 0x31, 0x43, 0x4a, 0x4e, 0x95, 0x36, 0x32, 0x49,
0x37, 0x56, 0x5c, 0xdb, 0x1d, 0xdb, 0xf5, 0x44, 0x49, 0xd3, 0x4e, 0xd3, 0xe9, 0x40, 0xe4, 0x4a, 0x37, 0x56, 0x5c, 0xdb, 0x1d, 0xdb, 0xf5, 0x44, 0x49, 0xd3, 0x4e, 0xd3, 0xe9, 0x40, 0xe4, 0x4a,
0x44, 0x4c, 0x02, 0x2c, 0x00, 0x4a, 0x76, 0x2e, 0xff, 0xde, 0x05, 0x48, 0x5d, 0xec, 0xd8, 0x69, 0x44, 0x4c, 0x02, 0x2c, 0x00, 0x4a, 0x76, 0x2e, 0xff, 0xde, 0x05, 0x48, 0x5d, 0xec, 0xd8, 0x69,
@@ -835,7 +835,7 @@ const uint8_t PAGE_settings_dmx[] PROGMEM = {
// Autogenerated from wled00/data/settings_ui.htm, do not edit!! // Autogenerated from wled00/data/settings_ui.htm, do not edit!!
const uint16_t PAGE_settings_ui_length = 3090; const uint16_t PAGE_settings_ui_length = 3090;
const uint8_t PAGE_settings_ui[] PROGMEM = { const uint8_t PAGE_settings_ui[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x59, 0x6b, 0x73, 0xda, 0x48, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x59, 0x6b, 0x73, 0xda, 0x48,
0x16, 0xfd, 0xce, 0xaf, 0xe8, 0x74, 0x52, 0x1e, 0x54, 0x56, 0x04, 0x4e, 0x66, 0x6b, 0x13, 0x40, 0x16, 0xfd, 0xce, 0xaf, 0xe8, 0x74, 0x52, 0x1e, 0x54, 0x56, 0x04, 0x4e, 0x66, 0x6b, 0x13, 0x40,
0x78, 0x63, 0xc7, 0x93, 0x78, 0xca, 0xd9, 0x64, 0x83, 0xbd, 0x99, 0xad, 0xac, 0xcb, 0x23, 0xa4, 0x78, 0x63, 0xc7, 0x93, 0x78, 0xca, 0xd9, 0x64, 0x83, 0xbd, 0x99, 0xad, 0xac, 0xcb, 0x23, 0xa4,
0x06, 0x3a, 0x16, 0x92, 0x46, 0xdd, 0x32, 0x66, 0x09, 0xff, 0x7d, 0xcf, 0xed, 0x96, 0x40, 0x60, 0x06, 0x3a, 0x16, 0x92, 0x46, 0xdd, 0x32, 0x66, 0x09, 0xff, 0x7d, 0xcf, 0xed, 0x96, 0x40, 0x60,
@@ -1035,7 +1035,7 @@ const uint8_t PAGE_settings_ui[] PROGMEM = {
// Autogenerated from wled00/data/settings_sync.htm, do not edit!! // Autogenerated from wled00/data/settings_sync.htm, do not edit!!
const uint16_t PAGE_settings_sync_length = 3394; const uint16_t PAGE_settings_sync_length = 3394;
const uint8_t PAGE_settings_sync[] PROGMEM = { const uint8_t PAGE_settings_sync[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xa5, 0x5a, 0x59, 0x73, 0xdb, 0x38, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xa5, 0x5a, 0x59, 0x73, 0xdb, 0x38,
0x12, 0x7e, 0xe7, 0xaf, 0x40, 0xb8, 0x55, 0x33, 0xd2, 0x58, 0xd6, 0x61, 0x59, 0x8e, 0xa3, 0x88, 0x12, 0x7e, 0xe7, 0xaf, 0x40, 0xb8, 0x55, 0x33, 0xd2, 0x58, 0xd6, 0x61, 0x59, 0x8e, 0xa3, 0x88,
0xcc, 0x4a, 0x96, 0x63, 0x6b, 0xc7, 0x8e, 0x35, 0x92, 0x33, 0x47, 0xd5, 0x56, 0x4d, 0x41, 0x24, 0xcc, 0x4a, 0x96, 0x63, 0x6b, 0xc7, 0x8e, 0x35, 0x92, 0x33, 0x47, 0xd5, 0x56, 0x4d, 0x41, 0x24,
0x24, 0xc1, 0x26, 0x09, 0x0e, 0x09, 0xfa, 0xa8, 0x4c, 0xfe, 0xfb, 0x76, 0x83, 0x87, 0x48, 0xea, 0x24, 0xc1, 0x26, 0x09, 0x0e, 0x09, 0xfa, 0xa8, 0x4c, 0xfe, 0xfb, 0x76, 0x83, 0x87, 0x48, 0xea,
@@ -1254,7 +1254,7 @@ const uint8_t PAGE_settings_sync[] PROGMEM = {
// Autogenerated from wled00/data/settings_time.htm, do not edit!! // Autogenerated from wled00/data/settings_time.htm, do not edit!!
const uint16_t PAGE_settings_time_length = 3313; const uint16_t PAGE_settings_time_length = 3313;
const uint8_t PAGE_settings_time[] PROGMEM = { const uint8_t PAGE_settings_time[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x38, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x38,
0xf6, 0x7b, 0x7e, 0x85, 0x50, 0x7b, 0x98, 0x78, 0x70, 0x9e, 0x90, 0x16, 0x92, 0xd8, 0xdd, 0x10, 0xf6, 0x7b, 0x7e, 0x85, 0x50, 0x7b, 0x98, 0x78, 0x70, 0x9e, 0x90, 0x16, 0x92, 0xd8, 0xdd, 0x10,
0xd2, 0x42, 0x4b, 0x02, 0x67, 0x92, 0x0e, 0xbb, 0xd3, 0xf6, 0x4c, 0x15, 0x5b, 0x49, 0x0c, 0x8e, 0xd2, 0x42, 0x4b, 0x02, 0x67, 0x92, 0x0e, 0xbb, 0xd3, 0xf6, 0x4c, 0x15, 0x5b, 0x49, 0x0c, 0x8e,
0xe4, 0xb5, 0x65, 0x02, 0x4b, 0xf9, 0xef, 0x7b, 0x25, 0x39, 0xce, 0xd3, 0xd0, 0x76, 0x66, 0x3f, 0xe4, 0xb5, 0x65, 0x02, 0x4b, 0xf9, 0xef, 0x7b, 0x25, 0x39, 0xce, 0xd3, 0xd0, 0x76, 0x66, 0x3f,
@@ -1466,166 +1466,166 @@ const uint8_t PAGE_settings_time[] PROGMEM = {
// Autogenerated from wled00/data/settings_sec.htm, do not edit!! // Autogenerated from wled00/data/settings_sec.htm, do not edit!!
const uint16_t PAGE_settings_sec_length = 2408; const uint16_t PAGE_settings_sec_length = 2409;
const uint8_t PAGE_settings_sec[] PROGMEM = { const uint8_t PAGE_settings_sec[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xa5, 0x58, 0x6d, 0x73, 0xdb, 0xb8, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xa5, 0x58, 0x6d, 0x73, 0xd3, 0x48,
0x11, 0xfe, 0xae, 0x5f, 0x01, 0x23, 0x33, 0x39, 0xb1, 0xa1, 0x49, 0xdb, 0x49, 0x6f, 0xf2, 0x62, 0x12, 0xfe, 0xee, 0x5f, 0x31, 0x19, 0xaa, 0x58, 0xeb, 0x50, 0x24, 0x27, 0x70, 0x5b, 0x40, 0x22,
0x2a, 0xb5, 0x63, 0xe5, 0xe2, 0x8e, 0x1d, 0x7b, 0x22, 0xf9, 0xd2, 0x4e, 0x9a, 0xc9, 0x40, 0x24, 0x73, 0x09, 0x09, 0x4b, 0xae, 0x12, 0x92, 0x8a, 0xcd, 0x72, 0x57, 0x1c, 0x45, 0x8d, 0xa5, 0xb1,
0x24, 0x22, 0xa2, 0x08, 0x1e, 0x00, 0x5a, 0x51, 0x73, 0xf7, 0xdf, 0xfb, 0x2c, 0x48, 0x4a, 0xb2, 0x35, 0x58, 0xd6, 0x68, 0x67, 0x46, 0x31, 0x3e, 0x76, 0xff, 0xfb, 0x3d, 0x3d, 0x92, 0x6c, 0x27,
0x63, 0x27, 0x93, 0xe9, 0x07, 0x5b, 0x22, 0x08, 0xec, 0xcb, 0xb3, 0xbb, 0xcf, 0x2e, 0x74, 0xb8, 0x04, 0x28, 0xea, 0x3e, 0x24, 0xb6, 0x46, 0x33, 0xfd, 0xf2, 0x74, 0xf7, 0xd3, 0x3d, 0x3e, 0xdc,
0x73, 0x72, 0xf1, 0x6a, 0xfc, 0xef, 0xcb, 0x21, 0xcb, 0xdd, 0xa2, 0x18, 0x1c, 0xd2, 0x7f, 0x56, 0x39, 0xb9, 0x7c, 0x39, 0xfe, 0xf7, 0xd5, 0x29, 0xcb, 0xdd, 0xa2, 0x18, 0x1e, 0xd2, 0x7f, 0x56,
0x88, 0x72, 0x96, 0x70, 0x59, 0x72, 0x3c, 0x4b, 0x91, 0x0d, 0x0e, 0x17, 0xd2, 0x09, 0x56, 0x8a, 0x88, 0x72, 0x96, 0x70, 0x59, 0x72, 0x3c, 0x4b, 0x91, 0x0d, 0x0f, 0x17, 0xd2, 0x09, 0x56, 0x8a,
0x85, 0x4c, 0xf8, 0xb5, 0x92, 0xcb, 0x4a, 0x1b, 0xc7, 0x59, 0xaa, 0x4b, 0x27, 0x4b, 0x97, 0xf0, 0x85, 0x4c, 0xf8, 0x8d, 0x92, 0xcb, 0x4a, 0x1b, 0xc7, 0x59, 0xaa, 0x4b, 0x27, 0x4b, 0x97, 0xf0,
0xa5, 0xca, 0x5c, 0x9e, 0xfc, 0x7d, 0x6f, 0x8f, 0x0f, 0x7a, 0xcd, 0xd6, 0xde, 0xad, 0x77, 0x99, 0xa5, 0xca, 0x5c, 0x9e, 0xfc, 0x7d, 0x30, 0xe0, 0xc3, 0x5e, 0xb3, 0xb5, 0x77, 0xe7, 0x5d, 0x26,
0xbc, 0x56, 0xa9, 0xdc, 0xf5, 0x0f, 0xa1, 0x2a, 0x95, 0x53, 0xa2, 0xd8, 0xb5, 0xa9, 0x28, 0x64, 0x6f, 0x54, 0x2a, 0x77, 0xfd, 0x43, 0xa8, 0x4a, 0xe5, 0x94, 0x28, 0x76, 0x6d, 0x2a, 0x0a, 0x99,
0xb2, 0x1f, 0x2e, 0xc4, 0x17, 0xb5, 0xa8, 0x17, 0xeb, 0xe7, 0xda, 0x4a, 0xe3, 0x1f, 0xc4, 0x04, 0xec, 0x85, 0x0b, 0xf1, 0x59, 0x2d, 0xea, 0xc5, 0xfa, 0xb9, 0xb6, 0xd2, 0xf8, 0x07, 0x31, 0xc1,
0xcf, 0xa5, 0xe6, 0xac, 0x77, 0x4b, 0x75, 0x6b, 0x50, 0x9a, 0x0b, 0x63, 0x25, 0x94, 0xd4, 0x6e, 0x73, 0xa9, 0x39, 0xeb, 0xdd, 0x51, 0xdd, 0x1a, 0x94, 0xe6, 0xc2, 0x58, 0x09, 0x25, 0xb5, 0x9b,
0xba, 0xfb, 0x14, 0xab, 0x4e, 0xb9, 0x42, 0x0e, 0xce, 0x95, 0x4d, 0xd9, 0x48, 0x3a, 0xa7, 0xca, 0xee, 0x3e, 0xc5, 0xaa, 0x53, 0xae, 0x90, 0xc3, 0x0b, 0x65, 0x53, 0x36, 0x92, 0xce, 0xa9, 0x72,
0x99, 0x3d, 0x8c, 0x9b, 0xc5, 0x43, 0x9b, 0x1a, 0x55, 0xb9, 0x41, 0xef, 0x5a, 0x18, 0x56, 0xe8, 0x66, 0x0f, 0xe3, 0x66, 0xf1, 0xd0, 0xa6, 0x46, 0x55, 0x6e, 0xd8, 0xbb, 0x11, 0x86, 0x15, 0x3a,
0x54, 0x55, 0xa1, 0x53, 0x0b, 0xa9, 0x6b, 0x17, 0x66, 0x49, 0xa6, 0xd3, 0x7a, 0x01, 0x73, 0x43, 0x55, 0x55, 0xe8, 0xd4, 0x42, 0xea, 0xda, 0x85, 0x59, 0x92, 0xe9, 0xb4, 0x5e, 0xc0, 0xdc, 0x10,
0xbc, 0x48, 0x76, 0xf6, 0x5f, 0x4c, 0xeb, 0x32, 0x75, 0x4a, 0x97, 0xec, 0x4d, 0x3f, 0xf8, 0xba, 0x2f, 0x92, 0x9d, 0xbd, 0x83, 0x69, 0x5d, 0xa6, 0x4e, 0xe9, 0x92, 0xbd, 0xee, 0x07, 0x5f, 0x96,
0x54, 0x65, 0xa6, 0x97, 0x91, 0xae, 0x64, 0xd9, 0xe7, 0xb9, 0x73, 0x95, 0x7d, 0x1e, 0xc7, 0xf3, 0xaa, 0xcc, 0xf4, 0x32, 0xd2, 0x95, 0x2c, 0xfb, 0x3c, 0x77, 0xae, 0xb2, 0xcf, 0xe3, 0x78, 0x5e,
0x52, 0x47, 0xcb, 0x42, 0x66, 0xd1, 0x4c, 0xc6, 0x53, 0x29, 0x5c, 0x6d, 0xa4, 0x8d, 0x6d, 0xab, 0xea, 0x68, 0x59, 0xc8, 0x2c, 0x9a, 0xc9, 0x78, 0x2a, 0x85, 0xab, 0x8d, 0xb4, 0xb1, 0x6d, 0x75,
0x33, 0x7e, 0x60, 0x65, 0x5a, 0x1b, 0xe5, 0x56, 0xbb, 0xdd, 0x12, 0x0f, 0xfe, 0x5a, 0x0b, 0x3d, 0xc6, 0x0f, 0xac, 0x4c, 0x6b, 0xa3, 0xdc, 0x6a, 0xb7, 0x5b, 0xe2, 0xc1, 0x5f, 0x6b, 0xa1, 0xc7,
0xbe, 0x2d, 0x74, 0x7d, 0x90, 0x87, 0xfc, 0x93, 0x95, 0xc5, 0x74, 0x7b, 0xf7, 0xd5, 0x37, 0xbb, 0x77, 0x85, 0xae, 0x0f, 0xf2, 0x90, 0x7f, 0xb4, 0xb2, 0x98, 0x6e, 0xef, 0x7e, 0xfb, 0xd5, 0xee,
0xeb, 0x2a, 0x13, 0x4e, 0xde, 0xb5, 0x77, 0x76, 0x9a, 0xf5, 0x65, 0xf0, 0xd5, 0x48, 0xd8, 0x53, 0xba, 0xca, 0x84, 0x93, 0xf7, 0xed, 0x9d, 0x9d, 0x65, 0x7d, 0x19, 0x7c, 0x31, 0x12, 0xf6, 0x94,
0x32, 0x32, 0xce, 0x0d, 0x0b, 0x49, 0x9e, 0x1d, 0xaf, 0xfc, 0xab, 0xcd, 0x56, 0x65, 0x2f, 0x26, 0x8c, 0x8c, 0x73, 0xa7, 0x85, 0x24, 0xcf, 0x8e, 0x57, 0xfe, 0xd5, 0x66, 0xab, 0xb2, 0x97, 0x93,
0x9f, 0xb7, 0x36, 0xcb, 0x87, 0x0f, 0xb9, 0x9e, 0x7c, 0x96, 0xa9, 0xe3, 0x49, 0xe2, 0x56, 0x95, 0x4f, 0x5b, 0x9b, 0xe5, 0xc3, 0x87, 0x5c, 0x4f, 0x3e, 0xc9, 0xd4, 0xf1, 0x24, 0x71, 0xab, 0x4a,
0xd4, 0x53, 0x5a, 0xdb, 0x39, 0x32, 0x46, 0xac, 0x22, 0x65, 0xfd, 0xe7, 0x0d, 0x09, 0x85, 0x16, 0xea, 0x29, 0xad, 0xed, 0x1c, 0x19, 0x23, 0x56, 0x91, 0xb2, 0xfe, 0xf3, 0x96, 0x84, 0x42, 0x8b,
0xd9, 0x3f, 0x47, 0x7d, 0x19, 0xba, 0x64, 0x67, 0x2f, 0xf8, 0x5a, 0x48, 0xc7, 0x74, 0x92, 0x45, 0xec, 0x9f, 0xa3, 0xbe, 0x0c, 0x5d, 0xb2, 0x33, 0x08, 0xbe, 0x14, 0xd2, 0x31, 0x9d, 0x64, 0x51,
0xa9, 0x01, 0x1c, 0xb2, 0x55, 0xdb, 0xe7, 0x0d, 0xec, 0x3c, 0x78, 0xa1, 0x23, 0x78, 0x79, 0xe4, 0x6a, 0x00, 0x87, 0x6c, 0xd5, 0xf6, 0x79, 0x03, 0x3b, 0x0f, 0x0e, 0x74, 0x04, 0x2f, 0x8f, 0x9c,
0x9c, 0x51, 0x93, 0xda, 0x49, 0xbc, 0x30, 0x29, 0x0f, 0x65, 0x10, 0xde, 0x5e, 0x27, 0xdd, 0xf0, 0x33, 0x6a, 0x52, 0x3b, 0x89, 0x17, 0x26, 0xe5, 0xa1, 0x0c, 0xc2, 0xbb, 0xeb, 0xa4, 0x1b, 0xbe,
0xcd, 0xc9, 0x2f, 0x2e, 0xfe, 0x2c, 0xae, 0x45, 0x27, 0xe0, 0x9b, 0x8d, 0xc2, 0xae, 0x4a, 0x88, 0x39, 0xf9, 0xd9, 0xc5, 0x9f, 0xc4, 0x8d, 0xe8, 0x04, 0x7c, 0xb5, 0x51, 0xd8, 0x55, 0x09, 0x11,
0x70, 0x41, 0x98, 0x45, 0x13, 0x9d, 0xad, 0x22, 0x51, 0x01, 0x9f, 0xec, 0x55, 0xae, 0x8a, 0xac, 0x2e, 0x08, 0xb3, 0x68, 0xa2, 0xb3, 0x55, 0x24, 0x2a, 0xe0, 0x93, 0xbd, 0xcc, 0x55, 0x91, 0xf5,
0xaf, 0x69, 0xbf, 0xc8, 0xb2, 0xe1, 0x35, 0xac, 0x38, 0x53, 0x16, 0xc9, 0x28, 0x4d, 0x9f, 0x93, 0x35, 0xed, 0x17, 0x59, 0x76, 0x7a, 0x03, 0x2b, 0xce, 0x95, 0x45, 0x32, 0x4a, 0xd3, 0xe7, 0x64,
0xcd, 0x3c, 0xec, 0x07, 0xc9, 0xe0, 0xeb, 0x6f, 0xd2, 0xfd, 0xde, 0x0f, 0x42, 0xc8, 0x3c, 0x4e, 0x33, 0x0f, 0xfb, 0x41, 0x32, 0xfc, 0xf2, 0x9b, 0x74, 0xbf, 0xf7, 0x83, 0x10, 0x32, 0x8f, 0xd3,
0xe7, 0xaf, 0x55, 0x21, 0x29, 0xc7, 0xfa, 0x84, 0x20, 0x9f, 0xa4, 0xf3, 0x74, 0x3a, 0xe3, 0xc1, 0xf9, 0x2b, 0x55, 0x48, 0xca, 0xb1, 0x3e, 0x21, 0xc8, 0x27, 0xe9, 0x3c, 0x9d, 0xce, 0x78, 0xf0,
0xbd, 0x6f, 0x2b, 0x44, 0x5b, 0x3a, 0x04, 0x35, 0xf8, 0xeb, 0x6e, 0x3d, 0xd2, 0x18, 0x6d, 0xe0, 0xcd, 0xb7, 0x15, 0xa2, 0x2d, 0x1d, 0x82, 0x1a, 0xfc, 0x75, 0xbf, 0x1e, 0x69, 0x8c, 0x36, 0x70,
0x1e, 0xf4, 0xa0, 0x12, 0xac, 0x2e, 0x64, 0x54, 0xe8, 0x59, 0x9f, 0x0f, 0x69, 0x9d, 0xb5, 0xe0, 0x0f, 0x7a, 0x50, 0x09, 0x56, 0x17, 0x32, 0x2a, 0xf4, 0xac, 0xcf, 0x4f, 0x69, 0x9d, 0xb5, 0xe0,
0x21, 0xe2, 0x6c, 0x0a, 0xd1, 0x1e, 0x06, 0xa4, 0xbe, 0x01, 0x5c, 0x67, 0xed, 0x3a, 0xd0, 0xc7, 0x21, 0xe2, 0x6c, 0x0a, 0xd1, 0x1e, 0x06, 0xa4, 0xbe, 0x01, 0x5c, 0xe7, 0xed, 0x3a, 0xd0, 0xc7,
0xc1, 0xa9, 0x9a, 0xd5, 0x46, 0x78, 0xb4, 0x1b, 0x18, 0xd8, 0x54, 0x28, 0xca, 0xba, 0xff, 0x94, 0xc1, 0xa9, 0x9a, 0xd5, 0x46, 0x78, 0xb4, 0x1b, 0x18, 0xd8, 0x54, 0x28, 0xca, 0xba, 0xff, 0x94,
0xa7, 0x65, 0xaa, 0x17, 0x15, 0x40, 0x97, 0xac, 0x12, 0x33, 0xc9, 0x90, 0x12, 0x62, 0x07, 0xb9, 0x67, 0x65, 0xaa, 0x17, 0x15, 0x40, 0x97, 0xac, 0x12, 0x33, 0xc9, 0x90, 0x12, 0x62, 0x07, 0xb9,
0xb0, 0x15, 0x20, 0x9b, 0xeb, 0xe5, 0x58, 0x0b, 0xeb, 0x9a, 0x18, 0xed, 0x07, 0x5f, 0x29, 0xf7, 0xb0, 0x15, 0x20, 0x9b, 0xeb, 0xe5, 0x58, 0x0b, 0xeb, 0x9a, 0x18, 0xed, 0x05, 0x5f, 0x28, 0xf7,
0x75, 0xe2, 0xbd, 0x70, 0xf4, 0xc2, 0x87, 0x45, 0x95, 0x30, 0xf9, 0xcd, 0xf8, 0xfc, 0x2c, 0x91, 0x75, 0xe2, 0xbd, 0x70, 0xf4, 0xc2, 0x87, 0x45, 0x95, 0x30, 0xf9, 0xf5, 0xf8, 0xe2, 0x3c, 0x91,
0xf0, 0x25, 0x2d, 0x84, 0xb5, 0xe4, 0x08, 0x79, 0xd5, 0x77, 0x2f, 0x5b, 0x57, 0x9e, 0x73, 0x92, 0xf0, 0x25, 0x2d, 0x84, 0xb5, 0xe4, 0x08, 0x79, 0xd5, 0x77, 0x2f, 0x5a, 0x57, 0x9e, 0x73, 0x92,
0x86, 0x28, 0xa4, 0x85, 0x14, 0x66, 0xdc, 0x54, 0x4e, 0xbf, 0xad, 0x20, 0x1f, 0x1b, 0xb7, 0x82, 0x86, 0x28, 0xa4, 0x85, 0x14, 0x66, 0xdc, 0x54, 0x4e, 0xbf, 0xad, 0x20, 0x1f, 0x1b, 0xb7, 0x82,
0x93, 0xa2, 0x54, 0x0b, 0x6f, 0x6f, 0xc2, 0x4b, 0x5d, 0xc2, 0xb3, 0x76, 0x47, 0x02, 0xb8, 0xba, 0x93, 0xa2, 0x54, 0x0b, 0x6f, 0x6f, 0xc2, 0x4b, 0x5d, 0xc2, 0xb3, 0x76, 0x47, 0x02, 0xb8, 0xba,
0x43, 0xfd, 0xce, 0x40, 0x24, 0xf6, 0xb6, 0x3e, 0x23, 0x17, 0xfa, 0x9a, 0x12, 0xc3, 0x2b, 0x02, 0x43, 0xfd, 0xce, 0x40, 0x24, 0xf6, 0xb6, 0x3e, 0x23, 0x17, 0xfa, 0x86, 0x12, 0xc3, 0x2b, 0x02,
0xb0, 0x07, 0xcf, 0xf6, 0xf6, 0xb6, 0xdc, 0xa9, 0x2b, 0x02, 0x8d, 0x62, 0x41, 0xfe, 0x74, 0xce, 0xb0, 0xfb, 0xcf, 0x06, 0x83, 0x2d, 0x77, 0xea, 0x8a, 0x40, 0xa3, 0x58, 0x90, 0x3f, 0x9d, 0x33,
0x94, 0x72, 0xc9, 0xfe, 0x75, 0x7e, 0xf6, 0x06, 0x75, 0xf9, 0x4e, 0xfe, 0x51, 0x4b, 0xeb, 0x5e, 0xa5, 0x5c, 0xb2, 0x7f, 0x5d, 0x9c, 0xbf, 0x46, 0x5d, 0x5e, 0xcb, 0x3f, 0x6a, 0x69, 0xdd, 0xc1,
0x7c, 0x27, 0xf0, 0x5b, 0xaa, 0x37, 0xe8, 0xb8, 0x5c, 0x59, 0x68, 0xb7, 0x15, 0x22, 0x25, 0xc7, 0x77, 0x02, 0xbf, 0xa5, 0x7a, 0x83, 0x8e, 0xcb, 0x95, 0x85, 0x76, 0x5b, 0x21, 0x52, 0x72, 0x8c,
0xc8, 0xbb, 0xd0, 0xaf, 0x58, 0x87, 0xb2, 0xb6, 0x83, 0xe4, 0x09, 0x59, 0x11, 0x7c, 0x37, 0xce, 0xbc, 0x0b, 0xfd, 0x8a, 0x75, 0x28, 0x6b, 0x3b, 0x4c, 0x9e, 0x90, 0x15, 0xc1, 0x77, 0xe3, 0xbc,
0x1b, 0xb9, 0x72, 0x5b, 0xb0, 0x24, 0x19, 0xe9, 0x3c, 0xdc, 0xe9, 0x04, 0x34, 0x05, 0x7c, 0x79, 0x91, 0x2b, 0xb7, 0x05, 0x4b, 0x92, 0x91, 0xce, 0xc3, 0x9d, 0x4e, 0x40, 0x53, 0xc0, 0x57, 0x97,
0x31, 0x1a, 0x23, 0xc3, 0xe3, 0xc6, 0x21, 0xc4, 0x80, 0x3c, 0x29, 0xbd, 0x27, 0xaf, 0xb5, 0x59, 0xa3, 0x31, 0x32, 0x3c, 0x6e, 0x1c, 0x42, 0x0c, 0xc8, 0x93, 0xd2, 0x7b, 0xf2, 0x4a, 0x9b, 0xc5,
0x9c, 0x20, 0x92, 0x2f, 0xda, 0xaa, 0x2c, 0xdb, 0xa4, 0xee, 0x73, 0x8a, 0x2f, 0x12, 0x25, 0xa2, 0x09, 0x22, 0x79, 0xd0, 0x56, 0x65, 0xd9, 0x26, 0x75, 0x9f, 0x53, 0x7c, 0x91, 0x28, 0x11, 0x25,
0x84, 0xb1, 0x1f, 0xf6, 0x3e, 0x86, 0x0d, 0xea, 0xf4, 0xae, 0x0c, 0xb0, 0x7e, 0x2d, 0x8a, 0x1a, 0x8c, 0x7d, 0x3f, 0xf8, 0x10, 0x36, 0xa8, 0xd3, 0xbb, 0x32, 0xc0, 0xfa, 0x8d, 0x28, 0x6a, 0x50,
0x14, 0xc9, 0xc3, 0x9d, 0xfd, 0x0d, 0x64, 0x69, 0x2e, 0xd3, 0xf9, 0xdb, 0x7a, 0xb1, 0xa9, 0xf3, 0x24, 0x0f, 0x77, 0xf6, 0x36, 0x90, 0xa5, 0xb9, 0x4c, 0xe7, 0x6f, 0xea, 0xc5, 0xa6, 0xce, 0x77,
0x9d, 0xfe, 0x8e, 0x24, 0x17, 0xa2, 0xb9, 0x5c, 0x45, 0x08, 0x55, 0x9a, 0xf7, 0xe3, 0x0f, 0x7b, 0xfa, 0x3b, 0x92, 0x5c, 0x88, 0xe6, 0x72, 0x15, 0x21, 0x54, 0x69, 0xde, 0x8f, 0xdf, 0x0f, 0x76,
0xbb, 0xcf, 0x3e, 0xc6, 0x01, 0x8a, 0xfd, 0x03, 0x3f, 0x86, 0xbd, 0xb6, 0x12, 0x29, 0x95, 0xe0, 0x9f, 0x7d, 0x88, 0x03, 0x14, 0xfb, 0x7b, 0x7e, 0x0c, 0x7b, 0x6d, 0x25, 0x52, 0x2a, 0xc1, 0xb1,
0x58, 0x4c, 0xf0, 0x7f, 0x08, 0x22, 0x87, 0x8b, 0x7c, 0x94, 0xab, 0xa9, 0xc3, 0xe7, 0x2b, 0x30, 0x98, 0xe0, 0xff, 0x29, 0x88, 0x1c, 0x2e, 0xf2, 0x51, 0xae, 0xa6, 0x0e, 0x9f, 0x2f, 0xc1, 0xec,
0xbb, 0xd1, 0x05, 0xbe, 0x1d, 0x15, 0xf4, 0x7c, 0x29, 0xc0, 0xd7, 0xb4, 0x2e, 0x2a, 0x7b, 0xa6, 0x46, 0x17, 0xf8, 0x76, 0x54, 0xd0, 0xf3, 0x95, 0x00, 0x5f, 0xd3, 0xba, 0xa8, 0xec, 0xb9, 0x4e,
0xd3, 0x39, 0x1d, 0x01, 0x79, 0xfb, 0x22, 0x1e, 0xb5, 0x92, 0x2e, 0x91, 0xa1, 0x57, 0x55, 0xfb, 0xe7, 0x74, 0x04, 0xe4, 0xed, 0x8b, 0x78, 0xd4, 0x4a, 0xba, 0x42, 0x86, 0xbe, 0xad, 0xda, 0x2f,
0xe5, 0x44, 0x2f, 0x4b, 0x2f, 0x17, 0x01, 0xe1, 0x6f, 0xf4, 0x82, 0x36, 0x80, 0x5d, 0xf4, 0xf2, 0x27, 0x7a, 0x59, 0x7a, 0xb9, 0x08, 0x08, 0x7f, 0xad, 0x17, 0xb4, 0x01, 0xec, 0xa2, 0x97, 0xe7,
0x4c, 0x7a, 0x05, 0xfe, 0xbb, 0xdf, 0xed, 0xbf, 0xbd, 0x53, 0xb3, 0x7c, 0xbd, 0xdc, 0x9e, 0x3d, 0xd2, 0x2b, 0xf0, 0xdf, 0xfd, 0x6e, 0xff, 0xed, 0x5a, 0xcd, 0xf2, 0xf5, 0x72, 0x7b, 0xf6, 0x0c,
0x45, 0xa0, 0x0c, 0x2d, 0x9e, 0x48, 0xaa, 0x00, 0xfe, 0x11, 0x49, 0x9c, 0x16, 0x75, 0x26, 0x6d, 0x81, 0x32, 0xb4, 0x78, 0x22, 0xa9, 0x02, 0xf8, 0x07, 0x24, 0x71, 0x5a, 0xd4, 0x99, 0xb4, 0xfd,
0x7f, 0xed, 0x5d, 0x10, 0xfc, 0xf9, 0x67, 0xfb, 0x84, 0x72, 0xa5, 0xcf, 0x13, 0x39, 0x15, 0x75, 0xb5, 0x77, 0x41, 0xf0, 0xe7, 0x9f, 0xed, 0x13, 0xca, 0x95, 0x3e, 0x4f, 0xe4, 0x54, 0xd4, 0x85,
0xe1, 0x50, 0xf4, 0xa8, 0x85, 0xad, 0x32, 0xb9, 0x59, 0xe3, 0x80, 0x4a, 0xde, 0x62, 0x1a, 0x70, 0x43, 0xd1, 0xa3, 0x16, 0xb6, 0xca, 0xe4, 0x76, 0x8d, 0x03, 0x2a, 0x79, 0x87, 0x69, 0xc0, 0xbd,
0x6f, 0xd9, 0x24, 0x10, 0x27, 0xce, 0xff, 0xc4, 0x1f, 0x49, 0xa2, 0xd6, 0xbb, 0x76, 0x04, 0x8f, 0x65, 0x93, 0x40, 0x9c, 0x38, 0xff, 0x23, 0x7f, 0x24, 0x89, 0x5a, 0xef, 0xdb, 0x11, 0x3c, 0xea,
0xfa, 0xfc, 0xfd, 0xd9, 0xf0, 0x04, 0x24, 0x6a, 0xb3, 0x97, 0x1c, 0x75, 0x83, 0xdd, 0x36, 0x0b, 0xf3, 0x77, 0xe7, 0xa7, 0x27, 0x20, 0x51, 0x9b, 0xbd, 0xe0, 0xa8, 0x1b, 0xec, 0xb6, 0x59, 0xb0,
0xb6, 0xf4, 0x8d, 0x90, 0x7c, 0x9c, 0xc2, 0xf8, 0x1c, 0x9b, 0x5a, 0x66, 0x47, 0xdf, 0xf1, 0x65, 0xa5, 0x6f, 0x84, 0xe4, 0xe3, 0x14, 0xc6, 0xe7, 0xd8, 0xd4, 0x32, 0x3b, 0xfa, 0x8e, 0x2f, 0x1b,
0x03, 0x53, 0xb5, 0xd3, 0xa9, 0x2e, 0x1e, 0x3e, 0xec, 0xfb, 0x5e, 0xb4, 0x17, 0xf6, 0x7d, 0xb3, 0x98, 0xaa, 0x9d, 0x4e, 0x75, 0xf1, 0xf0, 0x61, 0xdf, 0xf7, 0xa2, 0x41, 0xd8, 0xf7, 0xcd, 0x2a,
0x4a, 0x68, 0x47, 0x31, 0x72, 0xda, 0x00, 0x41, 0x52, 0x7e, 0xea, 0xe4, 0x82, 0xd2, 0x3a, 0x3d, 0xa1, 0x1d, 0xc5, 0xc8, 0x69, 0x03, 0x04, 0x49, 0xf9, 0x99, 0x93, 0x0b, 0x4a, 0xeb, 0xf4, 0xac,
0xad, 0xb8, 0x77, 0xb5, 0xd9, 0x86, 0xf3, 0x8b, 0x0a, 0x3c, 0x42, 0xee, 0xb0, 0x73, 0x9d, 0xc9, 0xe2, 0xde, 0xd5, 0x66, 0x1b, 0xce, 0x2f, 0x2a, 0xf0, 0x08, 0xb9, 0xc3, 0x2e, 0x74, 0x26, 0x23,
0x88, 0x5d, 0xa2, 0x62, 0xad, 0x64, 0x92, 0xe2, 0xc8, 0xc8, 0x36, 0x76, 0x7a, 0x09, 0xa6, 0x08, 0x76, 0x85, 0x8a, 0xb5, 0x92, 0x49, 0x8a, 0x23, 0x23, 0xdb, 0xd8, 0xd9, 0x15, 0x98, 0x22, 0xbc,
0x6f, 0x48, 0xb4, 0x37, 0x25, 0x86, 0x5e, 0x5a, 0x10, 0xd0, 0x2e, 0xcf, 0xf2, 0x24, 0xfe, 0xa5, 0x25, 0xd1, 0xde, 0x96, 0x18, 0x7a, 0x69, 0x41, 0x40, 0xbb, 0x3c, 0xcb, 0x93, 0xf8, 0x17, 0xbe,
0xef, 0x7e, 0x68, 0x7e, 0xfc, 0x91, 0x7f, 0xfd, 0x9c, 0xc3, 0xdd, 0x4d, 0xf3, 0x8a, 0x6d, 0xf4, 0xfb, 0xa1, 0xf9, 0xf1, 0x47, 0xfe, 0xf5, 0x73, 0x0e, 0x77, 0x37, 0xcd, 0x2b, 0xb6, 0xd1, 0x27,
0xd9, 0xbe, 0xac, 0x92, 0x5f, 0xb9, 0xc7, 0xb7, 0x77, 0x18, 0xb7, 0x2d, 0xf7, 0xd0, 0x73, 0xc3, 0xfb, 0xa2, 0x4a, 0x7e, 0xe5, 0x1e, 0xdf, 0xde, 0x61, 0xdc, 0xb6, 0xdc, 0x43, 0xcf, 0x0d, 0xc3,
0xe0, 0x1f, 0x6a, 0x41, 0xcd, 0x9b, 0xd5, 0xa6, 0x40, 0x91, 0x7b, 0xba, 0x48, 0x2d, 0x38, 0xf4, 0x7f, 0xa8, 0x05, 0x35, 0x6f, 0x56, 0x9b, 0x02, 0x45, 0xee, 0xe9, 0x22, 0xb5, 0xe0, 0xd0, 0x03,
0x05, 0x36, 0xfa, 0x0d, 0x87, 0x71, 0x33, 0x6c, 0x10, 0x99, 0x83, 0x23, 0x49, 0x73, 0xc2, 0x81, 0x6c, 0xf4, 0x1b, 0x0e, 0xe3, 0x66, 0xd8, 0x20, 0x32, 0x07, 0x47, 0x92, 0xe6, 0x84, 0x03, 0x2d,
0x16, 0x1a, 0xfb, 0x14, 0x75, 0xd1, 0x63, 0x0a, 0xcf, 0xf4, 0xed, 0x93, 0xe5, 0xed, 0x30, 0x32, 0x34, 0xf6, 0x29, 0xea, 0xa2, 0xc7, 0x14, 0x9e, 0xe9, 0xdb, 0x47, 0xcb, 0xdb, 0x61, 0x64, 0x34,
0x9a, 0x72, 0x86, 0x51, 0x20, 0xd7, 0x78, 0x53, 0x69, 0x4b, 0x93, 0x41, 0xa6, 0xae, 0x99, 0x27, 0xe5, 0x0c, 0xa3, 0x40, 0xae, 0xf1, 0xa6, 0xd2, 0x96, 0x26, 0x83, 0x4c, 0xdd, 0x30, 0x4f, 0x2a,
0x95, 0x04, 0x1c, 0x07, 0x38, 0x96, 0x37, 0xd7, 0x72, 0x59, 0x54, 0xc7, 0x34, 0xa7, 0x20, 0x70, 0x09, 0x38, 0x0e, 0x70, 0x2c, 0x6f, 0xaf, 0xe5, 0xb2, 0xa8, 0x8e, 0x69, 0x4e, 0x41, 0xe0, 0x1c,
0x0e, 0xd1, 0xa0, 0x76, 0x93, 0xf0, 0xe6, 0x81, 0x43, 0x6b, 0x5a, 0xa8, 0x74, 0x9e, 0xf0, 0x37, 0xa2, 0x41, 0xed, 0x26, 0xe1, 0xcd, 0x03, 0x87, 0xd6, 0xb4, 0x50, 0xe9, 0x3c, 0xe1, 0xaf, 0x49,
0xa4, 0xf6, 0xe5, 0x61, 0xdc, 0xbc, 0x80, 0x69, 0x10, 0x31, 0xb8, 0xfb, 0x4c, 0x6f, 0x7d, 0xe8, 0xed, 0x8b, 0xc3, 0xb8, 0x79, 0x01, 0xd3, 0x20, 0x62, 0x78, 0xff, 0x99, 0xde, 0xfa, 0xd0, 0x31,
0x98, 0x0e, 0x51, 0x05, 0x6d, 0xce, 0xdd, 0x38, 0x61, 0xeb, 0xc9, 0x42, 0xc1, 0xc6, 0x91, 0xb8, 0x1d, 0xa2, 0x0a, 0xda, 0x9c, 0xbb, 0x75, 0xc2, 0xd6, 0x93, 0x85, 0x82, 0x8d, 0x23, 0x71, 0x23,
0x96, 0x9b, 0x2d, 0xb9, 0xe9, 0xc4, 0xe7, 0x07, 0x83, 0xde, 0xa8, 0x9d, 0x1c, 0xd8, 0x43, 0x76, 0x37, 0x5b, 0x72, 0xd3, 0x89, 0xcf, 0xf7, 0x87, 0xbd, 0x51, 0x3b, 0x39, 0xb0, 0x87, 0xec, 0xad,
0xe5, 0xfb, 0x3c, 0xe5, 0x67, 0x5d, 0x01, 0x9b, 0x83, 0x41, 0x37, 0xd3, 0xb0, 0xcb, 0xd3, 0xb7, 0xef, 0xf3, 0x94, 0x9f, 0x75, 0x05, 0x6c, 0xf6, 0x87, 0xdd, 0x4c, 0xc3, 0xae, 0xce, 0xde, 0x3c,
0xcf, 0xd9, 0xa1, 0x2a, 0xab, 0xda, 0xb5, 0xa2, 0x2b, 0x38, 0xb7, 0xd4, 0x26, 0xe3, 0x1e, 0x24, 0x67, 0x87, 0xaa, 0xac, 0x6a, 0xd7, 0x8a, 0xae, 0xe0, 0xdc, 0x52, 0x9b, 0x8c, 0x7b, 0x90, 0xf0,
0xbc, 0x5f, 0x0f, 0x4d, 0xfe, 0xbb, 0x55, 0xff, 0xc5, 0xd7, 0x27, 0x00, 0x4b, 0x7c, 0x41, 0x9e, 0x7e, 0x3d, 0x34, 0xf9, 0xef, 0x56, 0xfd, 0x17, 0x5f, 0x9f, 0x00, 0x2c, 0xf1, 0x19, 0x79, 0x3e,
0xcf, 0x30, 0x92, 0xf9, 0x27, 0x55, 0x6e, 0x3d, 0xe9, 0x12, 0x65, 0x43, 0x99, 0x9c, 0xf0, 0x35, 0xc3, 0x48, 0xe6, 0x9f, 0x54, 0xb9, 0xf5, 0xa4, 0x4b, 0x94, 0x0d, 0x65, 0x72, 0xc2, 0xd7, 0xc4,
0x71, 0x10, 0x13, 0x06, 0x90, 0x55, 0x09, 0x87, 0xf4, 0xc1, 0x1b, 0x4f, 0x16, 0x7f, 0x83, 0x1a, 0x41, 0x4c, 0x18, 0x40, 0x56, 0x25, 0x1c, 0xd2, 0x07, 0x6f, 0x3c, 0x59, 0xfc, 0x0d, 0x6a, 0x48,
0x52, 0xbe, 0x40, 0x82, 0x81, 0xe9, 0x31, 0x3b, 0x19, 0x95, 0x72, 0xe6, 0x27, 0x2d, 0x68, 0xdc, 0xf9, 0x02, 0x09, 0x06, 0xa6, 0xc7, 0xec, 0x64, 0x54, 0xca, 0x99, 0x9f, 0xb4, 0xa0, 0x71, 0x3b,
0x4e, 0x38, 0xc1, 0x9e, 0xb0, 0x4c, 0xcd, 0x94, 0x63, 0xd8, 0x36, 0x01, 0x93, 0x00, 0x13, 0x03, 0xe1, 0x04, 0x7b, 0xc2, 0x32, 0x35, 0x53, 0x8e, 0x61, 0xdb, 0x04, 0x4c, 0x02, 0x4c, 0x0c, 0xe0,
0xf8, 0x29, 0x24, 0x3e, 0xec, 0x50, 0xa6, 0x0b, 0x6d, 0x9e, 0x3f, 0x98, 0x0a, 0x9a, 0x1f, 0x1f, 0xa7, 0x90, 0xf8, 0xb0, 0x43, 0x99, 0x2e, 0xb4, 0x79, 0xfe, 0x60, 0x2a, 0x68, 0x7e, 0x7c, 0xf8,
0x3e, 0x78, 0xf6, 0xf4, 0xe9, 0xd3, 0x17, 0xec, 0xaa, 0x94, 0x65, 0x6a, 0x56, 0x95, 0x93, 0x19, 0xe0, 0xd9, 0xd3, 0xa7, 0x4f, 0x0f, 0xd8, 0xdb, 0x52, 0x96, 0xa9, 0x59, 0x55, 0x4e, 0x66, 0xcc,
0x73, 0x46, 0x94, 0x76, 0xa1, 0xac, 0xa5, 0x0a, 0x61, 0xc7, 0xe8, 0x78, 0x06, 0xb5, 0x5e, 0x3a, 0x19, 0x51, 0xda, 0x85, 0xb2, 0x96, 0x2a, 0x84, 0x1d, 0xa3, 0xe3, 0x19, 0xd4, 0x7a, 0xe9, 0xd8,
0xb6, 0xcc, 0x25, 0xd5, 0x6f, 0x81, 0xa9, 0x85, 0x9a, 0x26, 0x5c, 0x0d, 0x59, 0xa6, 0xd9, 0xdb, 0x32, 0x97, 0x54, 0xbf, 0x05, 0xa6, 0x16, 0x6a, 0x9a, 0x70, 0x35, 0x64, 0x99, 0x66, 0x6f, 0x2e,
0x8b, 0x31, 0x03, 0x29, 0xb1, 0x95, 0xae, 0x0d, 0x9b, 0x88, 0x72, 0x8e, 0x97, 0xf4, 0x42, 0x9b, 0xc7, 0x0c, 0xa4, 0xc4, 0x56, 0xba, 0x36, 0x6c, 0x22, 0xca, 0x39, 0x5e, 0xd2, 0x0b, 0x6d, 0x42,
0x90, 0x8d, 0x4e, 0xcf, 0x43, 0x26, 0x5d, 0x1a, 0xb1, 0x4a, 0x95, 0x3b, 0xbd, 0x2e, 0xb0, 0xc6, 0x36, 0x3a, 0xbb, 0x08, 0x99, 0x74, 0x69, 0xc4, 0x2a, 0x55, 0xee, 0xf4, 0xba, 0xc0, 0x1a, 0xff,
0xff, 0x11, 0x7f, 0xb1, 0xa5, 0x32, 0x90, 0x68, 0x2d, 0xeb, 0x5f, 0x8c, 0x8f, 0x02, 0x66, 0xf5, 0x47, 0xfc, 0xc5, 0x96, 0xca, 0x40, 0xa2, 0xb5, 0xac, 0x7f, 0x39, 0x3e, 0x0a, 0x98, 0xd5, 0x53,
0xd4, 0x2d, 0x85, 0x91, 0xac, 0x19, 0xbb, 0x6e, 0xe1, 0xee, 0x81, 0x9a, 0xe8, 0x2f, 0x6b, 0xb8, 0xb7, 0x14, 0x46, 0xb2, 0x66, 0xec, 0xba, 0x83, 0xbb, 0x07, 0x6a, 0xa2, 0x3f, 0xaf, 0xe1, 0x7e,
0xdf, 0x5e, 0x34, 0x1e, 0x5e, 0x22, 0x20, 0x55, 0x6e, 0x00, 0xc4, 0xbd, 0x91, 0x6a, 0x0e, 0x5c, 0x73, 0xd9, 0x78, 0x78, 0x85, 0x80, 0x54, 0xb9, 0x01, 0x10, 0xdf, 0x8c, 0x54, 0x73, 0xe0, 0xf2,
0x5c, 0xde, 0x88, 0xca, 0xe3, 0x83, 0x16, 0xa1, 0xb1, 0x06, 0x82, 0x34, 0x01, 0x33, 0x98, 0x11, 0xea, 0x56, 0x54, 0x1e, 0xef, 0xb7, 0x08, 0x8d, 0x35, 0x10, 0xa4, 0x09, 0x98, 0xc1, 0x8c, 0x90,
0x32, 0xe4, 0x3d, 0xeb, 0xa6, 0x4a, 0x86, 0x11, 0xcb, 0xa2, 0x59, 0x91, 0x83, 0xac, 0x94, 0x84, 0x21, 0xef, 0x59, 0x37, 0x55, 0x32, 0x8c, 0x58, 0x16, 0xcd, 0x8a, 0x1c, 0x64, 0xa5, 0x24, 0x84,
0x90, 0x66, 0xa2, 0xb0, 0xba, 0xc5, 0xdc, 0xe5, 0x12, 0xd3, 0x83, 0x31, 0x80, 0x85, 0x75, 0xea, 0x34, 0x13, 0x85, 0xd5, 0x2d, 0xe6, 0x2e, 0x97, 0x98, 0x1e, 0x8c, 0x01, 0x2c, 0xac, 0x53, 0x07,
0xe0, 0x2a, 0xa4, 0x8e, 0x73, 0xb9, 0x5e, 0xa1, 0xf9, 0xa0, 0x2e, 0x32, 0x36, 0x91, 0x34, 0x48, 0x57, 0x21, 0x75, 0x9c, 0xcb, 0xf5, 0x0a, 0xcd, 0x07, 0x75, 0x91, 0xb1, 0x89, 0xa4, 0x41, 0xba,
0x97, 0x33, 0x88, 0xf1, 0x78, 0x42, 0x1d, 0xa6, 0xc3, 0x56, 0x79, 0x16, 0x35, 0xd8, 0x0c, 0x7a, 0x9c, 0x41, 0x8c, 0xc7, 0x13, 0xea, 0x30, 0x1d, 0xb6, 0xca, 0xb3, 0xa8, 0xc1, 0x66, 0xd8, 0x3b,
0x27, 0xca, 0x76, 0xd6, 0x34, 0xfb, 0x4a, 0xed, 0x90, 0x05, 0x04, 0x74, 0xc8, 0x34, 0x54, 0x9a, 0x51, 0xb6, 0xb3, 0xa6, 0xd9, 0x57, 0x6a, 0x87, 0x2c, 0x20, 0xa0, 0x43, 0xa6, 0xa1, 0xd2, 0x2c,
0xa5, 0x02, 0xe6, 0xa2, 0x64, 0x48, 0x15, 0xd4, 0x00, 0xec, 0x48, 0xf1, 0x60, 0xe4, 0x14, 0x85, 0x15, 0x30, 0x17, 0x25, 0x43, 0xaa, 0xa0, 0x06, 0x60, 0x47, 0x8a, 0x07, 0x23, 0xa7, 0x28, 0xbc,
0x97, 0xb3, 0xe6, 0x06, 0xb0, 0x46, 0x93, 0x90, 0x9f, 0x34, 0xb8, 0xab, 0x4d, 0x5e, 0x53, 0xa5, 0x9c, 0x35, 0x37, 0x80, 0x35, 0x9a, 0x84, 0xfc, 0xa4, 0xc1, 0x5d, 0x6d, 0xf2, 0x9a, 0x2a, 0x05,
0x20, 0xe1, 0x9a, 0x89, 0x86, 0x30, 0x07, 0x0b, 0xac, 0x1a, 0xeb, 0xbc, 0x6e, 0x35, 0xf5, 0xea, 0x09, 0xd7, 0x4c, 0x34, 0x84, 0x39, 0x58, 0x60, 0xd5, 0x58, 0xe7, 0x75, 0xab, 0xa9, 0x57, 0x5f,
0x0b, 0x0a, 0x13, 0xb6, 0x65, 0x8d, 0x49, 0xd9, 0xce, 0x61, 0xac, 0x06, 0xde, 0xbf, 0x13, 0x59, 0x50, 0x98, 0xb0, 0x2d, 0x6b, 0x4c, 0xca, 0x76, 0x0e, 0x63, 0x35, 0xf4, 0xfe, 0x9d, 0xc8, 0x72,
0xae, 0x98, 0x48, 0x53, 0x0a, 0x1f, 0x30, 0x79, 0xaf, 0x5e, 0x2b, 0xd6, 0xf1, 0x13, 0x9d, 0xa6, 0xc5, 0x44, 0x9a, 0x52, 0xf8, 0x80, 0xc9, 0x3b, 0xf5, 0x4a, 0xb1, 0x8e, 0x9f, 0xe8, 0x34, 0x9d,
0x93, 0x32, 0xbb, 0x37, 0x86, 0x6d, 0x44, 0xde, 0xf3, 0x46, 0x1a, 0xfd, 0xbd, 0x16, 0x29, 0x28, 0x94, 0xd9, 0x37, 0x63, 0xd8, 0x46, 0xe4, 0x1d, 0x6f, 0xa4, 0xd1, 0xdf, 0x2b, 0x91, 0x82, 0x22,
0x92, 0x20, 0x87, 0x9c, 0x1f, 0x1c, 0x7c, 0x37, 0x6a, 0x63, 0x77, 0x54, 0x14, 0x1b, 0xb5, 0xa2, 0x09, 0x72, 0xc8, 0xf9, 0xc1, 0xc1, 0xeb, 0x51, 0x1b, 0xbb, 0xa3, 0xa2, 0xd8, 0xa8, 0x15, 0x65,
0xcc, 0x58, 0x3b, 0x30, 0x22, 0xb7, 0xf0, 0x06, 0x80, 0x4b, 0x4a, 0x8c, 0x0e, 0x5b, 0x33, 0xf8, 0xc6, 0xda, 0x81, 0x11, 0xb9, 0x85, 0x37, 0x00, 0x5c, 0x52, 0x62, 0x74, 0xd8, 0x9a, 0xe1, 0xff,
0x3f, 0xaa, 0xe1, 0x68, 0x0b, 0x6f, 0x0f, 0x1f, 0x30, 0x86, 0x31, 0x48, 0x0b, 0x87, 0x20, 0xcf, 0x51, 0x0d, 0x47, 0x5b, 0x78, 0x7b, 0xf8, 0x80, 0x31, 0x8c, 0x41, 0x5a, 0x38, 0x04, 0x79, 0xee,
0x7d, 0x0c, 0x14, 0x65, 0x45, 0x2a, 0x69, 0x7c, 0x04, 0x7b, 0x36, 0xa3, 0x62, 0x97, 0xf9, 0xc4, 0x63, 0xa0, 0x28, 0x2b, 0x52, 0x49, 0xe3, 0x23, 0xd8, 0xb3, 0x19, 0x15, 0xbb, 0xcc, 0x27, 0xf6,
0x3e, 0xf9, 0xe3, 0xc1, 0xa8, 0xcb, 0xf2, 0x86, 0x74, 0x40, 0x37, 0x8f, 0x07, 0x3f, 0xa0, 0xc8, 0xc9, 0x1f, 0x0f, 0x47, 0x5d, 0x96, 0x37, 0xa4, 0x03, 0xba, 0x79, 0x3c, 0xfc, 0x01, 0x45, 0xbe,
0x2b, 0x62, 0xbb, 0xde, 0xb9, 0x28, 0x6b, 0x51, 0xf8, 0xb0, 0x74, 0x47, 0xd7, 0xdc, 0x67, 0x06, 0x25, 0xb6, 0xeb, 0x5d, 0x88, 0xb2, 0x16, 0x85, 0x0f, 0x4b, 0x77, 0x74, 0xcd, 0x7d, 0x66, 0x78,
0xc3, 0x26, 0x83, 0x8f, 0x4c, 0x56, 0xab, 0x52, 0x63, 0xd3, 0x8f, 0xca, 0xe7, 0x88, 0xca, 0xa7, 0xda, 0x64, 0xf0, 0x91, 0xc9, 0x6a, 0x55, 0x6a, 0x6c, 0xfa, 0x51, 0xf9, 0x1c, 0x51, 0xf9, 0xb4,
0xb5, 0x89, 0x98, 0xb4, 0xae, 0x40, 0x84, 0xef, 0x30, 0xd5, 0x69, 0xd3, 0x1a, 0x25, 0x3a, 0x26, 0x36, 0x11, 0x93, 0xd6, 0x15, 0x88, 0xf0, 0x1a, 0x53, 0x9d, 0x36, 0xad, 0x51, 0xa2, 0x63, 0xf2,
0x9f, 0x38, 0x8c, 0xd1, 0xe5, 0xbc, 0x61, 0xbc, 0x76, 0x64, 0x67, 0xbd, 0x1c, 0x09, 0x97, 0xf0, 0x89, 0xc3, 0x18, 0x5d, 0xce, 0x1b, 0xc6, 0x6b, 0x47, 0x76, 0xd6, 0xcb, 0x91, 0x70, 0x09, 0x8f,
0xb8, 0x05, 0x1c, 0x1d, 0x89, 0x6c, 0xee, 0xda, 0x33, 0xaa, 0xaf, 0x9d, 0xdc, 0x3b, 0xe1, 0xed, 0x5b, 0xc0, 0xd1, 0x91, 0xc8, 0xe6, 0xae, 0x3d, 0xa3, 0xfa, 0xda, 0xc9, 0xbd, 0x13, 0xde, 0x3e,
0xf3, 0x61, 0x2c, 0xd6, 0x81, 0x18, 0xf4, 0x5a, 0x7d, 0xeb, 0x97, 0x3e, 0x4b, 0xb7, 0xac, 0xf6, 0x1f, 0xc6, 0x62, 0x1d, 0x88, 0x61, 0xaf, 0xd5, 0xb7, 0x7e, 0xe9, 0xb3, 0x74, 0xcb, 0x6a, 0x3f,
0x43, 0x7b, 0x1b, 0x73, 0x3f, 0x97, 0xf9, 0x94, 0xab, 0x70, 0x11, 0x6d, 0xf4, 0x0d, 0x58, 0x07, 0xb4, 0xb7, 0x31, 0xf7, 0x73, 0x99, 0x4f, 0xb9, 0x0a, 0x17, 0xd1, 0x46, 0xdf, 0x90, 0x75, 0xd0,
0x5d, 0xef, 0x6e, 0xec, 0x7e, 0xd9, 0x9a, 0x65, 0xb3, 0x68, 0x34, 0x8d, 0x48, 0x4a, 0x78, 0xcb, 0xf5, 0xee, 0xc7, 0xee, 0x97, 0xad, 0x59, 0x36, 0x8b, 0x46, 0xd3, 0x88, 0xa4, 0x84, 0x77, 0xac,
0xea, 0xe0, 0x97, 0xc1, 0x95, 0xdf, 0xb6, 0x46, 0xb4, 0x49, 0xca, 0x0d, 0x63, 0xdd, 0x0b, 0x45, 0x0e, 0x7e, 0x19, 0xbe, 0xf5, 0xdb, 0xd6, 0x88, 0x36, 0x49, 0xb9, 0x61, 0xac, 0x6f, 0x42, 0xd1,
0xe7, 0x25, 0x6b, 0xd1, 0x00, 0x34, 0x2d, 0x12, 0xbd, 0x0d, 0x14, 0x84, 0x57, 0x07, 0xc3, 0x8d, 0x79, 0xc9, 0x5a, 0x34, 0x00, 0x4d, 0x8b, 0x44, 0x6f, 0x03, 0x05, 0xe1, 0xd5, 0xc1, 0x70, 0xeb,
0xbb, 0xc6, 0x0d, 0x30, 0x3a, 0x2c, 0x6e, 0xee, 0xd8, 0x20, 0xd2, 0xbb, 0x1b, 0x92, 0x83, 0xfb, 0xae, 0x71, 0x0b, 0x8c, 0x0e, 0x8b, 0xdb, 0x3b, 0x36, 0x88, 0xf4, 0xee, 0x87, 0x64, 0xff, 0xdb,
0x31, 0xb9, 0xa7, 0x7b, 0xde, 0x89, 0xc9, 0x41, 0xb8, 0x65, 0xfc, 0xb7, 0x80, 0x6c, 0xe1, 0x41, 0x98, 0x7c, 0xa3, 0x7b, 0xde, 0x8b, 0xc9, 0x7e, 0xb8, 0x65, 0xfc, 0xd7, 0x80, 0x6c, 0xe1, 0x41,
0x15, 0xd4, 0xfb, 0x5e, 0x09, 0x35, 0x8e, 0x50, 0x9b, 0x68, 0xd1, 0x89, 0x6f, 0x5e, 0xb0, 0x7c, 0x15, 0xd4, 0xfb, 0x5e, 0x09, 0x35, 0x8e, 0x50, 0x9b, 0x68, 0xd1, 0x89, 0x6f, 0x5f, 0xb0, 0x7c,
0x69, 0x5e, 0xfc, 0x3e, 0x7c, 0xf7, 0xfe, 0xdd, 0xe9, 0x78, 0xd8, 0xf4, 0x0e, 0xd0, 0xad, 0xa1, 0x69, 0x5e, 0xfe, 0x7e, 0x7a, 0xfd, 0xee, 0xfa, 0x6c, 0x7c, 0xda, 0xf4, 0x0e, 0xd0, 0xad, 0xa1,
0x3e, 0x73, 0xe7, 0x89, 0xc8, 0x87, 0xa3, 0x47, 0x17, 0xb1, 0x86, 0x6a, 0x6f, 0xca, 0x5b, 0x08, 0x3e, 0x73, 0xef, 0x89, 0xc8, 0x87, 0xa3, 0x47, 0x17, 0xb1, 0x86, 0x6a, 0x6f, 0xcb, 0x5b, 0x08,
0x22, 0x8d, 0x3f, 0x6a, 0x74, 0x13, 0x34, 0xc1, 0xe9, 0x36, 0x8d, 0x30, 0x70, 0xb9, 0x91, 0xbb, 0x22, 0x8d, 0x3f, 0x6a, 0x74, 0x13, 0x34, 0xc1, 0xe9, 0x36, 0x8d, 0x30, 0x70, 0xb9, 0x91, 0xbb,
0x9e, 0x18, 0xdb, 0xcb, 0x9e, 0x57, 0x37, 0x1c, 0x5d, 0x46, 0x6d, 0x5d, 0xbe, 0xbe, 0x83, 0xee, 0x9e, 0x18, 0xdb, 0xcb, 0x9e, 0x57, 0x77, 0x3a, 0xba, 0x8a, 0xda, 0xba, 0x7c, 0x75, 0x0f, 0xdd,
0xc3, 0x35, 0x75, 0x5b, 0x4f, 0x8e, 0x44, 0xc0, 0x13, 0xaa, 0xfc, 0x0c, 0xbd, 0x29, 0xea, 0xaa, 0x87, 0x6b, 0xea, 0xb6, 0x9e, 0x1c, 0x89, 0x80, 0x27, 0x54, 0xf9, 0x19, 0x7a, 0x53, 0xd4, 0x55,
0xe6, 0x68, 0x82, 0x4b, 0x56, 0x57, 0x2a, 0x6d, 0x39, 0x74, 0xbf, 0x5a, 0xa0, 0x0d, 0xe7, 0xf5, 0xcd, 0xd1, 0x04, 0x97, 0xac, 0xae, 0x54, 0xda, 0x72, 0xe8, 0x7e, 0xb5, 0x40, 0x1b, 0xce, 0xeb,
0x24, 0xc2, 0xcd, 0x31, 0x3e, 0x52, 0x26, 0xd5, 0x5a, 0xcf, 0x95, 0x8c, 0x69, 0x26, 0x8c, 0xd1, 0x49, 0x84, 0x9b, 0x63, 0x7c, 0xa4, 0x4c, 0xaa, 0xb5, 0x9e, 0x2b, 0x19, 0xd3, 0x4c, 0x18, 0xa3,
0xbd, 0x85, 0x99, 0xd1, 0x8f, 0x29, 0x9f, 0x26, 0x05, 0x5a, 0x26, 0x1f, 0xd0, 0x32, 0xa5, 0x42, 0x7b, 0x0b, 0x33, 0xa3, 0x1f, 0x53, 0x3e, 0x4e, 0x0a, 0xb4, 0x4c, 0x3e, 0xa4, 0x65, 0x4a, 0x85,
0x8f, 0x5d, 0x4b, 0x43, 0x64, 0xc3, 0xf6, 0xa2, 0xfd, 0x27, 0x11, 0xfe, 0x45, 0xfb, 0x9f, 0xce, 0x1e, 0xbb, 0x91, 0x86, 0xc8, 0x86, 0x0d, 0xa2, 0xbd, 0x27, 0xd1, 0x20, 0xda, 0x8f, 0x06, 0x1f,
0xcf, 0xd7, 0xdc, 0xf5, 0x33, 0x5a, 0x96, 0x6a, 0xae, 0x62, 0x7f, 0x83, 0xa0, 0xc1, 0x59, 0x1b, 0x2f, 0x2e, 0xd6, 0xdc, 0xf5, 0x33, 0x5a, 0x96, 0x6a, 0xae, 0x62, 0x7f, 0x83, 0xa0, 0xc1, 0x59,
0xbb, 0x0b, 0x76, 0xdc, 0x4d, 0x8d, 0xcc, 0x14, 0xa5, 0x6b, 0xef, 0xb6, 0x0d, 0xdb, 0x5b, 0xd1, 0x1b, 0xbb, 0x0b, 0x76, 0xdc, 0x4d, 0x8d, 0xcc, 0x14, 0xa5, 0x6b, 0xef, 0xae, 0x0d, 0xdb, 0x5b,
0xc1, 0x25, 0xdd, 0x85, 0xc0, 0x84, 0x4a, 0x36, 0xb4, 0x6a, 0x2b, 0x99, 0x2a, 0xb0, 0x8f, 0x43, 0xd1, 0xc1, 0x25, 0xdd, 0x85, 0xc0, 0x84, 0x4a, 0x36, 0xb4, 0x6a, 0x2b, 0x99, 0x2a, 0xb0, 0x8f,
0x87, 0x98, 0xaf, 0x8b, 0xb8, 0x77, 0xc4, 0xf2, 0x1a, 0x0d, 0xc4, 0xaf, 0xfa, 0x1e, 0x89, 0x56, 0x43, 0x87, 0x98, 0xaf, 0x8b, 0xb8, 0x77, 0xc4, 0xf2, 0x1a, 0x0d, 0xc4, 0xaf, 0xfa, 0x1e, 0x89,
0x80, 0x1b, 0x80, 0x59, 0xe1, 0x4a, 0x8a, 0xde, 0xa5, 0x19, 0x0d, 0x81, 0x40, 0x0d, 0x34, 0xd9, 0x56, 0x80, 0x1b, 0x80, 0x59, 0xe1, 0x4a, 0x8a, 0xde, 0xa5, 0x19, 0x0d, 0x81, 0x40, 0x0d, 0x34,
0xfc, 0x5a, 0xe1, 0xc7, 0xe2, 0x9d, 0xce, 0xa3, 0x5e, 0x3f, 0x0d, 0xd8, 0xc1, 0xde, 0xfe, 0xaf, 0xd9, 0xfc, 0x5a, 0xe1, 0xc7, 0xe2, 0x9d, 0xce, 0xa3, 0x5e, 0x3f, 0x0d, 0xd8, 0xfe, 0x60, 0xef,
0xbb, 0x07, 0x7b, 0x07, 0x07, 0xec, 0x55, 0x6e, 0x70, 0xdf, 0x53, 0xe0, 0xd1, 0x51, 0x9a, 0x2f, 0xd7, 0xdd, 0xfd, 0xc1, 0xfe, 0x3e, 0x7b, 0x99, 0x1b, 0xdc, 0xf7, 0x14, 0x78, 0x74, 0x94, 0xe6,
0xe9, 0xb6, 0xdc, 0xb6, 0xad, 0x33, 0x34, 0x34, 0x5c, 0x44, 0x80, 0x3e, 0x8c, 0x6a, 0xba, 0xee, 0x4b, 0xba, 0x2d, 0xb7, 0x6d, 0xeb, 0x1c, 0x0d, 0x0d, 0x17, 0x11, 0xa0, 0x0f, 0xa3, 0x9a, 0xae,
0x4f, 0x81, 0x31, 0x29, 0xf4, 0x24, 0x5e, 0xe0, 0xa2, 0x28, 0x4d, 0x7c, 0x76, 0xfa, 0x6a, 0xf8, 0xfb, 0x53, 0x60, 0x4c, 0x0a, 0x3d, 0x89, 0x17, 0xb8, 0x28, 0x4a, 0x13, 0x9f, 0x9f, 0xbd, 0x3c,
0x76, 0x34, 0xfc, 0x36, 0x0a, 0xbd, 0xf3, 0xd3, 0x31, 0x2b, 0x1a, 0x4d, 0xde, 0x41, 0xb4, 0xba, 0x7d, 0x33, 0x3a, 0xfd, 0x3a, 0x0a, 0xbd, 0x8b, 0xb3, 0x31, 0x2b, 0x1a, 0x4d, 0xde, 0x41, 0xb4,
0xce, 0xd0, 0x91, 0x34, 0xf0, 0x0a, 0x6e, 0x58, 0x8b, 0x86, 0x09, 0x6a, 0xc5, 0xcd, 0xad, 0xec, 0xba, 0xce, 0xd0, 0x91, 0x34, 0xf0, 0x0a, 0x6e, 0x58, 0x8b, 0x86, 0x09, 0x6a, 0xc5, 0xcd, 0xad,
0x38, 0xc1, 0xaa, 0x8a, 0x53, 0xf5, 0xfa, 0x5b, 0x2d, 0xf3, 0x17, 0x55, 0x22, 0x7d, 0xda, 0xd2, 0xec, 0x38, 0xc1, 0xaa, 0x8a, 0x53, 0xf5, 0xfa, 0x5b, 0x2d, 0xf3, 0x17, 0x55, 0x22, 0x7d, 0xda,
0x30, 0x2c, 0x55, 0x0c, 0xf1, 0x45, 0xf3, 0x4b, 0xc0, 0x77, 0x47, 0xdc, 0x6f, 0x27, 0xdc, 0xde, 0xd2, 0x30, 0x2c, 0x55, 0x0c, 0xf1, 0x45, 0xf3, 0x4b, 0xc0, 0x77, 0x47, 0xdc, 0xaf, 0x27, 0xdc,
0x4f, 0x8d, 0xb8, 0x31, 0xf5, 0x1d, 0x7c, 0xd0, 0x64, 0x4f, 0x63, 0x3e, 0xfd, 0xd2, 0xf8, 0x3f, 0xde, 0x4f, 0x8d, 0xb8, 0x31, 0xf5, 0x1d, 0x7c, 0xd0, 0x64, 0x4f, 0x63, 0x3e, 0xfd, 0xd2, 0xf8,
0xd8, 0x52, 0x0d, 0x37, 0x79, 0x14, 0x00, 0x00 0x3f, 0x10, 0x73, 0x7a, 0x48, 0x79, 0x14, 0x00, 0x00
}; };
// Autogenerated from wled00/data/settings_um.htm, do not edit!! // Autogenerated from wled00/data/settings_um.htm, do not edit!!
const uint16_t PAGE_settings_um_length = 2721; const uint16_t PAGE_settings_um_length = 2721;
const uint8_t PAGE_settings_um[] PROGMEM = { const uint8_t PAGE_settings_um[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xcd, 0x59, 0x5b, 0x73, 0xdb, 0xb8, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xcd, 0x59, 0x5b, 0x73, 0xdb, 0xb8,
0x15, 0x7e, 0xd7, 0xaf, 0xa0, 0x11, 0x8f, 0x4d, 0x8e, 0x69, 0x4a, 0x4e, 0x76, 0x3b, 0x59, 0x49, 0x15, 0x7e, 0xd7, 0xaf, 0xa0, 0x11, 0x8f, 0x4d, 0x8e, 0x69, 0x4a, 0x4e, 0x76, 0x3b, 0x59, 0x49,
0x90, 0x9b, 0x38, 0xc9, 0x46, 0x8d, 0xb3, 0xf6, 0x54, 0x7b, 0x99, 0x8e, 0xeb, 0x89, 0x69, 0x11, 0x90, 0x9b, 0x38, 0xc9, 0x46, 0x8d, 0xb3, 0xf6, 0x54, 0x7b, 0x99, 0x8e, 0xeb, 0x89, 0x69, 0x11,
0x92, 0x10, 0x53, 0x00, 0x4b, 0x80, 0xbe, 0x54, 0xd6, 0x7f, 0xef, 0x77, 0x40, 0x52, 0xa2, 0x7c, 0x92, 0x10, 0x53, 0x00, 0x4b, 0x80, 0xbe, 0x54, 0xd6, 0x7f, 0xef, 0x77, 0x40, 0x52, 0xa2, 0x7c,
@@ -1802,7 +1802,7 @@ const uint8_t PAGE_settings_um[] PROGMEM = {
// Autogenerated from wled00/data/settings_2D.htm, do not edit!! // Autogenerated from wled00/data/settings_2D.htm, do not edit!!
const uint16_t PAGE_settings_2D_length = 1754; const uint16_t PAGE_settings_2D_length = 1754;
const uint8_t PAGE_settings_2D[] PROGMEM = { const uint8_t PAGE_settings_2D[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x8d, 0x58, 0x6d, 0x73, 0xdb, 0x36, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x8d, 0x58, 0x6d, 0x73, 0xdb, 0x36,
0x12, 0xfe, 0xce, 0x5f, 0x01, 0x63, 0x3a, 0x2d, 0xd9, 0x50, 0x94, 0xe4, 0xde, 0x75, 0x3a, 0x16, 0x12, 0xfe, 0xce, 0x5f, 0x01, 0x63, 0x3a, 0x2d, 0xd9, 0x50, 0x94, 0xe4, 0xde, 0x75, 0x3a, 0x16,
0x49, 0x37, 0x6e, 0xdc, 0xda, 0x1d, 0x7b, 0xe2, 0x89, 0x72, 0xce, 0xdc, 0x5c, 0x3a, 0x29, 0x44, 0x49, 0x37, 0x6e, 0xdc, 0xda, 0x1d, 0x7b, 0xe2, 0x89, 0x72, 0xce, 0xdc, 0x5c, 0x3a, 0x29, 0x44,
0xae, 0x44, 0xc4, 0x24, 0xc0, 0x01, 0x20, 0xd9, 0xae, 0xe2, 0xff, 0x7e, 0x0b, 0x90, 0x12, 0x25, 0xae, 0x44, 0xc4, 0x24, 0xc0, 0x01, 0x20, 0xd9, 0xae, 0xe2, 0xff, 0x7e, 0x0b, 0x90, 0x12, 0x25,
@@ -1918,7 +1918,7 @@ const uint8_t PAGE_settings_2D[] PROGMEM = {
// Autogenerated from wled00/data/settings_pin.htm, do not edit!! // Autogenerated from wled00/data/settings_pin.htm, do not edit!!
const uint16_t PAGE_settings_pin_length = 471; const uint16_t PAGE_settings_pin_length = 471;
const uint8_t PAGE_settings_pin[] PROGMEM = { const uint8_t PAGE_settings_pin[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x5d, 0x52, 0x4d, 0x6f, 0x13, 0x31, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x5d, 0x52, 0x4d, 0x6f, 0x13, 0x31,
0x10, 0xbd, 0xef, 0xaf, 0x30, 0x73, 0x69, 0x82, 0x92, 0x6c, 0xa8, 0xa8, 0x04, 0xaa, 0xbd, 0x42, 0x10, 0xbd, 0xef, 0xaf, 0x30, 0x73, 0x69, 0x82, 0x92, 0x6c, 0xa8, 0xa8, 0x04, 0xaa, 0xbd, 0x42,
0x81, 0x1e, 0xb8, 0x94, 0x48, 0xe5, 0x52, 0x55, 0x55, 0xe5, 0xd8, 0xb3, 0x89, 0x55, 0x7f, 0x2c, 0x81, 0x1e, 0xb8, 0x94, 0x48, 0xe5, 0x52, 0x55, 0x55, 0xe5, 0xd8, 0xb3, 0x89, 0x55, 0x7f, 0x2c,
0xb6, 0x37, 0x21, 0x54, 0xfc, 0x77, 0xc6, 0xbb, 0xa1, 0xa0, 0x5c, 0xd6, 0x7e, 0x33, 0xe3, 0x37, 0xb6, 0x37, 0x21, 0x54, 0xfc, 0x77, 0xc6, 0xbb, 0xa1, 0xa0, 0x5c, 0xd6, 0x7e, 0x33, 0xe3, 0x37,

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

75
wled00/net_debug.cpp Normal file
View File

@@ -0,0 +1,75 @@
#include "wled.h"
#ifdef WLED_DEBUG_HOST
NetworkDebugPrinter NetDebug;
void NetworkDebugPrinter::print(const char *s, bool newline) {
if (!WLED_CONNECTED || !udpConnected || s == nullptr) return;
if (!debugPrintHostIP && !debugPrintHostIP.fromString(netDebugPrintHost)) {
#ifdef ESP8266
WiFi.hostByName(netDebugPrintHost, debugPrintHostIP, 750);
#else
#ifdef WLED_USE_ETHERNET
ETH.hostByName(netDebugPrintHost, debugPrintHostIP);
#else
WiFi.hostByName(netDebugPrintHost, debugPrintHostIP);
#endif
#endif
}
WiFiUDP debugUdp;
debugUdp.beginPacket(debugPrintHostIP, netDebugPrintPort);
debugUdp.write(reinterpret_cast<const uint8_t *>(s), strlen(s));
if (newline) debugUdp.write('\n');
debugUdp.endPacket();
}
void NetworkDebugPrinter::print(const __FlashStringHelper* s, bool newline) {
char buf[512];
strncpy_P(buf, (PGM_P)s, 512);
print(buf, newline);
}
void NetworkDebugPrinter::print(String s) {
print(s.c_str());
}
void NetworkDebugPrinter::print(unsigned int n, bool newline) {
char s[10];
snprintf_P(s, sizeof(s), PSTR("%d"), n);
s[9] = '\0';
print(s, newline);
}
void NetworkDebugPrinter::println() {
print("", true);
}
void NetworkDebugPrinter::println(const char *s) {
print(s, true);
}
void NetworkDebugPrinter::println(const __FlashStringHelper* s) {
print(s, true);
}
void NetworkDebugPrinter::println(String s) {
print(s.c_str(), true);
}
void NetworkDebugPrinter::println(unsigned int n) {
print(n, true);
}
void NetworkDebugPrinter::printf(const char *fmt...) {
va_list args;
va_start(args, fmt);
char s[1024];
vsnprintf(s, sizeof(s), fmt, args);
va_end(args);
print(s);
}
#endif

25
wled00/net_debug.h Normal file
View File

@@ -0,0 +1,25 @@
#ifndef WLED_NET_DEBUG_H
#define WLED_NET_DEBUG_H
#include <WString.h>
#include <WiFiUdp.h>
class NetworkDebugPrinter {
private:
IPAddress debugPrintHostIP;
public:
void print(const char *s, bool newline = false);
void print(const __FlashStringHelper* s, bool newline = false);
void print(String s);
void print(unsigned int n, bool newline = false);
void println();
void println(const char *s);
void println(const __FlashStringHelper* s);
void println(String s);
void println(unsigned int n);
void printf(const char *fmt, ...);
};
extern NetworkDebugPrinter NetDebug;
#endif

View File

@@ -947,11 +947,13 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
} else { } else {
nightlightActive = true; nightlightActive = true;
if (!aNlDef) nightlightDelayMins = getNumVal(&req, pos); if (!aNlDef) nightlightDelayMins = getNumVal(&req, pos);
else nightlightDelayMins = nightlightDelayMinsDefault;
nightlightStartTime = millis(); nightlightStartTime = millis();
} }
} else if (aNlDef) } else if (aNlDef)
{ {
nightlightActive = true; nightlightActive = true;
nightlightDelayMins = nightlightDelayMinsDefault;
nightlightStartTime = millis(); nightlightStartTime = millis();
} }

View File

@@ -4,7 +4,7 @@
* UDP sync notifier / Realtime / Hyperion / TPM2.NET * UDP sync notifier / Realtime / Hyperion / TPM2.NET
*/ */
#define UDP_SEG_SIZE 28 #define UDP_SEG_SIZE 36
#define SEG_OFFSET (41+(MAX_NUM_SEGMENTS*UDP_SEG_SIZE)) #define SEG_OFFSET (41+(MAX_NUM_SEGMENTS*UDP_SEG_SIZE))
#define WLEDPACKETSIZE (41+(MAX_NUM_SEGMENTS*UDP_SEG_SIZE)+0) #define WLEDPACKETSIZE (41+(MAX_NUM_SEGMENTS*UDP_SEG_SIZE)+0)
#define UDP_IN_MAXSIZE 1472 #define UDP_IN_MAXSIZE 1472
@@ -46,7 +46,8 @@ void notify(byte callMode, bool followUp)
//3: supports FX intensity, 24 byte packet 4: supports transitionDelay 5: sup palette //3: supports FX intensity, 24 byte packet 4: supports transitionDelay 5: sup palette
//6: supports timebase syncing, 29 byte packet 7: supports tertiary color 8: supports sys time sync, 36 byte packet //6: supports timebase syncing, 29 byte packet 7: supports tertiary color 8: supports sys time sync, 36 byte packet
//9: supports sync groups, 37 byte packet 10: supports CCT, 39 byte packet 11: per segment options, variable packet length (40+MAX_NUM_SEGMENTS*3) //9: supports sync groups, 37 byte packet 10: supports CCT, 39 byte packet 11: per segment options, variable packet length (40+MAX_NUM_SEGMENTS*3)
udpOut[11] = 11; //12: enhanced effct sliders, 2D & mapping options
udpOut[11] = 12;
col = mainseg.colors[1]; col = mainseg.colors[1];
udpOut[12] = R(col); udpOut[12] = R(col);
udpOut[13] = G(col); udpOut[13] = G(col);
@@ -105,7 +106,7 @@ void notify(byte callMode, bool followUp)
udpOut[6 +ofs] = selseg.spacing; udpOut[6 +ofs] = selseg.spacing;
udpOut[7 +ofs] = selseg.offset >> 8; udpOut[7 +ofs] = selseg.offset >> 8;
udpOut[8 +ofs] = selseg.offset & 0xFF; udpOut[8 +ofs] = selseg.offset & 0xFF;
udpOut[9 +ofs] = selseg.options & 0x0F; //only take into account mirrored, selected, on, reversed udpOut[9 +ofs] = selseg.options & 0x8F; //only take into account selected, mirrored, on, reversed, reverse_y (for 2D); ignore freeze, reset, transitional
udpOut[10+ofs] = selseg.opacity; udpOut[10+ofs] = selseg.opacity;
udpOut[11+ofs] = selseg.mode; udpOut[11+ofs] = selseg.mode;
udpOut[12+ofs] = selseg.speed; udpOut[12+ofs] = selseg.speed;
@@ -124,6 +125,14 @@ void notify(byte callMode, bool followUp)
udpOut[25+ofs] = B(selseg.colors[2]); udpOut[25+ofs] = B(selseg.colors[2]);
udpOut[26+ofs] = W(selseg.colors[2]); udpOut[26+ofs] = W(selseg.colors[2]);
udpOut[27+ofs] = selseg.cct; udpOut[27+ofs] = selseg.cct;
udpOut[28+ofs] = (selseg.options>>8) & 0xFF; //mirror_y, transpose, 2D mapping & sound
udpOut[29+ofs] = selseg.custom1;
udpOut[30+ofs] = selseg.custom2;
udpOut[31+ofs] = selseg.custom3 | (selseg.check1<<5) | (selseg.check2<<6) | (selseg.check3<<7);
udpOut[32+ofs] = selseg.startY >> 8;
udpOut[33+ofs] = selseg.startY & 0xFF;
udpOut[34+ofs] = selseg.stopY >> 8;
udpOut[35+ofs] = selseg.stopY & 0xFF;
++s; ++s;
} }
@@ -325,9 +334,9 @@ void handleNotifications()
if (version > 6) { if (version > 6) {
strip.setColor(2, RGBW32(udpIn[20], udpIn[21], udpIn[22], udpIn[23])); // tertiary color strip.setColor(2, RGBW32(udpIn[20], udpIn[21], udpIn[22], udpIn[23])); // tertiary color
if (version > 9 && version < 200 && udpIn[37] < 255) { // valid CCT/Kelvin value if (version > 9 && version < 200 && udpIn[37] < 255) { // valid CCT/Kelvin value
uint8_t cct = udpIn[38]; uint16_t cct = udpIn[38];
if (udpIn[37] > 0) { //Kelvin if (udpIn[37] > 0) { //Kelvin
cct = (((udpIn[37] << 8) + udpIn[38]) - 1900) >> 5; cct |= (udpIn[37] << 8);
} }
strip.setCCT(cct); strip.setCCT(cct);
} }
@@ -346,15 +355,19 @@ void handleNotifications()
uint16_t ofs = 41 + i*udpIn[40]; //start of segment offset byte uint16_t ofs = 41 + i*udpIn[40]; //start of segment offset byte
uint8_t id = udpIn[0 +ofs]; uint8_t id = udpIn[0 +ofs];
if (id > strip.getSegmentsNum()) break; if (id > strip.getSegmentsNum()) break;
Segment& selseg = strip.getSegment(id); Segment& selseg = strip.getSegment(id);
uint16_t start = (udpIn[1+ofs] << 8 | udpIn[2+ofs]); if (!selseg.isActive() || !selseg.isSelected()) continue; //do not apply to non selected segments
uint16_t stop = (udpIn[3+ofs] << 8 | udpIn[4+ofs]);
uint16_t startY = 0, start = (udpIn[1+ofs] << 8 | udpIn[2+ofs]);
uint16_t stopY = 1, stop = (udpIn[3+ofs] << 8 | udpIn[4+ofs]);
uint16_t offset = (udpIn[7+ofs] << 8 | udpIn[8+ofs]); uint16_t offset = (udpIn[7+ofs] << 8 | udpIn[8+ofs]);
if (!receiveSegmentOptions) { if (!receiveSegmentOptions) {
strip.setSegment(id, start, stop, selseg.grouping, selseg.spacing, offset); strip.setSegment(id, start, stop, selseg.grouping, selseg.spacing, offset, startY, stopY);
continue; continue;
} }
for (size_t j = 0; j<4; j++) selseg.setOption(j, (udpIn[9 +ofs] >> j) & 0x01); //only take into account mirrored, selected, on, reversed //for (size_t j = 1; j<4; j++) selseg.setOption(j, (udpIn[9 +ofs] >> j) & 0x01); //only take into account mirrored, on, reversed; ignore selected
selseg.options = (selseg.options & 0x0071U) | (udpIn[9 +ofs] & 0x0E); // ignore selected, freeze, reset & transitional
selseg.setOpacity(udpIn[10+ofs]); selseg.setOpacity(udpIn[10+ofs]);
if (applyEffects) { if (applyEffects) {
strip.setMode(id, udpIn[11+ofs]); strip.setMode(id, udpIn[11+ofs]);
@@ -368,11 +381,26 @@ void handleNotifications()
selseg.setColor(2, RGBW32(udpIn[23+ofs],udpIn[24+ofs],udpIn[25+ofs],udpIn[26+ofs])); selseg.setColor(2, RGBW32(udpIn[23+ofs],udpIn[24+ofs],udpIn[25+ofs],udpIn[26+ofs]));
selseg.setCCT(udpIn[27+ofs]); selseg.setCCT(udpIn[27+ofs]);
} }
if (version > 11) {
// when applying synced options ignore selected as it may be used as indicator of which segments to sync
// freeze, reset & transitional should never be synced
selseg.options = (selseg.options & 0x0071U) | (udpIn[28+ofs]<<8) | (udpIn[9 +ofs] & 0x8E); // ignore selected, freeze, reset & transitional
if (applyEffects) {
selseg.custom1 = udpIn[29+ofs];
selseg.custom2 = udpIn[30+ofs];
selseg.custom3 = udpIn[31+ofs] & 0x1F;
selseg.check1 = (udpIn[31+ofs]>>5) & 0x1;
selseg.check1 = (udpIn[31+ofs]>>6) & 0x1;
selseg.check1 = (udpIn[31+ofs]>>7) & 0x1;
}
startY = (udpIn[32+ofs] << 8 | udpIn[33+ofs]);
stopY = (udpIn[34+ofs] << 8 | udpIn[35+ofs]);
}
//setSegment() also properly resets segments //setSegment() also properly resets segments
if (receiveSegmentBounds) { if (receiveSegmentBounds) {
strip.setSegment(id, start, stop, udpIn[5+ofs], udpIn[6+ofs], offset); strip.setSegment(id, start, stop, udpIn[5+ofs], udpIn[6+ofs], offset, startY, stopY);
} else { } else {
strip.setSegment(id, selseg.start, selseg.stop, udpIn[5+ofs], udpIn[6+ofs], selseg.offset); strip.setSegment(id, selseg.start, selseg.stop, udpIn[5+ofs], udpIn[6+ofs], selseg.offset, selseg.startY, selseg.stopY);
} }
} }
stateChanged = true; stateChanged = true;
@@ -632,6 +660,12 @@ void sendSysInfoUDP()
memcpy((byte *)data + 6, serverDescription, 32); memcpy((byte *)data + 6, serverDescription, 32);
#ifdef ESP8266 #ifdef ESP8266
data[38] = NODE_TYPE_ID_ESP8266; data[38] = NODE_TYPE_ID_ESP8266;
#elif defined(CONFIG_IDF_TARGET_ESP32C3)
data[38] = NODE_TYPE_ID_ESP32C3;
#elif defined(CONFIG_IDF_TARGET_ESP32S3)
data[38] = NODE_TYPE_ID_ESP32S3;
#elif defined(CONFIG_IDF_TARGET_ESP32S2)
data[38] = NODE_TYPE_ID_ESP32S2;
#elif defined(ARDUINO_ARCH_ESP32) #elif defined(ARDUINO_ARCH_ESP32)
data[38] = NODE_TYPE_ID_ESP32; data[38] = NODE_TYPE_ID_ESP32;
#else #else

View File

@@ -8,7 +8,7 @@
*/ */
// version code in format yymmddb (b = daily build) // version code in format yymmddb (b = daily build)
#define VERSION 2211071 #define VERSION 2211081
//uncomment this if you have a "my_config.h" file you'd like to use //uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG //#define WLED_USE_MY_CONFIG
@@ -95,6 +95,10 @@
#include "my_config.h" #include "my_config.h"
#endif #endif
#ifdef WLED_DEBUG_HOST
#include "net_debug.h"
#endif
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#ifdef WLED_ADD_EEPROM_SUPPORT #ifdef WLED_ADD_EEPROM_SUPPORT
#include <EEPROM.h> #include <EEPROM.h>
@@ -670,13 +674,27 @@ WLED_GLOBAL StaticJsonDocument<JSON_BUFFER_SIZE> doc;
WLED_GLOBAL volatile uint8_t jsonBufferLock _INIT(0); WLED_GLOBAL volatile uint8_t jsonBufferLock _INIT(0);
// enable additional debug output // enable additional debug output
#if defined(WLED_DEBUG_HOST)
// On the host side, use netcat to receive the log statements: nc -l 7868 -u
// use -D WLED_DEBUG_HOST='"192.168.xxx.xxx"' or FQDN within quotes
#define DEBUGOUT NetDebug
WLED_GLOBAL char netDebugPrintHost[33] _INIT(WLED_DEBUG_HOST);
#if defined(WLED_DEBUG_NET_PORT)
WLED_GLOBAL int netDebugPrintPort _INIT(WLED_DEBUG_PORT);
#else
WLED_GLOBAL int netDebugPrintPort _INIT(7868);
#endif
#else
#define DEBUGOUT Serial
#endif
#ifdef WLED_DEBUG #ifdef WLED_DEBUG
#ifndef ESP8266 #ifndef ESP8266
#include <rom/rtc.h> #include <rom/rtc.h>
#endif #endif
#define DEBUG_PRINT(x) Serial.print(x) #define DEBUG_PRINT(x) DEBUGOUT.print(x)
#define DEBUG_PRINTLN(x) Serial.println(x) #define DEBUG_PRINTLN(x) DEBUGOUT.println(x)
#define DEBUG_PRINTF(x...) Serial.printf(x) #define DEBUG_PRINTF(x...) DEBUGOUT.printf(x)
#else #else
#define DEBUG_PRINT(x) #define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x) #define DEBUG_PRINTLN(x)
@@ -684,9 +702,9 @@ WLED_GLOBAL volatile uint8_t jsonBufferLock _INIT(0);
#endif #endif
#ifdef WLED_DEBUG_FS #ifdef WLED_DEBUG_FS
#define DEBUGFS_PRINT(x) Serial.print(x) #define DEBUGFS_PRINT(x) DEBUGOUT.print(x)
#define DEBUGFS_PRINTLN(x) Serial.println(x) #define DEBUGFS_PRINTLN(x) DEBUGOUT.println(x)
#define DEBUGFS_PRINTF(x...) Serial.printf(x) #define DEBUGFS_PRINTF(x...) DEBUGOUT.printf(x)
#else #else
#define DEBUGFS_PRINT(x) #define DEBUGFS_PRINT(x)
#define DEBUGFS_PRINTLN(x) #define DEBUGFS_PRINTLN(x)

View File

@@ -227,6 +227,7 @@
<ClCompile Include="wled_eeprom.cpp" /> <ClCompile Include="wled_eeprom.cpp" />
<ClCompile Include="wled_server.cpp" /> <ClCompile Include="wled_server.cpp" />
<ClCompile Include="xml.cpp" /> <ClCompile Include="xml.cpp" />
<ClCompile Include="net_debug.cpp" />
</ItemGroup> </ItemGroup>
<PropertyGroup> <PropertyGroup>
<DebuggerFlavor>VisualMicroDebugger</DebuggerFlavor> <DebuggerFlavor>VisualMicroDebugger</DebuggerFlavor>

View File

@@ -719,7 +719,13 @@ void getSettingsJS(byte subPage, char* dest)
oappend(SET_F("_")); oappend(SET_F("_"));
oappend(releaseString); oappend(releaseString);
oappend(SET_F(".bin")); oappend(SET_F(".bin"));
#ifdef ARDUINO_ARCH_ESP32 #if defined(CONFIG_IDF_TARGET_ESP32C3)
oappend(SET_F("<br>(ESP32-C3"));
#elif defined(CONFIG_IDF_TARGET_ESP32S3)
oappend(SET_F("<br>(ESP32-S3"));
#elif defined(CONFIG_IDF_TARGET_ESP32S2)
oappend(SET_F("<br>(ESP32-S2"));
#elif defined(ARDUINO_ARCH_ESP32)
oappend(SET_F("<br>(ESP32")); oappend(SET_F("<br>(ESP32"));
#else #else
oappend(SET_F("<br>(ESP8266")); oappend(SET_F("<br>(ESP8266"));