Feature implementation

- #2236
  - #1984
Better PSRAM handling
platformio.ini update
On/Off bus handling
This commit is contained in:
Blaz Kristan 2023-05-28 22:50:19 +02:00
parent 7d84de6690
commit 5a8a8dc292
20 changed files with 2302 additions and 2240 deletions

View File

@ -1,5 +1,26 @@
## WLED changelog ## WLED changelog
#### Build 2305280
- DDP protocol update (#3193)
- added PCF8574 I2C port expander support for Multi relay usermod
- MQTT multipacket (fragmented) message fix
- new ethernet board: @srg74 Ethernet Shield
- new 2D effects: Soap (#3184) & Octopus & Waving cell (credit @St3P40 https://github.com/80Stepko08)
- various fixes and enhancements
#### Build 2305090
- new ethernet board: @Wladi ABC! WLED Eth
- Battery usermod voltage calculation (#3116)
- custom palette editor (#3164)
- improvements in Dancing Shadows and Tartan effects
- UCS389x support
- switched to NeoPixelBus 2.7.5 (replaced NeoPixelBrightnessBus with NeoPixelBusLg)
- SPI bus clock selection (for LEDs) (#3173)
- DMX mode preset fix (#3134)
- iOS fix for scroll (#3182)
- Wordclock "Norddeutsch" fix (#3161)
- various fixes and enhancements
#### Build 2304090 #### Build 2304090
- updated Arduino ESP8266 core to 4.1.0 (newer compiler) - updated Arduino ESP8266 core to 4.1.0 (newer compiler)
- updated NeoPixelBus to 2.7.3 (with support for UCS890x chipset) - updated NeoPixelBus to 2.7.3 (with support for UCS890x chipset)

View File

@ -178,14 +178,12 @@ lib_deps =
https://github.com/Aircoookie/ESPAsyncWebServer.git @ ~2.0.7 https://github.com/Aircoookie/ESPAsyncWebServer.git @ ~2.0.7
#For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line #For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line
#TFT_eSPI #TFT_eSPI
#For use SSD1306 OLED display uncomment following #For compatible OLED display uncomment following
#U8g2@~2.28.8 #U8g2 #@ ~2.33.15
#U8g2@~2.32.10 #For Dallas sensor uncomment following
#For Dallas sensor uncomment following 2 lines #OneWire @ ~2.3.7
#OneWire@~2.3.5
#milesburton/DallasTemperature@^3.9.0
#For BME280 sensor uncomment following #For BME280 sensor uncomment following
#BME280@~3.0.0 #BME280 @ ~3.0.0
; adafruit/Adafruit BMP280 Library @ 2.1.0 ; adafruit/Adafruit BMP280 Library @ 2.1.0
; adafruit/Adafruit CCS811 Library @ 1.0.4 ; adafruit/Adafruit CCS811 Library @ 1.0.4
; adafruit/Adafruit Si7021 Library @ 1.4.0 ; adafruit/Adafruit Si7021 Library @ 1.4.0

View File

@ -2805,7 +2805,7 @@ uint16_t mode_bouncing_balls(void) {
// number of balls based on intensity setting to max of 7 (cycles colors) // number of balls based on intensity setting to max of 7 (cycles colors)
// non-chosen color is a random color // non-chosen color is a random color
uint16_t numBalls = (SEGMENT.intensity * (maxNumBalls - 1)) / 255 + 1; // minimum 1 ball uint16_t numBalls = (SEGMENT.intensity * (maxNumBalls - 1)) / 255 + 1; // minimum 1 ball
const float gravity = -9.81; // standard value of gravity const float gravity = -9.81f; // standard value of gravity
const bool hasCol2 = SEGCOLOR(2); const bool hasCol2 = SEGCOLOR(2);
const unsigned long time = millis(); const unsigned long time = millis();
@ -4175,11 +4175,9 @@ static const char _data_FX_MODE_DANCING_SHADOWS[] PROGMEM = "Dancing Shadows@!,#
By Stefan Seegel By Stefan Seegel
*/ */
uint16_t mode_washing_machine(void) { uint16_t mode_washing_machine(void) {
float speed = tristate_square8(strip.now >> 7, 90, 15); int speed = tristate_square8(strip.now >> 7, 90, 15);
float quot = 32.0f - ((float)SEGMENT.speed / 16.0f);
speed /= quot;
SEGENV.step += (speed * 128.0f); SEGENV.step += (speed * 2048) / (512 - SEGMENT.speed);
for (int i = 0; i < SEGLEN; i++) { for (int i = 0; i < SEGLEN; i++) {
uint8_t col = sin8(((SEGMENT.intensity / 25 + 1) * 255 * i / SEGLEN) + (SEGENV.step >> 7)); uint8_t col = sin8(((SEGMENT.intensity / 25 + 1) * 255 * i / SEGLEN) + (SEGENV.step >> 7));
@ -4593,7 +4591,7 @@ uint16_t mode_2DBlackHole(void) { // By: Stepko https://editor.soulma
} }
SEGMENT.fadeToBlackBy(16 + (SEGMENT.speed>>3)); // create fading trails SEGMENT.fadeToBlackBy(16 + (SEGMENT.speed>>3)); // create fading trails
float t = (float)(millis())/128; // timebase unsigned long t = millis()/128; // timebase
// outer stars // outer stars
for (size_t i = 0; i < 8; i++) { for (size_t i = 0; i < 8; i++) {
x = beatsin8(SEGMENT.custom1>>3, 0, cols - 1, 0, ((i % 2) ? 128 : 0) + t * i); x = beatsin8(SEGMENT.custom1>>3, 0, cols - 1, 0, ((i % 2) ? 128 : 0) + t * i);

View File

@ -515,7 +515,7 @@ typedef struct Segment {
static uint16_t getUsedSegmentData(void) { return _usedSegmentData; } static uint16_t getUsedSegmentData(void) { return _usedSegmentData; }
static void addUsedSegmentData(int len) { _usedSegmentData += len; } static void addUsedSegmentData(int len) { _usedSegmentData += len; }
void set(uint16_t i1, uint16_t i2, uint8_t grp=1, uint8_t spc=0, uint16_t ofs=UINT16_MAX, uint16_t i1Y=0, uint16_t i2Y=1); void setUp(uint16_t i1, uint16_t i2, uint8_t grp=1, uint8_t spc=0, uint16_t ofs=UINT16_MAX, uint16_t i1Y=0, uint16_t i2Y=1);
bool setColor(uint8_t slot, uint32_t c); //returns true if changed bool setColor(uint8_t slot, uint32_t c); //returns true if changed
void setCCT(uint16_t k); void setCCT(uint16_t k);
void setOpacity(uint8_t o); void setOpacity(uint8_t o);

View File

@ -152,12 +152,12 @@ bool Segment::allocateData(size_t len) {
if (data && _dataLen == len) return true; //already allocated if (data && _dataLen == len) return true; //already allocated
deallocateData(); deallocateData();
if (Segment::getUsedSegmentData() + len > MAX_SEGMENT_DATA) return false; //not enough memory if (Segment::getUsedSegmentData() + len > MAX_SEGMENT_DATA) return false; //not enough memory
// if possible use SPI RAM on ESP32 // do not use SPI RAM on ESP32 since it is slow
#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM) //#if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM)
if (psramFound()) //if (psramFound())
data = (byte*) ps_malloc(len); // data = (byte*) ps_malloc(len);
else //else
#endif //#endif
data = (byte*) malloc(len); data = (byte*) malloc(len);
if (!data) return false; //allocation failed if (!data) return false; //allocation failed
Segment::addUsedSegmentData(len); Segment::addUsedSegmentData(len);
@ -379,7 +379,7 @@ void Segment::handleTransition() {
} }
} }
void Segment::set(uint16_t i1, uint16_t i2, uint8_t grp, uint8_t spc, uint16_t ofs, uint16_t i1Y, uint16_t i2Y) { void Segment::setUp(uint16_t i1, uint16_t i2, uint8_t grp, uint8_t spc, uint16_t ofs, uint16_t i1Y, uint16_t i2Y) {
//return if neither bounds nor grouping have changed //return if neither bounds nor grouping have changed
bool boundsUnchanged = (start == i1 && stop == i2); bool boundsUnchanged = (start == i1 && stop == i2);
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
@ -1427,7 +1427,7 @@ Segment& WS2812FX::getSegment(uint8_t id) {
void WS2812FX::setSegment(uint8_t n, uint16_t i1, uint16_t i2, uint8_t grouping, uint8_t spacing, uint16_t offset, uint16_t startY, uint16_t stopY) { void WS2812FX::setSegment(uint8_t n, uint16_t i1, uint16_t i2, uint8_t grouping, uint8_t spacing, uint16_t offset, uint16_t startY, uint16_t stopY) {
if (n >= _segments.size()) return; if (n >= _segments.size()) return;
_segments[n].set(i1, i2, grouping, spacing, offset, startY, stopY); _segments[n].setUp(i1, i2, grouping, spacing, offset, startY, stopY);
} }
void WS2812FX::restartRuntime() { void WS2812FX::restartRuntime() {

View File

@ -438,6 +438,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
getStringFromJson(mqttDeviceTopic, if_mqtt[F("topics")][F("device")], 33); // "wled/test" getStringFromJson(mqttDeviceTopic, if_mqtt[F("topics")][F("device")], 33); // "wled/test"
getStringFromJson(mqttGroupTopic, if_mqtt[F("topics")][F("group")], 33); // "" getStringFromJson(mqttGroupTopic, if_mqtt[F("topics")][F("group")], 33); // ""
CJSON(retainMqttMsg, if_mqtt[F("rtn")]);
#endif #endif
#ifndef WLED_DISABLE_HUESYNC #ifndef WLED_DISABLE_HUESYNC
@ -885,6 +886,7 @@ void serializeConfig() {
if_mqtt[F("user")] = mqttUser; if_mqtt[F("user")] = mqttUser;
if_mqtt[F("pskl")] = strlen(mqttPass); if_mqtt[F("pskl")] = strlen(mqttPass);
if_mqtt[F("cid")] = mqttClientID; if_mqtt[F("cid")] = mqttClientID;
if_mqtt[F("rtn")] = retainMqttMsg;
JsonObject if_mqtt_topics = if_mqtt.createNestedObject(F("topics")); JsonObject if_mqtt_topics = if_mqtt.createNestedObject(F("topics"));
if_mqtt_topics[F("device")] = mqttDeviceTopic; if_mqtt_topics[F("device")] = mqttDeviceTopic;

View File

@ -72,7 +72,7 @@
</div> </div>
<div id="briwrap"> <div id="briwrap">
<p class="hd">Brightness</p> <p class="hd">Brightness</p>
<div class="slider" style="left:24px;"> <div class="slider" style="padding-right:32px;">
<i class="icons slider-icon" onclick="tglTheme()" style="transform: translate(-32px,5px);">&#xe2a6;</i> <i class="icons slider-icon" onclick="tglTheme()" style="transform: translate(-32px,5px);">&#xe2a6;</i>
<div class="sliderwrap il"> <div class="sliderwrap il">
<input id="sliderBri" onchange="setBri()" oninput="updateTrail(this)" max="255" min="1" type="range" value="128" /> <input id="sliderBri" onchange="setBri()" oninput="updateTrail(this)" max="255" min="1" type="range" value="128" />

View File

@ -965,8 +965,8 @@ function genPalPrevCss(id)
function generateListItemHtml(listName, id, name, clickAction, extraHtml = '', effectPar = '') function generateListItemHtml(listName, id, name, clickAction, extraHtml = '', effectPar = '')
{ {
return `<div class="lstI${id==0?' sticky':''}" data-id="${id}" ${effectPar===''?'':'data-opt="'+effectPar+'"'}onClick="${clickAction}(${id})">`+ return `<div class="lstI${id==0?' sticky':''}" data-id="${id}" ${effectPar===''?'':'data-opt="'+effectPar+'" '}onClick="${clickAction}(${id})">`+
`<label class="radio schkl" onclick="event.preventDefault()">`+ `<label title="(${id})" class="radio schkl" onclick="event.preventDefault()">`+ // (#1984)
`<input type="radio" value="${id}" name="${listName}">`+ `<input type="radio" value="${id}" name="${listName}">`+
`<span class="radiomark"></span>`+ `<span class="radiomark"></span>`+
`<div class="lstIcontent">`+ `<div class="lstIcontent">`+

View File

@ -202,6 +202,7 @@ Client ID: <input type="text" name="MQCID" maxlength="40"><br>
Device Topic: <input type="text" name="MD" maxlength="32"><br> Device Topic: <input type="text" name="MD" maxlength="32"><br>
Group Topic: <input type="text" name="MG" maxlength="32"><br> Group Topic: <input type="text" name="MG" maxlength="32"><br>
Publish on button press: <input type="checkbox" name="BM"><br> Publish on button press: <input type="checkbox" name="BM"><br>
Retain brightness & color messages: <input type="checkbox" name="RT"><br>
<i>Reboot required to apply changes. </i><a href="https://kno.wled.ge/interfaces/mqtt/" target="_blank">MQTT info</a> <i>Reboot required to apply changes. </i><a href="https://kno.wled.ge/interfaces/mqtt/" target="_blank">MQTT info</a>
</div> </div>
<h3>Philips Hue</h3> <h3>Philips Hue</h3>

View File

@ -1067,216 +1067,217 @@ 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 = 3318; const uint16_t PAGE_settings_sync_length = 3340;
const uint8_t PAGE_settings_sync[] PROGMEM = { const uint8_t PAGE_settings_sync[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x1a, 0x6b, 0x53, 0xdb, 0xb8, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x1a, 0x6b, 0x53, 0xdb, 0xb8,
0xf6, 0xbb, 0x7f, 0x85, 0xf0, 0xce, 0x74, 0x93, 0x25, 0xe4, 0x01, 0x84, 0x52, 0x88, 0xdd, 0x0b, 0xf6, 0xbb, 0x7f, 0x85, 0xf0, 0xce, 0x74, 0x93, 0x25, 0xe4, 0x01, 0x84, 0x52, 0x88, 0xdd, 0x0b,
0x84, 0x42, 0xee, 0x2d, 0x34, 0x4d, 0xe8, 0xb6, 0x3b, 0x73, 0x67, 0x76, 0x14, 0x5b, 0x49, 0x04, 0x84, 0x42, 0xee, 0x2d, 0x34, 0x4d, 0xe8, 0xb6, 0x3b, 0x73, 0x67, 0x76, 0x14, 0x5b, 0x49, 0x04,
0xb6, 0xe5, 0xb5, 0x64, 0x1e, 0xd3, 0xed, 0x7f, 0xbf, 0xe7, 0x48, 0xb6, 0x93, 0x98, 0xbc, 0x7a, 0xb6, 0xe5, 0x95, 0x64, 0x1e, 0xd3, 0xed, 0x7f, 0xbf, 0xe7, 0xc8, 0x8f, 0x24, 0x26, 0xaf, 0xde,
0x67, 0x3f, 0x34, 0xd8, 0xd2, 0x39, 0x47, 0xe7, 0xfd, 0x90, 0xdb, 0xd9, 0xe9, 0x7e, 0xba, 0xb8, 0xd9, 0x0f, 0x0d, 0xb6, 0x74, 0xce, 0xd1, 0x79, 0x3f, 0xe4, 0x76, 0x76, 0xba, 0x9f, 0x2e, 0xee,
0xfb, 0xa3, 0x7f, 0x49, 0xa6, 0x2a, 0x0c, 0xdc, 0x0e, 0xfe, 0x92, 0x80, 0x46, 0x13, 0xc7, 0x66, 0xfe, 0xe8, 0x5f, 0x92, 0xa9, 0x0e, 0x03, 0xb7, 0x83, 0xbf, 0x24, 0xa0, 0xd1, 0xc4, 0xb1, 0x59,
0x91, 0x0d, 0xef, 0x8c, 0xfa, 0x6e, 0x27, 0x64, 0x8a, 0x92, 0x88, 0x86, 0xcc, 0xb1, 0x1f, 0x39, 0x64, 0xc3, 0x3b, 0xa3, 0xbe, 0xdb, 0x09, 0x99, 0xa6, 0x24, 0xa2, 0x21, 0x73, 0xec, 0x47, 0xce,
0x7b, 0x8a, 0x45, 0xa2, 0x6c, 0xe2, 0x89, 0x48, 0xb1, 0x48, 0x39, 0xf6, 0x13, 0xf7, 0xd5, 0xd4, 0x9e, 0x62, 0x21, 0xb5, 0x4d, 0x3c, 0x11, 0x69, 0x16, 0x69, 0xc7, 0x7e, 0xe2, 0xbe, 0x9e, 0x3a,
0x69, 0x37, 0x9b, 0xb6, 0x6b, 0x19, 0x50, 0xab, 0xb4, 0xe7, 0xb3, 0x47, 0xee, 0xb1, 0x3d, 0xfd, 0xed, 0x66, 0xd3, 0x76, 0xad, 0x14, 0xd4, 0x2a, 0xed, 0xf9, 0xec, 0x91, 0x7b, 0x6c, 0xcf, 0xbc,
0x52, 0xe3, 0x11, 0x57, 0x9c, 0x06, 0x7b, 0xd2, 0xa3, 0x01, 0x73, 0x5a, 0xb5, 0x90, 0x3e, 0xf3, 0xd4, 0x78, 0xc4, 0x35, 0xa7, 0xc1, 0x9e, 0xf2, 0x68, 0xc0, 0x9c, 0x56, 0x2d, 0xa4, 0xcf, 0x3c,
0x30, 0x0d, 0x8b, 0xf7, 0x54, 0xb2, 0x44, 0xbf, 0xd0, 0x11, 0xbc, 0x47, 0xc2, 0x26, 0x56, 0xe9, 0x4c, 0xc2, 0xe2, 0x3d, 0x51, 0x4c, 0x9a, 0x17, 0x3a, 0x82, 0xf7, 0x48, 0xd8, 0xc4, 0x2a, 0x1d,
0xe8, 0x8c, 0x21, 0x6f, 0x4a, 0x13, 0xc9, 0xe0, 0x90, 0x54, 0x8d, 0xf7, 0x8e, 0x61, 0x55, 0x71, 0x9d, 0x31, 0xe4, 0x4d, 0xa9, 0x54, 0x0c, 0x0e, 0x49, 0xf4, 0x78, 0xef, 0x18, 0x56, 0x35, 0xd7,
0x15, 0x30, 0x77, 0xf8, 0x12, 0x79, 0x64, 0xc8, 0x94, 0xe2, 0xd1, 0x44, 0x76, 0x1a, 0x66, 0xb1, 0x01, 0x73, 0x87, 0x2f, 0x91, 0x47, 0x86, 0x4c, 0x6b, 0x1e, 0x4d, 0x54, 0xa7, 0x91, 0x2e, 0x76,
0x23, 0xbd, 0x84, 0xc7, 0xca, 0xb5, 0x1e, 0x69, 0x42, 0x02, 0xe1, 0xf1, 0xb8, 0xe6, 0x3b, 0xbe, 0x94, 0x27, 0x79, 0xac, 0x5d, 0xeb, 0x91, 0x4a, 0x12, 0x08, 0x8f, 0xc7, 0x35, 0xdf, 0xf1, 0x85,
0xf0, 0xd2, 0x10, 0xd8, 0xac, 0xc1, 0x82, 0xb3, 0xd3, 0x3a, 0x1d, 0xa7, 0x91, 0xa7, 0xb8, 0x88, 0x97, 0x84, 0xc0, 0x66, 0x0d, 0x16, 0x9c, 0x9d, 0xd6, 0xe9, 0x38, 0x89, 0x3c, 0xcd, 0x45, 0x44,
0xc8, 0xa4, 0xe7, 0x57, 0x58, 0xf5, 0x7b, 0xc2, 0x54, 0x9a, 0x44, 0xc4, 0xaf, 0x4f, 0x98, 0xba, 0x26, 0x3d, 0xbf, 0xc2, 0xaa, 0xdf, 0x25, 0xd3, 0x89, 0x8c, 0x88, 0x5f, 0x9f, 0x30, 0x7d, 0x19,
0x0c, 0x18, 0x82, 0x9e, 0xbf, 0xe8, 0xad, 0x1f, 0x05, 0xa8, 0x12, 0x93, 0x49, 0xc0, 0x10, 0xda, 0x30, 0x04, 0x3d, 0x7f, 0x31, 0x5b, 0x3f, 0x0a, 0x50, 0x2d, 0x26, 0x93, 0x80, 0x21, 0x74, 0x8a,
0x20, 0xd5, 0xbd, 0x80, 0x4a, 0xf9, 0x91, 0x4b, 0x55, 0xcf, 0xb6, 0xec, 0x29, 0xf7, 0x99, 0x5d, 0x54, 0xf7, 0x02, 0xaa, 0xd4, 0x47, 0xae, 0x74, 0x3d, 0xdb, 0xb2, 0xa7, 0xdc, 0x67, 0x76, 0xb5,
0xad, 0xe1, 0xbe, 0x7d, 0x2b, 0xec, 0xdd, 0x35, 0x40, 0x33, 0xba, 0xd7, 0x95, 0xea, 0xf7, 0x27, 0x86, 0xfb, 0xf6, 0xad, 0xb0, 0x77, 0xd7, 0x00, 0xcd, 0xe8, 0x5e, 0x57, 0xaa, 0xdf, 0x9f, 0x78,
0x1e, 0xf9, 0xe2, 0xa9, 0x2e, 0x62, 0x16, 0x01, 0x80, 0x52, 0xb1, 0x3c, 0x69, 0x34, 0x1e, 0x22, 0xe4, 0x8b, 0xa7, 0xba, 0x88, 0x59, 0x04, 0x00, 0x5a, 0xc7, 0xea, 0xa4, 0xd1, 0x78, 0x88, 0x44,
0x51, 0x7f, 0x0a, 0x18, 0x32, 0xd5, 0xe0, 0xa0, 0xe5, 0x64, 0x4c, 0x3d, 0x26, 0x1b, 0xa9, 0x1f, 0xfd, 0x29, 0x60, 0xc8, 0x54, 0x83, 0x83, 0x96, 0xe5, 0x98, 0x7a, 0x4c, 0x35, 0x12, 0x3f, 0xde,
0xef, 0x45, 0x42, 0xf1, 0x31, 0x67, 0x49, 0x63, 0x9e, 0xd0, 0x79, 0x99, 0x50, 0x43, 0x66, 0xba, 0x8b, 0x84, 0xe6, 0x63, 0xce, 0x64, 0x63, 0x9e, 0xd0, 0x79, 0x99, 0x50, 0x43, 0x65, 0xba, 0xb1,
0xb1, 0x6b, 0xf6, 0x9f, 0x92, 0x05, 0xe3, 0x79, 0x68, 0xea, 0xdf, 0x03, 0xfc, 0xd1, 0x61, 0xfb, 0x6b, 0xf6, 0x9f, 0x8a, 0x05, 0xe3, 0x79, 0x68, 0xea, 0xdf, 0x03, 0xfc, 0xd1, 0x61, 0xfb, 0xd0,
0xd0, 0x71, 0xfc, 0xfa, 0x70, 0x5c, 0xef, 0xf6, 0xea, 0x8f, 0x34, 0x48, 0xd9, 0xfb, 0x56, 0xb6, 0x71, 0xfc, 0xfa, 0x70, 0x5c, 0xef, 0xf6, 0xea, 0x8f, 0x34, 0x48, 0xd8, 0xfb, 0x56, 0xb6, 0x70,
0x70, 0xf9, 0xc5, 0x2c, 0xbc, 0x79, 0x53, 0x59, 0x78, 0x77, 0x9a, 0xd5, 0x93, 0x76, 0xfb, 0xe8, 0xf9, 0x25, 0x5d, 0x78, 0xf3, 0xa6, 0xb2, 0xf0, 0xee, 0x34, 0xab, 0x27, 0xed, 0xf6, 0xd1, 0x71,
0xb8, 0x84, 0x07, 0x60, 0xcd, 0x7c, 0xe9, 0x6c, 0x11, 0x33, 0x7f, 0x77, 0x5a, 0xd5, 0x5a, 0x73, 0x09, 0x0f, 0xc0, 0x9a, 0xf9, 0xd2, 0xd9, 0x22, 0x66, 0xfe, 0xee, 0xb4, 0xaa, 0xb5, 0xe6, 0x26,
0x13, 0xf5, 0x56, 0x75, 0x8e, 0xcb, 0x40, 0x50, 0xff, 0xdf, 0xc3, 0x0a, 0xab, 0x29, 0x67, 0xa7, 0xea, 0xad, 0xea, 0x1c, 0x97, 0x81, 0xa0, 0xfe, 0xbf, 0x87, 0x15, 0x56, 0xd3, 0xce, 0x4e, 0xb3,
0x59, 0xfd, 0x1e, 0x30, 0x45, 0x04, 0xe0, 0x7b, 0x09, 0xa3, 0x8a, 0x65, 0x96, 0xaa, 0xd8, 0xc6, 0xfa, 0x3d, 0x60, 0x9a, 0x08, 0xc0, 0xf7, 0x24, 0xa3, 0x9a, 0x65, 0x96, 0xaa, 0xd8, 0xa9, 0xc9,
0xe4, 0x76, 0xf5, 0x54, 0xd4, 0x41, 0xe4, 0x33, 0xa5, 0x12, 0x3e, 0x4a, 0x15, 0xe8, 0x5a, 0x26, 0xed, 0xea, 0xa9, 0xa8, 0x83, 0xc8, 0x67, 0x5a, 0x4b, 0x3e, 0x4a, 0x34, 0xe8, 0x5a, 0x49, 0xcf,
0x9e, 0x5d, 0x63, 0xd5, 0x5a, 0x79, 0x5d, 0xbd, 0xc4, 0x0c, 0x94, 0xa2, 0xd8, 0xb3, 0x6a, 0xdc, 0xae, 0xb1, 0x6a, 0xad, 0xbc, 0xae, 0x5f, 0x62, 0x06, 0x4a, 0xd1, 0xec, 0x59, 0x37, 0xee, 0xe9,
0xd3, 0x47, 0x9a, 0x13, 0x78, 0x05, 0x48, 0x25, 0xf8, 0x98, 0x5d, 0x53, 0xd5, 0x9a, 0x5f, 0x1f, 0x23, 0xcd, 0x09, 0xbc, 0x02, 0xa4, 0x0a, 0x7c, 0xcc, 0xae, 0xe9, 0x6a, 0xcd, 0xaf, 0x8f, 0x84,
0x09, 0xff, 0xa5, 0x4e, 0x63, 0x50, 0xad, 0x7f, 0x31, 0xe5, 0x81, 0x5f, 0x11, 0x08, 0x4f, 0x7d, 0xff, 0x52, 0xa7, 0x31, 0xa8, 0xd6, 0xbf, 0x98, 0xf2, 0xc0, 0xaf, 0x08, 0x84, 0xa7, 0xbe, 0x7f,
0xff, 0xf2, 0x11, 0xb8, 0x40, 0x1b, 0xb3, 0x88, 0x25, 0x15, 0x1b, 0x79, 0xb6, 0x6b, 0x95, 0xaa, 0xf9, 0x08, 0x5c, 0xa0, 0x8d, 0x59, 0xc4, 0x64, 0xc5, 0x46, 0x9e, 0xed, 0x5a, 0xa5, 0xea, 0xb8,
0xe3, 0x7e, 0xbf, 0x62, 0xea, 0xf7, 0x4a, 0xb5, 0x06, 0x3e, 0xfa, 0x3b, 0x0d, 0x2a, 0xd5, 0x1f, 0xdf, 0xaf, 0x98, 0xfe, 0xbd, 0x52, 0xad, 0x81, 0x8f, 0xfe, 0x4e, 0x83, 0x4a, 0xf5, 0xc7, 0x72,
0xcb, 0x11, 0x58, 0x92, 0x88, 0x04, 0xf8, 0x04, 0x04, 0x08, 0x27, 0x29, 0x02, 0x56, 0x0f, 0xc4, 0x04, 0x26, 0xa5, 0x90, 0xc0, 0x27, 0x20, 0x40, 0x38, 0x29, 0x11, 0xb0, 0x7a, 0x20, 0x26, 0x15,
0xa4, 0x62, 0x5f, 0xe2, 0x3a, 0xc9, 0xb4, 0x00, 0x76, 0x24, 0x63, 0x1e, 0x30, 0x2d, 0x0f, 0xc4, 0xfb, 0x12, 0xd7, 0x49, 0xa6, 0x05, 0xb0, 0x23, 0x19, 0xf3, 0x80, 0x19, 0x79, 0x20, 0x7e, 0x24,
0x4f, 0x02, 0x72, 0x7f, 0xcc, 0xd6, 0xc5, 0x18, 0x63, 0x74, 0xcc, 0x27, 0x69, 0x42, 0xb5, 0xda, 0xc8, 0xfd, 0x31, 0x5b, 0x17, 0x63, 0x8c, 0xd1, 0x31, 0x9f, 0x24, 0x92, 0x1a, 0xb5, 0xa5, 0xf2,
0x8c, 0x3c, 0x64, 0x4c, 0x39, 0xfa, 0xcf, 0x7f, 0xa3, 0x5e, 0xe4, 0x89, 0x30, 0x06, 0xed, 0x31, 0x90, 0x31, 0xe5, 0xe8, 0x3f, 0xff, 0x8d, 0x7a, 0x91, 0x27, 0xc2, 0x18, 0xb4, 0xc7, 0x48, 0x4c,
0x12, 0xd3, 0x09, 0x23, 0x3e, 0x55, 0x74, 0x07, 0xbc, 0x61, 0x4e, 0xd3, 0x1f, 0x2e, 0xc0, 0x1d, 0x27, 0x8c, 0xf8, 0x54, 0xd3, 0x1d, 0xf0, 0x86, 0x39, 0x4d, 0x7f, 0xb8, 0x00, 0x77, 0x18, 0x0b,
0xc6, 0x22, 0xa9, 0xdc, 0x3b, 0xcd, 0xd3, 0xfb, 0xce, 0xf1, 0xe9, 0xfd, 0xee, 0x6e, 0x55, 0x7b, 0x59, 0xb9, 0x77, 0x9a, 0xa7, 0xf7, 0x9d, 0xe3, 0xd3, 0xfb, 0xdd, 0xdd, 0xaa, 0xf1, 0xe4, 0x2b,
0xf2, 0x95, 0xbd, 0x5b, 0xb9, 0xdf, 0x05, 0xb3, 0xd4, 0xbd, 0x29, 0xf3, 0x1e, 0x98, 0xef, 0x98, 0x7b, 0xb7, 0x72, 0xbf, 0x0b, 0x66, 0xa9, 0x7b, 0x53, 0xe6, 0x3d, 0x30, 0xdf, 0x49, 0x97, 0x87,
0xe5, 0xa1, 0x5d, 0x35, 0x26, 0x73, 0xdd, 0xfb, 0x37, 0x2d, 0xe3, 0xf5, 0x83, 0x15, 0xb0, 0x83, 0x76, 0x35, 0x35, 0x99, 0xeb, 0xde, 0xbf, 0x69, 0xa5, 0x5e, 0x3f, 0x58, 0x01, 0x3b, 0x58, 0x80,
0x05, 0xd8, 0xd9, 0xa9, 0x57, 0x78, 0x2a, 0x46, 0x2a, 0x78, 0x15, 0xd8, 0xb8, 0x59, 0x13, 0x0e, 0x9d, 0x9d, 0x7a, 0x85, 0xa7, 0x62, 0xa4, 0x82, 0x57, 0x81, 0x8d, 0x9b, 0x35, 0xe1, 0x40, 0x74,
0x44, 0x67, 0x89, 0x0b, 0xb6, 0xeb, 0x2c, 0x67, 0xe4, 0x37, 0x51, 0x53, 0xd9, 0xde, 0x60, 0xc9, 0x96, 0xb8, 0x60, 0xbb, 0xce, 0x72, 0x46, 0x7e, 0x13, 0x35, 0x9d, 0xed, 0x0d, 0x96, 0xec, 0x89,
0x9e, 0xf8, 0xcd, 0xd9, 0x3f, 0x2d, 0xf1, 0xea, 0xb0, 0x5a, 0x89, 0x23, 0x47, 0xcd, 0xd8, 0x19, 0xdf, 0x9c, 0xfd, 0xd3, 0x12, 0xaf, 0x0e, 0xab, 0x95, 0x38, 0x72, 0xf4, 0x8c, 0x9d, 0x61, 0xbf,
0xf6, 0x0b, 0x76, 0x16, 0x7c, 0xdb, 0x50, 0x79, 0x8e, 0x01, 0x47, 0xaa, 0x17, 0xb0, 0x8f, 0xcf, 0x60, 0x67, 0xc1, 0xb7, 0x53, 0x2a, 0xcf, 0x31, 0xe0, 0x28, 0xfd, 0x02, 0xf6, 0xf1, 0xb9, 0x8a,
0x65, 0x1c, 0xd0, 0x17, 0x87, 0xb9, 0xcd, 0xf7, 0x76, 0x24, 0x22, 0x66, 0x9f, 0xd8, 0x23, 0x48, 0x03, 0xfa, 0xe2, 0x30, 0xb7, 0xf9, 0xde, 0x8e, 0x44, 0xc4, 0xec, 0x13, 0x7b, 0x04, 0xc9, 0xe5,
0x2e, 0x0f, 0x60, 0x1e, 0xb7, 0x59, 0xf8, 0x74, 0x3f, 0x3f, 0x74, 0x4e, 0xd1, 0xb9, 0x33, 0x7c, 0x01, 0xcc, 0xe3, 0x36, 0x0b, 0x9f, 0xee, 0xe7, 0x87, 0xce, 0x29, 0x3a, 0x77, 0x86, 0xef, 0xea,
0x97, 0x4f, 0x5c, 0x79, 0xd3, 0x4a, 0x8c, 0xb9, 0xad, 0x07, 0x6e, 0xbc, 0x80, 0x52, 0xad, 0x7e, 0x89, 0x6b, 0x6f, 0x5a, 0x89, 0x31, 0xb7, 0xf5, 0xc0, 0x8d, 0x17, 0x50, 0xaa, 0xd5, 0xef, 0x1e,
0xf7, 0xa8, 0x64, 0x04, 0x03, 0xed, 0x64, 0x81, 0x17, 0x07, 0x97, 0x4e, 0x47, 0x10, 0x01, 0x0f, 0x55, 0x8c, 0x60, 0xa0, 0x9d, 0x2c, 0xf0, 0xe2, 0xe0, 0xd2, 0xe9, 0x08, 0x22, 0xe0, 0xe1, 0xd4,
0xa7, 0x1a, 0x04, 0x63, 0xb8, 0x04, 0x82, 0x4b, 0xf3, 0x20, 0x87, 0xcd, 0xc3, 0x32, 0x15, 0x5c, 0x80, 0x60, 0x0c, 0x97, 0x40, 0x70, 0x69, 0x1e, 0xe4, 0xb0, 0x79, 0x58, 0xa6, 0x82, 0x4b, 0x3f,
0xfa, 0x81, 0xf2, 0xd6, 0xd0, 0xf2, 0x73, 0xec, 0x01, 0x67, 0x36, 0x3a, 0xda, 0x89, 0xed, 0x38, 0x50, 0xde, 0x1a, 0x5a, 0x7e, 0x8e, 0x3d, 0xe0, 0xcc, 0x46, 0x47, 0x3b, 0xb1, 0x1d, 0x27, 0x4b,
0x59, 0x3a, 0x01, 0xc1, 0xb4, 0x5f, 0xd5, 0xe3, 0x44, 0x28, 0xe1, 0x89, 0x00, 0x04, 0xd4, 0x99, 0x27, 0x20, 0x98, 0xf1, 0xab, 0x7a, 0x2c, 0x85, 0x16, 0x9e, 0x08, 0x40, 0x40, 0x93, 0x49, 0x9b,
0xb4, 0x59, 0xab, 0xe8, 0x14, 0xeb, 0x20, 0x44, 0x30, 0x54, 0x22, 0x01, 0xef, 0xc2, 0x24, 0xda, 0xb5, 0x8a, 0x49, 0xb1, 0x0e, 0x42, 0x04, 0x43, 0x2d, 0x24, 0x78, 0x17, 0x26, 0xd1, 0x9e, 0x66,
0x53, 0x2c, 0xc4, 0x48, 0xf0, 0x7a, 0xa0, 0xb3, 0xea, 0xdf, 0x7f, 0x67, 0x60, 0x80, 0x1f, 0xc6, 0x21, 0x46, 0x82, 0xd7, 0x03, 0x9d, 0x55, 0xff, 0xfe, 0x3b, 0x03, 0x03, 0xfc, 0x30, 0x06, 0xc7,
0xe0, 0xb8, 0x1f, 0x80, 0x3e, 0xb9, 0x11, 0x3e, 0xab, 0x93, 0x7e, 0xc0, 0x90, 0x43, 0x86, 0x09, 0xfd, 0x00, 0xf4, 0xc9, 0x8d, 0xf0, 0x59, 0x9d, 0xf4, 0x03, 0x86, 0x1c, 0x32, 0x4c, 0x70, 0xe4,
0x8e, 0x7c, 0xfd, 0x78, 0xd9, 0x25, 0xbd, 0x3e, 0xb8, 0x66, 0x6d, 0x81, 0xa2, 0x5c, 0xa4, 0x58, 0xeb, 0xc7, 0xcb, 0x2e, 0xe9, 0xf5, 0xc1, 0x35, 0x6b, 0x0b, 0x14, 0xd5, 0x22, 0xc5, 0x9a, 0xa1,
0xd3, 0xd4, 0xaa, 0x55, 0x84, 0xd2, 0xf9, 0x01, 0xc9, 0xbf, 0xd7, 0x89, 0x13, 0xf2, 0xa6, 0xbd, 0x56, 0xad, 0x22, 0x94, 0xc9, 0x0f, 0x48, 0xfe, 0xbd, 0x49, 0x9c, 0x90, 0x37, 0xed, 0x5d, 0xb3,
0xab, 0xb7, 0x4f, 0x6c, 0xbb, 0xba, 0x3b, 0xcb, 0x81, 0x0d, 0x59, 0xbf, 0x97, 0xef, 0x63, 0xe7, 0x7d, 0x62, 0xdb, 0xd5, 0xdd, 0x59, 0x0e, 0x6c, 0xa8, 0xfa, 0xbd, 0x7a, 0x1f, 0x3b, 0x87, 0x76,
0xd0, 0xae, 0xed, 0xb4, 0xaa, 0x3f, 0xac, 0x4e, 0x23, 0x2b, 0x14, 0x1d, 0x6d, 0x51, 0xf7, 0x5f, 0x6d, 0xa7, 0x55, 0xfd, 0x61, 0x75, 0x1a, 0x59, 0xa1, 0xe8, 0x18, 0x8b, 0xba, 0xff, 0xe2, 0x21,
0x3c, 0xc4, 0x92, 0x43, 0xd2, 0x24, 0x80, 0xbc, 0xa1, 0x8d, 0xec, 0x49, 0x09, 0x39, 0x05, 0x00, 0x96, 0x1c, 0x92, 0xc8, 0x00, 0xf2, 0x86, 0x31, 0xb2, 0xa7, 0x14, 0xe4, 0x14, 0x00, 0x34, 0x00,
0x35, 0x40, 0xa7, 0x61, 0x4a, 0x24, 0xa6, 0x01, 0x08, 0x4a, 0x3c, 0xd9, 0xb1, 0x41, 0x5b, 0x50, 0x9d, 0x46, 0x5a, 0x22, 0x31, 0x0d, 0x40, 0x50, 0xe2, 0xc9, 0x8e, 0x0d, 0xda, 0x82, 0x72, 0x04,
0x8e, 0xc0, 0x61, 0x43, 0x8b, 0x70, 0x78, 0xc7, 0xa7, 0x3f, 0xa5, 0x9d, 0x95, 0xd0, 0xe1, 0xd8, 0x0e, 0x1b, 0x5a, 0x84, 0xc3, 0x3b, 0x3e, 0xfd, 0xa9, 0xec, 0xac, 0x84, 0x0e, 0xc7, 0x36, 0x81,
0x26, 0x50, 0xc0, 0xa6, 0x02, 0x76, 0x62, 0x21, 0xa1, 0x94, 0x42, 0x78, 0xa7, 0xa3, 0x90, 0x43, 0x02, 0x36, 0x15, 0xb0, 0x13, 0x0b, 0x05, 0xa5, 0x14, 0xc2, 0x3b, 0x19, 0x85, 0x1c, 0x4a, 0x19,
0x29, 0x43, 0xcf, 0x07, 0x54, 0x9f, 0x3f, 0x12, 0x5d, 0x23, 0x1c, 0x5b, 0x09, 0x50, 0xcf, 0x53, 0x7a, 0x3e, 0xa0, 0xfa, 0xfc, 0x91, 0x98, 0x1a, 0xe1, 0xd8, 0x5a, 0x80, 0x7a, 0x9e, 0xb2, 0x35,
0xb6, 0x66, 0x65, 0x8b, 0x53, 0x16, 0xc4, 0xe7, 0xb0, 0x06, 0xe9, 0x48, 0x61, 0x11, 0x82, 0xc4, 0x2b, 0x5b, 0x9c, 0xb2, 0x20, 0x3e, 0x87, 0x35, 0x48, 0x47, 0x1a, 0x8b, 0x10, 0x24, 0x2e, 0xc7,
0xe5, 0xd8, 0xe6, 0x05, 0xa9, 0x79, 0x01, 0xf7, 0x1e, 0x1c, 0xfb, 0x1a, 0x69, 0xbd, 0xef, 0x34, 0x4e, 0x5f, 0x90, 0x9a, 0x17, 0x70, 0xef, 0xc1, 0xb1, 0xaf, 0x91, 0xd6, 0xfb, 0x4e, 0x23, 0xdd,
0xcc, 0x06, 0xb0, 0x0a, 0x24, 0x0a, 0x1c, 0x6b, 0x05, 0xd2, 0x39, 0x22, 0x9d, 0x53, 0xef, 0x61, 0x00, 0x56, 0x81, 0x44, 0x81, 0x63, 0xad, 0x40, 0x3a, 0x47, 0xa4, 0x73, 0xea, 0x3d, 0xcc, 0xf0,
0x86, 0xb7, 0x70, 0x8a, 0xe1, 0xd4, 0x76, 0x87, 0xf4, 0x91, 0xcd, 0x40, 0xa6, 0x09, 0xd4, 0x7e, 0x16, 0x4e, 0x49, 0x39, 0xb5, 0xdd, 0x21, 0x7d, 0x64, 0x33, 0x90, 0xa9, 0x84, 0xda, 0x9f, 0xd2,
0x43, 0x7f, 0xba, 0x6f, 0x4a, 0x30, 0xa8, 0x38, 0x8d, 0x41, 0x3d, 0xfb, 0xb0, 0x74, 0xe0, 0x6a, 0x9f, 0xee, 0xa7, 0x25, 0x18, 0x54, 0x9c, 0xc4, 0xa0, 0x9e, 0x7d, 0x58, 0x3a, 0x70, 0x8d, 0x0d,
0x1b, 0x9e, 0x27, 0xa0, 0x1e, 0x70, 0x3d, 0x05, 0xcb, 0x07, 0xee, 0x97, 0x6e, 0x9f, 0xf4, 0x41, 0xcf, 0x25, 0xa8, 0x07, 0x5c, 0x4f, 0xc3, 0xf2, 0x81, 0xfb, 0xa5, 0xdb, 0x27, 0x7d, 0x50, 0xee,
0xb9, 0x27, 0xa4, 0xc3, 0xa3, 0x38, 0x55, 0x99, 0x7a, 0xbe, 0xf4, 0xed, 0x9c, 0xb9, 0x28, 0x0d, 0x09, 0xe9, 0xf0, 0x28, 0x4e, 0x74, 0xa6, 0x9e, 0x2f, 0x7d, 0x3b, 0x67, 0x2e, 0x4a, 0xc2, 0x11,
0x47, 0x2c, 0x01, 0x6d, 0xf1, 0xc8, 0xb1, 0x5b, 0xf0, 0x97, 0x3e, 0x3b, 0xf6, 0x51, 0xbb, 0x7d, 0x93, 0xa0, 0x2d, 0x1e, 0x39, 0x76, 0x0b, 0xfe, 0xd2, 0x67, 0xc7, 0x3e, 0x6a, 0xb7, 0x0f, 0xda,
0xd0, 0xb6, 0x73, 0xf5, 0xf8, 0xf0, 0x98, 0xb0, 0xbf, 0x52, 0x9e, 0x30, 0xb4, 0x42, 0xe2, 0xee, 0x76, 0xae, 0x1e, 0x1f, 0x1e, 0x25, 0xfb, 0x2b, 0xe1, 0x92, 0xa1, 0x15, 0xa4, 0xbb, 0x1f, 0xf9,
0x47, 0xfe, 0x22, 0xd5, 0xac, 0x7b, 0xf8, 0xb2, 0x6f, 0x93, 0xff, 0x9f, 0x2a, 0x8a, 0x60, 0x69, 0x8b, 0x54, 0xb3, 0xee, 0xe1, 0xcb, 0xbe, 0x4d, 0xfe, 0x7f, 0xaa, 0x28, 0x82, 0x65, 0xc4, 0x9a,
0xb1, 0x26, 0x89, 0x48, 0x63, 0xa9, 0x05, 0x58, 0x60, 0x1b, 0x92, 0x89, 0xb6, 0x35, 0xfe, 0x5d, 0x48, 0x91, 0xc4, 0xca, 0x08, 0xb0, 0xc0, 0x36, 0x24, 0x13, 0x63, 0x6b, 0xfc, 0xbb, 0x78, 0x8e,
0x3c, 0x47, 0x3b, 0x0a, 0xd0, 0x34, 0xc9, 0xe1, 0x44, 0xe7, 0x05, 0x97, 0x58, 0x8b, 0xd8, 0x83, 0x71, 0x14, 0xa0, 0x99, 0x26, 0x87, 0x13, 0x93, 0x17, 0x5c, 0x62, 0x2d, 0x62, 0x0f, 0x32, 0xec,
0x0c, 0x7b, 0xb0, 0x15, 0x76, 0x47, 0x61, 0x73, 0x44, 0xac, 0x6c, 0x33, 0xa4, 0xc9, 0x84, 0x47, 0xc1, 0x56, 0xd8, 0x1d, 0x8d, 0xcd, 0x11, 0xb1, 0xb2, 0xcd, 0x90, 0xca, 0x09, 0x8f, 0x4e, 0x9a,
0x27, 0x4d, 0x42, 0x53, 0x25, 0x70, 0x17, 0x18, 0x56, 0xc0, 0x78, 0x03, 0x7f, 0xe0, 0x5f, 0xab, 0x84, 0x26, 0x5a, 0xe0, 0x2e, 0x30, 0xac, 0x81, 0xf1, 0x06, 0xfe, 0xc0, 0xbf, 0x56, 0xf1, 0xb4,
0x78, 0xda, 0x2f, 0x9e, 0x0e, 0x8a, 0xa7, 0xc3, 0xe2, 0xa9, 0x6d, 0x15, 0x8f, 0x47, 0xc5, 0xd3, 0x5f, 0x3c, 0x1d, 0x14, 0x4f, 0x87, 0xc5, 0x53, 0xdb, 0x2a, 0x1e, 0x8f, 0x8a, 0xa7, 0xb7, 0xc5,
0xdb, 0xe2, 0xe9, 0xd8, 0x3c, 0x35, 0x34, 0x79, 0x73, 0xc4, 0x10, 0xca, 0xde, 0x49, 0x01, 0x90, 0xd3, 0x71, 0xfa, 0xd4, 0x30, 0xe4, 0xd3, 0x23, 0x86, 0x50, 0xf6, 0x4e, 0x0a, 0x80, 0x5c, 0xe3,
0x6b, 0xdc, 0x48, 0xa0, 0x53, 0xee, 0x48, 0x3c, 0x67, 0x92, 0xb5, 0x72, 0xff, 0x87, 0x27, 0xb7, 0xa9, 0x04, 0x26, 0xe5, 0x8e, 0xc4, 0x73, 0x26, 0x59, 0x2b, 0xf7, 0x7f, 0x78, 0x72, 0xcb, 0x28,
0x8c, 0xb2, 0x14, 0x63, 0xbf, 0x68, 0xfd, 0xe0, 0x71, 0x3b, 0x94, 0x83, 0xe2, 0x90, 0x83, 0xd7, 0x4b, 0x31, 0xf6, 0x8b, 0xd6, 0x0f, 0x1e, 0xb7, 0x43, 0x39, 0x28, 0x0e, 0x39, 0x78, 0x8d, 0xb1,
0x18, 0xcb, 0xf9, 0x3a, 0x2c, 0x50, 0x0e, 0xb7, 0x3c, 0xa4, 0x3d, 0xe3, 0xab, 0xbd, 0x25, 0xca, 0x9c, 0xaf, 0xc3, 0x02, 0xe5, 0x70, 0xcb, 0x43, 0xda, 0x33, 0xbe, 0xda, 0x5b, 0xa2, 0x1c, 0x15,
0x51, 0x71, 0xc8, 0xd1, 0xb6, 0x7c, 0xbd, 0x2d, 0x50, 0xde, 0x6e, 0x79, 0xc8, 0xf1, 0x8c, 0xaf, 0x87, 0x1c, 0x6d, 0xcb, 0xd7, 0xdb, 0x02, 0xe5, 0xed, 0x96, 0x87, 0x1c, 0xcf, 0xf8, 0x3a, 0xce,
0xe3, 0x1c, 0x65, 0xde, 0x58, 0x03, 0xe6, 0x31, 0xfe, 0xc8, 0x4e, 0xb6, 0x21, 0x36, 0x68, 0x15, 0x51, 0xe6, 0x8d, 0x35, 0x60, 0x1e, 0xe3, 0x8f, 0xec, 0x64, 0x1b, 0x62, 0x83, 0x56, 0x41, 0x6c,
0xc4, 0x06, 0x5b, 0xda, 0x6b, 0xb0, 0x9f, 0x73, 0x3c, 0xd8, 0xdf, 0x52, 0xc8, 0x41, 0x61, 0xaf, 0xb0, 0xa5, 0xbd, 0x06, 0xfb, 0x39, 0xc7, 0x83, 0xfd, 0x2d, 0x85, 0x1c, 0x14, 0xf6, 0x1a, 0x1c,
0xc1, 0xc1, 0x96, 0x87, 0x1c, 0xce, 0xf8, 0xda, 0xd2, 0x5e, 0x83, 0x76, 0x71, 0x48, 0x7b, 0x5b, 0x6c, 0x79, 0xc8, 0xe1, 0x8c, 0xaf, 0x2d, 0xed, 0x35, 0x68, 0x17, 0x87, 0xb4, 0xb7, 0xe5, 0xab,
0xbe, 0x0a, 0x7b, 0x0d, 0x8e, 0xb6, 0x3c, 0xe4, 0xed, 0x8c, 0xaf, 0x2d, 0xed, 0x35, 0x38, 0x2e, 0xb0, 0xd7, 0xe0, 0x68, 0xcb, 0x43, 0xde, 0xce, 0xf8, 0xda, 0xd2, 0x5e, 0x83, 0xe3, 0xe2, 0x90,
0x0e, 0x59, 0x34, 0x57, 0x43, 0x47, 0x37, 0x24, 0x54, 0x48, 0x3c, 0x85, 0xcd, 0x22, 0xf1, 0x94, 0x45, 0x73, 0x35, 0x4c, 0x74, 0x43, 0x42, 0x85, 0xc4, 0x53, 0xd8, 0x2c, 0x12, 0x4f, 0x92, 0xc6,
0xd0, 0x78, 0x15, 0xbd, 0x8c, 0x0e, 0xd4, 0x84, 0xf3, 0x84, 0x4f, 0xa6, 0x2a, 0x62, 0x52, 0xd6, 0xab, 0xe8, 0x65, 0x74, 0xa0, 0x26, 0x9c, 0x4b, 0x3e, 0x99, 0xea, 0x88, 0x29, 0x55, 0xeb, 0x34,
0x3a, 0x8d, 0x0c, 0xc9, 0xda, 0x0e, 0xfb, 0xc2, 0x76, 0x2f, 0x44, 0x20, 0x92, 0x19, 0x62, 0x8e, 0x32, 0x24, 0x6b, 0x3b, 0xec, 0x0b, 0xdb, 0xbd, 0x10, 0x81, 0x90, 0x33, 0xc4, 0x1c, 0x8f, 0x42,
0x47, 0x21, 0xa9, 0xae, 0xd2, 0x57, 0x86, 0xfc, 0xcd, 0x76, 0x2f, 0xc7, 0x63, 0xe6, 0x29, 0x39, 0x52, 0x5d, 0xa5, 0xaf, 0x0c, 0xf9, 0x9b, 0xed, 0x5e, 0x8e, 0xc7, 0xcc, 0xd3, 0x6a, 0x86, 0x8d,
0xc3, 0xc6, 0xc4, 0xb9, 0xee, 0xc4, 0xe1, 0x27, 0x18, 0x19, 0xa1, 0xf5, 0x99, 0x60, 0xc3, 0x4e, 0x89, 0x73, 0xdd, 0x89, 0xc3, 0x4f, 0x30, 0x32, 0x42, 0xeb, 0x33, 0xc1, 0x86, 0x9d, 0x88, 0x18,
0x44, 0x8c, 0xdd, 0x84, 0xac, 0x91, 0xf5, 0x38, 0x57, 0x90, 0x3c, 0x47, 0x22, 0x8d, 0x7c, 0x89, 0xbb, 0x09, 0x55, 0x23, 0xeb, 0x71, 0xae, 0x20, 0x79, 0x8e, 0x44, 0x12, 0xf9, 0x0a, 0xe9, 0x5b,
0xf4, 0x2d, 0xcc, 0x40, 0xc4, 0x4c, 0x3e, 0xa6, 0x1d, 0x91, 0xd8, 0x1b, 0xfb, 0x90, 0xb9, 0x3d, 0x98, 0x81, 0x48, 0x3a, 0xf9, 0xa4, 0xed, 0x88, 0xc2, 0xde, 0xd8, 0x87, 0xcc, 0xed, 0x69, 0x1c,
0x85, 0x23, 0x62, 0x34, 0x61, 0x27, 0x1b, 0x28, 0x76, 0x6d, 0x77, 0x0d, 0xa9, 0xac, 0xfa, 0xc5, 0x11, 0xa3, 0x09, 0x3b, 0xd9, 0x40, 0xb1, 0x6b, 0xbb, 0x6b, 0x48, 0x65, 0xd5, 0x2f, 0x96, 0xa0,
0x09, 0xa8, 0x94, 0x40, 0xe7, 0xdd, 0x1b, 0x6c, 0xa2, 0x77, 0x3e, 0x4f, 0xef, 0x2c, 0x60, 0xcf, 0x52, 0x02, 0x9d, 0x77, 0x6f, 0xb0, 0x89, 0xde, 0xf9, 0x3c, 0xbd, 0xb3, 0x80, 0x3d, 0xd3, 0x45,
0x74, 0x91, 0xea, 0x26, 0xfc, 0xb3, 0x79, 0xfc, 0x3e, 0x0c, 0x15, 0x3c, 0x96, 0xe4, 0x3a, 0x65, 0xaa, 0x9b, 0xf0, 0xcf, 0xe6, 0xf1, 0xfb, 0x30, 0x54, 0xf0, 0x58, 0x91, 0xeb, 0x84, 0x65, 0xe2,
0x99, 0x38, 0x3f, 0x47, 0xec, 0x7a, 0x9e, 0xd8, 0x0d, 0xf5, 0x12, 0xf1, 0x73, 0xf8, 0x37, 0x19, 0xfc, 0x1c, 0xb1, 0xeb, 0x79, 0x62, 0x37, 0xd4, 0x93, 0xe2, 0xe7, 0xf0, 0x6f, 0x32, 0x7c, 0xac,
0x3e, 0x56, 0xeb, 0x18, 0xda, 0x02, 0x98, 0xb5, 0x60, 0x2e, 0x4e, 0x68, 0x24, 0x43, 0x2e, 0xe5, 0xd6, 0x31, 0xb4, 0x05, 0x30, 0x6b, 0xc1, 0x5c, 0x2c, 0x69, 0xa4, 0x42, 0xae, 0xd4, 0x02, 0x85,
0x02, 0x85, 0xac, 0xd0, 0x0e, 0x96, 0x16, 0xda, 0x66, 0x56, 0x68, 0x0f, 0xe0, 0xc1, 0x5a, 0x59, 0xac, 0xd0, 0x0e, 0x96, 0x16, 0xda, 0x66, 0x56, 0x68, 0x0f, 0xe0, 0xc1, 0x5a, 0x59, 0x66, 0x8d,
0x66, 0xb5, 0xc7, 0x80, 0xd3, 0x8f, 0x84, 0x50, 0xc5, 0x16, 0x0c, 0xd9, 0x04, 0x26, 0xac, 0xe0, 0xc7, 0x80, 0xd3, 0x8f, 0x84, 0xd0, 0xc5, 0x16, 0x0c, 0xd9, 0x04, 0x26, 0xac, 0xe0, 0x25, 0x53,
0x25, 0x53, 0x80, 0xac, 0x77, 0x1a, 0x1c, 0x7b, 0x8e, 0x82, 0x90, 0x0c, 0x03, 0x5b, 0xd7, 0xe8, 0x80, 0xaa, 0x77, 0x1a, 0x1c, 0x7b, 0x8e, 0x82, 0x90, 0x0a, 0x03, 0xdb, 0xd4, 0xe8, 0x5e, 0xa4,
0x5e, 0x24, 0x15, 0x8d, 0x3c, 0x46, 0x70, 0x8e, 0xd2, 0x45, 0xfa, 0x32, 0xd2, 0xa5, 0x92, 0xe7, 0x34, 0x8d, 0x3c, 0x46, 0x70, 0x8e, 0x32, 0x45, 0xfa, 0x32, 0x32, 0xa5, 0x92, 0xe7, 0x1b, 0x01,
0x1b, 0x01, 0x6c, 0xac, 0x94, 0x39, 0x8b, 0xe0, 0xdb, 0x8f, 0x46, 0xe8, 0x1b, 0xfa, 0xc0, 0x88, 0x6c, 0xac, 0x94, 0x39, 0x8b, 0xe0, 0xdb, 0x8f, 0xa9, 0xd0, 0x37, 0xf4, 0x81, 0x11, 0x3d, 0xe5,
0x9a, 0x72, 0x39, 0x43, 0x87, 0x3a, 0xec, 0x89, 0x47, 0x96, 0x20, 0xd1, 0x0d, 0xaa, 0xbb, 0x3d, 0x6a, 0x86, 0x0e, 0x75, 0xd8, 0x13, 0x8f, 0x4c, 0x22, 0xd1, 0x0d, 0xaa, 0xbb, 0x3d, 0xc7, 0x0b,
0xc7, 0x0b, 0x11, 0xe0, 0xb2, 0xcc, 0xe4, 0x80, 0xd1, 0x40, 0xf1, 0x90, 0x69, 0xfe, 0xb2, 0x00, 0x11, 0xe0, 0xb2, 0xcc, 0xe4, 0x80, 0xd1, 0x40, 0xf3, 0x90, 0x19, 0xfe, 0xb2, 0x00, 0x27, 0xa8,
0x27, 0xa8, 0xdf, 0x24, 0xdb, 0xd8, 0xc4, 0xdf, 0x20, 0xf3, 0xd8, 0x2f, 0xd0, 0x22, 0x87, 0x94, 0x5f, 0x99, 0x6d, 0x6c, 0xe2, 0x6f, 0x90, 0x79, 0xec, 0x17, 0x68, 0x91, 0x43, 0xca, 0x61, 0xb2,
0xc3, 0x64, 0x97, 0x87, 0x50, 0x14, 0xbc, 0x6c, 0xe0, 0xea, 0xe6, 0x93, 0x5d, 0xa8, 0x1a, 0x7a, 0xcb, 0x43, 0x28, 0x0a, 0x5e, 0x36, 0x70, 0x75, 0xf3, 0xc9, 0x2e, 0x54, 0x0d, 0x3d, 0x88, 0x7b,
0x10, 0xf7, 0x96, 0xa9, 0x27, 0x91, 0x3c, 0x90, 0xee, 0xcd, 0x37, 0xa2, 0xf1, 0xb4, 0x6e, 0x61, 0xcb, 0xf4, 0x93, 0x90, 0x0f, 0xa4, 0x7b, 0xf3, 0x8d, 0x18, 0x3c, 0xa3, 0x5b, 0xd8, 0xbc, 0x03,
0xf3, 0x0e, 0xd0, 0x81, 0x96, 0x64, 0x01, 0x46, 0x92, 0x41, 0xee, 0xf6, 0x74, 0xa7, 0xa8, 0xad, 0x74, 0xa0, 0xa5, 0x58, 0x80, 0x91, 0x94, 0x22, 0x77, 0x7b, 0xa6, 0x53, 0x34, 0x56, 0x00, 0xdf,
0x00, 0xbe, 0x81, 0x73, 0x82, 0xbe, 0x31, 0x40, 0x41, 0x4d, 0xf8, 0x12, 0x33, 0x47, 0xd8, 0x38, 0xc0, 0x39, 0xc1, 0xdc, 0x18, 0xa0, 0xa0, 0x69, 0xf8, 0x92, 0x74, 0x8e, 0xb0, 0x71, 0x1c, 0x81,
0x8e, 0x40, 0x46, 0x68, 0xd5, 0x0f, 0x5a, 0xa4, 0x22, 0xcf, 0x2e, 0x6e, 0xab, 0x9d, 0x86, 0x81, 0x8c, 0xd0, 0xaa, 0x1f, 0xb4, 0x48, 0x45, 0x9d, 0x5d, 0xdc, 0x56, 0x3b, 0x8d, 0x14, 0xc2, 0x2d,
0x70, 0x4b, 0x90, 0x38, 0x95, 0xd8, 0xee, 0x59, 0xa2, 0xf6, 0x80, 0x95, 0x02, 0xa8, 0x4c, 0x0f, 0x41, 0xe2, 0x54, 0x62, 0xbb, 0x67, 0x52, 0xef, 0x01, 0x2b, 0x05, 0x50, 0x99, 0x1e, 0x78, 0x4d,
0xbc, 0xc6, 0x70, 0x02, 0xc3, 0xa3, 0x9d, 0x3f, 0x41, 0xbe, 0x4a, 0xa5, 0x12, 0x21, 0xc1, 0x1e, 0xca, 0x09, 0x0c, 0x8f, 0x76, 0xfe, 0x04, 0xf9, 0x2a, 0x51, 0x5a, 0x84, 0x04, 0x7b, 0xf4, 0x19,
0x7d, 0x46, 0xbf, 0x61, 0xf6, 0x8d, 0x98, 0xba, 0x6d, 0xc6, 0x74, 0x0b, 0x73, 0x9a, 0xbb, 0xa4, 0xfd, 0x46, 0xba, 0x9f, 0x8a, 0x69, 0xda, 0x66, 0x4c, 0xb7, 0x30, 0xa7, 0xb9, 0x4b, 0xda, 0xcd,
0xdd, 0xbc, 0xec, 0x6f, 0xd3, 0x17, 0xce, 0x4b, 0xb5, 0xc6, 0x7d, 0x75, 0x07, 0x7c, 0x93, 0x82, 0xcb, 0xfe, 0x36, 0x7d, 0xe1, 0xbc, 0x54, 0x6b, 0xdc, 0xd7, 0x74, 0xc0, 0x37, 0x09, 0x18, 0x11,
0x11, 0xb1, 0xcb, 0xdd, 0x60, 0x89, 0xcb, 0x3c, 0xb4, 0x86, 0x8a, 0xe2, 0x88, 0x11, 0x81, 0x1b, 0xbb, 0xdc, 0x0d, 0x96, 0xb8, 0xcc, 0x43, 0x6b, 0xa8, 0x29, 0x8e, 0x18, 0x11, 0xb8, 0x01, 0x0c,
0xc0, 0xd0, 0x57, 0xe6, 0xef, 0xcb, 0xda, 0x70, 0x3a, 0x3a, 0x78, 0xf7, 0xee, 0x5d, 0x89, 0x0d, 0x7d, 0x65, 0xfe, 0xbe, 0xac, 0x0d, 0xa7, 0xa3, 0x83, 0x77, 0xef, 0xde, 0x95, 0xd8, 0xb0, 0x5e,
0xeb, 0x75, 0x08, 0xe9, 0x88, 0x21, 0x17, 0xc8, 0x01, 0x11, 0x40, 0xbb, 0x43, 0xc9, 0x34, 0x61, 0x87, 0x90, 0x89, 0x18, 0x72, 0x81, 0x1c, 0x10, 0x01, 0xb4, 0x3b, 0x94, 0x4c, 0x25, 0x1b, 0x3b,
0x63, 0xa7, 0xb8, 0x56, 0x9a, 0x70, 0x35, 0x4d, 0x47, 0x75, 0x4f, 0x84, 0x8d, 0x8f, 0xcc, 0xff, 0xc5, 0xb5, 0xd2, 0x84, 0xeb, 0x69, 0x32, 0xaa, 0x7b, 0x22, 0x6c, 0x7c, 0x64, 0xfe, 0x87, 0xe7,
0xf0, 0x6c, 0x7e, 0xb1, 0x13, 0x87, 0xde, 0x12, 0x2f, 0xd9, 0xfe, 0x1c, 0x05, 0x34, 0x7a, 0xb0, 0xf4, 0x17, 0x3b, 0x71, 0xe8, 0x2d, 0xf1, 0x92, 0xed, 0xcf, 0x51, 0x40, 0xa3, 0x07, 0xdb, 0x35,
0x5d, 0xbd, 0xde, 0x69, 0x50, 0x77, 0x07, 0x8f, 0x1a, 0x3e, 0xf0, 0x18, 0x09, 0xee, 0x89, 0xf1, 0xeb, 0x9d, 0x06, 0x75, 0x77, 0xf0, 0xa8, 0xe1, 0x03, 0x8f, 0x91, 0xe0, 0x9e, 0x18, 0xef, 0x29,
0x9e, 0x84, 0xb3, 0x18, 0xc6, 0x88, 0x49, 0x13, 0xb3, 0xbc, 0xb0, 0xa2, 0x64, 0x5c, 0x0e, 0x8d, 0x38, 0x8b, 0x61, 0x8c, 0xa4, 0x69, 0x62, 0x96, 0x17, 0x56, 0x94, 0x8c, 0xcb, 0x61, 0x2a, 0x3f,
0xfc, 0xe8, 0x79, 0x52, 0xab, 0x80, 0xfa, 0x3e, 0x66, 0xd9, 0x92, 0x06, 0xba, 0x67, 0x65, 0x0d, 0x7a, 0x9e, 0x32, 0x2a, 0xa0, 0xbe, 0x8f, 0x59, 0xb6, 0xa4, 0x81, 0xee, 0x59, 0x59, 0x03, 0xd6,
0x58, 0x0b, 0x26, 0x6a, 0xb7, 0x9a, 0x25, 0x05, 0x68, 0x8a, 0x59, 0x48, 0x48, 0xe0, 0x06, 0x26, 0x82, 0x89, 0xda, 0xad, 0x66, 0x49, 0x01, 0x86, 0x62, 0x16, 0x12, 0x0a, 0xb8, 0x81, 0x49, 0xaf,
0xbd, 0x12, 0xcd, 0x6f, 0xdf, 0x96, 0x0f, 0x19, 0xb9, 0x5a, 0x5b, 0xed, 0x32, 0x4d, 0xe3, 0xca, 0x44, 0xf3, 0xdb, 0xb7, 0xe5, 0x43, 0x46, 0xae, 0xd6, 0x56, 0xbb, 0x4c, 0x33, 0x75, 0x65, 0x33,
0x7a, 0x18, 0x8c, 0x13, 0x2e, 0x12, 0xae, 0x5e, 0xca, 0x23, 0x46, 0xff, 0x8f, 0xb5, 0xa6, 0xda, 0x0c, 0xc6, 0x92, 0x0b, 0xc9, 0xf5, 0x4b, 0x79, 0xc4, 0xe8, 0xff, 0xb1, 0xd6, 0x54, 0xfb, 0xcd,
0x6f, 0x2e, 0xe3, 0x33, 0x84, 0x79, 0x77, 0x16, 0x66, 0x19, 0xa5, 0x2e, 0xba, 0x46, 0x39, 0x00, 0x65, 0x7c, 0x86, 0x30, 0xef, 0xce, 0xc2, 0x2c, 0xa3, 0xd4, 0x45, 0xd7, 0x28, 0x07, 0x80, 0xdb,
0xdc, 0x2e, 0x97, 0x98, 0x76, 0xfc, 0x55, 0x91, 0x04, 0x7d, 0xda, 0x10, 0x44, 0x85, 0x6c, 0x37, 0xe5, 0x0a, 0xd3, 0x8e, 0xbf, 0x2a, 0x92, 0xa0, 0x4f, 0x1b, 0x82, 0xa8, 0x90, 0xed, 0x06, 0x57,
0xb8, 0x3a, 0xb7, 0x56, 0x41, 0xed, 0x17, 0x50, 0x5d, 0x00, 0x5b, 0x05, 0x75, 0x90, 0x97, 0xf3, 0xe7, 0xd6, 0x2a, 0xa8, 0xfd, 0x02, 0xaa, 0x0b, 0x60, 0xab, 0xa0, 0x0e, 0xf2, 0x72, 0xbe, 0x32,
0x95, 0x11, 0xf9, 0x36, 0x87, 0x20, 0xbb, 0xe4, 0xeb, 0x94, 0x2b, 0xb6, 0x8a, 0xd4, 0x71, 0x01, 0x22, 0xdf, 0xe6, 0x10, 0x64, 0x97, 0x7c, 0x9d, 0x72, 0xcd, 0x56, 0x91, 0x3a, 0x2e, 0x00, 0xb3,
0x98, 0x55, 0xfa, 0x95, 0xac, 0xbd, 0x2b, 0x43, 0x6e, 0x22, 0x0d, 0x89, 0xc3, 0xd2, 0xe1, 0x46, 0x4a, 0xbf, 0x92, 0xb5, 0x77, 0x65, 0xc8, 0x4d, 0xa4, 0x21, 0x71, 0x58, 0x26, 0xdc, 0xc8, 0x1a,
0xd6, 0x88, 0xd2, 0x46, 0xcd, 0x85, 0x21, 0x4b, 0x80, 0xda, 0x6a, 0x60, 0x2b, 0x4f, 0x47, 0xb6, 0x51, 0xda, 0xa8, 0xb9, 0x30, 0x64, 0x12, 0xa8, 0xad, 0x06, 0xb6, 0xf2, 0x74, 0x64, 0xbb, 0x05,
0x5b, 0x00, 0x7d, 0x5d, 0xa9, 0x69, 0xb0, 0x46, 0x1f, 0x5c, 0x95, 0xad, 0xca, 0x3a, 0x94, 0x58, 0xd0, 0xd7, 0x95, 0x9a, 0x06, 0x6b, 0xf4, 0xc1, 0x55, 0xd9, 0xaa, 0xac, 0x43, 0x89, 0xb5, 0x18,
0x8b, 0xf1, 0xb5, 0xe2, 0xda, 0x96, 0xa1, 0x57, 0xed, 0xf9, 0xe1, 0x73, 0x03, 0x5c, 0xa7, 0x14, 0x5f, 0x2b, 0xae, 0x6d, 0x19, 0x7a, 0xd5, 0x9e, 0x1f, 0x3e, 0x37, 0xc0, 0x75, 0x4a, 0x91, 0x96,
0x69, 0xc6, 0xe3, 0x78, 0x34, 0x16, 0x18, 0x6e, 0xba, 0x1b, 0xbc, 0x83, 0xe2, 0x00, 0xd1, 0x56, 0x7a, 0x1c, 0x8f, 0xc6, 0x02, 0xc3, 0xcd, 0x74, 0x83, 0x77, 0x50, 0x1c, 0x20, 0xda, 0xca, 0x29,
0x4e, 0x11, 0x77, 0x1b, 0x52, 0x58, 0x73, 0xc1, 0xf3, 0x48, 0x68, 0x3a, 0xa7, 0x0f, 0x22, 0xf1, 0xe2, 0x6e, 0x43, 0x0a, 0x6b, 0x2e, 0x78, 0x1e, 0x09, 0xd3, 0xce, 0xe9, 0x83, 0x90, 0x1e, 0xd6,
0xb0, 0x7e, 0x3c, 0x93, 0x51, 0xd1, 0x33, 0x6e, 0x48, 0x59, 0x1f, 0xf2, 0xd6, 0x26, 0x73, 0xc5, 0x8f, 0x67, 0x32, 0x2a, 0x7a, 0xc6, 0x0d, 0x29, 0xeb, 0x43, 0xde, 0xda, 0x64, 0xae, 0x58, 0x54,
0xa2, 0x62, 0x91, 0x09, 0x0d, 0x43, 0x4a, 0x3c, 0x91, 0x60, 0xdf, 0x05, 0xfa, 0xd8, 0x40, 0x68, 0x2c, 0x32, 0xa1, 0x61, 0x48, 0x89, 0x27, 0x24, 0xf6, 0x5d, 0xa0, 0x8f, 0x0d, 0x84, 0x06, 0x57,
0x70, 0x95, 0x11, 0xca, 0x6b, 0x21, 0xc1, 0xfb, 0x01, 0x31, 0x1e, 0x83, 0x4a, 0x4b, 0xd2, 0x7d, 0x19, 0xa1, 0xbc, 0x16, 0x12, 0xbc, 0x1f, 0x10, 0xe3, 0x31, 0xa8, 0xb4, 0x24, 0xdd, 0xd7, 0x4f,
0xfd, 0xb4, 0x54, 0xba, 0xbd, 0xfd, 0x76, 0x3b, 0x0f, 0x2c, 0x7c, 0xb2, 0x66, 0x91, 0xb5, 0xa4, 0x4b, 0xa5, 0xdb, 0xdb, 0x6f, 0xb7, 0xf3, 0xc0, 0xc2, 0x27, 0x6b, 0x16, 0x59, 0x4b, 0x4a, 0x6e,
0xe4, 0x9a, 0x2e, 0xec, 0x77, 0xc1, 0x41, 0xe2, 0x33, 0x68, 0x5b, 0xb0, 0x9a, 0x9b, 0xfe, 0x40, 0xda, 0x85, 0xfd, 0x2e, 0x38, 0x48, 0x7c, 0x06, 0x6d, 0x0b, 0x56, 0xf3, 0xb4, 0x3f, 0x30, 0x05,
0x17, 0x08, 0xac, 0x0f, 0xb7, 0x42, 0x03, 0xcd, 0xd2, 0xbb, 0xbe, 0x92, 0x77, 0x3b, 0x2c, 0xcc, 0x02, 0xeb, 0xc3, 0xad, 0x30, 0x40, 0xb3, 0xf4, 0x6e, 0xae, 0xe4, 0xdd, 0x0e, 0x0b, 0xf3, 0x19,
0x67, 0x70, 0x0f, 0x9b, 0xe3, 0x93, 0x5f, 0xc6, 0x14, 0xbf, 0x74, 0xdc, 0x61, 0x5b, 0x30, 0xe6, 0xdc, 0xc3, 0xe6, 0xf8, 0xe4, 0x97, 0x31, 0xc5, 0x2f, 0x1d, 0x77, 0xd8, 0x16, 0x8c, 0xb9, 0x0c,
0x49, 0xf8, 0x44, 0x13, 0x06, 0x4d, 0x22, 0x0f, 0x7c, 0xe2, 0x0b, 0x26, 0xb1, 0xbb, 0x02, 0xa3, 0x9f, 0xa8, 0x64, 0xd0, 0x24, 0xf2, 0xc0, 0x27, 0xbe, 0x60, 0x0a, 0xbb, 0x2b, 0x30, 0x9a, 0x17,
0x79, 0x41, 0xea, 0xb3, 0xac, 0xf9, 0x93, 0x69, 0x8c, 0x79, 0xa3, 0x6e, 0x4a, 0x04, 0x0b, 0xe7, 0x24, 0x3e, 0xcb, 0x9a, 0x3f, 0x95, 0xc4, 0x98, 0x37, 0xea, 0x69, 0x89, 0x60, 0xe1, 0x5c, 0xad,
0x6a, 0xc5, 0xac, 0x3c, 0x99, 0xc3, 0xdd, 0xcb, 0x30, 0x0d, 0xa8, 0xca, 0x31, 0xcd, 0x87, 0x93, 0x98, 0x95, 0xa7, 0xf4, 0x70, 0xf7, 0x32, 0x4c, 0x02, 0xaa, 0x73, 0xcc, 0xf4, 0xc3, 0xc9, 0x06,
0x0d, 0xba, 0x3c, 0xcb, 0xba, 0x15, 0xcb, 0xe0, 0xf0, 0xe8, 0x31, 0xbb, 0x98, 0xd3, 0xfb, 0x25, 0x5d, 0x9e, 0x65, 0xdd, 0x8a, 0x95, 0xe2, 0xf0, 0xe8, 0x31, 0xbb, 0x98, 0x33, 0xfb, 0x25, 0x64,
0x64, 0xbc, 0xdc, 0x2e, 0x10, 0x7b, 0x5a, 0x81, 0x01, 0x8b, 0x26, 0x6a, 0x0a, 0x21, 0xbf, 0x5f, 0xbc, 0xdc, 0x2e, 0x10, 0x7b, 0x46, 0x81, 0x01, 0x8b, 0x26, 0x7a, 0x0a, 0x21, 0xbf, 0x5f, 0xd0,
0xd0, 0x91, 0x82, 0xb0, 0x8c, 0x11, 0xc3, 0x82, 0xc4, 0x1e, 0xcc, 0xa3, 0x41, 0x00, 0xed, 0x10, 0x51, 0x82, 0xb0, 0x8c, 0x91, 0x94, 0x05, 0x85, 0x3d, 0x98, 0x47, 0x83, 0x00, 0xda, 0x21, 0x86,
0x43, 0xb1, 0xa5, 0x5a, 0xb4, 0xd2, 0xd9, 0xab, 0x32, 0x9a, 0x9b, 0x20, 0x4f, 0xd7, 0x79, 0x1a, 0x62, 0x2b, 0xbd, 0x68, 0xa5, 0xb3, 0x57, 0x65, 0x34, 0x37, 0x41, 0x9e, 0xae, 0xf3, 0x34, 0x38,
0x9c, 0xaf, 0x56, 0xba, 0xab, 0x86, 0x52, 0x51, 0xf4, 0x7e, 0xd9, 0x15, 0x52, 0xc9, 0x80, 0x5a, 0x5f, 0xad, 0x4c, 0x57, 0x0d, 0xa5, 0xa2, 0xe8, 0xfd, 0xb2, 0x2b, 0xa4, 0x92, 0x01, 0x8d, 0x92,
0x49, 0x4b, 0x8c, 0xf0, 0xe6, 0x97, 0x77, 0xc7, 0xc7, 0xc7, 0xa7, 0xa4, 0x33, 0x72, 0x6f, 0x3e, 0x96, 0x18, 0xe1, 0xcd, 0x2f, 0xef, 0x8e, 0x8f, 0x8f, 0x4f, 0x49, 0x67, 0xe4, 0xde, 0x7c, 0xbe,
0xdf, 0xdd, 0x11, 0x1c, 0x53, 0xb0, 0x4f, 0xc6, 0xeb, 0x79, 0x82, 0xcc, 0x7a, 0x22, 0x8a, 0x30, 0xbb, 0x23, 0x38, 0xa6, 0x60, 0x9f, 0x8c, 0xd7, 0xf3, 0x04, 0x99, 0xf5, 0x44, 0x14, 0x61, 0x3a,
0x9d, 0x00, 0xf3, 0x20, 0x37, 0x4b, 0x22, 0x1a, 0x90, 0xa9, 0x90, 0x4a, 0xee, 0x98, 0x70, 0x42, 0x01, 0xe6, 0x41, 0x6e, 0x26, 0x23, 0x1a, 0x90, 0xa9, 0x50, 0x5a, 0xed, 0xa4, 0xe1, 0x84, 0x36,
0x1b, 0x86, 0xf4, 0x85, 0xf0, 0x10, 0xaa, 0x84, 0xd2, 0xb2, 0x01, 0x43, 0x31, 0x34, 0xb5, 0x50, 0x0c, 0xe9, 0x0b, 0xe1, 0x21, 0x54, 0x09, 0x6d, 0x64, 0x03, 0x86, 0x62, 0x68, 0x6a, 0xa1, 0x16,
0x8b, 0x23, 0xdd, 0xf0, 0x8f, 0xf5, 0xf5, 0x23, 0xd4, 0xcf, 0xd1, 0x1c, 0x87, 0x18, 0x3b, 0x64, 0x47, 0xa6, 0xe1, 0x1f, 0x9b, 0xeb, 0x47, 0xa8, 0x9f, 0xa3, 0x39, 0x0e, 0x31, 0x76, 0xc8, 0x88,
0xc4, 0x24, 0x16, 0x58, 0x09, 0xd9, 0x02, 0x86, 0x16, 0x6c, 0xbd, 0x48, 0x0a, 0x0d, 0x99, 0x88, 0x29, 0x2c, 0xb0, 0x0a, 0xb2, 0x05, 0x0c, 0x2d, 0xd8, 0x7a, 0x91, 0x04, 0x1a, 0x32, 0x11, 0x31,
0x18, 0x62, 0x01, 0x2d, 0x78, 0x91, 0x2c, 0x31, 0xea, 0xa3, 0x50, 0xdd, 0x08, 0x3a, 0xba, 0xf6, 0xc4, 0x02, 0x5a, 0xf0, 0xa2, 0x98, 0x4c, 0xd5, 0x47, 0xa1, 0xba, 0x11, 0x74, 0x74, 0xe3, 0x05,
0x02, 0xab, 0x02, 0x5e, 0x8f, 0xec, 0x28, 0x38, 0x27, 0x78, 0xa9, 0x15, 0x8c, 0x82, 0xb3, 0x30, 0x56, 0x05, 0xbc, 0x1e, 0xd9, 0xd1, 0x70, 0x4e, 0xf0, 0x52, 0x2b, 0x18, 0x05, 0x67, 0x61, 0xf0,
0x78, 0xf6, 0xc9, 0xe5, 0xb0, 0x8f, 0x5c, 0x03, 0x95, 0x50, 0x8b, 0x85, 0x94, 0x91, 0x3d, 0x6c, 0xec, 0x93, 0xcb, 0x61, 0x1f, 0xb9, 0x06, 0x2a, 0xa1, 0x11, 0x0b, 0x29, 0x23, 0x7b, 0xd8, 0x26,
0x13, 0x51, 0xbc, 0xea, 0xd2, 0xf6, 0x17, 0xb5, 0x50, 0xf6, 0x6a, 0x5c, 0x2b, 0xac, 0xf1, 0x0f, 0xa2, 0x78, 0xd5, 0xa5, 0xed, 0x2f, 0x6a, 0xa1, 0xec, 0xd5, 0xb8, 0x56, 0x58, 0xe3, 0x1f, 0xf0,
0xf8, 0xb4, 0xd6, 0xf4, 0x6b, 0x97, 0x9e, 0xb9, 0x33, 0x1e, 0xab, 0x0f, 0x75, 0xad, 0xac, 0xf9, 0x69, 0xa3, 0xe9, 0xd7, 0x2e, 0x3d, 0x73, 0x67, 0x3c, 0xd6, 0x1c, 0xea, 0x5a, 0x59, 0xf3, 0x8d,
0xc6, 0xb7, 0x4d, 0x6d, 0xe9, 0x67, 0xe3, 0x7c, 0xe7, 0x89, 0x78, 0x60, 0xc9, 0x52, 0xa7, 0xcd, 0x6f, 0x9b, 0xda, 0xd2, 0xcf, 0xa9, 0xf3, 0x9d, 0x4b, 0xf1, 0xc0, 0xe4, 0x52, 0xa7, 0xcd, 0x6a,
0x6a, 0xe3, 0xcd, 0xf0, 0x95, 0xd7, 0x2e, 0xbb, 0x46, 0xbc, 0xf9, 0xdc, 0xff, 0x34, 0x58, 0x99, 0xe3, 0xcd, 0xf0, 0x95, 0xd7, 0x2e, 0xbb, 0x46, 0xbc, 0xf9, 0xdc, 0xff, 0x34, 0x58, 0x99, 0x18,
0x18, 0xad, 0xe5, 0x97, 0x7e, 0x59, 0x67, 0x8c, 0x9a, 0xc8, 0x04, 0xf5, 0xc0, 0x4d, 0xa1, 0x10, 0xad, 0xe5, 0x97, 0x7e, 0x59, 0x67, 0x8c, 0x9a, 0xc8, 0x04, 0xf5, 0xc0, 0x4d, 0xa1, 0x10, 0x71,
0x71, 0x1a, 0x80, 0x0d, 0x13, 0x34, 0x28, 0xb6, 0xd9, 0xd0, 0xa8, 0x81, 0x55, 0xa0, 0x65, 0x03, 0x1a, 0x80, 0x0d, 0x25, 0x1a, 0x14, 0xdb, 0x6c, 0x68, 0xd4, 0xc0, 0x2a, 0xd0, 0xb2, 0x81, 0xb5,
0x6b, 0xa5, 0x38, 0xa1, 0x64, 0xf6, 0xc3, 0xdb, 0x70, 0x6d, 0xdf, 0x5b, 0x86, 0x20, 0xb9, 0xd1, 0x12, 0x9c, 0x50, 0x32, 0xfb, 0xe1, 0x6d, 0xb8, 0xb1, 0xef, 0x2d, 0x43, 0x90, 0xdc, 0x68, 0x86,
0x34, 0xa5, 0x18, 0x0e, 0x81, 0x4e, 0xdb, 0x27, 0x63, 0x81, 0xc8, 0x02, 0x36, 0x92, 0xdc, 0x3f, 0x52, 0x0c, 0x87, 0x40, 0xa7, 0xed, 0x93, 0xb1, 0x40, 0x64, 0x01, 0x1b, 0x32, 0xf7, 0x8f, 0x9d,
0x76, 0x72, 0xf7, 0x82, 0x8e, 0x3e, 0x59, 0x88, 0x5a, 0xeb, 0x75, 0xd8, 0xde, 0x7c, 0xfe, 0x32, 0xdc, 0xbd, 0xa0, 0xa3, 0x97, 0x0b, 0x51, 0x6b, 0xbd, 0x0e, 0xdb, 0x9b, 0xcf, 0x5f, 0x86, 0x97,
0xbc, 0x1c, 0x2c, 0x28, 0xe1, 0xb0, 0x69, 0x58, 0xef, 0x67, 0x67, 0x94, 0xf4, 0x97, 0x1f, 0x3d, 0x83, 0x05, 0x25, 0x1c, 0x36, 0x53, 0xd6, 0xfb, 0xd9, 0x19, 0x25, 0xfd, 0xe5, 0x47, 0xcf, 0x74,
0xd3, 0xe1, 0xe7, 0xfe, 0xd9, 0x70, 0x51, 0x8f, 0x47, 0x87, 0x86, 0xc4, 0x45, 0xc0, 0x51, 0xc4, 0xf8, 0xb9, 0x7f, 0x36, 0x5c, 0xd4, 0xe3, 0xd1, 0x61, 0x4a, 0xe2, 0x22, 0xe0, 0x28, 0x62, 0xaf,
0x5e, 0x77, 0x4d, 0xe2, 0xb8, 0xf9, 0x7c, 0xd1, 0xeb, 0x1a, 0x25, 0x96, 0x39, 0xe8, 0xea, 0x74, 0xbb, 0x26, 0x71, 0xdc, 0x7c, 0xbe, 0xe8, 0x75, 0x53, 0x25, 0x96, 0x39, 0xe8, 0x9a, 0x74, 0x41,
0x41, 0xee, 0x44, 0xcc, 0xbd, 0x75, 0x14, 0xba, 0xaf, 0x8c, 0xa8, 0x23, 0xf2, 0x0a, 0x6f, 0x57, 0xee, 0x44, 0xcc, 0xbd, 0x75, 0x14, 0xba, 0xaf, 0x8c, 0x68, 0x22, 0xf2, 0x0a, 0x6f, 0x57, 0x37,
0x37, 0x63, 0x5f, 0x2d, 0x4f, 0x5c, 0xfd, 0x74, 0x04, 0xe3, 0xdd, 0xb4, 0x3c, 0xb5, 0x6f, 0x70, 0x63, 0x5f, 0x2d, 0x4f, 0x5c, 0xfd, 0x64, 0x04, 0xe3, 0xdd, 0xb4, 0x3c, 0xb5, 0x6f, 0x70, 0xbd,
0xbd, 0xf3, 0xac, 0x0f, 0x87, 0xae, 0xd9, 0xda, 0x38, 0x79, 0x12, 0x3d, 0x1e, 0x6d, 0x5b, 0xde, 0xf3, 0x9b, 0xa2, 0x16, 0x69, 0x1c, 0xa6, 0x66, 0xd5, 0x90, 0xbc, 0x21, 0x26, 0x3e, 0x48, 0x08,
0xc3, 0xbf, 0x94, 0x5a, 0x52, 0xd9, 0xb5, 0x3f, 0xe4, 0x85, 0x3d, 0xcb, 0x28, 0x18, 0xbe, 0x73, 0x2f, 0x14, 0x06, 0xcf, 0x4d, 0x55, 0xed, 0xce, 0xce, 0x47, 0x58, 0x6b, 0xe3, 0x0c, 0x4b, 0xcc,
0xb3, 0x7e, 0x39, 0x8a, 0x61, 0xe9, 0x9f, 0x0c, 0xe2, 0xf9, 0x5b, 0x85, 0x75, 0xb1, 0xac, 0x4b, 0xa0, 0xb5, 0x6d, 0xa3, 0x10, 0xfe, 0xa5, 0xf5, 0x92, 0x1e, 0xc1, 0x78, 0x56, 0xde, 0x22, 0x64,
0x13, 0x9e, 0xad, 0xb5, 0xf3, 0x87, 0x48, 0xa1, 0x08, 0x44, 0x40, 0x1d, 0x32, 0x12, 0x3a, 0x36, 0xb9, 0x09, 0x13, 0xc1, 0xdc, 0xad, 0x41, 0x39, 0x1f, 0xc0, 0xd2, 0x3f, 0x99, 0x0e, 0xe6, 0xef,
0x34, 0x0e, 0xfe, 0x84, 0x91, 0x5e, 0x5f, 0xe7, 0x28, 0x5c, 0x09, 0xb0, 0x93, 0x20, 0x26, 0xdc, 0x27, 0xd6, 0x65, 0x05, 0x53, 0xe4, 0xf0, 0x6c, 0xa3, 0x9d, 0x3f, 0x44, 0x02, 0xe5, 0x24, 0x02,
0xe0, 0x34, 0xbd, 0xf6, 0xeb, 0xd9, 0x08, 0x9a, 0x96, 0x5f, 0x31, 0xb5, 0xe9, 0xb2, 0x64, 0xb2, 0xea, 0x90, 0xdb, 0x30, 0x44, 0x40, 0xe9, 0xfe, 0x84, 0x91, 0x5e, 0xdf, 0x64, 0x3b, 0x5c, 0x09,
0x23, 0x99, 0xc2, 0xd9, 0xa0, 0xdc, 0xba, 0x95, 0x4f, 0x9c, 0x7d, 0x01, 0x29, 0x1b, 0x39, 0x32, 0xd0, 0x0a, 0x24, 0x0d, 0x5c, 0x38, 0xcd, 0xac, 0xfd, 0x7a, 0x36, 0x82, 0xf6, 0xe7, 0x57, 0x4c,
0x44, 0x16, 0xc2, 0xf9, 0xfa, 0xe3, 0xda, 0x1e, 0x07, 0x66, 0x20, 0x97, 0x60, 0xcc, 0xbd, 0x94, 0x92, 0xa6, 0xc0, 0xa5, 0x79, 0x96, 0x4c, 0xe1, 0x6c, 0x50, 0x6e, 0xdd, 0xca, 0x67, 0xd7, 0xbe,
0x2e, 0xd6, 0xaf, 0x7b, 0xcb, 0xf1, 0x9a, 0xcd, 0x85, 0xee, 0x08, 0x9b, 0xa2, 0x4d, 0xf3, 0xca, 0x80, 0xe4, 0x8f, 0x1c, 0xa5, 0x44, 0x16, 0x12, 0xc3, 0xf5, 0xc7, 0xb5, 0xdd, 0x12, 0x4c, 0x53,
0x75, 0xdf, 0xf8, 0x09, 0xe4, 0x86, 0xa8, 0x06, 0x2e, 0x62, 0xe6, 0xf6, 0xb5, 0xae, 0x75, 0xad, 0x2e, 0xc1, 0xe8, 0x7d, 0x29, 0x5d, 0xd1, 0x5f, 0xf7, 0x96, 0xe3, 0x35, 0x9b, 0x0b, 0x7d, 0x16,
0x2f, 0xb8, 0x3e, 0x45, 0x8d, 0x4f, 0xe3, 0xf1, 0x86, 0x7b, 0xad, 0x6b, 0x68, 0xad, 0xc8, 0xdc, 0xb6, 0x57, 0x9b, 0x26, 0x9f, 0xeb, 0x7e, 0xea, 0x27, 0x90, 0x65, 0xa2, 0x1a, 0xb8, 0x48, 0x7a,
0xe5, 0x1d, 0xd9, 0x7c, 0xe7, 0x76, 0x7d, 0x01, 0x28, 0xfa, 0xc6, 0x0e, 0xd9, 0x42, 0xc5, 0x9d, 0x03, 0xb0, 0xd6, 0xb5, 0xae, 0xcd, 0x55, 0xd9, 0xa7, 0xa8, 0xf1, 0x69, 0x3c, 0xde, 0x70, 0x43,
0xe7, 0xf6, 0x38, 0x99, 0xbb, 0x7b, 0xcb, 0x80, 0x9b, 0xaf, 0x26, 0x9e, 0x59, 0x85, 0x5e, 0x9c, 0x76, 0x0d, 0x4d, 0x1a, 0x99, 0xbb, 0x06, 0x24, 0x9b, 0x6f, 0xef, 0xae, 0x2f, 0x00, 0xc5, 0xdc,
0x53, 0xa0, 0x9d, 0x72, 0x49, 0xbd, 0xa4, 0xff, 0xd6, 0xab, 0x21, 0xec, 0xa7, 0xd0, 0xf7, 0x57, 0xfd, 0x21, 0x5b, 0xa8, 0xb8, 0xf3, 0xdc, 0x1e, 0x27, 0x73, 0xb7, 0x78, 0x19, 0x70, 0xf3, 0xd5,
0xb7, 0x07, 0x39, 0xb6, 0xb5, 0x06, 0xfd, 0x60, 0x33, 0xfa, 0x0c, 0x3b, 0x4f, 0xe2, 0x7d, 0x7d, 0xec, 0x34, 0xab, 0xf5, 0x8b, 0x13, 0x0f, 0x34, 0x66, 0x2e, 0xa9, 0x97, 0xf4, 0xdf, 0x7a, 0x35,
0x65, 0x87, 0xae, 0x16, 0xa7, 0x72, 0x1a, 0xf0, 0xe8, 0x21, 0x4f, 0x0b, 0x22, 0x9a, 0x73, 0x5f, 0xce, 0xfd, 0x14, 0xfa, 0xfe, 0xea, 0x46, 0x23, 0xc7, 0xb6, 0xd6, 0xa0, 0x1f, 0x6c, 0x46, 0x9f,
0x50, 0xf5, 0x18, 0x3f, 0x33, 0xaa, 0x29, 0x14, 0x69, 0x49, 0x1f, 0xb3, 0x2b, 0x1f, 0xfc, 0x24, 0x61, 0xe7, 0xe5, 0xa0, 0x6f, 0x2e, 0xff, 0xd0, 0xd5, 0xe2, 0x44, 0x4d, 0x03, 0x1e, 0x3d, 0xe4,
0x5e, 0xe4, 0x65, 0xab, 0xf2, 0x04, 0x56, 0xcf, 0x1a, 0x9f, 0x3c, 0xd9, 0x47, 0x93, 0x6a, 0xae, 0x09, 0x46, 0x44, 0x73, 0xee, 0x0b, 0xaa, 0x1e, 0xe3, 0x07, 0x4b, 0x3d, 0x85, 0x72, 0xaf, 0xe8,
0x78, 0xe8, 0x27, 0x55, 0x8a, 0x1e, 0x04, 0xe3, 0x66, 0x54, 0x30, 0xc7, 0xe3, 0xd9, 0xd0, 0x66, 0x63, 0x76, 0x79, 0x84, 0x1f, 0xd7, 0x8b, 0x0c, 0x6f, 0x55, 0x9e, 0xc0, 0xea, 0x59, 0x0b, 0x95,
0x82, 0x01, 0xe8, 0xea, 0x88, 0xc4, 0x0f, 0x8d, 0x00, 0x59, 0x34, 0x3c, 0x07, 0xee, 0x90, 0x25, 0x97, 0x8d, 0x68, 0x52, 0xcd, 0x15, 0x0f, 0x9d, 0xa9, 0x4e, 0xd0, 0x83, 0x60, 0x70, 0x8d, 0x0a,
0x50, 0x64, 0x74, 0xd8, 0x9f, 0xd3, 0xd4, 0x27, 0x09, 0x34, 0x5f, 0xe5, 0xeb, 0x97, 0xf3, 0xee, 0xe6, 0x78, 0x3c, 0x1b, 0xff, 0xd2, 0x60, 0x00, 0xba, 0x26, 0x22, 0xf1, 0x93, 0x25, 0x40, 0x16,
0xab, 0xb1, 0xb0, 0xd5, 0x6a, 0x63, 0xee, 0xc4, 0x3f, 0xcd, 0xe6, 0xca, 0x91, 0xef, 0xa0, 0x09, 0xad, 0xd3, 0x81, 0x3b, 0x64, 0x12, 0xca, 0x95, 0x09, 0xfb, 0x73, 0x9a, 0xf8, 0x44, 0x42, 0x1b,
0xd9, 0x1d, 0x7f, 0x57, 0xc3, 0x1c, 0x1e, 0x35, 0x61, 0x50, 0xc3, 0xdf, 0x66, 0x73, 0xe5, 0x80, 0x57, 0xbe, 0xc8, 0x39, 0xef, 0xbe, 0x1a, 0x30, 0x5b, 0xad, 0x36, 0x66, 0x61, 0xfc, 0xd3, 0x6c,
0x66, 0x62, 0x05, 0x7f, 0x57, 0x13, 0x6a, 0xbf, 0x3d, 0x42, 0x18, 0xf8, 0x5d, 0x43, 0xe8, 0xdd, 0xae, 0x1c, 0x1e, 0x0f, 0x9a, 0x50, 0x27, 0xf0, 0x77, 0x35, 0xcc, 0xe1, 0x51, 0x13, 0x46, 0x3e,
0x7e, 0x0b, 0x06, 0x2d, 0xfc, 0x5d, 0x4d, 0xa8, 0xd5, 0xd4, 0xa7, 0xe9, 0x3f, 0x6b, 0x48, 0xb5, 0xfc, 0x6d, 0x36, 0x57, 0x8e, 0x7a, 0x69, 0xac, 0xe0, 0xef, 0x6a, 0x42, 0xed, 0xb7, 0x47, 0x08,
0x0c, 0x53, 0xad, 0x32, 0x57, 0x0b, 0xf3, 0x18, 0x24, 0xaf, 0xff, 0x30, 0x16, 0x63, 0x1b, 0x66, 0x03, 0xbf, 0x6b, 0x08, 0xbd, 0xdb, 0x6f, 0xc1, 0xc8, 0x86, 0xbf, 0xab, 0x09, 0xb5, 0x9a, 0xe6,
0x54, 0x85, 0x99, 0x1d, 0xcb, 0x73, 0x2f, 0x8c, 0x13, 0xf1, 0x58, 0x27, 0x43, 0x01, 0x33, 0xc8, 0x34, 0xf3, 0x67, 0x0d, 0xa9, 0x56, 0xca, 0x54, 0xab, 0xcc, 0xd5, 0xc2, 0x64, 0x07, 0xc9, 0xeb,
0x48, 0xd0, 0xc4, 0x37, 0x1d, 0x21, 0x26, 0xcb, 0x2c, 0x31, 0x92, 0x29, 0x04, 0xa5, 0xb6, 0x47, 0x3f, 0x8c, 0xc5, 0xd8, 0xd0, 0xa5, 0xaa, 0xc2, 0xcc, 0x8e, 0x85, 0xbe, 0x17, 0xc6, 0x52, 0x3c,
0x71, 0xf1, 0x88, 0xc5, 0x6a, 0xed, 0xa7, 0xd7, 0x9f, 0xf9, 0x8a, 0x6a, 0xcd, 0x7d, 0xa1, 0xc5, 0xd6, 0xc9, 0x50, 0xc0, 0x34, 0x33, 0x12, 0x54, 0xfa, 0x69, 0x6f, 0x89, 0xc9, 0x32, 0x4b, 0x8c,
0x2f, 0xc5, 0xf0, 0x07, 0xbf, 0x26, 0xe3, 0xa7, 0x65, 0xfc, 0x3f, 0x59, 0xff, 0x03, 0x7a, 0xb5, 0x64, 0x0a, 0x41, 0x69, 0xec, 0x51, 0x5c, 0x61, 0x62, 0xd9, 0x5b, 0xfb, 0x11, 0xf7, 0x67, 0xbe,
0xbc, 0x3e, 0xa3, 0x25, 0x00, 0x00 0xc7, 0x5a, 0x73, 0xdf, 0x7a, 0xf1, 0x9b, 0x33, 0xfc, 0xc1, 0xef, 0xd2, 0xf8, 0x91, 0x1a, 0xff,
0x77, 0xd7, 0xff, 0x00, 0x3d, 0x95, 0x0f, 0xad, 0xed, 0x25, 0x00, 0x00
}; };

File diff suppressed because it is too large Load Diff

View File

@ -105,7 +105,7 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId)
of = offsetAbs; of = offsetAbs;
} }
if (stop > start && of > len -1) of = len -1; if (stop > start && of > len -1) of = len -1;
seg.set(start, stop, grp, spc, of, startY, stopY); seg.setUp(start, stop, grp, spc, of, startY, stopY);
if (seg.reset && seg.stop == 0) return true; // segment was deleted & is marked for reset, no need to change anything else if (seg.reset && seg.stop == 0) return true; // segment was deleted & is marked for reset, no need to change anything else
@ -127,36 +127,43 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId)
JsonArray colarr = elem["col"]; JsonArray colarr = elem["col"];
if (!colarr.isNull()) if (!colarr.isNull())
{ {
for (size_t i = 0; i < 3; i++) if (seg.getLightCapabilities() & 3) {
{ // segment has RGB or White
int rgbw[] = {0,0,0,0}; for (size_t i = 0; i < 3; i++)
bool colValid = false; {
JsonArray colX = colarr[i]; int rgbw[] = {0,0,0,0};
if (colX.isNull()) { bool colValid = false;
byte brgbw[] = {0,0,0,0}; JsonArray colX = colarr[i];
const char* hexCol = colarr[i]; if (colX.isNull()) {
if (hexCol == nullptr) { //Kelvin color temperature (or invalid), e.g 2400 byte brgbw[] = {0,0,0,0};
int kelvin = colarr[i] | -1; const char* hexCol = colarr[i];
if (kelvin < 0) continue; if (hexCol == nullptr) { //Kelvin color temperature (or invalid), e.g 2400
if (kelvin == 0) seg.setColor(i, 0); int kelvin = colarr[i] | -1;
if (kelvin > 0) colorKtoRGB(kelvin, brgbw); if (kelvin < 0) continue;
if (kelvin == 0) seg.setColor(i, 0);
if (kelvin > 0) colorKtoRGB(kelvin, brgbw);
colValid = true;
} else { //HEX string, e.g. "FFAA00"
colValid = colorFromHexString(brgbw, hexCol);
}
for (size_t c = 0; c < 4; c++) rgbw[c] = brgbw[c];
} else { //Array of ints (RGB or RGBW color), e.g. [255,160,0]
byte sz = colX.size();
if (sz == 0) continue; //do nothing on empty array
copyArray(colX, rgbw, 4);
colValid = true; colValid = true;
} else { //HEX string, e.g. "FFAA00"
colValid = colorFromHexString(brgbw, hexCol);
} }
for (size_t c = 0; c < 4; c++) rgbw[c] = brgbw[c];
} else { //Array of ints (RGB or RGBW color), e.g. [255,160,0]
byte sz = colX.size();
if (sz == 0) continue; //do nothing on empty array
copyArray(colX, rgbw, 4); if (!colValid) continue;
colValid = true;
seg.setColor(i, RGBW32(rgbw[0],rgbw[1],rgbw[2],rgbw[3]));
if (seg.mode == FX_MODE_STATIC) strip.trigger(); //instant refresh
} }
} else {
if (!colValid) continue; // non RGB & non White segment (usually On/Off bus)
seg.setColor(0, ULTRAWHITE);
seg.setColor(i, RGBW32(rgbw[0],rgbw[1],rgbw[2],rgbw[3])); seg.setColor(1, BLACK);
if (seg.mode == FX_MODE_STATIC) strip.trigger(); //instant refresh
} }
} }
@ -199,7 +206,9 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId)
getVal(elem["ix"], &seg.intensity); getVal(elem["ix"], &seg.intensity);
uint8_t pal = seg.palette; uint8_t pal = seg.palette;
if (getVal(elem["pal"], &pal)) seg.setPalette(pal); if (seg.getLightCapabilities() & 1) { // ignore palette for White and On/Off segments
if (getVal(elem["pal"], &pal)) seg.setPalette(pal);
}
getVal(elem["c1"], &seg.custom1); getVal(elem["c1"], &seg.custom1);
getVal(elem["c2"], &seg.custom2); getVal(elem["c2"], &seg.custom2);
@ -709,7 +718,7 @@ void serializeInfo(JsonObject root)
#endif #endif
root[F("freeheap")] = ESP.getFreeHeap(); root[F("freeheap")] = ESP.getFreeHeap();
#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM) #if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM)
if (psramFound()) root[F("psram")] = ESP.getFreePsram(); if (psramFound()) root[F("psram")] = ESP.getFreePsram();
#endif #endif
root[F("uptime")] = millis()/1000 + rolloverMillis*4294967; root[F("uptime")] = millis()/1000 + rolloverMillis*4294967;

View File

@ -9,8 +9,8 @@
void parseMQTTBriPayload(char* payload) void parseMQTTBriPayload(char* payload)
{ {
if (strstr(payload, "ON") || strstr(payload, "on") || strstr(payload, "true")) {bri = briLast; stateUpdated(1);} if (strstr(payload, "ON") || strstr(payload, "on") || strstr(payload, "true")) {bri = briLast; stateUpdated(CALL_MODE_DIRECT_CHANGE);}
else if (strstr(payload, "T" ) || strstr(payload, "t" )) {toggleOnOff(); stateUpdated(1);} else if (strstr(payload, "T" ) || strstr(payload, "t" )) {toggleOnOff(); stateUpdated(CALL_MODE_DIRECT_CHANGE);}
else { else {
uint8_t in = strtoul(payload, NULL, 10); uint8_t in = strtoul(payload, NULL, 10);
if (in == 0 && bri > 0) briLast = bri; if (in == 0 && bri > 0) briLast = bri;
@ -142,22 +142,22 @@ void publishMqtt()
sprintf_P(s, PSTR("%u"), bri); sprintf_P(s, PSTR("%u"), bri);
strlcpy(subuf, mqttDeviceTopic, 33); strlcpy(subuf, mqttDeviceTopic, 33);
strcat_P(subuf, PSTR("/g")); strcat_P(subuf, PSTR("/g"));
mqtt->publish(subuf, 0, true, s); // retain message mqtt->publish(subuf, 0, retainMqttMsg, s); // optionally retain message (#2236)
sprintf_P(s, PSTR("#%06X"), (col[3] << 24) | (col[0] << 16) | (col[1] << 8) | (col[2])); sprintf_P(s, PSTR("#%06X"), (col[3] << 24) | (col[0] << 16) | (col[1] << 8) | (col[2]));
strlcpy(subuf, mqttDeviceTopic, 33); strlcpy(subuf, mqttDeviceTopic, 33);
strcat_P(subuf, PSTR("/c")); strcat_P(subuf, PSTR("/c"));
mqtt->publish(subuf, 0, true, s); // retain message mqtt->publish(subuf, 0, retainMqttMsg, s); // optionally retain message (#2236)
strlcpy(subuf, mqttDeviceTopic, 33); strlcpy(subuf, mqttDeviceTopic, 33);
strcat_P(subuf, PSTR("/status")); strcat_P(subuf, PSTR("/status"));
mqtt->publish(subuf, 0, true, "online"); // retain message for a LWT mqtt->publish(subuf, 0, true, "online"); // retain message for a LWT
char apires[1024]; // allocating 1024 bytes from stack can be risky char apires[1024]; // allocating 1024 bytes from stack can be risky
XML_response(nullptr, apires); XML_response(nullptr, apires);
strlcpy(subuf, mqttDeviceTopic, 33); strlcpy(subuf, mqttDeviceTopic, 33);
strcat_P(subuf, PSTR("/v")); strcat_P(subuf, PSTR("/v"));
mqtt->publish(subuf, 0, false, apires); // do not retain message mqtt->publish(subuf, 0, retainMqttMsg, apires); // optionally retain message (#2236)
#endif #endif
} }

View File

@ -152,16 +152,13 @@ int getSignalQuality(int rssi)
//handle Ethernet connection event //handle Ethernet connection event
void WiFiEvent(WiFiEvent_t event) void WiFiEvent(WiFiEvent_t event)
{ {
#ifdef WLED_USE_ETHERNET
char hostname[25];
#endif
switch (event) { switch (event) {
#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_ETHERNET) #if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_ETHERNET)
case SYSTEM_EVENT_ETH_START: case SYSTEM_EVENT_ETH_START:
DEBUG_PRINTLN(F("ETH Started")); DEBUG_PRINTLN(F("ETH Started"));
break; break;
case SYSTEM_EVENT_ETH_CONNECTED: case SYSTEM_EVENT_ETH_CONNECTED:
{
DEBUG_PRINTLN(F("ETH Connected")); DEBUG_PRINTLN(F("ETH Connected"));
if (!apActive) { if (!apActive) {
WiFi.disconnect(true); WiFi.disconnect(true);
@ -172,10 +169,12 @@ void WiFiEvent(WiFiEvent_t event)
ETH.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); ETH.config(INADDR_NONE, INADDR_NONE, INADDR_NONE);
} }
// convert the "serverDescription" into a valid DNS hostname (alphanumeric) // convert the "serverDescription" into a valid DNS hostname (alphanumeric)
char hostname[64];
prepareHostname(hostname); prepareHostname(hostname);
ETH.setHostname(hostname); ETH.setHostname(hostname);
showWelcomePage = false; showWelcomePage = false;
break; break;
}
case SYSTEM_EVENT_ETH_DISCONNECTED: case SYSTEM_EVENT_ETH_DISCONNECTED:
DEBUG_PRINTLN(F("ETH Disconnected")); DEBUG_PRINTLN(F("ETH Disconnected"));
// This doesn't really affect ethernet per se, // This doesn't really affect ethernet per se,

View File

@ -52,7 +52,7 @@ static void doSaveState() {
size_t len = measureJson(*fileDoc) + 1; size_t len = measureJson(*fileDoc) + 1;
DEBUG_PRINTLN(len); DEBUG_PRINTLN(len);
// if possible use SPI RAM on ESP32 // if possible use SPI RAM on ESP32
#ifdef WLED_USE_PSRAM #if defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM)
if (psramFound()) if (psramFound())
tmpRAMbuffer = (char*) ps_malloc(len); tmpRAMbuffer = (char*) ps_malloc(len);
else else

View File

@ -350,6 +350,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
strlcpy(mqttDeviceTopic, request->arg(F("MD")).c_str(), 33); strlcpy(mqttDeviceTopic, request->arg(F("MD")).c_str(), 33);
strlcpy(mqttGroupTopic, request->arg(F("MG")).c_str(), 33); strlcpy(mqttGroupTopic, request->arg(F("MG")).c_str(), 33);
buttonPublishMqtt = request->hasArg(F("BM")); buttonPublishMqtt = request->hasArg(F("BM"));
retainMqttMsg = request->hasArg(F("RT"));
#endif #endif
#ifndef WLED_DISABLE_HUESYNC #ifndef WLED_DISABLE_HUESYNC
@ -788,7 +789,7 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
if (pos > 0) { if (pos > 0) {
spcI = getNumVal(&req, pos); spcI = getNumVal(&req, pos);
} }
selseg.set(startI, stopI, grpI, spcI, UINT16_MAX, startY, stopY); selseg.setUp(startI, stopI, grpI, spcI, UINT16_MAX, startY, stopY);
pos = req.indexOf(F("RV=")); //Segment reverse pos = req.indexOf(F("RV=")); //Segment reverse
if (pos > 0) selseg.reverse = req.charAt(pos+3) != '0'; if (pos > 0) selseg.reverse = req.charAt(pos+3) != '0';

View File

@ -362,7 +362,7 @@ void handleNotifications()
uint16_t stopY = 1, stop = (udpIn[3+ofs] << 8 | udpIn[4+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) {
selseg.set(start, stop, selseg.grouping, selseg.spacing, offset, startY, stopY); selseg.setUp(start, stop, selseg.grouping, selseg.spacing, offset, startY, stopY);
continue; continue;
} }
//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 //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
@ -396,9 +396,9 @@ void handleNotifications()
stopY = (udpIn[34+ofs] << 8 | udpIn[35+ofs]); stopY = (udpIn[34+ofs] << 8 | udpIn[35+ofs]);
} }
if (receiveSegmentBounds) { if (receiveSegmentBounds) {
selseg.set(start, stop, udpIn[5+ofs], udpIn[6+ofs], offset, startY, stopY); selseg.setUp(start, stop, udpIn[5+ofs], udpIn[6+ofs], offset, startY, stopY);
} else { } else {
selseg.set(selseg.start, selseg.stop, udpIn[5+ofs], udpIn[6+ofs], selseg.offset, selseg.startY, selseg.stopY); selseg.setUp(selseg.start, selseg.stop, udpIn[5+ofs], udpIn[6+ofs], selseg.offset, selseg.startY, selseg.stopY);
} }
} }
stateChanged = true; stateChanged = true;

View File

@ -188,12 +188,11 @@ void WLED::loop()
DEBUG_PRINT(F("Runtime: ")); DEBUG_PRINTLN(millis()); DEBUG_PRINT(F("Runtime: ")); DEBUG_PRINTLN(millis());
DEBUG_PRINT(F("Unix time: ")); toki.printTime(toki.getTime()); DEBUG_PRINT(F("Unix time: ")); toki.printTime(toki.getTime());
DEBUG_PRINT(F("Free heap: ")); DEBUG_PRINTLN(ESP.getFreeHeap()); DEBUG_PRINT(F("Free heap: ")); DEBUG_PRINTLN(ESP.getFreeHeap());
#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM) #if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM)
if (psramFound()) { if (psramFound()) {
DEBUG_PRINT(F("Total PSRAM: ")); DEBUG_PRINT(ESP.getPsramSize()/1024); DEBUG_PRINTLN("kB"); DEBUG_PRINT(F("Total PSRAM: ")); DEBUG_PRINT(ESP.getPsramSize()/1024); DEBUG_PRINTLN("kB");
DEBUG_PRINT(F("Free PSRAM: ")); DEBUG_PRINT(ESP.getFreePsram()/1024); DEBUG_PRINTLN("kB"); DEBUG_PRINT(F("Free PSRAM: ")); DEBUG_PRINT(ESP.getFreePsram()/1024); DEBUG_PRINTLN("kB");
} else }
DEBUG_PRINTLN(F("No PSRAM"));
#endif #endif
DEBUG_PRINT(F("Wifi state: ")); DEBUG_PRINTLN(WiFi.status()); DEBUG_PRINT(F("Wifi state: ")); DEBUG_PRINTLN(WiFi.status());
@ -321,25 +320,33 @@ void WLED::setup()
#endif #endif
DEBUG_PRINT(F("heap ")); DEBUG_PRINTLN(ESP.getFreeHeap()); DEBUG_PRINT(F("heap ")); DEBUG_PRINTLN(ESP.getFreeHeap());
#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM) #if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM)
#if defined(CONFIG_IDF_TARGET_ESP32S3)
// S3: reserve GPIO 33-37 for "octal" PSRAM
managed_pin_type pins[] = { {33, true}, {34, true}, {35, true}, {36, true}, {37, true} };
pinManager.allocateMultiplePins(pins, sizeof(pins)/sizeof(managed_pin_type), PinOwner::SPI_RAM);
#elif defined(CONFIG_IDF_TARGET_ESP32S2)
// S2: reserve GPIO 26-32 for PSRAM
managed_pin_type pins[] = { {26, true}, {27, true}, {28, true}, {29, true}, {30, true}, {31, true}, {32, true} };
pinManager.allocateMultiplePins(pins, sizeof(pins)/sizeof(managed_pin_type), PinOwner::SPI_RAM);
#elif defined(CONFIG_IDF_TARGET_ESP32C3)
// C3: reserve GPIO 12-17 for PSRAM
managed_pin_type pins[] = { {12, true}, {13, true}, {14, true}, {15, true}, {16, true}, {17, true} };
pinManager.allocateMultiplePins(pins, sizeof(pins)/sizeof(managed_pin_type), PinOwner::SPI_RAM);
#else
// GPIO16/GPIO17 reserved for SPI RAM
managed_pin_type pins[] = { {16, true}, {17, true} };
pinManager.allocateMultiplePins(pins, sizeof(pins)/sizeof(managed_pin_type), PinOwner::SPI_RAM);
#endif
#if defined(WLED_USE_PSRAM)
if (psramFound()) { if (psramFound()) {
#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32S3) DEBUG_PRINT(F("Total PSRAM: ")); DEBUG_PRINT(ESP.getPsramSize()/1024); DEBUG_PRINTLN("kB");
// GPIO16/GPIO17 reserved for SPI RAM DEBUG_PRINT(F("Free PSRAM : ")); DEBUG_PRINT(ESP.getFreePsram()/1024); DEBUG_PRINTLN("kB");
managed_pin_type pins[2] = { {16, true}, {17, true} }; }
pinManager.allocateMultiplePins(pins, 2, PinOwner::SPI_RAM); #else
#elif defined(CONFIG_IDF_TARGET_ESP32S3) DEBUG_PRINTLN(F("PSRAM not used."));
// S3: add GPIO 33-37 for "octal" PSRAM #endif
managed_pin_type pins[5] = { {33, true}, {34, true}, {35, true}, {36, true}, {37, true} };
pinManager.allocateMultiplePins(pins, 5, PinOwner::SPI_RAM);
#endif #endif
DEBUG_PRINT(F("Total PSRAM: ")); DEBUG_PRINT(ESP.getPsramSize()/1024); DEBUG_PRINTLN("kB");
DEBUG_PRINT(F("Free PSRAM : ")); DEBUG_PRINT(ESP.getFreePsram()/1024); DEBUG_PRINTLN("kB");
} else
DEBUG_PRINTLN(F("No PSRAM found."));
#endif
#if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) && !defined(WLED_USE_PSRAM)
DEBUG_PRINTLN(F("PSRAM not used."));
#endif
//DEBUG_PRINT(F("LEDs inited. heap usage ~")); //DEBUG_PRINT(F("LEDs inited. heap usage ~"));
//DEBUG_PRINTLN(heapPreAlloc - ESP.getFreeHeap()); //DEBUG_PRINTLN(heapPreAlloc - ESP.getFreeHeap());
@ -429,8 +436,6 @@ void WLED::setup()
if (Serial.available() > 0 && Serial.peek() == 'I') handleImprovPacket(); if (Serial.available() > 0 && Serial.peek() == 'I') handleImprovPacket();
#endif #endif
strip.service(); // why?
#ifndef WLED_DISABLE_OTA #ifndef WLED_DISABLE_OTA
if (aOtaEnabled) { if (aOtaEnabled) {
ArduinoOTA.onStart([]() { ArduinoOTA.onStart([]() {
@ -481,6 +486,8 @@ void WLED::beginStrip()
else if (bri == 0) bri = 128; else if (bri == 0) bri = 128;
} else { } else {
briLast = briS; bri = 0; briLast = briS; bri = 0;
strip.fill(BLACK);
strip.show();
} }
if (bootPreset > 0) { if (bootPreset > 0) {
applyPreset(bootPreset, CALL_MODE_INIT); applyPreset(bootPreset, CALL_MODE_INIT);
@ -591,7 +598,7 @@ bool WLED::initEthernet()
return false; return false;
} }
/* /*
For LAN8720 the most correct way is to perform clean reset each time before init For LAN8720 the most correct way is to perform clean reset each time before init
applying LOW to power or nRST pin for at least 100 us (please refer to datasheet, page 59) applying LOW to power or nRST pin for at least 100 us (please refer to datasheet, page 59)
ESP_IDF > V4 implements it (150 us, lan87xx_reset_hw(esp_eth_phy_t *phy) function in ESP_IDF > V4 implements it (150 us, lan87xx_reset_hw(esp_eth_phy_t *phy) function in
@ -718,8 +725,6 @@ void WLED::initInterfaces()
ArduinoOTA.begin(); ArduinoOTA.begin();
#endif #endif
strip.service();
// Set up mDNS responder: // Set up mDNS responder:
if (strlen(cmDNS) > 0) { if (strlen(cmDNS) > 0) {
// "end" must be called before "begin" is called a 2nd time // "end" must be called before "begin" is called a 2nd time

View File

@ -8,7 +8,7 @@
*/ */
// version code in format yymmddb (b = daily build) // version code in format yymmddb (b = daily build)
#define VERSION 2305090 #define VERSION 2305280
//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
@ -145,7 +145,7 @@
// The following is a construct to enable code to compile without it. // The following is a construct to enable code to compile without it.
// There is a code thet will still not use PSRAM though: // There is a code thet will still not use PSRAM though:
// AsyncJsonResponse is a derived class that implements DynamicJsonDocument (AsyncJson-v6.h) // AsyncJsonResponse is a derived class that implements DynamicJsonDocument (AsyncJson-v6.h)
#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM) #if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM)
struct PSRAM_Allocator { struct PSRAM_Allocator {
void* allocate(size_t size) { void* allocate(size_t size) {
if (psramFound()) return ps_malloc(size); // use PSRAM if it exists if (psramFound()) return ps_malloc(size); // use PSRAM if it exists
@ -421,6 +421,7 @@ WLED_GLOBAL char mqttUser[41] _INIT(""); // optional: username
WLED_GLOBAL char mqttPass[65] _INIT(""); // optional: password for MQTT auth WLED_GLOBAL char mqttPass[65] _INIT(""); // optional: password for MQTT auth
WLED_GLOBAL char mqttClientID[41] _INIT(""); // override the client ID WLED_GLOBAL char mqttClientID[41] _INIT(""); // override the client ID
WLED_GLOBAL uint16_t mqttPort _INIT(1883); WLED_GLOBAL uint16_t mqttPort _INIT(1883);
WLED_GLOBAL bool retainMqttMsg _INIT(false); // retain brightness and color
#define WLED_MQTT_CONNECTED (mqtt != nullptr && mqtt->connected()) #define WLED_MQTT_CONNECTED (mqtt != nullptr && mqtt->connected())
#else #else
#define WLED_MQTT_CONNECTED false #define WLED_MQTT_CONNECTED false

View File

@ -212,7 +212,7 @@ void appendGPIOinfo() {
//Note: Using pin 3 (RX) disables Adalight / Serial JSON //Note: Using pin 3 (RX) disables Adalight / Serial JSON
#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM) #if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM)
#if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(CONFIG_IDF_TARGET_ESP32C3) #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(CONFIG_IDF_TARGET_ESP32C3)
if (psramFound()) oappend(SET_F(",16,17")); // GPIO16 & GPIO17 reserved for SPI RAM on ESP32 (not on S2, S3 or C3) if (psramFound()) oappend(SET_F(",16,17")); // GPIO16 & GPIO17 reserved for SPI RAM on ESP32 (not on S2, S3 or C3)
#elif defined(CONFIG_IDF_TARGET_ESP32S3) #elif defined(CONFIG_IDF_TARGET_ESP32S3)
@ -561,6 +561,7 @@ void getSettingsJS(byte subPage, char* dest)
sappends('s',"MD",mqttDeviceTopic); sappends('s',"MD",mqttDeviceTopic);
sappends('s',SET_F("MG"),mqttGroupTopic); sappends('s',SET_F("MG"),mqttGroupTopic);
sappend('c',SET_F("BM"),buttonPublishMqtt); sappend('c',SET_F("BM"),buttonPublishMqtt);
sappend('c',SET_F("RT"),retainMqttMsg);
#else #else
oappend(SET_F("toggle('MQTT');")); // hide MQTT settings oappend(SET_F("toggle('MQTT');")); // hide MQTT settings
#endif #endif