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

This commit is contained in:
Ewoud
2022-11-28 19:58:51 +01:00
17 changed files with 815 additions and 781 deletions

View File

@@ -446,7 +446,7 @@ lib_deps = ${esp32c3.lib_deps}
; https://github.com/blazoncek/arduinoFFT.git
[env:esp32s3dev_8MB]
;; ESP32-S3-DevKitC-1 development board, with 8MB FLASH, no PSRAM
;; ESP32-S3-DevKitC-1 development board, with 8MB FLASH, no PSRAM (flash_mode: qio)
board = esp32-s3-devkitc-1
;platform = espressif32@5.1.1
;platform_packages = platformio/framework-arduinoespressif32@3.20004.220825
@@ -466,6 +466,26 @@ board_build.f_flash = 80000000L
board_build.flash_mode = qio
monitor_filters = esp32_exception_decoder
[env:esp32s3dev_8MB_PSRAM]
;; ESP32-TinyS3 development board, with 8MB FLASH and 8MB PSRAM (memory_type: qio_opi, qio_qspi, or opi_opi)
;board = um_tinys3 ; -> needs workaround from https://github.com/Aircoookie/WLED/pull/2905#issuecomment-1328049860
;board = esp32s3box ; -> error: 'esp32_adc2gpio' was not declared in this scope
board = esp32-s3-devkitc-1 ; -> compiles, but does not support PSRAM
platform = espressif32 @ ~5.2.0
platform_packages =
upload_speed = 921600
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} ${esp32s3.build_flags}
-D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_MSC_ON_BOOT=0
; -D ARDUINO_USB_CDC_ON_BOOT=0
; -D WLED_RELEASE_NAME=ESP32-S3_PSRAM
-D WLED_USE_PSRAM -DBOARD_HAS_PSRAM ; tells WLED that PSRAM shall be used
lib_deps = ${esp32s3.lib_deps}
board_build.partitions = tools/WLED_ESP32_8MB.csv
board_build.f_flash = 80000000L
board_build.flash_mode = qio
monitor_filters = esp32_exception_decoder
[env:esp8285_4CH_MagicHome]
board = esp8285
platform = ${common.platform_wled_default}

View File

@@ -16,14 +16,15 @@ private:
// NOTE: Do not implement any compile-time variables, anything the user needs to configure
// should be configurable from the Usermod menu using the methods below
// key settings set via usermod menu
unsigned long TemperatureDecimals = 0; // Number of decimal places in published temperaure values
unsigned long HumidityDecimals = 0; // Number of decimal places in published humidity values
unsigned long PressureDecimals = 0; // Number of decimal places in published pressure values
unsigned long TemperatureInterval = 5; // Interval to measure temperature (and humidity, dew point if available) in seconds
unsigned long PressureInterval = 300; // Interval to measure pressure in seconds
uint8_t TemperatureDecimals = 0; // Number of decimal places in published temperaure values
uint8_t HumidityDecimals = 0; // Number of decimal places in published humidity values
uint8_t PressureDecimals = 0; // Number of decimal places in published pressure values
uint16_t TemperatureInterval = 5; // Interval to measure temperature (and humidity, dew point if available) in seconds
uint16_t PressureInterval = 300; // Interval to measure pressure in seconds
bool PublishAlways = false; // Publish values even when they have not changed
bool UseCelsius = true; // Use Celsius for Reporting
bool HomeAssistantDiscovery = false; // Publish Home Assistant Device Information
bool enabled = true;
// set the default pins based on the architecture, these get overridden by Usermod menu settings
#ifdef ESP8266
@@ -70,15 +71,10 @@ private:
// MQTT topic strings for publishing Home Assistant discovery topics
bool mqttInitialized = false;
String mqttTemperatureTopic = "";
String mqttHumidityTopic = "";
String mqttPressureTopic = "";
String mqttHeatIndexTopic = "";
String mqttDewPointTopic = "";
// Store packet IDs of MQTT publications
uint16_t mqttTemperaturePub = 0;
uint16_t mqttPressurePub = 0;
// strings to reduce flash memory usage (used more than twice)
static const char _name[];
static const char _enabled[];
// Read the BME280/BMP280 Sensor (which one runs depends on whether Celsius or Farenheit being set in Usermod Menu)
void UpdateBME280Data(int SensorType)
@@ -95,7 +91,7 @@ private:
sensorTemperature = _temperature;
sensorHumidity = _humidity;
sensorPressure = _pressure;
tempScale = "°C";
tempScale = F("°C");
if (sensorType == 1)
{
sensorHeatIndex = EnvironmentCalculations::HeatIndex(_temperature, _humidity, envTempUnit);
@@ -111,7 +107,7 @@ private:
sensorTemperature = _temperature;
sensorHumidity = _humidity;
sensorPressure = _pressure;
tempScale = "°F";
tempScale = F("°F");
if (sensorType == 1)
{
sensorHeatIndex = EnvironmentCalculations::HeatIndex(_temperature, _humidity, envTempUnit);
@@ -123,18 +119,23 @@ private:
// Procedure to define all MQTT discovery Topics
void _mqttInitialize()
{
mqttTemperatureTopic = String(mqttDeviceTopic) + F("/temperature");
mqttPressureTopic = String(mqttDeviceTopic) + F("/pressure");
mqttHumidityTopic = String(mqttDeviceTopic) + F("/humidity");
mqttHeatIndexTopic = String(mqttDeviceTopic) + F("/heat_index");
mqttDewPointTopic = String(mqttDeviceTopic) + F("/dew_point");
char mqttTemperatureTopic[128];
char mqttHumidityTopic[128];
char mqttPressureTopic[128];
char mqttHeatIndexTopic[128];
char mqttDewPointTopic[128];
snprintf_P(mqttTemperatureTopic, 127, PSTR("%s/temperature"), mqttDeviceTopic);
snprintf_P(mqttPressureTopic, 127, PSTR("%s/pressure"), mqttDeviceTopic);
snprintf_P(mqttHumidityTopic, 127, PSTR("%s/humidity"), mqttDeviceTopic);
snprintf_P(mqttHeatIndexTopic, 127, PSTR("%s/heat_index"), mqttDeviceTopic);
snprintf_P(mqttDewPointTopic, 127, PSTR("%s/dew_point"), mqttDeviceTopic);
if (HomeAssistantDiscovery) {
_createMqttSensor(F("Temperature"), mqttTemperatureTopic, F("temperature"), tempScale);
_createMqttSensor(F("Pressure"), mqttPressureTopic, F("pressure"), F("hPa"));
_createMqttSensor(F("Humidity"), mqttHumidityTopic, F("humidity"), F("%"));
_createMqttSensor(F("HeatIndex"), mqttHeatIndexTopic, F("temperature"), tempScale);
_createMqttSensor(F("DewPoint"), mqttDewPointTopic, F("temperature"), tempScale);
_createMqttSensor(F("Temperature"), mqttTemperatureTopic, "temperature", tempScale);
_createMqttSensor(F("Pressure"), mqttPressureTopic, "pressure", F("hPa"));
_createMqttSensor(F("Humidity"), mqttHumidityTopic, "humidity", F("%"));
_createMqttSensor(F("HeatIndex"), mqttHeatIndexTopic, "temperature", tempScale);
_createMqttSensor(F("DewPoint"), mqttDewPointTopic, "temperature", tempScale);
}
}
@@ -169,6 +170,15 @@ private:
mqtt->publish(t.c_str(), 0, true, temp.c_str());
}
void publishMqtt(const char *topic, const char* state) {
//Check if MQTT Connected, otherwise it will crash the 8266
if (WLED_MQTT_CONNECTED){
char subuf[128];
snprintf_P(subuf, 127, PSTR("%s/%s"), mqttDeviceTopic, topic);
mqtt->publish(subuf, 0, false, state);
}
}
public:
void setup()
{
@@ -183,7 +193,7 @@ public:
if (!bme.begin())
{
sensorType = 0;
DEBUG_PRINTLN(F("Could not find BME280I2C sensor!"));
DEBUG_PRINTLN(F("Could not find BME280 I2C sensor!"));
}
else
{
@@ -207,14 +217,16 @@ public:
void loop()
{
if (!enabled || strip.isUpdating()) return;
// BME280 sensor MQTT publishing
// Check if sensor present and MQTT Connected, otherwise it will crash the MCU
if (sensorType != 0 && WLED_MQTT_CONNECTED)
// Check if sensor present and Connected, otherwise it will crash the MCU
if (sensorType != 0)
{
// Timer to fetch new temperature, humidity and pressure data at intervals
timer = millis();
if (timer - lastTemperatureMeasure >= TemperatureInterval * 1000 || mqttTemperaturePub == 0)
if (timer - lastTemperatureMeasure >= TemperatureInterval * 1000)
{
lastTemperatureMeasure = timer;
@@ -223,18 +235,11 @@ public:
float temperature = roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
float humidity, heatIndex, dewPoint;
if (WLED_MQTT_CONNECTED && !mqttInitialized)
{
_mqttInitialize();
mqttInitialized = true;
}
// If temperature has changed since last measure, create string populated with device topic
// from the UI and values read from sensor, then publish to broker
if (temperature != lastTemperature || PublishAlways)
{
String topic = String(mqttDeviceTopic) + "/temperature";
mqttTemperaturePub = mqtt->publish(topic.c_str(), 0, false, String(temperature, TemperatureDecimals).c_str());
publishMqtt("temperature", String(temperature, TemperatureDecimals).c_str());
}
lastTemperature = temperature; // Update last sensor temperature for next loop
@@ -247,20 +252,17 @@ public:
if (humidity != lastHumidity || PublishAlways)
{
String topic = String(mqttDeviceTopic) + F("/humidity");
mqtt->publish(topic.c_str(), 0, false, String(humidity, HumidityDecimals).c_str());
publishMqtt("humidity", String(humidity, HumidityDecimals).c_str());
}
if (heatIndex != lastHeatIndex || PublishAlways)
{
String topic = String(mqttDeviceTopic) + F("/heat_index");
mqtt->publish(topic.c_str(), 0, false, String(heatIndex, TemperatureDecimals).c_str());
publishMqtt("heat_index", String(heatIndex, TemperatureDecimals).c_str());
}
if (dewPoint != lastDewPoint || PublishAlways)
{
String topic = String(mqttDeviceTopic) + F("/dew_point");
mqtt->publish(topic.c_str(), 0, false, String(dewPoint, TemperatureDecimals).c_str());
publishMqtt("dew_point", String(dewPoint, TemperatureDecimals).c_str());
}
lastHumidity = humidity;
@@ -269,7 +271,7 @@ public:
}
}
if (timer - lastPressureMeasure >= PressureInterval * 1000 || mqttPressurePub == 0)
if (timer - lastPressureMeasure >= PressureInterval * 1000)
{
lastPressureMeasure = timer;
@@ -277,15 +279,23 @@ public:
if (pressure != lastPressure || PublishAlways)
{
String topic = String(mqttDeviceTopic) + F("/pressure");
mqttPressurePub = mqtt->publish(topic.c_str(), 0, true, String(pressure, PressureDecimals).c_str());
publishMqtt("pressure", String(pressure, PressureDecimals).c_str());
}
lastPressure = pressure;
}
}
}
void onMqttConnect(bool sessionPresent)
{
if (WLED_MQTT_CONNECTED && !mqttInitialized)
{
_mqttInitialize();
mqttInitialized = true;
}
}
/*
* API calls te enable data exchange between WLED modules
*/
@@ -294,9 +304,9 @@ public:
return (float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
} else {
return (float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) * 1.8f + 32;
}
}
}
inline float getTemperatureF() {
if (UseCelsius) {
return ((float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) -32) * 0.56f;
@@ -304,12 +314,15 @@ public:
return (float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
}
}
inline float getHumidity() {
return (float)roundf(sensorHumidity * powf(10, HumidityDecimals));
}
inline float getPressure() {
return (float)roundf(sensorPressure * powf(10, PressureDecimals));
}
inline float getDewPointC() {
if (UseCelsius) {
return (float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
@@ -317,6 +330,7 @@ public:
return (float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) * 1.8f + 32;
}
}
inline float getDewPointF() {
if (UseCelsius) {
return ((float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) -32) * 0.56f;
@@ -324,13 +338,16 @@ public:
return (float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
}
}
inline float getHeatIndexC() {
if (UseCelsius) {
return (float)roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
} else {
return (float)roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) * 1.8f + 32;
}
}inline float getHeatIndexF() {
}
inline float getHeatIndexF() {
if (UseCelsius) {
return ((float)roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) -32) * 0.56f;
} else {
@@ -384,7 +401,8 @@ public:
// Save Usermod Config Settings
void addToConfig(JsonObject& root)
{
JsonObject top = root.createNestedObject(F("BME280/BMP280"));
JsonObject top = root.createNestedObject(FPSTR(_name));
top[FPSTR(_enabled)] = enabled;
top[F("TemperatureDecimals")] = TemperatureDecimals;
top[F("HumidityDecimals")] = HumidityDecimals;
top[F("PressureDecimals")] = PressureDecimals;
@@ -405,17 +423,17 @@ public:
// default settings values could be set here (or below using the 3-argument getJsonValue()) instead of in the class definition or constructor
// setting them inside readFromConfig() is slightly more robust, handling the rare but plausible use case of single value being missing after boot (e.g. if the cfg.json was manually edited and a value was removed)
int8_t newPin[2]; for (byte i=0; i<2; i++) newPin[i] = ioPin[i]; // prepare to note changed pins
JsonObject top = root[F("BME280/BMP280")];
JsonObject top = root[FPSTR(_name)];
if (top.isNull()) {
DEBUG_PRINT(F("BME280/BMP280"));
DEBUG_PRINT(F(_name));
DEBUG_PRINTLN(F(": No config found. (Using defaults.)"));
return false;
}
bool configComplete = !top.isNull();
configComplete &= getJsonValue(top[FPSTR(_enabled)], enabled);
// A 3-argument getJsonValue() assigns the 3rd argument as a default value if the Json value is missing
configComplete &= getJsonValue(top[F("TemperatureDecimals")], TemperatureDecimals, 1);
configComplete &= getJsonValue(top[F("HumidityDecimals")], HumidityDecimals, 0);
@@ -427,7 +445,7 @@ public:
configComplete &= getJsonValue(top[F("HomeAssistantDiscovery")], HomeAssistantDiscovery, false);
for (byte i=0; i<2; i++) configComplete &= getJsonValue(top[F("pin")][i], newPin[i], ioPin[i]);
DEBUG_PRINT(FPSTR(F("BME280/BMP280")));
DEBUG_PRINT(FPSTR(_name));
if (!initDone) {
// first run: reading from cfg.json
for (byte i=0; i<2; i++) ioPin[i] = newPin[i];
@@ -454,4 +472,7 @@ public:
uint16_t getId() {
return USERMOD_ID_BME280;
}
};
};
const char UsermodBME280::_name[] PROGMEM = "BME280/BMP280";
const char UsermodBME280::_enabled[] PROGMEM = "enabled";

View File

@@ -1916,10 +1916,10 @@ class AudioReactive : public Usermod {
#if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3)
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',3,'I2S Master CLK','<i>only use -1, 0, 1 or 3</i>');"));
#else
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',3,'I2S Master CLK','');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',3,'', 'I2S Master CLK');"));
#endif
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',4,'I2C SDA',' ');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',5,'I2C SCL',' ');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',4,'', 'I2C SDA');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',5,'', 'I2C SCL');"));
}

View File

@@ -1036,11 +1036,11 @@ class FourLineDisplayUsermod : public Usermod {
oappend(SET_F("addOption(dd,'SSD1305 128x64',5);"));
oappend(SET_F("addOption(dd,'SSD1306 SPI',6);"));
oappend(SET_F("addOption(dd,'SSD1306 SPI 128x64',7);"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',0,'I2C/SPI CLK','<i>-1 use global</i>');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',1,'I2C/SPI DTA','<i>-1 use global</i>');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',2,'SPI CS',' ');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',3,'SPI DC',' ');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',4,'SPI RST',' ');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',0,'<i>-1 use global</i>','I2C/SPI CLK');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',1,'<i>-1 use global</i>','I2C/SPI DTA');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',2,'','SPI CS');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',3,'','SPI DC');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',4,'','SPI RST');"));
}
/*

View File

@@ -191,7 +191,7 @@ private:
re_sortModes(modes_qstrings, modes_alpha_indexes, strip.getModeCount(), MODE_SORT_SKIP_COUNT);
palettes_qstrings = re_findModeStrings(JSON_palette_names, strip.getPaletteCount());
palettes_alpha_indexes = re_initIndexArray(strip.getPaletteCount());
palettes_alpha_indexes = re_initIndexArray(strip.getPaletteCount()); // only use internal palettes
// How many palette names start with '*' and should not be sorted?
// (Also skipping the first one, 'Default').

View File

@@ -777,7 +777,7 @@ class WS2812FX { // 96 bytes
inline uint8_t getSegmentsNum(void) { return _segments.size(); } // returns currently present segments
inline uint8_t getCurrSegmentId(void) { return _segment_index; }
inline uint8_t getMainSegmentId(void) { return _mainSegment; }
inline uint8_t getPaletteCount() { return 13 + GRADIENT_PALETTE_COUNT; }
inline uint8_t getPaletteCount() { return 13 + GRADIENT_PALETTE_COUNT; } // will only return built-in palette count
inline uint8_t getTargetFps() { return _targetFps; }
inline uint8_t getModeCount() { return _modeCount; }

View File

@@ -122,10 +122,11 @@ void IRAM_ATTR_YN WS2812FX::setPixelColorXY(int x, int y, uint32_t col) //WLEDMM
#ifndef WLED_DISABLE_2D
if (!isMatrix) return; // not a matrix set-up
uint16_t index = y * matrixWidth + x;
if (index >= customMappingSize) return; // customMappingSize is always W * H of matrix in 2D setup
#else
uint16_t index = x;
#endif
if (index >= _length) return;
#endif
if (index < customMappingSize) index = customMappingTable[index];
busses.setPixelColor(index, col);
}
@@ -134,10 +135,11 @@ void IRAM_ATTR_YN WS2812FX::setPixelColorXY(int x, int y, uint32_t col) //WLEDMM
uint32_t WS2812FX::getPixelColorXY(uint16_t x, uint16_t y) {
#ifndef WLED_DISABLE_2D
uint16_t index = (y * matrixWidth + x);
if (index >= customMappingSize) return 0; // customMappingSize is always W * H of matrix in 2D setup
#else
uint16_t index = x;
#endif
if (index >= _length) return 0;
#endif
if (index < customMappingSize) index = customMappingTable[index];
return busses.getPixelColor(index);
}

View File

@@ -425,12 +425,7 @@ void Segment::setMode(uint8_t fx, bool loadDefaults) {
sOpt = extractModeDefaults(fx, "mi"); if (sOpt >= 0) mirror = (bool)sOpt; // NOTE: setting this option is a risky business
sOpt = extractModeDefaults(fx, "rY"); if (sOpt >= 0) reverse_y = (bool)sOpt;
sOpt = extractModeDefaults(fx, "mY"); if (sOpt >= 0) mirror_y = (bool)sOpt; // NOTE: setting this option is a risky business
sOpt = extractModeDefaults(fx, "pal");
if (sOpt >= 0 && (size_t)sOpt < strip.getPaletteCount() + strip.customPalettes.size()) {
if (sOpt != palette) {
palette = sOpt;
}
}
sOpt = extractModeDefaults(fx, "pal"); if (sOpt >= 0) setPalette(sOpt);
}
stateChanged = true; // send UDP/WS broadcast
}
@@ -438,13 +433,13 @@ void Segment::setMode(uint8_t fx, bool loadDefaults) {
}
void Segment::setPalette(uint8_t pal) {
if (pal < strip.getPaletteCount()) {
if (pal != palette) {
if (strip.paletteFade) startTransition(strip.getTransition());
palette = pal;
}
if (pal < 245 && pal > GRADIENT_PALETTE_COUNT+13) pal = 0; // built in palettes
if (pal > 245 && (strip.customPalettes.size() == 0 || 255U-pal > strip.customPalettes.size()-1)) pal = 0; // custom palettes
if (pal != palette) {
if (strip.paletteFade) startTransition(strip.getTransition());
palette = pal;
stateChanged = true; // send UDP/WS broadcast
}
stateChanged = true; // send UDP/WS broadcast
}
// 2D matrix

View File

@@ -1560,8 +1560,8 @@ function requestJson(command=null)
if (json.info) {
let i = json.info;
// append custom palettes (when loading for the 1st time)
if (!command && isEmpty(lastinfo) && i.leds && i.leds.cpal) {
for (let j = 0; j<i.leds.cpal; j++) {
if (!command && isEmpty(lastinfo) && i.cpalcount) {
for (let j = 0; j<i.cpalcount; j++) {
let div = d.createElement("div");
gId('pallist').appendChild(div);
div.outerHTML = generateListItemHtml(

View File

@@ -190,12 +190,8 @@
if (!obj.length) return;
if (typeof el === "string" && obj[0]) obj[0].placeholder = el;
else if (obj[el]) {
if (txt2!="") {
obj[el].insertAdjacentHTML('beforebegin', txt + '&nbsp;');
obj[el].insertAdjacentHTML('afterend', '&nbsp;'+txt2);
}
else
obj[el].insertAdjacentHTML('afterend', '&nbsp;'+txt);
if (txt!="") obj[el].insertAdjacentHTML('afterend', '&nbsp;'+txt);
if (txt2!="") obj[el].insertAdjacentHTML('beforebegin', txt2 + '&nbsp;'); //add pre texts
}
}
// load settings and insert values into DOM

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -110,7 +110,7 @@ void changePalette(uint8_t pal)
for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) {
Segment& seg = strip.getSegment(i);
if (!seg.isActive() || !seg.isSelected()) continue;
seg.palette = pal;
seg.setPalette(pal);
}
setValuesFromFirstSelectedSeg();
} else {

View File

@@ -243,7 +243,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
getVal(elem["ix"], &seg.intensity);
uint8_t pal = seg.palette;
if (getVal(elem["pal"], &pal, 1, strip.getPaletteCount())) seg.setPalette(pal);
if (getVal(elem["pal"], &pal)) seg.setPalette(pal);
getVal(elem["c1"], &seg.custom1);
getVal(elem["c2"], &seg.custom2);
@@ -678,7 +678,6 @@ void serializeInfo(JsonObject root)
leds[F("maxseg")] = strip.getMaxSegments();
//leds[F("actseg")] = strip.getActiveSegmentsNum();
//leds[F("seglock")] = false; //might be used in the future to prevent modifications to segment config
leds[F("cpal")] = strip.customPalettes.size(); //number of custom palettes
#ifndef WLED_DISABLE_2D
if (strip.isMatrix) {
@@ -748,6 +747,7 @@ void serializeInfo(JsonObject root)
root[F("fxcount")] = strip.getModeCount();
root[F("palcount")] = strip.getPaletteCount();
root[F("cpalcount")] = strip.customPalettes.size(); //number of custom palettes
JsonArray ledmaps = root.createNestedArray(F("maps"));
for (size_t i=0; i<10; i++) {

View File

@@ -12,7 +12,7 @@ static volatile byte presetToApply = 0;
static volatile byte callModeToApply = 0;
static volatile byte presetToSave = 0;
static volatile int8_t saveLedmap = -1;
static char quickLoad[3];
static char quickLoad[9];
static char saveName[33];
static bool includeBri = true, segBounds = true, selectedOnly = false, playlistSave = false;
@@ -263,7 +263,7 @@ void savePreset(byte index, const char* pname, JsonObject sObj)
presetToSave = index;
playlistSave = false;
if (sObj[F("ql")].is<const char*>()) strlcpy(quickLoad, sObj[F("ql")].as<const char*>(), 3); // only 2 chars for QL
if (sObj[F("ql")].is<const char*>()) strlcpy(quickLoad, sObj[F("ql")].as<const char*>(), 9); // client limits QL to 2 chars, buffer for 8 bytes to allow unicode
sObj.remove("v");
sObj.remove("time");
sObj.remove(F("error"));

View File

@@ -411,10 +411,10 @@ void handleNotifications()
for (size_t i = 0; i < strip.getSegmentsNum(); i++) {
Segment& seg = strip.getSegment(i);
if (!seg.isActive() || !seg.isSelected()) continue;
if (udpIn[8] < strip.getModeCount()) strip.setMode(i, udpIn[8]);
seg.setMode(udpIn[8]);
seg.speed = udpIn[9];
if (version > 2) seg.intensity = udpIn[16];
if (version > 4 && udpIn[19] < strip.getPaletteCount()) seg.palette = udpIn[19];
if (version > 4) seg.setPalette(udpIn[19]);
}
stateChanged = true;
}

View File

@@ -8,7 +8,7 @@
*/
// version code in format yymmddb (b = daily build)
#define VERSION 2211242
#define VERSION 2211250
//uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG