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,6 +127,8 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId)
JsonArray colarr = elem["col"]; JsonArray colarr = elem["col"];
if (!colarr.isNull()) if (!colarr.isNull())
{ {
if (seg.getLightCapabilities() & 3) {
// segment has RGB or White
for (size_t i = 0; i < 3; i++) for (size_t i = 0; i < 3; i++)
{ {
int rgbw[] = {0,0,0,0}; int rgbw[] = {0,0,0,0};
@ -158,6 +160,11 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId)
seg.setColor(i, RGBW32(rgbw[0],rgbw[1],rgbw[2],rgbw[3])); seg.setColor(i, RGBW32(rgbw[0],rgbw[1],rgbw[2],rgbw[3]));
if (seg.mode == FX_MODE_STATIC) strip.trigger(); //instant refresh if (seg.mode == FX_MODE_STATIC) strip.trigger(); //instant refresh
} }
} else {
// non RGB & non White segment (usually On/Off bus)
seg.setColor(0, ULTRAWHITE);
seg.setColor(1, BLACK);
}
} }
// lx parser // lx parser
@ -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 (seg.getLightCapabilities() & 1) { // ignore palette for White and On/Off segments
if (getVal(elem["pal"], &pal)) seg.setPalette(pal); 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,12 +142,12 @@ 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"));
@ -157,7 +157,7 @@ void publishMqtt()
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 (psramFound()) { #if defined(CONFIG_IDF_TARGET_ESP32S3)
#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !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 // GPIO16/GPIO17 reserved for SPI RAM
managed_pin_type pins[2] = { {16, true}, {17, true} }; managed_pin_type pins[] = { {16, true}, {17, true} };
pinManager.allocateMultiplePins(pins, 2, PinOwner::SPI_RAM); pinManager.allocateMultiplePins(pins, sizeof(pins)/sizeof(managed_pin_type), PinOwner::SPI_RAM);
#elif defined(CONFIG_IDF_TARGET_ESP32S3) #endif
// S3: add GPIO 33-37 for "octal" PSRAM #if defined(WLED_USE_PSRAM)
managed_pin_type pins[5] = { {33, true}, {34, true}, {35, true}, {36, true}, {37, true} }; if (psramFound()) {
pinManager.allocateMultiplePins(pins, 5, PinOwner::SPI_RAM);
#endif
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 found.")); #else
#endif
#if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) && !defined(WLED_USE_PSRAM)
DEBUG_PRINTLN(F("PSRAM not used.")); DEBUG_PRINTLN(F("PSRAM not used."));
#endif #endif
#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);
@ -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