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",
"version": "0.14.0.1.1_MM",
"version": "0.14.0.2.0_MM",
"description": "Tools for WLED project",
"main": "tools/cdata.js",
"directories": {

View File

@@ -41,15 +41,16 @@
; 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_max ; recommended
default_envs = esp32_4MB_max ; recommended default
; default_envs = esp32_16MB_max
; default_envs = esp8266_4MB_min
; default_envs = esp32_4MB_PSRAM_max
; default_envs = esp32S3_8MB_max
; default_envs = wemos_shield_esp32_4MB_max
; default_envs = wemos_shield_esp32_16MB_max
; default_envs = esp32_pico_4MB_max
src_dir = ./wled00

View File

@@ -65,7 +65,7 @@ class Animated_Staircase : public Usermod {
// The maximum number of configured segments.
// Dynamically updated based on user configuration.
byte maxSegmentId = 1;
byte mainSegmentId = 0;
byte minSegmentId = 0;
// These values are used by the API to read the
// last sensor state, or trigger a sensor
@@ -91,8 +91,7 @@ class Animated_Staircase : public Usermod {
static const char _topEchoCm[];
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
if (WLED_MQTT_CONNECTED){
char subuf[64];
@@ -102,16 +101,11 @@ class Animated_Staircase : public Usermod {
}
void updateSegments() {
mainSegmentId = strip.getMainSegmentId();
for (int i = 0; i < strip.getSegmentsNum(); i++) {
for (int i = minSegmentId; i < maxSegmentId; i++) {
Segment &seg = strip.getSegment(i);
if (!seg.isActive()) {
maxSegmentId = i - 1;
break;
}
if (!seg.isActive()) continue; // skip gaps
if (i >= onIndex && i < offIndex) {
seg.setOption(SEG_OPTION_ON, true);
// 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
// seg.setMode(mainsegment.mode);
@@ -120,8 +114,10 @@ class Animated_Staircase : public Usermod {
seg.setOption(SEG_OPTION_ON, false);
}
// 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);
}
@@ -207,9 +203,9 @@ class Animated_Staircase : public Usermod {
if (onIndex == offIndex) {
// Position the indices for a correct on-swipe
if (swipe == SWIPE_UP) {
onIndex = mainSegmentId;
onIndex = minSegmentId;
} else {
onIndex = maxSegmentId+1;
onIndex = maxSegmentId;
}
offIndex = onIndex;
}
@@ -221,7 +217,7 @@ class Animated_Staircase : public Usermod {
}
void autoPowerOff() {
if (on && ((millis() - lastSwitchTime) > on_time_ms)) {
if ((millis() - lastSwitchTime) > on_time_ms) {
// if sensors are still on, do nothing
if (bottomSensorState || topSensorState) return;
@@ -238,10 +234,12 @@ class Animated_Staircase : public Usermod {
if ((millis() - lastTime) > segment_delay_ms) {
lastTime = millis();
byte oldOn = onIndex;
byte oldOff = offIndex;
if (on) {
// Turn on all segments
onIndex = MAX(mainSegmentId, onIndex - 1);
offIndex = MIN(maxSegmentId + 1, offIndex + 1);
onIndex = MAX(minSegmentId, onIndex - 1);
offIndex = MIN(maxSegmentId, offIndex + 1);
} else {
if (swipe == SWIPE_UP) {
onIndex = MIN(offIndex, onIndex + 1);
@@ -249,7 +247,7 @@ class Animated_Staircase : public Usermod {
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(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 {
// Restore segment options
for (int i = 0; i < strip.getSegmentsNum(); i++) {
for (int i = 0; i <= strip.getLastActiveSegmentId(); i++) {
Segment &seg = strip.getSegment(i);
if (!seg.isActive()) {
maxSegmentId = i - 1;
break;
}
if (!seg.isActive()) continue; // skip vector gaps
seg.setOption(SEG_OPTION_ON, true);
}
strip.trigger(); // force strip update
stateChanged = true; // inform external dvices/UI of change
colorUpdated(CALL_MODE_DIRECT_CHANGE);
DEBUG_PRINTLN(F("Animated Staircase disabled."));
}
@@ -332,8 +336,10 @@ class Animated_Staircase : public Usermod {
void loop() {
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();
autoPowerOff();
if (on) autoPowerOff();
updateSwipe();
}
@@ -392,14 +398,16 @@ class Animated_Staircase : public Usermod {
*/
void readFromJsonState(JsonObject& root) {
if (!initDone) return; // prevent crash on boot applyPreset()
bool en = enabled;
JsonObject staircase = root[FPSTR(_name)];
if (!staircase.isNull()) {
if (staircase[FPSTR(_enabled)].is<bool>()) {
enabled = staircase[FPSTR(_enabled)].as<bool>();
en = staircase[FPSTR(_enabled)].as<bool>();
} else {
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);
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
1. Copy the file `usermod_PIR_sensor_switch.h` to the `wled00` directory.
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.
**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`.
## API to enable/disable the PIR sensor from outside. For example from another usermod.
@@ -121,4 +84,9 @@ Have fun - @gegu & @blazoncek
2021-11
* 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.

File diff suppressed because it is too large Load Diff

View File

@@ -11,6 +11,9 @@
#define NODE_TYPE_ID_UNDEFINED 0
#define NODE_TYPE_ID_ESP8266 82
#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

View File

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

View File

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

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 {
nightlightActive = true;
if (!aNlDef) nightlightDelayMins = getNumVal(&req, pos);
else nightlightDelayMins = nightlightDelayMinsDefault;
nightlightStartTime = millis();
}
} else if (aNlDef)
{
nightlightActive = true;
nightlightDelayMins = nightlightDelayMinsDefault;
nightlightStartTime = millis();
}

View File

@@ -4,7 +4,7 @@
* 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 WLEDPACKETSIZE (41+(MAX_NUM_SEGMENTS*UDP_SEG_SIZE)+0)
#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
//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)
udpOut[11] = 11;
//12: enhanced effct sliders, 2D & mapping options
udpOut[11] = 12;
col = mainseg.colors[1];
udpOut[12] = R(col);
udpOut[13] = G(col);
@@ -105,7 +106,7 @@ void notify(byte callMode, bool followUp)
udpOut[6 +ofs] = selseg.spacing;
udpOut[7 +ofs] = selseg.offset >> 8;
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[11+ofs] = selseg.mode;
udpOut[12+ofs] = selseg.speed;
@@ -124,6 +125,14 @@ void notify(byte callMode, bool followUp)
udpOut[25+ofs] = B(selseg.colors[2]);
udpOut[26+ofs] = W(selseg.colors[2]);
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;
}
@@ -325,9 +334,9 @@ void handleNotifications()
if (version > 6) {
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
uint8_t cct = udpIn[38];
uint16_t cct = udpIn[38];
if (udpIn[37] > 0) { //Kelvin
cct = (((udpIn[37] << 8) + udpIn[38]) - 1900) >> 5;
cct |= (udpIn[37] << 8);
}
strip.setCCT(cct);
}
@@ -346,15 +355,19 @@ void handleNotifications()
uint16_t ofs = 41 + i*udpIn[40]; //start of segment offset byte
uint8_t id = udpIn[0 +ofs];
if (id > strip.getSegmentsNum()) break;
Segment& selseg = strip.getSegment(id);
uint16_t start = (udpIn[1+ofs] << 8 | udpIn[2+ofs]);
uint16_t stop = (udpIn[3+ofs] << 8 | udpIn[4+ofs]);
if (!selseg.isActive() || !selseg.isSelected()) continue; //do not apply to non selected segments
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]);
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;
}
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]);
if (applyEffects) {
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.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
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 {
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;
@@ -632,6 +660,12 @@ void sendSysInfoUDP()
memcpy((byte *)data + 6, serverDescription, 32);
#ifdef 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)
data[38] = NODE_TYPE_ID_ESP32;
#else

View File

@@ -8,7 +8,7 @@
*/
// 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
//#define WLED_USE_MY_CONFIG
@@ -95,6 +95,10 @@
#include "my_config.h"
#endif
#ifdef WLED_DEBUG_HOST
#include "net_debug.h"
#endif
#include <ESPAsyncWebServer.h>
#ifdef WLED_ADD_EEPROM_SUPPORT
#include <EEPROM.h>
@@ -670,13 +674,27 @@ WLED_GLOBAL StaticJsonDocument<JSON_BUFFER_SIZE> doc;
WLED_GLOBAL volatile uint8_t jsonBufferLock _INIT(0);
// 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
#ifndef ESP8266
#include <rom/rtc.h>
#endif
#define DEBUG_PRINT(x) Serial.print(x)
#define DEBUG_PRINTLN(x) Serial.println(x)
#define DEBUG_PRINTF(x...) Serial.printf(x)
#define DEBUG_PRINT(x) DEBUGOUT.print(x)
#define DEBUG_PRINTLN(x) DEBUGOUT.println(x)
#define DEBUG_PRINTF(x...) DEBUGOUT.printf(x)
#else
#define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x)
@@ -684,9 +702,9 @@ WLED_GLOBAL volatile uint8_t jsonBufferLock _INIT(0);
#endif
#ifdef WLED_DEBUG_FS
#define DEBUGFS_PRINT(x) Serial.print(x)
#define DEBUGFS_PRINTLN(x) Serial.println(x)
#define DEBUGFS_PRINTF(x...) Serial.printf(x)
#define DEBUGFS_PRINT(x) DEBUGOUT.print(x)
#define DEBUGFS_PRINTLN(x) DEBUGOUT.println(x)
#define DEBUGFS_PRINTF(x...) DEBUGOUT.printf(x)
#else
#define DEBUGFS_PRINT(x)
#define DEBUGFS_PRINTLN(x)

View File

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

View File

@@ -719,7 +719,13 @@ void getSettingsJS(byte subPage, char* dest)
oappend(SET_F("_"));
oappend(releaseString);
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"));
#else
oappend(SET_F("<br>(ESP8266"));